Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - StrToFloat Problem stehen


Quivadis - Mi 15.10.03 14:22
Titel: StrToFloat Problem stehen
Guten Tag,

Ich programmiere zurzeit in Delph6 Personal und habe folgendes Problem:

Ich habe eine Datei in der Messwerte stehen (ist nicht von mir gemacht) die ich in ein Programm einlesen muss. Da ich aber nicht das richtige Format der Datei habe , lese ich sie zeilenweise in einen String ein.

Von diesem eingelesen string nehme ich die ersten 3 Zeichen weg (zeilennummer) und speicher die Zahl in ein Array ab.


Delphi-Quelltext
1:
 winkel_x:array[0..600]of string ; // eingelesen Winkelwerte                    


Wie bekomme ich aus diesen Array den Wert der String ist als Fließkommazahl zurück?

mit: variable:=strtofloat(Winkel_X[zahl]);
geht es nicht, da kommt in der Variablen nichts an.

tschau Quivadis[/delphi]


inselberg - Mi 15.10.03 15:03

abgesehn davon das es mit einer liste (tstrings oder was auch immer) eleganter wäre...

überprüfe ob du "," in deinem float hast und ob keine anführenden leerzeichen vorhanden sind (wegTRIMen).

bekommst du denn ne fehlermeldung ... EConvertError ... oder passiert garnichts?


Quivadis - Mi 15.10.03 15:20

Guten Tag inselberg,

so wie ich es jetzt habe passiert gar nichts.

In der Datei stehen 600 Werte und in einer 2. auch nochmal 600, also insgesammt 1200. Weil ich die Werte bei progammablauf in der Statuszeile ständig anzeigen muss, habe ich den Weg über das Array gewählt.

Mit Tstrings usw. weis ich nicht wie es geht. brauch die zahlewerte zur anzeige und zum rechne.

Tschau Quivadis


maximus - Mi 15.10.03 15:34

Hallo...willkommen im DF.

1. Wenn strings nicht korrekt wären, dann würde 'ne exception kommen, dh. es sind vermutlich richtige 'zahlen' drinne.

2. Du könntest mal debuggen und schauen ob nach der funktion in der 'variable' der richtige wert zu dem string steht.

3. Für die anzeigen brauchst du den string nicht in eine zahl konverten, da du ihn nacher wieder zu einem string konverten müsstest.

4. Wie sehen die strings denn aus?

5. TStrings ist eine abstrakte klassen und kann nicht direkt verwendet werden! Dazu nimmt man TSTringList:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
...
var sl:TStringList;
      F:Single;
begin
  ls:=TStringList.create;
  try
    ls.loadFromFile('c:\zahlen.txt');

    f := strToFloat(ls[0]); // zB.

  finally
    ls.free;
  end;
end;


hilft das weiter?


Quivadis - Mi 15.10.03 15:41

Hallo maximus,

Danke für deine Tipps. Das hilft mir aber auch nicht weiter.
Ich habe schon debuggt und dabei festgestellt das wenn ich den string aus dem Array auslese und in eine andere Varibla schreibe die auch ein String ist , das dort der richtige Wert als String akommt.
Da ich aber eine Zahl für math. Berrechnungen brauche , habe ich auch schon versucht aus diesen string eine Zahl zu machen.
Sobald ich aber strtto float einsetze passiert nichts. Der compiler meckert nicht. Aber mit Hilfe des DEbugers habe ich festgestellt das er aber nichts macht. In der Empfangsvariable steht nur Müll drinn.

Vieleicht kann mir doch noch jemand weiterhelfen, vielen Dank schonmal im vorraus.

Tschau Quivadis


maximus - Mi 15.10.03 15:45

zeig mal den code


Quivadis - Mi 15.10.03 15:58

Hallo maximus,

hier der Code der die Daten einliest. Es 2 Dateien aus dennen die eigelesen werden muss:


Delphi-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:
34:
35:
Procedure CamDateiLesen(namex:string;namey:string);
    {Procedure zum einlesen der Kameradaten und Konvertieren}
var i:integer;
    datei:textfile;
    feld:string;      // Eingelesener Original String

begin
   assignFile(datei,namex);
   reset(datei);
   i:=0;
   while not eof(datei) do begin
         readln(datei,feld);
         delete(feld,1,3);    // Zeilennummer löschen
         delete(feld,3,1);    // Punkt Löschen
         insert(',',feld,3);  // Komma einfügen
         winkel_x[i]:=feld;   // neuen Wert in Array als string übergeben
         inc(i);
   end;
   close(datei);

   assignFile(datei,namey);
   reset(datei);
   i:=0;
   while not eof(datei) do begin
         readln(datei,feld);
         delete(feld,1,3);    // Zeilennummer löschen
         delete(feld,3,1);    // Punkt Löschen
         insert(',',feld,3);  // Komma einfügen
         winkel_y[i]:=feld;   // neuen Wert in Array als string übergeben
         inc(i);
   end;
   close(datei);
   WNamex:=namex;
   WNamey:=namey;
end;


Die beiden Array´s wurden Global definiert.

Folgendes funktioniert: ich kann die Werte aus den Arrays anzeigen lasen.

Folgendes geht nicht: ich kann aus den Arrays keine Zahlen machen.

tschau Quivadis


maximus - Mi 15.10.03 16:23

erstmal ein kleiner verbesserungsvorschlag:


Delphi-Quelltext
1:
2:
3:
4:
5:
   while not eof(datei) do begin 
         readln(datei,feld); 
         winkel_x[i]:=   stringReplace(copy(feld,4,length(feld)-4),'.',',',[rfReplaceAll]); 
         inc(i); 
   end;


Das das einlesen der string funktioniert glaub ich dir ja...aber zeig doch mal den code, wo du konvertierst.


Quivadis - Mi 15.10.03 16:30

Hallo maximus,

hier die procedure in der ich zur weiteren Berrechnung die Werte aus dem Array brauch.

Die anderen Werte wurden in einer anderen Procedure schon berrechnet.


Delphi-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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
procedure TForm_main.SprungClick(Sender: TObject);
{Aussrechnen der Sprungweite
  (letzte Berrechnungen die auf den Werten der Procedure Rechnen beruhen)

 * als letzter Schritt sollen die x, y Koordinaten des Landepunktes berrechnet
   werden }



var AlphaL,BetaL:single;
var zeileLA,zeileLB:integer; //zeilennummern des Landepunktes
     zla,zfa,zlb,zfb:single;
     zla1,zlb1:string[12];

begin
   // Zeilennummer für Landepunkt ermitteln

     zeileLA:=sx1;
     zeileLB:=sy1;

  // Zeilennummer des Landepunktes einlesen und konvertieren in Float

     //wx.Text:=Winkel_X[zeileLA];
      zla1:='45,78';
     zla:=strtofloat(zla1);      //Versuch was zu konvertieren

     wy.Text:=Winkel_y[zeileLB];   //Versuch zu Konvertieren
     zlb:=strtofloat(wy.Text);

  // Zeilennummern des Fixpunkts einlesen und konvertieren in Float

    //zfa:=WLaden(WNamex,zeileFixX);    // ein weiter versuch
    zfb:=strtofloat(Winkel_X[zeileFixY]);

    //zla1:=winkel[zeileFixX].x;

  // Ausrechnen der Sprungweite und restliche Werte ausrechnen

    AlphaL:= alphaF+(zla-zfa);  // Winkel zwischen strecke AB und strecke AL
    BetaL:=  betaf-(zlb-zfb);   // Winkel zwischen strecke AB und strecke BL



  end;


Tschau Quivadis


maximus - Mi 15.10.03 16:44


Delphi-Quelltext
1:
2:
 zla1:='45,78'
  zla:=strtofloat(zla1);      //Versuch was zu konvertieren


das geht nicht? muss aber! ...wenn nicht teste mal folgendes:


Delphi-Quelltext
1:
showMessage( floatToStr( strToFloat('45,78') ) );                    


wenn das nicht geht dann ist dein computer kaputt :wink:


Quivadis - Mi 15.10.03 17:02

Hallo maximus,

Ich brauch folgendes Konstrukt:

Delphi-Quelltext
1:
2:
zfa:=strtofloat(Winkel_X[zeileFixX]);
    zfb:=strtofloat(Winkel_Y[zeileFixY]);


Deine Zeile Quelltext geht. Ich habe meine ganzen Versuche noch im quelltext gelassen, weil ich probiert das in denn variablen was ankommt. Dort kommt aber immer noch nichts an.

tschau quivadis


maximus - Mi 15.10.03 17:08

dann teste mal so:


Delphi-Quelltext
1:
2:
3:
4:
showMessage('A:'+Winkel_X[zeileFixX]+'  B:'+Winkel_Y[zeileFixY]);
zfa:=strtofloat(Winkel_X[zeileFixX]); 
zfb:=strtofloat(Winkel_Y[zeileFixY]);
showMessage('A:'+floatToStr(zfa)+'  B:'+floatToStr(zfb));


und schau was passier!


Quivadis - Mi 15.10.03 17:21

hi maximus,

so sehe ich das sogar vor dem zuweisen schon was drin steht.

also scheint der Debugger nee Macke zu haben, oder er resetet zu schnell das das nicht mitbekommt .

Ich habe immer (siehe grossen Quelltext ) die letzten formeln und die Transformation DEbugt und dabei festgestellt das dort nichts ankommt, deswegen bin ich ganz erstaunt das er doch was macht.

Danke Dir. :P

Ich hoffe mal das das dann auch noch funktioniert wenn ich weiter programmiere und die werte brauche.

Tschau Quivadis


maximus - Mi 15.10.03 17:30

Jaja der gute debugger :? ...nur weil nix kommt heisst das ja nicht, das das programm nix ausgerechnet hat. Das mit den messageboxen ist'n guter trick, wenn man sich nicht auf den debugger verlassen kann oder will.

Als ich mit delphi angefangen hab, hab ich mir immer ein memo ins prog gesetzt, in das ich immer alle schritte protokoliert habe...mittlerweile sind meine vorhersagen was, wie, wo, wann passiert recht präzise sodass ichs nicht mehr brauche :D


Quivadis - Mi 15.10.03 17:41

Hallo maximus,

du hattest recht der Debuger wars. Ich wollte eigentlich nur mitten im Programmieren schauen ob er richtig rechnet und tappe gleich inso eine Falle rein.

Danke dir nochmals.

Man sollte doch nicht dem Debuger trauen(dachte die wären beser geworden).

werde es jetzt immer mit showmsg... usw. machen.

Tschau Quivadis