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 }