Comment parcourir un tableau à l'aide d'un pointeur et d'une longueur inconnue?
J'ai reçu une api c et de travailler avec le minimum de documents.
Développeur n'est pas le moment, et son code est le retour des valeurs inattendues (matrices non de la durée prévue)
Im avoir des problèmes avec des méthodes qui renvoient des pointeurs vers des tableaux et je me demandais suis-je une itération sur eux correctement.
Q:est-ce la suivant toujours le bon len d'un tableau?
int len=sizeof(sampleState)/sizeof(short);
int len=sizeof(samplePosition)/sizeof(int);
typedef unsigned char byte;
int len=sizeof(volume)/sizeof(byte);
Et je itérer sur le tableau à l'aide du pointeur et l'arithmétique des pointeurs (suis-je la faire correctement pour tous les types ci-dessous)
Et le dernier exemple ci-dessous tableau multidimensionnel? Quel est le meilleur moyen pour parcourir au cours de cette?
grâce
//property sampleState returns short[] as short*
short* sampleState = mixerState->sampleState;
if(sampleState != NULL){
int len=sizeof(sampleState)/sizeof(short);
printf("length of short* sampleState=%d\n", len);//OK
for(int j=0;j<len;j++) {
printf(" sampleState[%d]=%u\n",j, *(sampleState+j));
}
}else{
printf(" sampleState is NULL\n");
}
//same with int[] returned as int*
int* samplePosition = mixerState->samplePosition;
if(samplePosition != NULL){
int len=sizeof(samplePosition)/sizeof(int);
printf("length of int* samplePosition=%d\n", len);//OK
for(int j=0;j<len;j++) {
printf(" samplePosition[%d]=%d\n",j, *(samplePosition+j));
}
}else{
printf(" samplePosition is NULL\n");
}
Ici de l'octet de type de def pour
typedef unsigned char byte;
j'ai donc utilisé %u
//--------------
byte* volume = mixerState->volume;
if(volume != NULL){
int len=sizeof(volume)/sizeof(byte);
printf("length of [byte* volume = mixerState->volume]=%d\n", len);//OK
for(int j=0;j<len;j++) {
printf(" volume[%d]=%u\n",j, *(volume+j));
}
}else{
printf(" volume is NULL\n");
}
Ici est int[][] soundFXStatus
.
dois-je utiliser la même méthode ci-dessus et 2 boucles?
//--------------
int** soundFXStatus = mixerState->soundFXStatus;
OriginalL'auteur brian.clear | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
La
sizeof(array)/sizeof(element)
astuce ne fonctionne que si vous avez un tableau réel, pas un pointeur. Il y a aucun moyen de connaître la taille d'un tableau si tout ce que vous avez est un pointeur; vous doit passer un tableau de longueur dans une fonction.Ou mieux d'utiliser un
vector
, qui a unsize
fonction.OriginalL'auteur Mark Ransom
Ce sera seulement donner la longueur d'un tableau si
sampleState
est déclaré comme un tableau, pas un pointeur:Aussi, méfiez-vous qu'un argument de fonction est en fait pointeur même si elle ressemble à un tableau:
Dans votre code,
sampleState
est un pointeur; il n'y a aucun moyen de déterminer la longueur d'un tableau donné seulement un pointeur vers elle. Sans doute l'API fournit un moyen d'obtenir la longueur (car sinon il serait inutilisable), et vous aurez besoin de l'utiliser.En C++, c'est une des raisons pourquoi vous préférez
std::vector
oustd::array
à un manuellement alloué tableau; bien que cela ne vous aide pas, puisque, malgré les question tags, vous êtes à l'aide de C ici.OriginalL'auteur Mike Seymour
sizeof est fait au moment de la compilation, de sorte que cette approche ne fonctionne pas si la longueur des tableaux ne sont pas connus au moment de la compilation (par exemple, la mémoire est réservée à l'aide d'un malloc).
Et pas nécessairement au moment de la compilation -
sizeof
est fait au moment de l'exécution pour une C99 de longueur variable tableau.Ce n' p.ex. veux dire?
de la cib, vous avez raison.
J'ai fait une erreur", à la page.ex" qui ne veut pas dire quoi que ce soit. Je devrais avoir utilisé des e.g (par exemple).
OriginalL'auteur Flynch
ok ignorer la méthode que j'ai utilisé ci-dessus, c'était tout faux - si vous avez besoin de connaître la longueur du tableau qui j'ai finalement obtenu à partir de l'API de développeur.
OriginalL'auteur brian.clear