Skiller hat geschrieben:Hallo Nic,
sorry erst mal für die Verspätung. Also, ich will das Ding nicht weiter aufbauschen, aber nach wie vor hab ich keine laufende Array-Version. Die Kernfrage ist doch: Gehts mit verschachtelten StrukturArrays oder eben nicht.
Ja, das geht, aber nicht so wie du denkst. Statische Arrays in Structures kann man eben nachträglich nicht mehr in der Größe ändern. Deshalb hab ich dir ja einen Code im zweiten Post in diesem Thread programmiert, der es so macht wie du es vorhattest, nur eben richtig.
Skiller hat geschrieben:Wenn halt dieser blöde ".i" Fehler nicht gewesen wäre. Im Grunde hat der ganze Schwanz der Einzelheiten nicht viel Sinn, da es besser ist eine lauffähige Version mit diesem Gedankenansatz hineinzustellen. Das erspart viel Zeit und Schreiberei. Oder es funzt eben nicht. Ich kann mir einfach nicht vorstellen, dass das banale Progrämmchen eben an diesem besagten ".i" Fehler scheitert.>_<Oder es liegt eben an meinem Rechner. (Glaub ich aber auch nicht).
Es liegt auch nicht an deinem Rechner, denn den selben Fehler hab ich hier auch unter Linux. Und es ist auch klar, warum das passiert. Nämlich weil du in einen ungültigen Speicherbereich schreibst.
Also nochmal: Einfacher kann ich es fast nicht mehr machen. Da musst du schon mal selbst deinen Code Zeile für Zeile durchgehen und schauen, ob das alles so korrekt ist:
Code: Alles auswählen
EnableExplicit
Define.i i, j
;----------------------
Structure s_Rechnung
R_Nr.i
Menge.i
Art.s
Preis.f
EndStructure
Dim Rechnung.s_Rechnung(0)
Structure s_Kunde
K_Nr.i
Name.s
Alter.i
;---------------------
Rechnung.s_Rechnung[0]
EndStructure
Dim Kunden.s_Kunde(0)
For i = 0 To 3
Debug "j = " + j ;j ist an dieser Stelle zuerst 0, dann 4 wegen der For-Schleife in Zeile 26
If ArraySize(Rechnung.s_Kunde()) < j ;Rechnung() hat in Zeile 10 noch den Typ s_Rechnung, warum jetzt s_Kunde?
ReDim Kunden.s_Kunde(i) ;Warum änderst du die Größe von Kunden(), wenn eine Zeile drüber etwas von Rechnung() steht?
EndIf
For j = 0 To 3
If ArraySize(Rechnung.s_Rechnung()) < j ;Dieses If ist soweit korrekt. Wenn es zu wenige Elemente in Rechnung() gibt, erhöhe sie
ReDim Rechnung.s_Rechnung(j)
EndIf
Kunden.s_Kunde(i)\Rechnung[j]\R_Nr = i ;In Zeile 28 hast du die Größe von Rechnung() angepasst,
;Kunden(i)\Rechnung[] hat aber immer noch 0 Elemente und das wird sich auch nicht ändern
Debug Str(i)+", "+Str(j)+", "+Str(Kunden.s_Kunde(i)\Rechnung[j]\R_Nr)
Next j
Debug "-----------------------"
Next i
Wenn du genauer schaust, wird auch Rechnung() nie irgendwo beschrieben oder ausgelesen. Das Array wird nur in der Größe geändert. Das statische Rechnung[]-Array innerhalb der Kunden-Struktur wird allerdings beschrieben und gelesen, allerdings mit ungültigen Indices, da es von Anfang an 0 Elemente hat, so wie es in Zeile 17 definiert ist. Dass also irgendwann ein Speicherfehler auftritt und der noch mit der Größe des Typs von R_Nr zu tun hat ist eher Zufall. Eigentlich sollte es bei egal welchem Typ einen Fehler geben.
Skiller hat geschrieben:
Skiller wrote:
Quote:
Array Rechnung.s_Rechnung(0)
5. Jetzt meckert er. (zumindest bei mir) Außerdem hilft mir "Meckern" nicht viel weiter. Welche Fehlermeldung kommt denn genau?
Code:
Code: Alles auswählen
Structure s_Kunde
K_Nr.i
Name.s
Alter.i
;---------------------
Array Rechnung.s_Rechnung[0] ; hier meckert er und sagt: " 'Dim' Syntax lautet: Dim Arrayname(nb)"
EndStructure
Welche PB-Version hast du denn?
PB 5.11 x(86), x(64) hab ich allerdings noch nicht probiert!.
Schau mal genau hin.

Stichwort "Klammern".
Ich hoffe du hast es mittlerweile verstanden, falls nicht, schau dir meinen Code bitte so oft an, bis du es verstehst. Und frag dich auch, wieso du in deinem Code zwei Arrays für die Rechnungen hast. Einmal in Zeile 10 und einmal in Zeile 17. Das ist doch schon von vornerein unlogisch, findest du nicht?