Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the correct type to use for an array index?

Tags:

arrays

rust

This code works, but I want to explicitly declare the type of the index range max. However uX or iX, where X = 8, 16 or 32 gives compile errors. What is the correct type?

fn main() {
    let mut arr2: [[f64; 3]; 3] = [[0.0; 3]; 3];
    let pi: f64 = 3.1415926535;

    let max = 3; // let max: i16 e.g. is wrong

    for ii in 0..max {
        for jj in 0..3 {
            let i = ii as f64;
            let j = jj as f64;
            arr2[ii][jj] = ((i + j) * pi * 41.0).sqrt().sin();
            println!("arr2[{}][{}] is {}", ii, jj, arr2[ii][jj]);
        }
    }
}
like image 790
Jonatan Öström Avatar asked Oct 25 '16 03:10

Jonatan Öström


People also ask

What is the type of an array index?

An array is an indexed collection of component variables, called the elements of the array. The indexes are the values of an ordinal type, called the index type of the array. The elements all have the same size and the same type, called the element type of the array.

What type is the index of an array in C?

Array elements are accessed by using an integer index. Array index starts with 0 and goes till the size of the array minus 1. The name of the array is also a pointer to the first element of the array.

What is an array index?

(definition) Definition: The location of an item in an array.

What are the 3 types of arrays?

There are three different kinds of arrays: indexed arrays, multidimensional arrays, and associative arrays.


1 Answers

The compiler gives you a note about this:

   = note: slice indices are of type `usize`

You must index a slice with a usize. usize is an unsigned integral type that has the same size as a pointer, and can represent a memory offset or the size of an object in memory. On 32-bit systems, it's a 32-bit integer, and on 64-bit systems, it's a 64-bit integer. Declare your index variables as usize unless you really have a lot of them, in which case you can use x as usize to cast them to an usize.

When you leave out the type annotation, Rust deduces that your integer literals must be of type usize because slices implement Index<usize> and not Index<i32> or Index<any other integral type>.

like image 166
Francis Gagné Avatar answered Oct 12 '22 10:10

Francis Gagné