2012-11-03 22 views
8

Jak utworzyć pustą zmienną tablicę dwuwymiarową w Rust?Tworzenie dwuwymiarowych macierzy w Rust

To co próbowałem dotąd:

let mut state[[u8 * 4] * 4]; 

To daje błąd

error: expected one of `:`, `;`, `=`, or `@`, found `[` 
--> src/main.rs:2:18 
    | 
2 |  let mut state[[u8 * 4] * 4]; 
    |    ^expected one of `:`, `;`, `=`, or `@` here 

Odpowiedz

4

redakcji: Odpowiedź ta poprzedza Rust 1.0 i niektóre z pojęć i składni zmieniły . Inne odpowiedzi dotyczą Rust 1.0.

Czy chcesz zmienić zawartość tablicy lub zmienną, która ją zawiera? Jeśli chcesz zmieniać zawartość, czy to działa dla Ciebie?

let state = [mut [mut 0u8, ..4], ..4]; 

Jeśli chcesz zmienna być zmienny, ale nie treści, spróbuj tego:

let mut state = [[0u8, ..4], ..4]; 

Czy to pomoże? Właściwie to nie skompilowałem, więc składnia może być lekko wyłączona.

+0

Tak. To działa. Czy wiesz, jak przekazać taką tablicę do funkcji? Funkcja musi zmienić wartości tablicy. Dzięki. –

+2

Możesz przekazać wartość na dwa sposoby. Jedną opcją może być '& mut [[u8 * 4] * 4] --- --- wskaźnik do dwuwymiarowej tablicy o stałej długości. Po prostu wykonasz '& mut state', aby uzyskać taki wskaźnik. –

+2

Och, i normalnie mając zmienną zmienną podobną do tej, umożliwiłaby również mutację elementów tablicy o stałej długości, ponieważ są one własnością zmiennej. Niestety ten błąd na razie Cię powstrzyma. –

26

rdzy 1,0 następujące kompozycje:

let mut state = [[0u8; 4]; 6]; 
state[0][1] = 42; 

Należy zauważyć, że długość segmentu wewnętrznego jest integralną częścią typu. Na przykład, można odwołać się (i pass) state następująco:

let a: &[[u8; 4]] = &state; 

ale bez określenia ustalonej długości podpotoku tablicy. Jeśli potrzebujesz zmiennej długości sub-macierzy może trzeba zrobić coś takiego:

let x: [Box<[u8]>; 3] = [ 
    Box::new([1, 2, 3]), 
    Box::new([4]), 
    Box::new([5, 6]) 
]; 
let y: &[Box<[u8]>] = &x; 
+0

Pamiętaj, że to panikuje, jeśli uzyskasz dostęp poza zakresem. Co nie jest zbyt przypominające rdzę. –

+0

Dzięki hardy, ale "(i, tak, mutability działa teraz)" -> w jaki sposób uzyskać dostęp i mutować jeden element? – Antonin

9

Można utworzyć dynamicznie wielkości 2D wektor takiego:

fn example(width: usize, height: usize) { 
    // Base 1d array 
    let mut grid_raw = vec![0; width * height]; 

    // Vector of 'width' elements slices 
    let mut grid_base: Vec<_> = grid_raw.as_mut_slice().chunks_mut(width).collect(); 

    // Final 2d array 
    let grid: &mut [&mut [_]] = grid_base.as_mut_slice(); 

    // Accessing data 
    grid[0][0] = 4; 
} 
1

Idiomatic C tablice 2-wymiarowe deklarowane przy użyciu tej samej kolejności rozmiarów tablic, jakie są używane podczas uzyskiwania dostępu do tablicy:

// Declaration 
int array_2d[8][16]; // An 8 by 16 2D array 
... 
// Access 
array_2d[0][1] = 5; 

W Rust, rozmiary deklaracji są odwrócone; Aby utworzyć dwuwymiarową tablicę 8 na 16, składnia jest następująca:

// Declaration 
let mut array_2d: [[i32; 16]; 8]; 
... 
// Access (same as idiomatic C. types for added explicitness) 
array_2d[0_usize][1_usize] = 5;