source: doc/theses/mike_brooks_MMath/tests/arrays.rs

Last change on this file was b7f8cadb, checked in by Peter A. Buhr <pabuhr@…>, 4 months ago

add directory for non-CFA test programs

  • Property mode set to 100644
File size: 3.5 KB
Line 
1use std::convert::TryInto;
2use std::convert::TryFrom;
3fn main() {
4 // typed/size/repeat initialization
5 let val = 42;
6 let mut ia: [usize; 5] = [val; 5];
7
8 // typed/size/individual initialization
9 let fval = 42.2;
10 let fa: [f64; 5] = [1.2, fval, 5.6, 7.3, 9.1];
11
12 // enumerating range/type
13 for i in 0..ia.len() { print!("{:?} ", ia[i] ); } println!(""); // 42 42 42
14 for fv in fa { print!("{:?} ", fv ); } println!(""); // 1.2 42.2 5.6
15 for i in 0..=1 { ia[i] = i; } // mutable changes
16 for iv in ia { print!("{:?} ", iv ); } println!(""); // 0 1 42
17
18 // 2 dimensional (matrix), fixed-size
19 const ROWS: usize = 4;
20 const COLS: usize = 6;
21 let mut fmatrix: [[f64; COLS]; ROWS] = [[0.; COLS]; ROWS];
22 for r in 0 .. ROWS {
23 for c in 0 .. COLS {
24 fmatrix[r][c] = r as f64 + c as f64;
25 }
26 println!( "{:?}", fmatrix[r] );
27 }
28
29 let mut slice2: &[f64] = &fmatrix[3][2 ..= 4];
30 println!( "{:?}", slice2 );
31 slice2 = &fmatrix[1 ..= 3][1];
32 println!( "{:?}", slice2 );
33
34 // implicit type/size, print entire array and length
35 println!( "{:?} {:?}", ia, ia.len() );
36 ia = [5; 5];
37 println!( "{:?} {:?}", ia, ia.len() );
38 ia = [1, 2, 3, 4, 5];
39 println!( "{:?} {:?}", ia, ia.len() );
40
41 // array copy
42 let ia2: [usize; 5];
43 ia2 = ia;
44 println!( "copy = {:?} ", ia2 ); // 0 1 42
45
46 let mut numbers = [1, 2, 3, 4, 5];
47 // pass array by value
48 fn update1( mut arr:[i32; 5] ) {
49 for i in 0 .. arr.len() { arr[i] = 0; }
50 println!( "function update {:?}", arr );
51 }
52 update1( numbers );
53
54 // pass array by reference
55 fn update2( arr: & mut [i32; 5] ) {
56 for i in 0 .. arr.len() { arr[i] = 0; }
57 println!( "function update {:?}", arr );
58 }
59 update2( &mut numbers );
60
61 // slice is barrowing a subset of an array, dimension bounds can be expressions
62 println!( "slice {:?}", &ia[0..3] ); // fixed bounds, [1, 2, 3]
63 println!( "slice {:?}", &ia[ia.len() - 2 .. ia.len()] ); // variable bounds, [4, 5]
64 println!( "slice {:?}", &ia[ia.len() - 2 .. ] ); // drop upper bound, [4, 5]
65 println!( "slice {:?}", &ia[.. ia.len() - 2 ] ); // drop lower bound, [1, 2, 3]
66 println!( "slice {:?}", &ia[..] ); // drop both bound, [1, 2, 3, 4, 5]
67
68 let slice: &[f64];
69 slice = &fa[0 ..= 1];
70 println!( "slice = {:?}", slice ); // [1.2, 42.2]
71 let mut fa2: [f64; 2] = <[f64; 2]>::try_from( slice ).unwrap(); // convert slice to array
72 println!( "fa2 {:?}", fa2 ); // [1.2, 42.2]
73 fa2 = (& fa[2 ..= 3]).try_into().unwrap(); // convert slice to array
74 println!( "fa2 {:?}", fa2 ); // [1.2, 42.2]
75
76 // pass (all) slice by reference
77 fn zero( arr: & mut [usize] ){
78 for i in 0 .. arr.len() { arr[i] = 0; }
79 println!( "function update {:?}", arr );
80 }
81 zero( & mut ia[0..5] );
82 zero( & mut ia[0..3] );
83
84 let mut vec: Vec< Vec<usize> > = Vec::new();
85 for r in 0 .. ROWS {
86 let mut row: Vec<usize> = Vec::new();
87 for c in 0 .. COLS {
88 row.push(r + c);
89 }
90 vec.push(row);
91 }
92 for r in 0 .. 4 {
93 for c in 0 .. 4 {
94 print!("{} ", vec[r][c]);
95 }
96 println!("");
97 }
98
99 // 2 dimensional (matrix), variable-size (C++ vector) array of array, heap allocated
100 let (rows, cols) = (4, 6);
101 let mut matrix = vec![vec![0; cols]; rows];
102 for r in 0 .. rows {
103 for c in 0 .. cols {
104 matrix[r][c] = r + c;
105 print!("{} ", matrix[r][c]);
106 }
107 println!("");
108 }
109
110 let mut slice3: &[usize] = &matrix[3][2 ..= 4];
111 println!( "{:?}", slice3 );
112 slice3 = &matrix[1 ..= 3][1];
113 println!( "{:?}", slice3 );
114
115 fn f<const N: usize>( arg: [usize; N] ) {
116 for r in 0 .. arg.len() {
117 print!( "{} ", arg[r] );
118 }
119 println!("");
120 }
121 f( ia );
122}
123
124// Local Variables: //
125// tab-width: 4 //
126// compile-command: "rustc arrays.rs" //
127// End: //
Note: See TracBrowser for help on using the repository browser.