Как получить доступ к элементам массива в пользовательском типе данных? (С) - PullRequest
0 голосов
/ 19 мая 2019

Я пишу программу на C для эмуляции фонового режима 7 SNES.Мне нужны значения r (красный), g (зеленый) и b (синий), чтобы пиксель отображался в каждой «точке» (пиксель / точка) на экране.Для этого требуется преобразование «мозаичной карты» (мозаичная карта - это просто сетка пикселей 1024 x 1024, которую вы используете, чтобы решить, что разместить на дисплее 256 x 224 пикселей).Мне нужно иметь возможность считывать и записывать в пиксели как их отдельные значения r, g и b на карте тайлов.

Для быстрого объяснения формата, который я использую, есть 256 «символов», которые простоБлоки 8 х 8 пикселей (состоят из трех цветовых байтов для представления красного, зеленого и синего).Карта тайлов состоит из сетки 128 x 128 любого из этих символов.Как только карта тайлов создана, на карте тайлов формируется преобразование, чтобы различить отдельные пиксели для отображения на экране размером 256 x 224 пикселя.

Для этого я определяю: структуру с именем "color", содержащую три неподписанныхchars для байтов r, g и b, тип данных с именем «CHR», представляющий собой массив «color» размером 8 x 8, тип данных с именем «ChrRom», представляющий собой массив из 256 «CHR» (возможно, можетизбегать определения, но это был единственный способ, которым я мог бы думать, иметь массив массивов, которые я также могу разыменовать ... я думаю).Наконец, у меня есть разыменованный массив с именем «Tilemap» для (надеюсь) хранения адресов памяти каждого элемента в структуре «ChrRom».Извините, если это не было ясно, но вот пример кода:

typedef struct{
    unsigned char r;
    unsigned char g;
    unsigned char b;
} colour;

typedef colour CHR[8][8];

typedef CHR ChrRom[256];

int main() {
    ChrRom *Tilemap[128][128];
    //Do other computation
    return 0;
};

Пока что это скомпилируется.Однако теперь я хочу установить цветовые значения определенного пикселя в символе, и сразу же возникает проблема;во-первых, я больше не могу получить доступ к отдельным цветам пикселя в «персонаже».У меня есть доступ только к самой плитке, во-вторых, я все равно не знаю, как читать значения цветов в карте.Что касается второй проблемы (предположим, что я каким-то образом прочитал из файла и передал соответствующие значения цвета в символы карты тайлов и составил карту тайлов указанных символов в заданном порядке), я попытался:

//Still in the function where Tilemap was declared obviously (main)
printf("%hhu\n", Tilemap[1][1].ChrRom[7].CHR[1][3].r);

GCC не будет компилировать это.Он говорит:

запрос на член 'ChrRom' в чем-то, не являющемся структурой или объединением

, но если я удаляю ChrRom и CHR перед записями массива, я получаю:

ожидаемый идентификатор до '[' токена

1 Ответ

0 голосов
/ 20 мая 2019

Наконец, у меня есть разыменованный массив с именем "Tilemap" для (надеюсь) хранения адресов памяти каждого элемента в структуре "ChrRom".

Нет, определив ChrRom *Tilemap[128][128], вы объявляете для хранения адреса памяти ChrRom с (из которых существует только один). Для хранения адресов памяти элементов в структуре «ChrRom» необходимо указать тип этих элементов: CHR *Tilemap[128][128].

...