2015-11-19 4 views
1

J'ai une situation où je passe un tableau contenant 2 valeurs de 1 octet à une fonction, mais d'une certaine manière la fonction pense que le tableau a 4 octets de long, ce qui gâche ma manipulation de bits temps. J'ai même essayé explicitement de couler chaque valeur de tableau comme uint8, mais en vain. Des idées sur ce qui pourrait arriver? Utilisation des outils gcc de cygwin sur Eclipse Mars.1.C convertir des valeurs de 8 bits en valeurs de 16 bits

typedef char uint8; //char is 1 byte in my system. 

void setBitArray(uint8 bitArray[], int first, int last, uint8 type) { 
    if(first >= 0 && last < sizeof(bitArray) * 8) { // If the block is in bounds 
     ... 
    } 
} 
... 
int main() { 
    uint8 bitArray[2] = {(uint8)0, (uint8)0}; 
    setBitArray(bitArray, 0,10, 1); 
    return 0; 
} 

EDIT

une chose. sizeof (bitArray) donne 2 octets dans main().

+1

Vous ne pouvez pas utiliser 'sizeof' sur un paramètre de tableau. Voir [cette réponse] (https://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in/10349610#10349610). – kaylum

+0

Non 16 bits mais 32 bits –

+0

J'ai utilisé sizeof (array)/sizeof (element) tout le temps pour trouver le nombre d'éléments. http://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in-c – AaronF

Répondre

1

Le passage d'un tableau à une fonction envoie l'adresse du premier élément du tableau, pas le tableau entier en tant qu'objet. La fonction n'a aucun moyen d'identifier le type de l'adresse transmise, elle ne peut donc pas vous donner la taille.

La solution simple serait de passer la taille avec le tableau dans un struct ou au hasard

typedef char uint8; //char is 1 byte in my system. 

void setBitArray(uint8 bitArray[], int size, int first, int last, uint8 type) { 
    if(first >= 0 && last < size * 8) { // If the block is in bounds 
     ... 
    } 
} 
... 
int main() { 
    uint8 bitArray[2] = {(uint8)0, (uint8)0}; 
    setBitArray(bitArray, (int)sizeof(bitArray), 0, 10, 1); 

    return 0; 
} 
0

Le arguement qui est passé dans la fonction est pas le tableau mais le pointeur sur le tableau. La taille d'un pointeur dans c est de 8 octets ici. Considérez le code que j'ai ajouté où j'ai d'abord créé un pointeur de caractère, puis alloué dynamiquement de la mémoire en utilisant malloc. Depuis bitArray2 est un pointeur char sa taille est de 8 au lieu de 2. En arguements de passage un nouveau pointeur char est créé et par conséquent, sa taille est de 8 au lieu de 2

#include <stdio.h> 
    typedef char uint8; //char is 1 byte in my system. 

    void setBitArray(char bitArray[], int first, int last, uint8 type) { 
     // if(first >= 0 && last < sizeof(bitArray) * 8) { // If the block is in bounds 
      printf("Adress location = %ld\n", &bitArray); 
      printf("%ld\n", sizeof(bitArray));   
     // } 
    } 
    int main() { 
     char bitArray[2] ; 
     char *bitArray2=(char *)malloc(sizeof(char)*2); 
     printf("Address = %ld\n", &bitArray); 
     printf("s = %ld\n", sizeof(bitArray));  
     printf("s = %ld\n", sizeof(bitArray2));  
     setBitArray(bitArray, 0,10, 1); 
     return 0; 
    }