Salut,

Ma fonction de conversion d'une chaîne de caractères vers un "long double" se sert de pleins de "return". C'est le "code du goret" comme diraient certains.

Voici la fonction :
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
40
41
42
43
44
45
46
47
48
 
int string_to_ldouble( const char * z , long double * val , const char point  )
{   
    int sign = 1 ;
    long double po = 1 ;
    long double v = 0.0 ;
    size_t i = 0 ;
 
    if( z == NULL ) return -1  ;   // la chaîne est null 
    while( z[i] == ' ')  i++ ;
    if( z[i] == '\0' )  return 1  ;  // la chaîne est vide
 
    if( z[i] == '-' )  sign = -1 ; 
    if( z[i] == '+'  ) sign = 1 ;
    if( z[i] == '+' || z[i] == '-' ) i++ ;
 
    while( z[i] == ' ' ) i++ ;
    if( z[i] == '\0' )     // il n'y a plus rien apès le signe
    { 
      return 2 ;
    }
 
    for(  ; z[i] &&  ( isdigit(z[i])  ) ; i++ )
    v  = v * 10  + ( z[i]  - '0' ) ;
 
    if( z[i] != point )
    { while ( z[i] )
      if ( z[i++] != ' ' ) return 3  ;  // est-ce un entier ?
    }
    else
    if( z[i] == point && isdigit(z[i+1] ) )
    {    
      i++ ;
      for( ; z[i]  && ( isdigit(z[i] ) ) ; i++ )
      {
         po *= 10 ;
         v =  v + ( z[i] - '0' ) / po  ;
      }
    }
 
    while ( z[i] )
    if ( z[i++] != ' ' ) return 4  ;  // la fin de la chaîne est-elle propre ?
 
    v = sign * v    ;
    *val = v ;
 
    return 0 ;  // zéro pas de problème 
}
Si vous pouvez trouver une meilleure implémentation qui se passe des "return", je suis prêt à l'étudier dans la mesure où elle respecte les conditions de validité de la conversion.

Ma fonction est pleine de redondances, mais je ne vois pas comment les corriger sans perturber ses règles de validité.