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

 
 
> Инициализация переменных в CVAVR, Ошибка иницилизации глобальной переменной в CVAVR
Marian
сообщение Aug 28 2007, 18:18
Сообщение #1


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

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



В CVAVR создаются глобальные переменные :

Код
// Declare your global variables here

typedef struct typePunktMenu punktMenu;

struct typePunktMenu  // struktura punkta menu
{  
   char linia1[17];
   char linia2[17];  
   punktMenu *Up;          
   punktMenu * Left;        
   punktMenu * Right;
   punktMenu * Down;
   void     (*function)();
};              

// masiv punktov menu
punktMenu mainMenu[3];

char linija[17]    = "ABCDEFGHIJKLMNOP";


linija должна начинатся с адреса 1E4h , но в отладке видно, что начинается с адреса 160h

если mainMenu проиницилизировать вручную

Код
// masiv punktov menu
punktMenu mainMenu[3]=
{
{"","",0,0,0,0,0},
{"","",0,0,0,0,0},
{"","",0,0,0,0,0}
};

то све встает на свои места.

Ошибка CVAVR или так и должно быть ?
в файле полный пример и рисунки отладки.
Прикрепленный файл  Projekt.rar ( 327.12 килобайт ) Кол-во скачиваний: 648
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WHALE
сообщение Aug 28 2007, 18:41
Сообщение #2


Знающий
****

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



Ничего не понял..почему вы считаете,что ваш массив должен начинаться с какого-то конкретного адреса?
В компиляторе есть прагмы,позволяющие класть данные в фиксированные адреса,но вы-же их не применяете,да и нафига это нужно?Оставьте черновую работу компилятору и не парьтесь.
и кстати,инициализация.имхо,неправильная,так попробуйте

typePunktMenu.linija = "ABCDEFGHIJKLMNOP";


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 28 2007, 19:08
Сообщение #3


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

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



Цитата(WHALE @ Aug 28 2007, 21:41) *
Ничего не понял..почему вы считаете,что ваш массив должен начинаться с какого-то конкретного адреса?
В компиляторе есть прагмы,позволяющие класть данные в фиксированные адреса,но вы-же их не применяете,да и нафига это нужно?Оставьте черновую работу компилятору и не парьтесь.
и кстати,инициализация.имхо,неправильная,так попробуйте

typePunktMenu.linija = "ABCDEFGHIJKLMNOP";


Переменная linija отношения к typePunktMenu неимеет.

массив будет начинаться с какого-то адреса, так как его туда компилятор помещает.
Мне не нужен постоянный адрес.
( адрес размещения виден в файле main.map , и там он указан верно) но в готовом проекте адрес переменной linija залазит на массив.

Мне кажется что все глобальные переменные должны быть проинициализированны автоматически.

А инициализация(для масива) такая как у меня показанна работает нормально.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 29 2007, 06:56
Сообщение #4


Гуру
******

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



Цитата(Marian @ Aug 28 2007, 22:08) *
Мне кажется что все глобальные переменные должны быть проинициализированны автоматически.
Да, вам правильно кажется. Только обратите внимание, что в первом случае вы не указываете, чем инициализировать ваши структуры. Существует минимум два способа инициализации -
1) в переменную записывается записанное где-то во флеш начальное состояние
2) область памяти переменной заполняется заренее известной константой (нулем).

Поскольку переменная в программе не одна, компилятор группирует их по способу инициализации. И потом сразу одним большим куском копирует сразу все начальные значения в инициализированные глобальные переменные, после чего (или перед - не важно) одним циклом обнуляет все неинициализированные.

Что вы и наблюдаете - когда вы не указываете явное значение для инициализации, переменная попадает в одну область памяти, когда указываете - в другую.

Еще - при указании инициализационных значений структуры можно указывать не все значения, а только несколько первых элементов. Остальные будут считаться компилятором как 0. Т.е. ваша инициализация могла быть записана как punktMenu mainMenu[3]={{0}};


--------------------
На любой вопрос даю любой ответ
"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
Marian
сообщение Aug 29 2007, 09:40
Сообщение #5


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

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



Цитата
Существует минимум два способа инициализации-
1) в переменную записывается записанное где-то во флеш начальное состояние
2) область памяти переменной заполняется заренее известной константой (нулем).

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

Цитата
Еще - при указании инициализационных значений структуры можно указывать не все значения, а только несколько первых элементов. Остальные будут считаться компилятором как 0. Т.е. ваша инициализация могла быть записана как punktMenu mainMenu[3]={{0}};

Пробовал инициализировать и так как у Вас в примере, дает ошибочный результат.

( В файле есть две папки с проектом, если не лень, можете попробовать. Там в проекте после визарда добавлены только эти переменные.)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Marian   Инициализация переменных в CVAVR   Aug 28 2007, 18:18
- - WHALE   опять ничего не понял-так linija у вас переменная ...   Aug 28 2007, 19:28
|- - Marian   Цитата(WHALE @ Aug 28 2007, 22:28) опять ...   Aug 28 2007, 19:37
- - WHALE   может,у вас стек маловат?попробуйте включить марке...   Aug 28 2007, 19:41
|- - Marian   Цитата(WHALE @ Aug 28 2007, 22:41) может,...   Aug 28 2007, 19:45
- - WHALE   а версия компилятора у вас какая?   Aug 28 2007, 19:59
|- - Marian   Цитата(WHALE @ Aug 28 2007, 22:59) а верс...   Aug 29 2007, 03:41
|- - VDG   Цитата(Marian @ Aug 29 2007, 07:41) Да, п...   Aug 29 2007, 14:14
|- - Marian   С настройками программы вроде все в порядке. Цита...   Aug 29 2007, 14:44
|- - VDG   Цитата(Marian @ Aug 29 2007, 18:44) В том...   Aug 29 2007, 20:23
|- - Marian   Цитата(VDG @ Aug 29 2007, 23:23) А Вы это...   Aug 30 2007, 15:14
|- - VDG   Цитата(Marian @ Aug 30 2007, 19:14) Посмо...   Aug 30 2007, 18:41
- - VDG   Пересечение областей памяти, так? Вы хотя бы числа...   Aug 28 2007, 20:12
- - WHALE   я не знаю,пару лет назад как раз по-моему на 1.24....   Aug 29 2007, 09:56


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

 


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


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