Alex
Подскажите как создать C строку (*const char) которая static
Alex
потому что если она динамическая то она уходит на пределы видимости
Alex
Alex
точнее дропается сразу после функции
𝙰𝚗𝚊𝚝𝚘𝚕𝚢
Alex
как передать допустим строку через FFI указателем чтобы сама строка не дропнулась растом после выхода из моей функции?
Filipp
https://doc.rust-lang.org/std/mem/fn.forget.html есть такая штука, но помоему был какой-то метод который одновременно делал сырой поинтер и выключал дроп у объекта
պլհկ
Ура, мемори лики!
Vladimir
Да нету универсального решения работы с ffi, нужно смотреть что внутрях. Если функция требует владения, то ты конечно можешь забыть о предыдущем владельце, но далеко не факт что функция сможет её почистить потом
Anonymous
Alex
Ура, мемори лики!
я уже настолько задолбался пропихивать C структуру, что мне даже мемори лики подойдут
Alex
я все равно должен ownership отдать серверу
Vladimir
Покажи код/псевдокод
Alex
вот только через указатель это геморой
Anonymous
https://doc.rust-lang.org/std/ffi/struct.CStr.html
Anonymous
там такое https://play.rust-lang.org/?code=fn%20main()%20%7B%0Ause%20std%3A%3Affi%3A%3ACStr%3B%0Ause%20std%3A%3Aos%3A%3Araw%3A%3Ac_char%3B%0A%0Aextern%20%7B%20fn%20my_string()%20-%3E%20*const%20c_char%3B%20%7D%0A%0Afn%20my_string_safe()%20-%3E%20String%20%7B%0A%20%20%20%20unsafe%20%7B%0A%20%20%20%20%20%20%20%20CStr%3A%3Afrom_ptr(my_string()).to_string_lossy().into_owned()%0A%20%20%20%20%7D%0A%7D%0A%0Aprintln!(%22string%3A%20%7B%7D%22%2C%20my_string_safe())%3B%0A%7D
Alex
какого хрена в телеграме картинки не грузит
iDeBugger
Грузит
Vladimir
Грузит
Vladimir
Alex
черт, почему то даже на Imgur картинки не грузит
Anonymous
https://stackoverflow.com/questions/24145823/rust-ffi-c-string-handling
Alex
и так всегда, пытаешься что то решить и тебе МЕШАЕТ РЕШИТЕЛЬНО ВСЕ решить задачу
Alex
https://stackoverflow.com/questions/24145823/rust-ffi-c-string-handling
у меня структура и я задолбался ее пропихивать
Vladimir
у меня структура и я задолбался ее пропихивать
Что хоть за либа которой ffi нужен
Alex
Что хоть за либа которой ffi нужен
я пытаюсь картинку загрузить!!
Alex
там не совсем ffi, пишу обычную либу под C (C++?) приложение
պլհկ
Закинь текст на пастбин
Alex
https://gist.github.com/Fedcomp/fdc59a1db9a3bb9181ae0e49b463a82a
Alex
Я уже весь вечер сижу, ночью посидел, ща сижу. Не понимаю чего ему не нравится и где оно не работает.
Alex
Сейчас либа которая принимает мою структуру пишет абракадабру (видимо указатель читает грязную память)
Alex
а не, теперь просто сегфолт, до этого читало абракадабру
Alex
https://gist.github.com/Fedcomp/fdc59a1db9a3bb9181ae0e49b463a82a#file-meta_api-cpp-L41 Конкретно вот эту функцию пытаюсь переписать на раст код: https://gist.github.com/Fedcomp/fdc59a1db9a3bb9181ae0e49b463a82a#file-lib-rs-L49
Alex
причем cpp версия работает просто замечательно.
պլհկ
gdb открываешь@и начинаешь
պլհկ
Че как неродной
Vladimir
x)
պլհկ
У тебя стринг дропается сразу после объявления, вангую
պլհկ
Почему через статик не сделал?
Alex
Почему через статик не сделал?
я изначально через него сделал
Alex
ругается что в статике нельзя вызывать функции
Alex
а .as_ptr() это функция
պլհկ
Хм
Alex
я изначально пытался через статик протащить, весь вечер сидел но там ад.
պլհկ
Я вечером посмотрю, если не решишь
Alex
окей спасибо.
պլհկ
Сейчас не за компом прост
Alex
Ща попробую через mem::forget строки прогнать
պլհկ
По идеет статик и as *const u8 as *const c_char должен вкатить
Vladimir
попробуй сишной магии static IFVER:&'static [u8] = b"5:13\0"; fn main() { let x = &IFVER[0] as * const u8; }
Sherzod
Пишем плагин для контрстрайка?
Alex
ребят извините если что, я просто уже столько времени сижу с этой проблемой и психую тут.
Sherzod
https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_ptr
Alex
ахахахахах
Sergey
🔥🔥
Alex
ребят, а вот такая конструкция: *pinfo = &plugin_info; Она идентична в C и Rust?
Vladimir
+\-
Vladimir
если забыть про deref coercion в расте
Alex
Просто с таким вариантом в библиотеку приходит пустое значение: https://gist.github.com/Fedcomp/fdc59a1db9a3bb9181ae0e49b463a82a#file-lib-rs-L74
Alex
сегфолтов нет, но и нужная строка не передалась.
Sergey
как можно уничтожить говнокодера?
Sergey
это ты к чему?
да тут тип нагородил ебанутонну великов, я уже раз 50 провел ревью одного и того же ПР
Vladimir
@Fedcomp попробуй для начала static IFVER:&'static [u8] = b"5:13\0"; fn main() { let x = IFVER.as_ptr(); }
Vladimir
ну сделай в конце as * const c_char
Vladimir
или как там
Vladimir
@Fedcomp хотя все равно нулей не должно быть. Если есть иходники либо, или гдб
Vladimir
посмотри что за указатели там передаются
Alex
пытался так протолкнуть сильно не вникая, не получается :(
պլհկ
Придется вникать
Alex
пробуя писать на расте я надеялся именно на то что C++/C я больше не увижу )
Vladimir
ну запускаешь gdb ставишь бряк, смотришь содержимое, особо ума не надо gdb program b source:line run p variable
Sherzod
Но раст системный язык, ты вынужден уже из-за того, что тупо многие сишные программы будут портироваться на раст
Sherzod
в pdb, наверное, прописано
Vladimir
Ну да, он смотрит в дебаг символы на имена файлов, а путь там можно задать вроде переменными окружения gdb https://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html