Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ + PASCAL + absolute, это и для паскалянтов... 
:(
    Опции темы
☼GriKo☼
  Дата 28.7.2003, 22:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











... Даров... В общем такая трабла... Если я понял, то "absolute" в паскале, это выделение места в стеке под переменную(или массив). Вопрос в том, как заставить зависЕть массив также в С++?

пример:

ПАСКАЛЬ:

Код
var ul[0..10]: array of byte;
     u[0..1]:array of longint absolute ul;

С++:

Код
unsigned char ul[11];
/* confused.gif */

  Вверх
acp
Дата 29.7.2003, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Цитата
Если я понял, то "absolute" в паскале, это выделение места в стеке под переменную(или массив)


Это не так. Ключевое слово absolute, применительно к переменной, означает, что переменная будет "располагаться" в памяти по тому адресу, который указан после этого ключевого слова. Т.е. обращаясь к переменной, вы будете обращаться к той памяти, адрес которой вы указали.

PS: да, забыл насчёт С. Наверное нужно брать адрес. И к нему обращаться smile.gif


Это сообщение отредактировал(а) acp - 29.7.2003, 00:56
PM WWW ICQ   Вверх
TaTaP
Дата 29.7.2003, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 15.10.2002

Репутация: 1
Всего: 1



Для того, чтобы объект находился по данному адресу (который наперед известен) нужно делать так

void *ptr = NULL;
/* инициализируем ptr */
A *a = new(ptr) A;

И как обычно, не забываем за собой убирать...
PM MAIL   Вверх
RAN
Дата 29.7.2003, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
A *a = new(ptr) A;

А каким компилятором это поддерживается? Насколько я знаю в VC 6 это вообще нет, а в Builder 6 это форма зарезервирована, её можно перегрузить, но Run-Time Library это не поддерживает и будет выдаваться, что-то типа: "Не найдено new(unsigned size, void* prt)".

Цитата
И как обычно, не забываем за собой убирать...

Зачем же убирать. Если ты имеешь ввиду delete а;, то это вызовет ошибку, объект то не в куче расположен.
PM MAIL ICQ   Вверх
maxim1000
Дата 29.7.2003, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
var ul[0..10]: array of byte;
u[0..1]:array of longint absolute ul;

мне кажется, что в такой постановке задачи больше подойдет union


--------------------
qqq
PM WWW   Вверх
RAN
Дата 29.7.2003, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Для такой задачи лучше всего объединения использовать:
Код

union {
   byte ul[11];
   long u[2];
} u;

PM MAIL ICQ   Вверх
☼GriKo☼
Дата 29.7.2003, 12:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, люди.. Помогло.
  Вверх
☼GriKo☼
Дата 29.7.2003, 17:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Продолжение темы.. Первый массив - на 10 переменных, второй - на 2.
Как второй на 2 может быть "absolute u" если тот ю на 10? По каким адресам всё дело происходит?
  Вверх
DarkDS
Дата 29.7.2003, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: нет
Всего: 16



Оффтоп... У меня что то эта тема никакими средствами не хочет прочитанной становится sad.gif

ЗЫ. Пока сообщение от ☼GriKo☼ было последним... После написания данного сообщения все стало на свои места...

Это сообщение отредактировал(а) DarkDS - 29.7.2003, 15:01
PM MAIL   Вверх
RAN
Дата 29.7.2003, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



☼GriKo☼, (ну и nick)
Код
union {
  byte ul[11];
  long u[2];
} u;


Если считать, что long - 4 байта, а byte - 1 байт, то

Размер объединения, выбирается по наибольшему члену, то есть 11 байт

u.u[0] займёт байты с 0 по 3, а u.u[1] - с 4 по 7

Вообще, я тоже сразу обратил внимание на странные размерности, может ты где-то ошибся?
Кстати, размерность C не проверяет и тебе никто не мешает писать u.u[2] и u.ul[11].

Это сообщение отредактировал(а) RAN - 29.7.2003, 17:36
PM MAIL ICQ   Вверх
GriKo
Дата 29.7.2003, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 7.6.2003
Где: Израиль

Репутация: нет
Всего: нет



Никк обыкновенный =), только UNIONCODE форум не поддерживает. Так я надеюсь будет легче и глючить не у кого не должно...

С размерностями быть проблем не должно... насколько я помню.

Я думаю, и было-бы для меня лучше, сделать это без union'а. Как нибудь через взятия адреса. Т.е.
Код
var ul[0..10]: array of byte;
u[0..1]:array of longint absolute ul;
.{tut tipa code}
for x:=0 to 10 do
writeln('ul[',i,'] - ',u[i]);
writeln('u[0] - ',u[0],' u[1] - ',u[1]);


Вылазит на это что-то типа:

ul[0] - 4
.
.
ul[10] - 0
u[0] - 524292, u[1] - 723204

децимально естественно...
Вот похожее мне и нужно...
PM MAIL ICQ   Вверх
GriKo
Дата 29.7.2003, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 7.6.2003
Где: Израиль

Репутация: нет
Всего: нет



Люди, пол пути пройдено не много осталось. ПОМОГИТЕ
PM MAIL ICQ   Вверх
RAN
Дата 29.7.2003, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Через union (настоятельно рекомендую)
Код

union {
   unsigned char ul[11];
   long int u[2];
   } u;
for(register int i = 0; i < 11; i++)
   cout << "ul[" << i << "] - " << (int)u.ul[i] << endl;
cout << "u[0] - " << u.u[0] << " u[1] - " << u.u[1] << endl;


Ну, вот тебе и без union
Код

unsigned char ul[11];
long int *u = (long int*)ul;
for(register int i = 0; i < 11; i++)
   cout << "ul[" << i << "] - " << (int)ul[i] << endl;
cout << "u[0] - " << u[0] << " u[1] - " << u[1] << endl;


Это сообщение отредактировал(а) RAN - 29.7.2003, 23:54
PM MAIL ICQ   Вверх
GriKo
Дата 30.7.2003, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 7.6.2003
Где: Израиль

Репутация: нет
Всего: нет



Всё. Огромное спасибо. Тему можно закрывать. RAN - BIG tnx!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.