[ ognjen_z @ 12.08.2003. 11:49 ] @
Problem je sledeci. Program ispravno radi, nego ono sto me kopka jeste kako realocirati memoriju pokazivaca tako da oni ne zauzimaju vise mesta nego sto je neophodno. Molim vas za pomoc vec dugo muku mucim oko ovoga. Program je sledeci:
void pot (int *a, int *n, int *b) {
int i, j=0;

/* Problem je ovde! Hocu da svedem niz na broj potrebnih elemenata. */

for (i=0;i<*n;i++) {if ((a%2)==0) b[j++]=a;}
*n=j;
}

#include <stdio.h>
#include <stdlib.h>
#define N 30000

main () {
int a[N], b[N];
int n, i;

for (;;) {
printf("\nUnesi broj elemenata niza: \n");scanf("%d",&n);
if (n<0) break;
printf("\nUnesi sada celobrojne elemente niza: \n");
for (i=0;i<n;scanf("%d",&a[i++]));
pot(a,&n,b);
printf("\nNovi niz bez neparnih brojeva je: \n");
for (i=0;i<n;printf("%d ",b[i++]));
printf("\nNovi broj elemenata niza je sada %d.",n);
}
}

Pokusao sam na vise nacina ali mi nije u redu bilo ni jedan put. Vapaj za pomoc.
[ srki @ 12.08.2003. 12:23 ] @
Ne bih bas rekao da tvoja funkcija radi to sto ocekujes da radi ali nevezano sa tim ja samo vidim da u toj funkciji alociras memoriju za promenjive i i j.

Sta ti to znaci da hoces da realociras memoriju pokazivaca? Pokazivaci u funkciji ti samo pokazuju na po jednu int vrednost i nista vise...

Mislim da si ti malo pogresno shvatio stvari kada su u pitanju argumenti funkcije koji su pokazivaci na nesto.
Mozda si imao iskustva sa Pascalom gde kada se stavi var array formira se lokalna kopija niza. Ovde se ne pravi nikava kopija niza i tako se uopste ne alocira nikakva memorija. Imas samo dva pokazivaca koja pokazuju na prve clanove nizova a i b
[ leka @ 12.08.2003. 16:06 ] @
Nevezano za pitanje - ti si prvi covek koga sam video da definicije funkcija stavlja pre #include direktiva! :)

Ono sto je vezano za pitanje sa druge strane je da bi ti verovatno (mozda) pomoglo jedno man realloc na nekoj Linux/UNIX masini, ili y MSYS/Cygwin-u na Win*****-u.
[ ognjen_z @ 12.08.2003. 19:17 ] @
Radi se o tome da sam nizove smestio u dinamicku memoriju pa sam zbog toga koristio pokazivace. U svakom slucaju problem sam resio. Nisam uspeo realocirati memoriju ali sam to resio malom zaobilaznicom. Izuzetno sam zadovoljan. Hvala vam na trudu da mi odgovorite. Cujemo se....
[ Marko Stankovic @ 12.08.2003. 23:56 ] @
Koliko ja mogu da primetim nizovi u tvom programu su staticki, odnosno nisu alocirani dinamicki. Mada u svakom slucaju imena nizova su pokazivaci bez obzira na nacin alokacije.
Evo ja sam sklopio na brzaka program koji radi ono sto ti zelis, malo mu treba doterivanje ali bitno je da radi posao.
Code:

#include <stdio.h>
#include <stdlib.h>

int pot (int *niz1, int n, int *niz2){
     int i, j=0;

    for (i=0;i<n;i++) {if ((niz1[i]%2)==0) niz2[j++]=niz1[i];}
    
    return j;
    

}
int main(){
    
    int *niz1, *niz2, n, m, i;
    
    printf("Unesite dim niza:");
    scanf("%d", &n);
    
    /* pretpostavicu da su svi uneseni podaci ispravni i da ima dovoljno mem za niz */
    /* naravno ti izvrsi provere u svom programu */
    
    niz1=(int *)calloc(n, sizeof(int));
    niz2=(int *)calloc(n, sizeof(int));
    
    printf("Unesite niz:\n");
    for(i=0;i<n;i++) scanf("%d", &niz1[i]);
    
    /* ovde ce f-ja pot da vrati dimenziju novog niza pa cemo da izvrsimo realociranje */
    
    m=pot(niz1, n, niz2);
    
    niz2=(int *)realloc(niz2, m*sizeof(int));
    
    printf("Niz bez neparnih je:\n");
    for(i=0;i<m;i++) printf("B[%d]=%d\n", i+1, niz2[i]);
    
    printf("Novi broj elemenata niza je: %d\n", m);
    
    free(niz1); free(niz2);
    
    return 0;

}