Bizarre je n’ai jamais utilisé de goto...
Pourtant je code souvent...
Alors on pourrait s'en passer ??
A par dans de très très très rare cas...
Bizarre je n’ai jamais utilisé de goto...
Pourtant je code souvent...
Alors on pourrait s'en passer ??
A par dans de très très très rare cas...
Non, je revoie ma façon de codéeEnvoyé par ulukahio
"Coder" .. ça ne veut rien dire ... tout dépend si tu fais du temps-réel critique (genre switch en bas de la ms avec un OS très performant) ou si tu fais des applications plus standardEnvoyé par Ti-R
Dans la mesure du possible, oui, mais c'est un peu comme l'école qui refuse les "continue" dans les forAlors on pourrait s'en passer ??
A par dans de très très très rare cas...
- Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
- Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
JC Vandamme.
sauf que pour mon programme ce switch marche mais est tres lourd à programmer... Pourquoi? Parcequ'il il faudrait que je l'écrive cent fois:Envoyé par gege2061
En effet, la valeur de ligne [i] ne correspond pas au champ dans lequel se placer, mais au nombre de champs à sauter. Donc le case 3 peut m'emmener dans le champ 3 comme dans le champ 10, et il faudrait que je mette ce switch à chaque fois que je teste la valeur de ligne[i] avec un corps différent. Et du coup je vois pas ce que je gagne en lisibilité.
Une autre piste pour ton problème, à condition que tes ligne[i] renvoit toujours des entiers:
Bien sûr, tu modifies le type de retour "void" de la fonction en ce que tu aurais besoin de récupérer éventuellement...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 main(...) { traitement_champs(ligne[i]); //.... } void traitement_champs(int nombre) { switch(nombre) { case 1: // traitement champs 1 case 2: // traitement champs 2 case 3: // traitement champs 3 default: // traitement divers... } }
Enfin, c'est dur de proposer une solution sans avoir tous les tenants et les aboutissants du problème...
C'est juste une piste...
je ne demande que ça... Je ne suis absolument pas un programmeur né et je ne demande qu'à faire des progrès.Envoyé par gege2061
Je suis d'accord que chez Micro$oft ils ne sont pas complètement nuls, mais quand même, ils pourraient faire quelques efforts :Envoyé par mat.M
Tiré de MSDN
Le goto est-il vraiment utile ici ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 BOOL ProcessCmdLine(LPSTR lpCmdLine, LPDWORD pdwRegisterCF, LPDWORD pdwRegisterActiveObject, int nCmdShow) { LPCLASSFACTORY pcf = NULL; HRESULT hr; *pdwRegisterCF = 0; *pdwRegisterActiveObject = 0; // Expose class factory for application object if command line // contains the /Automation switch. if (_fstrstr(lpCmdLine, "-Automation") != NULL || _fstrstr(lpCmdLine, "/Automation") != NULL) { pcf = new CApplicationCF; if (!pcf) goto error; pcf->AddRef(); hr = CoRegisterClassObject(CLSID_Lines, pcf, CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, pdwRegisterCF); if (hr != NOERROR) goto error; pcf->Release(); } else // Show window if started as stand-alone. g_pApplication->ShowWindow(nCmdShow ); // Register Lines Application object in the running object table // (ROT). Use weak registration so that the ROT releases its reference // when all external references are released. RegisterActiveObject(g_pApplication, CLSID_Lines, ACTIVEOBJECT_WEAK, pdwRegisterActiveObject); return TRUE; error: if (pcf) pcf->Release(); return FALSE; }
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Peux-tu poster ton code de traitement de champs qu'on comprenne un peu plus ce que tu veux dire ?Envoyé par ulukahio
- Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
- Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
JC Vandamme.
En quoi cette utilisaation est elle risquée? (par contre trap D, si on pouvait éviter de faire dévier le topic sur l'incapacité à programmer des gens de grosoft ça m'arrangerait )Envoyé par calogerogigante
Effectivement dans ce cas, il est possible de faire une fonction mais je trouve que le programme est clair quant même. Je n'est pas mis plus de temps à comprendre le programme que s'il y avait eu une fonction. Contrairement au code de ulukahio.Envoyé par Trap D
Envoyé par DavG
un exemple: le fichier original contient une centaine de champs présentés comme suit:
mais si le premier champ n'est pas présent, on a:Michel; Barnier; 21rue machin; c'est la fête
si le premier et le deuxième ne sont pas présents, on a:1; Barnier; 21rue machin; c'est la fête
Si le premier, le deuxieme et le troisieme ne sont pas présents:2; 21rue machin; c'est la fête
Si le deuxieme n'est pas présent:3; c'est la fête
Si le deuxieme et le troisieme ne sont pas présents:Michel; 1; 21rue machin; c'est la fête
Et ainsi de suite...Michel; 2; c'est la fête
Au plus tu rajoutes de "petits jump" à saute mouton au-dessus de petits bouts de code, au plus tu risques de louper une étape logique du déroulement de ton code... Surtout si tu dis toi-même qu'il risque d'y avoir une centaine de traitements de champs...
Je ne suis pas foncièrement contre, mais je trouve cela dangereux car tu risques de louper plus facilement une incohérence dans ton code...
A moins d'être sûr de ce que tu fais à 100 % (exemple: t'as écrit un petit ordinogramme clair qui représente toutes les possibilités de cette partie de ton programme utilisant les gotos...), alors OK...
Mais à mon avis: ordonner les choses clairement avec un switch, dans ton cas, serait beaucoup plus propre et plus lisible... Notamment en cours de déboguage...
il faut se rappeler que les instructions "return", "break", "continue"
sont des "goto" déguisés et maîtrisés
par contre il n'existe aucune instruction pour sortir élégamment de
2 boucles imbriquées. à part "goto".
En fait, le pb pour éviter les goto est souvent un problème d'algo.
Ne pourrais-tu pas mettre en place un code à base de pointeur ?
1 -Tu fais pointer le pointeur sur le champ1,
2 - tu récupères le nombre de champ à sauter,
3 - tu incrémentes ton pointeur du nombre de champ correspondant
4 - tu appelles mon_traitement (mon_pointeur) ?
Bien sur ne connaissant pas ton code et ton traitement il n'est pas sûr que cela soit réalisable...
Mais généralement il est fortement conseiller de mettre en place une solution sans goto (pourquoi ? .... Parce que.... )
le 'no goto ' me fait aussi penser à certaines personnes qui vont te dire de ne surtout pas utiliser le 'switch' parceque c'est pas compilé de maniére optimum, que le 'continue' dans un while n'est pas propre parceque tu ne respectes pas ta condition de sortie etc....
n'empeche que un beau et magnifique goto bien placé et ben c'est tres propre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 piVar = (int*) calloc(SIZE,sizeof(int)); if(!piVar ) goto labelError; /*traitement*/ return 0; labelError: return -1;
Si tu ne te plantes pas, comment veux tu pousser?
J'ai peut être un gros problème mais je ne vois pas de solutions simple avec un switch...Envoyé par calogerogigante
PS: j'ai fait un organigramme clair, j'ai rajouté énormément de tests et j'ai beaucoup de temps pour le débuggage, et comme les noms des étiquettes que j'utiliserai seraient très explicites, le risque d'erreur me parait plutôt faible.
Le traitement des champs est-il toujours le même ?
Le propre de la programmation: c'est qu'il y a cent façons différentes de faire la même chose... T'es libre, malgré tout ce qu'on peut dire, de choisir ta méthode...le risque d'erreur me parait plutôt faible.
N'empêche qu'en cas de problème... Ca peut devenir un casse-tête les gotos multipliés exagérement !!
Mais au fond, l'important, c'est que ça tourne convenablement... Surtout si c'est pour un client...
C'est mon avis, et je le partage !!
;-)
Comment sont organisés ces fameux champs, ils sont nommés, numérotés ?
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Non ce n'est jamais le même, et c'est bien là le problème, puisque je traite le contenu de chaque champ pour le formater selon les besoins de ma base d'arrivée.Envoyé par jack69
et calogerogigante heureusement que je suis libre, mais c'est juste que pour l'instant je ne vois pas de solutions qui ne rajoute pas environ 10 000 lignes de codes à mon problème dans ce que l'on me propose .
(Merci à tous pour votre aide, je ne pensais pas que ce sujet déchainerai autant les passions)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager