Определить массив в C - PullRequest
       44

Определить массив в C

9 голосов
/ 24 марта 2012

У меня есть несколько массивов из 450 элементов (для хранения растровых данных для отображения на ЖК-экранах). Я хотел бы поместить их в файл заголовка и #define их, но я продолжаю получать ошибки компиляции.Как бы я сделал это в C ?

#define numbers[450] {0, 1,etc...}

#define numbers {0, 1, etc...}

#define numbers[450], затем установите числа позже

и многие другие ...

Ответы [ 3 ]

10 голосов
/ 24 марта 2012

Ну ... вам определенно не нужно использовать определение.Просто добавьте их в заголовок как const, статические массивы.

/* prevents multiple, redundant includes */
/* make sure to use a symbol that is fairly sure to be unique */
#ifndef TEST_H
#define TEST_H

/* your image data */
const char image[] = { 1, 2, 3, 4, ... };

#endif

Кроме того, если вам нужна помощь при ошибке компиляции, вы должны опубликовать свой код.

8 голосов
/ 24 марта 2012

Поскольку вы отображаете на ЖК-дисплее, я предполагаю, что это встроенная система.

Не помещайте данные в заголовок.

Поместите данные в обычный C илиC ++ файл.Скомпилируйте это.Он может содержать только данные, что нормально, и его легко обновлять.

Затем используйте файл заголовка, чтобы предоставить доступ к данным.

Например, в images.cfile:

#include "images.h"
const byte numbers1[MAX_NUMBERS1] = { ... };
byte numbers2[MAX_NUMBERS2];       // will be initialsied to 0

Тогда images.h - это:

#ifndef _IMAGES_H_
#define _IMAGES_H_

typedef unsigned char byte;
#define MAX_NUMBERS1 (450)
        // different constants in case you change something        
#define MAX_NUMBERS2 (450)      
       // even better if you can do const static int MAX_NUMBERS1=450; 
       // but depends on the compiler
extern const byte numbers1[MAX_NUMBERS1] = { ... };
extern byte numbers2[MAX_NUMBERS2];       // will be initialised to 0

#endif

Тогда все остальные файлы .c в программе могут получить к ним доступ.

Это (почти)всегда плохая идея поместить определение переменной в файл заголовка.

A объявление переменной, например.extern byte numbers2[MAX_NUMBERS2]; сообщает компилятору C, что в окончательной связанной программе есть переменная-массив с именем numbers2 где-то еще .Если компоновщик не получит это определение (откуда-то еще), он выдаст ошибку, потому что нет места для выделенной переменной.

A определение переменной (уведомление №extern), например.byte numbers2[MAX_NUMBERS2]; фактически сообщает компилятору C, что существует переменная массива с именем numbers2, и она должна выделять место здесь, в результирующем объектном коде из этого исходного файла, и это будет использоваться для хранения значения переменной впоследняя связанная программа.

Пространство для numbers2 равно , а не , выделенному компилятором C, когда он видит объявление (которому предшествует extern), оно выделяется, когда оно видитфактическое определение (нет extern).

Итак, если вы поместите фактическое определение любой переменной в файл заголовка и включите его в несколько файлов исходного кода (.c), компилятор Cвыделит место для переменной более одного раза.Тогда компоновщик выдаст ошибку (обычно несколько определений с одним и тем же именем).

Есть более тонкая проблема.Если при первой разработке программы заголовочный файл включает только один исходный файл, то программа будет правильно скомпилирована и скомпонована.Затем, позже, если второй исходный файл содержит заголовок (возможно, кто-то только что разделил исходный файл исходного кода на два файла), компоновщик выдаст ошибку «множественные определения».Это может быть очень запутанным, потому что программа использовалась для компиляции и компоновки, и, очевидно, ничего не изменилось.

Сводка
Никогда не выделяйте место для переменной , помещая определение в заголовочном файле.Только переменные декларации помещаются только в заголовочные файлы.

1 голос
/ 07 июля 2014

У меня была похожая проблема.В моем случае мне понадобился массив констант для использования в качестве размера других статических массивов.Когда я попытался использовать

const int my_const_array[size] = {1, 2, 3, ... };

, а затем объявил:

int my_static_array[my_const_array[0]];

Я получил ошибку от моего компилятора:

array bound is not an integer constant

Итак, наконец-то я сделалследующее (может быть, есть более элегантные способы сделать это):

#define element(n,d) ==(n) ? d :
#define my_const_array(i) (i) element(0,1) (i) element(1,2) (i) element(2,5) 0
...