Bonjour,

J'aimerais obtenir des précisions sur le comportement de ce programme compilé avec GCC :

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
49
50
51
52
53
54
55
 
#include <stdio.h>
#include <math.h>
#include <ctype.h>
 
short int ctoi(const int c) {
	if (c == '0')
		return 0;
	else if (c == '1')
		return 1;
	else if (c == '2')
		return 2;
	else if (c == '3')
		return 3;
	else if (c == '4')
		return 4;
	else if (c == '5')
		return 5;
	else if (c == '6')
		return 6;
	else if (c == '7')
		return 7;
	else if (c == '8')
		return 8;
	else if (c == '9')
		return 9;
	else	
		return c;
}
 
int funcn(void) {
	char c;
	int n;
	int i, j;
	i = n = 0;
	while ((c = getchar()) != '\n' && c != EOF) {
		if (isdigit(c)) {
			n += (ctoi(c) * pow(10, i));
			++i;
		}
	}
	printf("---+ %d\n", n);
	return n;
}
 
 
int main(void) {
	unsigned int nl, nc;
	printf("NUM1> ");
	nl = funcn();
	printf("\n\nNUM2> ");
	nc = funcn();
	printf("%u %u\n", nl, nc);
	return 0;
}
Le programme a pour SIMPLE but d'inverser les chiffres composant le nombre que l'on fourni en entrée au programme.

Le problème, c'est qu'avec GCC, le nombre inversé n'est pas exactement l'inverse du nombre concerné. Généralement, c'est comme si le programme soustrayais 1 ou 2 au nombre inversé.

Exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
NUM1> 1234
---+ 4320
 
 
NUM2> 56789
---+ 98763
4320 98763
Les réponses devraient évidemment être 4321 et 98765...

Qu'est qui cause ces erreurs?
Comment palier à ce problème?

Notez que ce problème fait son apparition SEULEMENT avec GCC.
Compilé avec ICC (Intel) et CL (Microsoft), le programme se comporte comme il se doit.


Merci,

Sincèrement,

Array