Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: c++: Segmentatiefout  (gelezen 1557 keer)

Offline bart85

  • Lid
c++: Segmentatiefout
« Gepost op: 2015/02/24, 18:47:27 »
Bij deze code krijg ik de error Segmentatiefout..
Alle variabelen zijn goed gedeclareerd, maar het zit hem in regel 2. Als ik deze weglaat werkt het programma.

Dit is het gedeelte van de code waar het omgaat:

cout << *lang_vraag << ": " << *from << '?' << endl;
cout << *lang_answer << ": ";
getline(cin,answer)
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.

Re: c++: Segmentatiefout
« Reactie #1 Gepost op: 2015/02/24, 22:01:41 »
Hallo, kan je niet direct helpen. Wat ik wel weet is als je je programma compileert met de debug-optie aan, je tijdens het draaien ervan specifieke meldingen over fouten ontvangt.

Re: c++: Segmentatiefout
« Reactie #2 Gepost op: 2015/02/25, 11:50:02 »
Kan je je volledige code geven? Het enige wat we hieruit kunnen opmaken is dat de uitdrukking *lang_answer ongedefinieerd is.
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline bart85

  • Lid
Re: c++: Segmentatiefout
« Reactie #3 Gepost op: 2015/02/25, 12:03:32 »
Ik heb debuggen geprobeerd, maar krijg geen errors. Dit heb ik met de optie --debug gedaan. Segmentatiefout is bij het uitvoeren en niet bij het compilen. Als ik *lang_vraag door *lang_answer vervang werkt hij wel en de volgende regel weglaat.
cout << *lang_answer << ": ";

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include <random>

#define WORD_SIZE 256



using namespace std;

// eigenschappen van het vertalen van een woord.
class lang2lang
{
public:
string language1;
string language2;
};

//lijn opdelen in 2 woorden die hetzelfde betekenen.
lang2lang split(string line)
{
int l = line.length();
lang2lang a;
size_t pos = line.find("\t");
a.language1 = line.substr(0,pos);
if (pos < l - 2)
{
pos++;
a.language2 = line.substr(pos);
}
return a;
}

//Het antwoord vergelijken met to
bool vraag(string *to,string* answer)
{
bool r = false;
if (*answer == *to)
{
r = true;
}
return r;
}


//input van regels.
void trans(istream* input)
{
string lang1;
string lang2;
string* lang_vraag;
string* lang_answer;
string answer = "";
lang2lang words[WORD_SIZE];
string lineInput;
int n,p,r,richting = 0;
int n_vragen;
bool ans;
string *from;
string *to;
while (getline(*input,lineInput) && n < WORD_SIZE)
{
if (!lineInput.empty())
{
if (lineInput[0]== '#')
{
int l = lineInput.length();
size_t pos = lineInput.find("\t");
lang1 = lineInput.substr(1,pos - 1);
if (pos < l - 2)
{
pos++;
lang2 = lineInput.substr(pos);
}
}
else
{
    words[n] = split(lineInput);
    n++;
}
}
}
n_vragen = 3 * n;
for (int i = 0; i < n_vragen;i++)
{
p=0;
r = rand() % n;
richting = rand() % 2;
ans = false;
if (richting == 0)
{
from = &words[r].language1;
to = &words[r].language2;
lang_vraag = &lang1;
lang_answer = &lang2;
}
else if (richting == 1)
{
from = &words[r].language2;
to = &words[r].language1;
lang_vraag = &lang2;
lang_answer = &lang1;
}

while (ans == false && p < 3)
{
cout << *lang_vraag << ": " << *from << '?' << endl;

//error bij het weergeven van
//lang_answer is juist.
cout << *lang_answer << ": ";
getline(cin, answer);
ans = vraag(to, &answer);
if (ans == false)
{
cout << "\tFalse" << endl;

}
else
{
cout << "\tTrue" << endl;
}
p++;
}
}

}

//starten vanaf het aangegeven bestand op de commandline
int main(int argc, char* argv[])
{
char f_std[] = "words";
char* file = NULL;
if (argc == 2)
{
file = argv[1];
}
if (file == NULL)
{
file = f_std;
}
//betand inlezen.
ifstream fin (file);
trans(&fin);
}
« Laatst bewerkt op: 2015/02/25, 12:05:10 door bartveurink »
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.

Offline bart85

  • Lid
Re: c++: Segmentatiefout
« Reactie #4 Gepost op: 2015/02/25, 12:42:36 »
Even voor de duidelijkheid dat onderstaande nodig is, maar niet het probleem verhelpt.
De volgende optie is nodig bij het compilen:
-std=gnu++11
Er word een bestand "words" gebruikt als er geen bestand op de commandline word meegegeven. Het is als het onderstaande opgebouwd. (alles tab gescheiden).
#Engels Nederlands
home thuis
game spel
live leven
« Laatst bewerkt op: 2015/02/25, 13:17:20 door bartveurink »
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.

Re: c++: Segmentatiefout
« Reactie #5 Gepost op: 2015/02/26, 10:56:12 »
Dit is wat Clang zegt met -Weverything:

test.cpp:22:11: warning: no previous prototype for function 'split'
      [-Wmissing-prototypes]
lang2lang split(string line)
          ^
test.cpp:24:10: warning: implicit conversion loses integer precision:
      'size_type' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
        int l = line.length();
            ~   ^~~~~~~~~~~~~
test.cpp:28:10: warning: comparison of integers of different signs: 'size_t'
      (aka 'unsigned long') and 'int' [-Wsign-compare]
        if (pos < l - 2)
            ~~~ ^ ~~~~~
test.cpp:37:6: warning: no previous prototype for function 'vraag'
      [-Wmissing-prototypes]
bool vraag(string *to,string* answer)
     ^
test.cpp:49:6: warning: no previous prototype for function 'trans'
      [-Wmissing-prototypes]
void trans(istream* input)
     ^
test.cpp:69:13: warning: implicit conversion loses integer precision:
      'size_type' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
                                int l = lineInput.length();
                                    ~   ^~~~~~~~~~~~~~~~~~
test.cpp:72:13: warning: comparison of integers of different signs: 'size_t'
      (aka 'unsigned long') and 'int' [-Wsign-compare]
                                if (pos < l - 2)
                                    ~~~ ^ ~~~~~
test.cpp:109:13: warning: variable 'lang_vraag' may be uninitialized when used
      here [-Wconditional-uninitialized]
                        cout << *lang_vraag << ": " << *from << '?' << endl;
                                 ^~~~~~~~~~
test.cpp:53:20: note: initialize the variable 'lang_vraag' to silence this
      warning
        string* lang_vraag;
                          ^
                           = nullptr
test.cpp:109:36: warning: variable 'from' may be uninitialized when used here
      [-Wconditional-uninitialized]
                        cout << *lang_vraag << ": " << *from << '?' << endl;
                                                        ^~~~
test.cpp:61:14: note: initialize the variable 'from' to silence this warning
        string *from;
                    ^
                     = nullptr
test.cpp:113:13: warning: variable 'lang_answer' may be uninitialized when used
      here [-Wconditional-uninitialized]
                        cout << *lang_answer << ": ";
                                 ^~~~~~~~~~~

Dit is de uitvoer die ik krijg van jouw programma:

#Engels Nederlands
: spel?
Engels Nederlands: game
True
Engels Nederlands: live?
: leven
True
Engels Nederlands: game?
: spel
True
Engels Nederlands: home?
: thuis
True
: leven?
Engels Nederlands: live
True
: thuis?
Engels Nederlands: home
True
Engels Nederlands: home?
: thuis
True
: thuis?
Engels Nederlands:

Het programma crasht hier echter niet. Heb je al eens geprobeerd om met debug-symbolen te compilen (-g) en dan het programma met gdb uit te voeren? Kan je een backtrace posten?
« Laatst bewerkt op: 2015/02/26, 10:59:28 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline bart85

  • Lid
Re: c++: Segmentatiefout
« Reactie #6 Gepost op: 2015/02/26, 18:36:23 »
De bedoeling was dat eerst een regel een woord word weergeven met ervoor uit welke taal het komt en vervolgens op de volgende regel de taal waar het naartoe moet worden vertaald. Het antwoord kan dan opdezelfde regel worden neergezet. Het weergeven van de taal werkt met pointers. Er word willekeurig een woord weergeven. Ook de taal is willekeurig
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.