Рваный массив в C
Мне передали проект микроконтроллера, который находится на C. Я - опытный программист, но не на этом языке. Я "думаю", что моя проблема связана с синтаксисом C (и моим отсутствием понимания), а не с компилятором микроконтроллера, поэтому я буду игнорировать проблемы с компилятором ради краткости.
Я пытаюсь использовать массив Jagged/Ragged для хранения информации о шрифте для быстрого вызова для отображения на ЖК-дисплее. Есть и другие способы решения этой проблемы, но у меня есть причины хотеть придерживаться этой концепции.
Давайте для этого примера предположим, что в моем шрифте всего три глифа (символа). Что неизвестно, так это длина каждой строки, которая определяет этот глиф. Примеры:
Глифу {A} понадобятся эти данные: {65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF}
Глифу {'} понадобятся эти данные: {39,2,3,4,9,0xC0,0xC0, 0xC0}
Глифу {.} Понадобятся эти данные: {46,2,2,4,0,0xC0,0xC0}
Имея это в виду, вот мой код.
//This is where I attempt to make my Jagged array.
char X,Y, LeftOffSet, BaseOffSet;
char * font[3]={{46,2,2,4,0,0xC0,0xC0},
{39,2,3,4,9,0xC0,0xC0, 0xC0},
{65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF}};
//None of these assignments work properly.
LeftOffSet=font[0][0]; // expected assignment = {46}
LeftOffSet=font[1][4]; // expected assignment = {9}
LeftOffSet=font[2][1]; // expected assignment = {8}
Этот код кажется функциональным? Я, кажется, выбрасываю ошибку, которую трудно поймать. Задания не работают, как ожидалось. Когда компилятор запускает первый, он сбрасывает проект.
Заранее спасибо за помощь.
2 ответа
Если вам действительно нужен рваный массив, то для его построения с использованием этого встроенного синтаксиса необходим современный компилятор C, который поддерживает составные литералы
char *font[] = {
(char []) {46,2,2,4,0,0xC0,0xC0},
(char []) {39,2,3,4,9,0xC0,0xC0, 0xC0},
(char []) {65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF}
};
Если ваш компилятор не поддерживает составные литералы, у вас нет другого выбора, кроме как определить внутренние массивы как отдельные именованные объекты
char row0[] = {46,2,2,4,0,0xC0,0xC0},
row1[] = {39,2,3,4,9,0xC0,0xC0, 0xC0},
row2[] = {65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF},
*font[] = { row0, row1, row2 };
Ваш исходный код недействителен C. Если он компилируется, то это только из-за какого-то расширения компилятора, которое не делает то, что вы думаете, что делает.
PS Та же проблема, что и в случае ошибки сегментации 'C' с массивом 2d
Это то, что вы ищите:
char X,Y, LeftOffSet, BaseOffSet;
char font1[7] ={46,2,2,4,0,0xC0,0xC0};
char font2[8] ={39,2,3,4,9,0xC0,0xC0, 0xC0};
char font3[15] ={65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF};
char *fonts[] = {font1, font2, font3};
main (int argc, char *argv[]) {
//None of these assignments work properly.
LeftOffSet = fonts[0][0];
}
Обратите внимание, что это опасно, так как вы не знаете длины отдельных массивов. Хороший способ сделать это лучше - иметь размер массива в качестве первого элемента массива, прочитать его, чтобы проверить границы, а затем проиндексировать его. С другой стороны, вы могли бы иметь структуру, чтобы определить это тоже.
struct font {
short size;
char pattern[MAX_FONT_SIZE];
}