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

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 763
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 763
    Points : 12 463
    Points
    12 463
    Par défaut Compréhension d'un code en C pour portage en Pascal
    Bonsoir,

    j'étudie l'outil Bass et dans le projet devlist je coince sur ces 7 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #if 0//def _WIN32
    	const char *path = di->driver + strlen(di->driver) + 1;
    	if (path[0])
    		printf("%s\n\tdriver: %s\n\tpath: %s\n\ttype: ", di->name, di->driver, path);
    	else
    #endif
    	printf("%s\n\tdriver: %s\n\ttype: ", di->name, di->driver);
    Je ne comprends pas la première ligne, et je ne vois pas comment écrire la 3e (if (path[0])) en Pascal, alors si quelqu'un pouvait déjà me les traduire en français pour que je pige ce qu'elles font, à partir de là je devrais y arriver.

    Grand merci par avance,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 229
    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 : 3 229
    Points : 7 262
    Points
    7 262
    Par défaut
    Pour la première ligne, c'est une instruction préprocesseur #if (à l'instar de #include ou #pragma)
    Dans ton cas #if 0 -> "si faux" (*), donc le compilateur va supprimer toutes les lignes entre #if et #endif.

    Regarde le commentaire _WIN32 c'est une valeur prédéfinie par le compilateur pour dire "si je compile sous Windows".
    Donc sous Windows, le compilateur prendra en compte les lignes entre #if et #endif.
    Sous une autre plateforme, ces lignes seront supprimées/ ignorées.

    Édit : Les valeurs qu'on utilisent avec #if sont définies avec #define : #define _WIN32 1.
    Et si on veut les désactiver, il faire faire #define _WIN32 0 (*) avant le #if.
    Et avec gcc, la bascule D ("switch" en anglais) permet de passer les valeurs (<- lien officiel gcc.gnu.org)


    Pour le path[0], c'est un test simplifié
    (*) En C, la valeur 0 est faux. Toutes les autres valeurs sont vrai.
    De plus, if (val) veut dire if (val != 0) et if (!val) veut dire if (val == 0).
    Et enfin, une chaîne de caractère C est terminée par la fameuse sentinelle '\0' (<- @Sve@r le VDD (voisin du dessous) m'a repris)

    Donc le test veut dire "si ta chaîne de caractère path n'est pas vide" (ne commence pas par la sentinelle '\0')


    Pour conclure , uniquement pour Windows (mais le test a été désactivé), tu vas avoir une 3ième chaîne de caractère, path, que tu vas afficher seulement si elle n'est pas vide.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 825
    Points : 21 397
    Points
    21 397
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par foetus Voir le message
    Et enfin, une chaîne de caractère C est terminée par la fameuse sentinelle '/0'.
    Bravo (ok, 5h36 c'est excusable)
    En C, une string est terminée par la fameuse sentinelle '\0'.

    @Jipété Sinon je pense que le premier #if 0//def _WIN32 est en fait un #ifdef _WIN32 qui a été désactivé. Et l'explication de foetus est correcte. Il s'agit d'une compilation conditionnelle et (si ce test n'est pas désactivé) seuls les environnements où "_WIN32" est défini compilent ces lignes. Et ici (donc avec le test désactivé et mis à faux) ces lignes ne sont jamais vues par le compilateur.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 763
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 763
    Points : 12 463
    Points
    12 463
    Par défaut
    OK, merci les copains, c'est un peu ce que j'avais déduit avant de vous questionner, mais je préférais avoir une certitude, c'est une telle pagaille pour faire afficher les données…

    Juste un mot :
    Citation Envoyé par foetus Voir le message
    (*) En C, la valeur 0 est faux. Toutes les autres valeurs sont vrai.
    Comment voulez-vous qu'on s'y retrouve quand on sait que l'immense majorité des programmes sous Linux ont un code de sortie de 0 quand tout va bien, et que toutes les autres valeurs indiquent une erreur…

    Encore merci, et à plus, bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 229
    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 : 3 229
    Points : 7 262
    Points
    7 262
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Comment voulez-vous qu'on s'y retrouve quand on sait que l'immense majorité des programmes sous Linux ont un code de sortie de 0 quand tout va bien, et que toutes les autres valeurs indiquent une erreur…
    Vu comme cela effectivement

    Mais cette valeur retour est dépendante du système d'exploitation et sa valeur n'a rien à voir avec le C - même s'il y a consensus pour que 0 veut dire aucune erreur. Parce qu'en cas d'erreurs, je pense qu'il faut distinguer les différents problèmes avec des codes erreur (en C, c'est/ c'était une technique de retourner une valeur négative qui correspond au code erreur)
    Sinon tu as 2 macros pour uniformiser un peu tout cela : EXIT_SUCCESS et EXIT_FAILURE (liens cplusplus en anglais)

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 113
    Points : 40 515
    Points
    40 515
    Par défaut
    Citation Envoyé par foetus Voir le message
    Mais cette valeur retour est dépendante du système d'exploitation et sa valeur n'a rien à voir avec le C - même s'il y a consensus pour que 0 veut dire aucune erreur. Parce qu'en cas d'erreurs, je pense qu'il faut distinguer les différents problèmes avec des codes erreur (en C, c'est/ c'était une technique de retourner une valeur négative qui correspond au code erreur)
    Sinon tu as 2 macros pour uniformiser un peu tout cela : EXIT_SUCCESS et EXIT_FAILURE (liens cplusplus en anglais)
    Il me semble que du point de vue du programme C, les valeurs 0 et EXIT_SUCCESS signifient toutes les deux que le programme a réussi. Si l'OS suit une autre convention, c'est au runtime de traduire.

    Aussi, au sujet de la branche _WIN32 désactivée: Ce code semble supposer que sous Win32, la chaîne driver est en fait composée de deux chaînes de caractères à la suite, la seconde pouvant être vide (mais devant néanmoins être présente).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 825
    Points : 21 397
    Points
    21 397
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Comment voulez-vous qu'on s'y retrouve quand on sait que l'immense majorité des programmes sous Linux ont un code de sortie de 0 quand tout va bien, et que toutes les autres valeurs indiquent une erreur…
    Déjà ce n'est pas une convention des programme mais directement du shell. Ainsi, en shell, un test if programme; then echo "ok"; else echo "erreur"; fi donnera "ok" si le programme quitte avec le code "0" et "erreur" pour n'importe quelle autre valeur (*)
    Mais surtout tu mélanges "conventions" et "logique booléenne". Les conventions, ce sont des règles établies permettant une bonne compréhension entre divers acteurs. La logique booléenne ce sont des règles mathématiques. Les conventions peuvent être changées, mais pas les règles mathématiques. Et les langages de programmations obéissent, dans leurs concepts internes, aux lois booléennes. Donc dans les langages de programmation, une alternative style if (expression) then X else Y donnera "X" si l'expression est vaie au sens booléen du terme et "Y" sinon.

    Donc les conventions de l'OS sont qu'un programme qui quitte avec le code d'état "0" signifient "pas d'erreur" tandis que les lois booléennes disent que 0 c'est faux et 1 c'est vrai. Le C a juste un peu élargi ces lois en disant "0 = faux et n'importe quelle valeur différente de 0 = vrai". (**)

    Et puis... comment dire... ce n'est pas pire que W10 qui, quand on veut désactiver un truc, propose une boite de dialogue où on doit "activer" la désactivation !!!
    Nom : w10.png
Affichages : 35
Taille : 33,4 Ko

    (*) a noter que le programme Unix "expr" (qui sert à évaluer une expression et à afficher le résultat de cette évaluation à l'écran) sort avec le statut "0" si l'expression évaluée vaut autre chose que 0 ; sort avec 1 si l'expression vaut 0 et sort avec 2 en cas d'échec dans l'évaluation. De quoi foutre en l'air tout script qui partirait sur if expr; then ...; else ...; fi...

    (**) a noter que la fonction strcmp() destinée à comparer 2 chaines renvoie 0 si les chaines sont égales. Mais on peut aussi le voir comme une fonction donnant la première différence entre 2 chaines et renvoyant 0 si la différence est fausse...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

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

Discussions similaires

  1. [Python 3.X] Besoin d'un petit coup de main pour du Algo->Python
    Par Pierre_Euh dans le forum Général Python
    Réponses: 9
    Dernier message: 31/01/2019, 10h15
  2. [Lazarus] Besoin d'un petit coup de main pour lister les CharSets d'une font
    Par Jipété dans le forum Lazarus
    Réponses: 16
    Dernier message: 22/10/2017, 14h51
  3. Un petit coup de main pour traduire des coordonnées géographiques ?
    Par elonguemare dans le forum IGN API Géoportail
    Réponses: 9
    Dernier message: 22/09/2014, 14h57
  4. Réponses: 1
    Dernier message: 12/03/2014, 23h58
  5. Réponses: 4
    Dernier message: 06/09/2013, 18h22

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