Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    [c/c++]Errore variabile globale

    Ciao a tutti... ho un piccolo problemino con una variabile in un programma (è un progetto win32... non so se può servire...)
    Il programma è strutturato come segue:

    Un file "GUI.h":
    codice:
    #if !defined(GUI_H)
         #define GUI_H
    
         #define STRICT
         #include<windows.h>
    
         HWND hWnd;  //->Questa è la variabile che mi da problemi
    
         int form(....)
         HWND Label(....)
         HWND TextBox(...)
         .....
    
    #endif
    Poi ho una serie di file *.cpp
    Button.cpp (dov è definita la funzione per la creazione dei bottoni)
    Form.cpp (funzione per la creazione e gestione della finestra principale)
    Label.cpp, Textbox.cpp (come sopra).... etc etc

    All'interno di questi file NON ho ridichiarato la variabile HWND hWnd.... però quando ho compilo ho i seguenti errori:
    codice:
    Form.obj: error LNK2005: *struct HWND___ * hWnd" (?hWnd@@3PAUHWND_@@A) già definito in Button.obj
    Label.obj: error LNK2005: *struct HWND___ * hWnd" (?hWnd@@3PAUHWND_@@A) già definito in Button.obj  
    TextBox.obj: error LNK2005: *struct HWND___ * hWnd" (?hWnd@@3PAUHWND_@@A) già definito in Button.obj
    Ma io non ho definito nulla li dentro... l'unico posto in cui l'ho dichiarata è in quel file .h... ho provato anceh a mettere "extern HWND hWnd"... ma senza successo....

    Dove sbaglio?


    Grazie....




    PS: Se possibile sapere... c'è qualcuno che lavora in accenture?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Cambia nome alla tua variabile.

  3. #3
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    La devo cambiare in tutto il programma? VVoVe:
    ehm... ma poi... perchè? è una parola riservata del c o qualcosa del genere?

  4. #4
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    beh... ho cambiato il nome in tutto il programma è il risultato è sempre lo stesso...


    se la cambio solo nel file .h invece mi da sempre errore e mi giustamente mi dice che la variabile non è stata definita nei vari file cpp....

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Un attimo ... ma questo file include e la variabile hWnd sono caratteristici del tuo progetto o sono "di sistema"?

  6. #6
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ehm... cosa intendi con "sono "di sistema"" ???

    Comunque li ho creati io... il file GUI.h l'ho fatto io...
    Nel file .h dichiaro la variabile "HWND hWnd".... poi devo creare la finestra del mio programmma... dunque nel file Form.cpp ho scritto il seguente codice:
    codice:
    .....
    
    hWnd = CreateWindow (...... );
    E questo era il form....

    Poi quando devo creare una label, un bottone, una textbox o quello che era ho scritto (nei vari file cpp:
    codice:
    ....
    HWND label;
    
    ...
    
    label = CreateWindow (.... , hWnd,...); //devo indicare la finestra madre che sarebbe hWnd
    ....
    Questo codice in pratica è identico per i bottoni e le textbox etc etc...

    Fino a quando la variabile hWnd era dichiarata locale nel file form.cpp funzionava tutto... poi pian piano che il programma diventava sempre più grosso questa variabile diventava ingestibile quindi l'ho dichiarata globale (facendo le opportune modifiche).... ho riguardato più volte il programma del caso in cui avessi dimenticato qualcosa... ma non ho trovato nulla.... d'altronde gli unici errori che mi da sono quelli riportati all'inizio... e sono sicurissimo che l'unico posto in cui ho dichiarato quella variabile è in quel file include...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Nei file di include NON si devono mai mettere definizioni di variabili o funzioni.
    Metti quella variabile hWnd in uno dei tuoi sorgenti .cpp e nell'header metti:

    extern HWND hWnd;
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    scusa ma cosa intendi per definizioni? la dichiarazione?

    Allora.. io nel mio file d'include ho solo messo quei prototipi di funzione e quella dichiarazione (vedi il primo messaggio... lì c'è tutto l'header).... non è corretto?

    Comunque per quanto riguarda il consiglio... dichiarandola in un solo file cpp e poi come extern nell'header, non dovrebbe risultare locale per quel file cpp? o risulta globale per tutto il programma?

    Ho provato così come mi hai detto comunque e non va lo stesso....
    Se la metto dentro il WinMain (HWND hWnd) e nell'header metto "extern
    HWND hWnd", mi da degli errori che del tipo:
    codice:
    error LNK2001: simbolo esterno *struct HWND___ * hWnd" (?hWnd@@3PAUHWND__@@A) non risolto
    quest'errore per tutti i file cpp in cui utilizzo la variabile hWnd

    Se la dichiaro fuori dalle funzioni, in un file .cpp, e nell'header gli metto "extern HWND hWnd" non da nessun errore, ma quando avvio il programma compaiono diversi errori che mi dicono che la label, la textbox, i bottoni non possono essere creati.... gli errori sono quelli che avev messo io nel codice... ad esempio.. per il bottone avevo scritto:

    codice:
    ....
    HWND ButtonOk = CreateWindow (....);
    
    if(!ButtonOk){ 
        MessageBox(NULL,"Errore nella creazione del pulsante OK","ERRORE",MB_OK | MB_ICONEXCLAMATION);
    return NULL;
    }
    ....

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Il Pazzo
    scusa ma cosa intendi per definizioni? la dichiarazione?

    Allora.. io nel mio file d'include ho solo messo quei prototipi di funzione e quella dichiarazione (vedi il primo messaggio... lì c'è tutto l'header).... non è corretto?
    Quella dichiarazione che hai fatto è una definizione ... alloca cioè memoria per la variabile.
    Essendo messa in un header che viene incluso da più sorgenti, ogni modulo oggetto (il file .obj) conterrà la variabile hWnd. A quel punto il linker si trova con più file oggetto che contengono lo stesso simbolo hWnd e ...... bam.

    A questo punto mi sorge spontanea una domanda: quella variabile hWnd ti serve che sia unica e globale a tutto il progetto? O che ogni sorgente abbia la "sua" variabile hWnd (distinta dalle altre)??

    Se ti serve globale al progetto, allora metti come globale (fuori dalle funzioni) e dentro 1 solo sorgente:

    HWND hWnd;

    e poi nell'header che tutti includono metti:

    extern HWND hWnd;

    Se invece vuoi che ogni sorgente abbia la "sua" variabile hWnd, allora puoi mettere nel header:

    static HWND hWnd;

    ... sebbene tale modo di includere una variabile static non mi piaccia per niente!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    Originariamente inviato da andbin
    A questo punto mi sorge spontanea una domanda: quella variabile hWnd ti serve che sia unica e globale a tutto il progetto? O che ogni sorgente abbia la "sua" variabile hWnd (distinta dalle altre)??

    Se ti serve globale al progetto, allora metti come globale (fuori dalle funzioni) e dentro 1 solo sorgente:

    HWND hWnd;

    e poi nell'header che tutti includono metti:

    extern HWND hWnd;
    Perfetto... globale al progetto... ho fatto come mi hai detto tu e non mi da nessun errore, nessun warning... però... non funziona... quando avvio il programma mi spuntano quegli errori....
    codice:
    ....
    HWND ButtonOk = CreateWindow (....);
    
    if(!ButtonOk){ 
        MessageBox(NULL,"Errore nella creazione del pulsante OK","ERRORE",MB_OK | MB_ICONEXCLAMATION);
    return NULL;
    }
    ....

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.