PDA

View Full Version : problemi in visual c++


mistermars
28-09-2004, 08:46
ho creato un programma in c in cui ho utilizzato delle strutture per creare delle liste dinamiche:

struct nodo {
int info;
int w;
struct nodo *next;
};


il mio problema è che : se compilo il singolo programma ,senza nessun modulo aggiuntivo, va tutto liscio; mentre se inserisco dei moduli in c++ mi da degli errori in una linea di comando in cui efettuo un allocazione dinamica (cannot convert from 'void *' to 'struct nodo *')

Mi è stato detto che in visual c++ se utilizzo delle strutture all'interno di moduli c++ , il programma si incasina. è vero?

ilsensine
28-09-2004, 09:13
Originariamente inviato da mistermars
mentre se inserisco dei moduli in c++ mi da degli errori in una linea di comando in cui efettuo un allocazione dinamica (cannot convert from 'void *' to 'struct nodo *')
Ci sono delle piccole differenze tra c e c++. Una di queste è l'implicita conversione da void * a <qualsiasi tipo> *. La soluzione, che funziona in c++ ed è compatibile con il c, è di effettuare cast espliciti; ad esempio:
struct nodo *n = (struct nodo *) puntatore_void;

In alternativa, mantieni separato il codice c dal codice c++, in file con estensioni distinte. Ricordati però che il c++ richiede che le funzioni presenti in moduli c siano dichiarate con il prefisso extern "C".

mistermars
28-09-2004, 09:26
Originariamente inviato da ilsensine
La soluzione, che funziona in c++ ed è compatibile con il c, è di effettuare cast espliciti; ad esempio:
struct nodo *n = (struct nodo *) puntatore_void;

.


cosa intendi con effettuare cast espliciti?

cioè dovrei fare un assegnazione espicita?

p = malloc(sizeof(struct nodo)); ( questo è ciò che avevo scritto)

dovrei scrivere così?

struct nodo *p = (struct nodo *) malloc(sizeof(struct nodo));

ilsensine
28-09-2004, 09:47
Sì esattamente, basta il semplice (struct nodo *) prima della malloc.

mistermars
28-09-2004, 10:23
è sparito l'errore ma è comparso questo:

error C2086: 'p' : redefinition


questa è la funzione:

void accoda(struct nodoQ **primo, int v) {
struct nodoQ *p;

struct nodoQ *p =(struct nodoQ *) malloc(sizeof(struct nodoQ));
p->info = v;
p->next = *primo;
*primo = p;
return;
}

ilsensine
28-09-2004, 10:45
Certo ti ho solo detto di aggiungere il cast, non di ripetere la dichiarazione ;) (il mio precedente era solo un esempio per chiarificare i tipi, credevo che capissi).
Devi usare questa forma:
p =(struct nodoQ *) malloc(sizeof(struct nodoQ));

mistermars
28-09-2004, 11:05
Grazie dell'aiuto
Ho risolto i problemi

mistermars
28-09-2004, 14:51
ora mi ritrovo lo stesso problema con un allocazione di un puntatore che punta ad un array di puntatori


p[row]=malloc(sizeof(struct nodoQ))

dove p è stato definito prima come

struct nodoQ *p[nodi]


come faccio in questo caso?

anx721
28-09-2004, 15:02
p[row]=(struct nodoQ *)malloc(sizeof(struct nodoQ))

Con questo tipo di uso della malloc basta che fai precedere la chiamata della malloc ocn una coppia di parentesi tonde dentro le quali metti il tipo che passi a sizeof, seguito da un asterisco.


(Precisamente andrebbe messo il tipo della variabile che stai assegnando, che in genere è un puntatore al tipo che passi a sizeof)