 |
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, 21: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, 22: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, 22: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, 22: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, 23: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, 18: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, 20: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, 21: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.
|
|