Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите ламеру с IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
jack_avenger
Не пинайте за глупый вопрос я перехожу с CodeVision на IAR и ничего не понимаю.
Юзаю IAR 4.11A
Надо получить старшую часть адреса переменной в RAM.
Пробую что-то типа

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

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

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


Значит преобразование от int к char за меня сделает компилятор?
INT1
не работал с Кодевижн, но может быть связано с
"..ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel — пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah."
к примеру, тут:
http://www.chipnews.com.ua/html.cgi/arhiv/00_10/15.htm
aal
>Значит преобразование от int к char за меня сделает компилятор?
При пересылке инта в чар - вчаре окажется младший байт инта.
Приведением типа не увлекайся, можешь на глюки нарватся. Если надо что-то посчитать точно, через темповую переменную работай - код тотже - глюков меньше. А в реал переводить лучше умножением на 1.0.....
jack_avenger
Решил не возится с адресами переменных (умные люди придумали же указатели <_< ). Мне нужен связанный список. Взял пример из книги
Ю.Н. Патрикеева "Объектно-ориентированное программирование на 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

Неужели ИАР не поддерживает предварительное объявления структур?
Как по другому мне сделать список?
jack_avenger
Уже понял. Вот как надо:

struct Value;
struct Tree_element
{ struct Value * val;
struct Tree_element *left, *right;
};
ValeraVi
я б написал примерно так:

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
jack_avenger
Большое спасибо всем ответившим.

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

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

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

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

Как все-же нужно сделать и для чего предназначены указатели на void ?
BVU
Цитата(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 применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо!
phantom
"Нужен указатель, который может ссылается раз на char, раз на масив char[]"
А это не одно и то же? В смысле если есть указатель на char, его можно использовать для ссылки как на cChar (pChar=&cСhar) так и на XChar (pChar=XChar, имя массива есть указатель на его первый элемент).
MALLOY2
Цитата(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
BVU
"void * MyPTR; // указатель на viod"

Так это когда Вы работаете с указателями на функцию... а уж если заводите переменную извольте указывать ее - явно, а не void, что для многих компиляторов не явно приводиться к типу int, что может в результате вызвать путаницу.
ValeraVi
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;
ObitJr
Цитата(BVU @ Sep 7 2005, 16:35)
"void * MyPTR; // указатель на viod"

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


void* - это просто указатель, а к инту приводится (иногда) только потому, что имеет одинаковый рамер, зависящий от архитектуры. И используется достаточно часто (для переменных), например как уеазатель на данные в хранилищах + приводится как угодно.
Petka
Цитата(aal @ Sep 3 2005, 15:00)
А в реал переводить лучше умножением на 1.0.....
*

Имхо лучше переводить сложением с 0.0. Так, на всякий случай, вдруг компилятор код сгенерит, а сложение таки быстрее =)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.