LINUX.ORG.RU

приведение нативных указателей в rust

 ,


1

3
/home/sh/rust/windowmanager/src/x11/mod.rs:146:19: 146:43 error: mismatched types:
 expected `*mut libc::types::common::c95::c_void`,
    found `*mut libc::types::common::c95::c_void`
(expected enum `libc::types::common::c95::c_void`,
    found a different enum `libc::types::common::c95::c_void`) [E0308]
/home/sh/rust/windowmanager/src/x11/mod.rs:146             XFree(self.data as *mut c_void);

не очень понятно, чем его не устраивает c_void вместо другого c_void

как это вообще можно интерпретировать?

★★★★★

кусок кода, приводящий к ошибке:

 58 pub struct WindowProperty {
...
 61     data: *mut c_uchar,
 62 }
...
142 impl Drop for WindowProperty {
143     fn drop(&mut self) {
144         println!("WindowProperty XFree");
145         unsafe {
146             XFree(self.data as *mut c_void);
147         }
148     }
149 }

спецификация XFree:

 pub fn XFree(arg0: *mut c_void) -> c_int;

MyTrooName ★★★★★
() автор топика
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от tailgunner

о, сработало! спасибо.

я бы прочитал сперва man по FFI, но поскольку это моя первая попытка написать что-то на rust, я ниче там не понял)

MyTrooName ★★★★★
() автор топика

Я на чего-то похожее нарывался как-то. Уже не помню точно, в чем именно была причина :( . Проверь, что у тебя не используются разные версии библиотеки libc.

ozkriff
()
Ответ на: комментарий от MyTrooName

Я думаю, это тупо ошибка в компиляторе. as - проверяемое преобразование, наверное, в сообщении просто перепутаны целевой и исходный типы.

tailgunner ★★★★★
()
Ответ на: комментарий от ozkriff

Проверь, что у тебя не используются разные версии библиотеки libc

такое вообще возможно? оно же каргой собирается, там можно подключить две версии одного крейта?

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

такое вообще возможно? оно же каргой собирается, там можно подключить две версии одного крейта?

Да, конечно. Хотя бы если какая-то из зависимостей твоего проекта зависит от старого libc, а у твоего проекта в cargo.toml прописана более новая libc.

ozkriff
()
Ответ на: комментарий от tailgunner

Но в определении структуры же c_uchar. Может, тебе нужен transmute?

Я так понимаю, что transmute тут поможет, но это костыль и лечение симптомов. Надо с версиями библиотек разобраться.

ozkriff
()
Ответ на: комментарий от MyTrooName

в Cargo.lock версии libc одинаковые, как и ссылка на репу. где-то еще нужно посмотреть?

Хм, так телепатически не скажу, к сожалению. Если дашь ссылку на репу с проектом, то могу попробовать посмотреть.

ozkriff
()
Ответ на: комментарий от ozkriff

Я так понимаю, что transmute тут поможет, но это костыль и лечение симптомов

А я думаю, что здесь нужно именно transmute.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

вот это компилится:

  1 #![feature(libc)]
  2 
  3 use libc::{c_void, c_uchar};
  4 extern crate libc;
  5 
  6 fn main() {
  7     let a : *mut c_uchar = &mut 1;
  8     let b : *mut c_void = a as *mut c_void;
  9 }
MyTrooName ★★★★★
() автор топика
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от MyTrooName

Если дописать в Cargo.toml

[dependencies]
libc = "*"

то работает без transmute.

Так это как минимум исправлено было в gl-rs и еще в паре библиотек. Вроде как, тут версия из карго конфликтует с версией идущей с компилятором.

ozkriff
()
Последнее исправление: ozkriff (всего исправлений: 1)
Ответ на: комментарий от tailgunner

А я думаю, что здесь нужно именно transmute.

Почему?

ozkriff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.