Auteur Sujet: Programmation : Le GOTO c'est le maaaaaaal  (Lu 51131 fois)

0 Membres et 1 Invité sur ce sujet

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #96 le: 07 mars 2015 à 12:09:26 »
Kernighan, c'est toi ?
Ou Ritchie ?

corrector

  • Invité
Lalala, je suis un petit poney lalala
« Réponse #97 le: 07 mars 2015 à 12:13:15 »
Mince, j'avais survolé ton code sans faire attention :

#include <stdio.h>

int main(){
        char toto[]= "azertyuiop";
        printf("toto[5]: %c\n", toto[5]);

        char *tata = toto + 4;
        printf("tata[1] : %c\n", tata[1]);

        printf("toto = %i, tata = %i\n", toto, tata);
tata et toto ne sont pas des entiers, tu ne peux pas utiliser %i.

Tu es sûr de comprendre le C?

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #98 le: 07 mars 2015 à 12:13:54 »
Kernighan, c'est toi ?
Ou Ritchie ?
Non.

Mais j'ai un tout petit peu contribué à la normalisation.

jack

  • Professionnel des télécoms
  • *
  • Messages: 1 677
  • La Madeleine (59)
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #99 le: 07 mars 2015 à 12:15:27 »
"blablablablablabla"

L'assembleur que j'ai sous les yeux me donne raison;

Je te présente mes condoléances.

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Lalala, je suis un petit poney lalala
« Réponse #100 le: 07 mars 2015 à 12:16:51 »
Mince, j'avais survolé ton code sans faire attention :
tata et toto ne sont pas des entiers, tu ne peux pas utiliser %i.

Tu es sûr de comprendre le C?

Ben justement: il peut parfaitement utiliser %i.

Il ne devrait pas, ce n'est pas pareil :)

Ada l'interdirait mais C s'en tape. Les types c'est pour les peureux.

jack

  • Professionnel des télécoms
  • *
  • Messages: 1 677
  • La Madeleine (59)
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #101 le: 07 mars 2015 à 12:23:00 »
BadMax, tu peux m'instruire sur "pourquoi je ne devrais pas" ? Merci !

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #102 le: 07 mars 2015 à 12:24:05 »
Non on doit etre deux. Je ne compte pas les gens qui m'ont appris cela.

C'est ce que fait GCC avec ses extensions Ada.

Demande à GCC.
Raconte-moi ce que fait "GCC avec ses extensions Ada"!

corrector

  • Invité
Lalala, je suis un petit poney lalala
« Réponse #103 le: 07 mars 2015 à 12:27:50 »
Ben justement: il peut parfaitement utiliser %i.

Il ne devrait pas, ce n'est pas pareil :)

Ada l'interdirait mais C s'en tape. Les types c'est pour les peureux.
Ben tu fais ce que tu veux mon grand.

Mais le comportement de printf n'est pas défini, et le compilateur peut très bien décider d'imprimer "BadMax ne sait pas programmer" à la place de la valeur voulue.

Déjà, rien ne dit que la taille d'un pointeur soit la bonne.

Ensuite, la représentation d'un pointeur pourrait être incompatible, etc.

Bref, tu racontes absolument n'importe quoi.

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #104 le: 07 mars 2015 à 12:29:25 »
BadMax, tu peux m'instruire sur "pourquoi je ne devrais pas" ? Merci !
Parce qu'un pointeur n'est PAS un entier!

Comme je l'ai dit!

corrector

  • Invité
Lalala, je suis un petit poney lalala
« Réponse #105 le: 07 mars 2015 à 12:38:55 »
On appelle cela des tableaux.
Cela s'appelle surtout de l'arithmétique de pointeurs et de l'aliasing.

C'est un simple exemple. Un langage qui n'autorise pas cela, qui interdit donc, plus globalement, deux pointeurs de pointer sur la même chose, est un langage défaillant (java ?).
Java autorise deux "références" (= pointeurs) sur la même chose, bien sûr!

Tu es au courant que Java n'a rien de tel que l'arithmétique de pointeurs?

Sisi, char* est un entier (plus ou moins gros en fonction de ton espace mémoire).
Toute suite de bits peut être (conceptuellement) vue comme entier. Les flottants peuvent être vus comme des entiers. Simplement cette vue n'a aucun intérêt. Aucun opération arithmétique ne correspondra.

Tu ne peux pas écrire un char* dans une zone mémoire et relire un type entier dans la même zone et exiger un résultat bien défini. C'est un comportement indéfini. En C les types comptent.

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #106 le: 07 mars 2015 à 12:39:39 »
"blablablablablabla"

L'assembleur que j'ai sous les yeux me donne raison;

Je te présente mes condoléances.
Hein? Quoi? Comment?

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #107 le: 07 mars 2015 à 12:44:55 »
corrector, tu confonds le langage C avec les méthodes de programmation.

Le C est justement un langage considéré comme bas-niveau car il permet de faire n'importe quoi, surtout des trucs qui, algorithmiquement parlant, sont particulièrement cradingue. Mais parfois les contraintes machines sont ce qu'elles sont, et justement C permet d'y répondre mais, certes, salement. Le but est parfois que ça marche, vite et bien.

Si tu veux que le programmeur ne code pas comme un porc, tu l'obliges à utiliser un langage contraignant comme Ada qui est "haut-niveau" car ne permettant pas de faire n'importe quoi en manipulant des pointeurs en entiers ou l'inverse. Cela dit, Ada n'est pas utilisable directement sans API système basée sur du C car la plupart des OS actuels sont tous développés sur des bibliothèques en C.

Si tout était programmé en Ada, on n'aurait peut-etre meme pas de faille de sécurité basée sur des largesses d'appréciation du développeur.

@Jack: un pointeur est un pointeur, pas en entier. Mais C s'en tape, la preuve:
char *tata = toto + 4;Ca marche car le compilateur s'en moque bien et sait comment s'y retrouver.