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

 
 
> Как в 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
 
Start new topic
Ответов
gladov
сообщение Dec 20 2007, 08:15
Сообщение #2


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

Группа: Свой
Сообщений: 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
tag
сообщение Dec 20 2007, 13:54
Сообщение #3


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 23rd July 2025 - 09:13
Рейтинг@Mail.ru


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