IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Inclusion de fichiers .cpp

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut Inclusion de fichiers .cpp
    Bonjour,
    je crée actuellement une application de gestion, et pour simplifier le code, j'ai décidé de rassembler tout ce qui concerne la base de données dans un fichier 'sql.cpp'. Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include <QWidget>
    #include <QMessageBox>
     
    #include <QFile>
    #include <QTextStream>
     
    #include <QSqlDatabase>
    #include <QSqlQueryModel>
    #include <QSqlQuery>
    #include <QSqlError>
     
    QWidget *GLOB_WI_base;
     
    QSqlDatabase GLOB_database;
    QString GLOB_database_path;
    QString GLOB_database_host;
    QString GLOB_database_port;
    QString GLOB_database_user;
    QString GLOB_database_password;
     
    QSqlQuery GLOB_query;
     
    bool getDatabaseParams()
    {
        QFile Database_params_file("G:/tests/BDE/calls.ini");
        if (!Database_params_file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::critical(GLOB_WI_base,"Error","Cannot find 'calls.ini'. Be sure the file's in the same folder than 'CALLS.FDB'.");
            return false;
        }
        QTextStream Stream(&Database_params_file);
        QString Database_params_file_text;
        Database_params_file_text.append(Stream.readAll());
        QMessageBox::information(GLOB_WI_base,"",Database_params_file_text);
     
        int Index_database_path=Database_params_file_text.indexOf("Database path: ");
        int Index_database_host=Database_params_file_text.indexOf("Host: ");
        int Index_database_port=Database_params_file_text.indexOf("Port: ");
        int Index_database_user=Database_params_file_text.indexOf("User: ");
        int Index_database_password=Database_params_file_text.indexOf("Password: ");
     
        GLOB_database_path=Database_params_file_text.mid(Index_database_path+15,Index_database_host-(Index_database_path+15));
        GLOB_database_host=Database_params_file_text.mid(Index_database_host+6,Index_database_port-(Index_database_host+6));
        GLOB_database_port=Database_params_file_text.mid(Index_database_port+6,Index_database_user-(Index_database_port+6));
        GLOB_database_user=Database_params_file_text.mid(Index_database_user+6,Index_database_password-(Index_database_user+6));
        GLOB_database_password=Database_params_file_text.mid(Index_database_password+10,Database_params_file_text.size()-(Index_database_password+10));
     
        QMessageBox::information(GLOB_WI_base,"",GLOB_database_path+"\n"+GLOB_database_host+"\n"+GLOB_database_port+"\n"+GLOB_database_user+"\n"+GLOB_database_password);
        return true;
    }
     
    bool connectDatabase()
    {
        if(getDatabaseParams()==true)
        {
            GLOB_database=QSqlDatabase::addDatabase("QIBASE");
            GLOB_database.setDatabaseName(GLOB_database_path);
            GLOB_database.setHostName(GLOB_database_host);
            GLOB_database.setPort(GLOB_database_port.toInt());
            GLOB_database.setUserName(GLOB_database_user);
            GLOB_database.setPassword(GLOB_database_password);
            if(!GLOB_database.open()){
                QMessageBox::critical(GLOB_WI_base, "Connection failed", "Error while opening the database : "+GLOB_database.lastError().text());
            }else{
                GLOB_query=QSqlQuery(GLOB_database);
                return true;
            }
        }
        return false;
    }
     
    /*
    void changeDatabaseParams(QString PAR_GLOB_database_path, QString PAR_GLOB_database_host, QString PAR_GLOB_database_port, QString PAR_GLOB_database_user, QString PAR_GLOB_database_password)
    {
     
    }
    */
    /***************
     * SQL QUERIES *
     ***************/
     
    void getUsers(QList<QString> &PAR_list_users)
    {
        GLOB_query.prepare("SELECT CO_NAME FROM TA_COLLEAGUE ORDER BY CO_NAME;");
        if(!GLOB_query.exec())
            QMessageBox::critical(GLOB_WI_base, "Query execution error", "Error occured while query execution : "+GLOB_query.lastError().text());
        while(GLOB_query.next())
        {
            bool New=true;
            for(int i=0;i<PAR_list_users.count();i++)
            {
                if(GLOB_query.value(0).toString()==PAR_list_users[i])
                    New=false;
            }
            if(New)
                PAR_list_users.append(GLOB_query.value(0).toString());
        }
    }
    Jusqu'à maintenant, je n'avais que des fonctions void, et tout fonctionnait correctement. Depuis que j'ai modifié les fonction 'getDatabaseParams' et connectDatabase' pour qu'elles renvoient un booléen, je n'arrive plus à compiler mon programme. J'ai l'erreur 'Multiple definition of ...' pour chaque variable globales et chaque fonction. Apparemment ces variables et fonctions seraient déjà déclarées dans le fichier 'win_main.o', 'WIN_main' étant ma fenêtre principale, et le seul endroit où est inclus mon fichier 'sql.cpp'. En fait, le problème apparaît dès que j'inclus mon fichier quelque part. Une idée?
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inclus mon fichier 'sql.cpp'


    Tu sais programmer en C++ ou en C? parce qu'on apprend rapidemment les include guards dans les fichiers entêtes: ce n'est pas pour rien

    Et un peu plus loin on apprend les unités de compilation

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    Merci pour ta réponse !
    Je n'avais malheureusement pas encore appris cela, je programme depuis seulement une année. Mais du coup j'ai regardé du côté de ces 'include guards', et j'ai modifié mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #ifndef SQL_CPP
    #define SQL_CPP
     
    #include <QWidget>
    #include <QMessageBox>
     
    #include <QFile>
    #include <QTextStream>
     
    #include <QSqlDatabase>
    #include <QSqlQueryModel>
    #include <QSqlQuery>
    #include <QSqlError>
     
    QWidget *GLOB_WI_base;
     
    QFile GLOB_database_params_file("G:/tests/BDE/calls.ini");
    QTextStream GLOB_stream(&GLOB_database_params_file);
     
    QSqlDatabase GLOB_database;
    QString GLOB_database_path;
    QString GLOB_database_host;
    QString GLOB_database_port;
    QString GLOB_database_user;
    QString GLOB_database_password;
     
    QSqlQuery GLOB_query;
     
    bool getDatabaseParams()
    {
        if (!GLOB_database_params_file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::critical(GLOB_WI_base,"Error","Cannot find 'calls.ini'. Be sure the file's in the same folder than 'CALLS.FDB'.");
            return false;
        }
        QString Database_params_file_text;
        Database_params_file_text=GLOB_stream.readAll();
        QMessageBox::information(GLOB_WI_base,"",Database_params_file_text);
     
        int Index_database_path=Database_params_file_text.indexOf("Database path: ");
        int Index_database_host=Database_params_file_text.indexOf("Host: ");
        int Index_database_port=Database_params_file_text.indexOf("Port: ");
        int Index_database_user=Database_params_file_text.indexOf("User: ");
        int Index_database_password=Database_params_file_text.indexOf("Password: ");
     
        GLOB_database_path=Database_params_file_text.mid(Index_database_path+15,Index_database_host-(Index_database_path+15));
        GLOB_database_host=Database_params_file_text.mid(Index_database_host+6,Index_database_port-(Index_database_host+6));
        GLOB_database_port=Database_params_file_text.mid(Index_database_port+6,Index_database_user-(Index_database_port+6));
        GLOB_database_user=Database_params_file_text.mid(Index_database_user+6,Index_database_password-(Index_database_user+6));
        GLOB_database_password=Database_params_file_text.mid(Index_database_password+10,Database_params_file_text.size()-(Index_database_password+10));
     
        QMessageBox::information(GLOB_WI_base,"",GLOB_database_path+"\n"+GLOB_database_host+"\n"+GLOB_database_port+"\n"+GLOB_database_user+"\n"+GLOB_database_password);
        return true;
    }
     
    bool connectDatabase()
    {
        GLOB_database.close();
        if(getDatabaseParams()==true)
        {
            GLOB_database=QSqlDatabase::addDatabase("QIBASE");
            GLOB_database.setDatabaseName(GLOB_database_path);
            GLOB_database.setHostName(GLOB_database_host);
            GLOB_database.setPort(GLOB_database_port.toInt());
            GLOB_database.setUserName(GLOB_database_user);
            GLOB_database.setPassword(GLOB_database_password);
            if(!GLOB_database.open()){
                QMessageBox::critical(GLOB_WI_base, "Connection failed", "Error while opening the database : "+GLOB_database.lastError().text());
            }else{
                GLOB_query=QSqlQuery(GLOB_database);
                return true;
            }
        }
        return false;
    }
     
    void changeDatabaseParams(QString PAR_GLOB_database_path, QString PAR_GLOB_database_host, QString PAR_GLOB_database_port, QString PAR_GLOB_database_user, QString PAR_GLOB_database_password)
    {
        if (!GLOB_database_params_file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        {
            QMessageBox::critical(GLOB_WI_base,"Error","Cannot find 'calls.ini'. Be sure the file's in the same folder than 'CALLS.FDB'.");
        }
        GLOB_stream<<"Database path: "+PAR_GLOB_database_path
                     +"\nHost: "+PAR_GLOB_database_host
                     +"\nPort: "+PAR_GLOB_database_port
                     +"\nUser: "+PAR_GLOB_database_user
                     +"\nPassword"+PAR_GLOB_database_password;
     
        GLOB_database_path=PAR_GLOB_database_path;
        GLOB_database_host=PAR_GLOB_database_host;
        GLOB_database_port=PAR_GLOB_database_port;
        GLOB_database_user=PAR_GLOB_database_user;
        GLOB_database_password=PAR_GLOB_database_password;
        connectDatabase();
    }
     
    /***************
     * SQL QUERIES *
     ***************/
     
    void getUsers(QList<QString> &PAR_list_users)
    {
        GLOB_query.prepare("SELECT CO_NAME FROM TA_COLLEAGUE ORDER BY CO_NAME;");
        if(!GLOB_query.exec())
            QMessageBox::critical(GLOB_WI_base, "Query execution error", "Error occured while query execution : "+GLOB_query.lastError().text());
        while(GLOB_query.next())
        {
            bool New=true;
            for(int i=0;i<PAR_list_users.count();i++)
            {
                if(GLOB_query.value(0).toString()==PAR_list_users[i])
                    New=false;
            }
            if(New)
                PAR_list_users.append(GLOB_query.value(0).toString());
        }
    }
     
    #endif // SQL_CPP
    D'après moi le code devrait marcher comme ceci, pourtant j'ai toujours les mêmes erreurs! Je tiens aussi à préciser que je n'ai pas de fichier d'entête, je voudrais seulement le fichier .cpp.
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par mistercactus Voir le message
    pourtant j'ai toujours les mêmes erreurs
    C'est normal

    C'est la deuxième parti de ma réponse: les unités de compilation (en gros 1. cpp + les include)

    Lorsque tu fais un include de ton .cpp tu METS LA DÉFINITION dans chaque unité où il y a un include. Donc le linker, qui va lier les unités de compilation, voit plusieurs fois la même définition.

    Code normalement et pas à la mords-moi-le-nœud: fais une entête avec les include guards et que des déclarations et fais un include de cette entête où il y en a besoin.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    Merci !
    J'ai donc créé un header avec mes variables globales et mes déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #ifndef SQL_H
    #define SQL_H
     
    #include <QWidget>
    #include <QMessageBox>
     
    #include <QFile>
    #include <QTextStream>
     
    #include <QSqlDatabase>
    #include <QSqlQueryModel>
    #include <QSqlQuery>
    #include <QSqlError>
     
    QWidget *GLOB_WI_base;
     
    QFile GLOB_database_params_file("G:/tests/BDE/calls.ini");
    QTextStream GLOB_stream(&GLOB_database_params_file);
     
    QSqlDatabase GLOB_database;
    QString GLOB_database_path;
    QString GLOB_database_host;
    QString GLOB_database_port;
    QString GLOB_database_user;
    QString GLOB_database_password;
     
    QSqlQuery GLOB_query;
     
    bool getDatabaseParams();
     
    bool connectDatabase();
     
    void changeDatabaseParams(QString PAR_GLOB_database_path, QString PAR_GLOB_database_host, QString PAR_GLOB_database_port, QString PAR_GLOB_database_user, QString PAR_GLOB_database_password);
     
    void getUsers(QList<QString> &PAR_list_users);
     
    #endif // SQL_H
    Mais j'imagine que je suis obligé de créer une classe vu que j'ai toujours les mêmes erreurs (en incluant le header bien sûr)
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par mistercactus Voir le message
    Mais j'imagine que je suis obligé de créer une classe vu que j'ai toujours les mêmes erreurs (en incluant le header bien sûr)
    Espèce de coquin

    Citation Envoyé par mistercactus Voir le message
    J'ai donc créé un header avec mes variables globales et mes déclarations
    Évidemment si tu mets tes variables globales: il faut les mettre dans le .cpp et les définir avec un extern: regardes avec ton moteur de recherche favori

    Mais effectivement, faire une/ des classe(s) pour éviter les variables globales c'est mieux au moins pour la maintenance

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    Le but était justement d'éviter les classes pour faire une seule et même connexion à ma BDE ! Mais je regarde du côté de cet 'extern' !
    EDIT : ça fonctionne ! merci beaucoup !
    donc en résumé j'ai créé un header avec des directives de préprocesseur (include guard), les déclarations de mes fonctions et les déclarations externes de mes variables globales !
    EDIT #2 : je viens de remarquer que ça fonctionne également sans les déclarations externes (donc seulement en les déclarant dans le .cpp)
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/11/2005, 11h07
  2. [Inclusion des fichiers] hierarchie
    Par Casp dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/07/2004, 12h43
  3. XML Schema et inclusions de fichiers XML
    Par monk31 dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 08/10/2003, 14h17
  4. Inclusion de fichier .h
    Par Tony49 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/11/2002, 11h10
  5. Inclusion de fichiers en IDL
    Par babou dans le forum CORBA
    Réponses: 10
    Dernier message: 30/07/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo