  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		alfonsospringer
 
 
  Anmeldungsdatum: 27.04.2006 Beiträge: 445
 
  | 
		
			
				 Verfasst am: 28.08.2006, 20:50    Titel: mehrdimensionale arrays | 
				     | 
			 
			
				
  | 
			 
			
				ist es mit fb eigentlich möglich arrays zu erstellen in denen jedes element wieder ein array ist?
 
 
Beispiel Büchereiverwaltungsprogramm:
 
 
du willst alle Bücher mittels arrays sortieren. die erste ebene beinhaltet die themenbereiche und die zweite ebene die autoren. 
 
man gibt hintereinander themenbereich und autor ein und bekommt dann alle bücher aufgelistet. _________________ Die Antworten zu fast allen Fragen des Lebens findest du entweder im MonsterFAQ oder der Befehlsreferenz - Und wenn du gar nicht mehr weiter weisst ? -> Wikipedia
 
 
ALLE RECHTSCHREIBFEHLER DIE ICH MACHE SIND BEABSICHTIGT, DAMIT DIE LEUTE, DIE SPAß DARAN HABEN SOLCHE ZU FINDEN, ETWAS ZU TUN HABEN | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dominik
 
 
  Anmeldungsdatum: 22.12.2004 Beiträge: 172
 
  | 
		
			
				 Verfasst am: 28.08.2006, 21:23    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich würde es lieber so angehen, anstatt es über mehrdimensionale Arrays zu machen:
 
 
 	  | Code: | 	 		  Type Book
 
 .ISBN As Integer
 
 .Author As String
 
 .Title As String
 
End Type
 
 
Dim Books(1 To 100) As Book '100 Bücher in der Bibliothek
 
 
Books(1).ISBN = xxx
 
Books(1).Author = xxx
 
Books(1).Title = xxx
 
' usw.
 
 | 	 
 
  Zuletzt bearbeitet von Dominik am 28.08.2006, 21:48, insgesamt einmal bearbeitet | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Stormy
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
  | 
		
			
				 Verfasst am: 28.08.2006, 21:24    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ja, das geht einfach. Die Schlüsselwörter für dein Problem sind: TYPE, Array und ggf. ENUM.
 
 
Hier ein Beispiel:
 
 
 	  | Code: | 	 		  
 
' Unsere Kategorien
 
 
ENUM Kategorie
 
 Keine = 0
 
 Belletristik
 
 Abenteuer
 
 Kriminalroman
 
 Fantasy
 
 Computer
 
END ENUM
 
 
DIM SHARED AS STRING Kategorie(0 TO 10) 
 
Kategorie(0) = "Keine"
 
Kategorie(1) = "Belletristik"
 
Kategorie(2) = "Abenteuer"
 
Kategorie(3) = "Kriminalroman"
 
Kategorie(4) = "Fantasy"
 
Kategorie(5) = "Computer"
 
 
 
' Buecher Type
 
TYPE BuecherType
 
 ID AS INTEGER
 
 Titel AS STRING
 
 Erscheinungsjahr AS INTEGER
 
 AutorID AS INTEGER    ' Index für das Autor-Array (zB.: Autor(Buch(0).AutorID).Name)
 
 KategorieID AS Kategorie
 
END TYPE
 
 
 
DIM SHARED Buch(100) AS BuecherType
 
 
' Die Autoren
 
 
TYPE AutorType
 
 Name AS STRING
 
 Geburtsjahr AS INTEGER
 
END TYPE
 
 
DIM SHARED Autor(100) AS AutorType
 
 
' Wir fügen einige Autoren hinzu
 
Autor(0).Name = "Paul Grunewald"
 
Autor(0).Geburtsjahr = 1986
 
 
Autor(1).Name = "Henning Mankell"
 
Autor(1).Geburtsjahr = 1948
 
 
' Nun fügen wir zwei Bücher hinzu:
 
 
Buch(0).ID = 1
 
Buch(0).Titel = "2D-Anwendungen mit OpenGL und FreeBASIC"
 
Buch(0).Erscheinungsjahr = 2006
 
Buch(0).AutorID = 0 ' = Autor(0) = Paul Grunewald
 
Buch(0).KategorieID = Computer
 
 
Buch(1).ID = 2
 
Buch(1).Titel = "Die Brandmauer"
 
Buch(1).Erscheinungsjahr = 1998
 
Buch(1).AutorID = 1 ' Autor(1) = Henning Mankell
 
Buch(1).KategorieID = Kriminalroman
 
 
' Nun wenn es zur Darstellung unserer Daten kommt...
 
CLS
 
FOR e = 0 TO 1
 
With Buch(e)
 
 PRINT " Buch-Nr.: "; .ID
 
 PRINT "Titel: ";.Titel
 
 PRINT "Erscheinungsjahr: "; .Erscheinungsjahr
 
 PRINT "Autor: "; Autor(.AutorID).Name
 
 PRINT "Geburtsjahr des Autors: "; Autor(.AutorID).Geburtsjahr
 
 PRINT "Kategorie des Buches: "; Kategorie(.KategorieID)
 
 PRINT ""
 
End With
 
NEXT e | 	  
 
 
Dies ist der datenbankähnliche Ansatz. Natürlich nur im kleinen dargestellt. Den existierenden Code kannst du ja ausbauen _________________ +++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
 
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 28.08.2006, 22:03    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Du kannst natürlich auch Matrizen in Matrizen unterbringen,
 
aber ohne Type etc. wirst du kaum herumkommen. 	  | Code: | 	 		  Option Explicit
 
Type Matrix
 
  A(0 To 4, 0 To 5) As Integer
 
  B(0 To 6, 0 To 7) As Integer
 
End Type
 
Dim m(0 To 70, 0 To 10) as Matrix
 
m(70, 10).a(4, 5)=17
 
m(70, 10).b(6, 7)=4
 
?2*(m(70, 10).a(4, 5)+m(70, 10).b(6, 7))
 
?"Das ist DIE L”sung.."
 
Sleep | 	  
 
Gruß
 
ytwinky _________________
  	  | v1ctor hat Folgendes geschrieben: | 	 		  | Yeah, i like INPUT$(n) as much as PRINT USING.. | 	  ..also ungefähr so, wie ich GOTO.. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Sven
 
 
  Anmeldungsdatum: 04.09.2006 Beiträge: 7
 
  | 
		
			
				 Verfasst am: 12.09.2006, 17:20    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				kommt immer drauf an was du benutzen willst,
 
wenn du nur eine 2D Karte haben willst reicht ein
 
 
DIM A (20,20) | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		alfonsospringer
 
 
  Anmeldungsdatum: 27.04.2006 Beiträge: 445
 
  | 
		
			
				 Verfasst am: 12.09.2006, 19:19    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Das wollte ich ursprünglich wissen - danke, aber genialer Weise habe ich aus den anderen Posts auch die Verwendung von Type und Enum kennengelernt - nochmal danke. _________________ Die Antworten zu fast allen Fragen des Lebens findest du entweder im MonsterFAQ oder der Befehlsreferenz - Und wenn du gar nicht mehr weiter weisst ? -> Wikipedia
 
 
ALLE RECHTSCHREIBFEHLER DIE ICH MACHE SIND BEABSICHTIGT, DAMIT DIE LEUTE, DIE SPAß DARAN HABEN SOLCHE ZU FINDEN, ETWAS ZU TUN HABEN | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		terminate
 
 
  Anmeldungsdatum: 12.09.2006 Beiträge: 56
 
  | 
		
			
				 Verfasst am: 12.09.2006, 20:25    Titel: dynam. String in UDT --> Speicherproblem | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Stormy hat Folgendes geschrieben: | 	 		  
 
 
 	  | Code: | 	 		  
 
...
 
 
 
' Buecher Type
 
TYPE BuecherType
 
 ID AS INTEGER
 
 Titel AS STRING
 
 Erscheinungsjahr AS INTEGER
 
 AutorID AS INTEGER    ' Index für das Autor-Array (zB.: Autor(Buch(0).AutorID).Name)
 
 KategorieID AS Kategorie
 
END TYPE
 
 
 
...
 
 
' Die Autoren
 
 
TYPE AutorType
 
 Name AS STRING
 
 Geburtsjahr AS INTEGER
 
END TYPE
 
 | 	  
 
 | 	  
 
 
Das ist gefährlich! Wenn dynamische Strings, (d.h. die ganz normalen freebasic Strings), in User Defined Types verwendet werden, kann es ziemlich schnell zu Speicherproblemen kommen. Wenn UDTs mit Stringvariablen in Subs oder Funktionen verwendet, (deklariert), werden, was normalerweise der Fall ist, dann wird nach dem Verlassen des Subs bzw. der Funktion, der von der UDT Variable verwendete Stringspeicherplatz nicht mehr freigegeben! D.h. jedesmal wenn die Funktion aufgerufen wird, die die UDT Variable enthält, verschwindet ein bisschen Speicher, der bis zum beenden des Programms nicht wieder freigegeben wird, bei der Verwendung von UDT Arrays potenziert sich das Problem selbstverständlich.
 
 
 
Beispiel zum selber testen:
 
In folgendem Beispiel wird mehrmals nacheinander eine simple Funktion aufgerufen, die nichts weiter macht, als eine UDT Variable zu deklarieren und dieser einen Wert zuzuweisen, jedesmal nach dem Verlassen der Funktion müßte eigentlich der Speicherplatz den die UDT Variable belegt wieder freigegeben werden (im Taskmanager den verfügbaren Speicher beobachten), wird er aber nicht!
 
 	  | Code: | 	 		  
 
'Deklarationen
 
type test_type
 
  my_string as string
 
  my_integer as integer
 
end type
 
 
declare function do_something()
 
 
 
'Hauptprogram
 
dim as long i
 
 
for i = 1 to 1000000 'hier Wert einsetzen 1000000 bis 1000000000
 
  do_something()
 
next i
 
 
sleep
 
end
 
 
'Funktionen
 
 
function do_something()
 
dim my_variable as test_type
 
 
my_variable.my_string="irgendwas, irgendwas, irgendwas, irgendwas, bla, bla"
 
  
 
return 0
 
end function
 
 | 	  
 
 
Natürlich gibts Lösungen:
 
 
1. Man kann in den UDTs Strings mit fester Länge verwenden, das funktioniert problemlos:
 
 	  | Code: | 	 		  
 
type test_type
 
  my_string as string *1024 'maximal benötigtigte Länge eintragen
 
  my_integer as integer
 
end type
 
 | 	  
 
 
2. (Möglicherweise fehlerträchtig): UDTs nur im Hauptprogramm, d.h. außerhalb von Subs und Funktionen  deklarieren und nur 'ByRef', (wird by Arrays() automatisch gemacht), an Subs oder Funktionen übergeben, das Problem bleibt zwar bestehen, aber es wird nur soviel Speicherplatz angefordert wie die UDT Variable, (bzw. das Array), maximal während eines Programmdurchlaufs verwendet und der wird nach dem Beenden des Programms (hoffentlich immer) wieder freigegeben.
 
 
 	  | Code: | 	 		  
 
'Deklarationen
 
type test_type
 
  my_string as string
 
  my_integer as integer
 
end type
 
 
declare function do_something( inf_my_variable() as test_type)
 
 
'Hauptprogram
 
dim my_variable (10) as test_type
 
 
dim as long i
 
 
for i = 1 to 1000000 'hier Wert einsetzen 1000000 bis 1000000000
 
  do_something(my_variable ())
 
next i
 
 
print my_variable (1).my_string
 
print my_variable (2).my_string
 
print "fertig."
 
sleep
 
end
 
 
'Funktionen
 
 
function do_something( inf_my_variable() as test_type)
 
 
inf_my_variable(1).my_string="irgendwas, irgendwas, irgendwas, irgendwas, bla, bla"
 
inf_my_variable(2).my_string="irgendwas, irgendwas, irgendwas, irgendwas, bla, bla"  
 
return 0
 
end function
 
 | 	  
 
 
3. Abwarten bis Victor eigene Konstruktoren und Destruktoren für dynamische freebasic Strings eigeführt hat, das soll in der nächsten FreeBASIC Version 0.17 stable, (momentan gibts nur 0.17b testing) der Fall sein, also hoffentlich demnächst  
 
 
4. Das Problem läßt sich auch ganz umgehen, indem man entweder in UDTs nur noch mit (String-)Pointern arbeitet, was aber sobald man UDT Arrays verwenden möchte, das Allozieren und anschließende sorgfältige Deallozieren von Speicher erfordert, (Allocate, Deallocate).
 
Eine weitere Möglichkeit wäre, das Verwenden von 'normalen' ein oder mehrdimensionalen, Stringarrays() as string, wobei dann in den UDTs immer nur der jeweilige Index des im 'normalen' Stringarray gespeicherten Strings abgelegt wird, (z.B. in einer long Variable). | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
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.
  | 
   
 
     |