Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eigenen Datentyp in Array schreiben und abrufen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Alprausch



Anmeldungsdatum: 24.10.2009
Beiträge: 47
Wohnort: Schweiz

BeitragVerfasst am: 29.02.2012, 08:04    Titel: Eigenen Datentyp in Array schreiben und abrufen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 29.02.2012, 12:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Alprausch



Anmeldungsdatum: 24.10.2009
Beiträge: 47
Wohnort: Schweiz

BeitragVerfasst am: 29.02.2012, 12:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 29.02.2012, 12:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 29.02.2012, 13:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 29.02.2012, 13:14    Titel: Antworten mit Zitat

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
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Alprausch



Anmeldungsdatum: 24.10.2009
Beiträge: 47
Wohnort: Schweiz

BeitragVerfasst am: 29.02.2012, 13:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 29.02.2012, 13:51    Titel: Antworten mit Zitat

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.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Alprausch



Anmeldungsdatum: 24.10.2009
Beiträge: 47
Wohnort: Schweiz

BeitragVerfasst am: 29.02.2012, 14:45    Titel: Antworten mit Zitat

Stimmt auch wieder lächeln

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 grinsen Ich hab den Fehler gefunden und beheben können.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz