Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

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

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

Offline bartveurink

  • Lid
  • Steunpunt: Nee
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)

Offline Paul Matthijsse

  • Lid
  • Steunpunt: Ja
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.

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
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 bartveurink

  • Lid
  • Steunpunt: Nee
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 »

Offline bartveurink

  • Lid
  • Steunpunt: Nee
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 »

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
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 bartveurink

  • Lid
  • Steunpunt: Nee
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