Zmienne w funkcji nie są takie same jak w main

0

Witam, zamieszczam jedynie fragmentu kodu który nie działa, resztę ustawiłem jako komentarze więc nie mają wpływu. Chciałbym aby ktoś pomógł. Pozdrawiam

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

int losowanie(int Xkomp, int Ykomp)
{
    srand(time(NULL));
    Xkomp=rand()%3;
    Ykomp=(Xkomp+593)%3; //aby X i Y nie byly takie same
    printf("%d %d\n",Xkomp,Ykomp);
}
int main()
{   int Xkom,Ykom;
    losowanie(Xkom,Ykom);
    printf("%d %d",Xkom,Ykom);
    return 0;
}

Problem polega na tym, że w mainie zmienne Xkom,Ykom nie są takie same jak odpowiednio Xkomp, Ykomp w losowanie().

4

Zmienne Xkomp i Ykomp w funkcji losowanie to są zupełnie inne zmienne niż te w main. Gdybyś nadał im inne nazwy to może nie byłoby problemu :​)

Przydatna lektura: Przekazywanie parametru przez wartość i referencję

3

Oprócz tego, o czym wspomniał @kq, dochodzi jeszcze to, abyś srand wywoływał w aplikacji tylko raz - na początku jej życia.

0

Ok chyba rozumiem, ale dalej nie działa...

#include <stdio.h>
#include <stdlib.h>
 
int losowanie(int& Xkomp, int& Ykomp)
{
    srand(time(NULL));
    Xkomp=rand()%3;
    Ykomp=(Xkomp+593)%3; //aby X i Y nie byly takie same
    printf("%d %d\n",Xkomp,Ykomp);
}
int main()
{   int Xkomp,Ykomp;
    losowanie(Xkomp,Ykomp);
    printf("%d %d",Xkomp,Ykomp);
    return 0;
}

Kompilator wywala błąd tutaj: int losowanie(int& Xkomp, int& Ykomp)
expected ';', ',' or ')' before '&' token
Patryk27, Dlaczego srand powinien być wywołany tylko raz? Gra bedzie miala charakter turowy więc przydałby mi się srand kilka razy, no chyba, że zrobię na takiej zasadzie jak Ykomp, aby wyniki nie były takie same.

0

Teraz zauważyłem, że ten Ykomp jest idiotycznie zrobiony bo nie uzyskam nigdy każdej możliwej kombinacji liczb(każda z każdą). Jakiś pomysł jak to osiągnąć? Tak btw piszę kółko i krzyżyk

0

Używaj tagów <co​de>.

srand wystarczy raz. Potem rand będzie korzystał z seeda, który będzie modyfikowany po każdym jego użyciu.

Jeśli piszesz w C to nie masz dostępu do referencji (co jest napisane w podlinkowanym artykule) i musisz użyć wskaźników.

0

Przyznam się szczerze, że nie czytałem całego artykułu, bo opcja z referencją mnie zadowoliła :D Ok doczytam jeszcze o wskaźnikach, ale odpowiedz mi prosze, czy "dostęp" do zmiennych w mojej funkcji losowanie() mogę uzyskać tylko dzięki wskaźnikom? Chodzi mi o to jak mogę w mainie przypisać sobie do jakichś zmiennych wartości uzyskane z funkcji losowanie()

1

Możesz jeszcze użyć zmiennych globalnych (zło) lub zwrócić kompletnie nowe wartości (strukturę z dwoma tutaj) i przypisać je do zmiennych w main. Inaczej się nie da (o ile mi wiadomo).

0

Bardzo ci dziękuje, trochę mi się objaśniło.Ale nie rozumiem "lub zwrócić kompletnie nowe wartości (strukturę z dwoma tutaj) i przypisać je do zmiennych w main. " Jak mogę zwrócić wartości uzyskane z losowanie()?

0

Wrzucam jeszcze mój jakiś tam wcześniejszy kod i chciałbym wiedzieć dlaczego w nim wartości zmiennych z funkcji losowanie() zostają przypisane do wartości zmiennych mainowych. Jak dla mnie ten przypadek jest prawie, że taki sam jak ten w pierwszym poście, a jednak całość działa inaczej. Bardzo proszę o odpowiedź.

#include <stdio.h>
int losowanie(int i,int tab[9])
{
    srand(time(NULL));
    for(i=0; i<=9; i++)
    {
        tab[i]=rand()%100;
        printf("%d\n",tab[i]);
    }
}
int main()
{
    int a,b,j,t,tablica[9];
    losowanie(a,tablica);
    printf("Po sortowaniu: \n");
    for(a=0; a<=9; a++)
    {
        for(j=0; j<=9; j++)
        {
            if(tablica[j]>tablica[j+1])
            {
                t=tablica[j];
                tablica[j]=tablica[j+1];
                tablica[j+1]=t;
            }

        }
    }
    for(a=0; a<=9; a++) printf("%d\n",tablica[a]);




    return 0;
}
1

C jest bardzo nieintuicyjny w tym zakresie. Nie jesteś w stanie przekazać tablic przez wartość do funkcji. Przekazujesz tak naprawdę wskaźnik do pierwszego elementu tablicy. Dlatego operując na tablicy modyfikujesz oryginalne obiekty.

0

Mógłbyś mi jeszcze odpowiedzieć na to pytanie, jak mogę zwrócić te wartości z funkcji, żeby potem je przypisać do zmiennych w mainie?

2
typedef struct xy { int x,y; } xy;

xy foo() {
    xy ret;
    ret.x = rand();
    ret.y = rand();
    return ret;
}

I potem w main:

xy randomized = foo();
Xkom = xy.x;
Ykom = xy.y;
0

Hmm, też nie tak prosto. No nic dzięki wielkie za pomoc, myślałem, że trochę inaczej to wszystko działa, czas się edukować. Pozdrawiam

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

int losowanie(int* Xkomp, int* Ykomp)
{
    srand(time(NULL));
    *Xkomp=rand()%3;
    *Ykomp=rand()%3;
	printf("%d %d\n",*Xkomp,*Ykomp);
}
int main()
{
	int* Xkomp;
	int* Ykomp;
	losowanie(&Xkomp,&Ykomp);
	printf("%d %d",Xkomp,Ykomp);
	plansza[Xkom,Ykom]=2;
return 0;
}

W ten sposób wartosci Xkomp i Y komp w mainie sa takie jak te uzyskane w losowaniu, a mimo to dostaję błąd (|error: array subscript is not an integer|) gdy probuje sporzystać z nich jak współrzędnych tablicy. Problem znika gdy dodam zmienne a=Xkomp,b=Ykomp i zrobie tak plansza[a][b]. Dlaczego tak sie dzieje?

0
plansza[Xkom,Ykom]=2; 

W C wielkość każdego poziomu tablicy podajemy w osobnym nawiasie.

 plansza[Xkom][Ykom]=2;

Funkcja ma.zadeklarowane zwracanie.wartości typu int, a nic nie zwraca.

0

Eh nie zauważyłem, tak wiem jak działają tablice... czyli funkcje losowanie zrobić void tak? Dzięki myślałem, że coś z tymi wskaźnikami jest nie tak.

0

Zrobiłem tak jak mówisz i niestety nie działa. Ten sam błąd.

int losowanie(int* Xkomp, int* Ykomp)
{
    srand(time(NULL));
    *Xkomp=rand()%3;
    *Ykomp=rand()%3;
    printf("%d %d\n",*Xkomp,*Ykomp);
}
int main()
{
    int* Xkomp;
    int* Ykomp;
    losowanie(&Xkomp,&Ykomp);
    plansza[Xkomp][Ykomp]=2;
return 0;
}

Przy zastosowaniu a i b problem znika

2

Dlaczego zadeklarowałeś Xkomp oraz Ykomp jako wskaźniki w mainie?

0

Dzięki!!!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.