Programme en C a diminuer

Fermé
Colas - Modifié le 9 déc. 2021 à 22:04
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 9 déc. 2021 à 22:03
Bonjour,
Je suis un peux dans le rush je doit retirer deux ligne a ce programme mais je ne trouve pas comment faire j'ai tout essayer si vous pouvez m'ader merci beaucoup
int shell_loop(char **argv, int count)
{
 char *buff = NULL, **av = NULL;
 ssize_t result = 1, retour;

 result = prompt(&buff), count++;
 if (result == -1)
 {
  free_pointer(1, buff);
  return (1);
 }
 av = fillarguments(buff, " \t");
 if (av[0] == NULL)
 {
  free_pointer(1, buff), free_arrayofpointer(av);
  return (0);
 }
 if (av[0][0] != '/')
 {
  retour = checkBuiltins(av, buff, count);
  if (retour == 0 || retour == 2)
  {
   free_pointer(1, buff), free_arrayofpointer(av);
   retour == 0 ? (retour = 0) : (retour = 1);
   return (retour);
  }
  if (!(findinthepath(av)))
  {
   printerror(argv, count, av), free_pointer(1, buff), free_arrayofpointer(av);
   return (2);
  }
  else
  {
   processus(argv, av, buff, count);
   free_pointer(2, *av, buff), free_arrayofpointer(av);
   return (0);
  }
 }
 if (processus(argv, av, buff, count) != 0)
 {
  free_pointer(1, buff), free_arrayofpointer(av);
  return (2);
 }
 free_pointer(1, buff), free_arrayofpointer(av);
 return (0);
}




Configuration: Windows / Chrome 96.0.4664.93

2 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 8 déc. 2021 à 19:30
Salut Colas,

J"ai rarement vu un code C utilisant autant l'opérateur
,
et une question aussi inhabituelle.

Pourquoi veux-tu faire cela ?

Le but est-il de savoir si tu peux encore économiser des lignes en continuant d'abuser de cet opérateur et en rajoutant des expressions supplémentaires séparées par des virgules au lieu de
;
sans altérer le fonctionnement du code ? Si oui, c'est assez facile et tu as de nombreux choix.

Quant à savoir si tu peux supprimer du code, ou refactoriser le code pour en retirer des éléments redondants, je pense qu'on ne peut pas le dire sans avoir connaissance du reste du code.
0
Non je suis en école et donc on a une limite c'est de ne pas faire trop de ligne même si je sais que mon code n'est pas très jolie avec les "," j'ai reussit a gagner une ligne masi je reste bloquer encore avec une ligne a enlever en plus voici mon code :
int shell_loop(char **argv, int count)
{
 char *buff = NULL, **av = NULL;
 ssize_t result = 1, retour;

 result = prompt(&buff), count++;
 if (result == -1)
 {
  free_p(1, buff);
  return (1);
 }
 av = fillarguments(buff, " \t");
 if (av[0] == NULL)
 {
  free_p(1, buff), free_a(av);
  return (0);
 }
 if (av[0][0] != '/')
 {
  retour = checkBuiltins(av, buff, count);
  if (retour == 0 || retour == 2)
  {
   free_p(1, buff), free_a(av), retour == 0 ? (retour = 0) : (retour = 1);
   return (retour);
  }
  if (!(findinthepath(av)))
  {
   printerror(argv, count, av), free_p(1, buff), free_a(av);
   return (2);
  }
  else
  {
   processus(argv, av, buff, count), free_p(2, *av, buff), free_a(av);
   return (0);
  }
 }
 if (processus(argv, av, buff, count) != 0)
 {
  free_p(1, buff), free_a(av);
  return (2);
 }
 free_p(1, buff), free_a(av);
 return (0);
}
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096 > Colas
Modifié le 8 déc. 2021 à 19:41
Dans ce cas tu peux mettre tes return à la suite des free_xyz() avec une virgule au lieu d'un point virgule et gagner jusqu'à 5 "lignes" de plus.

Cela devrait être sans incidence sur l'exécution de ton code ou son résultat, car tu n'évalues pas de toutes façons l'éventuelle valeur de retour de tes fonctions free_xyz() dans ton code, mais c'est clairement affreux et un contournement de la règle qui t'est imposée.
0
Colas > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
8 déc. 2021 à 19:42
J'ai déjà essayer mais cela ne marche pas ce fait une erreur:
shell_loop.c: In function ‘shell_loop’:
shell_loop.c:47:32: error: expected expression before ‘return’
47 | free_p(1, buff), free_a(av), return (2);
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096 > Colas
Modifié le 9 déc. 2021 à 14:25
OK, je vois.

Une chose que tu pourrais faire, si tu peux modifier le prototype de tes fonctions free_p() et free_a(), ou au moins juste free_a(), est qu'elle(s) retourne(nt) le code à passer à return.

Par exemple, ton prototype pour free_a() pourrait être :
int free_a(char **av, int ret_val);
et retourner la valeur de ret_val passée en fin de fonction. Et tu fais pareil éventuellement pour l'autre fonction free_p() qui prendrait un 3ème paramètre, si tu l'utilises aussi de cette façon.

Ainsi, tu pourrais écrire :
return  free_p(1, buff, 2), free_a(av, 2);
ou juste
return  free_p(1, buff), free_a(av, 2);
si tu te contentes d'utiliser de cette façon toujours free_a() en fin de ligne en dernier après tes virgules.

Seule la valeur de la dernière expression est considérée en cas d'utilisation de l'opérateur virgule, les autres étant ignorées.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
9 déc. 2021 à 22:03
Bonjour,

Ça n'a aucun sens d'utiliser l'opérateur virgule pour limiter le nombre de lignes. Autant ôter tous les retours chariots, ton code fera une unique ligne et sera totalement illisible!
On peut remplacer :
		retour = checkBuiltins(av, buff, count);
		if (retour == 0 || retour == 2)
		{
			free_p(1, buff), free_a(av), retour == 0 ? (retour = 0) : (retour = 1);
			return (retour);
		}

par:
if ((retour = checkBuiltins(av, buff, count)) == 0 || retour == 2) return free_p(1, buff), free_a(av), retour>0;

Mais ça m'étonnerais beaucoup qu'un prof attende cela!
Le but attendu devrait être plutôt de ne pas faire de traitement inutile et de bien décomposer en sous-fonctions.
0