Permalänk
Medlem

C++: ++ funktion funkar inte

Jag har två problem med min kod som jag inte riktigt förstår.

Första problemet är att min funktion faktiskt inte påverkar min variabel i "main" funktionen.

Det andra problemet är att jag inte kan använda "else" efter att ha kallat funktionen i "if". Jag kan lösa detta genom att göra en ny "if" funktion men undrar ändå i utbildningssyfte varför detta inte går.

Här är koden:

#include <iostream> #include <string> using namespace std; int increment(int x); int main () { int x = 0; string solution; string answer; cout << "name: "; cin >> answer; solution = "fredrik"; if (answer == solution) cout << "correct\n"; increment (x); if (answer != solution) cout << "incorrect\n"; cout << "points: " << x; char f; cin >> f; return 0; } int increment(int x) { ++x; return x; //funkar kanske lika bra med "return ++x;"? }

Visa signatur

Asus P8P67 Deluxe B3 | Intel i7-2600k@3,4GHz | 16 GB Corsair Vengeance LP 1600Mhz CL9 | Asus GTX 580 Matrix@900Mhz | Corsair Force GT 120GB | WD Caviar Black 1TB | Corsair 850 AX | Fractal Design R4 | Dell u2410 | Qpad MK-80 | QPad 5K

CITERA FÖR SVAR!

Permalänk
Medlem

du tänker rätt, men man måste försåt hur c++ fungerar.
Det du gör nu är att du skickar in en kopia på X in i funktionen, men eftersom du returnerar x så fungerar det, OM du skriver

x = increment(x);

det du däremot kan göra är att sätta & framför i variabel namnet i funktionsheadern, så skickar du in en referens av x. Då behöver kan du även ta bort retur typ och return raden. dvs

void increment(int& x) { x++; }

och sillnaden medan x++ och ++x är typ när den adderar, eller hur. minns inte exakt hur de var men de kanske någon annan kan svara på om du undrar, eller får du googla lite

edit:

såg problem 2 nu
felet är att du inte har måsvingar. Det som körs inne i if-satsen då är bara första raden. Och eftersom ifsatsen inte då kommer på radne ovanför else så blir kompilatorn förvirrad antar jag.
Detvillsäga, såhär bör det vara

if (answer == solution) { cout << "correct\n"; increment (x); } else { cout << "incorrect\n"; }

Ska du bara ha en rad som körs efter en ifsats, eller else, så behövs inga måsvingar, men det kan vara bra att slänga in ändå för att förtydliga och att lära dig det.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem

Hej!
Läs på om "call by reference" och "call by value". Två fundamentala principer vad gäller all programmering.

Ang If else problemen så titta noga på syntaxen för If satser i C/C++. Det är lite förvirrande:

Om du bara har *en* sats i If satsen så kan du skriva
if (answer == solution)
cout << "correct\n";

om du däremot har flera satser som ska ingå, så måste du skriva
if (answer == solution) {
cout << "correct\n";
increment (x);}

dvs omringa med måsvingar. Gör du inte det kommer bara första satsen att ingå i If'et. Det spelar ingen roll att du indenterat rätt.

if (answer == solution) {
cout << "correct\n";
increment (x); <-- Den här satsen exekveras oavsett om If villkoret ovan gäller.

Lycka till med kursen!

Permalänk
Medlem

Ett tips är att alltid använda klammerparenteser, oavsett om du bara har en sats efter if-satsen. Annars händer det lätt att du vill lägga till en sats till och missar att du inte har några klammerparenteser runt if-satsen, vilket kan leda till väldigt frustrerande buggar.

Permalänk
Medlem
Skrivet av E_maN:

du tänker rätt, men man måste försåt hur c++ fungerar.
Det du gör nu är att du skickar in en kopia på X in i funktionen, men eftersom du returnerar x så fungerar det, OM du skriver

x = increment(x);

det du däremot kan göra är att sätta & framför i variabel namnet i funktionsheadern, så skickar du in en referens av x. Då behöver kan du även ta bort retur typ och return raden. dvs

void increment(int& x) { x++; }

och sillnaden medan x++ och ++x är typ när den adderar, eller hur. minns inte exakt hur de var men de kanske någon annan kan svara på om du undrar, eller får du googla lite

edit:

såg problem 2 nu
felet är att du inte har måsvingar. Det som körs inne i if-satsen då är bara första raden. Och eftersom ifsatsen inte då kommer på radne ovanför else så blir kompilatorn förvirrad antar jag.
Detvillsäga, såhär bör det vara

if (answer == solution) { cout << "correct\n"; increment (x); } else { cout << "incorrect\n"; }

Ska du bara ha en rad som körs efter en ifsats, eller else, så behövs inga måsvingar, men det kan vara bra att slänga in ändå för att förtydliga och att lära dig det.

Där har vi det! Tackar! Men, jag kan ändå inte få problem 1 att fungera.

#include <iostream> #include <string> using namespace std; int increment(int x); int main () { int x = 0; string solution; string answer; cout << "name: "; cin >> answer; solution = "fredrik"; if (answer == solution) { cout << "correct\n"; increment (x); } else cout << "incorrect\n"; cout << "points: " << x; char f; cin >> f; return 0; } int increment(int &x) { ++x; }

Här får jag felet "error C4716: 'increment' : must return a value". Är det för att jag kallar adressen av x och inte använder en pointer?

För om jag däremot ändrar till

int increment(int &x) { return ++x; }

Får jag :

unresolved external symbol "int __cdecl increment(int)" (?increment@@YAHH@Z) referenced in function _main

fatal error LNK1120: 1 unresolved externals

Tack för hjälpen dock! Glömde helt bort att jag måste använda pointers, är självlärd så det går ganska sakta framåt.

Visa signatur

Asus P8P67 Deluxe B3 | Intel i7-2600k@3,4GHz | 16 GB Corsair Vengeance LP 1600Mhz CL9 | Asus GTX 580 Matrix@900Mhz | Corsair Force GT 120GB | WD Caviar Black 1TB | Corsair 850 AX | Fractal Design R4 | Dell u2410 | Qpad MK-80 | QPad 5K

CITERA FÖR SVAR!

Permalänk
Medlem
Skrivet av perost:

Ett tips är att alltid använda klammerparenteser, oavsett om du bara har en sats efter if-satsen. Annars händer det lätt att du vill lägga till en sats till och missar att du inte har några klammerparenteser runt if-satsen, vilket kan leda till väldigt frustrerande buggar.

Det ligger nog en hel sanning i det. Får göra det till en vana härefter.

Visa signatur

Asus P8P67 Deluxe B3 | Intel i7-2600k@3,4GHz | 16 GB Corsair Vengeance LP 1600Mhz CL9 | Asus GTX 580 Matrix@900Mhz | Corsair Force GT 120GB | WD Caviar Black 1TB | Corsair 850 AX | Fractal Design R4 | Dell u2410 | Qpad MK-80 | QPad 5K

CITERA FÖR SVAR!

Permalänk
Medlem
Skrivet av Lillem4n:

Här får jag felet "error C4716: 'increment' : must return a value". Är det för att jag kallar adressen av x och inte använder en pointer?

För om jag däremot ändrar till

int increment(int &x) { return ++x; }

Får jag :

unresolved external symbol "int __cdecl increment(int)" (?increment@@YAHH@Z) referenced in function _main

fatal error LNK1120: 1 unresolved externals

Du får ändra din övre rad till:

void increment(int &x);

samt din funktion kan se ut:

void increment(int &x) { x++; }

du kallar den då genom:

increment(x);

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Du får ändra din övre rad till:

void increment(int &x);

samt din funktion kan se ut:

void increment(int &x) { x++; }

du kallar den då genom:

increment(x);

Jag lyckades lösa problemet själv men den lösningen involverade skapandet av pointer och mer kod.

Tack för en mycket enklare lösning

(får ursäkta om jag är lite klumpig, eftersom jag är självlärd och extrem nybörjare så måste jag lära mig krypa innan jag kan gå)

Återigen tack till alla för er hjälp. Det finns många krångligt förklarade lösningar med dålig kod och jag har fått betydligt bättre hjälp av er än av andra.

Visa signatur

Asus P8P67 Deluxe B3 | Intel i7-2600k@3,4GHz | 16 GB Corsair Vengeance LP 1600Mhz CL9 | Asus GTX 580 Matrix@900Mhz | Corsair Force GT 120GB | WD Caviar Black 1TB | Corsair 850 AX | Fractal Design R4 | Dell u2410 | Qpad MK-80 | QPad 5K

CITERA FÖR SVAR!