ANSI C: передача массива по значению генерирует странную ошибку, которую я не могу решить - PullRequest
0 голосов
/ 15 октября 2010

Когда я объявляю эту функцию:

void vLFSR_ParseInput(unsigned char * pucDataArray,unsigned char unCount){}

и пытаюсь передать ей этот массив

unsigned char g_ucUSCI_A0_RXBufferIndex = 0x00;   
unsigned char g_ucaUSCI_A0_RXBuffer[RXBUFFERSIZE];

с помощью этого вызова функции

vLFSR_ParseInput(&g_ucaUSCI_A0_RXBuffer,g_ucUSCI_A0_RXBufferIndex);

мой компилятор даетмне эта ошибка

аргумент типа "unsigned char (*) [255]" несовместим с параметром типа "unsigned char *"

Что я делаю неправильно?Если это помогает, я программирую с использованием TI Code Composer Studio, и моя платформа принадлежит семейству MSP430x2xx.

edit: фиксированное форматирование

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Вы должны использовать:

vLFSR_ParseInput(g_ucaUSCI_A0_RXBuffer,g_ucUSCI_A0_RXBufferIndex); 
                 ^ no unary &

Массив неявно преобразуется в указатель на его начальный элемент, поэтому, когда вы используете g_ucaUSCI_A0_RXBuffer в большинстве контекстов, он распадается на указатель на свой начальный элемент, как если бы вы написали &g_ucaUSCI_A0_RXBuffer[0]. Тип этого unsigned char*.

Когда вы применяете унарный - & к массиву, он дает вам адрес массива. Он имеет то же значение указателя, но его тип unsigned char (*)[RXBUFFERSIZE].

0 голосов
/ 15 октября 2010
vLFSR_ParseInput(g_ucaUSCI_A0_RXBuffer,g_ucUSCI_A0_RXBufferIndex);

Массивы оцениваются в литералы указателя (что означает примерно число, тип которого является указателем на тип, из которого сделан массив).

Вы брали адрес литерала указателяпохоже на int *x = & 4;) и пытается передать это в функцию, которая ожидала указатель.Вы пытались дать ему указатель на указатель.

И вы передавали по ссылке, а не по значению.Передача массивов по значению в C занимает много работы и выполняется редко.

0 голосов
/ 15 октября 2010

В массиве, например, x [10], «x» рассматривается как указатель на блок памяти, достаточно большой, чтобы вместить 10 элементов (а [] - это синтаксис для разыменования этого указателя для доступа к отдельным элементам в пределахэтот блок).

Если вы добавите & перед этим, вы берете адрес указателя , а не адрес массива памяти .То есть вы создали указатель на указатель, который является (char **), а не (char *).

Просто удалите & и все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...