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
    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
    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
    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
    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
    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
    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
    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 !!!


    (*) 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

###raw>template_hook.ano_emploi###