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

0 Membres et 1 Invité sur ce sujet

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #144 le: 11 mars 2015 à 05:22:16 »
Demo
void main(void)
{
        char *toto="hello";
        int *popo="hello";

        char *tata=toto+4;
        int *pipi=popo+1;

        printf("%s %s", tata, (char *)pipi);

}

Les deux affichent "o".
Tu as essayé?

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #145 le: 11 mars 2015 à 05:25:15 »
    if (fd!=0)
          close(fd);
Attention 0 est une valeur valide et tout à fait normale pour un fdnum.

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #146 le: 11 mars 2015 à 05:28:00 »
Si goto est le mal, alors qu'est-ce qu'on doit dire de setjmp() et longjmp() ?
On doit dire :
- qu'il n'y a pas de raison solide et rationnelle d'éviter de façon générale le goto à chaque fois qu'il semble nécessaire pour éviter d'autres choses qu'on aime éviter (redondance du code, ajout de variable, complexification des flux de données...)
- qu'il faut de façon générale absolument éviter longjmp() pour des raisons évidentes et non idéologiques, même s'il est concevable que certains cas fassent exception

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #147 le: 11 mars 2015 à 05:51:51 »
Pour la postérité: je viens de supprimer un message erroné de ma part, ayant lu de travers un des exemples postés. Parfois mieux vaut s'abstenir.  :P
Si tout le monde faisait comme toi, il y aurait beaucoup moins de messages dans ce topic.

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #148 le: 11 mars 2015 à 05:53:50 »
    idx = 0;
    while((idx <size) && (monTableau[idx] >= 0)) idx++;
    // si idx == size on a pas trouvé de negatif
Moche. Relativement très moche.

Il faut donc re-tester la condition de sortie après, et donc la condition de sortie est écrite plusieurs fois. Avec le risque de bug en cas de modification du code...

Mais à part ça, c'est le goto qui rend le code moins maintenable, il suffit de le répéter mille fois pour que ça devienne vrai.

corrector

  • Invité
Lalala, je suis un petit poney lalala
« Réponse #149 le: 11 mars 2015 à 05:58:36 »
IO : Input/Output : entrée/sortie : lecture/écriture sur un périphérique; Fait par le noyau (sauf si ce dernier exporte ledit périphérique en userspace, ce qui est rare, si je ne m'abuse, mais faisable, si je ne m'abuse guère plus).
Go to bed corrector!
Vraiment ?
Comment ton kernel va savoir qu'il doit copier cette zone mémoire pour l'envoyer sur le dev ?
Ben tu lui communique l'information d'une façon quelconque. Genre tu l'écris à une adresse où il va chercher l'information. Tu sais, comme une convention d'appel. Mais sans appel. Juste tu postes une requête dans une sorte de socket.

Tu manques vraiment d'imagination.

corrector

  • Invité
Lalala, je suis un petit poney lalala
« Réponse #150 le: 11 mars 2015 à 06:00:59 »
#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);

        printf("toto[5] = %i, tata[1] = %i\n", &toto[5], &tata[1]);
        return 0;
}
Sur les architectures où un pointeur fait la taille de deux int, tu penses que ça va donner quoi?

jack

  • Professionnel des télécoms
  • *
  • Messages: 1 674
  • La Madeleine (59)
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #151 le: 11 mars 2015 à 16:10:00 »
Citation de: corrector
Une solution linux-only n'est pas une solution.
C'est intrinséquement une solution (mais pas pour tout le monde).

Citation de: corrector
N'importe quoi!
Dixit le type qui me dit, pour manipuler la mémoire d'un process, d'utiliser /proc/self/mem ?

Citation de: corrector
Dans ta splendide incompétence, je pense que tu essaies de dire que ça marche dans un cas particulier donc que ton code est correct donc que tu as raison.
Non, ce que j'essaie de te dire, c'est que ta négation ne devrait pas être aussi catégorique qu'elle ne l'est.

Citation de: corrector
Et ça n'a rien à voir avec le fait que le langage dit qu'un accès hors d'un tableau a un comportement indéfini et n'oblige pas le compilateur à au moins proposer un mode de test avec vérification de ces accès?
Ben tu vois, je pense que tu as raison: dans ce cas précis, le fait que cela fonctionne n'est qu'un hasard;
Il y a débordement, mais ce dernier est bénin dans le premier cas, fatal dans le deuxième;

Citation de: corrector
Attention 0 est une valeur valide et tout à fait normale pour un fdnum.
Mea culpa

Citation de: corrector
On doit dire :
- qu'il n'y a pas de raison solide et rationnelle d'éviter de façon générale le goto à chaque fois qu'il semble nécessaire pour éviter d'autres choses qu'on aime éviter (redondance du code, ajout de variable, complexification des flux de données...)
Je partage ce point de vue

Citation de: corrector
Ben tu lui communique l'information d'une façon quelconque. Genre tu l'écris à une adresse où il va chercher l'information. Tu sais, comme une convention d'appel. Mais sans appel. Juste tu postes une requête dans une sorte de socket.

Tu manques vraiment d'imagination.
Mon processus a 1 sec de temps processeur.
À la 0.5sec, il a besoin de faire un IO.
Il écrit les données à un quelconque endroit en mémoire.
Il a besoin du résultat pour la suite de son exécution: que fait-il pendant les 0.5sec restantes ?

J'me demande s'il existe un moyen pour un processus de dire "bof, noyau, tu m'as donné du temps CPU, mais en fait j'nen veux pas"


PS: 2 pages, tu abuses.

Au fait, tu ne m'as pas dit comment je devrais coder mon machin, tu peux y passer 2min à me prodiguer ton savoir ? Merci !

corrector

  • Invité
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #152 le: 11 mars 2015 à 21:18:21 »
Dixit le type qui me dit, pour manipuler la mémoire d'un process, d'utiliser /proc/self/mem ?
Ah bon, je dis ça?

Mon processus a 1 sec de temps processeur.
À la 0.5sec, il a besoin de faire un IO.
Il écrit les données à un quelconque endroit en mémoire.
Il a besoin du résultat pour la suite de son exécution: que fait-il pendant les 0.5sec restantes ?
Ben il fait un appel système, évidemment. Je ne vois pas le problème.

J'me demande s'il existe un moyen pour un processus de dire "bof, noyau, tu m'as donné du temps CPU, mais en fait j'nen veux pas"
Par exemple pthread_yield

PS: 2 pages, tu abuses.
Un thème, un message.
C'est hygiénique. Et pratique pour le modérateur s'il y a des déplacements à faire.

Au fait, tu ne m'as pas dit comment je devrais coder mon machin, tu peux y passer 2min à me prodiguer ton savoir ? Merci !
Comme tu veux, c'est une question de gout.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Programmation : Le GOTO c'est le maaaaaaal
« Réponse #153 le: 13 mars 2015 à 00:26:20 »
Pour ceux qui ne connaissent pas Dart (mon langage de travail en ce moment, après des années de C, C++ et C# c'est très "reposant" et la syntaxe est proche).

void main() {
  List<int> tableau = [1, 10, -5, 3, 4, -8, 2];
 
  int idx = tableau.takeWhile((i)=>i>0).length;
  if (idx==tableau.length) idx = -1;
 
  print("index = $idx");
}
https://dartpad.dartlang.org/4a65a1f1b1fcdf7b39e9

ou facon comme l'exemple en C#:
void main() {
  List<int> tableau = [1, 10, -5, 3, 4, -8, 2];
  int idx;
  try
  {
  idx = tableau.indexOf(tableau.firstWhere((i)=>i<0));
  }
  catch (e)
  {
    idx = -1;
  }
  print("index = $idx");
}
https://dartpad.dartlang.org/b5dcc2dd4351c0015402