C, problem med pekare, konstigt problem!

Trädvy Permalänk
Medlem
Registrerad
Aug 2005

C, problem med pekare, konstigt problem!

Har skrivit ett program som ska fungera som spelet Yatzy, ungefär i alla fall. Man ska kunna kasta tärningarna 3 gånger samt få ett resultat på vad man har. (Endast Yatzy, Stege, Kåk). Har skapat en funktion som heter int *throwDice() som har i uppgift att kasta tärningarna och sedan ta upp information om vilka som ska sparas etc. men i regel så skickar den bara tillbaka en adress till en array av de 5 slutgiltiga tärningsvärdena.

showResult(int *t2) ska få med sig en int *t2. Denna skall ha adressen till arrayen av tärningarna. Detta fungerar skitbra tills det att jag ska använda showResult. Får inte min pekare att skriva ut tärningstalen inuti showResult men det fungerar skitbra precis innan jag anropar den. Förstår inte varför :S Har ni tid så vore det snällt om ni tog er en titt! Problemet är alltså inte själva resultatet, utan jag förstår inte varför jag inte får en korrekt utskrift på det stället jag markerat med //HÄR FUNGERAR DET INTE

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int *throwDice();
void showResult(int *t2);

int main()
{
int *ptr1,i;

ptr1=throwDice(); //får adress till arrayen!

for(i=0;i<5;i++) //går skitbra att skriva ut array här!
{
printf("%d", ptr1[i]);
}

showResult(ptr1); //men inte i denna funktionen! :S varför inte??

return 0;
}

int *throwDice()
{
char svar[100],svar2[100], result;
int i,
j,
check,
turn=0,
t[5],
*ptr;

srand((unsigned int)time(NULL));

for( i = 0; i < 5; i++ )
{
t[i]=(rand()%6)+1;
printf("Taerning nr. %d :%d\n", (i+1),t[i]);
}

while(turn!=2) //kollar efter vilka man vill spara
{
printf("Vilka vill du spara?");
gets(svar);
j=0;

for(i=0;i<strlen(svar);i++) // tar bort alla mellanslag om så finns
{

if((svar[i]!=' '))
{
svar2[j]=svar[i];
svar2[j+1]='\0';
j++;
}

}

for(j=1;j<6;j++) //kastar om tärningar om man inte vill spara
{
check=0;
for(i=0;i<strlen(svar2);i++)
{
if(j==((int)(svar2[i]-'0')))
{
check=1;

}

}
if(check==0)
{
t[(j-1)]=(rand()%6)+1;
}

}

for( i = 0; i < 5; i++ )
{
printf("Taerning nr. %d :%d\n", (i+1),t[i]);
}

turn++;

}

ptr=t;

return ptr; //skickar iväg adress till arrayen!
}

void showResult(int *t2)
{
int i,
j,
temp,
isYatzy,
isStraight,
isFullHouse;

for(i=0;i<5;i++)
{
if(t2[i+1]<t2[i])
{
temp=t2[i];
t2[i]=t2[i+1];
t2[i+1]=temp;
i=-1;
}

}

// HÄR FUNGERAR DET INTE!!! av nån anledning som jag inte kommer på!

for(i=0;i<5;i++) //försöker skriva ut array men går ej, får massa konstiga värden!
{
printf("\n%d", t2[i]);

}

isStraight=1;

for(i=1;i<5;i++) // kolla efter stege
{
if(t2[i-1]!=t2[i]-1)
isStraight=0;
}

isYatzy=1;
for(i=0;i<1;i++) // kolla efter yatzy
{
for(j=1;j<5;j++)
{
if(t2[i]!=t2[j])
isYatzy=0;
}
}

isFullHouse=0;
if(t2[0]==t2[1] && t2[1]==t2[2] && t2[3]==t2[4] && t2[2]!=t2[3]) //kolla efter kåk
isFullHouse=1;
if(t2[2]==t2[3] && t2[3]==t2[4] && t2[0]==t2[1] && t2[1]!= t2[2])
isFullHouse=1;

if(isStraight==1)
printf("Du har stege!");

if(isYatzy==1)
printf("Du har Yatzy!");

if(isFullHouse==1)
printf("Du har Kaak!");

}

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Ett problem är att pekaren som throwDice() returnerar pekar på en lokal variabel. Använd

int* t = new int[5];

istället för

t[5]

. När du sorterar fältet låter du också i bli 4, vilket innebär att man även tittar på t2[4+1] (som har okänt innehåll).

Edit: för övrigt är det roligt med indentering:

#include<stdio.h> #include<stdlib.h> #include<time.h> int *throwDice(); void showResult(int *t2); int main() { int *ptr1,i; ptr1=throwDice(); //får adress till arrayen! for(i=0;i<5;i++) //går skitbra att skriva ut array här! { printf("%d", ptr1[i]); } showResult(ptr1); //men inte i denna funktionen! :S varför inte?? return 0; } int *throwDice() { char svar[100],svar2[100], result; int i, j, check, turn=0, t[5], *ptr; srand((unsigned int)time(NULL)); for( i = 0; i < 5; i++ ) { t[i]=(rand()%6)+1; printf("Taerning nr. %d :%d\n", (i+1),t[i]); } while(turn!=2) //kollar efter vilka man vill spara { printf("Vilka vill du spara?"); gets(svar); j=0; for(i=0;i<strlen(svar);i++) // tar bort alla mellanslag om så finns { if((svar[i]!=' ')) { svar2[j]=svar[i]; svar2[j+1]='\0'; j++; } } for(j=1;j<6;j++) //kastar om tärningar om man inte vill spara { check=0; for(i=0;i<strlen(svar2);i++) { if(j==((int)(svar2[i]-'0'))) { check=1; } } if(check==0) { t[(j-1)]=(rand()%6)+1; } } for( i = 0; i < 5; i++ ) { printf("Taerning nr. %d :%d\n", (i+1),t[i]); } turn++; } ptr=t; return ptr; //skickar iväg adress till arrayen! } void showResult(int *t2) { int i, j, temp, isYatzy, isStraight, isFullHouse; for(i=0;i<5;i++) { if(t2[i+1]<t2[i]) { temp=t2[i]; t2[i]=t2[i+1]; t2[i+1]=temp; i=-1; } } // HÄR FUNGERAR DET INTE!!! av nån anledning som jag inte kommer på! for(i=0;i<5;i++) //försöker skriva ut array men går ej, får massa konstiga värden! { printf("\n%d", t2[i]); } isStraight=1; for(i=1;i<5;i++) // kolla efter stege { if(t2[i-1]!=t2[i]-1) isStraight=0; } isYatzy=1; for(i=0;i<1;i++) // kolla efter yatzy { for(j=1;j<5;j++) { if(t2[i]!=t2[j]) isYatzy=0; } } isFullHouse=0; if(t2[0]==t2[1] && t2[1]==t2[2] && t2[3]==t2[4] && t2[2]!=t2[3]) //kolla efter kåk isFullHouse=1; if(t2[2]==t2[3] && t2[3]==t2[4] && t2[0]==t2[1] && t2[1]!= t2[2]) isFullHouse=1; if(isStraight==1) printf("Du har stege!"); if(isYatzy==1) printf("Du har Yatzy!"); if(isFullHouse==1) printf("Du har Kaak!"); }

Trädvy Permalänk
Medlem
Registrerad
Aug 2005

Sorry, glömde php:a :S kom in nu igen för att göra detta, Tack för hjälpen dock!

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Nu ser jag att det egentligen var c du använde, så du får nog byta ut "new" mot "malloc". Annars är nog det enklaste egentligen att byta ut

int *throwDice() { char svar[100],svar2[100], result; int i, j, check, turn=0, t[5], *ptr;

mot

void throwDice(int * t) { char svar[100],svar2[100], result; int i, j, check, turn=0, *ptr;

och

int main() { int *ptr1,i; ptr1=throwDice(); //får adress till arrayen!

mot

int main() { int i; int ptr1[5]; throwDice(ptr1); //får adress till arrayen!

Trädvy Permalänk
Medlem
Registrerad
Aug 2005

Märker även att även fast jag sätter utskriften INNAN sorteringen får jag detta fel :S

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Addeman_88
Märker även att även fast jag sätter utskriften INNAN sorteringen får jag detta fel :S

Har du fixat minnesallokeringen? Det går, trots kommentaren, inte alls bra att skriva ut efter anropet till throwDice() i main().

Trädvy Permalänk
Medlem
Registrerad
Dec 2004

Som jag nämnde på ett annat ställe så finns det ett litet fel i sorteringen.

"if(t2[i+1]<t2[i])" kommer att läsa utanför arrayen.

ps. Utöver det som tidigare nämndes.

"Nothing is impossible because impossible itself says I M Possible..."

Trädvy Permalänk
Medlem
Registrerad
Aug 2005

Ahaa, nu förstår jag problemet. Eftersom t är en lokal variabel kan den ju inte nås från nån annan funktion. Det medför ju att adress som t har ej är tillgänglig utifrån! Dumt av mig!

Trädvy Permalänk
Medlem
Registrerad
Aug 2005

Nu fungerar det, attsingen sicket misstag :S lokal variabel