Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 3.277 pregleda

Najnovija ↓

realocirati memoriju u potprogramu (C) 12.08.2003. u 12:49 · pre 283 meseca #1
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.
Re: realocirati memoriju u potprogramu (C) 12.08.2003. u 13:23 · pre 283 meseca #2
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
Re: realocirati memoriju u potprogramu (C) 12.08.2003. u 17:06 · pre 283 meseca #3
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.
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: realocirati memoriju u potprogramu (C) 12.08.2003. u 20:17 · pre 283 meseca #4
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....
Re: realocirati memoriju u potprogramu (C) 13.08.2003. u 00:56 · pre 283 meseca #5
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;

}



Potpis
I drink to make other people interesting.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme