Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: [C++] struct

  1. #1

    [C++] struct

    Salve,

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

    codice:
    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?

    codice:
    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!
    Alla batteria dai retta ballA

  2. #2
    L'unico modo è di cambiare forma alla struttura:

    codice:
    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ù
    Alla batteria dai retta ballA

  3. #3
    ad esempio ho trovato questo metodo, sapete dirmio se è corretto e può essere più performante?

    la struttura rimane la stessa:

    codice:
    typedef struct
    {
    	LPSTR titolo;
    	LPSTR autore;
    	WORD pubanno;
    } mybooks;
    ma cambia la main:

    codice:
    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
    Alla batteria dai retta ballA

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Nel primo caso

    codice:
    struct libro 
    {
       char titolo[50];
       char autore[50];
       int pubanno;
    };
    devi usare la funzione strcpy per assegnare le stringhe.

    Se usi dei puntatori,

    codice:
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ho provato con strcpy ma il compilatore mi dice che non è "safe" e dovrei usare no_warnings di conseguenza...
    Alla batteria dai retta ballA

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ok. Un'ultima cosa...se voglio allocare dinamicamente diversi buffer (un array di struttura) posso fare così?

    codice:
    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)
    Alla batteria dai retta ballA

  8. #8
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    ok, però così:

    codice:
    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...
    Alla batteria dai retta ballA

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da gianvituzzi
    ok, però così:

    codice:
    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/ ??
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.