View Full Version : problema con malloc
terreldavis
19-02-2005, 16:56
ciao a tutti.
ho un problema che nn riesco a risolvere. sto compilando un compito che mi hanno assegnato con c++ ma quando vado ad allocare il mio nodo della coda con malloc mi da errore. riporto la funzione dove invoco malloc:
void insert(CODAPTR *headptr, CODAPTR *tailptr,long dato)
{
CODAPTR newptr;
newptr = malloc(sizeof(CODA)); /*qui mi da l'errore*/
if (newptr!=NULL){
newptr->valore=dato;
newptr->nextptr=NULL;
if (vuota(*headptr))
*headptr=newptr;
else
(*tailptr)->nextptr=newptr;
*tailptr=newptr;
}
else
printf("%ld non è stato inserito perche nn c'e' memoria disponibile.\n", dato);
}
l'errore che mi dice è : invalid conversion from`void*' to `CODA*'
questa funzione del mio programma dovrebbe aggiungere un nodo ad una coda.
come posso fare?
terreldavis
19-02-2005, 17:16
questo è il programma completo...se trovate degli errori ve ne sarò grato.
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
struct coda{
long valore;
struct coda *nextptr;
};
typedef struct coda CODA;
typedef CODA *CODAPTR;
void insert(CODAPTR *, CODAPTR*, long);
int vuota(CODAPTR);
long fatt(long);
void printresult(CODAPTR);
main()
{
CODAPTR headptr=NULL, tailptr=NULL;
long numero;
printf("Inserisci un numero: ");
scanf("\n%ld", &numero);
while (numero != 0){
insert(&headptr, &tailptr, numero);
printf("Inserisci un numero: ");
scanf("\n%ld", &numero);}
printresult(headptr);
printf("scrivi un numero: ");
scanf("\n%d",&numero);
printf("\n\n%ld! = %ld\n\n",numero, fatt(numero));
system("PAUSE");
return EXIT_SUCCESS;
}
long fatt(long num)
{
if(num<=1)
return 1;
else
return (num * fatt(num-1));
}
void insert(CODAPTR *headptr, CODAPTR *tailptr,long dato)
{
CODAPTR newptr;
newptr = malloc(sizeof(struct coda));
if (newptr!=NULL){
newptr->valore=dato;
newptr->nextptr=NULL;
if (vuota(*headptr))
*headptr=newptr;
else
(*tailptr)->nextptr=newptr;
*tailptr=newptr;
}
else
printf("%ld non è stato inserito perche nn c'e' memoria disponibile.\n", dato);
}
int vuota(CODAPTR headptr)
{
return headptr=NULL;
}
void printresult(CODAPTR currentptr)
{
if (currentptr == NULL)
printf("non hai inserito numeri\n");
else{
while (currentptr != NULL){
printf("\n\n%ld! = %ld\n", currentptr->valore, fatt(currentptr->valore));
currentptr = currentptr->nextptr;}
}
}
DanieleC88
19-02-2005, 17:34
Originariamente inviato da terreldavis
newptr = malloc(sizeof(CODA)); /*qui mi da l'errore*/
E tu allora fai così:
newptr = (CODAPTR) malloc(sizeof(CODA)); /*non dovrebbe più darti l'errore*/
terreldavis
19-02-2005, 17:49
peggio mi da un'altro errore che nn ho mai visto.....:eek:
mi apre un'altra cartella chiamata makefile.win e mi segnala la linea con scritto:
$(BIN): $(OBJ)
25 D:\Dev-Cpp\Makefile.win [Build Error] *** target pattern contains no `%'. Stop.
ma che vuol dire??????
terreldavis
19-02-2005, 17:55
anzi no cosi funziona!!!!!!:D
mi spieghi il perche nn ho capito la correzione che hai fatto!!
cmq grazieeeeeeee
DanieleC88
19-02-2005, 17:58
Be', quello almeno indica che ha superato la fase di compilazione... quindi l'errore è risolto. Quello che leggi ora è un'errore di GNU make nell'interpretare il Makefile, forse Dev-C++ lo ha generato male, non saprei.
terreldavis
19-02-2005, 18:01
sei un genio! mi dai ripetizioni? ancora nn riesco a capire perche aggiungendo (CODAPTR) si è risolto il problema.....
DanieleC88
19-02-2005, 18:03
Originariamente inviato da terreldavis
anzi no cosi funziona!!!!!!:D
mi spieghi il perche nn ho capito la correzione che hai fatto!!
cmq grazieeeeeeee
Whoops, non avevo ancora letto questo :)
Be', la correzione era semplice: "malloc" restituisce un puntatore ad una zona di memoria, senza un tipo particolare di dati (per questo "void"). Essendo un tipo "vuoto", non è applicabile ad una normale variabile, contenente invece dati concreti. Perciò ti tocca forzare il compilatore ad interpretare quella zona di memoria resituita da "malloc" come contenente i dati che ti servono, in questo caso di tipo "CODA".
Bye :) -- e che utenti più esperti mi correggano in cacso di errore!
DanieleC88
19-02-2005, 18:09
Originariamente inviato da terreldavis
sei un genio! mi dai ripetizioni?
Dai, non esagerare... ho solo un po' più di esperienza di te. Quanti anni hai? Da quanto programmi?
terreldavis
19-02-2005, 18:16
credo di aver capito grazie ancora...stavo cercando sul libro la funzzione malloc...qui mi dice:
la funzione malloc acquisisce, come argoment, il numero di byte che dovranno essere allocati e restituisce un puntatore di tipo void * che fa riferimento all'area di memoria allocata.(e fin qui ci siamo), poi, un puntatore void * può essere asseganto a una variabile di tipo qualsiasi degli altri tipi di puntatore...
esempio:
newptr = malloc(sizeof(struct node));
(io nn ho capito.....a me scritto come dice lui nn funziona)
grazie ancora daniele mi hai salvato la giornata stavo per spaccare tutto!
DanieleC88
19-02-2005, 18:25
Originariamente inviato da terreldavis
newptr = malloc(sizeof(struct node));
(io nn ho capito.....a me scritto come dice lui nn funziona)
Non funziona perché forse newptr è anch'esso un void* :)
Originariamente inviato da terreldavis
grazie ancora daniele mi hai salvato la giornata stavo per spaccare tutto!
Esagerato!
ciao
Originariamente inviato da terreldavis
newptr = malloc(sizeof(struct node));
(io nn ho capito.....a me scritto come dice lui nn funziona)
"Come dice lui" va bene per il C; se te compili quell'istruzione come C++ invece non va bene perche in C++ non si eseguono conversioni di tipo automatiche come avviene in C.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.