Перейти к содержанию
    

Помогите ламеру с IAR

Не пинайте за глупый вопрос я перехожу с CodeVision на IAR и ничего не понимаю.

Юзаю IAR 4.11A

Надо получить старшую часть адреса переменной в RAM.

Пробую что-то типа

 

int Variable=1;

char AddrH=(char)((&Variable)>>8);

не катит (матерится компилятор). А если написать так:

int Variable=1;

char AddrH=(char)(&Variable);

то все гуд, но понятно что получаю младшую часть.

 

Как надо правильно писать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать.

Спасибо, static действительно помог =))

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

 

Значит преобразование от int к char за меня сделает компилятор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не работал с Кодевижн, но может быть связано с

"..ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel — пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah."

к примеру, тут:

http://www.chipnews.com.ua/html.cgi/arhiv/00_10/15.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>Значит преобразование от int к char за меня сделает компилятор?

При пересылке инта в чар - вчаре окажется младший байт инта.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решил не возится с адресами переменных (умные люди придумали же указатели <_< ). Мне нужен связанный список. Взял пример из книги

Ю.Н. Патрикеева "Объектно-ориентированное программирование на 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

 

Неужели ИАР не поддерживает предварительное объявления структур?

Как по другому мне сделать список?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

struct Value;

struct Tree_element

{ struct Value * val;

struct Tree_element *left, *right;

};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

char cChar;

char xChar[10];

void *pVoid;

pVoid=&cChar;

*pVoid=1;

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

  char cChar;

  char xChar[10];

  void *pVoid;

  pVoid=&cChar;

  *pVoid=1;

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А это не одно и то же? В смысле если есть указатель на char, его можно использовать для ссылки как на cChar (pChar=&cСhar) так и на XChar (pChar=XChar, имя массива есть указатель на его первый элемент).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

  char cChar;

  char xChar[10];

  void *pVoid;

  pVoid=&cChar;

  *pVoid=1;

 

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

 

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

 

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

 

 

как это не приминимы, а указатель на void, очень даже распространены.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. void запросто можно использовать с указателями на массивы (и др.). А если точнее, то void* это указатель на "ничто" :) поэтому тут уже нет разницы какой указатель (на строку, на функцию, на массив 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...