Permalänk
Hedersmedlem

Hjälp med C++ (grunder?)

Om man nu inte får jobb under sommaren tänka jag lära mig lite programmering istället så jag ändå gör någon nytta för mig själv. Så jag tänkte mig sätta igång och göra tre-i-rad i C++ eftersom det inte kändes allt för svårt men jag stötte på problem ganska snabbt.

Jag tänkte börja med att göra lite enklare funktioner som att skapa ett bräde och läste på lite och ska använda multidimensionell array. Hittade inget sätt att enkelt fylla en sån array med ett värde så jag tänkte göra en funktion med loopar. Förmodligen är det ett syntaxproblem eller någon enkel miss jag gjort, ny som man är så ser man det inte.

#include <iostream> using namespace std; int board[3][3]; int n, m; void Initialize(int arr[][3]) { for(n=0; n<3; n++) for(m=0; m<3; m++) { arr[n][m] = 0; } } void Print(int arr[][3]) { for(n=0; n<3; n++) for(m=0; m<3; m++) { cout << arr[n][m] << endl; } } int Main() { Initialize(board); Print(board); return 0; }

Permalänk
Medlem

1) Missade att du inte deklarerar m och n i for looparna, detta är standard.

2) Nu var det ett tag sedan jag programmerade just C++, men jag skulle tro att problemet är hur du skickar variabeln board som parameter till funktionerna. Om jag inte är helt ute och cyklar så är det snarare så att du skickar en kopia av board till funktionerna och sedan kastar bort resultatet.

Antingen så får du använda return i funktionerna och skriva typ board = Initialize(board) eller så får du använda en pekare till board. Då blir det något i stil med Initialize(&board). Eller om du nu ändå ska ha en global variabel board så behöver du ju inte ha några inparametrar överhuvudtaget och det är väl den enklaste lösningen.

Jag vill lägga in en brasklapp om att det var ett tag sedan jag programmerade C++ och jag har för tillfället ingen kompilator för C++ så jag kan inte testa det hela heller.

Visa signatur

| Errare humanum est |

Permalänk
Hedersmedlem

Detta är sidan jag har tittat på: Arrays

Angående variablerna n och m så förstod jag det som att de är styrvariabler för for-looparna. Annars får man deklarera dem i loopen som så att: for(int n=0;...). Men att ha dem som globala kanske är fult iofs.

Det här med referens i C++ har jag inte riktigt fått häng på. Någon skulle gärna få förklara det. Jag antar att det är vad du är ute efter med '&'. Pekare i C++ är väl *?

Permalänk
Medlem

Faktum är din kod är korrekt förutom att du har ett stort M på Main, när det borde vara main

I C++ så skickas alla funktionsargument som ett värde. När det gäller arrayer så skickas addressen till arrayen, vilket innebär att din kod faktiskt fungerar.

När det gäller referenser så fungerar de ungefär som pekare. Om vi t.ex. har följande funktion:

void f(int arg) { arg = 4; } int i = 3; f(i);

Då kommer värdet av i efter funktionanropet fortfarande vara 3, eftersom endast i:s värde skickades som argument till funktionen. Om vi istället använder pekare så får vi:

void f(int *arg) { *arg = 4; } int i = 3; f(&i);

Då skickar vi addressen av i som argument till funktionen, där &-operatorn helt enkelt tar fram addressen till variabeln. Vi kan därför inte ändra på vad pekaren som skickas in pekar på, men vi kan ändra på det som pekaren pekar på med hjälp av *-operatorn, och i kommer därför att ha värdet 4 efter funktionsanropet. Variabler och pekare har funnits med sedan vanliga C, men i C++ så introducerades även referenser. En referens är egentligen bara så kallat "syntaktiskt socker" för pekare som gör det enklare att använda pekare. Om vi istället använder en referens så ser det ut så här:

void f(int &arg) { arg = 4; } int i = 3; f(i);

Även i detta fallet kommer i efter funktionanropet att ha värdet 4. En referens fungerar alltså ungefär som en pekare, men man behöver inte använda & och *-operatorerna. En referens är alltså en pekare i botten, med syntaxen är lite enklare.

När det gäller arrayer så kan man inte skicka ett helt block med data som argument till en funktion i C++, så istället så skickas addressen till arrayen.

När det gäller resten av din kod så är det inte vidare snyggt att använda globala for-iteratorer. Gör istället om n och m till konstanta värden som talar om storleken på brädet, och använd dem i looparna:

const int N = 3; // Globala konstanter brukar vanligvis skrivas med stora bokstäver const int M = 3; int board[N][M]; void Initialize(board[N][M]) { for(int i = 0; i < N; ++i) { for(int j = 0; j < M; ++j) { board[N][M] = 0; } } }

Ännu bättre vore att kapsla in allt som har med brädet i en egen klass, men det blir väl en senare lektion antar jag

Permalänk
Hedersmedlem

Jag läste på lite om pekare och referenser också: Pointers

& tar alltså bara fram adressen för variabeln och inte vad som ligger i adressen. Och sen om man använder *-operatorn så tar den fram vad som finns på adressen?

EDIT: tack för att du hittade det klantiga felet. Har så usel kompilator som jag verkligen hatar. Vet inte varför den används i skolan. Den gav följande:

Odefinierad först refererad
symbol i fil
main /sw/gcc-3.4.6/lib/gcc/sparc-sun-solaris2.10/3.4.6/crt1.o
ld: allvarligt: Symbolreferensfel. Inga utdata skrivs till a.out
collect2: ld returned 1 exit status

Permalänk
Medlem

kör visual c++ express annars, gratis och bra tycker jag fast är det inte det ni använder i skolan så blir det ju kanske lite dumt.

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
Hedersmedlem

Har hela Visual Studio 05 installerat men tycker det är krångligt. Det känns som det är så mycket mer att hålla koll på då, har inte riktigt förstått organisationen med filerna än. Jag förstår mig inte riktigt på klasser och en del andra saker än heller.

Permalänk
Medlem

Du kan ju skapa tomma cpp filer med? Jag tycker det är rätt enkelt att använda iaf, skapa ny tom solution, lägger till en tom cpp-fil i "Source Files" och sen är det bara att tuta och köra

Fast nu finns ju visual studio 2010 express att ladda ner med heh

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
Hedersmedlem

har fixat express nu. Har skapat en ny solution och en cpp-fil med min kod som jag sparat. Men jag hittar inte vart man kompilerar och kör?

Permalänk
Medlem

Den lilla gröna play knappen högst uppe? Brevid Dropdown menyerna där su kan välja Debug, Release etc.

Permalänk
Hedersmedlem

mm, var ganska säker på att det var den men den är grå och går inte att trycka på.

jag har alltså skapat en ny fil och inte ett projekt. Borde det inte gå att kompilera/debugga/whatever en fil ändå..

Nu funkade det såklart. Visste inte att det var tvunget att vara ett projekt :S

Permalänk
Medlem
Skrivet av Shimonu:

mm, var ganska säker på att det var den men den är grå och går inte att trycka på.

jag har alltså skapat en ny fil och inte ett projekt. Borde det inte gå att kompilera/debugga/whatever en fil ändå..

Nu funkade det såklart. Visste inte att det var tvunget att vara ett projekt :S

skönt att det löste sig visual studio säger ju till lite grand vad som är fel med, och så har du intellisense, fungerar någolunda, om du t.ex skriver ett variabel namn, men minns inte vad den heter, kan du trycka ctrl + space ( finns något mer kommando men minns inte det ) så kommer det upp en lista med variabler/funktioner. Fungerar ju även på klasser och sånt, rätt smidigt

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
Avstängd

En sak som bör nämnas är att kulturen är att använda så lite pekare som möjligt i c++ samt att GCC är överlägsen MSVS (VS är dock en IDE och inte en kompilator). Dock är det meckigt att kompilera ett projekt som inehåller flera filer med GCC.

Permalänk
Medlem
Skrivet av E_maN:

skönt att det löste sig visual studio säger ju till lite grand vad som är fel med, och så har du intellisense, fungerar någolunda, om du t.ex skriver ett variabel namn, men minns inte vad den heter, kan du trycka ctrl + space ( finns något mer kommando men minns inte det ) så kommer det upp en lista med variabler/funktioner. Fungerar ju även på klasser och sånt, rätt smidigt

Man blir lite smått galen utan intellisense iaf om man har något större projekt...

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Man blir lite smått galen utan intellisense iaf om man har något större projekt...

det blir man verkligen "this" är skönt när man arbetar med klasser med

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 :)