goto

goto - C - Programmation

Marsh Posté le 07-04-2006 à 14:30:56    

Bonjour,
y a t il une possibilité en C de demander à un programme d'aller à une ligne donné du code aprés une certaine instruction?
C'est à dire, quelque chose comme:
 
if (a==b)
 goto (ligne13 du code)

Reply

Marsh Posté le 07-04-2006 à 14:30:56   

Reply

Marsh Posté le 07-04-2006 à 14:36:47    

mbarekh a écrit :

Bonjour,
y a t il une possibilité en C de demander à un programme d'aller à une ligne donné du code aprés une certaine instruction?
C'est à dire, quelque chose comme:
 
if (a==b)
 goto (ligne13 du code)

Oui mais c'est fortement déconseillé, exemple tiré de MSDN (au mieux de leur forme  :pt1cable: )

Code :
  1. void main()
  2. {
  3.     int i, j;
  4.     for ( i = 0; i < 10; i++ )
  5.     {
  6.         printf( "Outer loop executing. i = %d\n", i );
  7.         for ( j = 0; j < 3; j++ )
  8.         {
  9.             printf( " Inner loop executing. j = %d\n", j );
  10.             if ( i == 5 )
  11.                 goto stop;
  12.         }
  13.     }
  14.     /* This message does not print: */
  15.     printf( "Loop exited. i = %d\n", i );
  16.     stop: printf( "Jumped to stop. i = %d\n", i );
  17. }


Message édité par Trap D le 07-04-2006 à 14:37:34
Reply

Marsh Posté le 07-04-2006 à 14:40:55    

+1  [:_darkalt3_]
 
Je ne vois meme pas dans quel cas on peut en avoir besoin et ne pas pouvoir s'en passer.
 
Edit: j'oublie qu'on est vendredi

Message cité 2 fois
Message édité par _darkalt3_ le 07-04-2006 à 14:41:33
Reply

Marsh Posté le 07-04-2006 à 14:41:50    

Le goto, en C, ne s'utilise que dans des cas très spécifiques.
En dehors de ces cas plutôt rares, cette instruction est déconseillée.
 

_darkalt3_ a écrit :

+1  [:_darkalt3_]
 
Je ne vois meme pas dans quel cas on peut en avoir besoin et ne pas pouvoir s'en passer.


 
Il n'arrive jamais qu'on ne puisse pas du tout se passer de goto.
Néanmoins, il y a des cas particuliers pour lesquels l'utilisation de cette instruction simplifie grandement les choses, et dans ce cas on aurait tort de ne pas l'utiliser.
 
'fin bon, je n'ai personnellement jamais eu besoin de l'utiliser, j'ai juste vu un cas ou deux où c'était effectivement justifié.

Message cité 1 fois
Message édité par Elmoricq le 07-04-2006 à 14:43:25
Reply

Marsh Posté le 07-04-2006 à 14:47:27    

je l'ai essayé, ça n' a pas marché et quand j'ai mis ce que j'ai ajouté en commentaire et compilé j'ai eu le message d'erreur suivant:
 
ld: 0711-750 SEVERE ERROR: The file system is full.
ld: 0711-994 Error occurred while writing to the temporary output file: ./b.YFbd7a
make: *** [tst] Error 1

Reply

Marsh Posté le 07-04-2006 à 14:50:30    

Relis le message d'erreur.

Reply

Marsh Posté le 07-04-2006 à 14:55:03    

Ca voudrait dire que la memoire est pleine? Si c'est vrai c'est le goto qui a causé ça?  
pour le moment le probl_ème est résolu après plusieurs make, mais je ne comprends pas ce qui s'est passé

Reply

Marsh Posté le 07-04-2006 à 14:57:55    

Elmoricq a écrit :

'fin bon, je n'ai personnellement jamais eu besoin de l'utiliser


 
Voilà :D

Reply

Marsh Posté le 07-04-2006 à 15:08:54    

quelqu'un a une idée de ce que voudrait dire ce message d'erreur?
 
ld: 0711-750 SEVERE ERROR: The file system is full.  
ld: 0711-994 Error occurred while writing to the temporary output file: ./b.YFbd7a  
make: *** [tst] Error 1  

Reply

Marsh Posté le 07-04-2006 à 15:13:53    

mmmh le filesystem n'en peut plus et le temp est plein ?

Reply

Marsh Posté le 07-04-2006 à 15:13:53   

Reply

Marsh Posté le 07-04-2006 à 15:19:02    

et comment on peut régler ça?

Reply

Marsh Posté le 07-04-2006 à 15:19:23    

_darkalt3_ a écrit :

+1  [:_darkalt3_]
 
Je ne vois meme pas dans quel cas on peut en avoir besoin et ne pas pouvoir s'en passer.
 
Edit: j'oublie qu'on est vendredi


 
ca peux servir, comme le C n'offre pas de support pour une gestion d'erreur par exception
on aimerait bien pouvoir extraire d'un algorithme d'une complexite autre qu'un "hello
world" le code de gestion des erreurs lui meme tres complexe
 

Code :
  1. int toto()
  2. {
  3.     int * n1, * n2, *n3;
  4.    
  5.     n1 = malloc(...);
  6.     if( ! n1 )
  7.     {
  8.         return ...;
  9.     }
  10.    
  11.     ...
  12.    
  13.     n2 = malloc(f(n1));
  14.     if( ! n2 )
  15.     {
  16.         free(n1);
  17.         return ...;
  18.     }
  19.    
  20.     ...
  21.    
  22.     n3 = malloc(f(n2));
  23.     if( ! n3 )
  24.     {
  25.         free(n1);
  26.         free(n2)
  27.         return ...;
  28.     }
  29.    
  30.     /* et encore, ca reste tres simple */
  31.     ...
  32.    
  33.     free(n1);
  34.     free(n2);
  35.     free(n3);
  36.     return 0;
  37. }


 
la version avec goto et gestion d'erreur reportée géographiquement dans le code

Code :
  1. int toto()
  2. {
  3.     int * n1 = NULL, * n2 = NULL, *n3 = NULL;
  4.     int error = 0;
  5.    
  6.     n1 = malloc(...);
  7.     if( ! n1 )
  8.     {
  9.         error = ...;
  10.         goto end_pt;
  11.     }
  12.    
  13.     ...
  14.    
  15.     n2 = malloc(f(n1));
  16.     if( ! n2 )
  17.     {
  18.         error = ...;
  19.         goto end_pt;
  20.     }
  21.    
  22.     ...
  23.    
  24.     n3 = malloc(f(n2));
  25.     if( ! n3 )
  26.     {
  27.         error = ...;
  28.         goto end_pt;
  29.     }
  30.    
  31. end_pt:
  32.     free(n1);
  33.     free(n2);
  34.     free(n3);   
  35.     return error;
  36. }


 
une autre solution c'est d'en avoir rien à foutre des fuites et autres ressources non finalisée, comme beaucoup de programmeurs

Message cité 1 fois
Message édité par skelter le 07-04-2006 à 15:35:42
Reply

Marsh Posté le 07-04-2006 à 15:22:46    

Le file system n'est pas la mémoire mais le disque.
Dans file system, il y a file qui veut dire fichier.

Reply

Marsh Posté le 07-04-2006 à 15:26:24    

mbarekh a écrit :

Ca voudrait dire que la memoire est pleine?


 
Tu n'as plus d'espace sur ton disque, make ne parvient pas à créer ton fichier.
 

skelter a écrit :

Code :
  1. end_pt:
  2.     if( n1 )
  3.         free(n1);
  4.     if( n2 )
  5.         free(n2);
  6.     if( n3 )
  7.         free(n3);   
  8.     return error;
  9. }




 
<pinaillage>free(NULL) étant défini par la norme, les "if" sont inutiles.</pinaillage> ;)

Reply

Marsh Posté le 07-04-2006 à 15:28:24    

oui, mais ...
 

Code :
  1. void toto()
  2. {
  3. int *n1, *n2, *n3;
  4. n1 = (int *) malloc(...);
  5. if (n1)
  6. {
  7.  n2 = (int*) malloc(...);
  8.  if (n2)
  9.  {
  10.   n3 = (int*) malloc(...);
  11.   if (n3)
  12.   {
  13.    traitements(n1,n2,n3);
  14.    free(n3);
  15.   }
  16.   free(n2);
  17.  }
  18.  free(n1);
  19. }
  20. }


 
 
mais je pinaille, merci pour ton exemple.


Message édité par _darkalt3_ le 07-04-2006 à 15:30:30
Reply

Marsh Posté le 07-04-2006 à 15:33:58    

Elmoricq a écrit :

Tu n'as plus d'espace sur ton disque, make ne parvient pas à créer ton fichier.
 
 
 
<pinaillage>free(NULL) étant défini par la norme, les "if" sont inutiles.</pinaillage> ;)


 
en effet, merci :)

Reply

Marsh Posté le 07-04-2006 à 16:27:46    

http://forum.hardware.fr/hardwaref [...] 6883-1.htm
 
[:pingouino]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 07-04-2006 à 16:32:10    

oui c'est le début et la suite de mes problèmes. mais tu pense qu'il y a une solution?

Reply

Marsh Posté le 08-04-2006 à 15:36:13    

mbarekh a écrit :

oui c'est le début et la suite de mes problèmes. mais tu pense qu'il y a une solution?


 
Tu te places à la racine de ton système de fichiers (filesystem) et tu tapes la commande
du -sk * |sort -n
 
Tu obtiendras la liste des répertoires triés par taille (le plus gros en premier). Tu descends dans le plus gros et tu retapes la même commande, etc etc jusqu'à ce que tu aies identifié le fichier (ou répertoire) inutile qui te bouffe tout ton espace disque. Là, tu l'effaces
 
Bien entendu cette manip part de l'hypothèse que tu as un gros fichier (ou répertoire) inutile dans ton filesystem...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed