Großes Array initialisieren

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Großes Array initialisieren

Beitrag von Rolf »

Hallo
Ich muss ein großes Array mit mehr als 512 Int-Werten vorbelegen, wie macht man das am besten.

Code: Alles auswählen

LOCAL aEl8      := Array(512)
aEL8 := { 352, 77, 373, 504, 35, 599, 428, 207, 409,.......}
Beim Compilieren kommt dann.
"XBT0400: Internal error: contact ALASKA technical support"

Ich möchte nun nicht unbedingt aEL[1]:=352 .... nehmen, gibt es einen besseren Weg?

Danke
Rolf
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Großes Array initialisieren

Beitrag von Koverhage »

Rolf,

kommt die Fehlermeldung schon bei Array(512)
oder bei aEL8 := { 352, 77, 373, 504, 35, 599, 428, 207, 409,.......} ?
Normal kannst Du doch das doch so machen
Local aEL8 := { 352, 77, 373, 504, 35, 599, 428, 207, 409,.......}
Gruß
Klaus
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Großes Array initialisieren

Beitrag von Martin Altmann »

Rolf,
soweit ich mich erinnere, ist das "normal", da zu viel Speicher in einem Rutsch allokiert werden soll.
Versuch es in kleineren Schritten, in 64-Elemente-Happen z.B...

Code: Alles auswählen

LOCAL aEl8      := {}
aAdd( aEL8, { 352, 77, 373, 504, 35, 599, 428, 207, 409,.......} )
aAdd( aEL8, { .......} )
... 
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: Großes Array initialisieren

Beitrag von Rolf »

@Koverhage
Koverhage hat geschrieben:kommt die Fehlermeldung schon bei Array(512)
oder bei aEL8 := { 352, 77, 373, 504, 35, 599, 428, 207, 409,.......} ?
Normal kannst Du doch das doch so machen
Local aEL8 := { 352, 77, 373, 504, 35, 599, 428, 207, 409,.......}
Erst wenn die Zeile ":= {...}" vorhanden ist kommt eine Meldung beim compilieren. Mit
265 Array-Elementen funktioniert es noch.

@Martin
Deine Lösung erzeugt doch ein Mehrdimensionales-Array. Was sich dann wiederum schlechter durchlaufen lässt. Mal überlegen...

... Es geht auch noch mit 511 Integer-Elementen.

Danke Rolf
Zuletzt geändert von Rolf am Do, 02. Okt 2008 13:24, insgesamt 1-mal geändert.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Großes Array initialisieren

Beitrag von Tom »

Code: Alles auswählen

aEl1 := { 1, 2, 3, 4 ... } // 256 Elemente
aEl2 := { 1, 2, 3, 4 ... } // auch 256
for i := 1 to len(aEl2) // oder to 256
  aadd(aEl1,aEl2[i])
next
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Großes Array initialisieren

Beitrag von Koverhage »

Dann würde ich das so machen:

Local aArray := {}

aadd(aArray,352) // wert 1
aadd(aArray,77) // wert 2

ist zwar ein wenig mehr Schreibaufwand

oder eine DBF Datei erstellen und die Werte daraus bei Programmstart bzw. wenn diese zum ersten Mal benötigt
werden auslesen und die Datei schließen.
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Großes Array initialisieren

Beitrag von Koverhage »

Habe mich gerade daran erinnert das ich auch so einen ähnlichen Fall habe
sind auch genau 512 Einträge. Es war mir damals zuviel Tipparbeit direkt ein Array anzulegen.

Code: Alles auswählen

static procedure ini_gtab
Local h_sel := select()
if !Fexists(cAppData+"ktabelle.dbf")
   msgbox("Die Datei "+cAppData+"Ktabelle.dbf fehlt, Datenverzeichnis zerstört?, bitte Support kontaktieren!" )
   return
endif
use (cAppData+"ktabelle.dbf") alias bw NEW
("bw")->(dbgotop())
do while !("bw")->(eof())
   AAdd( aBwstufe, {("bw")->kg_min,("bw")->kg_max} )
   ("bw")->(dbskip(1))
enddo
("bw")->(DbCloseArea())
select(h_sel)
return
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Großes Array initialisieren

Beitrag von brandelh »

Martin Altmann hat geschrieben:Rolf,
soweit ich mich erinnere, ist das "normal", da zu viel Speicher in einem Rutsch allokiert werden soll.
Versuch es in kleineren Schritten, in 64-Elemente-Happen z.B...
Das ist nicht ganz richtig.

Das Problem sind nicht die 512 Einträge im Array, sondern die direkte Zuweisung
von aA := {...} 512 Elementen. Ich vermute das haut den Präprozessor auseinander.

So jedenfalls geht es:

Code: Alles auswählen

proc main
   local aA := Array(4096) // ich wollte es wissen ;-)
   local x, nMaxX := len(aA)
   ? "OK",nMaxX
   for x := 1 to nMaxX
       aA[x] := x
   next
   ? "Ende"
endif
falls du jetzt die Integers nicht nochmal eintippen willst, kannst du die kleineren zum Laden nehmen, aber bitte nicht mit add() bei der Menge ;-)

Code: Alles auswählen

x := 1
aM1 := {1,2,3,4,5,6,...}
aM2 := {1,2,3,4,5,6,...}
etc.
aeval(aM1,{|nW| aZiel[x] := nW, x++ })
aeval(aM2,{|nW| aZiel[x] := nW, x++ })
etc.
so sollte das am schnellsten gehen ;-) 
bei direkter Eingab könnte dir auch das gefallen:

Code: Alles auswählen

x := 1
aA[x++] := ...
Übrigens wird duch aA := {x,x,x} die vorher erfolgreiche aA := array() wieder aufgehoben !
Gruß
Hubert
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: Großes Array initialisieren

Beitrag von Rolf »

Danke für eure Ausführungen.

@ Hubert
Vielen Dank wie immer sehr ausführlich :thumbright:. Ich werde mich für die Variante aeval() entscheiden. Da noch ein größeres Array wartet.

Danke an alle
Rolf
Antworten