C++ Przekazywanie tablicy do funkcji przez wskaźniki - błąd


(Pawlus1993) #1

Po kompilacji mojego programu występuje następujący błąd podczas kompilacji:

[Error] cannot convert 'int (*)[20000]' to 'int*' for argument '3' to 'int LiczbaRoku(int, int, int*, int*)'

Przykład

Wejście:

5

2 1 7 3 2

2

8

11

Wyjście:

3

1

#include 

using namespace std;


int LiczbaRoku(int n, int m, int *tab1, int *tab2)

 {

 	int dzielniki=0;

 	for (int i=0;i
 	{

 		for (int j=0;j
 		{

 			if (tab1[i]%tab2[j]==0) 

 			{

		 		dzielniki++;

		 	}


 		}



 	}

 	return dzielniki;

 }


int main()

{

    int n,m,A[20000], B[10];

    cin>>n;

    for (int i=0;i>A[i];

    cin>>m;


    for (int i=0;i>B[i];


    cout<

  	return 0;  


}

(Frankfurterium) #2

Kiepsko pamiętam C++, ale funkcja LiczbaRoku przyjmuje wskaźnik na tablicę, a ty przez &A przekazujesz adres (chyba jako zwykłą liczbę) tablicy. Wskaźnikiem na tablicę (czy raczej pierwszy element) jest sama jej nazwa (zwyczajne A ).


(kostek135) #3

Potwierdzam powyższe. Zastanawia mnie tylko po co się w to bawić (przekazywanie jako argument) przy zadaniach czysto algorytmicznych. Zrób tablicę globalną i do przodu.

PS

Twój algorytm nie zwróci oczekiwanego wyjścia.

PS2

Można to zrobić lepiej niż O(m*n).


(Yuri20) #4

No no no, poradzenie sobie ze zmiennymi lokalnymi raczej jest łatwiejsze niż poradzenie sobie z ew. błedami ze zmiennymi globalnymi. Z reguły niezależnie co robisz trzeba stawiać na zmienna lokalne. Oraz tak, nazwa tablicy jest wskaźnikiem na jej pierwszy element.


(kostek135) #5

Nie wątpliwie jest to potrzebne przy napisaniu kodu dla komputerowego sędziego, który odpowie ile liczb z multizbioru A dzieli każdą z liczb ze zbioru B… Zresztą powyżej masz dowód empiryczny, że dla prostego programu, łatwiej jest zrobić zmienne globalne i napisać to szybko i “bez udziwnień”, tak aby algorytm był poprawny, więc o czym dyskutujemy?


(Yuri20) #6

Odrobina poprawności politycznej w C++ nie zaszkodzi. Zresztą algorytmy prędzej czy później przestaną być tylko celem samym w sobie i problemem stanie się ich zaimplementowanie w konkretnym programie, lepiej zatem zaczać pisać tak wcześnie jak się da.


([alex]) #7

kostek135 , mowa tu o tym że twoja rada “Zrób tablicę globalną i do przodu.” jest słuszna dla SPOJ’a lub podobnych tworów, ale generalnie dla C/C++ to jest bardzo zła rada. Więc kiedy dajesz taką dobrą radę warto dopisać Nie próbuj tego w domu!