webForumDet fria alternativet

Pekare

31 svar · 1 309 visningar · startad av LilleSkutt · sida 2 av 2

LilleSkuttMedlem sedan feb. 2001265 inlägg
#21

Precis, tvärtom :e

Jag har stött på flera konstiga(?) problem.

I en oändlig for-loop försöker jag hämta in input från användaren, och det fungerar hyfsat. Första gången man skriver in information. Efter det så brakar allt ihop, scriptet kör vidare på utan att ta emot nånting från användaren och lägger till information själv!

Kod:

counter = 0;
for( ; ; ) { /* Evighetsloop */
	/* Kolla om listan med monster är full */
	if(counter == MONSTER) {
		cout << "\n\n**************************\n";
		cout << "  Det finns inte plats för att lägga till fler monster!";
		break;
	}

	/* Listan var inte full, hämta information från användaren om monstret */
	cout << "\n\n**************************\n";
	cout << "  Namn på monster: ";
	cin.getline(monsterNamn, 25);

	cout << "\n  Färg på monster: ";
	cin.getline(monsterColor, 10);

	cout << "\n  Elakhetsvärde: ";
	cin.getline(monsterElakhet_TMP, 2);

	cout << "\n  Fulhetsvärde: ";
	cin.getline(monsterFulhet_TMP, 2);

	monsterElakhet	= monsterElakhet_TMP[0] - '0'; /* Gör om char till int för att lagra elakhetsvärde i klassen */
	monsterFulhet	= monsterFulhet_TMP[0] - '0'; /* Gör om char till int för att lagra fulhetsvärde i klassen */

	/* Skapa monster */
	minaMonster[counter++] = Monster(monsterNamn, monsterElakhet, monsterFulhet, monsterColor);

	cout << "\n\n**************************\n";
	cout << "  Alla monster:\n";

	/* Skriv ut alla monster, med namn, elakhet, fulhet och färg */
	for(int i = 0; i < counter; i++) {
		cout << "**************************\n";
		cout << "    Namn: "	<< minaMonster[i].getNamn()		<< "\n";
		cout << "    Elakhet: "	<< minaMonster[i].getElakhet()	<< "\n";
		cout << "    Fulhet: "	<< minaMonster[i].getFulhet()		<< "\n";
		cout << "    Färg: "		<< minaMonster[i].getColor()		<< "\n";
		cout << "**************************\n";
	}
}

Gör jag något som är helt galet?

------------------
---
/* LilleSkutt */

FridolfMedlem sedan aug. 2001723 inlägg
#22

Det är mycket som är galet ;-)

Men du har inte skrivit riktigt vad som händer så då är det svårt att peka på exakt vad av det galna som gör att det bli fel. Skrivs texten "Namn på monster:" ut andra gången? I så fall blir det fel när du använder funktionen cin.getline. Jag brukar inte använda cin och cout själv så jag vet inte riktigt hur man ska skriva. Det kan vara så att du måste använda någon flush-funktion som skulle kunna se ut som cin.flush(). Kolla vilka metoder som finns för cin. Du har inte heller skrivit vilka typer monsternamn osv är, det kan vara där det blir fel.

Annars är det lite allmänna saker som är galna och det kan jag ju tipsa om.

Först tycker jag inte att du ska använda en array till dina monster. Det finns flera bra inbyggda listklasser, tex vector. De har en massa bra metoder och du slipper ange ett fast antal monster som ska ingå som du måste göra med en array.

cin.getline(monsterFulhet_TMP, 2);
monsterElakhet= monsterElakhet_TMP[0] - '0';
Det här är inte bra. Skriver du in en bokstav vid prompten blir det konstiga värden och dessutom är det svårläsligt. Du kan använda funktionen atoi som omvandlar char* till int.

minaMonster[counter++]...
Det här slipper du om du använder vector och det är ett skolexempel på hur man skriver svårläslig kod. Använd inte nästlade instruktioner. Skriv istället
++counter;
minaMonster[counter]...
så blir det tydligare vad som händer.

cout << "\n\n**************************\n";
cout << " Alla monster:\n";
cin...
cout...

Du använder mycket inmatning och utmatning med cin och cout. Jag föreslår att du inför en klass som kan heta kanske Terminal och som har metoder void skrivseparator() och char *läsintext(char*) och som utför alla cin och cout. Det är ju trots allt ett objektorienterat språk du programmerar i. Vitsen är att det ska vara lätt att se vad programmet gör för någonting. Lycka till med programmet!

UlfTMedlem sedan maj 20018 027 inlägg
#23

En till synpunkt, du bör nog pröva din kod ordentligt så att du vet precis vad som händer innan du stoppar in allt i en oändlig for-loop. Det säger sig själv att risken med en sådan loop är just att den snurrar på i all oändlighet.

LilleSkuttMedlem sedan feb. 2001265 inlägg
#24

"Det är mycket som är galet ;-)"

Hmm, alltså det där var ju inte all kod som jag postade, utan bara for-loopen.

Funktionen atoi() har jag ju försökt använda, men nu när jag har bytt till Dev C++ finns inte biblioteket som funktionen låg i när jag använde Borland. Någon som vet om funktionen finns i Dev??

Det där med att skapa en klass för in- och utmatning var nog en smart grej... Ska prova :)

Hur använder jag mig av Vector då? Vilka funktioner är det som jag bör använda i klassen?

UlfT, det är ingen risk att for-loopen snurrar i all oändlighet, eftersom att jag har gjort en kontrollvariabel. Och det var inte det som var fel, så det är en sak jag har lyckats med! :h

------------------
---
/* LilleSkutt */

FridolfMedlem sedan aug. 2001723 inlägg
#25

så här ungefär

#include <vector>
...
std::vector<Monster> minamonster;
for bla bla {
mata in bla bla
Monster monstret(monsternamm, ....);
minamonster.push_back(monstret);

Om du vill skriva ut alla monster kan du fortfarande använda minamonster som du gör nu.

FridolfMedlem sedan aug. 2001723 inlägg
#26

atoi ligger i stdlib.h
Saknas filen eller låter du bara bli att inkludera den?

LilleSkuttMedlem sedan feb. 2001265 inlägg
#27

Jag har försökt inkludera den, men programmer säger att den inte existerar... Kan ju alltid prova igen :)

Tack för alla svar!

------------------
---
/* LilleSkutt */

BeatboxMedlem sedan okt. 20013 217 inlägg
#28

Får du fel vid kompileringen eller vid länkningen ?

// BeatBox

FridolfMedlem sedan aug. 2001723 inlägg
#29

Lille Skutt, det är lättare att hjälpa dig om du skriver exakt vad det blir för felmeddelande och inte bara "programmet sa att det inte gick".

Som du säger nu låter det som att du inte har sagt till kompilatorn att ta med katalogen där stdlib.h ligger när du kompilerar. Jag vet inte hur den kompilatorn som du använder fungerar men normalt är att det antingen finns ett inställningsfönster som du kan ändra i eller att du skriver det vid prompten när du kompilerar (tex programnamn -I katalog) eller att du har en fil med inställningar som du måste ändra i.

Har du kollat att filen verkligen finns?

LilleSkuttMedlem sedan feb. 2001265 inlägg
#30

Hmm, den fanns...
Jag inkluderade den så här:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
#include <iostream>
#include <cstring>
#include <stdlib>
...

Då sa kompilatorn att filen inte fanns. När jag istället skrev:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
#include <iostream>
#include <cstring>
#include <stdlib.h>
...

Då fungerade det. Skumt att man var tvungen att ha med .h:et på just den filen? :q

Nu har jag ivf fått atoi() att funka :)

Tack!

------------------
---
/* LilleSkutt */

SweyMedlem sedan apr. 20003 971 inlägg
#31

Det beror på vilket språk du använder.

C++:
#include <iostream>
#include <cstring>
#include <cstdlib>

C:
#include <string.h>
#include <stdlib.h>

I C finns inte iostream. I C++ inkluderar man C standard deklarationsfiler genom ett c före och utan ändelse. Det gäller dock bara standard-filerna.

------------------
- Swey
A hacker from the south

[Redigerat av Swey den 10 okt 2001]

LilleSkuttMedlem sedan feb. 2001265 inlägg
#32

Aha, nu hänger jag med :)
Det var alltså en C-fil...

------------------
---
/* LilleSkutt */

[Redigerat av LilleSkutt den 10 okt 2001]

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)