Angehängte Types effektiv durchsuchen??

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Akiba

Betreff: Angehängte Types effektiv durchsuchen??

BeitragSo, Dez 06, 2009 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi! Ich hab folgendes Problem:

Ich hab zwei Types, das eine ist an das andere angehängt. Es soll mit den beiden eine Tabelle enstehen. Das erste Type legt die Anzahl der Spalten fest, das zweite die Anzahl der Spalten pro Zeile.

Code: [AUSKLAPPEN]
Type dim1
   Field Y.dim2
End Type

Type dim2
   Field z0
   Field z1
End Type


Und Ich möchte jetzt zu einer bestimmt Zeile und Spalte gehen und schauen, welcher Wert in ihr drin steht. Da hab ich gedacht, dass man es ja so machen könnte, das man, wenn man in einer Zeile anfängt zu suchen, erstmal schaut, ob diese Zeile die richtige ist. Wenn ja, dann durchsucht man die Zeile, wenn nein, dann eben nicht. Ich wollte das einfach mit zwei FOR - EACH Schleifen realisieren. Die erste soll die Zeilen absuchen und die zweite die Spalten. Doch leider sucht die zweite Schleide immer JEDE Zelle ab, die es gibt. Kann man das auch effektiver gestalten?

Die zwei Schleifen zum auslesen:

Code: [AUSKLAPPEN]
zeile = 0
For runter.dim1 = Each dim1
   zeile = zeile + 1
   If zeile = gesuchte_zeile Then
      For runter\Y.dim2 = Each dim2
            l = l + 1
            j1 = runter\Y\z0
            j2 = runter\y\z1
      Next
   EndIf
Next


Die Schleifen zum Erstellen und Initialisieren der Zeilen und Spalten .... (die funktionieren!!)

Code: [AUSKLAPPEN]
For i = 0 To laenge - 1
   runter.dim1 = New dim1
   For j = 0 To breite -1
      runter\Y = New dim2
      runter\Y\z0 = Rand(1, 10)
      runter\Y\z1 = Rand(1, 10)
   Next
Next
Luigi, man wendet sich nich gegen Familie...

Nicdel

BeitragSo, Dez 06, 2009 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest auch ein Array verwenden (siehe Dim). Das ist eignentlich genau das selbe, wie eine Tabelle, du kannst direkt auf einen Eintrag zugreifen Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Akiba

BeitragSo, Dez 06, 2009 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, natürlich! Aber die Sache ist, dass die Tabellengröße variablel sein soll .... da wird nicht viel gehen mit dem guten Dim ... leider!

Ich erkunde auch gerade den CreateBank-Befehl ... ich glaube, der ist einfacher zu handhaben.
Luigi, man wendet sich nich gegen Familie...

Nicdel

BeitragSo, Dez 06, 2009 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Na gut, das ist natürlich ein Problem. Wenn du Banks verwenden willst, ist das hier glaube ich ganz gut geeinget: https://www.blitzforum.de/showcase/335/

Edit: OK, man kann in BMax die Arraygröße nachträglich ändern, ohne das der Inhalt gelöscht wird Very Happy
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
  • Zuletzt bearbeitet von Nicdel am So, Dez 06, 2009 22:17, insgesamt einmal bearbeitet

D2006

Administrator

BeitragSo, Dez 06, 2009 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht mit Dim auch. Ein weiteres Dim redimensioniert ein Array. Allerdings wird dabei der Inhalt gelöscht.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Akiba

BeitragSo, Dez 06, 2009 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Nicdel
Ein solches Array wie in BMax könnt Ich jetzt echt gut gebrauchen Wink aber ich bleib erstmal bei B3D

@ D2006
Danke für den Tipp! Damit versuch Ichs jetzt wahrscheinlich mal .... scheint das einfachste zu sein
Luigi, man wendet sich nich gegen Familie...
 

Lion

BeitragSo, Dez 06, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ohne dass der inhalt wirklich gelöscht wird kannste theoretisch mit ein bisschen aufwand auch so machen. einfach ein temporäres, zweites dim machen und nach der größenänderung des dims die werte aus dem temporären in das neue machen und danach das temporäre auch resizen
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Akiba

BeitragSo, Dez 06, 2009 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Das war mein Plan Wink

Geht das neudimensionieren auch in Funktionen? Weil bei mir sagt das Programm dann "Duplicate identifier"
Luigi, man wendet sich nich gegen Familie...
 

Lion

BeitragSo, Dez 06, 2009 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Dim lol(20,20)

resize()
Function resize()
   Dim lol(40,30)
End Function


geht bei mir ohne probleme
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Akiba

BeitragSo, Dez 06, 2009 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, hab eine Dimension vergessen anzugeben .... Embarassed

Jetzt gehts ^^
Luigi, man wendet sich nich gegen Familie...

mpmxyz

BeitragMo, Dez 07, 2009 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir mal ein paar Gedanken zu deinem Problem gemacht.
Das ist dabei herausgekommen:
1. Du brauchst nur eine For-Schleife und nur einen Type, wenn du nur eine Tabelle hast und man einen relativ "naiven" Weg nehmen möchte.
Dieser Weg ist aber immer noch besser als dein Weg.
(Suche erst die Zeile und suche mit Hilfe der Schleifenvariable "runter\Y" nach einem Eintrag aus einem anderen Type... Das Field "Y.dim2" zeigt auf einen dim2-Eintrag und ist daher kein eigener Type!)

BlitzBasic: [AUSKLAPPEN]
Type Feld
Field Zeile
Field Spalte
Field Wert
End Type

...
Local F.Feld
For F=Each Feld
If F\Zeile=gesuchtY And F\Spalte=gesuchtY Then machEtwas()
Next


2. Bei einer weiter optimierterten, aber etwas komplizierteren Variante braucht man wieder 2 Types:
BlitzBasic: [AUSKLAPPEN]
Type Zeile
Field erstes.Feld
Field ZeileNr
End Type

Type Feld
Field Zeile.Zeile
Field SpalteNr
Field Wert
End Type

Man hat aber bei der Programmierung einen größeren Aufwand, da sich unter den Einträgen vom ersten bis zum letzten Feld einer Zeile kein anderes zu einer anderen Zeile gehörendes Feld befinden darf.
Die Suche läuft so ab:
Code: [AUSKLAPPEN]
Finde das Zeilenobjekt zur Zeilennummer
Gehe vom ersten bis zum letzten Feldobjekt, das zur gefundenen Zeile gehört und schaue, ob es zur Spaltennummer gehört.
Wenn das zutrifft, dann ist das aktuelle Feld das gesuchte Feld.


Bei der ersten Methode musst du im Extremfall bei einer x*y-Tabelle x*y Einträge durchsuchen.
Bei der zweiten Methode musst du maximal nur x+y Einträge durchsuchen.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Silver_Knee

BeitragMo, Dez 07, 2009 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
da fällt mir doch glatt der Optimierungsthreat ein:

https://www.blitzforum.de/foru...246#260246

Hab das problem auch schon gehabt.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group