Wiederholtes ReDim & befüllen bei 2D-Array erzeugt IMA

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Wiederholtes ReDim & befüllen bei 2D-Array erzeugt IMA

Beitrag von D@nte »

Ja ich weiß der Titel is toll, nur is mir keine bessere "Erklärungen" eingefallen.

Also ich hab folgendes Problem (und seh den Wald vor lauter Bäume wahrscheinlich einfach nicht), in meinem Programm füll ich ein 2D-Array und ein ListIconGadget mit Werten aus ner CSV-Datei, so weit kein Thema.
Nur Wenn ich das ListIconGadget und den Counter für die Einträge leere bzw auf 0 setze und alles wieder neu befülle bekomm ich nen IMA.

Hab das ganze mal in nen Beispielcode gepackt der den IMA erzeugt...

Aber irgendwie find ich nit raus woran's liegt

Code: Alles auswählen

Dim entries.s(6,1)

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k

listlength = 0

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
Zuletzt geändert von D@nte am 07.06.2007 17:08, insgesamt 1-mal geändert.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

So vielleicht?

Code: Alles auswählen

Dim entries.s(6,1)

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k

; listlength = 0

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

@PBProgger
Ne dann hätt ich ja auch gleich

Code: Alles auswählen

Dim entries.s(6,1)

For k = 0 To 4
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
machen können...
Wenn listlength nit auf "0" gesetzt wird beschreibt er mein Array ja nich neu sondern schtreibt an dem letzten Index weiter.

@ts-soft
>Nein, der Fehler tritt auf sobald ein zweiter Block im Spiel ist. Die beiden Blöcke für sich funktionieren ja (sind ja auch identisch)

Irgendwie hilft mir das grad nit weiter bzw bin zu blöd zu kapieren was du mir sagen willst :oops:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

D@nte hat geschrieben: @ts-soft
>Nein, der Fehler tritt auf sobald ein zweiter Block im Spiel ist. Die beiden Blöcke für sich funktionieren ja (sind ja auch identisch)

Irgendwie hilft mir das grad nit weiter bzw bin zu blöd zu kapieren was du mir sagen willst :oops:
Fehler meinerseits, habs gelöscht :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Hm, ist das ein PB bug?

Code: Alles auswählen

Dim entries.s(6,1)

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len+1 To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k

Debug ""
listlength = 0

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = listlength - len+1 To listlength
    For j = 0 To 6
      Debug "Auf Übers. testen (i): "+Str(i)+" ;i darf bis zu (listlength): "+Str(listlength)
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
es wird nichts überschritten...


//Edit:

Hab die Ausgabe ein bischen anschaulicher gemacht...

//Edit:

Ist eigendlich dumm von mir zu glauben das i überschritten wird :lol:

Code: Alles auswählen

For i = listlength - len+1 To listlength
kann ja nur dazwischen sein :lol:
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Bei nem statischen Werten bei len von 44 (len = 44) und drüber tritt der IMA auf bei weniger als 44 nit...

Ich kapier nit wieso...
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

so funzt es auch ist aber blöd:

Code: Alles auswählen

Dim entries.s(6,1)

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  Debug listlength
  ReDim entries.s(6,listlength)

  For i = listlength - len+1 To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k

Debug ""
listlength = 0

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  listlength = 300
  ReDim entries.s(6,listlength)

  For i = listlength - len+1 To listlength
    Debug "Auf Übers. testen (i): "+Str(i)+" ;i darf bis zu (listlength): "+Str(listlength)
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
Ich kapiers auch nicht :cry: .


//Edit:

:lol: wenn man nur zB 60 verwendet dann funzt es einmal nicht und einmal schon :lol:

Code: Alles auswählen

Dim entries.s(6,1)

For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  Debug listlength
  ReDim entries.s(6,listlength)

  For i = listlength - len+1 To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k

Debug ""
listlength = 0

For k = 0 To 2
  len = Random(60)
  listlength = listlength + len
  listlength = listlength + len
  ReDim entries.s(6,listlength)

  For i = listlength - len+1 To listlength
    Debug "Auf Übers. testen (i): "+Str(i)+" ;i darf bis zu (listlength): "+Str(listlength)
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
Ihr müsst den Code ein paar mal ausführen. Irgendwann einmal fuzt es :lol: .
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Wann löschte den Post jetzt wieder?! :twisted:

Dein Lösung funktioniert auch nicht den ein

Code: Alles auswählen

  len = Random(300)
  listlength = listlength + len
  listlength = 300 
bringt mir rein gar nix, weil mein "2tes" Array dann immer nur 300 Einträge hat, es muss aber immer größer werden ;)

>Ihr müsst den Code ein paar mal ausführen. Irgendwann einmal fuzt es
Nit wirklich effektiv...

[Edit]
Bin noch auf die glorreiche Idee gekommen mit anders dimensionierten Arrays zu testen...
Ein eindimensionales Array kann ich mit beliebig vielen Werten füllen ohne das der IMA auftritt, nur bei 2 und mehr dimensional Arrays kommt der IMA und das immer nachdem die 2te For-Schleife das 2te mal durchläuft also bei

Code: Alles auswählen

Debug "-----"
listlength = 0

For k = 0 To 2
  len = Random(299) + 1
  listlength = listlength + len
  Debug "len = " + Str(len)
  ReDim entries.s(6,6,listlength)
  Debug "listlength = " + Str(listlength)

  For i = listlength - len To listlength
    For j = 0 To 6
      For l = 0 To 6
        Debug "entries(" + Str(j) + "," + Str(l) + "," + Str(i) + ") = " + Str(i * l * j)
        entries(j,l,i) = Str(i * l * j)
      Next l
    Next j
  Next i
Next k
listlength = 0
len = 82
listlength = 82
len = 21
listlength = 103

Der IMA kommt bei entries(0,0,83) also nach der 2ten Erhöhung von listlength wird For i = listlength - len To listlength noch einmal komplett ausgeführt...[/code]
Zuletzt geändert von D@nte am 07.06.2007 16:49, insgesamt 1-mal geändert.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

achso, das wusste ich nicht...

Den vorherigen Post habe ich gelöscht weil es einmal funzte und wie ich ihn geschrieben habe und nochmal probierte fuzte er wieder nicht :cry: .
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Code: Alles auswählen

Dim entries.s(6,0)
; [PSEUDO] Array & ListIconGadget mit Daten aus .csv-Datei füllen
For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = (listlength - len) To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
; [PSEUDO] Array & ListIconGadget leeren, Counter auf 0
Dim entries.s(6,0) ; <- hier mit geht's
listlength = 0
; [PSEUDO] Array & ListIconGadget wieder mit Daten aus .csv-Datei füllen
For k = 0 To 2
  len = Random(300)
  listlength = listlength + len
  ReDim entries.s(6,listlength)
  Debug listlength

  For i = (listlength - len) To listlength
    For j = 0 To 6
      entries(j,i) = Str(i * j)
    Next j
  Next i
Next k
Hab anscheinend die Lösung dank nem Post von Kaeru in nem ganz anderen Zusammenhang...

Allerdings bleibt immernoch die Frage, wieso funktioniert mein ursprünglicher Code nicht?!
Ist das wirklich nen BUG?!
Antworten