| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| Alprausch 
 
  
 Anmeldungsdatum: 24.10.2009
 Beiträge: 47
 Wohnort: Schweiz
 
 | 
			
				|  Verfasst am: 29.02.2012, 08: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, 12: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, 12: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, 12: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, 13: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, 13: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, 13: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, 13: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, 14: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 |  | 
	
		|  | 
	
		|  |