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:

mehrdimensionale arrays

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



Anmeldungsdatum: 27.04.2006
Beiträge: 445

BeitragVerfasst am: 28.08.2006, 21:50    Titel: mehrdimensionale arrays Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 28.08.2006, 22:23    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 28.08.2006, 22:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 28.08.2006, 23:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sven



Anmeldungsdatum: 04.09.2006
Beiträge: 7

BeitragVerfasst am: 12.09.2006, 18:20    Titel: Antworten mit Zitat

kommt immer drauf an was du benutzen willst,
wenn du nur eine 2D Karte haben willst reicht ein

DIM A (20,20)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
alfonsospringer



Anmeldungsdatum: 27.04.2006
Beiträge: 445

BeitragVerfasst am: 12.09.2006, 20:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 12.09.2006, 21:25    Titel: dynam. String in UDT --> Speicherproblem Antworten mit Zitat

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 lächeln

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