Laufzeitfehler mit std::stof
-
Hallo!!
Als erstes muss ich mich entschuldigen, dass ich doch relativ lange codes vorlege aber ich konnte den Effekt nicht mit kürzeren reproduzieren.Code 1 list einen gemischen string von der Konsole ein, extrahiert zwei Telstrings, die Zahlen representieren, wandelt diese mit "stof" in float um. ( im wesentlichen Zeilen 13-17) Die anschließenden Berechnungen interessieren hier nicht. Dieser Code compiliert und läuft einwandfrei!
#include <iostream> #include <cmath> using namespace std; int main() { float deg,latA,lonA,latB,lonB,alpha,alphadeg,Z,N,n,n2; string pos,Nstring,Ostring; float Pi=3.14159; cout << " Position Punkt A: " << endl; Nstring="";Ostring=""; getline(cin,pos); for (int i=1; i<9; ++i) {Nstring= Nstring + pos[i];} for (int i=17; i<25; ++i) {Ostring= Ostring + pos[i];} latA= stof (Nstring)*Pi/180; lonA= stof (Ostring)*Pi/180; cout << " Position Punkt B: " << endl; Nstring="";Ostring=""; getline(cin,pos); for (int i=1; i<9; ++i) {Nstring= Nstring + pos[i];} for (int i=17; i<25; ++i) {Ostring= Ostring + pos[i];} latB= stof (Nstring)*Pi/180; lonB= stof (Ostring)*Pi/180; Z=(cos(latA)*sin(latB)-cos(lonA-lonB)*cos(latB)*sin(latA)); n=(cos(lonA-lonB)*cos(latA)*cos(latB)+sin(latA)*sin(latB)); n2= pow(n,2); N= sqrt(1-n2); alpha=acos(Z/N); if (lonB < lonA) alpha=2*Pi-alpha; alphadeg=alpha*180/Pi; cout << alphadeg << endl; return(0); }
Im folgende Code habe ich das obige (und einen ähnliche, ebenfalls getestete Struktur) in ein größeres Programm eingebaut:
/* Die Peilung von Punkt A zu Punkt B in Grad. Die Punkte werden mittels Copy-Paste aus der AMap entweder im Format "UTM" oder "geographisch dezimal" übernommen. Der Peilwinkel zählt von Nord=0° über Ost=90° (rechtsläufig). */ #include <iostream> #include <cmath> using namespace std; int main(){ float Pi=3.14159; float Ost,Nord,OstA,NordA,OstB,NordB,Dx,Dy; float alpha,alphagrd; float latA,lonA,latB,lonB,Z,N,n,n2; string Nstring, Ostring, pos; int Auswahl; cout << endl; cout << " Position in UTM (1) oder geografischen Koordinaten (2)?" << endl; cin >> Auswahl; if (Auswahl==1) { cout << " Position Punkt A:" << endl; Nstring="";Ostring=""; getline(cin,pos); for (int i=14; i<21; ++i) {Ostring= Ostring + pos[i];} for (int i=29; i<35; ++i) {Nstring= Nstring + pos[i];} OstA= stof(Ostring); NordA= stof(Nstring); cout << " Position Punkt B:" << endl; Nstring="";Ostring=""; getline(cin,pos); for (int i=14; i<21; ++i) {Ostring= Ostring + pos[i];} for (int i=29; i<35; ++i) {Nstring= Nstring + pos[i];} OstB= stof(Ostring); NordB= stof(Nstring); Dx=OstB-OstA; Dy=NordB-NordA; if (Dx==0 and Dy>0) alpha=0; else if (Dx==0 and Dy<0) alpha=Pi; else if (Dy==0 and Dx>0) alpha=Pi/2; else if (Dy==0 and Dx<0) alpha= 3*Pi/2; else if (Dy>0 and Dx>0) alpha=Pi/2 - atan2(Dy,Dx); else if (Dy<0 and Dx>0) alpha=Pi/2 - atan2(Dy,Dx); else if (Dy<0 and Dx<0) alpha=Pi/2 - atan2(Dy,Dx); else alpha=2*Pi - atan2(Dy,Dx); } else { cout << " Position Punkt A: " << endl; Nstring="";Ostring=""; getline(cin,pos); for (int i=1; i<9; ++i) {Nstring= Nstring + pos[i];} for (int i=17; i<25; ++i) {Ostring= Ostring + pos[i];} latA= stof (Nstring)*Pi/180; lonA= stof (Ostring)*Pi/180; cout << " Position Punkt B: " << endl; Nstring="";Ostring=""; getline(cin,pos); for (int i=1; i<9; ++i) {Nstring= Nstring + pos[i];} for (int i=17; i<25; ++i) {Ostring= Ostring + pos[i];} latB= stof (Nstring)*Pi/180; lonB= stof (Ostring)*Pi/180; Z=(cos(latA)*sin(latB)-cos(lonA-lonB)*cos(latB)*sin(latA)); n=(cos(lonA-lonB)*cos(latA)*cos(latB)+sin(latA)*sin(latB)); n2= pow(n,2); N= sqrt(1-n2); alpha=acos(Z/N); if (lonB < lonA) alpha=2*Pi-alpha; } alphagrd= alpha * 180 / Pi; cout << endl; cout << "Der Peilwinkel von Punkt A zu Punkt B ist " << alphagrd << " Grad" << endl; return(0); }
Auch dieses Programm compiliert fehlerlos, wenn man es aber laufen lässt bekommt man folgede Fehlermeldung:
Quote
C:\Users\fried\Desktop\C++>a
Position in UTM (1) oder geografischen Koordinaten (2)?
2
Position Punkt A:
terminate called after throwing an instance of 'std::invalid_argument'
what(): stofUnquote
Diese Fehlermeldung wird offenbar generiert, noch bevor stof überhaupt aufgerufen wird!
Ich bin ratlos!MfG fribir
-
Du jonglierst mit Kettensägen...
Ich habe mir den Code nicht im Detail angesehen, aber was einen sofort in's Auge springt ist die ungeprüfte Behandlung von strings in den Zeilen 22 und 23 bzw. 31 und 32 (und weiteren).
Lass dir doch die Aufrufargument von stof ausgeben, dann siehst du, ob sie ok sind.
-
Nach dem Einlesen von
cin >> Auswahl;
ist noch der Zeilenumbruch (Return) im Eingabepuffer, so daß danngetline(cin,pos);
einen leeren String einliest.
-
@fribir sagte in Laufzeitfehler mit std::stof:
getline(cin,pos); for (int i=1; i<9; ++i) {Nstring= Nstring + pos[i];} for (int i=17; i<25; ++i) {Ostring= Ostring + pos[i];}
Was ist, wenn jemand mal weniger als 25 Zeichen eingibt? Das solltest du so nicht tun. Mindestens musst du sicherstellen, dass
pos
lang genug ist. Auch könntest du substr verwenden, statt die strings selbst zusammen zu basteln. Kannst du nicht direkt aus dem Stream lesen?(und deine Einrückung ist merkwürdig)
Zum geschilderten Problem: das, was @Th69 sagt.