PDA

Visualizza la versione completa : [C] problemi allocazione dinamica del vettore


grasszilla
27-05-2013, 17:03
buona sera a tutti ragazzi!
sono un giovane studente di informatica (molto ignorante) che da meno di un anno sta studiando il c.
ho bisogno di una mano, infatti sto avendo problemi appunto con le funzioni malloc/realloc e le variabili puntatore, così vi chiedo gentilmente di correggermi poichè non ho il libro sottomano e non posso procedere a tentativi.

allora vi spiego il problema...
ho un vettore la quale dimensione dovrebbe cambiare continuamente, così una volta inizializzata inizio a popolarlo... però a questo punto il programma si blocca.

vi incollo qui sotto il codice che dovrebbero essere responsabili di questo disastro:



#include <stdio.h>
#include <malloc.h>
int DIM=1;



void Popola(int *vet[],int DIM)
{
int i;
for(i=0;i<DIM;i++)
{
*vet[i]=rand();
printf("\nvet[%d]=%d",i,*vet[i]);
}
}

void Cambiadimensione(int *vet[],int *DIM)
{
printf("\nInserisci la nuova dimensione");
scanf("%d",DIM);
int *tmp;
tmp = realloc(vet, *DIM);
vet = tmp;
Popola(vet,*DIM);
}



int main()
{
int *vet;
vet=malloc(sizeof(TIPO) * DIM);
Cambiadimensione(vet,&DIM);
system("PAUSE");
return 0;
}



grazie mille in anticipo per il vostro aiuto prezioso.

oregon
27-05-2013, 17:13
Come mi sembra debba essere



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

int dim = 1;

void Popola(int vet[], int dim)
{
int i;

for(i=0; i<dim; i++)
{
vet[i]=rand();
printf("\nvet[%d]=%d", i, vet[i]);
}
}

void Cambiadimensione(int **vet, int *dim)
{
printf("\nInserisci la nuova dimensione ");
scanf("%d", dim);

*vet = (int *)realloc(*vet, *dim * sizeof(int));

Popola(*vet, *dim);
}

int main()
{
int *vet;

vet = (int *)malloc(dim * sizeof(int));
Cambiadimensione(&vet, &dim);

system("PAUSE");

return 0;
}

grasszilla
27-05-2013, 17:38
Originariamente inviato da oregon
Come mi sembra debba essere



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

int dim = 1;

void Popola(int vet[], int dim)
{
int i;

for(i=0; i<dim; i++)
{
vet[i]=rand();
printf("\nvet[%d]=%d", i, vet[i]);
}
}

void Cambiadimensione(int **vet, int *dim)
{
printf("\nInserisci la nuova dimensione ");
scanf("%d", dim);

*vet = (int *)realloc(*vet, *dim * sizeof(int));

Popola(*vet, *dim);
}

int main()
{
int *vet;

vet = (int *)malloc(dim * sizeof(int));
Cambiadimensione(&vet, &dim);

system("PAUSE");

return 0;
}


ohhh grazie mille sul serio, potrà sembrare un codice banale ma mi si è incurvata la schiena a furia di batterci la testa sopra.
comunque essendo io uno studente ho bisogno di capirne il perchè, quindi non ti arrabiare se approfitto della tua disponibilità e ti faccio qualche domanda teorica(le ho incluse nel quote)





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

int dim = 1;

void Popola(int vet[], int dim)
{
int i;

for(i=0; i<dim; i++)
{
vet[i]=rand();
printf("\nvet[%d]=%d", i, vet[i]);
}
}

void Cambiadimensione(int **vet, int *dim)//cosa significa quell'operatore (**) che precede vet? e perchè non ci sono sono le parentesi quadre?
{
printf("\nInserisci la nuova dimensione ");
scanf("%d", dim);

*vet = (int *)realloc(*vet, *dim * sizeof(int));

Popola(*vet, *dim);//perchè qui invece non hai passato i parametri per riferimento?
}

int main()
{
int *vet;

vet = (int *)malloc(dim * sizeof(int));
Cambiadimensione(&vet, &dim); //perchè qui hai usato la &? così non passi l'indirizzo del puntatore?

system("PAUSE");

return 0;
}

oregon
27-05-2013, 17:52
void Cambiadimensione(int **vet, int *dim) //cosa significa quell'operatore (**) che precede vet? e perchè non ci sono sono le parentesi quadre?

Quello è un puntatore a puntatore.



Popola(*vet, *dim);//perchè qui invece non hai passato i parametri per riferimento?


Perché la funzione scrive dentro il vettore ma non gli serve la modifica del puntatore.


Cambiadimensione(&vet, &dim); //perchè qui hai usato la &? così non passi l'indirizzo del puntatore?

Perché il puntatore deve essere modificabile e quindi devi passare il puntatore al puntatore.


P.S. Ricordati, anche se non l'ho indicato nel codice, che alla fine ci vuole una free per liberare la memoria.

grasszilla
27-05-2013, 18:46
oh grazie ancora, ma se dalla funziona popola avessi la necessita di chiamare un altra funzione al quale passare vet e dim(e ovviamente modificarli) questa volta dovrei usare le &?

oregon
27-05-2013, 18:59
Se devi modificare i parametri che passi devi passarli per indirizzo.

grasszilla
27-05-2013, 19:47
quindi:


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

int dim = 1;

void Popola(int **vet[], int **dim)
{
int i;

for(i=0; i<dim; i++)
{
*vet[i]=rand();
printf("\nvet[%d]=%d", i, *vet[i]);
}
EventualeFunziona(*vet,*DIM);
}

void Cambiadimensione(int **vet, int *dim)
{
printf("\nInserisci la nuova dimensione ");
scanf("%d", dim);

*vet = (int *)realloc(*vet, *dim * sizeof(int));

Popola(&vet, &dim);
}

int main()
{
int *vet;

vet = (int *)malloc(dim * sizeof(int));
Cambiadimensione(&vet, &dim);

system("PAUSE");

return 0;
}}


è giusto o scritto cretinate?


scusa l'ossesione, ma come ti ho già detto non ho il libro sottomano e quindi non posso approfondire le variabili puntatore

oregon
27-05-2013, 21:02
Scusa, ma perché stai cambiano il codice che ti ho indicato e in particolare la funzione Popola ?

grasszilla
28-05-2013, 01:25
perchè ho bisogno di capire come gestire il passaggio di parametri quando una funzione ne chiama altre o quando due funzioni si chiamano a vicenda

oregon
28-05-2013, 01:35
Beh, ma studia sull'esempio che ti ho fatto, non cambiare ... è in quel modo che devi passare i parametri (in quel caso).

Ovviamente tutto va valutato caso per caso ... quindi devi parlare del caso particolare.

A parte il fatto che questo problema è diverso da quello dell' "allocazione dinamica della memoria" di cui si è parlato in questo thread. E per questo dovresti aprire un altro thread.

Loading