Перебор элементов массива по адресу памяти.(С) - PullRequest
3 голосов
/ 10 июля 2011

Я новичок в C. У меня есть константный беззнаковый короткий массив из 1024 шестнадцатеричных чисел.Каждое шестнадцатеричное число представляет собой 8 битов и представляет биты, которые должны включаться и выключаться при отображении изображения на экране GBA.Но не берите в голову все это и синтаксис DMA, который я имею ниже только для справки !!

Мой главный вопрос ... как я могу перебирать элементы в массиве ПО АДРЕСУ, захватывать это содержимое, а затем продолжать увеличиваться по адресам?Кроме того, если вы могли бы взглянуть на приведенный ниже код и, возможно, понять, почему я получаю:

"Program.c:(.text+0xe8): undefined reference to `myimg'" 

на строке, которая вызывает "drawImage3" и это будет рад.

(восновная часть программы. C):

const unsigned short *pt;  
pt = &myimg[0]; 
int size = 5;
drawImage3(15,15,img_WIDTH,img_HEIGHT, pt);

(определено в другом месте):

void drawImage3(int x, int y, int width, int height, const u16* image)
{
    int r;
    for (r=0; r<height; r++)
    {   
        DMA[3].src = &image;
        DMA[3].dst = &videoBuffer[OFFSET(x+width, y, 240)];
        DMA[3].cnt = width | DMA_SOURCE_FIXED | DMA_ON |   DMA_DESTINATION_INCREMENT;  
        image++;    
    }
}

Ответы [ 2 ]

1 голос
/ 10 июля 2011

Вы устанавливаете DMA[3].src на адрес указателя, что, вероятно, не то, что вы хотите сделать.Для ясности, вот что означают эти ссылки:

*image    -- the value of the thing which image points to
 image[0] -- same as *image
 image    -- the location in memory of your thing
&image    -- the location in memory that is storing your pointer
&image[0] -- same as image
&image[n] -- the location of the nth element in your thing

Поэтому вместо DMA[3].src = &image; вам, вероятно, понадобится один из этих двух:

DMA[3].src = &image[r];    # If you do this do NOT increment image

или

DMA[3].src = image;        # And continue to increment image

Если вы выберете последнее, то

DMA[3].src = image;
image++;

Лучше записать как:

DMA[3].src = image++;
0 голосов
/ 10 июля 2011

Из предоставленного кода, myimg никогда не определяется (вторая строка во втором блоке кода).

Что касается зацикливания по адресу, то массивы уже являются указателями, поэтому простой цикл for аналогичен зацикливанию адресов. Я не уверен, что вы пытаетесь достичь с помощью «зацикливания по адресу», потому что это то, что C уже делает.

EDIT:

AFAIK, массивы на самом деле не существуют в C, но они существуют в C ++, поэтому индексация в массиве просто говорит: «дайте мне кусок памяти, начинающийся с этого адреса, и размер этого множества байт * в нем» .

Например, массив int (4 байта на индекс) - это просто кусок памяти, равный 4 bytes * number of indexes. Получение индекса в этом «массиве» - это просто получение смещения памяти x байтов * 4 (sizeof int) в блок памяти.

Проще говоря, вам не нужно об этом сильно беспокоиться.

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