Hilfe Segmentation 11
-
Hallo,
ich bekomme beim nachfolgenden Code immer ein Segmentation Fault: 11 error. Aber ich kann den Fehler nicht finden! Ich suche schon seit Stunden, bin scheinbar doof.
Also worum es gehen soll. Wir haben in Format_numbers.hpp einen vector<double> und unsere Aufgabe ist es die einzelnen Zahlen zu runden, und dann in einen String umzuwandeln um ihn dann ausschließend auszugeben. Dabei sollen die Strings eben ein paar Eigenschaften erfüllen wie ich kommentiert habe.#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <cctype>
#include "format_numbers.hpp"std::vector<int> vec_to_int(std::vector<double> v)
{
std::vector<int> gerundet;
std::transform(v.begin(), v.end(), gerundet.begin(), [](double in)
{
int i = in;
if ( std::abs(in-i) >=0.5 )( i>0 ) ? ++i
: --i;
return i;
}
);
return gerundet;
}std::vector<double> rounded(std::vector<double> v)
{
std::vector<double> gerundet2;
std::transform(v.begin(), v.end(), gerundet2.begin(), [](double in)
{
double i = 10in;
int j = 10in;
if ( std::abs(i-j) >= 0.5 ) ( i>0 ) ? ++i
: --i;
return i/10;
});
return gerundet2;
}std::string double_to_string(double x)
{
std::vector<double> runden;
runden.push_back(x);
x = rounded(runden)[0];std::string zahl;
zahl = std::to_string(x);//2 Nachkommastellen
if ( zahl.size() - zahl.rfind('.') < 2 ) zahl += "0";//Apostrophe für Tausender
for (int i=zahl.find('.')-1; i>0; --i)
{
if ( (zahl.find('.')-i) % 3 == 0 )
{
zahl = zahl.substr(0, i) + "'" + zahl.substr(i);
}
}//Größe auf "16" anpassen
std::string zahl16;if (zahl.size() == 16 ) zahl16 = zahl;
if ( zahl.size() < 16 )
{
for (int j=16-zahl.size(); j>=0; --j)
{
zahl16 += " ";
}
zahl16 += zahl;
}
if ( zahl.size() > 16 ) return zahl;return zahl16;
}std::vectorstd::string format_numbers(std::vector<double> v)
{
std::vectorstd::string format;
std::transform(v.begin(), v.end(), format.begin(), [](double x)
{
return double_to_string(x);
});return format;
}int main()
{
std::cout << "\nDie Zahlen aus Numbers werden formatiert ausgegeben:\n";std::vectorstd::string result;
std::vectorstd::string zwischenerg;
for (int i=0; i<format_numbers(numbers).size(); ++i)
{
zwischenerg.push_back(format_numbers(numbers)[i]);
}for (int i=0; i<zwischenerg.size(); ++i)
{
result.push_back(zwischenerg[i]);
}for (int j=0; j<result.size(); ++j)
{
std::cout << numbers[j] << " -> " << result[j] << "\n";
}return 0;
}
-
Du postest im falschen Forum.
Du hast die Code-Tags gelesen, was bewirkt, dass die meisten hier vermutlich nur die ersten Zeilen lesen.
Schlussendlich hast du dann aber doch noch Glück gehabt, denn der Fehler liegt ziemlich weit oben bei
std::transform()
. Der fügt die Elemente nicht automatisch in dengerundet
-Vektor hinzu. Also initialisierst du den Vektor am besten mit einer Anfangsgröße oder du benutzt nenback_inserter<>
.Desweiteren, lege ich dir ans Herz, nicht zu modifizierende Objektparameter per const-Referenz zu übergeben. Sonst kopierst nämlich ständig alles rum und das ist halt Kacke.
Den Rest hab ich mir nicht angelesen. Du hättest deinen Thread schöner gestalten können.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Oh Okay, entschuldigt bitte, in der Schnee habe ich das nicht beachtet.
Danke für den Hinweis, aber das war nicht der Fehler, ich bekomme nach wie vor einen Error.im übrigen hatte ich das auch schon mal getestet, in dem ich als transform Target v selbst wählte.
-
helloguest schrieb:
Danke für den Hinweis, aber das war nicht der Fehler
Ob es "der" Fehler ist - keine Ahnung. Aber EIN Fehler auf jeden Fall. All deine transform-Aufrufe sind falsch, da im Ziel kein Platz ist. Du brauchst rewrew nicht zu glauben, aber dann bleibt dein Code halt falsch!
Außerdem ergibt gerundet(0.6) bei dir -1. Soll das so?
Suchst du zum vielleicht floor und ceil?