2015-11-19 6 views
1

У меня есть ситуация, когда я передаю массив, содержащий 2 1 байтовые значения, функции, но почему-то функция считает, что массив имеет длину 4 байта, что испортит мои манипуляции с битами, время. Я даже пробовал явно бросать каждое значение массива как uint8, но безрезультатно. Любые идеи о том, что может произойти? Использование gcc-инструментов cygwin на Eclipse Mars.1.C преобразование 8-битных значений в 16-битные значения

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

Еще одна вещь. sizeof (bitArray) дает 2 байта в main().

+1

Вы не можете использовать 'sizeof' на массиве параметров. См. [Этот ответ] (https://stackoverflow.com/questions/37538/how-do-determine-the-size-of-my-array-in-c/10349610#10349610). – kaylum

+0

Не 16 бит, а 32 бита –

+0

Я использовал sizeof (array)/sizeof (element) все время, чтобы найти количество элементов. http://stackoverflow.com/questions/37538/how-do-i-deetermine-the-size-of-my-array-in-c – AaronF

ответ

1

Передача массива функции отправляет адрес первого элемента в массиве, а не весь массив как объект. Функция не имеет способа определить, какой тип переданного адреса так не может дать вам размер.

простое решение было бы передать размер с массивом в структуры или случайно

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

arguement, который передается в функции не массив, а указатель на массив. Размер указателя в c составляет 8 байтов. Рассмотрим код, который я добавил, где я сначала создал указатель на символ, а затем выделенную память динамически, используя malloc. Поскольку bitArray2 является указателем символ его размер составляет 8 вместо 2. При переходе заданы параметры нового указателя полукокс создается и, следовательно, его размер составляет 8 вместо 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; 
    }