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

 
 
 
Reply to this topicStart new topic
> Как в IAR C++ положить константу по адресу?
gladov
сообщение Dec 20 2007, 06:51
Сообщение #1


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Добрый, всем, день.

Мне нужно в коде на С++ положить во флешку по определнному адресу, заданному на этапе компиляции, некоторую константную структуру данных - блок параметров.

Пока удалось сделать только так:
parameters.h
Код
typedef struct
{
  ...
} tParameters;

#ifndef __PARAMETERS__
extern const tParameters* Parameters;
#endif


И Parameters.cpp:
Код
#define     __PARAMETERS__
#include "Parameters.h"
static const tParameters Param @ "CFG_SEG" = {...};
const tParameters* Parameters = &Param;


В таком виде это работает, но хочется сделать это одной переменной. Т.е. я не могу написать такое extern описание для переменной Param чтобы в любом другом месте кода использовать конструкцию Param.SomeField.

Я прекрасно понимаю, что в моем случае обращение вида Parameters->SomeField, в плане скорости и расхода памяти, нисколько не хуже чем Param.SomeField, просто хочется узнать, где мы с компилятором друг друга не поняли 07.gif
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 20 2007, 07:30
Сообщение #2


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



...попробуйте вот так

parameters.h
Код
#ifndef __PARAMETERS__
#define     __PARAMETERS__

typedef struct
{
  ...
} tParameters;

extern const tParameters Parameters;

#endif


И Parameters.cpp:
Код
#include "Parameters.h"

const tParameters Parameters @ "CFG_SEG" = {...};



...в вашем примере загвоздка в использовании модифкатора static, если описывать переменную используя его, то область действия переменной распространяется только на файл где она определена
Go to the top of the page
 
+Quote Post
vmp
сообщение Dec 20 2007, 08:10
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Пора уже FAQ делать
http://electronix.ru/forum/index.php?showtopic=36695&hl=
Go to the top of the page
 
+Quote Post
gladov
сообщение Dec 20 2007, 08:15
Сообщение #4


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Спасибо большое. Так заработало:
parameters.h
Код
typedef struct
{
  ...
} tParameters;

extern const tParameters Param;


И Parameters.cpp:
Код
#include "Parameters.h"
const tParameters Param @ "CFG_SEG" = {...};


Получается, что после препроцессора, в Parameters.cpp будет примерно такой код:
Код
extern const tParameters Param;
const tParameters Param @ "CFG_SEG" = {...};


Я думал это вызовет конфликт объявлений, но именно это и помогло. А почему? 07.gif

А насчет static я и сам уже нашел, что область видимости сужается до одного файла.

Цитата(vmp @ Dec 20 2007, 11:10) *


Я видел эту ветку, но прежде чем наезжать, вникли бы в проблему. Дело не в том, что я не знаю как разместить переменную по указанному адресу, а в том, что я не понимал (да и сейчас не понимаю) как в C++ (не С) правильно указать extern описание чтобы переменная с фиксированным адресом была видна из любого модуля.
Go to the top of the page
 
+Quote Post
gladov
сообщение Dec 20 2007, 12:13
Сообщение #5


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



В продолжение темы был поставлен такой опыт:

1.cpp:
Код
//extern const int A;
const int A = 1;


main.cpp:
Код
#include <stdio.h>

extern const int A;

int main()
{
    printf("A = %d\n", A);
    return 0;
}


Компиляция этого маленького проекта на GCC (равно как и в ИАРе) вываливается на этапе линковки с ошибкой
main.cpp:(.text+0x18): undefined reference to `A'
Но стоит раскоментарить строчку с extern в файле 1.cpp и все начинает работать!!! cranky.gif

Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp
Кто может объяснить, что происходит?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 20 2007, 13:23
Сообщение #6


Гуру
******

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



Цитата(gladov @ Dec 20 2007, 14:13) *
Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp
Кто может объяснить, что происходит?
C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы.


--------------------
На любой вопрос даю любой ответ
"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
gladov
сообщение Dec 20 2007, 13:26
Сообщение #7


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(Сергей Борщ @ Dec 20 2007, 16:23) *
C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы.


Спасибо огромное! beer.gif
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 20 2007, 13:54
Сообщение #8


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(gladov @ Dec 20 2007, 11:15) *
Получается, что после препроцессора, в Parameters.cpp будет примерно такой код:
Код
extern const tParameters Param;
const tParameters Param @ "CFG_SEG" = {...};


Я думал это вызовет конфликт объявлений, но именно это и помогло. А почему? 07.gif



...да так и получается. И нет ничего удивительного в том что это работает. Просто первая строка это объявление переменной (означает что где-то существует такой объект), а вторая это определение переменной (т.е объект вот с таким именем и такого типа есть здесь).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd July 2025 - 04:14
Рейтинг@Mail.ru


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