Как бы я сделать указатель на массив данных работать в C? - PullRequest
0 голосов
/ 05 октября 2010

У меня есть четыре массива данных (3072 байта каждый). Я хочу указать на один из этих массивов, поэтому, если функции передан указатель на эти массивы, она может манипулировать ими, и указатели могут быть s

Итак, сначала я подумал о указателях на указатели:

uint16_t *buffer0_level[BUFF_WORDS] FAR;
uint16_t *buffer0_mask[BUFF_WORDS] FAR;
uint16_t *buffer1_level[BUFF_WORDS] FAR;
uint16_t *buffer1_mask[BUFF_WORDS] FAR;

uint16_t **draw_buffer_level;
uint16_t **draw_buffer_mask;
uint16_t **disp_buffer_level;
uint16_t **disp_buffer_mask;

А затем, чтобы установить указатели, я бы сделал что-то вроде этого:

draw_buffer_level = buffer0_level;
draw_buffer_mask = buffer0_mask;
disp_buffer_level = buffer1_level;
disp_buffer_mask = buffer1_mask;

Это кажетсяwork.

Однако затем я хочу передать указатель на функцию fill_buffer, которая заполняет один из массивов некоторым словом данных.

Определение:

void fill_buffer(uint16_t *buff, uint16_t word)

Но при вызове так:

fill_buffer(draw_buffer_level, 0x0000);
fill_buffer(draw_buffer_mask, 0x0000);
fill_buffer(disp_buffer_level, 0x0000);
fill_buffer(disp_buffer_mask, 0x0000);

GCC жалуется:

gfx.c:46: warning: passing argument 1 of 'fill_buffer' from incompatible pointer type
gfx.c:47: warning: passing argument 1 of 'fill_buffer' from incompatible pointer type
gfx.c:48: warning: passing argument 1 of 'fill_buffer' from incompatible pointer type
gfx.c:49: warning: passing argument 1 of 'fill_buffer' from incompatible pointer type

Я уверен, что это просто глупая ошибка, но что это?Я все еще новичок в программировании на C.

Ответы [ 2 ]

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

Я предполагаю, что вы хотите выделить длинные буферы BUFF_WORDS из 16-битных слов, а не указатели. Для этого вам нужно изменить свои объявления следующим образом:

uint16_t buffer0_level[BUFF_WORDS] FAR;
uint16_t buffer0_mask[BUFF_WORDS] FAR;
uint16_t buffer1_level[BUFF_WORDS] FAR;
uint16_t buffer1_mask[BUFF_WORDS] FAR;

Вам не нужно объявлять указатели, чтобы ваша функция инициализировала массивы. Вы можете передавать имена массивов (которые в любом случае являются указателями) непосредственно в функцию. Но вы должны передать длину массива в функцию. Вот так

fill_buffer(buffer0_level, BUFF_WORDS, 0x0000);
fill_buffer(buffer0_mask, BUFF_WORDS, 0x0000);
fill_buffer(buffer1_level, BUFF_WORDS, 0x0000);
fill_buffer(buffer1_mask, BUFF_WORDS, 0x0000);

Тогда вы бы реализовали свою функцию так,

void fill_buffer(uint16_t* buffer, int count, uint16_t value)
{
    int ii;
    for (ii = 0; ii < count; ++ii)
    {
        *buffer++ = value;
    }
}
0 голосов
/ 05 октября 2010

вам нужно разыменовать указатель на указатель.

fill_buffer(*draw_buffer_level, 0x0000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...