filozof_ napisał(a)
No niestety u mnie wywala ten warning jeśli nie dam NULLA. Nie wnikam, niech będzie tak jak jest.
Bo źle przekazujesz "tablicę" przez argument. Już o tym pisaliśmy...
int *wczytaj(int **wsk, int *size)
/* ... */
tab = wczytaj(&tab, &rozmiar);
Tak, jak Ty to robisz zadziała źle i niezgodnie z treścią zadania. Do zmiennej wsk
w funkcji zostanie przypisany wskaźnik do tablicy, ale po wyjściu z funkcji ta zmienna jest niszczona. Program robi "prawie" to co powinien tylko dlatego, że do zmiennej tab
w main przypisujesz ten wskaźnik, ale kod jest błędny. Dlatego właśnie uważam, że demonstrowanie przekazywania wartości przez argument i wartość zwracaną w jednej funkcji wprowadza tylko zamieszanie.
Zrób eksperyment zanim poprawisz swój kod. Tak jak na początku, użyj dwóch zmiennych wskaźnikowych, np. tab
i tab2
. Nadaj im wartości NULL
(do celów demonstracji) i wywołaj funkcję w ten sposób:
tab = wczytaj(tab2, &rozmiar);
Zgodnie z zadaniem, zmienne tab
i tab2
powinny mieć po wywołaniu funkcji te same wartości. W rzeczywistości w tab
będzie jakiś adres, natomiast w tab2
nadal pozostanie NULL
, ponieważ zmiany widoczne były tylko w ciele funkcji.
filozof_ napisał(a)
Skoro przekazując wskaźnik na tablicę do funkcji , musze mieć jej rozmiar(tak jak wcześniej pisałeś) to dlaczego nie muszę mieć zainicjalizowanego parametru *size ?
Jeśli piszesz o funkcji wczytaj()
, to wartość zostanie nadana przez funkcję. Nie musisz zatem inicjować wskaźnika przed jej wywołaniem. Nie sugeruj się tym, że kompilator na Ciebie pluł warningiem w przypadku *tab
, gdyż wynika on z błędu w kodzie.
EDIT: OK, zrobię coś, czego nie powinienem robić i wkleję Ci poprawiony kod. Większość zrobiłeś sam, więc dużo Ci to nie pomoże. Poprawiłem sporo błędów, dodałem kilka rzeczy i uprościłem coś. Porównaj to ze swoim kodem.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
int *wczytaj(int **wsk, int *size) {
int elem, i;
do
scanf("%d", size);
while (*size > 20 || *size < 1);
if ( (*wsk = (int*)malloc(*size * sizeof(int))) == NULL )
return NULL;
for (i = 0; i < *size; i++) {
scanf("%d", &elem);
if ( (elem > 0) && ((elem % 3 == 0) || (elem % 5 == 0)) )
(*wsk)[i] = elem;
else
(*wsk)[i] = 0;
};
return *wsk;
}
void wypisz(int *tab, int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d\n", tab[i]);
};
}
int main(void) {
int *tab, *tab_ret, rozmiar;
tab_ret = wczytaj(&tab, &rozmiar);
assert(tab == tab_ret);
wypisz(tab, rozmiar);
free(tab);
return 0;
}
EDIT2: Żeby jeszcze bardziej zamieszać - z treści zadania wnoszę, że w tablicy mają się znaleźć tylko liczby większe od zera i podzielne przez 3 oraz większe od zera i podzielne przez 5. W Twoim kodzie do tablicy lądują liczby podzielne przez 3 i 5 (większe od zera), zaś pozostałe są zastępowane wartością 0
. Zastanów się nad tym.