![]() |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Zitat:
zu 1). Da hast du recht:-D "for i:=0 to High(Dreiecke) do" soll durch "for i:=0 to Dreiecke.Count-1 do" ersetzt werden, ich hab es in "FormDestroy" schon gemacht, bin doch blöd :( zu 2). "with hDreieck(Dreiecke[i])^ do begin" schon in Programm geschrieben, aber leider hab ich wieder Fehlermeldung bekommen: Missing Operator or semicolon Meine Frage: es ist ganz klar, dass Dreiecke[i] ein Zeiger auf ein TDreieck ist. Aber was ist denn hDreieck(Dreiecke[i])? Also hDreieck(ein Zeiger auf ein TDreieck ) ist auch ein Zeiger auf ein TDreieck? Ich bin verwirrt. Gruss Lee |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Hallo Lee,
tja, dann fehlt da vielleicht irgendwo ein Semikolon. Ich habe das mal getestet mit nachstehender Prozedur. Wundere dich nicht, dass die auch Test heißt. (Bei mir gibt es in jedem Projekt eine Prozedur "Test" (zum Testen, wie der Name sagt.)). Zu Meine Frage: es ist ganz klar, dass Dreiecke[i] ein Zeiger auf ein TDreieck ist. Aber was ist denn hDreieck(Dreiecke[i])? Also hDreieck(ein Zeiger auf ein TDreieck ) ist auch ein Zeiger auf ein TDreieck? Ich bin verwirrt. Nein, es ist eben nicht ganz klar, dass Dreiecke[i] ein Zeiger auf ein TDreieck ist. Das weißt du, nicht aber der Compiler, denn TList ist einfach nur eine Liste mit Pointern. Dadurch dass du die TList "Dreiecke" nennst, wird Dreiecke[i] für den Compiler nicht zu einem Zeiger auf ein TDreieck. Erst durch hDreieck(Dreiecke[i]) wird der Pointer zu einem Pointer auf ein TDreieck. Und mit dem ' ^ ' dahinter 'weiß' der Compiler, dass er auf einen Record TDreieck zugreifen soll. OT : Wenn du die Variable "Dreiecke" umbenennst in "Kirchturmuhr" wird daraus ja auch kein Zeiger einer Uhr.
Delphi-Quellcode:
Das Ergebis in Log.txt :
type
TVektor = record x, y, z: real; end; TDreieck = record n: TVektor; // n ist Normalvektor p: array[1..3] of TVektor; //p hat Koordinaten von 3 Eckpunkten end; hDreieck=^TDreieck; var Dreiecke:TList; PROCEDURE TMain.Test; var i,j:integer; pDreieck:hDreieck; list:TStrings; s:string; begin Dreiecke:=TList.Create; for i:=1 to 3 do begin New(pDreieck); pDreieck.n.x:=i*100+1; pDreieck.n.y:=i*100+2; pDreieck.n.z:=i*100+3; for j:=1 to 3 do begin pDreieck.p[j].x:=i*100+j*10+1; pDreieck.p[j].y:=i*100+j*10+2; pDreieck.p[j].z:=i*100+j*10+3; end; Dreiecke.Add(pDreieck); end; list:=TStringList.Create; for i:=0 to Dreiecke.Count-1 do with hDreieck(Dreiecke[i])^ do begin list.Add('n '+ FloatToStr(n.x)+' '+FloatToStr(n.y)+' '+FloatToStr(n.z)); for j:=1 to 3 do list.Add('p['+IntToStr(j)+'] : '+ FloatToStr(p[j].x)+' '+FloatToStr(p[j].y)+' '+FloatToStr(p[j].z)); list.Add(''); end; list.SaveToFile('Log.txt'); list.Free; for i:=0 to Dreiecke.Count-1 do Dispose(Dreiecke[i]); Dreiecke.Free; end;
Code:
n 101 102 103
p[1] : 111 112 113 p[2] : 121 122 123 p[3] : 131 132 133 n 201 202 203 p[1] : 211 212 213 p[2] : 221 222 223 p[3] : 231 232 233 n 301 302 303 p[1] : 311 312 313 p[2] : 321 322 323 p[3] : 331 332 333 |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Der Vorteil von TList ist die Flexibilität, da sie untypisierte Pointer enthält. Der Nachteil ist ihre Flexibilität, da sie nur untypisierte Pointer enthält :mrgreen:. Um ein Mindestmaß an Typsicherheit zu erreichen, könnte man eine eigene Liste von TList ableiten, die dann nur typsierte Pointer eines bestimmten Typs verarbeitet, in aktuellen Delphi-Versionen auf eine generische Liste umsteigen, oder aus den Records Klassen machen und in einer TObjecList verwalten, dann hat man zumindest die Möglichkeit, die Einträge mittels is und as auf ihren Typ zu untersuchen (oder man leitet auch hier wieder eine spezialisierte Liste ab).
|
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Guten Tag Zusammen,
die original Ausgabe-Code (in Log.txt) von Klaus funktioniert jetzt schon (besonders "with hDreieck(Dreiecke[i])^ do begin""), hab ich gerade schon probiert, jedoch muss man hDreieck = ^TDreieck; am Anfang des Programms unter Type erklären, aber nicht innerhalb von Ausgabe-Code, also nicht innerhalb von procedure CopyDreiecke(tofile:boolean)
Delphi-Quellcode:
Nun neue Probleme: die in Log.txt ausgegebenen/gespeicherten Koordinaten stimmen mit original Koordinaten in *.stl nicht überein, wo können die Fehler liegen?
procedure CopyDreiecke(tofile:boolean);
var list:TStrings; function ToStr(v:real):String; begin result:=FloatToStrF(v,ffExponent,7,3)+' '; if result[1]<>'-' then result:=' '+result; end; procedure AddVector(const v:TVektor); type TxVector=Array[0..2] of real; var s:string; i:integer; begin for i:=0 to High(TxVector) do s:=s+ToStr(TxVector(v)[i]); list.Add(s); end; var i,j:integer; begin list:=TStringList.Create; try try //if Length(Dreiecke)=0 then if Dreiecke.Count=0 then raise Exception.Create('Dreiecke ist leer.'); //for i:=0 to High(Dreiecke) do for i:=0 to Dreiecke.Count-1 do //with Dreiecke[i] do begin with hDreieck(Dreiecke[i])^ do begin AddVector(n); for j:=Low(p) to High(p) do AddVector(p[j]); list.Add(''); end; if tofile then list.SaveToFile(ExtractFilePath(ParamStr(0))+'Log.txt'); //else Clipboard.AsText:=List.Text; ShowMessage('fertig.'); except On E:Exception do ShowMessage(E.Message); end; finally list.free; end; end;
Delphi-Quellcode:
Gruss
.
. . PROCEDURE ReadRecord; var i:integer; begin //ReadLine(data.n); ReadLine(hDreieck^.n); //von mir umgeschrieben!!! for i:=1 to 3 do begin FindLine(recline,true); //ReadLine(data.p[i]); ReadLine(hDreieck^.p[i]); //von mir umgeschrieben!!! end; //SetLength(Dreiecke,Length(Dreiecke)+1); //Dreiecke[High(dreiecke)]:=data; Dreiecke.Add(hDreieck); //von mir umgeschrieben!!! Vielleicht HIER fehlt noch etwas end; begin //Dreiecke:=nil; //von mir gelöscht, sonst kriege ich "Access Violation..." list:=TStringList.Create; try try list.text:=Clipboard.AsText; // oder List.LoadFromFile('Filename'); line:=0; while FindLine(recstart,false) do ReadRecord; except On E:Exception do begin ShowMessage(E.Message); Dreiecke:=nil; end; end; finally list.free; end; end; Lee |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Was bedeutet "stimmen nicht überein" ?
Zeige doch mal die Original-Daten und was dann in Log.txt ankam. (Nicht alle 10000. Nur 2 bis 3 bitte) |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Welche Werte sind denn im Debugger zu sehen? Da ich weder ReadLine noch FindLine kenne, kann ich Dir auch nicht sagen, ob die korrekt arbeiten.
|
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Zitat:
Wie unterscheiden sich die Werte denn? werden sie verschoben, wird einer ausgelassen oder wo klemmt es? Gruß K-H |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Zitat:
Code:
solid ascii
facet normal 2.445222e-016 0.000000e+000 1.000000e+000 outer loop vertex -2.007874e+000 1.968504e+000 5.905512e-002 vertex -2.007874e+000 -1.968504e+000 5.905512e-002 vertex -1.574803e-001 -1.968504e+000 5.905512e-002 endloop endfacet facet normal 2.445222e-016 -5.090141e-032 1.000000e+000 outer loop vertex -1.574803e-001 -1.968504e+000 5.905512e-002 vertex -1.574803e-001 1.968504e+000 5.905512e-002 vertex -2.007874e+000 1.968504e+000 5.905512e-002 endloop endfacet facet normal -3.209883e-031 -1.000000e+000 2.312965e-015 outer loop vertex -2.007874e+000 -1.968504e+000 -5.905512e-002 vertex -3.937008e-002 -1.968504e+000 -5.905512e-002 vertex -1.574803e-001 -1.968504e+000 5.905512e-002 endloop endfacet facet normal 1.476360e-016 -1.000000e+000 -3.414769e-031 outer loop vertex -1.574803e-001 -1.968504e+000 5.905512e-002 vertex -2.007874e+000 -1.968504e+000 5.905512e-002 vertex -2.007874e+000 -1.968504e+000 -5.905512e-002 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex -2.007874e+000 1.968504e+000 -5.905512e-002 vertex -2.007874e+000 1.968504e+000 5.905512e-002 vertex -1.574803e-001 1.968504e+000 5.905512e-002 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex -1.574803e-001 1.968504e+000 5.905512e-002 vertex -3.937008e-002 1.968504e+000 -5.905512e-002 vertex -2.007874e+000 1.968504e+000 -5.905512e-002 endloop endfacet facet normal -1.000000e+000 0.000000e+000 2.312965e-015 outer loop vertex -2.007874e+000 -1.968504e+000 -5.905512e-002 vertex -2.007874e+000 -1.968504e+000 5.905512e-002 vertex -2.007874e+000 1.968504e+000 5.905512e-002 endloop endfacet facet normal -1.000000e+000 0.000000e+000 2.312965e-015 outer loop vertex -2.007874e+000 1.968504e+000 5.905512e-002 vertex -2.007874e+000 1.968504e+000 -5.905512e-002 vertex -2.007874e+000 -1.968504e+000 -5.905512e-002 endloop endfacet facet normal 1.387779e-016 0.000000e+000 -1.000000e+000 outer loop vertex -2.007874e+000 1.968504e+000 -5.905512e-002 vertex -3.937008e-002 1.968504e+000 -5.905512e-002 vertex -3.937008e-002 -1.968504e+000 -5.905512e-002 endloop endfacet facet normal 1.387779e-016 0.000000e+000 -1.000000e+000 outer loop vertex -3.937008e-002 -1.968504e+000 -5.905512e-002 vertex -2.007874e+000 -1.968504e+000 -5.905512e-002 vertex -2.007874e+000 1.968504e+000 -5.905512e-002 endloop endfacet facet normal 7.071068e-001 0.000000e+000 7.071068e-001 outer loop vertex -3.937008e-002 -1.968504e+000 -5.905512e-002 vertex -3.937008e-002 1.968504e+000 -5.905512e-002 vertex -1.574803e-001 1.968504e+000 5.905512e-002 endloop endfacet facet normal 7.071068e-001 -1.471962e-016 7.071068e-001 outer loop vertex -1.574803e-001 1.968504e+000 5.905512e-002 vertex -1.574803e-001 -1.968504e+000 5.905512e-002 vertex -3.937008e-002 -1.968504e+000 -5.905512e-002 endloop endfacet Koordinaten von Log.txt
Code:
1.476983E-311 0.000000E+000 0.000000E+000
0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 -1.473896E+000 -6.222585E-001 -1.159190E+000 6.281842E-312 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 0.000000E+000 3.305282E-001 2.457197E+000 1.327775E+000 6.773484E-311 5.330479E+228 1.591497E-312 1.251978E-312 5.738129E+180 2.473799E-091 3.699094E-057 8.242291E-072 3.272333E+179 -1.473896E+000 -6.222585E-001 -1.159190E+000 5.771902E-311 1.397371E-076 1.396426E-076 6.530859E-038 1.398037E-076 1.200317E-071 1.723460E-311 3.705492E-322 6.013469E-154 -2.337179E+000 1.018424E+000 -1.187628E+000 4.999496E-311 1.748032E+000 -2.062994E+000 -1.016916E-012 -1.748032E+000 -2.062994E+000 1.016916E-012 1.748032E+000 -2.062993E+000 1.255161E+000 8.556853E-001 1.263198E+000 4.362897E-311 2.527831E-052 1.207374E-153 1.200317E-071 3.098513E-311 3.705492E-322 6.013469E-154 9.067593E+271 1.397371E-076 3.918780E-001 2.496368E+000 1.234760E+000 3.369803E-311 3.705492E-322 6.013469E-154 9.067593E+271 1.397371E-076 1.396426E-076 2.527831E-052 1.207374E-153 1.200317E-071 3.305282E-001 2.457197E+000 1.327775E+000 2.521004E-311 0.000000E+000 5.263544E-315 7.812500E-003 0.000000E+000 5.263544E-315 1.587352E-314 -7.812501E-003 4.388941E-120 -2.337179E+000 1.018424E+000 -1.187628E+000 1.672206E-311 1.397371E-076 1.396426E-076 6.530859E-038 1.398037E-076 1.200317E-071 5.823156E-311 3.705492E-322 6.013469E-154 -1.353527E+000 -6.853117E-001 -1.256328E+000 8.234078E-312 1.269314E-076 1.591497E-312 1.251978E-312 5.738129E+180 2.473799E-091 3.699094E-057 8.242291E-072 3.272333E+179 3.918780E-001 2.496368E+000 1.234760E+000 6.994172E-311 7.259042E-043 1.398037E-076 1.832558E-076 8.450653E-053 2.948785E+179 5.981315E-154 8.429613E+252 3.654820E-086 1.255161E+000 8.556853E-001 1.263198E+000 6.145373E-311 1.085864E-042 4.581108E-072 3.272333E+179 2.908879E-033 1.269314E-076 6.013470E-154 6.017568E-244 1.574079E+161 -1.353527E+000 -6.853117E-001 -1.256328E+000 |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Sieht nicht so schön aus,
wie wäre es direkt in Readline ein Protokoll der gelesenen Daten anzufertigen? ansonsten der Debugger ist wirklich ein tolles Fehersuchundbehebewerkzeug. Gruß K-H |
AW: wie kann ich bestimmte Infos aus Textdokument einlesen?
Hallo Lee,
Ich hab die Daten eingelesen (mit der Original-Routine aus #2) und dann in die Datei Log.txt geschrieben (mit der Original-Routine aus #5). Die Daten stimmen 100 %ig überein. Das läßt mich vermuten, dass durch eine deiner Vereinfachungen etwas durcheinander gebracht wurde. Poste doch noch einmal die Typ-Deklarationen und die Routinen, mit denen du eingelesen und ausgegeben hast. Ohne die, kann das hier niemand prüfen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz