Witam otóż mam następujący problem próbuje przekazać tablicę dwuwymiarową do funkcji gdzie drugi wymiar jest stał (const) niektóre kompilatory przyjmują zapis tab[n][1000] gdzie n jest dynamicznie pobierany niestety nie visual. Natomiast gdy próbuje to zrobić
int ** dp = new int*[e + 1];
for(int i=0;i<e+1;i++)
dp[i] =new int[MAX];
To przy wywołaniu wyskakuje niezgodność typów. Rozwiązanie pewnie jest banalne i proste jednak jakoś nie potrafię na nie wpaść.
Tak wygląda argument funkcji bool cos(int dp[][MAX])
int dp[4][MAX];
//MAX is the Maximum value M can take
//int ** dp = new int*[4];
//for(int i=0;i<4;i++)
// dp[i] = new int[MAX];
I teraz jeśli pierwszą linię zakomentuje a pozostałe odkometuje i zmienię argument na przez ciebie podany to funkcja zwraca zły wynik. Przyczyną może być to ,że używam rekurencji. Ale nie wiem jak to napisać by działało.
Właśnie o to mi chodziło dzięki wielki. Tylko dalej to nie działa po prostu nie wiem już co się dzieje.
//int dp[4][MAX];
int(*dp)[MAX];
dp = new int[4][MAX];
W teorii powinno dać to samo, no a w praktyce niestety nie, znowu jeśli “odwrócę” komentarze to działa a jak jest tak, to nie. Ale generalnie o to mi chodziło.
Masz pomysł czym się one różnią?
Winna jest funkcja memset która ma zamienić wszystkie wartości w tablicy na -1. Nie wiem dlaczego ona nie działa. Po ręcznym zamienieniu na -1 działa. Masz pomysł dlaczego nie działa?
Tak ona wygląda memset(dp, -1, sizeof(dp));
Dziękuje bardzo za pomoc zamiast sizeoff dałem po prostu n*MAX. Na razie wszystko działa ,ale muszę go jeszcze porządnie przetestować.
Dzięki wielki. Nie wiem czemu mnie zaćmiło i w ogóle nie brałem pod uwagę ,że nie działa ta linijka. Skoro mam i jeden wymiar i drugi to chyba szybciej będzie po prostu je przemnożyć zamiast używać sizeof. Czy się mylę?
To zależy w jaki sposób masz dostęp do tablicy. Jeśli już możesz użyć sizeof to zawsze lepiej wywalić ją poza funkcję i nie wywoływać jej przy każdym przebiegu pętli.
size_t size = sizeof(dp);
for(int i = 0; i < size; i++)
memset(dp[i], -1, MAX);
Ehh, ale dałem się wprowadzić w błąd. Przecież sizeof nie zwróci Ci ilości elementów tablicy. Jak chcesz mieć długość (ilość elementów) tablicy to musisz zrobić coś takiego:
Aha, ja myślałem, że pytasz o sens używania sizeof. Co do memset to tak jak napisałem, zależy jak utworzysz macierz. Osobiście jednak uważam, że załatwienie tego “za jednym zamachem” może być miejscem generującym błąd trudny do wyśledzenia. Osobiście zrobiłbym to w pętli.
int (*matrixTwo)[matrix_max];
matrixTwo = new int[n][matrix_max];
Szczerze to nie jestem pewny. Wydaje mi się, że innej opcji jak delete[] nie ma i to jest sposób na jej skasowanie. Dla pewności jednak sprawdziłbym czy na pewno zwalniane są wszystkie zasoby.