zmienne poza funkcją

0

Witajcie,
Piszę pewien program i praktycznie mam gotowy, ale chcę sprawić, by kod stał się bardziej czytelny. I tu potrzebuję Waszej pomocy.
Chodzi o to, że w programie kilkakrotnie pojawia się ten sam fragment kodu, odpowiadający za sterowanie moją postacią. Uznałam więc, że najlepiej by było z tego fragmentu stworzyć jakąś funkcję i potem tylko ją wywoływać.
Robię więc tak:

int ster()
{ //polecenia }

Jednak tu mi się pojawia problem ze zmiennymi. Nie są bowiem one zadeklarowane bezpośrednio w tej funkcji. Zależy mi bowiem na tym, bym w różnych miejscach programu swobodnie mogła zmieniać ich wartość. Słyszałam coś o wskaźnikach, ale nie wiem, czy to jest dobry trop.
Moglibyście mi pomóc?
Język c (ew. c++).

0

Argumenty funkcji.

int ster(Player gracz, int x, int y) {
   //dalej możesz używać "gracz", "x" i "y" jak normalnych zmiennych
}

Oczywiście zakładam, że masz obiekt "Player", argumenty należy dobrać zgodnie z zasadą działania programu.

0

Hmm, chyba źle wyjaśniłam o co mi chodzi, w każdym razie ten sposób nie działa. Nie chcę publikować kodu, bo to program na zaliczenie, więc podam może jakiś przykład. Ja to widzę tak:

 
int ster(int a, int b, int c)
{
a+b=c;
printf("%d", c);
}

int main()
{ a=8; b=7;
ster();
//reszta kodu
a=4; b=1;
ster();
//itd. itp.
}

I właśnie chodzi mi jak rozwiązać taką sytuację, czyli:
w funkcji mamy sposób na wykorzystanie pewnych zmiennych;
konkretne wartości zmiennych pojawiają się w main

0
void ster(int a, int b)
  {
   int c
   c=a+b;
   printf("%d", c);
  }
 
int main()
  {
   int JakasA,JakasB;
   JakasA=8; JakasB=7;
   ster(JakasA,JakasB);
   JakasA=4; JakasB=1;
   ster(JakasA,JakasB);
   // lub bezpośrednio:
   ster(12,15);
   return 0;
  }
0

Hmm, częściowo działa. Ale mam jeszcze w związku z tym kolejny problem. Chcę bowiem by w tej funkcji była też tablica, na tej samej zasadzie. Ale taka wersja kodu nie działa:

int ster(int k, int w, int tab[k][w])
{................................}
int main()
{kk=10; ww=8; ster(kk, ww, tabb[kk][ww])
 
0

A jak zadeklarowana ta tab?

0

Hmm, niezbyt ambitnie tą tab rozwijam, tzn. robię coś w tym stylu:

 
int ster(................, int k, int w, int tab[k][w])
{..................}

int main()
{
kk=5; ww=2;
tabb[0][0]=3;
tabb[0][1]=2;
//................................
ster(.............., kk, ww, tabb[kk][ww]);

}

Czy dobrze wszystkie zasady rozumiem? I jak to zrobić, by działało?

Jeśli zrobię:

 int ster(int a, int b, int k, int w, int gotowe, int maxi, int klawisz, int tab[k][w])

To błąd kompilatora:
12 k' was not declared in this scope 12 w' was not declared in this scope

Jeśli natomiast:

 int ster(int a, int b, int k, int w, int gotowe, int maxi, int klawisz)
{int tab[k][w];
..............}

To nie widzi tej tablicy w main'ie.

0

A do tej funkcji ster(...) chcesz przesłać tablicę czy jeden element tej tablicy?

0

Całą tablicę. I czaję chyba błąd :) Ale nie wiem jak go naprawić

0

To chyba mi się mózg zapętlił, bo w takim razie nie rozumiem czego jeszcze nie podałam...
jest:
int w, k, tab[w][k];
w=7; k=5;
tab[0][0]=... itd. itd.

Więc czego jeszcze brakuje?...

0

Brakuje poprawnego stworzenia tablicy.
Nie możesz tak zrobić, tylko gcc coś takiego obsługuje ale wg standardu C/C++ taka deklaracja jest niepoprawna.
Ba to co napisałeś nawet w gcc nie zadziała poprawnie.
Dla gcc ma być:
int w,k;
w=4;
k=5;
int tb[w][k];
Wg standardu ma być:
int i,w,k,tb;
w=4;
k=5;
tb=(int
)malloc(wsizeof(int));
for(i=0;i<w;++i) tb[i]=(int*)malloc(k*sizeof(int));
ster(w,k,tb);
funkcja:
void ster(int w,int k,int **tb);

Możesz zrobić też prościej wyciągając tablicę w jednowymiarową:
int i,w,k,tb;
w=4;
k=5;
tb=(int
)malloc(wksizeof(int));
ster(w,k,tb);
funkcja:
void ster(int w,int k,int tb) { y=?; x=?; tb[yk+x]=?; } // element y,x tablicy

0

Zastosowałam tę zasadę i nie ma błędów w kompilacji, ale nie działa tak jak powinno.
Zastanawiam się, czy błąd nie leży w uzupełnianiu tablicy? Czy tab[0][0]=.. itd jest właściwym sposobem uzupełniania w tym przypadku (uzupełniam ją w main'ie)? Czy może powinnam stosować jakieś inne metody?

0

Poprawnie zastosowałaś.
Może problem polega na tym że wewnątrz tej ster() zmieniasz komórki tablicy zaś oczekujesz że się nie zmienią po powrocie z tej funkcji?

0

Hmm, chyba powstawiam fragmenty kodu, bowiem nie wiem już na czym może polegać mój problem ;/ Oczywiście tego co tu jest proszę nie traktować w pełni dosłownie, wstawiam tylko fragmenty, które mogą pomóc rozwiązać mój problem.

 

//zaczynamy

int ster(int a, int b, int k, int w, int gotowe, int maxi, int klawisz, int **tab)
{ // tu się dzieją różne polecenia
//nawiązania do tablicy, jakie tu się pojawiają to linijki w stylu:
	if (tab[k][w-1]==0)
//................
tab[k][w]=0; 
a=a-1;
w=w-1;
//itd itp
}
int main()
{//zaczynamy właściwy kod programu
//cośtamcośtam
                            
     int   j, w,k,**tab;           //kombinacje przy tablicy             
    tab=(int**)malloc(w*sizeof(int*));
for(int j=0;j<w;++j) tab[j]=(int*)malloc(k*sizeof(int));
    
    
    tab[0][0]=1;
    tab[0][1]=3;
//...
 tab[10][6]=1;
    tab[10][7]=2;  

k=4; w=4; //wybranie konkretnej komórki tablicy

 ster(aa, bb, k, w, gotowee, maxii, klawiszz, tab); //próba wywołania funkcji

//.................
//itd itd
}



Chcę jeszcze tylko zauważyć, że zanim wrzuciłam 'ster' do funkcji (miałam wszystko po kolei wrzucone w main'ie) to cały kod działał. Błędów w kompilacji nie ma, "jedynie" się program wiesza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1