Permalänk
Medlem

segmentation fault c++

void sok(queue<person>& a, person b, string s)
{
b = a.front();
cout << "Skriv in förnamnet på personen du söker: ";
cin >> s;
while(s != b.fornamn){
a.pop();
a.push(b);
b = a.front();
}
}

när jag försöker ladda ovanstående funktion säger programmet segmentation fault, det kompileras helt, kör andra funktioner, men just denna ger mig segmentation fault D :
Vad gör jag för fel?

Permalänk

Bör du inte använda "compare" i jämförelsen?

while(s.compare(b.fornamn) != 0)

Permalänk
Hedersmedlem
Skrivet av Korkskruv:

Bör du inte använda "compare" i jämförelsen?

while(s.compare(b.fornamn) != 0)

Compare erbjuder lite fler alternativ, men så länge man bara vill se om strängarna är lika borde == fungera lika bra.

Hur ser för övrigt person-klassen ut? Tappar man bort någon pekare eller så när man kopierar sådana objekt?

Permalänk
Medlem

vad jag märkt så tappar jag inget, bara att nu verkar programmet hantera min person b som en read only variabel, vilket förstör loopen ;o

Permalänk
Skrivet av Elgot:

Compare erbjuder lite fler alternativ, men så länge man bara vill se om strängarna är lika borde == fungera lika bra.

Du har förstås rätt. Jag har haft problem (antagligen med pekare till strängar) med det så många gånger så att jag nuförtiden endast använder compare.

Noterade en annan sak nu när jag tittade på koden igen. Det blir fel om kön är tom.
Edit: while-loopen verkar bli oändlig om det sökta värdet inte finns i kön.

Permalänk
Hedersmedlem
Skrivet av Athkore:

vad jag märkt så tappar jag inget, bara att nu verkar programmet hantera min person b som en read only variabel, vilket förstör loopen ;o

Använder du någon exotisk kompilator (jag lyckas inte få det att krascha med varken vc++ eller gcc)? Sedan misstänker jag att du ändå vill att b skall vara en referens (om du vill att funktionen skall returnera det funna objektet (och annars verkar det onödigt att ha b som funktionsparameter)).

Permalänk
Medlem
Skrivet av Elgot:

Compare erbjuder lite fler alternativ, men så länge man bara vill se om strängarna är lika borde == fungera lika bra.

Har för mig att == endast returnerar true om två strängar pekar på exakt samma adress i minnet. Så är det iaf i Java.

Visa signatur

DAN Cases A4-SFX | AMD Ryzen 7 9800X3D | Thermalright AXP90-X47 Full Copper |
INNO3D GeForce RTX 4070 Ti SUPER 16GB Twin X2 | Kingston 32GB (2x16GB) DDR5 6000MHz CL30 | ASUS ROG Strix B650E-I Gaming WIFI | Samsung 960 EVO 1TB | Corsair SF-600

Permalänk
Hedersmedlem
Skrivet av Nioreh83:

Har för mig att == endast returnerar true om två strängar pekar på exakt samma adress i minnet. Så är det iaf i Java.

Så är det om man jämför två char-fält (eller andra pekare), men i det här fallet verkar han använda std::string-objekt.

Permalänk
Medlem

vet att det blir fel om kön är tom, och att den blir oändlig om det sökta resultatet inte finns med :x

kör gnu gcc ;o

Permalänk
Medlem

Du får nog visa lite mer kod om du ska få någon hjälp med ditt problem. Koden som du visat verkar ju inte innehålla något uppenbart fel, så förmodligen finns felet någon annanstans i din kod. Annars så kan du ju se det här som ett utmärkt tillfälle att lära dig hur en debugger fungerar

Permalänk
Medlem

Kompilera programmet med -O0 -g för att få ooptimerad kod med debuginfo. Gör sedan programmet genom gdb för att se var det smäller, då kan du även inspektera variabler och kan lista ut vad du skrivit fel. Att använda en debugger är A och O vid felsökning.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Hedersmedlem
Skrivet av Athkore:

void sok(queue<person>& a, person b, string s)
{
b = a.front();
cout << "Skriv in förnamnet på personen du söker: ";
cin >> s;
while(s != b.fornamn){
a.pop();
a.push(b);
b = a.front();
}
}

när jag försöker ladda ovanstående funktion säger programmet segmentation fault, det kompileras helt, kör andra funktioner, men just denna ger mig segmentation fault D :
Vad gör jag för fel?

Ställ dig själv ett par frågor:

1. Varför är person b ett argument till funktionen?
2. Vad händer om inget objekt i listan uppfyller s == b.fornamn?
3. Vad är en iterator?

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."