Entwickler-Ecke
Dateizugriff - Speichern von mehrdimensionalen dynamischen Arrays
Delete - Sa 19.04.03 19:50
Titel: Speichern von mehrdimensionalen dynamischen Arrays
Hallo, ich brauche dringend und schnell Hilfe!
Wie kann ich ein dynamisches, mehrdimensionales Array mit nem filestream speichern? Geht das überhaupt?
Wenn da jemand auf die Schnelle ein paar Codeteile hat, dann wäre das natürlich super.
Danke schon mal für eure Antworten.
Greetz FloF
wulfskin - So 20.04.03 01:44
Hallo FloF!
Wenn du mir sagst welche Daten der Array beinhaltet und wie ich herausbekomme, wieviel Ebenen es gibt, dann kann ich dir helfen!
Gruß wulfskin!
Delete - So 20.04.03 10:07
Also:
Ich hab sowohl Arrays mit Integer als auch mit String.
Die Arrays mit String haben zweimal nur eine dimension und einmal is es ne matrix.
Die Arrays mit Integer haben einmal 2 Dimensionen und einmal 4.
Bei den mehrdimensionalen Arrays sind in der 2. bzw 3. und 4. Dimension verschiedene Längen enthalten.
So, das wärs dann soweit auch schon. Wäre ne super sache, wenn du mir da helfen könntest.
THX schon mal im Voraus
FloF
Lehrling - So 20.04.03 11:14
Hallo,
| Zitat: |
| Ich hab sowohl Arrays mit Integer als auch mit String. |
Das mit Strings ist so ne sache, da AnsiStrings Pointer sind.
| Zitat: |
| Die Arrays mit String haben zweimal nur eine dimension und einmal is es ne matrix. |
Was verstehst du unter Matrix?
| Zitat: |
| Bei den mehrdimensionalen Arrays sind in der 2. bzw 3. und 4. Dimension verschiedene Längen enthalten. |
Einfach die Längen speichern und dann den Array.
mfg Lehrling
Delete - Mo 21.04.03 12:03
1) Es sind keine AnsiStrings
2) Matrix = 2 Dimensionen, Entschuldigung für die undeutliche Ausdrucksweise
3) Das klingt ja relativ einfach. ich kann aber nicht ganz glauben dass es so geht. Aber um ohne lang drum herum zu reden, meintest du es so:
Quelltext
1: 2: 3: 4: 5: 6:
| ... filestream.WriteBuffer(Length(mArray), SizeOf(Length(mArray))); for i:=0 to High(myArray) do filestream.WriteBuffer(Length(myArray[i]), SizeOf(Length(mArray[i]))); filestream.WriteBuffer(myArray, SizeOf(myArray)); ... |
mfg FloF
FloSch - Mo 21.04.03 12:42
Hallo,
das Beste wäre es doch: zeig uns einfach mal deine Arrays.
Grüße
Florian :roll:
wulfskin - Mo 21.04.03 22:15
Hallo FloF!
Nurmalerweise geht es ganz einfach: Du musst zunächst die Länge des Arrays speichern und dann einfach den Array durchgehen und die einzlenen Daten speichern. Bei Strings musst du zusätzlich die Länge speichern. Das awrs auch schon.
Jetzt habe ich noch ein Ausschnit aus einer Klasse die das Speichern von Strings vereinfacht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure TFileStreamEx.WriteString(const S: String; const WriteLength: Boolean = True); var Len: Word; begin Len := Length(S); if WriteLength then Write(Len, SizeOf(Len)); if Len > 0 then Write(Pointer(S)^, Len); end;
function TFileStreamEx.ReadString(const Len: Word): String; begin SetLength(Result, Len); if Len > 0 then Read(Pointer(Result)^, Len); end;
function TFileStreamEx.ReadString: String; var Len: Word; begin Read(Len, SizeOf(Len)); Result := ReadString(Len); end; |
Gruß wulfskin!
Delete - Mo 21.04.03 22:24
Danke für deine Hilfe wulfskin. Ich werd das ganze gleich einbauen.
ich dachte mir nur, dass es vielleicht auch eine einfachere Variante gibt. Soweit ich informiert bin funktioniert das speichern von statischen Arrays durch ein simples:
Quelltext
1:
| FileStream.WriteBuffer(MyArray, SizeOf(MyArray)); |
Sprich es muss keine länge gespeichert werden.
Aber nochmals danke.
Greetz FloF
wulfskin - Mo 21.04.03 22:46
| FloF hat folgendes geschrieben: |
| Sprich es muss keine länge gespeichert werden. |
Jo, ist leider so. Aber man kann Delphi verstehen ;). Woher soll es auch wissen, wi lange die Strings sind!
mimi - Fr 25.04.03 23:12
pack doch die variablen in ein record und speich den ab....
wulfskin - Sa 26.04.03 00:24
| mimi hat folgendes geschrieben: |
| pack doch die variablen in ein record und speich den ab.... |
| wulfskin hat folgendes geschrieben: |
| Bei Strings musst du zusätzlich die Länge speichern. Das wars auch schon. |
Das gilt genauso für Strings, die im Record gespeichert sind...
mimi - Sa 26.04.03 13:10
ich mache es immmer so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| for y:=indexof('Draw_Karte {')+1 to IndexOf('Draw_Karte }')-1 do begin for x:=0 to MapX+1 do begin str:=Strings[y]; if (str[x] = '#') and (Map[x-1,y-indexof('Draw_Karte {')-1].typ = None) then begin // Eine Wand Map[x-1,y-indexof('Draw_Karte {')-1].typ:=wand; Continue; end; if str[x] in ['A'..'Z'] then begin // Eine PlatteY SetLength(Platten, HIGH(Platten)+2); Platten[HIGH(Platten)].x:=x-1; Platten[HIGH(Platten)].y:=y-indexof('Draw_Karte {')-1; Platten[HIGH(Platten)].Typ:=PlateX; Platten[HIGH(Platten)].Speed:=ord(Str[x])+1-65; Platten[HIGH(Platten)].run:=True; Platten[HIGH(Platten)].PlayerColi:=False;
Continue; end; |
und dabei kommt dann sowas rauß:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| Optionen { DefaultExt:bmp Images:~bilder Game_Backgrund:~backgrund Player_Pos:1,22 }
Draw_Karte { ######################################## # # ###################################### # # | | | | | # # G # # # # | | | # # # #K # # | | | | |# # ###################################### #L z L# #M M# ###################################### # #||# j | | -# # # # -# # # # - # # # # # # #- # # # - # # #- | |# # ## ################################## # u -# ######################################## Draw_Karte } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!