powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель в int и обратно. Возможно ?
21 сообщений из 21, страница 1 из 1
Указатель в int и обратно. Возможно ?
    #39109685
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моя программа на c++ взаимодействует с Lua-скриптом. Lua-скрипт ничего не знает о классах и объектах c++. Нужно передать этому скрипту указатель на экземпляр какого-либо класса. Затем этот скрипт после своих действий должен обратно в c++ передать этот указатель и далее в c++ нужно дальше работать с этим объектом.
Т.к. Lua не может работать с объектами C++, но может принимать и передавать числа, то хочу передать этот указатель в виде числа, а затем это число снова преобразовать в указатель на экземпляр класса.

Не вдаваясь в детали Lua, хочу уточнить. Не смотря на то, что нижеследующий код прекрасно работает, верен ли в принципе такой код ? Есть ли в нём какие-то "подводные камни" ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class A
{
public:
	string s;
};
...

A *a = new A();
a->s = "qwe";
cout << a->s << endl;
// переводим указатель в int
int i = (int)a;
// этот int передаём в Lua, затем Lua-скрипт где-то в коде вновь возвращает нам в c++ это число, которое мы преобразуем обратно к классу A

A *b = (A*)i;
cout << b->s << endl;



На последней строке ругается что "не существует подходящего конструктора для преобразования из "int" в "A" "
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109686
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправка. Ничего нигде не ругается. Забыл удалить последнюю строку
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109687
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zxc15верен ли в принципе такой код ?
Неверен. Указатель можно преобразовывать в intprt_t, но не в int: у последнего может не
хватить разрядности.
Надёжнее будет заводить массив указателей и передавать в Lua индекс нужного указателя в
этом массиве.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109688
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovzxc15верен ли в принципе такой код ?
Неверен. Указатель можно преобразовывать в intprt_t, но не в int: у последнего может не
хватить разрядности.
Надёжнее будет заводить массив указателей и передавать в Lua индекс нужного указателя в
этом массиве.

В Lua тип number вообще соответствует double на с++. Разрядности хоть отбавляй. Може привести и к int64. Всё равно не правильно ?

P.S. Идею про массив понял.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109689
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя да, можно в intprt_t, сразу не сообразил
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109692
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zxc15В Lua тип number вообще соответствует double на с++. Разрядности хоть
отбавляй.
Всего лишь 64 разряда или 15 значащих цифр. Верные грабли.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109699
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНадёжнее будет заводить массив указателей и передавать в Lua индекс нужного указателя в
этом массиве.
Надежнее только в том смысле, что можно проверить валидность указателя по таблице. Но для этого есть другие способы. И нужна ли эта проверка?

И еще у меня есть подозрение, что преобразование (int)a приводит к потере разрядности. На 64bit указатель это long long. Компилятор обычно не предупреждает о неадекватном кастинге в стиле C.

Если скрипту нужен именно int, то передача индекса коллекции указателей это выход.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109758
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zxc15,

этот код неверен. точнее он содержит UB, как раз в части перевода указателя в целое.
код даже может работать на конкретном компиляторе и конкретной платформе но что указатель влезет в int гарантии нет.
в новых стандартах вроде бы есть тип данных, в который гарантированно влезает указатель.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109764
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovУказатель можно преобразовывать в intprt_t, но не в int: у последнего может не
хватить разрядности.

Хм. А мне Visual Studio показывает, что:
Код: plaintext
1.
typedef int intptr_t
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109766
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zxc15мне Visual Studio показывает
Потому что ты собираешь под 32-х разрядную платформу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109788
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если использовать массив для хранения в нём указателей, то не лучше ли вместо intprt_t использовать тип LPVOID ?
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109808
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zxc15Моя программа на c++ взаимодействует с Lua-скриптом. Lua-скрипт ничего не знает о классах и объектах c++. Нужно передать этому скрипту указатель на экземпляр какого-либо класса. Затем этот скрипт после своих действий должен обратно в c++ передать этот указатель и далее в c++ нужно дальше работать с этим объектом.
Т.к. Lua не может работать с объектами C++, но может принимать и передавать числа, то хочу передать этот указатель в виде числа, а затем это число снова преобразовать в указатель на экземпляр класса.

Не вдаваясь в детали Lua, хочу уточнить. Не смотря на то, что нижеследующий код прекрасно работает, верен ли в принципе такой код ? Есть ли в нём какие-то "подводные камни" ?

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

С твоим уровнем понимания - забудь про такой подход. Передавай простые данные (например структуры) и конструируй внутри каждого языка классы из этих данных.

Для начала просветления читай про ABI https://en.wikipedia.org/wiki/Application_binary_interface
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109833
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зимарглzxc15Моя программа на c++ взаимодействует с Lua-скриптом. Lua-скрипт ничего не знает о классах и объектах c++. Нужно передать этому скрипту указатель на экземпляр какого-либо класса. Затем этот скрипт после своих действий должен обратно в c++ передать этот указатель и далее в c++ нужно дальше работать с этим объектом.
Т.к. Lua не может работать с объектами C++, но может принимать и передавать числа, то хочу передать этот указатель в виде числа, а затем это число снова преобразовать в указатель на экземпляр класса.

Не вдаваясь в детали Lua, хочу уточнить. Не смотря на то, что нижеследующий код прекрасно работает, верен ли в принципе такой код ? Есть ли в нём какие-то "подводные камни" ?

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

С твоим уровнем понимания - забудь про такой подход. Передавай простые данные (например структуры) и конструируй внутри каждого языка классы из этих данных.

Для начала просветления читай про ABI https://en.wikipedia.org/wiki/Application_binary_interface

Ну хорошо. Давай-ка ты теперь "со своим уровнем понимания" и просветлением, расскажи, как в Lua передать класс с Memory Mapped File и Pipe Channel, и который бы само собой учитывал бы все критические секции, мьютексы, евенты и прочую синхронизацию потоков, а ещё и взаимодействие с другими классами. Которые тоже конструировать надо в Lua?
Далее ты расскажи как в Lua сконструировать класс или структуру из таких данных и записать в MMF или в Pipe данные.

Чтобы повысить свой уровень понимания про Lua, вот тебе для начала просветления читай: https://ru.wikipedia.org/wiki/Lua

Не проще ли просто пробросить объект через Lua, пусть даже через массив указателей ? Тем более, что перед тобой только что, умные люди уже ответили и дали решение.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109834
zxc15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне не нужно в Lua работать со сложными объектами, мне нужно этот объект получить обратно, точнее указатель на него.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут об чём вообще речь идёт? Автор Lua "не читал" но осуждает!

Почему "указатель" и "Lua" пишутся через запятую? При чем тут указатель?

Сильно сомневаюсь что Lua умеет работать с memory напрямую и
возможно из афтоского кода придётся выкосить все упоминания
об указателях и оставить только жёстко определённые атомарные
типы и реализовать сериализацию/маршалинг для сложных
в том формате в котором эта Луа умеет понимать.

Вобщем курить и еще раз курить доки как завещал Ленин в разрезе
взаимодействия Lua и других ЯП.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109869
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zxc15,

За "расскажи и сделай" я беру прилично денег.

Удачи тебе в хождении по граблям.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39109909
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zxc15Если использовать массив для хранения в нём указателей, то не лучше ли вместо intprt_t использовать тип LPVOID ? зачем? размер массива ограничен. если массив не больше 256 ты для индексов даже unsigned char можешь использовать он то точно в int влезет.

Код: plaintext
1.
void *map[256];
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39110019
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zxc15Зимарглпропущено...

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

С твоим уровнем понимания - забудь про такой подход. Передавай простые данные (например структуры) и конструируй внутри каждого языка классы из этих данных.

Для начала просветления читай про ABI https://en.wikipedia.org/wiki/Application_binary_interface

Ну хорошо. Давай-ка ты теперь "со своим уровнем понимания" и просветлением, расскажи, как в Lua передать класс с Memory Mapped File и Pipe Channel, и который бы само собой учитывал бы все критические секции, мьютексы, евенты и прочую синхронизацию потоков, а ещё и взаимодействие с другими классами. Которые тоже конструировать надо в Lua?
Далее ты расскажи как в Lua сконструировать класс или структуру из таких данных и записать в MMF или в Pipe данные.

Чтобы повысить свой уровень понимания про Lua, вот тебе для начала просветления читай: https://ru.wikipedia.org/wiki/Lua

Не проще ли просто пробросить объект через Lua, пусть даже через массив указателей ? Тем более, что перед тобой только что, умные люди уже ответили и дали решение.


тут всё и сложно, и просто.
Можно передавать указатели и париться с кроссплатформенностью С и Lia, и искать, где они не совпадают, а можно делать как в операционных системах внутренние таблицы объектов с идентификаторами, и отдавать идентификаторы а не указатели.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39110536
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovУказатель можно преобразовывать в intprt_t


Подскажите пожалуйста где это указано
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39110552
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDimitry SibiryakovУказатель можно преобразовывать в intprt_t


Подскажите пожалуйста где это указаноВ коде.
Если intptr_t это typedef для указателя, то даже и преобразовывать не надо.
Если intptr_t это typedef для целого числа размером в указатель - то и проблем с преобразованием нет, потому что указатель это сам по себе целое число.
...
Рейтинг: 0 / 0
Указатель в int и обратно. Возможно ?
    #39110561
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryпропущено...


Подскажите пожалуйста где это указаноВ коде.
Если intptr_t это typedef для указателя, то даже и преобразовывать не надо.
Если intptr_t это typedef для целого числа размером в указатель - то и проблем с преобразованием нет, потому что указатель это сам по себе целое число.


А можно ли ссылаться на следующее ?


Working Draft, Standard for Programming Language C++. 3.7.4.3 Safely-derived pointers1 A traceable pointer object is
— an object of pointer-to-object type, or
— an object of an integral type that is at least as large as std::intptr_t, or
— a sequence of elements in an array of character type, where the size and alignment of the sequence
match that of some pointer-to-object type.
2 A pointer value is a safely-derived pointer to a dynamic object only if it has pointer-to-object type and it is
one of the following:
— the value returned by a call to the C++ standard library implementation of ::operator new(std::size_-
t);37
— the result of taking the address of an object (or one of its subobjects) designated by an lvalue resulting
from dereferencing a safely-derived pointer value;
— the result of well-defined pointer arithmetic (5.7) using a safely-derived pointer value;
— the result of a well-defined pointer conversion (4.10, 5.4) of a safely-derived pointer value;
— the result of a reinterpret_cast of a safely-derived pointer value;
— the result of a reinterpret_cast of an integer representation of a safely-derived pointer value;
— the value of an object whose value was copied from a traceable pointer object, where at the time of
the copy the source object contained a copy of a safely-derived pointer value.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель в int и обратно. Возможно ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]