6 svar
63 visningar
Didar 208
Postad: 1 okt 2022 01:52

varningmeddelande

Hej jag förstår mig inte på varför jag får följande gul meddelanden i min kod, kan nån hjälpa mig bli av med de?

Hondel 1372
Postad: 1 okt 2022 05:59

De två sista handlar om att du inte initialiserat variablerna till några värden, så när du exempelvis gör jämförelsen guess == number första gången kommer du jämföra guess med det värde som C initialiserar number till. Jag vet inte vilket det värdet är, kanske 0, kanske något annat. Så du gör bäst i att sätta de två variablerna till de värden du vill att de ska ha från början 

anders_k Online 237
Postad: 1 okt 2022 09:36 Redigerad: 1 okt 2022 09:38

kompilatorn verkar vilja ha funktionerna definierade efter main()

dvs

int randomNum();
int main()
{...}
int randomNum()
{...}

---

srand(time(NULL));

om du kollar hur time är deklarerad ser du att den returnerar en time_t och inte en unsigned, så du får casta värdet

srand((unsigned)time(NULL));

---

Som Hondel redan sa, initialisera alltid dina variabler när du deklarerar så att de har väldefinierade värden, annars innehåller de slumpmässiga värden och då kan du komma i situationer där programmet fungerar ibland och ibland inte.

Det är också rekommenderat att du kollar retur värdet av scanf, den talar om ifall den lyckats läsa in ett värde eller inte.
Om scanf returnerar 0 innebär det att "guess" inte innehåller något vettigt värde.

Om du skall använda scanf så använd format specifier " %d" med ett mellanslag framför för att slippa skräp som newline vilket ligger kvar om du loopar.

Det är bättre - när man läser från tangenbordet - att använda sig av fgets och sedan sscanf eftersom med fgets kan du begränsa antalet tecken som kommer in i bufferten Som det är nu så om någon gör en faceroll på tangentbordet så kan ditt program krasha.

Laguna Online 30305
Postad: 1 okt 2022 13:02

Det första meddelandet, om int randomNum(), handlar om att det är ett sätt att skriva som gällde i äldre versioner av C, t.ex. det som kallas K&R (Kernighan and Ritchie). Språket C har alltid utvecklats långsamt och försiktigt. Det kommer ut en ny version ungefär vart tionde år, och man förbjuder inte gamla föråldrade konstruktioner förrän efter kanske 20 eller 30 år. Det brukar dröja länge innan de flesta använder en ny version. C-90, C-99, C-11 är de jag känner till, det borde vara en ny på väg nu. Det är möjligt att C-99 fortfarande är vanligare än C-11.

I någon version infördes så kallade prototyper, vilket betyder att man anger alla argument till en funktion med sin typ när man definierar funktionen. Om man talar om en funktion int randomNum() så betyder inte det att den inte tar argument, det betyder att man inte säger någonting om argumenten. Rätt sätt numera (och de senaste 30 åren) är att skriva "void" i stället för argumenten: int randomNum(void).

Det är det som menas med old-style function definition. Stoppa in "void" där och se om den slutar klaga. Jag är inte helt säker på vad resten av meddelandet vill säga.

 I en kompilator kan man ofta välja vilken C-version man vill använda.

Didar 208
Postad: 1 okt 2022 14:38
Hondel skrev:

De två sista handlar om att du inte initialiserat variablerna till några värden, så när du exempelvis gör jämförelsen guess == number första gången kommer du jämföra guess med det värde som C initialiserar number till. Jag vet inte vilket det värdet är, kanske 0, kanske något annat. Så du gör bäst i att sätta de två variablerna till de värden du vill att de ska ha från början 

Tack!!

Didar 208
Postad: 1 okt 2022 14:38
anders_k skrev:

kompilatorn verkar vilja ha funktionerna definierade efter main()

dvs

int randomNum();
int main()
{...}
int randomNum()
{...}

---

srand(time(NULL));

om du kollar hur time är deklarerad ser du att den returnerar en time_t och inte en unsigned, så du får casta värdet

srand((unsigned)time(NULL));

---

Som Hondel redan sa, initialisera alltid dina variabler när du deklarerar så att de har väldefinierade värden, annars innehåller de slumpmässiga värden och då kan du komma i situationer där programmet fungerar ibland och ibland inte.

Det är också rekommenderat att du kollar retur värdet av scanf, den talar om ifall den lyckats läsa in ett värde eller inte.
Om scanf returnerar 0 innebär det att "guess" inte innehåller något vettigt värde.

Om du skall använda scanf så använd format specifier " %d" med ett mellanslag framför för att slippa skräp som newline vilket ligger kvar om du loopar.

Det är bättre - när man läser från tangenbordet - att använda sig av fgets och sedan sscanf eftersom med fgets kan du begränsa antalet tecken som kommer in i bufferten Som det är nu så om någon gör en faceroll på tangentbordet så kan ditt program krasha.

Tack för svar!

Didar 208
Postad: 1 okt 2022 14:39
Laguna skrev:

Det första meddelandet, om int randomNum(), handlar om att det är ett sätt att skriva som gällde i äldre versioner av C, t.ex. det som kallas K&R (Kernighan and Ritchie). Språket C har alltid utvecklats långsamt och försiktigt. Det kommer ut en ny version ungefär vart tionde år, och man förbjuder inte gamla föråldrade konstruktioner förrän efter kanske 20 eller 30 år. Det brukar dröja länge innan de flesta använder en ny version. C-90, C-99, C-11 är de jag känner till, det borde vara en ny på väg nu. Det är möjligt att C-99 fortfarande är vanligare än C-11.

I någon version infördes så kallade prototyper, vilket betyder att man anger alla argument till en funktion med sin typ när man definierar funktionen. Om man talar om en funktion int randomNum() så betyder inte det att den inte tar argument, det betyder att man inte säger någonting om argumenten. Rätt sätt numera (och de senaste 30 åren) är att skriva "void" i stället för argumenten: int randomNum(void).

Det är det som menas med old-style function definition. Stoppa in "void" där och se om den slutar klaga. Jag är inte helt säker på vad resten av meddelandet vill säga.

 I en kompilator kan man ofta välja vilken C-version man vill använda.

Tack!!

Svara
Close