Ils n'ont pas de noms, pas de numéros, ils sont exactement comme je l'ai présenté quelques posts au dessus, les ";" étant les séparateurs.Citation:
Envoyé par Trap D
Version imprimable
Ils n'ont pas de noms, pas de numéros, ils sont exactement comme je l'ai présenté quelques posts au dessus, les ";" étant les séparateurs.Citation:
Envoyé par Trap D
C'est pas beau ;)Citation:
Envoyé par ronan99999
Je préfère:
Et un switch est une bonne solution je pense...Code:
1
2
3
4
5
6
7
8 piVar = (int*) calloc(SIZE,sizeof(int)); if(!piVar ) return -1; /*traitement*/ return 0;
Si tu as un début de code à nous montrer (un bout à traiter et un bout de code implémenter sur le traitement...)
ce que je ferais (mais bon en soft il existe n solutions pour le mm pb) :
Une fonction de traitement qui prend en parametres l'indice du champ, et qui applique le formatage désiré :
Et une fonction qui détermine l'indice du champ (en supposant que taille = nb max de champ):Code:
1
2
3
4
5
6
7 <....> switch (indice) { case 1 : traitement 1 case 2 : traitement 2 .... }
La difficulté étant comment je sais que je réalise indice++ ou indice+=2...Code:
1
2
3
4
5
6 indice = 0; while (indice<taille) { /*on détermine si indice est incrémenté de 1 ou de plus (si champ =2) */ traitement(indice) }
Mais ca tu dois savoir le faire, même pour les goto.
Ta base de données est bien organisée en articles (des "lignes") comportant des champs séparés par des ";" non ?
Ben voilà une idée qu'elle est bonne, je crois que je vais partir là dessus... (mince j'ai presque honte, c'est idiot en fait... pourquoi j'ai dit "presque"?). Au temps pour moi. Je m'en vais dormir un peu ce soir, on dirait que plusieurs mois de suite à récupérer des fichiers ça me réussit pas. bon ben merci à tous pour votre participation active, et à jack69 qui a la palme de la pertinence.Citation:
Envoyé par jack69
Pour faire écho, ils peuvent (et pas doivent, attention !) être carrément cruciaux, notamment lorsque le langage ne supporte pas le concept d'exceptions !!!Citation:
Envoyé par gege2061
C'est impératif, par exemple, pour réaliser une simili-clause "Try..Finally" en C.
Après, c'est comme tout : c'est "dangereux" à utiliser parceque l'on peut arriver à peu près n'importe où, que l'on ne peut pas "transférer" de variables au passage (sauf "globales" au bloc courant), et que le source est assez illisible. Ce n'est pas plus risqué que d'utiliser malloc ou fopen sans tester le résultat, mais je déconseille formellement aux débutants de s'amuser à tripatouiller le goto sans auparavant maîtriser les structures habituelles.
Le problème réel du goto en C n'est pas le nommage des étiquettes (because la portée est réduite), mais plutôt le fait de se planter sur la position de l'étiquette elle-même... En général, une ligne trop bas ou une ligne trop haut...
:arrow: ulukahio : J'ai rarement vu un algorithme requérir impérativement des sauts inconditionnels, même à bas niveau (ASM), à l'exception notable de la gestion des erreurs. Et le source n'a jamais été significativement plus court (ni le code plus rapide) avec des goto...
Je suis plus enclin à penser que tu as un problème de conception, éventuellement au cran immédiatement supérieur de ton programme. Au vu de l'exemple que tu as fourni, ça me semble être un bête analyseur lexical plutôt simple à implémenter (parser + machine à état), j'avoue ne même pas comprendre où tu pourrais bien mettre des "goto" là-dedans... Mais tu ne nous as pas tout dit non plus, comme ce qu'il faut faire ensuite de ces champs (stockage en structure ? Texte ? Requête SQL ?)...
Toutefois, si tu n'as pas de notions de syntaxe/sémantique/traduction, alors effectivement, c'est normal que tu "patauges" un peu sur l'algo à choisir...
Oui mais le problème était qu'il n'y avait pas le même nombre de ";" à chaque ligne, vu que si les champs n'étaient pas remplis, dans la bse on ne retrouvait pas un champ vide, mais pas de champ du tout.Citation:
Envoyé par Trap D
Euh, ne t'emballe pas trop au sujet de ma pertinence. Ma solution est certainement une usine à gaz.
Mais bon, elle est surement mieux que des goto.
N'oublies pas le tag résolu si tu es satisfait....
Je crois que tu viens de mettre le doigt sur quelque chose d'important, En gros je n'en ai jamais entendu parler, et on m'a balancé des fichiers à récupérer :?Citation:
Toutefois, si tu n'as pas de notions de syntaxe/sémantique/traduction, alors effectivement, c'est normal que tu "patauges" un peu sur l'algo à choisir...
Et c'est fait pour le tag, mais jack, ta solution est effectivement plus claire que la mienne, même si c'est également une usine à gaz. ( de toutes façon, vu le nombre de champ ça v a être difficile pour un débutant de faire un truc tip top et qui marche)
Une simple remarque, tu n'as pas été très gaté par la personne qui t'a donné les fichiers à récupérer, car ne rien mettre du tout quand les champs sont vides c'est un peu dur pour un traitement de base de données :twisted:
Je ne suis pas du tout expert en la matière mais ça me parait fort.
Tu peux faire une fonction de traitement pour chaque champ et les regrouper dans un tableau et ensuite appeler la fonction correspondantes au numéro du champ, ça évite le switch :
par exemple :
Appel par TabFonc[numero_champ - 1]();Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int fn_champ1(void) { puts("champ 1"); return 1; } int fn_champ2(void) { puts("champ 2"); return 2; } typedef int (*MyFonc)(void); MyFonc TabFonc[] = {fn_champ1, fn_champ2, ......};
C'est ce que je me dis également :evil:. Quand j'ai dis à mon patron que certains champs n'étaient pas là, il voulait que j'arrête de travailler dessus.. Mais bon j'aime pas rester sur un échec alors j'ai continué comme un mulet :lol: . Mais je pense que je vais y arriver, et je pense que grâce à vous des gens pourront comprendre ce que j'ai écrit :lol: .Citation:
Envoyé par Trap D
Mais bon c'est pas pire que la premiere base de données que j'ai du analyser, (la première fois que je voyais une base de données de ma vie haha), avec des champs cryptés, pas de séparateurs, des champs de taille variable... Une vraie horreur celle là aussi. Enfin on s'égare.
Sinon Mac LAK est ce que tu aurais par hasard un site ou je pourrai trouver des infos sur les analyseurs lexicaux? Pour l'instant sur google je trouve que des trucs pas terribles.
à tous les "Pros" du goto !! :D
1 - Je vous souhaite de ne pas avoir à debugger un programme truffé de ces petites betes :?
2 - personnellement je n'ai jamais eu , plus précisement , j'ai toujours pris soint d'éviter le moindre goto dans mes programmes .
3 - Avec l'experience , je peux vous assurer que cette façon de proceder est la meilleur qui soit.
Pour en terminer avec ça, je pense que l'organisation de ton prog doit être à peu près comme ça :
Pas besoin de goto :lol:Code:
1
2
3
4
5
6 while ((ligne = obtention_prochain_article()) != NULL) { init_traitement_article(); while ((num_champ = obtention_prochain_champ()) != -1) traitement_champ(num_champ); }
En principe, on utilise pas de goto. Il y a des exceptions, comme éventuellement le cas que tu décris, mais il fait tomber dans le raisonnement 'par saut' (if goto) qui s'oppose au raisonnement par 'action conditionelle' (if else) qui est la base de programmation structurée. C'est donc la porte ouverte à la spaghettisation du code, et franchement je ne le conseille pas. Montre un exemple de ce que tu veux faire.Citation:
Envoyé par ulukahio
Si tu dois vraiment utiliser des goto, il est une regle absolue à ne pas briser (je ne sais plus si elle est de Knuth ou de Dijskra) : un goto est toujours descendant (autrement dit, on ne fait pas de boucles avec un goto).
En tout cas, c'est toujours un sujet passioné...
http://www.acm.org/classics/oct95/
http://www.fortranlib.com/gotoless.htm
etc.
Un goto remontant ? Tu as mérité le double trempage :Citation:
Envoyé par calogerogigante
- Dans un bain de miel liquide
- Dans une bassine de fourmis rouges.
Bonne nuit.
Que penser de l'instruction continue alors?Citation:
Si tu dois vraiment utiliser des goto, il est une regle absolue à ne pas briser (je ne sais plus si elle est de Knuth ou de Dijskra) : un goto est toujours descendant (autrement dit, on ne fait pas de boucles avec un goto).
(et qu'est ce que vous entendez par spaghettisation?)
Tu veux dire 'rapidement', parce que 'élégamment', si, un flag suffit en général (genre "j'ai trouvé", ou pointeur NULL etc.). Il suffit d'ajouter le testbdans la condition de sortie de la boucle. Comme ça, au moins c'est centralisé...Citation:
Envoyé par HRS
Les courts circuits sauvages qui oublient de libérer les ressources, je préfère éviter dans le code courant.
Par contre, je veux bien utiliser des goto dans du code extrèmement critique en temps d'exécution, en prenant d'extrêmes précautions...
Citation:
Envoyé par mat.M
Voir ici, l'article est d'ailleurs très intéressant.Citation:
Dijkstra observed that the quality of a programmer's code was inversely proportional to the number of gotos the programmer used
Dernière trouvaille :
trouvée iciCitation:
in 1974.Böhm and Jacopini first proved theoretically that GOTO was unnecessary
Meuh ?Citation:
Envoyé par ronan99999
2 returns, c'est un de trop...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 { int ret = 0; int *piVar = calloc (SIZE, sizeof *piVar); if (piVar != NULL ) { /* traitement */ } else { ret = -1; } return ret; }
Ca, c'est pas possible.Citation:
Envoyé par ulukahio
Le format que tu montre semble être une des variantes du format CSV. Pour une base donnée, le nombre de ; doit être constant (nombre de champs). Si un champ est vide, les 2 ';' se trouvent collés : ';;'. Il ne doit y avoir aucune ambigüité.
Il faut donc analyser la ligne, et ne traiter que les champs non vide après les avoir éventuellement numéroté si ça peut faciliter le traitement avec un switch-case.
Connais pas.Citation:
Envoyé par ulukahio
Code spaghetti, tu ne connais pas? Jamais fait de BASIC héroique ou d'assembleur à la hache ?Citation:
(et qu'est ce que vous entendez par spaghettisation?)
Google : "Résultats 1 - 10 sur un total d'environ 646 000 pour spaghetti code. (0,17 secondes) "
Ben écoute, ça me semble possible, la base de données que j'ai je l'invente pas :wink: , et pour info elle a été développé sous MOD1 (oui c'est nul, mais c'est pas moi qui ai choisi).Citation:
Ca, c'est pas possible.
Le format que tu montre semble être une des variantes du format CSV. Pour une base donnée, le nombre de ; doit être constant (nombre de champs). Si un champ est vide, les 2 ';' se trouvent collés : ';;'. Il ne doit y avoir aucune ambigüité.
Il faut donc analyser la ligne, et ne traiter que les champs non vide après les avoir éventuellement numéroté si ça peut faciliter le traitement avec un switch-case.
et non je n'ai jamais fait de basic ni d'assembleur à la hache. Le problème quand on est débutant, c'est que bien souvent on débute.
Montre un dizaine de lignes à traiter et explique le genre de traitements que tu veux faire. Donne aussi la spécification de la base (nom et type des champs)Citation:
Envoyé par ulukahio
Sur ce point on est en accord ...Citation:
Envoyé par Emmanuel Delahaye
Par contre pas ici :DCitation:
Envoyé par Emmanuel Delahaye
Je trouve que le continue est très propre et évite une indentation inutile .. exemple :
Est bien moins propre que :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 for ( i = 0; i < 10; i++ ) { if ( toto ) { titi= .... // je met ça juste pour pas qu'un petit malin me suggère un toto & titi & tata :-) if ( titi ) { tata = ... if ( tata ) { ... le code ici ! } } } }
Question de gout, mais j'aime les programmes qui peuvent se lire sur 80 colonnes au lieu de 500 pour les grosses boucles et/ou if imbriquésCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 for ( i = 0; i < 10; i++ ) { if (!toto ) continue; titi= .... if ( !titi ) continue; tata = ... if ( !tata ) continue; ... le code ici ! } } } }
:wink:
:arrow: DavG : Sans compter que l'instruction "continue" est non seulement propre, mais extrêmement pratique pour des trucs comme la vérification d'entêtes de protocoles, ou certaines variantes de machine à état (comme les analyseurs lexicaux, vraiment au hasard)...
Je vois mal comment implémenter certains algos complexes en gardant un code simple, compact et lisible sans les instructions (cad qu'elle font partie du C lui-même, et non pas de la librairie standard) "continue", "break" ou l'opérateur ternaire...
:arrow: ulukahio : Passe en MP si tu veux un peu plus d'explications sur la syntaxe, la sémantique et la traduction, stp. Ce n'est pas à proprement parler le bon forum pour ça.
En fait tout est possible sans ces instructions et personnellement je suggèrerais de ne les utiliser que lorsqu'on est certain de bien avoir compris qu'on peut s'en passer et qu'on fait ça par choix et non par obligation :wink:Citation:
Envoyé par Mac LAK
Bien d'accord, mais le bout de texte souligné a une importance fondamentale dans mon post précédent... :mrgreen:Citation:
Envoyé par DavG
J'adore ce terme !! C'est exactement ce que je recherchais comme expression pour expliquer que ulukahio a quand même intérêt à éviter de mettre un maximum de goto...Citation:
la spaghettisation du code
Tant pis ! J'accepte le châtiment... :wink: mais je persiste dans mon "mauvais" bout de code qui ne m'a jamais créé de problème dans la petite centaine de programmes où je l'ai déjà utilisé !!Citation:
Tu as mérité le double trempage :
1. Dans un bain de miel liquide
2. Dans une bassine de fourmis rouges.
(je suis têtu parfois !!)
:wink: :wink:
Citation:
Envoyé par Emmanuel Delahaye
Ca serait super lourd, il y a une centaine de champs, beaucoup de caractères qui ne passeraient pas (les séparateurs ne sont pas des ";", j'ai mis ça pour simplifier, en fait ce sont des nombres écrits en hexa correspondant à la taille des champs, et ils ne passent pas ici), tout ce que je peux faire c'est les envoyer, par mail ou autrement. De plus, pour les noms des champs je suis encore en train de les chercher, puisqu'on ne m'a donné aucun moyen de les savoir... D'autant plus que je n'y connais rien en ce qui concerne les données elles même.
C'est un élément de réponse maintenant je veux qu'on réponde à mes autres questionseCitation:
Envoyé par Trap D
Oui mais PERSONNE n'a répondu à mes questions : à quoi servent JMP, JGE ??????
Que fait ce code là
Les personnes qui n'y comprennent rien peuvent me demanderCode:
1
2
3
4
5
6 MOV AX,200 decr_ax: DEC AX CMP AX,10 JBE decr_ax
Ce sont des instructions de saut et de saut conditionnel. Où veux-tu en venir ? Que les langages de haut niveau on un degré d'abstraction supérieur aux langages de bas niveau ? Ben oui, on s'en serait douté...Citation:
Envoyé par mat.M
C'est toute la différence entre les ordinogrammes où l'on raisonne en saut, et le langage algorithmique où l'on raisonne en exécution. Après une très mauvaise expérience de la programmation par saut en BASIC héroïque (Apple ][, BASICA, GWBASIC...) dans les années 80 qui a failli me faire abandonner mes tentatives d'auto-apprentissage de l'informatique, j'ai découvert le Pascal (Turbo Pascal 3.0 1987) et ça a été la révélation : 1er programme en TP3 : 2 goto, ensuite plus jamais de goto.
J'ai arrété de penser 'saut' pour commencer à penser 'exécution' et tout s'est eclairé. Ensuite, j'ai pu faire du BASIC à l'ancienne (imposé en stage, huh!) et de l'assembleur (8051) propre en utilisant le même raisonnement, en ayant enfin compris que les goto/jmp sont un moyen et non une fin.
Citation:
Que fait ce code là
Code:
1
2
3
4
5
6 MOV AX,200 ; AX := 200 decr_ax: ; DO DEC AX ; AX := AX - 1 CMP AX,10 JBE decr_ax ; WHILE AX != 10
ça y est c'était dur mais j'ai enfin obtenu une réponse :D
Tout à fait d'accordCitation:
en ayant enfin compris que les goto/jmp sont un moyen et non une fin.
Mais puisque JMP et compagnie en ASM ça équivaut au goto Basic donc n'importe quel exe que tu désassembles ça ressemble à un foisonnement de goto , non ???
C'est idiot non ?
Moralité des courses tu fais un beau programme structuré dans un language très évolué et bien structuré avec des modèles conceptuels de données pour avoir au bout du compte .......3 millions de lignes de goto :wink:
C'est c.. alors l'informatique
Dans beaucoup de cas, oui.Citation:
Envoyé par mat.M
Non, c'est lié aux langages machines qui sont ce qu'il sont. Une machine 'raisonne' en saut et non en action.Citation:
C'est idiot non ?
Non, c'est normal. Je pense qu'il n'existe pas pour le moment de langage machine structuré, et, à moins qu'on démontre que c'est plus efficace autrement, ce n'est pas près de changer. (Le bytecode Java, c'est structuré ?)Citation:
Moralité des courses tu fais un beau programme structuré dans un langage très évolué et bien structuré avec des modèles conceptuels de données pour avoir au bout du compte .......3 millions de lignes de goto C'est c.. alors l'informatique
C'est à la fois beaucoup plus complexe et beaucoup plus simple que ça : un "continue" C est certes un "JMP" déguisé.Citation:
Envoyé par mat.M
Un "vrai" jump ASM ne t'interdit ABSOLUMENT PAS de sauter carrément au MILIEU d'une instruction ASM (j'te racontes pas la tronche du processeur après un coup pareil, cependant !! :twisted:).
Un "continue", par contre, est garanti par le compilateur, sa grammaire et son module de traduction comme étant fiable, c'est à dire que la destination du saut est garantie correcte. Bref, le saut est "sécurisé".
Bien sûr que non, à moins que l'instruction CALL soit désormais considérée comme une CNS de structuration du langage... :twisted:Citation:
Envoyé par Emmanuel Delahaye
Je trouve plutôt que c'est à la fois génial et triste, génial car c'est un programme qui te fais ça automatiquement et triste car ta belle construction intellectuelle se réduit finalement à suite de branchements. :?Citation:
Envoyé par mat.M
rien à voir mais c'est un peu comme l'existence , de savoir que de poussière de matière on retourne à l'état de poussière de matière :wink:
Comme le chante Etienne Daho "du berceau à la tombe c'est pareil pour tout le monde " :wink:
C'est une erreur de faire un goto parceque une fois compilé les jne jnz jz jmp etc...etc...y'en a vraiment pas mal sans compter les sauts qui ne sont pas définis de façon directe (nécessitant une suite d'instructions et d'adressages) sont tous des saut conditionnels sauf jmp et call, et ceux si sont des sauts d'adresses dans la mémoire lorsque le programme est chargé "executé". J'en ai bouffé assez d'assembleur pour le savoir (sur 6809, sur 69xxx, sur x86, sur Z80 sur z81 etc...) quand j'étais en éléctronique notement.
un goto c'est mal aussi parceque c'est un saut au niveau algorythmique c'est à dire avant même toute programmation. et pas materiellement nécéssaire. troisiemement un programme utilisant des sauts à ce niveau en cas de bug il se retrouve à un endroit totalement aléatoire de la mémoire (y compris dans un autre programme aussi chargé) et continue à lire le code et l'executer comme si il etait au bon endroit et là bonjour les concéquences ! cequi n'arrive pas dans une fonction ou une procedure car ça plante la procédure ou la fonction retourne une erreur et point, on peut même la prévoir et la gérer dans une certaine meusure. quatriémement la maintenance la mise à jour ou les ajouts ou encore plus vrai le debuggage d'un programme utilisant plus de 2 ou 3 gotos devients un enfer en cas de pépin. Surtout si tu n'as qu'une log ou un core pour retrouver l'erreur du programme !
Je suis pas aussi catégorique quant à l'utilisation du GOTO en C (après lu tout le topic je me rend compte que je répète ce qui a déjà été dit :oops:).
Certes c'est moche, ça casse la structure d'un algo et derrière ça casse les optimisations du compilo etc...
Mais bon récement j'ai fais plusieurs programmes où j'ai utilisé du goto à gogo (un émulateur 68000 et Z80), et c'est grâce à cette méthode que j'ai pu obtenir les meilleurs performances (notament grâce aux "computed label" pour le 68000).
C'est vrai qu'au niveau structure c'est moche, mais dans des soucis d'optimisations (vitesse et taille de code), le GOTO peut vraiment aider, et dans mon cas réellement je ne pouvais pas m'en passer (si quelqu'un peut me prouver le contraire, je suis preneur ^^).
Selon la règle de Dijkstra (Dijkstra observed that the quality of a programmer's code was inversely proportional to the number of gotos the programmer used) je dois être un mauvais codeur :p
[Nouveau thread fusionné au debat le 06-12-2005 par netah25]
bonjour à tous,
je voudrai savoir ce que vous pensez des boucles goto ?
Est que son utilisation est signe de mauvais algorythmes?
Merci d'avances
Rod