Передать в функцию указатель, а получить указатель на массив

Кто любит RISC в жизни, заходим, не стесняемся.
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3645966#p3645966"]Мне не понравился вариант с упаковкой указателей в long.[/uquote]
А где вы такое видели? И как это возможно??? :shock:
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение ARV »

jcxz писал(а):А где вы такое видели? И как это возможно???
да вот некто с ником jcxz недавно в теме написал: [uquote="jcxz",url="/forum/viewtopic.php?p=3645051#p3645051"]Да очень просто:

Код: Выделить всё

u64 func()
{
  void *ptr1, *ptr2;
  ...
  return (u32)ptr1 | (u64)(u32)ptr2 << 32;
}
вызов:
u64 q = func();
void *ptr_1 = (void *)(u32)q;
void *ptr_2 = (void *)(u32)(q >> 32);
[/uquote]
я могу ошибаться, но u64 для платформы ARM эквивалентно long (в 2 раза шире int). разве нет?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение ПростоНуб »

ARV, ошибаетесь. long всегда 32 бита. 64 бита - long long или long long int.
Ну, по крайней мере, в стандарте C.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3646339#p3646339"]u64 для платформы ARM эквивалентно long (в 2 раза шире int). разве нет?[/uquote]
Это правда только наполовину. Long действительно в 2 раза шире int, но минимальный размер int - 16 бит. Стандарт определяет именно минимум, для long он 32 бита, на том же x64 линуксе long уже 64 бита. Естественно это уже нужен и 64-х битный ARM...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение ARV »

ПростоНуб писал(а):long всегда 32 бита
я не уверен, что вы правы. во всяком случае в стандарте написано "long содержит минимум 32 бита".

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

Мой уютный бложик... заходите!
Реклама
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3646339#p3646339"]я могу ошибаться, но u64 для платформы ARM эквивалентно long (в 2 раза шире int). разве нет?[/uquote]
Нет. typedef unsigned long long u64;
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение ПростоНуб »

ARV, специально полез в стандарт. Да я не прав. Там есть рекомендация, но нет жёсткого ограничения. У MS long всегда 32 бита. На Linux может быть и 32, и 64, в зависимости от платформы. В любом случае, упаковка одного целого в другой, а тем более указателя, должна сопровождаться проверками sizeof, или можно нарваться на неприятности. И уж точно я согласен с тем, что такой упаковки следует избегать. Пользуйтесь union, если приспичило.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передать в функцию указатель, а получить указатель на ма

Сообщение ARV »

ПростоНуб писал(а):И уж точно я согласен с тем, что такой упаковки следует избегать.
ну хоть раз с моими возражениями согласился человек, считающий себя профессионалом :)
просто бальзам на душу. спасибо.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «ARM»