*Komplexe Datentypen: Das Array
<p dir="auto">Grundkonfiguration eines Arrays <p dir="auto">*speichert ausschließlich den gleichen Datentyp<br /> *Größe des Arrays fix <p dir="auto">Syntax <pre><code>let my_array =[1,3,19,27,4]; <p dir="auto">Zugriff auf ein Array <p dir="auto">Entweder wir speichern den gewollten Index wieder in einer neuen Variable, oder geben diesen direkt per println! aus. <pre><code> let x = my_array[0]; //Zugriff auf Index 0 via einer Variable println!("{x}"); //Ausgabe von x (Index 0 von my_array) //oder direkt per println! println!("{}", my_array[0]); <p dir="auto">Ändern eines Arrayelements <p dir="auto">Vielleicht kann sich nun der eine oder andere von euch eine wichtige Voraussetzung schon vorstellen. Ja? Das Array muss <em>mut sein, sonst funktioniert es nicht. Der Rest ergibt sich praktisch von selbst. Das Element wird per eckigen Klammern ausgewählt und einfach per Gleichheitszeichen umgestellt. <pre><code>let mut my_array2=[1,2,3,4,5]; //mutables Array wird erstellt my_array2[4]=7; //Element 4, Ziffer 5 wird auf 7 geändert. println!("my_array2{:?}",my_array2); <p dir="auto">Ausgabe <p dir="auto"><img src="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tbRUoTNHAtCLAJtk4jbC2LanMfLD3hF1bQR6uXB8oMv2kyW4eLUnnaj2TtNtZoZoJwf.png" alt="image.png" srcset="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tbRUoTNHAtCLAJtk4jbC2LanMfLD3hF1bQR6uXB8oMv2kyW4eLUnnaj2TtNtZoZoJwf.png 1x, https://images.hive.blog/1536x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tbRUoTNHAtCLAJtk4jbC2LanMfLD3hF1bQR6uXB8oMv2kyW4eLUnnaj2TtNtZoZoJwf.png 2x" /> <p dir="auto">... <p dir="auto">Zugriff auf Array-Slices <p dir="auto">Zuerst muss natürlich mal geklärt werden, was denn überhaupt ein Slice ist.<br /> Slice bedeutet einen Bereich auszuwählen. Also zB. von Index 0 bis 2. Dieser muss aber mit einer sogenannten Referenz ausgewählt werden. Die funktioniert mit dem kaufmännischen UND (&), im englischen Ampersand. <p dir="auto">Im Beispiel angeführt sind 2 Arten, wie man auf die Indizes zugreift: <pre><code>let slice1=&my_array[0..2]; println!("Slice1 = {:?}",slice1); let slice1=&my_array[0..=2]; println!("Slice1 = {:?}",slice1); <p dir="auto">Ausgabe: <p dir="auto"><img src="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tRzWPs4ebZPjVXUCKhng2H4Fyv9Ek5MRBMerKh8e6BiLaEhDEDo53ZentNpbmu9Dxxd.png" alt="image.png" srcset="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tRzWPs4ebZPjVXUCKhng2H4Fyv9Ek5MRBMerKh8e6BiLaEhDEDo53ZentNpbmu9Dxxd.png 1x, https://images.hive.blog/1536x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tRzWPs4ebZPjVXUCKhng2H4Fyv9Ek5MRBMerKh8e6BiLaEhDEDo53ZentNpbmu9Dxxd.png 2x" /> <p dir="auto">[0..2] beschreibt eigentlich die Indizes 0 bis 1. Also der linke Index ist inklusiv, der rechte (warum auch immer) muss ein Index höher gewählt werden.<br /> Eine andere Schreibweise, die den rechten Index inklusiv macht, ist vorher noch ein Gleichheitszeichen zu setzen. Also [0..=2]. Dann sind alle 3 Elemente von 0 bis 2 dabei. <p dir="auto">Zum Thema Referenzierung und Dergleichen, kommt zu einem späteren Zeitpunkt noch etwas mehr. Vorweg, einfach zu merken: <blockquote> <blockquote> <p dir="auto">*primitive Datentypen, wie i32, f64 usw brauchen keine Referenzierung.<br /> *komplexe Datentypen schon. <p dir="auto">Genauere Deklaration <p dir="auto">Manchmal ist es vielleicht nötig, im Vorfeld genauere Angaben zu machen, was das Array enthalten soll. Dabei hilft die bereits früher erwähnte Annotation. <pre><code>let my_array3:[u8;5]=[1,2,3,4,6]; <p dir="auto">Das hier bewirkt, dass 5 Elemente des Datentyps u8 (unsigned integer, Integer die nur höher als 0 sein können) erwartet werden. <p dir="auto">Andersrum kann man auch eine kleine Abkürzung nehmen und zB. 50 3er ausgeben lassen (wozu auch immer). <pre><code>let my_array4 = [3;50]; <p dir="auto">Ich hatte Schwierigkeiten mir die Reihenfolge zu merken. Aber es half mir dann "Was? Wie oft?" <p dir="auto">Zugriff auf Elemente außerhalb des Arrays <p dir="auto">Manchmal leistet man sich einen Fehlgriff; nicht so schlimm in Rust.<br /> Nachdem Rust in verschiedene RAM-Typen speichert (wie andere Programmiersprachen auch), könnte man (das kann in C/C++ passieren) in einen Speicherbereich schreiben, den zB ein anderes Programm ausführt. Vielleicht kann sich noch jemand an die Fehlerbezeichnung "Schwere Zugriffsverletzung" erinnern? Solche Fehler wären das. <p dir="auto">Wie sieht so etwas aus (das in Rust durch Sicherheitskonzepte nicht funktioniert)? <pre><code>my_array2[6]=17; <p dir="auto">Zur Erinnerung: my_array2 hatte nur Indizes von 0..4. Index 6 kann es also nicht geben. Das zeigt sich auch, wenn das Programm ausgeführt wird. <p dir="auto"><img src="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tGY4jgnCBxcRdzMVte7T5vB6HNPnTH6UPCq9SjAfEDyMjAQvmrERd7XC5AK2QSrg72W.png" alt="image.png" srcset="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tGY4jgnCBxcRdzMVte7T5vB6HNPnTH6UPCq9SjAfEDyMjAQvmrERd7XC5AK2QSrg72W.png 1x, https://images.hive.blog/1536x0/https://files.peakd.com/file/peakd-hive/jeyf123/23tGY4jgnCBxcRdzMVte7T5vB6HNPnTH6UPCq9SjAfEDyMjAQvmrERd7XC5AK2QSrg72W.png 2x" /> <p dir="auto">Zum Schluss noch die Zusammenfassung und die Ausgabe<br /> (Das kann man kopieren, dann braucht man nicht alles schreiben) <pre><code>fn main(){ let my_array =[1,3,19,27,4]; //Array erzeugen let x = my_array[0]; //Ausgabe von x (Index 0 von my_array) println!("x={x}"); //Ausgabe von x //oder direkt per println! println!("my_array0={}", my_array[0]); let mut my_array2=[1,2,3,4,5]; //mutables Array wird erstellt my_array2[4]=7; //Element 4, Ziffer 5 wird auf 7 geändert. println!("my_array2{:?}",my_array2); //Slices let slice1=&my_array[0..2]; println!("Slice1 = 0..2={:?}",slice1); let slice1=&my_array[0..=2]; println!("Slice1 0..=2={:?}",slice1); //Genauere Deklaration let my_array3:[u8;5]=[1,2,3,4,6]; println!("Genaue Deklaration:[u8;5]={:?}", my_array3); let my_array4 = [3;50]; println!("50x3er={:?}", my_array4); //Zugriff auf ein Element, dass es im Array nicht gibt erzeugt einen Fehler! //my_array2[6]=17; } <p dir="auto">und die Ausgabe aus der Konsole <p dir="auto"><img src="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/Eo1vw21wSLSk4f6uJVcF4h7T9NCKQqRvMYU959YihsxsnbxQ1WnpsRm8E4U7kp16Z4V.png" alt="image.png" srcset="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/jeyf123/Eo1vw21wSLSk4f6uJVcF4h7T9NCKQqRvMYU959YihsxsnbxQ1WnpsRm8E4U7kp16Z4V.png 1x, https://images.hive.blog/1536x0/https://files.peakd.com/file/peakd-hive/jeyf123/Eo1vw21wSLSk4f6uJVcF4h7T9NCKQqRvMYU959YihsxsnbxQ1WnpsRm8E4U7kp16Z4V.png 2x" /> <p dir="auto">Das wars fürs Erste mit den Arrays.