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 :

Passage d'un code C++ Linux vers Windows


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut Passage d'un code C++ Linux vers Windows
    Bonjour à tous

    Voici mon problème. Il y a quelques temps, j'avais écrit une librairie C++ sous Linux qui compilait sans erreurs ni warnings avec g++.
    Il m'a été demandé de recompiler ce code sous Windows x86 avec Visual C++ Express 2005. Autant, j'ai de l'expérience avec g++, autant je vous avoue que coder sous Visual C++ tient pour moi de l'aventure.
    Donc, j'importe mon projet sous Visual C++ et je lance la compilation. Gasp ! Que d'erreurs et warnings !!!
    Par exemple, considérons la fonction suivante (qui plus est c'est une librairie faisant appel à JNI pour Java) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    JNIEXPORT void JNICALL Java_com_bioxpr_linkers_BeaconPCR_getLine(JNIEnv *env, jobject object, jint a, jobjectArray string){
        //Ceci avait été écrit avant et fonctionnait sous Linux
    //const char *args[a];
    //Modification pour Win mais sans doute fausse
        const char *args[] = new char[a];
        for (int i=0; i<a; i++){
            jstring jstr = (jstring)env->GetObjectArrayElement(string, i);
            args[i] = env->GetStringUTFChars(jstr, 0);
        }
        FindBeacon(a, args);
    }
    Dans cette méthode, je me choppe les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    error C2440: 'initializing' : cannot convert from 'char *' to 'const char *[]'
    There are no conversions to array types, although there are conversions to references or pointers to arrays
    Quelqu'un peut-il m'aider à trouver la voie ?
    Merci d'avance de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par GLDavid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JNIEXPORT void JNICALL Java_com_bioxpr_linkers_BeaconPCR_getLine(JNIEnv *env, jobject object, jint a, jobjectArray string){
        //Ceci avait été écrit avant et fonctionnait sous Linux
    //const char *args[a];
    Pourquoi ne pas utiliser des std::vector et des std::string?

    Les VLA (des tableaux C avec une taille determinee dynamiquement), c'est du C99. Ce n'est pas du C++ meme si g++ l'offre en extension (du moins offre quelque chose de semblable).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Modification pour Win mais sans doute fausse
        const char *args[] = new char[a];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const** args = new char*[a];
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Le message d'erreur est pourtant juste, car cette ligne est fausse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *args[] = new char[a];
    args est déclaré comme un tableau de pointeurs sur des chaîne de caractères (const char*[]) et tu veux lui affecter un tableau de caractères (char[])
    J'imagine que ce que tu souhaites faire c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *args[] = new char*[a]
    Ton erreur de portage vient du fait que g++, sans autre précision te permet de déclarer des tableaux de manière 'statique' avec un nombre d'items non précisé à la compilation.
    Ceci est licite en C99, mais pas en C++. Compile ta bibliothèque avec g++ et les options --pedantic --ansi, et tu verras que lui aussi trouvera une erreur dans le code original.
    D'ailleurs avant de porter le code, je te conseille vivement de tout recompiler sous linux avec ces options et de corriger les eventuelles erreurs

    EDIT: grillé par JMB (rapide le lundi matin ;-) )

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ok les gars.
    Merci bien.
    Avec vos nouvelles options pour g++, je vais reprendre mon code Linuxien et tâcher de recorriger mon code.
    C'est très intéressant et je vous remercie.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par VoidSeer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *args[] = new char*[a]
    Ce n'est pas du C++ valide. Il faut utiliser les pointeurs explicitement en dehors des prototypes de fonctions.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Autant pour moi, j'ai répondu un peu vite. Cependant il me semble que dans ce cas,
    c'est plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *const *args = new char *[a]

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    À mon avis tu te trompes VoidSeer.
    Boost ftw

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par VoidSeer
    Autant pour moi, j'ai répondu un peu vite. Cependant il me semble que dans ce cas,
    c'est plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *const *args = new char *[a]

    args est alors un pointeurs vers des pointeurs constant vers des char*. De sort que j'ai comme l'impression que tu ne pourras jamais initialiser la memoire que tu alloues.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Vivi, désolé. J'ai lu le pb en diagonale. C'est juste que la soluce de JM ne compile pas, et que je n'ai pas pris le temps de regarder le pouquoi.
    La soluce exacte est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const ** = new const char * [a];
    La soluce de JM ne compile pas car il est impossible d'affecter à un char** à un const char**.
    La mienne est fausse pour la raison exposée par JM.
    Enfin, tout ça pour dire que les vector et les string c'est mieux.

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par VoidSeer
    C'est juste que la soluce de JM ne compile pas, et que je n'ai pas pris le temps de regarder le pouquoi.
    Ne jamais poster sans compiler (Mais il faut avouer que le format des forums web n'aide pas , pour les newsgroups, j'ai une macro qui fait ca toute seule dans Gnus et je m'en sers pas toujours )
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Ne jamais poster sans compiler
    Je prend ça pour moi aussi, sur ce coup là...

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

Discussions similaires

  1. Problème portage code Linux vers Windows
    Par scary dans le forum Windows
    Réponses: 14
    Dernier message: 11/01/2010, 17h56
  2. Réponses: 3
    Dernier message: 07/06/2007, 10h49
  3. Sauvegarde automatique linux vers windows
    Par marrmarr dans le forum Réseau
    Réponses: 2
    Dernier message: 03/08/2006, 14h27
  4. Migration workspace de linux vers windows
    Par cdtkoenig dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 22/05/2006, 17h42
  5. De Linux vers Windows
    Par Invité4 dans le forum Linux
    Réponses: 11
    Dernier message: 04/04/2006, 20h03

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