|
| Problem (hurtig hjælp) Fra : Dorte Klerke |
Dato : 10-08-03 20:46 |
|
Hej
Ja jeg har et lidt stort problem, jeg skal aflevere mit spil i morgen, og nu
virker det ikke når jeg kompiler det på en unixserver. Det virker fint i
win, men på unix fryser den bare mit i min highscore. Er der noget man skal
ændre for at det virker?
Her er koden. Den er gal efter jeg har vist highscore - så det må vel være
VisHighscore den er gal med eller menuen den fører tilbage til:
[snip]
/* I funktionen spil - slutningen af den */
if(SpilSlut()){
fflush(stdout);
++slut;
}
}
}
if(LavHighScore(spil.score)) /* Hvis highscore (af typen int) er sand,
startes menu. Ellers afsluttes blot. */
{
system("clear");
VisHighScore();
pause();
printf("\nTryk for at fortæstte, 0 for at afslutte ");
switch (Get1Char())
{
case '0':
break;
default:
Spil();
break;
}
}
return;
[snip]
void VisHighScore() /* Tegner highscorelisten */
{
int i;
FILE *Fil2;
fflush(stdout);
Fil2=fopen("highscore.bin", "rb"); /* Åbner binær fil for læsning */
if(Fil2==NULL){
printf("Lokaliser venligst filen highscore.bin");
exit(0);
}
fread(highscore, sizeof(highscore),1,Fil2); /* Læser og kopierer fra fil
*/
printf("\n**************************************************** \n"
"* * \n"
"* H I G H S C O R E S *\n"
"* * \n"
"**************************************************** \n"
"* N A V N ** P O I N T * \n"
"**************************************************** \n"
"* ** * \n");
for (i=0;i<10;i++)
{
printf("* %2d. %-16s ** %10d point *\n", i+1,highscore[i].na
vn,
highscore[i].point);
}
printf("****************************************************\n\n");
fclose(Fil2);
}
[snip]
Desuden er der først en fukntion, der hedder LavHighscore.
Har I brug for mere information/kode?
Håber på hurtig hjælp.
Dorte
| |
Niels Dybdahl (10-08-2003)
| Kommentar Fra : Niels Dybdahl |
Dato : 10-08-03 21:50 |
|
> Her er koden. Den er gal efter jeg har vist highscore - så det må vel være
> VisHighscore den er gal med eller menuen den fører tilbage til:
Eller hvad med pause funktionen. Er det en standard funktion eller en som du
har skrevet ?
Niels Dybdahl
| |
Dorte Klerke (10-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 10-08-03 21:55 |
|
"Niels Dybdahl" <Niels@Dybdahl.dk> wrote in message
news:3f36b008$0$76059$edfadb0f@dread11.news.tele.dk...
> > Her er koden. Den er gal efter jeg har vist highscore - så det må vel
være
> > VisHighscore den er gal med eller menuen den fører tilbage til:
>
> Eller hvad med pause funktionen. Er det en standard funktion eller en som
du
> har skrevet ?
>
> Niels Dybdahl
>
>
>
En jeg har lavet:
void pause() /* En pause på skærmen, hvorefter der skal trykkes på
en tast for at komme videre */
{
printf("Tryk på en vilkårlig tast...");
Get1Char();
}
| |
Niels Dybdahl (10-08-2003)
| Kommentar Fra : Niels Dybdahl |
Dato : 10-08-03 23:10 |
|
> En jeg har lavet:
>
> void pause() /* En pause på skærmen, hvorefter der skal trykkes på
> en tast for at komme videre */
> {
> printf("Tryk på en vilkårlig tast...");
> Get1Char();
> }
Er du sikker på at din Get1Char funktion virker som den skal under Unix ?
Nogle operativsystemer kræver en hel linie/side før man kan læse et tegn
(dvs at man skal trykke på en Enter knap, før der bliver sendt noget som
helst fra konsollen til computeren). Kan det være problemet ?
Hvilken Unix drejer det sig i øvrigt om og på hvilken type computer ?
Hvis du kører programmet i en debugger, hvor langt når programmet så ?
Niels Dybdahl
| |
Bertel Brander (10-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 10-08-03 22:49 |
|
Dorte Klerke wrote:
> Hej
> Ja jeg har et lidt stort problem, jeg skal aflevere mit spil i morgen, og nu
> virker det ikke når jeg kompiler det på en unixserver. Det virker fint i
> win, men på unix fryser den bare mit i min highscore. Er der noget man skal
> ændre for at det virker?
>
> Her er koden. Den er gal efter jeg har vist highscore - så det må vel være
> VisHighscore den er gal med eller menuen den fører tilbage til:
>
Får den skrevet hele highscore ud ? Ser det den får skrevet du rigtigt
ud ?
Returnerer den fra VisHighScore() ?
>
> void VisHighScore() /* Tegner highscorelisten */
> {
> int i;
> FILE *Fil2;
> fflush(stdout);
> Fil2=fopen("highscore.bin", "rb"); /* Åbner binær fil for læsning */
> if(Fil2==NULL){
> printf("Lokaliser venligst filen highscore.bin");
> exit(0);
> }
> fread(highscore, sizeof(highscore),1,Fil2); /* Læser og kopierer fra fil
> */
Hvad er highscore ? Hvordan er den erklæret ? Læses hele highscoren
(test retur værdien for fread())
Jeg kan ikke se at der er noget alvorligt galt med din kode.
/b
| |
Dorte Klerke (10-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 10-08-03 22:51 |
|
> Får den skrevet hele highscore ud ? Ser det den får skrevet du rigtigt
> ud ?
Ja highscoren er fin, men så er resten bare blank og man bliver nødt til at
trykke ctrl-c for at komme ud, den fryser bare.
> Hvad er highscore ? Hvordan er den erklæret ? Læses hele highscoren
typedef struct /* Struktur til highscore */
{
char navn[16]; /* Max længde af navn på highscorelisten */
int point;
} high;
high highscore[10];
> (test retur værdien for fread())
Hvordan skal jeg det?
Dorte
| |
Bertel Brander (10-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 10-08-03 23:10 |
|
Dorte Klerke wrote:
>>Får den skrevet hele highscore ud ? Ser det den får skrevet du rigtigt
>>ud ?
>
>
> Ja highscoren er fin, men så er resten bare blank og man bliver nødt til at
> trykke ctrl-c for at komme ud, den fryser bare.
>
>
>
>>Hvad er highscore ? Hvordan er den erklæret ? Læses hele highscoren
>
>
> typedef struct /* Struktur til highscore */
> {
> char navn[16]; /* Max længde af navn på highscorelisten */
> int point;
> } high;
>
> high highscore[10];
>
Så vi kan konstatere at den får udført hele VisHighScore() og returnerer
derfra, enig?
Så skal den udføre pause() (dvs skrive "Tryk på en vilkårlig tast..."
og vente på at du trykker), der mangler en fflush(stdout) efter printf
i pause(). Gør den det?
Så skal den skrive "Tryk for at fortæstte, 0 for at afslutte" (der
mangler igen en fflush(stdout) efter printf, gør den det?
Hvilken kompiler bruger du på windows og hvilken på Unix?
/b
| |
Dorte Klerke (10-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 10-08-03 23:19 |
|
> Så skal den udføre pause() (dvs skrive "Tryk på en vilkårlig tast..."
> og vente på at du trykker), der mangler en fflush(stdout) efter printf
> i pause(). Gør den det?
ja den laver en tryk på vilkårlig tast
> Så skal den skrive "Tryk for at fortæstte, 0 for at afslutte" (der
> mangler igen en fflush(stdout) efter printf, gør den det?
nej gør den nemlig ikke
> Hvilken kompiler bruger du på windows og hvilken på Unix?
gcc på begge, men nok forskellige, aner ikke med den på unix er
universitets.
| |
Bertel Brander (10-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 10-08-03 23:33 |
|
Dorte Klerke wrote:
>>Så skal den udføre pause() (dvs skrive "Tryk på en vilkårlig tast..."
>>og vente på at du trykker), der mangler en fflush(stdout) efter printf
>>i pause(). Gør den det?
>
>
> ja den laver en tryk på vilkårlig tast
>
>
>>Så skal den skrive "Tryk for at fortæstte, 0 for at afslutte" (der
>>mangler igen en fflush(stdout) efter printf, gør den det?
>
>
Hvordan set Get1Char() ud? Ved du om den virker på unix?
/b
| |
Dorte Klerke (10-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 10-08-03 23:33 |
|
> Hvordan set Get1Char() ud? Ved du om den virker på unix?
int Get1Char() /* Læser en enkelt char */
{
int c, dummy;
if ((c = getchar()) == '\n') /* Ved return-character afslut funktion og
returner denne */
return c;
do
{
dummy=getchar(); /* I fald c ej er return-character, vent på
return-character og returner c */
}
while (dummy != '\n');
return c;
}
nej ved ikke om den virker på unix
| |
Bertel Brander (10-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 10-08-03 23:54 |
|
Dorte Klerke wrote:
>>Hvordan set Get1Char() ud? Ved du om den virker på unix?
>
>
> int Get1Char() /* Læser en enkelt char */
> {
> int c, dummy;
> if ((c = getchar()) == '\n') /* Ved return-character afslut funktion og
> returner denne */
> return c;
> do
> {
> dummy=getchar(); /* I fald c ej er return-character, vent på
> return-character og returner c */
> }
> while (dummy != '\n');
> return c;
> }
>
>
> nej ved ikke om den virker på unix
>
Jeg kan ikke se at funktionen fejler noget, men det var måske en ide at
lave et lille test program for at teste den?
Du kunne også putte nogle extra printf() ind i den, evt i loopen, til
at udskrive dummy karakter der bliver dumpet.
Vi er enige om at programmet stopper i den funktion, ikke?
/b
| |
Dorte Klerke (11-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 11-08-03 00:05 |
|
> Jeg kan ikke se at funktionen fejler noget, men det var måske en ide at
> lave et lille test program for at teste den?
> Du kunne også putte nogle extra printf() ind i den, evt i loopen, til
> at udskrive dummy karakter der bliver dumpet.
> Vi er enige om at programmet stopper i den funktion, ikke?
>
Er vi det? *S*
Men lyder fornuftigt.
| |
Bertel Brander (11-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 11-08-03 00:22 |
|
Dorte Klerke wrote:
>>Jeg kan ikke se at funktionen fejler noget, men det var måske en ide at
>>lave et lille test program for at teste den?
>>Du kunne også putte nogle extra printf() ind i den, evt i loopen, til
>>at udskrive dummy karakter der bliver dumpet.
>>Vi er enige om at programmet stopper i den funktion, ikke?
>>
>
>
> Er vi det? *S*
> Men lyder fornuftigt.
>
>
Hvis den ikke stopper der, hvor stopper den så?
Jeg ved ikke hvad *S* betyder.
/b
| |
Dorte Klerke (11-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 11-08-03 00:20 |
|
> Hvis den ikke stopper der, hvor stopper den så?
> Jeg ved ikke hvad *S* betyder.
>
>
Hov troede du skrev, at vi var enige i, at det var der problemet var. Men
programmet skulle gerne stoppe efter highscore.
*S* = smiler
(sorry)
Dorte
| |
Dorte Klerke (11-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 11-08-03 00:09 |
|
Ham, der har hjulpet mig med det, siger at Get1Char skulle du til unix, og
det ikke skulle være det, men måske håndterer den ikke fwrite ordentligt.
| |
Bertel Brander (11-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 11-08-03 00:21 |
|
Dorte Klerke wrote:
> Ham, der har hjulpet mig med det, siger at Get1Char skulle du til unix, og
> det ikke skulle være det, men måske håndterer den ikke fwrite ordentligt.
Hvilken fwrite()? Hvorfor skulle den ikke håndtere den rigtigt?
/b
| |
Lasse Westh-Nielsen (11-08-2003)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 11-08-03 00:19 |
|
"Dorte Klerke" <dorte@home2.gvdnet.dk> wrote:
> > Hvordan set Get1Char() ud? Ved du om den virker på unix?
>
> int Get1Char() /* Læser en enkelt char */
> {
> int c, dummy;
> if ((c = getchar()) == '\n') /* Ved return-character afslut funktion
og
> returner denne */
> return c;
> do
> {
> dummy=getchar(); /* I fald c ej er return-character, vent på
> return-character og returner c */
> }
> while (dummy != '\n');
> return c;
> }
Kan det være et problem at du sammenligner int med char?
Du kan evt prøve at udskrive dummy (som int og char), og så se hvilke
værdier den tager når du taster. Og samtidig udskrive '\n' (som int og char)
og se hvilke værdier den tager.
Du kan også kortslutte hele funktionen med en "return '\n';" i toppen, og så
se om der stadig er problemer - dvs teste om det virkelig er her der er
problemer.
Mvh Lasse
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Bertel Brander (11-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 11-08-03 00:35 |
|
Lasse Westh-Nielsen wrote:
> "Dorte Klerke" <dorte@home2.gvdnet.dk> wrote:
>
>
>>>Hvordan set Get1Char() ud? Ved du om den virker på unix?
>>
>>int Get1Char() /* Læser en enkelt char */
>>{
>> int c, dummy;
>> if ((c = getchar()) == '\n') /* Ved return-character afslut funktion
>
> og
>
>>returner denne */
>> return c;
>> do
>> {
>> dummy=getchar(); /* I fald c ej er return-character, vent på
>> return-character og returner c */
>> }
>> while (dummy != '\n');
>> return c;
>>}
>
>
>
> Kan det være et problem at du sammenligner int med char?
>
Det burde ikke være et problem. '\n' er (ligesom f.ex 'c') en int i C
(men ikke i C++ hvor det er en char). Dorte's program ligner et C
program.
/b
| |
Dorte Klerke (11-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 11-08-03 00:42 |
|
> Det burde ikke være et problem. '\n' er (ligesom f.ex 'c') en int i C
> (men ikke i C++ hvor det er en char). Dorte's program ligner et C
> program.
>
Det er også et C program.
Men ham, der hjælper mig, har konstateret, at det ER Get1Char, der er noget
galt med, han skriver:
problemet er som følger:
Når lavhighscore er overstået læser programmet som en vanvittig fra
input-buffer, ligegyldigt om man bruger getchar() (altså den indbyggede
funktion) eller den hjemmebryggede get1char(). Der er tilsyneladende en form
for uendelig løkke...
Hvad kan man mod det?
Dorte
| |
Bertel Brander (11-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 11-08-03 01:01 |
|
Dorte Klerke wrote:
>>Det burde ikke være et problem. '\n' er (ligesom f.ex 'c') en int i C
>>(men ikke i C++ hvor det er en char). Dorte's program ligner et C
>>program.
>>
>
>
> Det er også et C program.
> Men ham, der hjælper mig, har konstateret, at det ER Get1Char, der er noget
> galt med, han skriver:
>
> problemet er som følger:
>
> Når lavhighscore er overstået læser programmet som en vanvittig fra
> input-buffer, ligegyldigt om man bruger getchar() (altså den indbyggede
> funktion) eller den hjemmebryggede get1char(). Der er tilsyneladende en form
> for uendelig løkke...
>
> Hvad kan man mod det?
>
Hvad er det den læser? Lav en printf(">>Dummy %d %c\n", dummy, dummy);
i while løkken.
Du kan evt erstatte Get1Char med følgende og se om det hjælper:
int Get1Char(void)
{
char xx[1024] = "\n";
fgets(xx, sizeof(xx), stdin);
return xx[0];
}
Jeg tror at du har et problem et andet sted
/b
| |
Lasse Westh-Nielsen (11-08-2003)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 11-08-03 00:46 |
|
"Dorte Klerke" <dorte@home2.gvdnet.dk> wrote:
>
> int Get1Char() /* Læser en enkelt char */
> {
> int c, dummy;
> if ((c = getchar()) == '\n') /* Ved return-character afslut funktion
og
> returner denne */
> return c;
> do
> {
> dummy=getchar(); /* I fald c ej er return-character, vent på
> return-character og returner c */
> }
> while (dummy != '\n');
> return c;
> }
Det kan være du skulle teste om getchar() returnerer EOF?
Eventuelt brug "fgetc(stdin)" direkte i stedet for "getchar()" - getchar er
en makro. Det kan være det har betydning...?
Jeg har ikke testet nedenstående, men prøv den eventuelt:
int getOneChar()
{
int c;
c = fgetc(stdin);
while (c != EOF && c != '\n')
{
c = fgetc(stdin);
}
/* c er enten EOF eller '\n'*/
if (c == EOF)
{
printf("Der gik noget galt!?");
exit(1);
}
return c;
}
Mvh Lasse
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Robert Larsen (10-08-2003)
| Kommentar Fra : Robert Larsen |
Dato : 10-08-03 23:11 |
|
Dorte Klerke wrote:
>>(test retur værdien for fread())
>
>
> Hvordan skal jeg det?
På min Linux maskine gør jeg:
[robert@codemachine robert]$ man fread
<SNIP>
RETURN VALUE
fread and fwrite return the number of items successfully read or writ-
ten (i.e., not the number of characters). If an error occurs, or the
end-of-file is reached, the return value is a short item count (or
zero).
fread does not distinguish between end-of-file and error, and callers
must use feof(3) and ferror(3) to determine which occurred.
</SNIP>
[robert@codemachine robert]$ man ferror
<SNIP>
int ferror(FILE *stream);
int fileno(FILE *stream);
DESCRIPTION
The function clearerr clears the end-of-file and error indicators for
the stream pointed to by stream.
The function feof tests the end-of-file indicator for the stream
pointed to by stream, returning non-zero if it is set. The end-of-file
indicator can only be cleared by the function clearerr.
The function ferror tests the error indicator for the stream pointed to
by stream, returning non-zero if it is set. The error indicator can
only be reset by the clearerr function.
</SNIP>
Så noget i stil med:
int error;
size_t num_items;
num_items = fread(highscore, sizeof(highscore),1,Fil2);
if(num_items != 1)
{
/* We couldn't read one item */
if(feof(Fil2))
{
/* No more items */
}
else if(ferror(Fil2))
{
/* Some error occured */
}
}
Så kunne du jo skrive en fejlbesked ud i de to tilfælde.
Robert
| |
Dorte Klerke (11-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 11-08-03 01:26 |
|
Her er funktionen, der får tingene til at bryde sammen:
void LavHighScore(int score) /* Funktion til highscore. Returnerer 0 hvis
score ej er highscore */
{
int i=0,j;
FILE *Fil1;
/* char navn[16]; */
Fil1=fopen("highscore.bin","rb+"); /* Åbner binære fil for læsning og
skrivning */
if(Fil1==NULL){
printf("Lokaliser venligst filen highscore.bin");
exit(0);
}
fread(highscore, sizeof(highscore),1,Fil1); /* Læser og kopierer fra fil
*/
while (score < highscore[i].point && score > 0 && i < 10) /* Tæl ned til
ønskede
placering
nås */
i++;
if (i == 10 || score == 0)
{
fclose(Fil1);
return;
}
printf("\nDu fik %d points og dermed en %d. plads på
highscorelisten",score,i+1);
printf("\nIndtast dit navn : ");
scanf("%s",navn);
for (j = 10; j >=i+1; j--) /* Alle entries flyttes en tak ned */
{
highscore[j].point = highscore[j-1].point;
strcpy(highscore[j].navn,highscore[j-1].navn);
}
strcpy(highscore[i].navn,navn);
highscore[i].point = score; /* Skriv den nye highscore */
rewind(Fil1);
fwrite(highscore,sizeof(highscore),1,Fil1);
fclose(Fil1);
}
Efterfølgende returneres til menu, som er en switch aktiveret af 1-4. På en
eller anden måde er bufferen blevet fyldt med whitespaces og menuen kører
ellers i løkke. Det er uanset hvilken metode man bruger til get1char().
| |
Bertel Brander (11-08-2003)
| Kommentar Fra : Bertel Brander |
Dato : 11-08-03 01:44 |
|
Dorte Klerke wrote:
> Her er funktionen, der får tingene til at bryde sammen:
>
> void LavHighScore(int score) /* Funktion til highscore. Returnerer 0 hvis
> score ej er highscore */
> {
> int i=0,j;
> FILE *Fil1;
> if (i == 10 || score == 0)
> {
> fclose(Fil1);
> return;
> }
Du kunne prøve at indsætte:
fclose(Fil1);
return;
og se om den stadig fejler.
> printf("\nDu fik %d points og dermed en %d. plads på
> highscorelisten",score,i+1);
> printf("\nIndtast dit navn : ");
> scanf("%s",navn);
scanf er ikke en god funktion. Brug fgets() og husk at slette
'\n' i enden af den streng den returnerer (hvis der er en).
> for (j = 10; j >=i+1; j--) /* Alle entries flyttes en tak ned */
> {
> highscore[j].point = highscore[j-1].point;
Ups, her skriver du til highscore[10] når j er 10, den har så vidt jeg
husker kun 10 elementer (0,1,...9).
> strcpy(highscore[j].navn,highscore[j-1].navn);
> }
> strcpy(highscore[i].navn,navn);
> highscore[i].point = score; /* Skriv den nye highscore */
> rewind(Fil1);
> fwrite(highscore,sizeof(highscore),1,Fil1);
> fclose(Fil1);
> }
>
Jeg har ikke flere ideer, og nu siger jeg godnat.
/b
| |
Dorte Klerke (11-08-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 11-08-03 15:44 |
|
> > for (j = 10; j >=i+1; j--) /* Alle entries flyttes en tak ned */
> > {
> > highscore[j].point = highscore[j-1].point;
> Ups, her skriver du til highscore[10] når j er 10, den har så vidt jeg
> husker kun 10 elementer (0,1,...9).
Hej ville bare lige komme med løsningen på problemet, tjah det er desværre
en lille dum ting, der har gjort det. Som Bertel antydede, havde jeg sat
j=10 som skulle være 9. Utroligt at sådan en lille ting kan ødelægge et helt
program. Men også mystisk at dos ikke brokkede sig, men nu fandt vi efter
næsten en hel dags knoklen løsningen, og heldigvis lige til tiden til
aflevering.
Tak for ideer til alle :) rart med et sted man kan få ret hurtigt hjælp og
ideer.
Dorte
| |
|
|