Рваный массив в 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];
}
Другие вопросы по тегам