PDA

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

anx721
20-02-2005, 19:52
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.