Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Array dinamico (uso della malloc)


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 18 risposta/e

#1
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
Non riesco a capire dove sbaglio qualcuno può aiutarmi?
Il seguente codice alloca dinamicamente un array di 10 interi, purtroppo non capisco cosa sbaglio...una volta inserito un elemento poi non me lo stampa a video:

#include 
#include
void alloca_elenco(short int *vet);
int main()
{
short int *vet;
alloca_elenco(&(*vet));
printf("Inserisci l'elemento numero 2 del vettore:\n");
scanf("%hd", &vet[2]);
printf("L'elemento di indice 2 del vettore è:\n%hd", vet[2]);
system("PAUSE");
return 0;
}
void alloca_elenco(short int *vet)
{
vet=malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}
return;
}




#2
aRbok

aRbok

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1517 Messaggi:
Innanzitutto sbagli la malloc xchè essa restituisce un puntatore all'area heap dinamica dove hai allocato il vettore...tale puntatore però è al tipo null; devi perciò effettuare il cast esplicito al tipo puntatore a short int

vet=(short int*)malloc(....)

In generale

variabile(necessariamente dichiarate come punt)=(TIPO_VARIABILE*)malloc(....)

Un'altra cosa che non mi piace è questa
alloca_elenco(&(*vet));

Se la funzione richiede il puntatore al vettore non c'è bisogno di fare tutto sto casino con gli operatori & e * ma basta semplicemente che gli passi "vet" che è già un puntatore.

alloca_elenco(vet));

Fai ciò che vuoi : sarà tutta la Legge. Amore è la Legge, Amore sotto la Volontà.

#3
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
Ho corretto come hai detto ma non funziona, credo di averci messo anche qualche altro errore:
#include 
#include
void alloca_elenco(short int *vet);
int main()
{
short int *vet;
alloca_elenco(&(*vet));
scanf("%hd", &(*(vet+2)));
printf("%hd", (*(vet+2)));
system("PAUSE");
return;
}
void alloca_elenco(short int *vet)
{
vet=(short int*)malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}
return;
}


#4
aRbok

aRbok

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1517 Messaggi:
Si ma ti sei dimenticato di cambiare la seconda cosa che ti ho detto che non mi piaceva....prova e fammi sapere
Fai ciò che vuoi : sarà tutta la Legge. Amore è la Legge, Amore sotto la Volontà.

#5
aRbok

aRbok

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1517 Messaggi:
ecco prova così....


#include 
#include
void alloca_elenco(short int *vet);
int main()
{
short int *vet;
alloca_elenco(vet));
scanf("%hd", (vet+2));
printf("%hd", (*(vet+2)));
system("PAUSE");
return;
}
void alloca_elenco(short int *vet)
{
vet=(short int*)malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}
return;
}

P.S: secondo me faresti bene a rivederti un pò di aritmetica dei puntatori,se non capisci bene quella avrai problemi in futuro http://www.r0x.it/vi...&t=4244&start=0
Fai ciò che vuoi : sarà tutta la Legge. Amore è la Legge, Amore sotto la Volontà.

#6
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
scusa :D , forse quando leggevo tu stavi aggiungendo la seconda cosa che non ho letto:(
Ho corretto anche quello ma non è cambiato nulla :nono: è da due giorni e mezzo che provo e riprovo...se avevo scritto
alloca_elenco(&(*vet))
in questo modo era solo per avere quel benedetto "Done" che non mi sta servendo a nulla :asd:
Quindi alla fine ho scritto così anche se non funziona:

#include 
#include
void alloca_elenco(short int *vet);
int main()
{
short int *vet;
alloca_elenco(vet);
scanf("%hd", &(*(vet+2)));
printf("%hd", (*(vet+2)));
system("PAUSE");
return;
}
void alloca_elenco(short int *vet)
{
vet=(short int*)malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}
return;
}

senza usare la funzione funziona quindi sarà un errore nel passaggio dei parametri boh:

#include 
#include
int main()
{
short int *vet;
vet=(short int*)malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!");
return -1;
}
scanf("%hd", &(*(vet+2)));
printf("%hd\n", (*(vet+2)));
system("PAUSE");
return 0;
}


#7
Marco De Rosa

Marco De Rosa

    Advanced Member

  • Utente
  • StellaStellaStella
  • 854 Messaggi:
Ciao Gianluigi....te l'ho corretto.....ci stavano diversi errori nel passaggio dei parametri ma puoi notarli stesso tu confrontando il mio prog con il tuo...

#8
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
La tua correzione funziona ma mi da 4 errori, comincio a pensare che sia colpa del fatto che ho Vista sul PC...ma gli altri programmi funzionano correttamente boh...

Ho provato a togliere il puntatore temp, perchè credo che funzioni anche così:

#include 
#include

void alloca_elenco(short int *vet);

int main()
{
short int *vet;

alloca_elenco(&vet);

scanf("%hd", &vet);
printf("%hd\n", vet);

system("PAUSE");
return;
}

void alloca_elenco(short int *vet)
{

vet=(short int*)malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}

return;
}

in questo anche se non dice "done" funziona ma mi da un errore :ph34r:

Errori:

In function 'main':
10 [warning]passing arg 1 of 'alloca_elenco' from incompatible pointer type-------> l'errore cui fa riferimento il compilatore è evidenziato in rosso nel codice...anzi non si può evidenziare...lo metto di seguito:
alloca_elenco(&vet);

#9
Marco De Rosa

Marco De Rosa

    Advanced Member

  • Utente
  • StellaStellaStella
  • 854 Messaggi:
Quell'errore che ti dà è un errore che ho fatto io nel passaggio dei parametri :bash: ...
Io ti consiglierei di semplificare il tutto scrivendo:

#include 
#include

int main()
{
int *v;

v =(int*)malloc(10*sizeof(int));

scanf("%d", &v[0]);
printf("%d\n", v[0]);

free(v);

system("PAUSE");
return 0;
}

Perchè l'errore stà tutto in come vengono passati i parametri...domani lo guardo con calma....

#10
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
:ahsisi: Così funziona infatti, ti ringrazio per il tuo aiuto, ma visto che devo cominciare ad esercitarmi con liste dinamiche dovrò usare per forza le funzioni :desert:
Anch'io provo a rivederlo domani ora è tardi :|

#11
Franceska

Franceska

    Advanced Member

  • Utente
  • StellaStellaStella
  • 82 Messaggi:
Ho controllato quello con la funzione alloca elenco:
int main()
{
short int *vet;
alloca_elenco(vet); /* per vedere se serve * o & io ragiono così: la funzione vuole un puntatore.
* Il mio vet è già un puntatore quindi basta "vet" (perchè già contiene un indirizzo).
* Se avessi dichiarato semplicemente "short int vet", in tal caso avrei dovuto scrivere "&vet"
* passando il valore sinistro (cioè l'indirizzo dell'area di memoria) */

scanf("%hd", &vet);
printf("%hd\n", vet);

system("PAUSE");
return;
}

void alloca_elenco(short int *vet)
{
/*Qui non ho capito il tuo intento dichiarando *temp...*/

vet=(short int*)malloc(10*sizeof(short int));
if(vet==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}
}
Spero di averti fatto capire qualcosa in più
ciao

#12
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
Purtroppo mi da ancora errore...credo che la "&" ci voglia:
alloca_elenco(&vet);

Secondo me dovrebbe essere scritto così...è l'unico modo funzionante anche se da un errore:

#include 
#include

void alloca_elenco(short int *vettore);

int main()
{
short int *vet;

alloca_elenco(&vet);

scanf("%hd", &vet);
printf("%hd\n", vet);

system("PAUSE");
return;
}

void alloca_elenco(short int *vettore)
{

vettore=(short int*)malloc(10*sizeof(short int));
if(vettore==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}

return;
}

Errori:

In function 'main':
10 [warning]passing arg 1 of 'alloca_elenco' from incompatible pointer type-------> l'errore cui fa riferimento il compilatore è evidenziato in rosso nel codice...anzi non si può evidenziare...lo metto di seguito:
alloca_elenco(&vet);

Fate una cosa provatelo...fosse il mio Dev-C++ che non funziona bene :huh:

#13
Marco De Rosa

Marco De Rosa

    Advanced Member

  • Utente
  • StellaStellaStella
  • 854 Messaggi:
Allora.....guardandolo a quest'ora e non alle 3 di notte il programma ha più senso.. :D
Il problema stà nel fatto che se tu nella funzione non ritorni il putnatore all'area di memoria che vuoi allocare e non lo associ a vet quel puntatore quando esci dalla funzione lo perdi..e questo problema nasce dal modo in cui vengono passati i parametri all'interno delle funzioni...
Il codice giusto è:

#include 
#include

short int* alloca_elenco(short int *vettore);

int main()
{
short int *vet;

vet = alloca_elenco(vet);

scanf("%hd", &vet);
printf("%hd\n", vet);

system("PAUSE");
return;
}

short int* alloca_elenco(short int *vettore)
{

vettore=(short int*)malloc(10*sizeof(short int));
if(vettore==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}

return vettore;
}


#14
Franceska

Franceska

    Advanced Member

  • Utente
  • StellaStellaStella
  • 82 Messaggi:
Si hai ragione!
Raga ma come mai a me non dava errore? :scratch: Non solo veniva compilato, ma faceva ciò che doveva fare! Dipende dalla versione di devc? Però strano io ho l'ultima...Cosa mi consigliate di fare? Non posso dare per buoni dei programmi errati ._....

#15
Marco De Rosa

Marco De Rosa

    Advanced Member

  • Utente
  • StellaStellaStella
  • 854 Messaggi:
La versione del DevC non ci azzecca nulla....
Francesca nel tuo programma se dovrebbe fare quello che dovrebbe fare tu avresti allocato dinamicamente un vettore di 10 elementi......prova a fare un ciclo for (anche nel main) dove carichi stampi a video tutti e 10 gli elementi...

#16
Franceska

Franceska

    Advanced Member

  • Utente
  • StellaStellaStella
  • 82 Messaggi:
Ho fatto come hai detto e infatti mi stampa solo l'ultimo elemento letto...
però io chiedevo come mai il devc che ho mi ha permesso di compilare generando il .exe, mentre a Gianluigi no.
A me tutt'ora non segnala errori andandolo a compilare :doh:

#17
Gianluigi

Gianluigi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 74 Messaggi:
Funziona benissimo come ha detto M2O, ma ora mi chiedo se esista un modo per far eseguire la funzione senza ritornare il valore :scratch:

#18
Marco De Rosa

Marco De Rosa

    Advanced Member

  • Utente
  • StellaStellaStella
  • 854 Messaggi:
Questo è il codice con il for di carica e stampa....è impossibile che stampa 10 volte lo stesso elemento.....

#include 
#include

short int* alloca_elenco(short int *vettore);

int main()
{
short int *vet,i;

vet = alloca_elenco(vet);

for(i=0; i<10;i++)
scanf("%hd", &vet[i]);

for(i=0; i<10;i++)
printf("% hd", vet[i]);

printf("\n");
system("PAUSE");
return;
}

short int* alloca_elenco(short int *vettore)
{

vettore=(short int*)malloc(10*sizeof(short int));
if(vettore==NULL)
{
printf("Errore: memoria insufficiente!!!");
return;
}

return vettore;
}

Ti fa compilare il programma perchè sintatticamente di sbagliato non ci stà niente.....
Il tuo programma in poche parole fà questo

int main()
{
short int vet;

scanf("%hd", &vet);
printf("%hd\n", vet);

system("PAUSE");
return;
}


#19
aRbok

aRbok

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1517 Messaggi:
Ah è vero stanotte stavo dormendo veramente... Confermo quanto detto tranne il fatto che la funzione "alloca_elenco" non doveva essere void ....Cmq vi conviene fare così,non serve a niente passare il puntatore al vettore se poi esso viene ritornato dalla funzione e poi il prof.Pergen ci tiene a mantenere certi controlli all'esterno delle funzioni.

#include 
#include

short int* alloca_elenco();

int main()
{
short int *vet;

vet = alloca_elenco();
if(vet==NULL)

{
printf("Errore: memoria insufficiente!!!");
return;
}

scanf("%hd", &vet);
printf("%hd\n", vet);

system("PAUSE");
return;
}

short int* alloca_elenco()
{
short int* v;
v=(short int*)malloc(10*sizeof(short int));

return v;
}
[/quote]

P.S: per quanto riguarda franceska ,senti, che anche a me il DevC mi ha causato grossi problemi e mi dava errori alla rinfusa però non dipende certo dalla versione ma semmai dal sistea operativo.
Fai ciò che vuoi : sarà tutta la Legge. Amore è la Legge, Amore sotto la Volontà.




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi