|
Как определить констатнты/перем. в .h файле для C ?, Нужно определить размеры массивов в .h файле для С |
|
|
|
May 30 2007, 22:45
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Вопрос конечно чайниковский, сознаю, я пока к таким отношусь.. В коде С определены несколько массивов (ессно постоянного размера), например: Код int arr1[A], arr2[B],...
. . .
void main() { . . A,B - постоянные константы для всего проэкта, посему хочу дать их определение в .h файле где буду определять все константы и глобальные переменные. Сей .h файл includиться в С. Как правильно определить A,B (и инициализировать) в .h файле что-бы их символьно использовать в С коде (в определении размеров массивов) ? Пробовал: Код .h file:
extern int A = 5800; extern int B = 2900; Затем в С: Код int arr1[A], arr2[B];
void main() { . . Компилятор не берет ...
|
|
|
|
|
May 31 2007, 04:06
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(WHALE @ May 31 2007, 07:58)  Попробуйте .h file: #define A 5800 #define B 2900 .c file: int arr1[A],arr2[B],... Можно и по-другому: .h file: const int A=5800; const int B=2900; .c file: int arr1[A],arr2[B],...
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
May 31 2007, 06:49
|

Electrical Engineer
     
Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778

|
Цитата(makc @ May 31 2007, 08:06)  Можно и по-другому:
.h file: const int A=5800; const int B=2900; .c file: int arr1[A],arr2[B],... можно, да не нужно. в 1ом случае осуществляется простая макроподстановка на уровне препроцессора а во 2ом - съедается память под константы А и В (принципиально для ембеддед-программирования)
--------------------
|
|
|
|
|
May 31 2007, 07:11
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(Doka @ May 31 2007, 10:49)  можно, да не нужно. в 1ом случае осуществляется простая макроподстановка на уровне препроцессора а во 2ом - съедается память под константы А и В (принципиально для ембеддед-программирования) Спасибо всем. Воторой вариант (const) пробовал сам ранее - не работает. При компиляции ругается - требует консатнт в определении размера массивив (в С коде) - значит видимо все-таки через const в .h файле он их не видит глобально либо видит но не происходит процесса подстановки перед самой компиляцией. Сейчас попробую первыай вариант (define) - надеюсь сработает. Увы, не сработало :-( Код .h file:
#define PACKED_SIZE 5800
C file:
int bulk[PACKED_SIZE]; Компайлер ругается: error: expected a"]" - в строке определения массива (в С файле). Чушь какая-то
|
|
|
|
|
May 31 2007, 08:28
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126

|
в *.с в верху #include "*.h" //Забыли наверно сделать
|
|
|
|
|
May 31 2007, 09:42
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(SM @ May 31 2007, 12:36)  Скорее всего в .h после дефайна по привычке ";" вкатили. Как всегда SM прав - завидую вашей интуиции..  - действительно влепил везде ; после defineов автоматом.... Сейчас убрал - все нормально. Учимся...учимся... Теперь такое дело - некоторые из этих defineов должны быть видны как переменные (точнее константы) для использования в ассемблерных рутинах (есть несколько asm файлов в проэкте). Ессно, define этого не дает (т.е. определенная defineом она не опознается в файле asm). В виду этого приходиться определять в теле кода C новую константу и присваивать ей значение соотв. defineа и в asm коде работать с этой новой константой. Вопрос такой: есть ли вариант однозначного определения в .h цонстанты так что она работала и как define и как физическая константа для asm файлов ? Цитата Компилятору надо знать размер массива и с #define препроцессор дает размер. В случае с const int на момент компиляции значение неизвестно. Вывод: В языке С размеры массивов принято определять через соответствующий #define . Да, именно это и понял из всего...получил полезный урок..
|
|
|
|
|
Oct 2 2007, 20:16
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 4-06-07
Пользователь №: 28 174

|
Подскажите, почему такое происходит в Code Composer Studio: В .h файле есть такое определение массива: Код #ifndef SSD_API_H #define SSD_API_H
#ifndef SSD_REGS #define SSD_REGS
// Значения регистров после POR const Uint16 SSDRegsPOR[0x50] = { 0x0000, 0x0000 ............. }
#endif // SSD_REGS
#endif // SSD_API_H Этот файл включается в два .c файла. И в этом случае компилятор сообщает, что константа SSDRegsPOR определа несколько раз. Может быть дело в настройках компилятора/препроцессора?
|
|
|
|
|
Oct 3 2007, 08:30
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Mokena @ Oct 2 2007, 23:16)  Про массивы уже сказали. Компилятор должен знать, где этот массив размещать. Когда вы включаете в заголовочный файл определение а не объявление массива - компилятор вынужден создать по копии массива в каждом из файлов. Если вас это не смущает - добавьте static перед определением массива. Тогда каждая копия массива будет видна только внутри этого .c файла. Но это некрасивое решение. Правильнее объявить массив в .h как extern, а определить его в одном из .с: Код array.h: extern uint8_t array[size];
file1.c: #include "array.h" uint8_t array[size] = { ..... ..... }; file2.c: #include "array.h" А вот для обычных констант как раз наоборот - можно определять их в .h как static uint8_t const Const1 = 123;, тогда компилятор вполне может не выделять под нее память и скомпилировать в опкод сразу значение константы, вместо ее чтения. Но при таком подходе нельзя брать адрес этой константы - иначе компилятор будет вынужден выделить под нее память.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 3 2007, 16:08
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 4-06-07
Пользователь №: 28 174

|
Ого, все оказалось чуточку сложнее, чем я представлял. Но теперь все ясно, всем большое спасибо.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|