Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Alprausch
Anmeldungsdatum: 24.10.2009 Beiträge: 47 Wohnort: Schweiz
|
Verfasst am: 29.02.2012, 09:04 Titel: Eigenen Datentyp in Array schreiben und abrufen |
|
|
Hallo zusammen
Ich habe wieder weiterexperimentiert. Einige Sachen sind geglückt und andere leider nicht^^
Bei folgendem kleinen Programm lege ich zuerst meinen Datentyp fest, definiere ein Array, schreibe die Daten hinein und will Sie danach wieder abrufen.
Sobald der erste PRINT-Befehl kommt gibt es eine Fehlermeldung. Die Meldung heisst: Unverträgliche Datentypen
Jetzt weiss ich leider nicht was das genau heisst.
Hier mal der Code:
Code: | ' Das grosse QBasic Buch - Stefan Dittrich - 2. Auflage - Seite 83-85
' Eigenen Datentyp anlegen und damit arbeiten
CLS
' Eigenen Datentyp definieren
TYPE AdressTyp
Nachname AS STRING * 20
Vorname AS STRING * 15
Strasse AS STRING * 20
PLZ AS INTEGER
Ort AS STRING * 20
END TYPE
' Array mit 2 Zellen anlegen
DIM Adr(1) AS AdressTyp
' Daten in das Array schreiben
Adr(0).Nachname = "Mustermann"
Adr(0).Vorname = "Max"
Adr(0).Strasse = "Musterstrasse 1"
Adr(0).PLZ = 1234
Adr(0).Ort = "Musterstadt"
Adr(1).Nachname = "Musterfrau"
Adr(1).Vorname = "Maria"
Adr(1).Strasse = "Musterweg 1"
Adr(1).PLZ = 5678
Adr(1).Ort = "Musterdorf"
' Daten aus dem Array ausgeben
PRINT Adr(0)
PRINT Adr(1)
SLEEP |
Was ich mir noch überlegt habe ist ob ich das Array zweidimensional definieren muss dass jeder Eintrag in eine einzelne "Zelle" geschrieben werden kann.
In diesem Fall wüsste ich aber nicht wie der PRINT-Befehl aussehen muss damit aus einer "Spalte" alle Daten ausgegeben werden.
Möchte den PRINT-Befehl ja möglichst kurz halten und nicht für jede Zeile einen separaten Abruf schreiben.
Das Ziel wäre ja eigentlich es schön kompakt zu halten damit ich mit dem Array das ich definiert habe auch 2 Adressen aufnehmen kann. Also dass die 2 Adressen in 2 "Zellen" passen und nicht 2 "Spalten" brauchen. Habe aber keine Ahnung ob das so geht wie ich mir das vorgestellt habe.
mfg |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 29.02.2012, 13:37 Titel: |
|
|
Was erwartest du, soll ein 'PRINT Adr(0)' machen? Er hat hier einen Datentypen mit mehreren sog. Records, also einzelnen Daten, die im Speicher hintereinander liegen. Er weiß doch gar nicht, was er ausgeben soll, das musst du ihm vorgeben.
So wie du 'Adr(0).Nachname = "Mustermann"' machst, musst du natürlich auch 'PRINT Adr(0).Nachname' machen. |
|
Nach oben |
|
|
Alprausch
Anmeldungsdatum: 24.10.2009 Beiträge: 47 Wohnort: Schweiz
|
Verfasst am: 29.02.2012, 13:48 Titel: |
|
|
Ja so. Jetzt ist mir klar wie.
Aber gibt es keine Möglichkeit mit einem Befehl die ganze Adr(0) mit allen Unterdaten auszugeben?
mfg |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 29.02.2012, 13:56 Titel: |
|
|
Hallo
Ich glaube, PRINT kann immer nur einen Wert ausgeben, nicht gleich ein ganzes Datenfeld, auch wenn dieses selbst definiert ist. So wie man mit PSET auf diese Weise nicht mehrere Punkte gleichzeitig setzen könnte. Du müsstest also wahrscheinlich jeden Eintrag einzeln anzeigen lassen.
Code: |
...
FOR eintrag = 0 TO 1
PRINT Adr(eintrag).Nachname
PRINT Adr(eintrag).Vorname
PRINT Adr(eintrag).Strasse
PRINT Adr(eintrag).PLZ
PRINT Adr(eintrag).Ort
NEXT
...
|
Kompakt und mit einem zweidimensionalen Array könnte es z.B. so aussehen:
Code: |
CLS
DIM Adr(1, 4) AS STRING * 20
FOR eintrag = 0 TO 1
FOR angabe = 0 TO 4
READ Adr(eintrag, angabe)
PRINT Adr(eintrag, angabe)
NEXT
NEXT
DATA Mustermann,Max
DATA Musterstrasse 1
DATA 1234, Musterstadt
DATA Musterfrau,Maria
DATA Musterweg 1
DATA 5678, Musterdorf
SLEEP |
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 29.02.2012, 14:01 Titel: |
|
|
In FreeBASIC hättest du die Möglichkeit den Cast-Operator für den Type so zu überladen, dass er bei einem PRINT für den gesamten Typ auch wirklich alles ausgibt. In QB gibt es diese Möglichkeit allerdings nicht. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 29.02.2012, 14:14 Titel: |
|
|
Hallo,
man könnte natürlich eine PrintAdresse-SUB schreiben und dieser Prozedur dann die UDT-Variable übergeben. So würde eine Zeile genügen, um die UDT-Mitglieder beliebig formatiert "in einem Rutsch" auszugeben.
Code: | 'Pseudocode
Sub PrintAdresse (Adresse As TAdresse)
Print Adresse.Vorname; " "; Adresse.Nachname
End Sub
Dim Kunde As TAdresse
Kunde.Vorname = "Max"
Kunde.Nachname = "Muster"
PrintAdresse Kunde |
Eine andere Möglichkeit wäre eine AdresseToStr-Funktion: Dieser würde man eine UDT-Variable übergeben; das Resultat wäre ein String, den man als Argument für PRINT verwenden könnte:
Code: | 'Pseudocode
Function AdresseToStr (Adresse As TAdresse) As String
Return Adresse.Vorname + " heisst mit Nachname " + Adresse.Nachname
End Function
Dim Kunde As TAdresse
Kunde.Vorname = "Max"
Kunde.Nachname = "Muster"
Print AdresseToStr (Kunde) |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Alprausch
Anmeldungsdatum: 24.10.2009 Beiträge: 47 Wohnort: Schweiz
|
Verfasst am: 29.02.2012, 14:26 Titel: |
|
|
Vielen herzlichen Dank
Diese Möglichkeit:
Code: | ...
FOR eintrag = 0 TO 1
PRINT Adr(eintrag).Nachname
PRINT Adr(eintrag).Vorname
PRINT Adr(eintrag).Strasse
PRINT Adr(eintrag).PLZ
PRINT Adr(eintrag).Ort
NEXT
... |
funktioniert.
Nur ist leider kein Abstand zwischen den Adressen. Dies könnte man aber auch lösen durch ein leeres Feld im Array nehme ich mal an.
mfg |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 29.02.2012, 14:51 Titel: |
|
|
Alprausch hat Folgendes geschrieben: | Diese Möglichkeit:
Code: | ...
FOR eintrag = 0 TO 1
PRINT Adr(eintrag).Nachname
PRINT Adr(eintrag).Vorname
PRINT Adr(eintrag).Strasse
PRINT Adr(eintrag).PLZ
PRINT Adr(eintrag).Ort
NEXT
... |
funktioniert.
Nur ist leider kein Abstand zwischen den Adressen. Dies könnte man aber auch lösen durch ein leeres Feld im Array nehme ich mal an. |
Absolut überflüssig. Schreib doch einfach ein PRINT ohne Argument ans Ende des Schleifenrumpfs:
Code: | ...
FOR eintrag = 0 TO 1
PRINT Adr(eintrag).Nachname
PRINT Adr(eintrag).Vorname
PRINT Adr(eintrag).Strasse
PRINT Adr(eintrag).PLZ
PRINT Adr(eintrag).Ort
PRINT
NEXT
... |
So bekommst du nach jedem Datensatz eine Leerzeile. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Alprausch
Anmeldungsdatum: 24.10.2009 Beiträge: 47 Wohnort: Schweiz
|
Verfasst am: 29.02.2012, 15:45 Titel: |
|
|
Stimmt auch wieder
Danke nochmal für Eure Hilfe!
Knoble schon wieder am nächsten Problem rum. Für Euch wäre es wahrscheinlich das einfachste der Welt. Doch ich finde den Fehler einfach nicht...
Und schon wieder ein neues Thema öffnen... Ich weiss ja nicht.
Irgendwann ist auch genung.
Edit: Yeah Ich hab den Fehler gefunden und beheben können.
mfg |
|
Nach oben |
|
|
|