[C]besoin de votre aide

besoin de votre aide [C] - C++ - Programmation

Marsh Posté le 09-05-2002 à 16:32:47    

salut
 
j essaie de coder un convertisseur d'ip
ds un premier temps j essaie d'associer chaque partie de l'ip ds une variable differente
 
#include <stdio.h>
main()
{
char ip[15];
int a,b,c,d;
flushall();
puts("donnez ip a convertir" );
scanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);
printf("ip est: %d %d %d %d",a,b,c,d);
}
 
la en faite le resultat me sort n'importe quoi ds les variables a,b,c,d
 
merci d'avance pour votre aide

Reply

Marsh Posté le 09-05-2002 à 16:32:47   

Reply

Marsh Posté le 09-05-2002 à 16:43:03    

bon j ai trouve tt seul en fait :p
 
#include <stdio.h>  
main()  
{  
char ip[15];  
int a,b,c,d;  
flushall();  
puts("donnez ip a convertir" );  
scanf("%s",ip);
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);

printf("ip est: %d %d %d %d",a,b,c,d);  
}

Reply

Marsh Posté le 09-05-2002 à 18:01:37    

bon j ai un presque fini, mais la y a des problemes au niveau de mes variables qui apparement ne supporte pas des nombres aussi grand :
 
#include <stdio.h>
main()
{
char ip[15];
int a,b,c,d;
long ip1,ip2,ip3,ipfinal,coef1,coef2,coef3;
flushall();
coef1=16777216;
coef2=65536;
coef3=256;
puts("donnez ip a convertir" );
scanf("%s",&ip);
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);
printf("%d %d %d %d\n",a,b,c,d);
ip1=a*coef1;
ip2=b*coef2;
ip3=c*coef3;
ipfinal=ip1+ip2+ip3+d;
printf("%d %d %d %d\n",ip1,ip2,ip3,d);
printf("ip convertie: %d\n",ipfinal);
}
 
j ai essayer avec plusieurs type de variable (double,float,long), mais c tjrs pareil
le resultat est faux ! :/
 
cependant si je diminue la valeur de coef1,coef2 et coef3, alors la le calcul se fais sans probleme
 
je vois pas d'ou ca peut venir

Reply

Marsh Posté le 09-05-2002 à 18:27:06    

Le pb c'est que quand tu affiches tes ip1, ip2, ip3 tu demande à ce qu'on t'affiche des int (%d) au lieu de long (%ld je crois).


---------------
Ratures - Cuisine
Reply

Marsh Posté le 09-05-2002 à 18:55:37    

prems a écrit a écrit :

Le pb c'est que quand tu affiches tes ip1, ip2, ip3 tu demande à ce qu'on t'affiche des int (%d) au lieu de long (%ld je crois).  




 
nan ca change rien :/

Reply

Marsh Posté le 10-05-2002 à 13:57:18    

un ti :bounce:
 
j ai tjrs pas trouve de solution ! :/
avec comme type "long" je devrai bien pouvoir faire des calculs avec des nombres aussi grand ?
 
parce que la j affiche la valeur de "a" par exemple avant la multiplication, et elle est pas nulle
 
ensuite j affiche la valeur de ip1 apres la multiplication et ca me donne 0 :/
 
si je baisse le coef1, ca marche tres bien
 
j ai besoin qu'on m eclaire un peu la
help meee

 

[jfdsdjhfuetppo]--Message édité par djtoz le 10-05-2002 à 13:58:31--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 10-05-2002 à 14:21:04    

long int = (sur plate formes 32 bits) = int = - (2^31 + 1) à + (2^31), soit quelques 2 000 000 000


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 10-05-2002 à 14:51:21    

hum ben oue mais moi c au dela de ca alors
pk si je multiplie par exemple 245*16777216, ben on est deja a plus de 4milliard :/
 
c kel type qu'il faut que j utilise alors ?

Reply

Marsh Posté le 10-05-2002 à 14:54:03    

double, mais y a parfois une perte de précision... enfin non je sais plus :D
Sous Delphi y a le Int64, ?2^63 à 2^63?1, soit environ 18 000 000 000 000 000 000 :D, mais je pense pas qu'en C y ait quoi que ce soit d'équivalent.
 
Tu peux toujours utiliser unsigned long, ça va jusqu'à 4 200 000 000

 

[jfdsdjhfuetppo]--Message édité par antp le 10-05-2002 à 14:54:50--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 10-05-2002 à 15:00:26    

bon moi le grand max c par exemple pour convertir une ip de 255.255.255.255
 
ca donne 4 294 967 295
 
alors meme le unsigned long est po good !!
ouinnnnnnnnnnnnnn :/
 
je trouve ca qd meme allucinant d avoir autant de mal a faire des calculs avec de tels nombres, pour un ordinateur c rien du tout ca...
 
c zarb

 

[jfdsdjhfuetppo]--Message édité par djtoz le 10-05-2002 à 15:01:35--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 10-05-2002 à 15:00:26   

Reply

Marsh Posté le 10-05-2002 à 15:48:50    

255^4 ça rentre dans 2^32 - 1 (unsigned long int), vu que 2^32 = 256^4
 
Donc à priori ça devrait aller, tant que chaque morceau de ton ip est valide ( 0->255 )

 

[jfdsdjhfuetppo]--Message édité par antp le 10-05-2002 à 15:49:40--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 10-05-2002 à 15:50:21    

djtoz a écrit a écrit :

bon moi le grand max c par exemple pour convertir une ip de 255.255.255.255
 
ca donne 4 294 967 295
 
alors meme le unsigned long est po good !!
ouinnnnnnnnnnnnnn :/
 
je trouve ca qd meme allucinant d avoir autant de mal a faire des calculs avec de tels nombres, pour un ordinateur c rien du tout ca...
 
c zarb  
 
 




 
vive les gens qui lisent pas la doc ... les @IP c effectivement des ulong, alors viens pas dire que ca rentre pas dedans !

Reply

Marsh Posté le 10-05-2002 à 15:54:36    

HappyHarry a écrit a écrit :

 
 
vive les gens qui lisent pas la doc ... les @IP c effectivement des ulong, alors viens pas dire que ca rentre pas dedans !  




 
Ouais heureusement que je disais "environ" quand je donnais des chiffres finissant par 000 :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 10-05-2002 à 16:13:34    

antp a écrit a écrit :

255^4 ça rentre dans 2^32 - 1 (unsigned long int), vu que 2^32 = 256^4
 
Donc à priori ça devrait aller, tant que chaque morceau de ton ip est valide ( 0->255 )  
 
 




 
ok ben j essaie ca ce soir des que je rentre du boulot
thx :)

Reply

Marsh Posté le 11-05-2002 à 18:16:09    

bon tjrs le meme probleme :/
meme en mettant unsigned long int
 
si quelqu'un pouvait essayer de le compile rapido pour voir ce que ca donne chez vous
 
#include <stdio.h>
main()
{
char ip[15];
int a,b,c,d;
unsigned long int ipa,ipb,ipc,ipfinal,coefa,coefb,coefc;
flushall();
coefa=16777216;
coefb=65536;
coefc=256;
puts("donnez ip a convertir" );
scanf("%s",&ip);
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);
printf("%d %d %d %d %d %d %d\n",a,b,c,d,coefa,coefb,coefc);
ipa=a*coefa;
ipb=b*coefb;
ipc=c*coefc;
ipfinal=ipa+ipb+ipc+d;
printf("%d %d %d %d\n",ipa,ipb,ipc,d);
printf("ip convertie: %d\n",ipfinal);
}

Reply

Marsh Posté le 11-05-2002 à 18:41:11    

Heu je pense à un truc... tu fais tes printf avec des %d... mais %d/%i c'est pour "signed decimal integer"... ici si ce sont des "unsigned int" tu dois utiliser %u, qui représente un affichage en  "unsigned decimal integer", dixit la doc de Borland:

Citation :

Numerics
d Integer signed decimal integer
i Integer signed decimal integer
? Integer unsigned octal integer
u Integer unsigned decimal integer
x Integer unsigned hexadecimal int (with a, b, c, d, e, f)
X Integer unsigned hexadecimal int (with A, B, C, D, E, F)
f Floating point signed value of the form [-]dddd.dddd.
 
e Floating point signed value of the form [-]d.dddd or e[+/-]ddd
g Floating point signed value in either e or f form, based on given value and precision. Trailing zeros and the decimal point are printed if necessary.
E Floating point Same as e; with E for exponent.
G Floating point Same as g; with E for exponent if e format used
 
Characters
c Character Single character
s String pointer Prints characters until a null-terminator is pressed or precision is reached
% None Prints the % character
 
Pointers
n Pointer to int Stores (in the location pointed to by the input argument) a count of the chars written so far.
p Pointer Prints the input argument as a pointer; format depends on which memory model was used. It will be either XXXX:YYYY or YYYY (offset only).

 

[jfdsdjhfuetppo]--Message édité par antp le 11-05-2002 à 18:41:58--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 11-05-2002 à 19:54:57    

ca change rien, puis meme il se passe des choses tres bizarre avec ce code :
 
#include <stdio.h>  
main()  
{  
char ip[15];  
int a,b,c,d;  
unsigned long int ipa,ipb,ipc,ipfinal,coefa,coefb,coefc;  
flushall();  
coefa=16777216;  
coefb=65536;  
coefc=256;  
puts("donnez ip a convertir" );  
scanf("%s",&ip);  
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);  
printf("%d %d %d %d %u %u %u\n",a,b,c,d,coefa,coefb,coefc);  
ipa=a*coefa;  
ipb=b*coefb;  
ipc=c*coefc;  
ipfinal=ipa+ipb+ipc+d;  
printf("%u %u %u %u\n",ipa,ipb,ipc,d);  
printf("ip convertie: %d\n",ipfinal);  
}
 
maintenant voila ce que ca donne qd j execute le prog :
 
C:\>ip
donnez ip a convertir
120.56.23.45
120 56 23 45 0 256 0
0 30720 0 56
ip convertie: 5933
 
donc deja un truc ke pige pas c'est qu'il m affiche pas les bonnes valeurs pour mes coefs
le 256 la il me l affiche comme si c'etait la variable b alors que c'est la c ! :??:
 
je comprends plus rien ! :/

Reply

Marsh Posté le 11-05-2002 à 20:43:39    

Ton code marchait chez moi après que j'ai mis des %u dans tous les printf, et mis les variable int en unsigned long int.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

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