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

C++ Discussion :

erreur de convertion des variables


Sujet :

C++

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 65
    Points
    65
    Par défaut erreur de convertion des variables
    Bonjour à tous. voila j'ai un problème avec mon code a chaque fois que je le compile il me marque invalid conversion from `void*' to `SQLCHAR (*)[15]' a la ligne d'allocation de mémoire

    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
    #include <windows.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
         SQLHENV env;
     
        if ( !SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env)) )
            cout<<"La fonction SQLAllocHandle a echoue (SQL_HANDLE_ENV)."<<endl;
        else
        {
            if ( !SQL_SUCCEEDED(SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0)) )
                cout<<"La fonction SQLSetEnvAttr a echoue."<<endl;
            else
            {
                SQLHDBC con;
     
                if ( !SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC, env, &con)) )
                   cout<<"La fonction SQLAllocHandle a echoue (SQL_HANDLE_DBC)."<<endl;
                else
                {
                    SQLCHAR dsn[] = "musique_andalouse";
     
                    if ( !SQL_SUCCEEDED(SQLConnect(con, dsn, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS)) )
                        cout<<"La fonction SQLConnect a echoue."<<endl;
                    else
                    {
                        SQLHSTMT stmt;
     
                        if ( !SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, con, &stmt)) )
                            cout<<"La fonction SQLAllocHandle a echoue (SQL_HANDLE_STMT)."<<endl;
                        else
                        {
                            SQLCHAR req[] = "SELECT * FROM NOUBAT;";
                            if ( !SQL_SUCCEEDED(SQLExecDirect(stmt, req, SQL_NTS)) )
                                fprintf(stderr, "La fonction SQLExecDirect a echoue.\n");
                            else
                            {
                                SQLSMALLINT nbcolumns;
                                SQLCHAR (*columns) [15];
     
                                SQLNumResultCols(stmt, &nbcolumns);
     
                                columns = malloc (nbcolumns * sizeof(columns[0]));
                                if (columns != NULL)
                                {
                                    printf("TABLE : PAYS_TBL\n\n");
     
                                    while (SQL_SUCCEEDED(SQLFetch(stmt)))
                                    {
                                        SQLSMALLINT i;
     
                                        for(i = 0; i < nbcolumns; i++)
                                        {
                                            SQLGetData(stmt, i + 1, SQL_C_CHAR, columns[i], sizeof(columns[i]), NULL);
                                            cout<<columns[i];
                                        }
     
                                        cout<<endl;;
                                    }
     
                                    free(columns);
                                }
                            }
     
                            SQLFreeHandle(SQL_HANDLE_STMT, stmt);
                        }
     
                        SQLDisconnect(con);
                    }
     
                    SQLFreeHandle(SQL_HANDLE_DBC, con);
                }
            }
     
            SQLFreeHandle(SQL_HANDLE_ENV, env);
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    j'ai vraiment besoin d'aide. Aussi j'ai essayé de le remplacer malloc par new en faisant columns = new (nbcolumns * sizeof(columns[0])); mais la encore il me marque cette erreur expected identifier before ';' token

  2. #2
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    salut,

    Le message d'erreur est clair pourtant !!
    Même le malloc n'est pas propre, mais vu que c'est du C, ca passe
    Par contre le new, vu que c'est du C++, le compilo apprécie moins les cast implicites.

    j'ai l'impression que tu as un tableau de pointeur, donc tu dois faire 15 allocations, et non pas une ! (de columns[0] à columns[14]).

    essaie de trouvrer des tuto sur les tableaux de pointeurs.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par romson2 Voir le message
    Aussi j'ai essayé de le remplacer malloc par new en faisant columns = new (nbcolumns * sizeof(columns[0])); mais la encore il me marque cette erreur expected identifier before ';' token
    La syntaxe du new est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T * monPointeur = new T;//un pointeur  ver une variable de type T
    T * monTableau = new T[15];//un tableau de variable de type T
    c'est donc normale qu'il ne comprenne pas.

  4. #4
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 65
    Points
    65
    Par défaut
    et pourtant ce code je l'ai pris d'un tuto voila même le site http://melem.developpez.com/tutoriels/divers/odbc/

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par romson2 Voir le message
    et pourtant ce code je l'ai pris d'un tuto voila même le site http://melem.developpez.com/tutoriels/divers/odbc/
    Oui ce code a l'aire un peu foireux.
    Comme c'est du C faut peut être le remanier un peu

    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
     
    SQLSMALLINT nbcolumns;
    std::vector<SQLCHAR*> columns;
     
    SQLNumResultCols(stmt, &nbcolumns);
     
    printf("TABLE : PAYS_TBL\n\n");
     
    while (SQL_SUCCEEDED(SQLFetch(stmt)))
    {
        SQLSMALLINT i;
     
        for(i = 0; i < nbcolumns; i++)
        {
    	columns[i] = new SQLCHAR[15];
    	SQLGetData(stmt, i + 1, SQL_C_CHAR, columns[i], sizeof(columns[i]), NULL);
    	cout<<columns[i];
        }
     
        /*
    	traitement éventuel des résultats
         */
     
        for (int j = 0 ; j < columns.size() ; j++)//destruction des chaines crées
    	delete [] columns[j];
     
        cout<<endl;
    }

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 65
    Points
    65
    Par défaut
    Merci pour le code il se compile maintenant sans le delete, mais le delete il le déclare comme une erreur parce que tu as fait j < columns.size() hors columns est un pointeur

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par romson2 Voir le message
    Merci pour le code il se compile maintenant sans le delete, mais le delete il le déclare comme une erreur parce que tu as fait j < columns.size() hors columns est un pointeur
    Et bien il te suffit de corriger cette petite erreur en remplaçant columns.size() par columns->size().
    Find me on github

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par romson2 Voir le message
    Merci pour le code il se compile maintenant sans le delete, mais le delete il le déclare comme une erreur parce que tu as fait j < columns.size() hors columns est un pointeur
    heu columns n'est pas un pointeur c'est un vecteur de pointeur donc columns.size() ne devrait pas posé de problème

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par atttchoum Voir le message
    heu columns n'est pas un pointeur c'est un vecteur de pointeur donc columns.size() ne devrait pas posé de problème
    Exact au temps pour moi.
    Find me on github

  10. #10
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 65
    Points
    65
    Par défaut
    ok merci pour le code.

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

Discussions similaires

  1. Erreur avec des variables
    Par RobotMonk dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/01/2015, 12h48
  2. Erreur de validation à cause de liens contenant des variables
    Par Darel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 13/02/2009, 19h57
  3. convertion des variables
    Par scarface34 dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 25/05/2007, 10h17
  4. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 12h09
  5. Réponses: 4
    Dernier message: 18/07/2002, 14h32

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