Geistesblitz hat geschrieben:Bei Bascom hab ich jetzt immer häufiger die Möglichkeit mit dem Overlay genutzt, wo man quasi eine Variable anlegt, die im Speicherbereich einer anderen Variablen liegt. So kann man beispielsweise von einem Integer oder Word jeweils das Highbyte oder das Lowbyte einer solchen Variablen zuweisen und kann dann problemlos auf diese zugreifen. Das Ganze kann man auch wild durcheinander tun, zB. dass ein Word als Overlay einige aufeinanderfolgende Zeichen einer Stringvariable belegt oder mit Arrays ist sowas auch machbar. Das ist denk ich ein bisschen ähnlich wie das mit den Pointern, oder?
Ja, so Sachen macht man mit Pointern. Obwohl eine Word Variable in High und Lowbyte zerlegen ist Aufgabe von Bitmasken.
Übrigens, wenn Du eine Array mit z.B. array(10) anlegst arbeitest Du schon mit Pointern ohne es zu bemerken.
Also etwas vergleichbares wie Strucs gibt es wohl in Bascom nicht obwohl es extrem nützlich wäre.
Eine Struct hilft dabei das Programm zu ordnen. Wenn man z.B. alle Angaben zu einem Bauteil speichern will könnte man zu jeder Eigenschaft eine eigene Variable anlegen:
Code: Alles auswählen
char[10] Name;
float Wert;
Int Bestellnr;
Int Menge;
int Lagerplatz;
Das geht bei einem Teil noch gut. Sobald es mehre Datensätze werden oder die Werte an eine Funktion übergeben werden sollen wird es kompliziert.
Dafür gibt es die Structs:
Code: Alles auswählen
struct Bauteil //Schlüsselwort struct und Bezeichnung der Struct
{
//Elemente der Struct
char[10] Name;
float Wert;
Int Bestellnr;
Int Menge;
int Lagerplatz;
}EinTeil,Teileliste[100];//hier werden zwei Variablen vom Typ Bauteil angelegt eine einzelne und ein Array mit 100 Elementen
Der Zugriff auf die angelegten Variablen erfolgt mit dem Punktoperator:
Code: Alles auswählen
EinTeil.Menge=300;
EinTeil.Lagerplatz=123;
EinTeil.Wert=2.2;
strcpy(EinTeil.Name,"Widerstand");//Stringzuweisung zur Laufzeit nur über strcpy
Teileliste[10].Lagerplatz=42//Bei einem Array kommt halt noch der Index dazu
Bei Übergabe an eine Funktion wird einfach nur der Name der ganzen Struct angegeben:
Byvalue
Code: Alles auswählen
void Bestelle_Teil(struct Bauteil Bestellen)
{
sendtext(Bestellen.Name);//Zugriff bei Übergabe bei Value erfolgt wie gewohnt per Punkt.
}
Main()//Main
{
While(1)
{
Bestelle_Teil(EinTeil);//Aufruf
}
}
By reference:
Code: Alles auswählen
void Bestelle_Teil(struct Bauteil *Bestellen)//"*" weißt auf Pointer hin
{
sendtext(Bestellen->Name);//Zugriff bei Übergabe by reference erfolgt mit "->" operator!
}
Main()//Main
{
While(1)
{
Bestelle_Teil(&EinTeil);//Wichtig: Beim Aufruf wir die Adresse mit dem Adressoperator übergeben. Wenn der vergessen wird erlaubt sich der Compiler nur einer Warnung. Darum Warnungen ernst nehmen.
}
}
Die Erklärung ist noch nicht vollständig. Da würde den Rahmen des Beitrags sprengen.
Eigentlich sollten die Beispiele für bessere Verständlichkeit mit einem Editor mit Syntax Highlight betrachtet werden.