문제

C 루틴

MPI_Comm_rank(MPI_Comm comm, int *rank);

녹 외국인 기능을 인터페이스이 될 수 있는 다음과 같이 선언 this:

extern crate libc;
use libc::{c_int};

#[link(name = "mpi")]
extern {
    fn MPI_Comm_rank(mpi_comm: c_int,
                     rank: *mut c_int);
}

내가 바인딩은 다음과 같이 작동하는지만,나에게 왼쪽에 대해 의아해 syntax:

pub static MPI_COMM_WORLD : libc::c_int = 0x44000000;
fn main() {

    let mut rank: c_int = 999999;
    /* but why '&mut rank' and not simply '&rank' ? */
    unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &mut rank)}
}       

내가 원래도

unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &rank)}

하지만 이렇게 컴파일러에 오류가:

mismatched types: expected `*mut i32` but found `&i32` (values differ in mutability)

나는 선언'순위'로 mut,그래서 무엇이 있나요?

도움이 되었습니까?

해결책

당신이 conflating 두 개의 완전히 고유한 기능입니다.

let mut x; 게 변경할 수 바인딩 x, 수정할 수 있도록 무엇 x 에 바인딩(x = 42 다)및 비 reference 유형이 그 내용을 수정할 수(x.y = 42).지 않을 제어하는 가변성의 대상 의 참조가 있습니다.

이것은 다른 유형의 참조를 다루고 있습니다.

  • &mut T 은 변경 가능한 참조할 수 있도록 강요하는 *mut T.

  • &T 은 변경할 수 없는 참조할 수 있도록 강요하는 *const T.

로는 함수를 호출을 원 *mut T, 로 전달해야 합니다 그것은 *mut T&mut T; *const T&T 하지 않습니다.

확실히,당신이 취할 수 변경 가능한 참조하여 변경 가능한 데이터를,그래서 let x = 42; &mut x 적으로 작동하지 않을 필요 let mut xlet x, 지만,그는 아직 완전히 고유의 일부 녹 규정에 대한 가변성.

다른 팁

귀하의 기능을 기대 *mut c_int 포인(변경 가능한 원 포인터),그리고 당신이 사용할 필요가 &mut 연산자를 얻습니다.그러나,당신은 당신이 걸릴 수 있습니다 &mut 포인터 mut 변수에 따라서 필요하신 선언 rank 변수 mut rank.

는 경우에 당신의 기능 예상 *const c_int 포인터,당신은 당신을 사용할 수있을 것입 &, 지만,이 경우되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top