Fehler bei Zuweisung von Sring in Mehrdimensionaler Tabelle

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Fehler bei Zuweisung von Sring in Mehrdimensionaler Tabelle

Beitrag von niederrheiner »

Hallo an Alle,
ich schon wieder.
Bei der folgenden Zuweisung titt der Fehler

fpc_ansistr_decr_ref

auf.

Code: Alles auswählen

erg_fields     : Array of Array of String;
sZw            : String;
i,j,f,r           : Integer;
 
SetLength(erg_fields.e ,r, f);     // r=1 , f=2
erg_fields[i,j] := sZw;                                                       //sZw = '1', i =1, j=1
Was ist da falsch?

Danke für Eure Hilfe und Tipps.

Bis dann ...
MfG
Günter

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Was solle denn erg_fields.e sein bei SetLength? (Beachte das .e )

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Beitrag von niederrheiner »

Hallo Theo,
theo hat geschrieben:Was solle denn erg_fields.e sein bei SetLength? (Beachte das .e )
das ".e" ist ein Tippfehler. richtig muss es heissen

"setlength(erg_fields,r,f)"

Bis dann ...
MfG
Günter

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Durachaus denkbar das mehrdimensionale dynamische arrays noch buggy sind. Ich hab diese nie benutzt und auch in fremdem Code nicht gesehn.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Ich habe ein Mathematik-Software-Paket, das auf Matrix-Verarbeitung mit mehrdimensionalen dynamischen arrays basiert. Das könnte ich 'mal mit Lazarus testen.

Aber eigentlich sollte mehrdimensional kein Problem sein ist doch nur ein eindimensionales Array, dessen Elemente zufällig Arrays sind...

-Michael

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Mehrdimensionale Array mit strings funktionieren bestens, sollte also kein Problem sein.

Aber ich spreche sie dabei als einzelne Arrays an, kann sein, das Lazarus da probleme hat, wenn du die Länge für beide setzen willst, bzw. beide Indizes übergibst.

Code: Alles auswählen

SetLenght(erg_fields, r);
//Schleife; x hochzählen von low(Array) to high(Array)
SetLenght(erg_fields[x], f);
//Zuweisung bspw. so:
erg_fields[0][1] := sZw;
Was ich also ausdrücken will, ist, das es geht, wenn man die beiden Arrays aufsplittet und separat die Längen setzt, natürlich dann für jede 'Zeile'. Du müsstest also die Zweite Zeile in die Schleife tun, und das x hochzählen.
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich habe die Erfahrung gemacht wenn die Array Mehrdimensional sind und dann Dynamisch das dann die Code Vervollständigung nicht klappt. Aber der Kompiler geht.
MFG
Michael Springwald

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Beitrag von niederrheiner »

Hallo Johannes,
monta hat geschrieben:Mehrdimensionale Array mit strings funktionieren bestens, sollte also kein Problem sein.

Aber ich spreche sie dabei als einzelne Arrays an, kann sein, das Lazarus da probleme hat, wenn du die Länge für beide setzen willst, bzw. beide Indizes übergibst.

Code: Alles auswählen

SetLenght(erg_fields, r);
//Schleife; x hochzählen von low(Array) to high(Array)
SetLenght(erg_fields[x], f);
//Zuweisung bspw. so:
erg_fields[0][1] := sZw;
Was ich also ausdrücken will, ist, das es geht, wenn man die beiden Arrays aufsplittet und separat die Längen setzt, natürlich dann für jede 'Zeile'. Du müsstest also die Zweite Zeile in die Schleife tun, und das x hochzählen.

danke für Deine Antwort. Ich habe Deinen Vorschlag bei mir eingebaut aber nach Ausführung Deiner Zeile 5 kam bei mir folgender Fehler

"fpc_dynarray_setlength"

konkret sieht der betreffende Codeteil bei mir so aus

Code: Alles auswählen

SetLength(e.erg_fields,r);
               for i := 1 to e.erg_anz_record do
               begin
                   SetLength(e.erg_fields[i],f);
                   for j := 1 to e.erg_anz_fields do
                   begin
                        sP := p.para_fields[j - 1];
                        sZw :=  p.para_query.FieldByName(sP).AsString;
                        e.erg_fields[i][j] := p.para_query.FieldByName(sP).AsString;
                   end;
                   p.para_query.Next;
               end;
Ich habe Dich doch richtig verstanden?

Bis dann ...
MfG
Günter

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

niederrheiner hat geschrieben:Ich habe Dich doch richtig verstanden?
Ja, soweit hast du mich richtig verstanden, aber auf jeden Fall gibts da noch ne Kleinigkeit:

Dynamische Array fangen bei 0 an.
Nehmen wir mal an: Setlength(DynArray, 3)
Low(DynArray) liefert im Prinziep immer 0.
High(DynAray) den index des letzten Eintrages, also in dem Fall 2, und length(DynArray) liefert die Länge, also 3.

Code: Alles auswählen

SetLength(e.erg_fields,r);
               for i := 0 to r - 1 do
//oder:  for i := 0 to high(e.eerg_fields) do
               begin
                   SetLength(e.erg_fields[i],f);
                   for j := 0 to e.erg_anz_fields - 1 do
                   begin
                     //...
Johannes

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Beitrag von niederrheiner »

Hallo Johannes,
monta hat geschrieben: Dynamische Array fangen bei 0 an.
das war wohl der entscheidene Tipp. Das Arrays immer mit 0 anfangen war mir wohl bekannt, das aber der Beginn mit 1 solche Auswirkungen auf die Prozedure fpc_dynarray_setlength hat hätte ich nicht gedacht.

Nochmals Danke für Deinen Tipp und bis zum nächsten Problem /wegduck/

Bis dann ...
MfG
Günter

Antworten