Lisp > Configuations Daten pasen ?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
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)

Lisp > Configuations Daten pasen ?

Beitrag von pluto »

Hallo,
seit einiger zeit frage ich mich wie ich solche Dateien hier Pasen könnte:

Code: Alles auswählen

(supertux-tiles
  (tilegroup
    (name "Snow")
    (tiles
      7    8    9    202
      13   14   15   204
      10   11   12   206
      16   17   18   205
      30   31   114  113
      21   22   19   203
      20   23   207  208
      115  116  0    0
      117  118  0    0
      122  209  123  0
      124  210  125  0
      1345 1346 1344 0
      33   32   34   1741
      35   37   39   1740
      38   36   43   1739
      40   41   42   1815
      119  121  120  1816
      1539 0    0    0
      0    1826 1827 0
      1829 1830 1831 1832
      1833 1834 1835 1836
      1837 1838 1843 1844
      1839 1840 1845 1846
      1841 1842 1847 1848
      0    0    1849 1850
      )
  )
  (tilegroup
    (name "Snow (Paralax Background)")
    (tiles 149  160  151 158
           152  153  154 159
           155  156  157 0
           161  162  163 170
           164  165  166 171
           167  168  169 1343
           0    0    0   1342 )
  )
  (tilegroup
das ist jetzt einfach mal aus der Datei /usr/share/supertux/images/tiles.strf kopiert.

ich habe angefangen einen Paser zu schreiben:

Code: Alles auswählen

function TPlConfigFile.ReadString(aDir, aKey: String): String;
var
  str,str1,s2:String;
  i,t,nt:Integer;
  gefunden:Boolean;
begin
  str:=''; str1:=''; t:=1;
  str1:=GetToken(adir,'/',t);
  nt:=NumToken(aDir,'/'); Gefunden:=False;
  s2:='';
 // writeln(nt);
  for i:=0 to st.Count-1 do begin
//    writeln(st[i],'/',s2+'('+str1);
    if (not Gefunden) and (TrimLeft(st[i]) = '('+str1) then begin
      if t+1 <=nt then begin
        inc(t);
        str1:=GetToken(adir,'/',t);
        //writeln(str1);
//        s2:=s2+'  ';
 
      end
      else Gefunden:=True;
    end;
 
 
    if (gefunden) and (pos(akey,st[i]) >0) then begin
      str:=st[i];
      break;
    end;
  end;
 
  result:=str;
end;
Die Idee bis jetzt gekallpt auch ganz gut.

Nur ich frage mich jetzt name "Snow") finden sollte.

Ich dachte ich hänge noch ein Paramter dran, in dem der "Value" wert drin stehen muss...

so wird das ganze aufgerufen:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  plConfig:=TPlConfigFile.Create('/usr/share/supertux/images/tiles.strf');
  Writeln('ReadString:',plConfig.ReadString('supertux-tiles/tilegroup','name'));
  application.Terminate;
end;
Habt ihr Vorschläge ? wenn ja welche

edit: in der Doku steht drin von Supertux das S-Expressions verwendet wird, aber ich finde dazu nichts passendes in google:
http://supertux.lethargik.org/wiki/S-expr" onclick="window.open(this.href);return false;
MFG
Michael Springwald

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 »

Das ganze folgt doch einem ganz einfachen Prinzip, ein Element steht immer zwischen () und kann belibig verschachtelt werden dadurch ergibt sich ne baumstruktur die man ganz einfach lesen können sollte. man muss sich halt nur datenstrukturen dazu basteln das ginge sogar super über treader / twriter
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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 »

nein über TRead und TWriter würde das nicht gehen, da sie Laufzeit Fehler Meldungen geben würden, weil kein typ vor dem String steht.
oder habe ich jetzt was falsch verstanden ?
Weil TWrite schreibt doch immer die länge und den typ vor dem String oder was auch immer.

mir geht es jetzt eigentlich um folgendes:
supertux-tiles
(tilegroup
(name "Snow")
wie soll ich die werte darunter speichern ?
in einer TSTringlist ? die Reihfolge spielt eine wichtige rolle
ich möchte dieses Format erstmal nur lesen können.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Lese das ganze erstmals in eine TV ein.

Regel:
Klammeröffnen erstellt einen neuen Node
Klammerschliessen beendet den Node

Daten ist alles was Zahlen oder in Hochkomma ist, alles andere sind Bezeichner.

Das System ist ähnlich von xml files bzw. DOM aufgebaut.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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 »

naja, eine TV würde mir nix nützen: hintergrund: ich möchte einen kleinen Level-View basteln später soll das ein Editor werden.

Das Dateiformat habe ich auch schon verstanden, also wie jetzt z.b. Bilder gespeichert werden,

ich wollte jetzt ein Array anlegen wo ich alle titelgrubs einfüge ich glaube das geht nicht dynamisch naja oder halt mit Aufwand !
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

pluto hat geschrieben:naja, eine TV würde mir nix nützen: hintergrund: ich möchte einen kleinen Level-View basteln später soll das ein Editor werden.

Das Dateiformat habe ich auch schon verstanden, also wie jetzt z.b. Bilder gespeichert werden,

ich wollte jetzt ein Array anlegen wo ich alle titelgrubs einfüge ich glaube das geht nicht dynamisch naja oder halt mit Aufwand !
Das erste ist, wenn du es in einer Treeeview hast, dann kannst du es mit Laz angreifen und es auch später wieder speichern. Mit einem starren Gebilde wie einem Array kommst du nur von Problem zu Problem. Das Format wurde gewählt um Datenmengen abzubilden, die nicht durch starre Begrenzungen zu definieren sind.

Ausserdem wnn du es in eine TV bekommst, dann hast du dir bereits die Möglichkeiten zur Speicherung in DOM bzw. XML geschaffen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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 kann dir noch nicht ganz folgenden. Du meinst ich sollte die gesammte Datei erstmal versuchen in einer TV zu bringen ?

Meinst du nur von der Struktur her oder auch richtig in eine TV ?

Du hast schon irgendwie recht, im nachhinein, wenn man das Problem als Baum betrachtet, würde es sehr viel einfacher werden.

Ich denke, mein ersten ansatzt ist doch schon im Prinzip so oder ?

Eigentlich wollte ich nicht alles auf einmal laden müssen, sondern nur das was benötigt wird.
Gut von dieser Datei kann alles benötigt werden.

Aber wir sollte man die ganze listen im Baum da stellen ?
sind das einfach nur spalten ? die einen Eintrag zu geordnet sind ?

Im Prinzip habe ich mir das so vorgestellt:
Alle Gruppen sollen in einer ComboBox.
Die Zahlen sind ID'S, wie ich herrausgefunden habe, welche ID was ist, steht weiter unten in der Datei.

Die ID'S wiederrum sind Objekte, Grafik Objekte. Sie stellen z.b. ein Gegenstand im spiel dar.

so wie ich das ganze verstanden habe bis jetzt.

Diese Gruppen sind nur für ein Level Editor von Bedeutung.
Diese Gruppen wollte ich in einen Array speichern und dann in ein 4D array. weil es immer 4 spalten sind.

PS: ich Frage mich warum wird das ganze nicht einfach im ini Format gespeichert. Ist genau so gut. Gut leserlich und kann gut bearbeitet werden. Warum wird immer XML oder halt dieses Format genommen(den namen weiß ich nicht genau, ich weiß halt nur das es lisp ist).

Ich kann mir nicht vorstellen das in diesen Dateien von "Menschen" Änderungen gemacht werden müssen, das tut doch ein Programm - Ein Editor(Level).

Im Prinzip weiß ich was ich zu tuen habe mir liegt es auf der Zunge aber wenn ich mich dran setzte wird das ganze irgendwie wieder zu einem Problem.

Edit01
Der Punkt ist:
(supertux-tiles
(tilegroup
(name "Snow")
(tiles
7 8 9 202
13 14 15 204
10 11 12 206
16 17 18 205
30 31 114 113
21 22 19 203
20 23 207 208
Da sind noch ein "paar" mehr zahlen.
ich kann die tilegroup. Snow finden, jetzt schon, aber was bringt mir das ?
Im Moment sehe ich noch keine "Methode vor Augen, die das kann.

Edit02
supertux-tiles/tilegroup/name.Snow.tiles
Sowas habe ich im Moment im sinn.
und eine Funktion die eine Sektion komplett laden kann.

Edit03
ReadSektion(aDir,akey,aValue,aSektion:String):TStirnglist;
// Das Verzeichniss
aDir:supertux-tiles/tilegroup/

// Der Schlüssel
aKey:name
// Der Inhalt
aValue:Snow

// Wird nur gebraucht, wenn es dir richtige Inhalt zum Schlüssel ist
aSektion:tiles
ps2: Tut mir leid wegen den vielen Editieren, aber ich wollte auch nicht immer neue Beiträge hinzufügen, also habe ich das so gemacht. Ich denke ich habe jetzt die beste Lösung gefunden, oder ?
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

pluto hat geschrieben:ich kann dir noch nicht ganz folgenden. Du meinst ich sollte die gesammte Datei erstmal versuchen in einer TV zu bringen ?

Meinst du nur von der Struktur her oder auch richtig in eine TV ?

Du hast schon irgendwie recht, im nachhinein, wenn man das Problem als Baum betrachtet, würde es sehr viel einfacher werden.

Ich denke, mein ersten ansatzt ist doch schon im Prinzip so oder ?
Ja, alles vernünftig in eine TV. wenn das klappt, so hast du dein Problem mit großer Sicherheit gelöst. Denn dann hast Du die Struktur und das Handling verstanden.
pluto hat geschrieben:Diese Gruppen wollte ich in einen Array speichern und dann in ein 4D array. weil es immer 4 spalten sind.
Erstens sind 4 Spalten kein 4D Array.
Zweitens woher weisst du das die Informationen IMMER 4 Spalten sind.

Es gilt obiges. Erst wenn du ALLE Informationen SINVOLL in der TV hast, kannst du auch damit arbeiten, da du dann die Struktur und den Inhalt kapiert hast. Und vor allen nichts ist fix. Alle von die angenommenen Konstanten sind Variabel (4=n und nicht 4=4 :-) ).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

pluto hat geschrieben: PS: ich Frage mich warum wird das ganze nicht einfach im ini Format gespeichert. Ist genau so gut. Gut leserlich und kann gut bearbeitet werden. Warum wird immer XML oder halt dieses Format genommen(den namen weiß ich nicht genau, ich weiß halt nur das es lisp ist).
Ganz einfach: Wie speicere ich Informationen, die ich nicht in ein starres Schema bekomme. Das geht nur mit sehr variablen Formaten. Und das ist halt einmal xml und die ganzen Verwandten. Das Grundprinzip ist dasselbe, nur die Ausprägung weicht manchmal ab.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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 »

was meinst du mit "die ich nicht in ein starres Schema"
kannst du mir dazu ein Beispiel geben ?
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

1.Ebene hat 3 Einträge vom Typ string
2.Ebene hat 5 Einträge (2 mal integer, 3 mal string)

und dieses Schema ist IMMER vorhanden und kann NUR diese Informationen in dieser Reihenfolge aufnehmen.

Adressbuch mit fixer Anzahl Telefonnummern. Nimmst Du 3 Telnummern, so verschenkst du bei den meisten Leuten 2 Plaätze, kannst aber die jenigen nicht speichern die 5 verschiedene Nummern haben. Bei XML kein Problem, es werden nur soviele Nummern in der Struktur angelegt wie auch Nummern vorhanden sind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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 »

Code: Alles auswählen

Erstens sind 4 Spalten kein 4D Array.
ich meine sowas: array of array of array of array of Integer
Zweitens woher weisst du das die Informationen IMMER 4 Spalten sind.
Weil es bei allen Tielgroubs der Fall ist. Darum.Und weil die Icon Box in der es im Level Editor angezeigt wird, auch nur vier Spalten breit ist.... aber im Grunde hast du recht, hier könnte ich es auch etwas Dynamischer machen.
MFG
Michael Springwald

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 »

Dein Beispiel überzeugt mich noch nicht. Auch beim Ini Format kannst du es so machen das nur die Information gespeichert wird, die auch genutzt wird.

Musst halt vor dem lesen nur Prüfen ob es den "Schlüssel" auch in der "Sektion" gibt.
MFG
Michael Springwald

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 »

Du kannst ja jeden User in einer eigenen Sektion packen und Fertig.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

pluto hat geschrieben:

Code: Alles auswählen

Erstens sind 4 Spalten kein 4D Array.
ich meine sowas: array of array of array of array of Integer
Dann ja, die Daten scheinen aber in 2D vorzuliegen (Anzahl Spalten = 1D, Anzahl Reihen = 1D, 1D + 1D = 2D).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten