реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как определить констатнты/перем. в .h файле для C ?, Нужно определить размеры массивов в .h файле для С
Саша Z
сообщение May 30 2007, 22:45
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Вопрос конечно чайниковский, сознаю, я пока к таким отношусь.. wink.gif
В коде С определены несколько массивов (ессно постоянного размера), например:
Код
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()
{
.
.


Компилятор не берет ...
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 31 2007, 03:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Попробуйте
.h file:
#define A 5800
#define B 2900
.c file:
int arr1[A],arr2[B],...


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
makc
сообщение May 31 2007, 04:06
Сообщение #3


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Doka
сообщение May 31 2007, 06:49
Сообщение #4


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ом - съедается память под константы А и В
(принципиально для ембеддед-программирования)


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 31 2007, 07:11
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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"]" - в строке определения массива (в С файле).

Чушь какая-то cranky.gif
Go to the top of the page
 
+Quote Post
BratherLU
сообщение May 31 2007, 08:28
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



в *.с в верху
#include "*.h"
//Забыли наверно сделать smile.gif
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 31 2007, 08:31
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(BratherLU @ May 31 2007, 12:28) *
в *.с в верху
#include "*.h"
//Забыли наверно сделать smile.gif


да нее, это есть..чайник то я чайник, но не аткой прогоревший... lol.gif
Go to the top of the page
 
+Quote Post
SM
сообщение May 31 2007, 08:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Саша Z @ May 31 2007, 11:11) *
Компайлер ругается: error: expected a"]" - в строке определения массива (в С файле).


Скорее всего в .h после дефайна по привычке ";" вкатили.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение May 31 2007, 08:40
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



это все примитивные вещи.

У вас путь к h файлу в опциях проекта прописан (или он в одной папке с *.с ??)?


Текст h файла :

#define x 10


Текст с файла:

#include "(тут имя h файла )"

int arr[x];



Все должно работать
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 31 2007, 09:40
Сообщение #10


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



>.h file:
>const int A=5800;
>const int B=2900;
>.c file:
>int arr1[A],arr2[B],...

Компилятору надо знать размер массива и с #define препроцессор дает размер. В случае с const int на момент компиляции значение неизвестно.
Вывод: В языке С размеры массивов принято определять через соответствующий #define .

Сообщение отредактировал mdmitry - May 31 2007, 09:41


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 31 2007, 09:42
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(SM @ May 31 2007, 12:36) *
Скорее всего в .h после дефайна по привычке ";" вкатили.


Как всегда SM прав - завидую вашей интуиции.. a14.gif - действительно влепил везде ; после defineов автоматом.... smile.gif

Сейчас убрал - все нормально. Учимся...учимся... wink.gif

Теперь такое дело - некоторые из этих defineов должны быть видны как переменные (точнее константы) для использования в ассемблерных рутинах (есть несколько asm файлов в проэкте). Ессно, define этого не дает (т.е. определенная defineом она не опознается в файле asm). В виду этого приходиться определять в теле кода C новую константу и присваивать ей значение соотв. defineа и в asm коде работать с этой новой константой.
Вопрос такой: есть ли вариант однозначного определения в .h цонстанты так что она работала и как define и как физическая константа для asm файлов ?

Цитата
Компилятору надо знать размер массива и с #define препроцессор дает размер. В случае с const int на момент компиляции значение неизвестно.
Вывод: В языке С размеры массивов принято определять через соответствующий #define .


Да, именно это и понял из всего...получил полезный урок.. biggrin.gif
Go to the top of the page
 
+Quote Post
SM
сообщение May 31 2007, 10:01
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Саша Z @ May 31 2007, 13:42) *
Вопрос такой: есть ли вариант однозначного определения в .h цонстанты так что она работала и как define и как физическая константа для asm файлов ?


В asm константы определяются через ".set" или ".equ" или как-то аналогично. Отдельно взятые трансляторы асма умеют понимать и #define, но это скорее исключение, чем правило. Посему чтобы однозначно - никак. Держите два файла, .inc для асма и .h для цэ. Ну и меняйте их одновременно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 31 2007, 20:37
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SM @ May 31 2007, 13:01) *
Держите два файла, .inc для асма и .h для цэ. Ну и меняйте их одновременно.

Хлопотно sad.gif
Лучше в проект запихнуть конвертировщик *.H в *.INC для вариантов с EQU пользую штатную утилииту от Borland.
Прикрепленные файлы
Прикрепленный файл  H2ASH32.rar ( 113.11 килобайт ) Кол-во скачиваний: 48
 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 31 2007, 20:48
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Большое спасибо всем, помошь в понимании была весьма существенна.
Проблема решена defineами в .h файле.

Ввиду того что мало общих констант требуется в ассемблерных файлах - решил себе жизню не осложнять - просто определяю те несколько констант в теле C кода как const и давать ей там соотв. значение defineа.

Предпочел пока по простому - благо таких констант всего 2-3 в ассемблерных рутинах.
Go to the top of the page
 
+Quote Post
makc
сообщение Jun 1 2007, 02:51
Сообщение #15


Гуру
******

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



Цитата(mdmitry @ May 31 2007, 13:40) *
>.h file:
>const int A=5800;
>const int B=2900;
>.c file:
>int arr1[A],arr2[B],...

Компилятору надо знать размер массива и с #define препроцессор дает размер. В случае с const int на момент компиляции значение неизвестно.
Вывод: В языке С размеры массивов принято определять через соответствующий #define .


Да, точно. Это я с C++ перепутал, в котором этот пример работает нормально.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Mokena
сообщение Oct 2 2007, 20:16
Сообщение #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 определа несколько раз. Может быть дело в настройках компилятора/препроцессора?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 2 2007, 21:09
Сообщение #17


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



В глобальном списке имен появляются два одинаковых массива
const Uint16 SSDRegsPOR[0x50] = {
0x0000, 0x0000 .............
},
что, естественно, линкеру не нравиться.

ИМХО, лучше массивы в заголовочных файлах не определять, тем более глобальные.
Решение: определить в одном файле исходного текста, а в друггм ссылаться через extern.

Сообщение отредактировал mdmitry - Oct 2 2007, 21:10


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
PSP
сообщение Oct 2 2007, 21:23
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 1-10-07
Пользователь №: 30 988



Если всетаки хочется определить переменную/массив в .h файле, то можно воспользоваться манипуляциями с extern.


#ifdef IMPLEMENT
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN const Uint16 SSDRegsPOR[0x50] = {...


В свою очередь IMPLEMENT нужно определить только в одном .c файле, там и будет реализация массива. А во всех остальных он будем с модификаторм extern, т.е. только объявлен.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 3 2007, 08:30
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Mokena
сообщение Oct 3 2007, 16:08
Сообщение #20


Участник
*

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



Ого, все оказалось чуточку сложнее, чем я представлял. Но теперь все ясно, всем большое спасибо.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01535 секунд с 7
ELECTRONIX ©2004-2016