Optimisation pour une comparaison de chaîne en c/c++ - Programmation
Marsh Posté le 15-03-2002 à 13:16:37
Yo mec,
C'est bien beau ton truc, mais on y comprends quedalle...
Menfin, c'est du C, pis c'est bien chiant comme truc....
Allez bon courage............
JOEY
Marsh Posté le 15-03-2002 à 13:31:14
Je pense que ce qu'il "faut", c'est d'abord récupérer le premier NOMBRE 192 (constitué de 3 chiffres 1 9 2), puis le second puis le troisième.
atoi() sur 163.104 ne donnera guère "163.104" car les entiers n'ont pas de virgule (.).
En cherchant le point séparateur jusqu'à atteindre le champ voulu, c'est peut être le plus "naturel".
Si le but est de comparer "en bloc", y a moyen de formater à trois digits (000 à 999) chaque nombre de 10.12.12 en 010012012 après avoir récupéré le 10, le 12 et le 12. Pour comparer au 192168010... Tout dépend du but.
Le plus rapide, ça dépend de comment c'est "optimisé", et du traitement.
Marsh Posté le 15-03-2002 à 13:31:30
Bon je recommence si cétait pas clair :
Analyse de chaine de caractères de 14 caractères de types :
"192.168.254.213"
" 192.168.12.213"
" 192.168.12.12"
" 10.10.10.1"
Les données qui me permettent d'analyser vers ou vont ces adresses sont les deux premiers chiffres qui me donnent le groupe de batiment de destination. Le troisième chiffre me donne le batiment exact.
Je dois tout d'abord analyser les deux premiers chiffres des adresses pour déterminer si la destination des adresses est internet et dans ce cas je m'en fou du reste. Si la destination n'est pas internet alors faut que je regarde le troisième chiffre pour savoir ou ca va exactement.
Pour le moment je parcourt la liste et je transforme chacun des "chiffres chaîne de caractères" en entier et ensuite je fais mes comparaisons.
Mais si qqn à une idée plus rapide je suis preneur parce que des adresses comme ca j'en ai des tonnes à analyser.
(j'éspère que c plus clair)
Marsh Posté le 15-03-2002 à 13:48:14
Pour être plus précis, les chiffres analysés sont le 1 et le 9 du nombre 192, puis le 2 si le 1 et le 9 sont en "interne".
Le nombre 10 est considéré comme 010. Donc chiffres 0 et 1 et 0.
Marsh Posté le 15-03-2002 à 14:04:52
sorry mais po fort compris ta comparaison je suis entrain de faire un optimisation mais je suis coince car pas fort compris !!!
Marsh Posté le 15-03-2002 à 14:21:18
J'ai l'impression qu'il confusionne les chiffres (char) et les nombres (formés de chiffres). ???
Marsh Posté le 15-03-2002 à 14:35:20
J'pense que le meilleur moyen, c effectivement d'extraire ts les chiffres dans une structure, et de comparer après.
Perso, j'ferai un truc comme ça (g pas essayé non plus, ms bon):
dans ton .h:
Code :
|
et dans ton .cpp:
Code :
|
Et après, ta structure est remplie.
le sscanf, ça peut être vachement pratique, et c pas très très connu. (ça reste à tester qd même mon truc, je suis pas sur à 100%)
[jfdsdjhfuetppo]--Message édité par El_Gringo--[/jfdsdjhfuetppo]
Marsh Posté le 15-03-2002 à 16:23:26
Par 1er 2ème et 3ème je veux parler des nombres de l'adresse IP, une adresse IP est découpée en 4 nombres.
Gringo : comment ca marche du tonnere le sscanf, grand merci.
[jfdsdjhfuetppo]--Message édité par merou91--[/jfdsdjhfuetppo]
Marsh Posté le 15-03-2002 à 16:32:48
merou91 a écrit a écrit : Par 1er 2ème et 3ème je veux parler des nombres de l'adresse IP, une adresse IP est découpée en 4 nombres. |
Alors dit Octet à la place de nombre, tu sera mieux compris.
Octet, parce que, chaque "nombre de l'adresse ip" dont du parle, va de 0 à 255, parce que c'est 1 octet (8 bits).
merou91 a écrit a écrit : Gringo : comment ca marche du tonnere le sscanf, grand merci. |
Ouais, c bien comme truc, hein !?
Marsh Posté le 15-03-2002 à 18:20:13
Au hasard,
Citation : #include <arpa/inet.h> |
Citation : The inet_addr function converts a string containing an (Ipv4) Internet Protocol dotted address into a proper address for the IN_ADDR structure. |
Sinon pour le fun, un truc qui prend deux minutes
a ecrire:
Code :
|
disclaimer: Code garanti non teste donné "as is",Attention ne faites pas la meme chose
a la maison.
A+
LEGREG
Marsh Posté le 15-03-2002 à 18:23:37
legreg a écrit a écrit : Au hasard,
|
C'est bien lourd comme codage pour un truc aussi simple..
Marsh Posté le 15-03-2002 à 18:27:53
*Syl* a écrit a écrit : C'est bien lourd comme codage pour un truc aussi simple.. |
et bien s'il ne veut pas utiliser les fonctions
de librairie qui font le boulot..
LEGREG
Marsh Posté le 16-03-2002 à 13:35:31
merou91 a écrit a écrit : Bon je recommence si cétait pas clair : Analyse de chaine de caractères de 14 caractères de types : "192.168.254.213" " 192.168.12.213" " 192.168.12.12" " 10.10.10.1" Les données qui me permettent d'analyser vers ou vont ces adresses sont les deux premiers chiffres qui me donnent le groupe de batiment de destination. Le troisième chiffre me donne le batiment exact. Je dois tout d'abord analyser les deux premiers chiffres des adresses pour déterminer si la destination des adresses est internet et dans ce cas je m'en fou du reste. Si la destination n'est pas internet alors faut que je regarde le troisième chiffre pour savoir ou ca va exactement. Pour le moment je parcourt la liste et je transforme chacun des "chiffres chaîne de caractères" en entier et ensuite je fais mes comparaisons. Mais si qqn à une idée plus rapide je suis preneur parce que des adresses comme ca j'en ai des tonnes à analyser. (j'éspère que c plus clair) |
j'ai une question as tu beaucoup de groupe de batiment ? et de batiment ?
Si il n'y en a pas beaucoup pourquoi ne pas faire ta comparaison dans le sens inverse !!!
Je m'explique si tu as beaucoup d'adresse a analiser ta conversion va s'executer un grand nombre de fois.
Maintenant si tu as beaucoup moins de reference a comparer pourquoi ne pas convertir tes adresse de reference en chaine de caractere et tu fais une comparaison sur les caracteres du debut jusqu'au seconde point (pour les groupes de batiments) puis du second point au troisieme(pour les batiments)
Marsh Posté le 16-03-2002 à 16:09:09
Bon toutes ces fonctions ont déjà été codées... Un petit coup d'oeil sur le net et t'auras le nom de la librairie avec les fonctions qui vont bien...
Marsh Posté le 16-03-2002 à 16:19:11
zeux a écrit a écrit : Bon toutes ces fonctions ont déjà été codées... Un petit coup d'oeil sur le net et t'auras le nom de la librairie avec les fonctions qui vont bien... |
je poste pour du beurre??
LEGREG
Marsh Posté le 16-03-2002 à 16:30:18
legreg a écrit a écrit : je poste pour du beurre?? LEGREG |
sorry j'avais tout po lu.
Marsh Posté le 17-03-2002 à 12:33:26
faire ca en c++ ?!
code en 4 minutes chrono
... et verifie sur mon syteme, c encore tout chaud ...
Powered by Perl
#!/usr/bin/perl
@tableau_ip = ("192.168.12.23","10.20.12.23" );
foreach $ip (@tableau_ip)
{
if ($ip =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/)
{
$temp =$1.$2;
if ($temp == "192168" )
{
print "Adresse interne !\n";
}
else
{
print "coucou \n";
# je fais ce que je veux avec les variable $1,$2, ... recuperee
# classement destination etc
};
}
else
{
die("L'ip doit etre du format : nbr.nbr.nbr.nnr, merci !" );
};
};
Marsh Posté le 17-03-2002 à 12:41:38
le monsieur veut pas une version pearl, mais une C++
Paske sinon je lui refile une version prolog !
......
quoique, non, en fait
Marsh Posté le 17-03-2002 à 12:46:29
bah ... il inclut le code perl dans le code C ou inversement.
une version prolog, euh c quoi ca ? (j'imagine que ca doit etre barbare )
Marsh Posté le 15-03-2002 à 13:05:36
Voilà mon programme doit entre autre comparer un nombre important d'entrées et à la base ce sont des chaînes de caractères de cette forme : " 192.168.10.1", " 10.12.12.12", "172.195.120.230".
La chaine est de taille fixe et les données (IP) sont séparées par un point.
Je dois déterminer vers quel réseau elle vont donc il faut que j'examine les deux premiers chiffres puis le troisième.
J'ai parcouru la chaine et converti les bouts de chaine en entiers pour ensuite faire la comparaison.
Mais ce serait il pas plus rapide si j'arrivai à chopper avec une commande les deux premiers chiffres, transformation avec atoi qui me donnerai par exemple "163.104" -> 163.104 et ensuite je choppe le troisième chiffre.
Bon je suis pas sur de la deuxième solution mais si qn à une idée je suis preneur.