Witam, mam problem z przekazaniem tablic przez referencje - chodzi o parametry w funkcji.
using namespace std;
int tab1a[4][4];
........
int main()
{
}
........
void Wybor(int &tab[][]=tab1a[][])
{
tab[1][1]=1; // tutaj operuje na zmiennej referencyjnej, jej zmiana zmieni takze tab1a
return;
}
Chce teraz w funkcji wybór mieć możliwość operowania na tablicach za pomocą referencji (&) i nie wiem w jaki sposób zmiennej która ma być referencją (&tab) mam przypisać całą tablicę (tab1a) tzn. &tab[][]=&tab1a[][] - czy to jest jakoś inaczej tzn. czy mój tok rozumowania jest błędny…
Bo coś mi kompilator wyrzuca błędy np. " declaration of `tab’ as array of references "
int &tab[] to tablica referencji, a referencja do tablicy to: int (&tab)[]
Jeśli przekazujesz tablice wielowymiarowe w ten sposób, to wymagane jest określenie wielkości wszystkich wymiarów poza pierwszym. Stąd tablice raczej przekazuje się przez wskaźnik.
To czy przekażemy przez tablicę czy wskaźnik nie ma znaczenia bo i tak przy wskaźniku również musimy podać więcej wymiarów, jesli jest to tablica wielowymiarowa (zawsze mozna dac int* rzutowac na niego, no ale to niesie konsekwencje).
Mam jeszcze pytanie odnośnie losowania bo mam problem - losuje mi raz taką ilość jak chce a raz większą. Tzn. raz losowanie odbędzie się 5 razy (przypisze 5 razy cyfrę 1) a raz losowanie odbędzie się np. 7 razy (przypisze 7 razy cyfrę 1). Oto kod :
void losowanie (int tab1a[4][4], int tab2a[4][4])
{
srand(clock());
int ile;
cout<<"Podaj ile ma byc statkow na planszy 5x5 (opcjonalnie 5)"<
cin>>ile;
for (int i=1;i<=ile;i++)
{
int a=rand()%4;
int b=rand()%4;
if (tab1a[a][b]==1) i=i-1;
else
tab1a[a][b]=1;
}
for (int i=1;i<=ile;i++)
{
int a=rand()%4;
int b=rand()%4;
if (tab2a[a][b]==1) i=i-1;
else
tab2a[a][b]=1;
}
return;}
Nie wiem dlaczego się tak dzieje - np. podam że ma być 5 statków a pojawia się ich 6 albo 7 (statki to liczba 1). Dałem tam warunek if - ponieważ gdyby random wylosował te same cyfry to jedna plansza miałaby mniejszą ilość statków od drugiej, a w przypadku gdy jest if - to gdy wylosują się te same cyfry *(czyli że tabela już ma przypisaną jedynkę) to licznik cofam o jeden w tył. Oczywiście to nie powinno być przyczyną tego że nie zgadza mi się liczba statków - podaję np. 5 a raz mi w losowaniu dopisuje 5 statków a raz jest ich aż np. 7 ! !
Ja tez mam pytanie związane z tematem - dlaczego trzeba pisać:
int tablica[10];int (tab)[10] = tablica; [/code]
a nie po prostu:
[code=php]int tablica[10];int (tab)[] = tablica;
:?: Przecież wymiar pierwszy nie jest nigdy potrzebny...
W przypadku wskaźnika tablica[5]; zostanie zamieniony na (tablica+0); lub jeżeli wolisz tablica;
W przypadku referencji typ int tablica[5] nie jest tym samym co int tablica[6];
Sprawdź co pokazuje typeid(tablica).name() - zawiera ilość elementów tablicy.
Gdyby przy przekazaniu przez referencję można by było nie podawać wymiaru to można by było przekazać przez referencje tablicy różnego rozmiaru, ale w takim przypadku co miałby zwrócić operator sizeof(tablica) wewnątrz funkcji?
Oczywiście tablice wyzerowałem i sprawdziłem później i przyjmuje dla wszystkich elementów 0. Natomiast po losowaniu to jest różnie - a losowanie przedstawiłem powyżej. A więc dlaczego raz losuje mi 5 liczb a raz 6 lub 7 ?
To było by w przypadku tablica[0] jak już :razz: A poza tym wcześniej jest gwiazdka przed nawiasem, bo od razu dokonywana jest dereferencja.
Aha, więc takie jest wytłumaczenie. No cóż, zawsze mógłby ten operator zwrócić tylko rozmiar 1 elementu danego typu, tak jak to jest w tych przypadkach:
No ale pewnie dlatego, że argument formalny funkcji stanowi najczęsciej tablica, a nie referencja do niej, referencja musi mieć określoną liczbę elementów - zaostrzono jakby reguły. Można to tak wytłumaczyc ?
Oto kod - mam tutaj problem bo raz mi w tablicy 1a oraz 2a przypisuje jedynki 5 razy a raz ich pokazuje się np. 6 czy 7 …
Ponadto w tablicy 1b znajdują się jedynki nie wiem dlaczego - skoro jest wyzerowana i nic jej nie przypisuję …?
void wyswietl( int tablicaa[][4], int tablicab[][4] );
int array1a[4][4];
int array1b[4][4];
int array2a[4][4];
int array2b[4][4];
int main(int argc, char *argv[])
{
int wynik1=0;
int wynik2=0;
int a,b;
// zerowanie tablic
for (int i=0;i<=4;i++)
for (int o=0;o<=4;o++)
{
array1a[i][o]=0;
array1b[i][o]=0;
array2a[i][o]=0;
array2b[i][o]=0;
}
// losowanie - mieszanie
srand( (unsigned)time( NULL ) );
// losowanie 5 pozycji z tablicy 1a
for (int i=0;i<=4;i++)
{
a=rand()%4;
b=rand()%4;
if (array1a[a][b]==1) {i=i-1;}
else
{array1a[a][b]=1;}
}
// losowanie 5 pozycji z tablicy 2a
for (int i=0;i<=4;i++)
{
a=rand()%4;
b=rand()%4;
if (array2a[a][b]==1) {i=i-1;}
else
{array2a[a][b]=1;}
}
wyswietl(array2a,array2b);
system("PAUSE");
return EXIT_SUCCESS;
}
// dodatkowa funkcja wyswietlajaca
void wyswietl( int tablicaa[][4], int tablicab[][4] )
{
cout<<" Twoja plansza "<
for (int i=0;i<=4;i++)
for (int o=0;o<=4;o++)
{
cout<
if (o==4) cout<
}
cout<<"Plansza twojego przeciwnika "<
for (int i=0;i<=4;i++)
for (int o=0;o<=4;o++)
{
cout<
if (o==4) cout<
}
return;
}
No deklaruję tablice 4x4 to prawda , ale używam jej także jako 4x4 przynajmniej tak mi się wydaje.
Napisałeś że w zerowaniu mam błąd :
for (int i=0;i<=4;i++)
for (int o=0;o<=4;o++)
{
array1a[i][o]=0;
array1b[i][o]=0;
array2a[i][o]=0;
array2b[i][o]=0;
}
jest tutaj pętla od 0 do 4 (włącznie), czyli maksymalną tablicą będzie array1a[4][4] - ponieważ w pętli są numerki 0,1,2,3,4 a tabela także jest od 0 - 4, czyli ma pięć elementów. Czy źle myślę ? Co do wyświetlania nieistniejących kolumn i wierszy :
for (int i=0;i<=4;i++)
for (int o=0;o<=4;o++)
{
cout<
if (o==4) cout<
}
to podobnie jak przy zerowaniu - pętla jest dla 0,1,2,3,4 (włącznie z 4) a więc maksymalna tablica która się wyświetli będzie miała numer 4 czyli tablicaa[4][4] - czy nie ?
PS: Faktycznie mój błąd niedopatrzenie Tablica jest tablica[4][4] co oznacza że posiada 4 elementy 0,1,2,3 , natomiast zerowanie mam dla 5 elementów ! Dziękuję za odpowiedzi
A ja mam pytanko do tematu, więc nie będę zakładał nowego. Nie łapię jak przekazać do funkcji tablicę (a nie jej kopię). Wszystko mi jedno czy to będzie ze wskaźnikiem czy referencją. Chcę wysłać tablicę do funkcji void, która wykona mi pewne algorytmy na niej i będę mógł przypisać jej wartości do innej tablicy w czasie tych operacji, np.
main (...) {
int tablica[100];
...
zlosliwieZamienZawartosc(tablica);
...
}
void zlosliwieZamienZawartosc (int &tablica) {
int *podtablica;
podtablica = new int[sizeof(tablica)/2];
for (int i=0; i
// tu się pojawia problem, którego nie mogę zrozumieć
lewa[i] = tablica[i];
}
...
}
Będę wdzięczny za pomoc. Próbowałem na mnóstwo sposobów z referencjami, wskaźnikami i innymi i albo mi się wywala przy kompilacji albo nie zmienia mi tablicy (czyli jest przekazywana kopia zmiennej zamiast samej zmiennej). Będę dozgonnie wdzięczny za pomoc.