PDA

Visualizza la versione completa : [C++] struct


gianvituzzi
21-12-2009, 00:27
Salve,

non riesco a capire come mai non posso assegnare valori ai campi di questa struttura:



struct libro {
char titolo[50];
char autore[50];
int pubanno;
};


nel codice seguente o commentato le righe che mi davano errore, al contrario la riga non commentata assegna con successo i valori...come mai?



int _tmain(int argc, _TCHAR* argv[])
{

//struct libro book;
//book.autore = "author";
//book.titolo = "My Softwares";
//book.pubanno = 2009;
struct libro book = {"Guida al C", "Fabrizio Ciacchi", 2003};

return 0;
}


cannot convert from 'const char [7]' to 'char [50]'

grazie!

gianvituzzi
21-12-2009, 00:51
L'unico modo è di cambiare forma alla struttura:



struct libro {
char * titolo;
char * autore;
int pubanno;
};

// oppure:

typedef struct
{
LPSTR titolo;
LPSTR autore;
WORD pubanno;
} libro;


però così la guida alle strutture C++ pubblicata su questo stesso sito non mi torna più

gianvituzzi
21-12-2009, 01:37
ad esempio ho trovato questo metodo, sapete dirmio se è corretto e può essere più performante?

la struttura rimane la stessa:



typedef struct
{
LPSTR titolo;
LPSTR autore;
WORD pubanno;
} mybooks;


ma cambia la main:



int _tmain(int argc, _TCHAR* argv[])
{
using std::cout;
using std::endl;

mybooks *guida;
guida = (mybooks *) malloc(sizeof(mybooks));
guida->autore = "myself";
guida->pubanno = 2009;
cout << guida->autore << endl;
cout << guida->pubanno << endl;

free(guida);
return 0;
}



In questo caso dovrebbe essere una puntatore ad una struttura:
mybooks *guida

e poi allochiamo la memoria con l'esatta dimensione della struttura:
guida = (mybooks *) malloc(sizeof(mybooks))

(che ritorna un puntatore alla memoria riservata per la struttura)

Pensate che questo sia un buon approccio per gestire un buffer?

grazie

oregon
21-12-2009, 01:43
Nel primo caso



struct libro
{
char titolo[50];
char autore[50];
int pubanno;
};


devi usare la funzione strcpy per assegnare le stringhe.

Se usi dei puntatori,



typedef struct
{
LPSTR titolo;
LPSTR autore;
WORD pubanno;
} mybooks;


devi allocare (con la new, dato che parliamo di C++) lo spazio per le stringhe prima di usarle (ma sempre con la strcpy).

Con il C++, in realtà, sarebbe meglio utilizzare le

string

Le strutture e gli array di char (le stringhe del C) sono argomenti di "base" del C (neanche del C++) che ti consiglio di studiare in un libro, non in un forum.

gianvituzzi
21-12-2009, 01:57
ho provato con strcpy ma il compilatore mi dice che non è "safe" e dovrei usare no_warnings di conseguenza...

oregon
21-12-2009, 02:00
Originariamente inviato da gianvituzzi
ho provato con strcpy ma il compilatore mi dice che non è "safe" e dovrei usare no_warnings di conseguenza...

Se non è importante la "sicurezza" (per evitare i buffer overflow) usa il no_warnings.

Oppure usi la versione "sicura" della strcpy, la funzione strncpy ... sempre nel tuo libro ...

gianvituzzi
21-12-2009, 08:18
Ok. Un'ultima cosa...se voglio allocare dinamicamente diversi buffer (un array di struttura) posso fare così?



int _tmain(int argc, _TCHAR* argv[])
{
using std::cout;
using std::endl;
int num_buf = 5;
mybooks *guida;
guida = (mybooks *) malloc(sizeof(mybooks)*num_buf);
guida[0].autore = "author number zero";
guida[4].autore = "author number for";
cout << guida[0].autore << endl;
cout << guida[4].autore << endl;
free(guida);
return 0;
}


Il codice funziona correttamente

qual'è la fidderenza tra:

guida = (mybooks *) malloc(sizeof(mybooks)*num_buf)

e

guida = (mybooks *) malloc(sizeof(mybooks*)*num_buf);

in questo ultimo caso però mi impalla quasi il compiltore e fa uscire una "unhandle execption" (finestra disassembly)

MItaly
21-12-2009, 08:40
Originariamente inviato da gianvituzzi
guida = (mybooks *) malloc(sizeof(mybooks)*num_buf)

Allochi num_buf strutture mybooks.


guida = (mybooks *) malloc(sizeof(mybooks*)*num_buf);

Allochi num_buf puntatori a struttura mybooks, e casti erroneamente il puntatore ottenuto dalla malloc ad un mybooks * (quando dovrebbe essere un mybooks **); inutile dire che questo è errato.
Tra parentesi, in C++ non si usa malloc, ma new, che inizializza correttamente i tipi non-POD.

gianvituzzi
21-12-2009, 09:17
ok, però così:



mybooks *guida;
guida = (mybooks **) malloc(sizeof(mybooks*)*num_buf);


dice: error C2440: '=' : cannot convert from 'mybooks **' to 'mybooks *'

Cmq, mi domando in linea di massima, per creare un buffer di tipo /loop/ è meglio allocare num_buf strutture oppure num_buf puntatori ad una sola struttura...

oregon
21-12-2009, 09:25
Originariamente inviato da gianvituzzi
ok, però così:



mybooks *guida;
guida = (mybooks **) malloc(sizeof(mybooks*)*num_buf);


dice: error C2440: '=' : cannot convert from 'mybooks **' to 'mybooks *'


Se allochi un gruppo di puntatori, devi utilizzare un doppio puntatore, come hai scritto nel cast ... altrimenti, che senso ha?

mybooks **guida;

E comunque, in C++, usa la new e la delete ...


Cmq, mi domando in linea di massima, per creare un buffer di tipo /loop/ è meglio allocare num_buf strutture oppure num_buf puntatori ad una sola struttura...

Cos'è un buffer di tipo /loop/ ??

Loading