Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

realocirati memoriju u potprogramu (C)

[es] :: C/C++ programiranje :: realocirati memoriju u potprogramu (C)

[ Pregleda: 2557 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ognjen_z

Član broj: 10897
Poruke: 12
*.ptt.yu



Profil

icon realocirati memoriju u potprogramu (C)12.08.2003. u 11:49 - pre 251 meseci
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.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz



+3 Profil

icon Re: realocirati memoriju u potprogramu (C)12.08.2003. u 12:23 - pre 251 meseci
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
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: realocirati memoriju u potprogramu (C)12.08.2003. u 16:06 - pre 251 meseci
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.

Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

ognjen_z

Član broj: 10897
Poruke: 12
*.ptt.yu



Profil

icon Re: realocirati memoriju u potprogramu (C)12.08.2003. u 19:17 - pre 251 meseci
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....
 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
*.ptt.yu



Profil

icon Re: realocirati memoriju u potprogramu (C)12.08.2003. u 23:56 - pre 251 meseci
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;

}




I drink to make other people interesting.
 
Odgovor na temu

[es] :: C/C++ programiranje :: realocirati memoriju u potprogramu (C)

[ Pregleda: 2557 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.