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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Помогите ламеру с IAR, проблема с вычислением адреса переменной
jack_avenger
сообщение Sep 3 2005, 11:17
Сообщение #1


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

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Не пинайте за глупый вопрос я перехожу с CodeVision на IAR и ничего не понимаю.
Юзаю IAR 4.11A
Надо получить старшую часть адреса переменной в RAM.
Пробую что-то типа

int Variable=1;
char AddrH=(char)((&Variable)>>8);
не катит (матерится компилятор). А если написать так:
int Variable=1;
char AddrH=(char)(&Variable);
то все гуд, но понятно что получаю младшую часть.

Как надо правильно писать?
Go to the top of the page
 
+Quote Post
aal
сообщение Sep 3 2005, 11:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 20-10-04
Из: Новосибирская обл, п.Краснообск.
Пользователь №: 916



Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать.
Во вторых приводи не к чар а к инту и его уже сдвигай. А так ты уже получил младшую часть адреса и ещё пытаешся её сдвинуть. Компилятор и ругается на это. ИМХО. Не проверял.


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение Sep 3 2005, 11:34
Сообщение #3


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

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Цитата(aal @ Sep 3 2005, 14:25)
Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать.
*

Спасибо, static действительно помог =))
Цитата(aal @ Sep 3 2005, 14:25)
Во вторых приводи не к чар а к инту и его уже сдвигай. А так ты уже получил младшую часть адреса и ещё пытаешся её сдвинуть. Компилятор и ругается на это. ИМХО. Не проверял.
*


Значит преобразование от int к char за меня сделает компилятор?
Go to the top of the page
 
+Quote Post
INT1
сообщение Sep 3 2005, 11:37
Сообщение #4


deleted
****

Группа: Свой
Сообщений: 555
Регистрация: 28-08-05
Пользователь №: 8 024



не работал с Кодевижн, но может быть связано с
"..ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel — пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah."
к примеру, тут:
http://www.chipnews.com.ua/html.cgi/arhiv/00_10/15.htm
Go to the top of the page
 
+Quote Post
aal
сообщение Sep 3 2005, 12:00
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 20-10-04
Из: Новосибирская обл, п.Краснообск.
Пользователь №: 916



>Значит преобразование от int к char за меня сделает компилятор?
При пересылке инта в чар - вчаре окажется младший байт инта.
Приведением типа не увлекайся, можешь на глюки нарватся. Если надо что-то посчитать точно, через темповую переменную работай - код тотже - глюков меньше. А в реал переводить лучше умножением на 1.0.....


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение Sep 5 2005, 12:38
Сообщение #6


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

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Решил не возится с адресами переменных (умные люди придумали же указатели <_< ). Мне нужен связанный список. Взял пример из книги
Ю.Н. Патрикеева "Объектно-ориентированное программирование на Borland C++":

struct Value;
struct Tree_element
{ Value * val;
Tree_element *left, *right;
};

Ответ на это ИАРа:

Error[Pe020]: identifier "Value" is undefined
Error[Pe020]: identifier "Tree_element" is undefined

Неужели ИАР не поддерживает предварительное объявления структур?
Как по другому мне сделать список?
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение Sep 5 2005, 13:54
Сообщение #7


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

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Уже понял. Вот как надо:

struct Value;
struct Tree_element
{ struct Value * val;
struct Tree_element *left, *right;
};
Go to the top of the page
 
+Quote Post
ValeraVi
сообщение Sep 5 2005, 17:08
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-07-05
Из: Kyiv, Ukraine
Пользователь №: 7 211



я б написал примерно так:

struct Value_tag;
typedef struct Value_tag Value;
typedef struct Tree_element_tag Tree_element;
struct Tree_element_tag
{ Value * val;
Tree_element *left, *right;
};
struct Value_tag
{ int a;
int b;
//...
};

и дальше не пришлось бы к Value и Tree_element постоянно приписывать struct rolleyes.gif
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение Sep 7 2005, 12:37
Сообщение #9


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

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Большое спасибо всем ответившим.

У меня еще один вопрос, косвенно связан с предыдущим:

Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал:

char cChar;
char xChar[10];
void *pVoid;
pVoid=&cChar;
*pVoid=1;

Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue sad.gif

Как все-же нужно сделать и для чего предназначены указатели на void ?
Go to the top of the page
 
+Quote Post
BVU
сообщение Sep 7 2005, 12:51
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(jack_avenger @ Sep 7 2005, 16:37)
Большое спасибо всем ответившим.

У меня еще один вопрос, косвенно связан с предыдущим:

Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал:

  char cChar;
  char xChar[10];
  void *pVoid;
  pVoid=&cChar;
  *pVoid=1;

Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue  sad.gif

Как все-же нужно сделать и для чего предназначены указатели на void ?
*


Тип void применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо!


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
phantom
сообщение Sep 7 2005, 13:32
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 13-05-05
Пользователь №: 4 986



"Нужен указатель, который может ссылается раз на char, раз на масив char[]"
А это не одно и то же? В смысле если есть указатель на char, его можно использовать для ссылки как на cChar (pChar=&cСhar) так и на XChar (pChar=XChar, имя массива есть указатель на его первый элемент).
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Sep 7 2005, 14:19
Сообщение #12


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата(BVU @ Sep 7 2005, 15:51)
Цитата(jack_avenger @ Sep 7 2005, 16:37)
Большое спасибо всем ответившим.

У меня еще один вопрос, косвенно связан с предыдущим:

Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал:

  char cChar;
  char xChar[10];
  void *pVoid;
  pVoid=&cChar;
  *pVoid=1;

Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue  sad.gif

Как все-же нужно сделать и для чего предназначены указатели на void ?
*


Тип void применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо!
*




как это не приминимы, а указатель на void, очень даже распространены.
void * MyPTR; // указатель на viod
Go to the top of the page
 
+Quote Post
BVU
сообщение Sep 7 2005, 14:35
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



"void * MyPTR; // указатель на viod"

Так это когда Вы работаете с указателями на функцию... а уж если заводите переменную извольте указывать ее - явно, а не void, что для многих компиляторов не явно приводиться к типу int, что может в результате вызвать путаницу.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
ValeraVi
сообщение Sep 7 2005, 18:03
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-07-05
Из: Kyiv, Ukraine
Пользователь №: 7 211



1. void запросто можно использовать с указателями на массивы (и др.). А если точнее, то void* это указатель на "ничто" smile.gif поэтому тут уже нет разницы какой указатель (на строку, на функцию, на массив int и т.п.) вы приводите к типу void*

2.
2 jack_avenger
Чтоб ваш код откомпилился нужно написать так:
char cChar;
char xChar[10];
void *pVoid;
pVoid=&cChar;
*((char*)pVoid) = 1;
т.е., т.к void - это "ничто", то в этом "ничто" трудно выделить элемент, в который вы хотите затолкнуть 1, поэтому указатель на "ничто" нужно к чему-то привести (например к char), а потом уже в него записывать 1.
НО, как сказал phantom - между указателем на массив char (строкой) и просто char (частный случай массива char размером = 1 элемент) разницы нет (и в том и в другом случае указатель - указывает на char) поэтому проще написать так:
char cChar;
char xChar[10];
char *pVoid;
pVoid=&cChar;
pVoid=xChar; //т.к массив char'ов это есть указатель на 0-й char.
*pVoid = 1;
Go to the top of the page
 
+Quote Post
ObitJr
сообщение Sep 7 2005, 18:09
Сообщение #15


Участник
*

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



Цитата(BVU @ Sep 7 2005, 16:35)
"void * MyPTR; // указатель на viod"

Так это когда Вы работаете с указателями на функцию... а уж если заводите переменную извольте указывать ее - явно, а не void, что для многих компиляторов не явно приводиться к типу int, что может в результате вызвать путаницу.
*


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

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

 


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


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