C, problem med pekare, konstigt problem!

Permalänk

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!");

}

Permalänk
Hedersmedlem

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!"); }

Permalänk

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

Permalänk
Hedersmedlem

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!

Permalänk

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

Permalänk
Hedersmedlem
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().

Permalänk
Medlem

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.

Visa signatur

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

Permalänk

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!

Permalänk

Nu fungerar det, attsingen sicket misstag :S lokal variabel