Laden...

Forenbeiträge von Flyget Ingesamt 2 Beiträge

26.04.2022 - 23:55 Uhr

Hallo Abt,
vielen Dank, das erleuchtet schonmal deutlich.

Wie würde man sowas denn möglichst strukturiert und lesbar als Klasse schreiben? Meine Idee mit dem Array war eben, dass ich da schön per Index zugreifen kann. Gibt objektorientiert aber sicher saubere Lösungen. Hier wäre ich noch über einen Tipp/Grundgerüst dankbar.

Viele Grüße,
Flyget

26.04.2022 - 23:07 Uhr

Hallo Zusammen,
ich bin relativ frisch was das c# Programme angeht, und habe ein Phänomen das mir nicht ganz klar ist.

Prinzipiell geht es darum eine Datei einzulesen und deren Inhalt in eine Struktur zu laden. Später soll der Inhalt dieser Struktur weiter verarbeitet werden. Mein Problem findet aber schon beim einlesen statt.

Beim Einlesen der Datei im Form Load Ereignis soll die Datei Zeile für Zeile in die Struktur "presets_collection_1" sortiert werden. Die Struktur besteht dabei aus 16 weiteren identischen Strukturen. Nun dachte ich, Strukturen wären Werte-Typen und damit sollten diese 16 einzelnen Strukturen unabhängig voneinander sein. Dem scheint aber zumindest in diesem Fall nicht so zu sein, bzw. ich habe irgendwo sonst einen Denkfehler.

Im Minimalbeispiel sollen zwei Presets aus der presets.txt eingelesen werden. Eigentlich erwarte ich dass anschließend folgendes in der Struktur preset_collection_1 steht:


preset_collection_1.Presets[0].Door_measurements[0] = 2
preset_collection_1.Presets[0].Door_measurements[1] = 1
preset_collection_1.Presets[0].Door_measurements[2] = 4
preset_collection_1.Presets[0].Belt_buckle_measurements[0] = 1
preset_collection_1.Presets[0].Belt_buckle_measurements[1] = 9
preset_collection_1.Presets[0].Belt_buckle_measurements[2] = 3

sowie


preset_collection_1.Presets[1].Door_measurements[0] = 3
preset_collection_1.Presets[1].Door_measurements[1] = 4
preset_collection_1.Presets[1].Door_measurements[2] = 5
preset_collection_1.Presets[1].Belt_buckle_measurements[0] = 2
preset_collection_1.Presets[1].Belt_buckle_measurements[1] = 3
preset_collection_1.Presets[1].Belt_buckle_measurements[2] = 1
preset_collection_1.Presets[1].Belt_buckle_measurements[2] = 7

jedoch sieht es so aus, dass in allen Presets preset_collection_1.Presets[0-15] der Inhalt aus dem zweiten Preset steht:


preset_collection_1.Presets[0-15].Door_measurements[0] = 3
preset_collection_1.Presets[0-15].Door_measurements[1] = 4
preset_collection_1.Presets[0-15].Door_measurements[2] = 5
preset_collection_1.Presets[0-15].Belt_buckle_measurements[0] = 2
preset_collection_1.Presets[0-15].Belt_buckle_measurements[1] = 3
preset_collection_1.Presets[0-15].Belt_buckle_measurements[2] = 1
preset_collection_1.Presets[0-15].Belt_buckle_measurements[2] = 7

Code:


namespace struct_test
{
	public partial class Form1 : Form
	{
		// Globale Variablen
		DialogResult result;

		public Form1()
		{
			InitializeComponent();
		}

		static T[] CreateArray<T>(int count, T value)
		{
			T[] ret = new T[count];
			for (int i = 0; i < count; i++)
			{
				ret[i] = value;
			}
			return ret;
		}

		public struct preset
		{
			public string Preset_name { get; set; }
			public string Test_number { get; set; }
			public string[] Door_measurements { get; set; }
			public string[] Belt_buckle_measurements { get; set; }

			public preset(string preset_name, string test_number, string[] door_measurements, string[] belt_buckle_measurements)
			{
				this.Preset_name = preset_name;
				this.Test_number = test_number;
				this.Door_measurements = door_measurements;
				this.Belt_buckle_measurements = belt_buckle_measurements;
			}
		}

		public struct preset_collection
		{
			public preset[] Presets { get; set; }

			public preset_collection(preset[] presets)
			{
				this.Presets = presets;
			}
		}

		preset_collection preset_collection_1 = new preset_collection
		{
			Presets = CreateArray<preset>(16, new preset { Preset_name = "", Test_number = "", Door_measurements = CreateArray<string>(9, ""), Belt_buckle_measurements = CreateArray<string>(9, "") })
		};


		private bool load_presets()
		{
			// Konfigurationsdatei laden oder durch Default-Datei ersetzen
			string current_config_file_path = Directory.GetCurrentDirectory() + "\\presets.txt";
			Encoding iso = Encoding.GetEncoding("ISO-8859-1");
			byte line_type = 0;
			byte preset_cnt = 0;
			byte measurement_cnt_door = 0;
			byte measurement_cnt_beltbuckle = 0;
			byte position = 0;

			if (File.Exists(current_config_file_path))
			{
				foreach (string line in File.ReadLines(current_config_file_path, iso))
				{
					if (line.StartsWith("#")) // Kommentarzeile -> ignorieren
					{

					}
					else
					{
						if (line.StartsWith("******")) // Neues Preset erstellen
						{
							line_type = 1;
							measurement_cnt_door = 0;
							measurement_cnt_beltbuckle = 0;
							preset_cnt += 1;

						}
						else if (line_type == 1) // Preset name
						{
							preset_collection_1.Presets[preset_cnt - 1].Preset_name = line;
							line_type = 2;
						}
						else if (line_type == 2) // Test number
						{
							preset_collection_1.Presets[preset_cnt - 1].Test_number = line;
							line_type = 3;
						}
						else if (line_type == 3) // Measurements
						{
							if (line.StartsWith("Door")) // Door measurements
							{
								if (Byte.TryParse(line.Substring(9, 1), out position))
								{
									preset_collection_1.Presets[preset_cnt - 1].Door_measurements[measurement_cnt_door] = position.ToString();
									measurement_cnt_door += 1;
								}
								else
									return false;
							}
							else if (line.StartsWith("Beltbuckle")) // Belt buckle measurements
							{
								if (Byte.TryParse(line.Substring(15, 1), out position))
								{
									preset_collection_1.Presets[preset_cnt - 1].Belt_buckle_measurements[measurement_cnt_beltbuckle] = position.ToString();
									measurement_cnt_beltbuckle += 1;
								}
								else
									return false;
							}
						}
					}
				}
			}
			return true;
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			// Presets laden -> Falls Fehler, Program beenden oder ignorieren
			if (load_presets() == false)
			{
				result = MessageBox.Show("Fehler beim einlesen der presets", "Einlesefehler", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error);
				if (result == DialogResult.Yes) // Ignorieren von Fehler und nur korrekte Presets anzeigen
				{

				}
				else if ((result == DialogResult.No) | (result == DialogResult.Cancel) | (result == DialogResult.Abort)) // Program beenden
				{
					this.Close();
				}
			}
			else
			{
				// Combobox mit Presetnamen füllen
				for (byte i = 0; i < 16; i++)
				{
					if (!string.IsNullOrEmpty(preset_collection_1.Presets[i].Preset_name))
					{
						comboBox_attempt_presets.Items.Add(preset_collection_1.Presets[i].Preset_name);
					}
				}
			}
		}
	}
}


Wäre froh, wenn mich jemand etwas erleuchten könnte!
Vielen Dank,
Flyget