Länknings fel? Fel värde på variabel.

Permalänk
Medlem

Länknings fel? Fel värde på variabel.

Hejsan

Sitter här med ett program och det har blivit lite fel. Ska försöka beskriva problemet och inte skriva all kod som blir för mycket.

Men jag har en funktion void handleDices(Dice dices[], bool locked[]);

Sen i main ska jag anropa den. Dice dices[] är ju en array i en klass.
Så jag vet inte hur jag ska anropa funktionen i main då.

jag skriver handleDices(dices, locked);
men det blir fel, sen skrev jag:

Dice *myDices = new Dice(6);
det fungerade med handleDices(myDices, locked);
men då blev värden helt fel från funktionen då jag kastade tärningarna. Så insåg att det inte blev samma variabel. Fick minusvärden.

Så hur ska jag skriva för att kunna använda samma värden som jag fick när jag slumpade ut värden i klassfunkionen toss.

dice.toss();

verkar vara problemet med handleDices(dices[], locked); går inte skriva tex. Någon som har nåt förslag.

Hoppas jag har förklarat tillräckligt bra, i värsta fall får jag väl ha hela koden.

Okej, här kommer även koden

#ifndef _DICE_H #define _DICE_H #include <iostream> #include <ctime> using namespace std; class Dice { private: int values; int nrOfDices; public: Dice(); Dice(int nrOfDices); void toss(); int getValue(); int dices[]; }; #endif #include "Dice.h" Dice::Dice() { values = 0; nrOfDices = 5; dices[5]; } Dice::Dice(int nrOfDices) { nrOfDices = 5; } void Dice::toss() { srand((unsigned int)time(0)); for(int i = 0; i < nrOfDices; i++) { dices[nrOfDices] = rand() % 6 + 1; cout << dices[i] << endl; } } int Dice::getValue() { for(int i = 0; i < nrOfDices; i++) { values += dices[i]; } return values; } #include "Dice.h"; void resetProtocol(int protocol[]); int valueOfDiceFace(int diceFace, Dice dices[]); void addToProtocol(int diceFace, int protocol[], Dice dices[]); void toss(Dice dices[], bool locked[]); void showDices(Dice dices[]); void unlockDices(bool locked[]); void handleDices(Dice dices[], bool locked[]); void showProtocol(int protocol[]); void resetProtocol(int protocol[]) { for(int i = 1; i < 7; i++) { protocol[i] = 0; } } int valueOfDiceFace(int diceFace, Dice dices[]) { for(int i = 1; i < 7; i++) { dices[i]; } return 0; } void addToProtocol(int diceFace, int protocol[], Dice dices[]) { for(int i = 0; i < 7; i++) { } } void toss(Dice dices[], bool locked[]) { const int SIZE = 6; srand((unsigned int)time(0)); for(int i = 0; i < 7; i++) { if(locked[i] == true) { dices[i]; } else { dices[i] = rand() % 6 + 1; } } } void showDices(Dice dices[]) { } void unlockDices(bool locked[]) { for(int i = 0; i < 7; i++) { locked[i] = 0; cout << locked[i]; } } void handleDices(Dice dices[], bool locked[]) { const int SIZE = 5; int nr = 0; int dice[5]; cout << "Skriv in vilken siffra du vill samla på: "; cin >> nr; cin.ignore(); for(int i = 0; i < SIZE+1; i++) { dices[i]; } } void showProtocol(int protocol[]) { for(int i = 1; i < 7; i++) { cout << i << "or: "; cout << protocol[i] << endl; } } int main() { setlocale(0, "swedish"); Dice dice; srand((unsigned int)time(0)); bool run = true; int dicesFace = 0; Dice dices[6]; bool locked[5]; int protocol[5]; resetProtocol(protocol); unlockDices(locked); while(run) { showProtocol(protocol); system("pause"); dice.toss(); handleDices(dices, locked); } return 0; }

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem

Kod säger mer än 1000 ord

Visa signatur

weeeee

Permalänk
Medlem

har det inte riktigt i huvudet, men tänk dig att
Dice[6] d;
skappar en array av storlek 6, men de 6 tärningarna är inte skapade, så följ det med typ
for (int i = 0; i < 6; ++i) {
d[i] = new Dice;
}

edit: förövrigt så är arrayer lite begränsande ibland, jag hade själv nog hellre jobbat med en vector<Dice> istället.

grammar, ny plan
Permalänk
Medlem

När du i klassen Dice deklarerar "int dices[];" så har du deklarerat en array av storlek noll, vilket inte är tillåtet i C++. Om du vill ha en array med t.ex. 6 element så måste du också deklarera att den har 6 element med "int dices[6];". Om du gör på det sättet så ska du dock inte allokera dem med new som helmet visar, det kommer inte ens kompilera. Om du säger att du vill ha en array med 6 element så kommer de sex elementen att automatiskt allokeras.

Om du däremot vill ha ett dynamiskt antal element i arrayen så kan du antingen använda en pekare och allokera en array med new[] (se här), eller så använder du t.ex. vector från C++ standardbibliotek istället.

Tänk också på att i en array av storlek 6 så har det första elemented index 0 och det sista index 5, inte 6. Så de flesta av dina for-loopar kommer försöka komma åt elementet som är precis utanför arrayen, vilket kommer att göra så att ditt program kraschar om du har tur (om du har otur så kan precis vad som helst hända).

Du borde hur som helst slå på mer varningar i din kompilator så att den varnar om såna här saker. Här är t.ex. vad GCC ger med -Wall-flaggan (Dice.h:18:12 betyder t.ex. att det är fel i Dice.h på rad 18, kolumn 12):

In file included from Dice.cpp:2:0: Dice.h:18:12: varning: ISO C++ förbjuder vektor "dices" med storlek noll Dice.cpp: I konstruerare "Dice::Dice()": Dice.cpp:8:10: varning: statement har ingen effekt In file included from main.cpp:2:0: Dice.h:18:12: varning: ISO C++ förbjuder vektor "dices" med storlek noll main.cpp: I funktion "int valueOfDiceFace(int, Dice*)": main.cpp:25:11: varning: beräknat värde används inte main.cpp:25:11: varning: statement har ingen effekt main.cpp: I funktion "void toss(Dice*, bool*)": main.cpp:47:12: varning: beräknat värde används inte main.cpp:47:12: varning: statement har ingen effekt main.cpp:41:12: varning: oanvänd variabel "SIZE" main.cpp: I funktion "void handleDices(Dice*, bool*)": main.cpp:79:12: varning: beräknat värde används inte main.cpp:79:12: varning: statement har ingen effekt main.cpp:73:12: varning: oanvänd variabel "dice" main.cpp: I funktion "int main()": main.cpp:98:6: varning: oanvänd variabel "dicesFace"

Radnummren kan vara lite olika för jag var lov att även inkludera cstdlib-headern som innehåller rand och srand. Och på tal om det så behöver du bara anropa srand en enda gång i början av programmet, annars kan du få problem (se mer).

Permalänk
Medlem

Ja, koden är inte fullständig, har gjort så många ändringar så mycket har blivit konstigt. Men jag ska använda fält, enligt funktionen så ska det vara Dice dices[]; men blir fel hur jag än deklarerar. Hur ska jag få det att fungera i klassen och både utanför?

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem

Dice dices[] betyder olika om det är ett funktionsargument eller en instansvariabel i en klass. Som funktionsargument så betyder det att funktionen tar en array av Dice av vilken storlek som helst. Som instansvariabel i en klass så betyder det en tom array av Dice, vilket som sagt inte är tillåtet.

Så du måste som sagt tala om för klassen hur många Dice arrayen ska innehålla genom att deklarera den som t.ex. Dice dices[6].

Permalänk
Medlem
Skrivet av perost:

Dice dices[] betyder olika om det är ett funktionsargument eller en instansvariabel i en klass. Som funktionsargument så betyder det att funktionen tar en array av Dice av vilken storlek som helst. Som instansvariabel i en klass så betyder det en tom array av Dice, vilket som sagt inte är tillåtet.

Så du måste som sagt tala om för klassen hur många Dice arrayen ska innehålla genom att deklarera den som t.ex. Dice dices[6].

men har deklarerat den som Dice dices[6], men den fungerar inte ändå

Blir del märker jag för i Dice är dice en int, sen är den Dice dices[6]; vilket då det blir fel.

Skulle väl kunna göra om alla till int, men så vill de tydligen inte man ska göra utan istället använda Dice dices[], vilket då man inte kan jämföra int med en klass, eller så.

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem

Ok, jag blandade visst ihop det lite där. Men vad är det som inte fungerar än?

Jag antar att detta är en skoluppgift, och att du fått funktionsdefinitionerna givna av läraren? Du kanske har missförstått vad klassen ska representera i så fall? Just nu har du ju en klass Dice som representerar en samling av tärningar, och sen försöker du skapa en array av Dice. Min gissning är att klassen Dice endast ska representera en enda tärning (även om tärning på engelska är die, medan tärningar är dice).

Något att tänka på är förresten att du faktiskt aldrig skriver ut vad tärningarna har för värde någonstans.

Permalänk
Medlem
Skrivet av perost:

Ok, jag blandade visst ihop det lite där. Men vad är det som inte fungerar än?

Jag antar att detta är en skoluppgift, och att du fått funktionsdefinitionerna givna av läraren? Du kanske har missförstått vad klassen ska representera i så fall? Just nu har du ju en klass Dice som representerar en samling av tärningar, och sen försöker du skapa en array av Dice. Min gissning är att klassen Dice endast ska representera en enda tärning (även om tärning på engelska är die, medan tärningar är dice).

Något att tänka på är förresten att du faktiskt aldrig skriver ut vad tärningarna har för värde någonstans.

Ja, har fått hur klassen ska se ut och har fått prototypfunktionerna.

jag skrev ut vad tärningarna blev innan, när jag hade int dices[i], då kunde jag jämföra och skriva ut, men eftersom alla andra funktioner krävde en Dice dices[] så blev det helt annorlunda. Jag ska ha 5 tärningar och man ska kunna kasta 3 kast och låsa tärningarna så man bestämmer vilka man sen vill kasta osv.

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S

Permalänk
Medlem

Återupplivar denna tråden istället för att skapa en ny

Men jag har nytt problem nu med två klass metoder:

void Dice::toss()
{
nrOfFaces = rand() % 6 + 1;
cout << nrOfFaces << " ";
}

int Dice::getValue()
{
return nrOfFaces;
}

jag har nrOfFaces som private klassvariabel, men varför ändras inte värdet på nrOfFaces i getValue när jag ändrat värde på den i getValue? varför blir den fortfarande 0 ?

Visa signatur

ATX: Intel Core i5 4690k | Asus Z97-A | MSI R9 390 8GB | 2x Corsair DDR3 2133Mhz | Crucial BX480Gb | Corsair TX650W | Fractal Design Define R4
mITX: Intel Core i3 6100 | Asus B150I | 2x8Gb Corsair DDR4 2133Mhz | Samsung 850 Evo 500GB | Cooler Master V750 | Fractal Design Define Nano S