Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Puntatori, stringhe e operatore new

    ciao

    Ho questo problema!
    Ho scritto questo pezzo di codice all'interno di una classe

    studente::studente(char *n,char *c,int m, int v[12])
    {
    int l;
    int k;
    strcpy(n,nome);
    strcpy(c,cognome);
    l = strlen(n)
    nome = new char[l]
    delete [] nome;
    k = strlen(c)
    cognome = new char[k];
    delete [] cognome;
    if((m>=0)&&(m<=300))
    matricola=m;
    else
    cout<<"\nmatricola non valida";
    for(int i=0;i<12;i++)
    if((v[i]>=0)&&(v[i]<=31))
    voti[i]=v[i];
    else
    cout<<"\nvoto "<<(i+1)<<" non valido";
    };

    Non so perchè mi dia errore nel pezzo di:

    nome = new char[l]

    mi dice parse error before `='
    E fa così anche per l'altro ovviamente.
    Come mai? Non è giusta la sintassi?
    SO DI NON SAPERE... (COME DIREBBE SOCRATE)

    QUESTO E' IL GUAIO... (COME DICO IO )

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Prova questo:

    codice:
    nome* = new char[I];
    Per favore quando postate codice mettetelo tra i tag code, altrimenti è un macello
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  3. #3
    I ; PER DIOOOOOOOOOOOO!


  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Ora ho fatto un macello

    codice:
    nome* = new char[I];
    r0x
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  5. #5
    Non vorrei dire ma sto code mi pare *veramente tanto sballato* tanto per cominciare devi allocare la memoria prima di usare strcpy e non dopo. Come fai tu ottieni solo un segmentation fault. Poi, il primo valore di strcpy() non è l'indirizzo di partenza, ma quello di destinazione. il tuo code dovrebbe quindi essere:

    l = strlen(n) + 1; // zero finale
    k = strlen(c) + 1;
    nome = new char[l];
    cognome = new char[k];
    strcpy(nome, n);
    strcpy(cognome, c);

    /* non deallocare la memoria sennò nome
    e cognome potrebbero essere sovrascritti */


    questo è solo un accorgimento che devi fare, per deallocare memoria usa un distruttore, cosi:

    studente::~studente()
    {
    delete[] nome;
    delete[] cognome;
    }


    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Ah ma intendevi che mancano i punti e virgola e mettici i predicati verbali credevo che fosse i maiuscola e non elle

    Resetta dalla memoria quanto scritto sopra dragon meno male che sono arrivati rox e tgw :bubu:
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  7. #7
    codice:
    l = strlen(n)
    nome = new char[l]
    delete [] nome;
    Il 'new' va fatto dopo un eventuale 'delete', altrimenti prima ti becchi un possibile leak e poi usi strcpy() su memoria non allocata.

    Nel costruttore ti consiglio di inizializzare i puntatori a NULL, e altrove di reimpostarli a NULL se deallocati e non riallocati. Queste precauzioni ti permettono di agire in questa maniera:

    codice:
    if( nome != NULL )
        delete[] nome;
    
    l = strlen( n ) + 1; // come ha osservato TGW
    nome = new char[ l ];
    
    ...
    Nel distruttore assicurati invece di inserire questo codice (piccola rettifica):

    codice:
    studente::~studente()
    {
        if( nome != NULL )
            delete[] nome;
    
        if( cognome != NULL )
            delete[] cognome;
    }
    Ciao.

    P.S.: credo che cmq chiamare 'delete' su NULL non crei problemi, ma dopo un po` di esperienza ti consiglio di non contarci mai..

  8. #8
    Buone osservazioni r0xone, però dimmi una cosa, con quel code c'è un caso in cui il distruttore trovi un puntatore a NULL? secondo me no, else pastami un caso in cui potrebbe.

    TVB

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  9. #9
    ah dimenticavo, oltretutto non su tutti i compilatori (ad esempio non su gcc) una zona di memoria deallocata è settata automaticamente a 0, per cui...

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  10. #10
    Infatti, r0x, non dovrebbe mai dare problemi quando si libera un puntatore NULL, credo che si possa dare tranquillamente per scontato senza fare dei test, ma comunque un test in + è una sicurezza piuttosto che un errore.

    La cosa importante è settarli a NULL dopo la deallocazione visto che la libreria standard di molti compiler non lo fanno, per evitare di deallocare 2 volte, visto che è inpredicibile il modo in cui un programmatore potrebbe decidere di usare la nostra classe.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.