C: Problem med funktions anrop... strängar...

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1

Här är koden jag håller på med:

#include <stdio.h>
#include <string.h>
#include <WordGenerator.h>

int main (int argc, const char * argv[])
{
	char name1[31], name2[31];
	int p, points1=100, points2=100;

	printintro();

	for(p=1;p<3;p++)
	{
		printf("\nEnter name on player %d: ", p);
		if(p==1)
			gets(name1);
		else
			gets(name2);
	}
    
	do
	{
		round(points1, points2);
	}
	while(points1>0 || points2>0);

	return 0;
}

int round(int points1, int points2)
{
	int p=1, i, j, wordlen, pos;
	char letter, randomWord[50], guessWord[100];
	
	GenerateWord(randomWord);
	wordlen = strlen(randomWord);
	printf("\nword is: %s, length=%d\n", randomWord, wordlen);
	
	while(p>0)
	{
		guessWord = checkDraw(randomWord, guessWord, letter, wordlen);
		printf("%s\n", guessWord);
		printf("\nPlayer %d\nGuess a letter: ", p);
		scanf("%c", &letter);
	}
}

char checkDraw(const char *randomWord, char *guessWord, char letter, int wordlen)
{
	int m;

	if(letter)
	{
		for(m=0; m<wordlen; m++)
		{
			if(randomWord[m]==letter) //kolla om bokstaven finns med i ordet. byt ut om det finns.
				guessWord[m]=letter;
			else
				return 1; //skicka tillbaka ifall bokstaven inte finns med.
		}
	}
	else
	{
		for(m=0; m<wordlen; m++)
		{
			guessWord[m] = "_ "; //bygg det blanka ordet.
		}
	}
	return guessWord;
}

Felet jag får ligger i raden som är fet:
error: incomptible types in assignment
varför?
Suttit några timmar nu så jag är trött i hjärnan...
Kan någon hjälpa till?

  • Medlem
  • 2004-11-06 18:22

Incompatible types pga att du försöker tilldela en array av chars en char.

Du kan inte assigna till en array överhuvudtaget, förutom vid initieringstillfället.

Nu har jag inte undersökt vad ditt program ska göra, men det guessWord-arrayen kommer ju att modifieras innuti funktionen du anropar, så det verkar onödigt att returnera pekaren.

  • Oregistrerad
  • 2004-11-06 19:16

Sedan kan man fundera på varför du skickar in variablen "letter" till checkDraw utan att ha satt den till nåt värde (första gången). Sedan gör du lite saker som inte är så bra: enligt kommentarerna så skickar du tillbaka ett "sant/falskt" värde "return 1" men typen på returnvärdet indikerar en char (inte så bra kodning).

Jag inser nu att jag har gjort många fel...
Som jag sagt tidigare jag håller på att lära mig C oxh behöver en lång rad på pekningar vad jag gör för fel. Som ni gissat håller jag på att bygga en funktion som tar emot två arrayer och en bokstav.
Det är hänga gubbe jag försöker bygga för att jag vill lära mig sträng hantering vilket jag tycker är krångligt i C.

Dels randomWord som är ett framslumpat ord, guessWord är från början satt till lika många tecken som randomWord "_ _ _ _ _" t.ex.
En spelare gissar sedan en bokstav, letter, jag skickar sedan all denna info till en funktion för jämföra och editera guessWord vid behov.

Alltså som randomWord = Powerbook så är guessWord från början '_ _ _ _ _ _ _ _ _'.
Om då en spelare gissar på O ska alltså funktionen ta emot randomWord, guessWord och letter.
Den ska kolla om O finns med i randomWord ändra guessWord så att den ser ut så här '_ _ _ _ _ _ o o _' och sedan retunera nya guessWord som sedan ska ritas ut så att nästa spelare kan gissa.

Jag hoppas att ni inser vad jag ska göra och varför jag gjort de fel jag gjort.
För på något sätt måste jag skicka den ändrade guessWord.

För jag har fått lära mig att globalaVaribler är av ondo.
Hur ska jag läsa problemet?

Input: randomWord, guessWord, letter
output: ändrad guessWord
process: sekvensiell process

Tacksam för mer hjälp.

Ny kod som hmmm nästan fungerar...
Nu är det byggandet av dels guessWord som krånglar.

"Får" man inte göra så här? char guessWord[wordlen]; ??
Vore så praktiskt... göra så i början.
För hur bygger från början den "tomma" guessWord som bara innehåller rätt antal _?

#include <stdio.h>
#include <string.h>
#include <WordGenerator.h>

int main (int argc, const char * argv[])
{
	char name1[31], name2[31];
	int p, points1=100, points2=100;

	printintro();

	for(p=1;p<3;p++)
	{
		printf("\nEnter name on player %d: ", p);
		if(p==1)
			gets(name1);
		else
			gets(name2);
	}
    
	do
	{
		round(points1, points2);
	}
	while(points1>0 || points2>0);

	return 0;
}

int round(int points1, int points2)
{
	int p=1, i, j, m, wordlen;
	char letter, randomWord[50], guessWord[100];
	
	GenerateWord(randomWord);
	wordlen = strlen(randomWord);

	for(m=0; m<wordlen; m++)
	{
		guessWord[m] = "_"; //bygg det blanka ordet.
	}
	
	printf("\nword is: %s, length=%d\n", randomWord, wordlen);
	
	while(guessWord!=randomWord)
	{
		printf("%s\n", guessWord);
		printf("\nPlayer %d\nGuess a letter: ", p);
		scanf("%c", &letter);
		checkDraw(randomWord, guessWord, letter, wordlen);
	}
}

char checkDraw(const char *randomWord, char *guessWord, char letter, int wordlen)
{
	int m;
	
	if(letter)
	{
		for(m=0; m<wordlen; m++)
		{
			if(randomWord[m]==letter) //kolla om bokstaven finns med i ordet. byt ut om det finns.
				guessWord[m]=letter;
			else
				guessWord[m]="_";
		}
	}
	return guessWord;
}

int printintro(void)
{
	printf("***********\n* Hangman *\n* De-Luxe *\n***********\n\nWelcome\nEach player will get 100 points each and the game\nends when the first player reaches zero.\nHappy hanging!\n");
}
  • Medlem
  • 2004-11-07 11:18
Ursprungligen av Mattias Hedman:

Ny kod som hmmm nästan fungerar...
Nu är det byggandet av dels guessWord som krånglar.

"Får" man inte göra så här? char guessWord[wordlen]; ??
Vore så praktiskt... göra så i början.
För hur bygger från början den "tomma" guessWord som bara innehåller rätt antal _?

En arrays storlek måste vara bestämd redan vid kompileringstillfället. dvs
man får inte skriva guessWord[wordlen]

Vill du skapa en sådan array i runtime måste den allokeras dynamiskt
med hjälp av new (C++) eller malloc (C).

char *guessWord = new char[ wordlen ];

eller

char *guessWord = (char*) malloc( wordlen );

Men då måste du förstås komma ihåg att lämna tillbaka minnet när det inte längre behövs.
Har du allokerat med new ska du göra delete[] guessWord.
Har du allokerat med malloc ska du anropa free( guessWord )

/Micke

1
Bevaka tråden