Code "C" fonctionne dans l'IDE mais pas l'executable.

Hello,


 


Je m'étais présenté il y a quelques mois, je voulais me lancer la programmation sur mon MAC en utilisant XCODE.


 


Donc indiqué j'avais opté pour le TUTO "Programmer en C" du "SITE DU ZERO" que je trouve très bien. (j'ai pris le livre)


 


Seulement voila, j'ai passé le TP "PENDU" (pour ceux qui connaissent) mon code marche bien dans la console d'XCODE. mais lorsque je veux executer le "product" l'executable quoi, dans un simple TERMINAL, ca ne marche plus.  


 


Les gars du site du zero m'ont aidé a determiner ce qui ne va pas : mon programme ouvre et lit un ficher TXT externe. lorsque je tente d'utiliser mon Executable, ce fichier ne semble pas être trouvé. (je rappel ca fonctionne bien dans l'IDE..)


 


Malgrès leur bonne volonté, ils n'ont pu m'expliquer pourquoi car ils n'utilisent pas XCODE..


C'est pourquoi je tente ma chance sur votre site ;o)


 


Je pense ne pas être le seul gars a qui ca arrive, que son code dans XCODE arrive a trouver, ouvrir, lire un TXT mais plus l'executable. Est-ce une subtilité connue ?


Si besoin je posterai mon code.


 


@+


Réponses

  • CéroceCéroce Membre, Modérateur
    mai 2013 modifié #2

    C'est probablement un problème de chemin courant.


    Si tu ouvres un fichier ainsi:



    FILE *file = fopen("toto.txt", "r");

    où se situe réellement le fichier ? En ligne de commande, c'est dans le répertoire courant (celui où tu lances l'exécutable), mais si tu lances par Xcode, le répertoire courant change, et il ne trouve plus toto.txt.


     


    Maintenant... je ne connais pas de solution, hormis fournir le chemin complet du fichier.


  • KeihilinKeihilin Membre
    mai 2013 modifié #3

    Hello, alors oui c'est bien ma ligne d'ouverture du fichier.


    Mais en fait, mon ouverture de fichier se fait dans une fonction. et le nom du fichier "dico.txt" est le parametre envoyé a la fonction.


     


    On vient de me demander d'executer mon programme non pas en double cliquant dessus, mais en ouvrant un Terminal, aller dans le repertoire contenant l'exe et le dico.txt puis lancer le programme en tapant "./Pendu"


    de cette facon ca fonctionne !


     


    j'en déduis que je dois ajouter le "./" quelque part dans mon code


     


    Si je modifie le parametre que j'envois a ma fonction "dico.txt" par "./dico.txt" je peux compiler et ca marche dans XCODE mais toujours pas en double cliquant sur l'exe.


     


    Si je laisse le parametre tel quel, mais ajoute le "./" devant ma variable dans la fonction " fichier = fopen(./maVariable, "r");"


     


     


    La je ne peux plus compiler..


     


     


    [EDIT] : J'ai remplacé le ./ par le chemin complet (absolu?) soit (/Users/#####/Library/Developers/.../dico.txt)


    c'est le parametre que j'envoi a ma fonction, et ca maintenant ca marche.


     


    J'aimerai bien pouvoir utiliser un chemin relatif (soit le repertoire courant..)


     


  • LarmeLarme Membre

    ./ devrait dire dans le répertoire courant...


    Maintenant, si ton exécutable et ton fichier .txt sont à  des endroits différents...


  • Hello Larme,


     


    Les 2 fichiers sont bien dans le même répertoire.


    j'ai testé avec "./dico.txt" en tant que parametre pour ma fonction, ca marche dans XCODE mais pas en double cliquant sur l'executable.

  • AliGatorAliGator Membre, Modérateur

    En double-cliquant sur l'exécutable ?


    Ton exécutable créé par Xcode, c'est un ".app" (donc un bundle) ou c'est un binaire en ligne de commande qui se lance donc via le Terminal ?


  • KeihilinKeihilin Membre
    mai 2013 modifié #7

    Hello AliGator,


    C'est un programme en ligne de commande, qui lance le Terminal.


     


    [EDITION] En faite le PB était que mon Dossier de Travail n'était PAS le dossier dans lequel se trouve mon exe et mon fichier.txt...


     


    Mon Dossier de travail est : /Users/monProfil


     


    En plaçant mon fichier TXT a la racine de mon profil, mon appli fonctionne en double cliquant dessus.


     


    Maintenant, je chercher a trouver comment modifier mon XCODE pour utiliser le Dossier courant (ou se trouve mon exe) comme Dossier de Travail... (dites moi pas que c'est pas possible..) 


  • Il serait peut être plus simple de mettre ton fichier dans le répertoire où Xcode a mis ton application (pas un exe stp) et qui se trouve dans ton dossier Bibliothéque de l'utilisateur ~/Library/Developer/Xcode/DerivedData/TonApp-awjwtiqkbxyyzpakhhwkfqraaqiw/Build/Products/Debug pour le debugg et /Release pour le normal.


    Sinon il te faut modifier les préférences Xcode pour tous tes projets dans l'onglet Locations ..

  • Hello Laudema, Lorsque je dis EXE c'est pour EXECUTABLE et non pas .exe ;o)


    Sinon, mon fichier .txt était bien dans le répertoire que tu cites.


     


    Apparement, mon XCODE a décidé que mon repertoire de travail était /Users/MonProfil


    donc, a moins de le placer a cet endroit (mon .txt) mon application ne marche pas.


     


    J'aimerai bien savoir comment dans XCODE on peut configurer de facon a renseigner (dynamiquement) le repertoire de travail en fonction du répertoire courant de l'application.




  • J'aimerai bien savoir comment dans XCODE on peut configurer de facon a renseigner (dynamiquement) le repertoire de travail en fonction du répertoire courant de l'application.




     


    La fonction chdir de l'API standard C permet de changer le répertoire courant.

  • Et la commande cd du Terminal a le même effet que chdir dans le code.


  • KeihilinKeihilin Membre
    mai 2013 modifié #12

    Hello Jpimbert,


     


    Donc, si je comprend bien, indiquer mon "Working Directory" doit se faire dans mon code.


    Et non pas en modifiant un paramètre de XCODE. (j'étais en train de regarder les SCHEMES..) si chdir() me permettra de définir mon working directory, je dois lui entrer le chemin en question (en absolu) je regarde ca sous Google, ca doit commencer par GET je suppose ;o) Merci ;o)


     


     


    [EDIT] Bon, je ne pensai pas rencontrer de PB a ce niveau.. mais je ne trouve que la commande GETCWD qui ne me donne pas le répertoire courant, mais le Working Directory.. je sens que je tourne en rond la..


  • laudemalaudema Membre
    mai 2013 modifié #13

    Et où est ton problème ? Quelle est la différence entre répertoire courant et répertoire de travail ?


     
    char somePath[PATH_MAX] ;
    getcwd(somePath, PATH_MAX);
    //=>/Users/me/Library/Developer/Xcode/DerivedData/MYAPP-awjwtiqkbxyyzpakhhwkfqraaqiw/Build/Products/Debug

    Pour changer le répertoire de travail dans Xcode ça ne se fait pas au niveau de l'application mais dans les préférences Xcode, onglet Locations. Mais du coup c'est pour toutes les applications on dirait.


  • Hello,


     


    En faite, par répertoire courant, je veux dire répertoire d'installation.


    Le répertoire ou se trouve mes fichiers (exécutable et dictionnaire de mot (dico.txt))


     


    XCODE en compilant, utilise bien ce répertoire comme "Working Directory" c'est pour ça que ça marche.


    Mais si je double click sur l'exécutable (depuis Finder) le Terminal qui s'ouvre aura pour valeur "Working Directory" non pas le dossier d'installation mais un chemin par défaut qui est (du moins sur ma machine) "/Users/maSession"


     


    J'ai un autre topic en parallèle sur le même sujet dans SITE DU ZERO, on vient de m'indiquer que je pouvais utiliser "argv[0]" pour récupérer le bon chemin, je tente de trouver comment exploiter ce const char ;o)

  • AliGatorAliGator Membre, Modérateur

    Bah oui c'est normal.


     


    Quand tu ouvres l'application Terminal et donc ouvre une nouvelle fenêtre du Terminal, par défaut il se positionne toujours dans ton répertoire ~ (ta home) par défaut, donc "/Users/taSession".


    (Tu dois pouvoir modifier ça je pense dans les préférences de l'application Terminal.app, y'a des chances, j'ai pas vérifié)


     


    Quand tu doubles-cliques sur ton exécutable directement depuis le Finder, comme ton exécutable est un binaire en ligne de commande, il va ouvrir l'application Terminal et directement lancer ton appli dans la foulée (comme si tu avais tapé son chemin d'accès dans le shell terminal et validé).


     


    Mais tu devrais plutôt faire autrement, à  savoir lancer toi-même l'application Terminal.app et dans une fenêtre du Terminal, écrire les commandes qu'il faut pour faire ce que tu veux. En l'occurrence changer de working directory courant (avec la commande "cd chemin/vers/le/nouveau/dossier/courant/où/tu/veux/te/placer"), puis une fois que tu es dans le dossier qui t'intéresse, lancer ton exécutable (en tapant son chemin d'accès et validant).


     


    Ou alors prévoir dans ton programe de passer en argument le chemin du fichier dico.txt que tu veux ouvrir (et récupérer cet argument dans ton code avec argv[1] donc) plutôt que d'aller forcément le chercher dans le working directory...


     


    Ou alors prévoir dans ton programme d'utiliser le chemin d'accès de ton exécutable (en utilisant la fonction dirname sur la chaà®ne argv[0] typiquement) pour construire le chemin d'accès à  ton fichier dico.txt en conséquence...


     


     


    En tout cas c'est normal que quand tu double-cliques sur ton exécutable sur le Finder, et que du coup il ouvre le Terminal.app pour toi (ouvert par défaut sur ton dossier Home) et lance directement ton exécutable dans la foulée sans changer le working directory, que le CWD soit toujours la Home dans ce cas. Il ne faut surtout pas se baser sur le working directory pour chercher un fichier de conf ou quoi qui est sensé se trouver à  un chemin relatif à  ton exécutable, ça n'a pas de sens, car tu peux avoir lancé ton exécutable avec son chemin d'accès complet (ce que fait le Finder qd tu double-cliques dessus) en étant dans un working directory tout autre qui n'a aucun rapport avec l'emplacement de ton exécutable...


  • KeihilinKeihilin Membre
    mai 2013 modifié #16


     


    Ou alors prévoir dans ton programme d'utiliser le chemin d'accès de ton exécutable (en utilisant la fonction dirname sur la chaà®ne argv[0] typiquement) pour construire le chemin d'accès à  ton fichier dico.txt en conséquence...


     




     


    Hello AliGator,


    Merci pour ton retour ! Effectivement depuis mon dernier message, j'ai fini par trouver.


    en utilisant argv[0] j'obtiens le chemin absolut comprenant le nom de l'executable, je me debrouille pour supprimer ce nom d'executable et donc recuperer le chemin tout court. Ne me restait plus qu'a concatener avec le nom du fichier (dico.txt) et voila. ça marche maintenant ;o))

  • Attention,


    Si tu lances ton exécutable depuis Xcode tu récupères ton chemin complet mais en usage "réel" si, comme souvent, l'utilisateur se met dans le répertoire de l'application puis la lance par ./MYAPP tu auras ./MYAPP comme premier élément du tableau argv[]. par contre, puisqu'il s'est mis dans celui ci comme répertoire de travail getcwd() te retournera le bon (répertoire de travail == répertoire application). S'il est dans le répertoire de l'utilisateur et ton fichier dans ~/local/bin/ il tape local/bin/MYAPP et c'est ce que tu retrouves dans argv[0]=> local/bin/MYAPP sans le reste qui remonte à  la racine mais getcwd() te retournera /Users/user là  d'où il lance la commande et c'est la combinaison des deux qui te donnera le chemin complet.


Connectez-vous ou Inscrivez-vous pour répondre.