OVH Cloud OVH Cloud

[Debutant] manipulations de LARGE_INTEGER

7 réponses
Avatar
Cyrcocq
Bonjour,

J'utilise visual studio.net 2002

Je cherche à:

*afficher un LARGE_INTEGER
Faut il redefinir le << ou y a t'il d'autre solutions?
(en fait je cherche à mettre ce LARGE_INTEGER dans une chaine pour un
affichage dans une messagebox)

* Comparer 2 LARGE_INTEGER
mais le == n'est pas défini pour eux

* Soustraire 2 LARGE_INTEGER
Mais il faut un opérateur spécial que je ne retrouve pas.

* effectuer une division non entiere entre 2 LARGE_INTEGER

Que me conseillez vous pour tout ça?

7 réponses

Avatar
Zorro
Si tu utilises windows, les __int64 ne te suffisent pas?

"Cyrcocq" a écrit dans le message de
news:4318d597$0$21295$
Bonjour,

J'utilise visual studio.net 2002

Je cherche à:

*afficher un LARGE_INTEGER
Faut il redefinir le << ou y a t'il d'autre solutions?
(en fait je cherche à mettre ce LARGE_INTEGER dans une chaine pour un
affichage dans une messagebox)

* Comparer 2 LARGE_INTEGER
mais le == n'est pas défini pour eux

* Soustraire 2 LARGE_INTEGER
Mais il faut un opérateur spécial que je ne retrouve pas.

* effectuer une division non entiere entre 2 LARGE_INTEGER

Que me conseillez vous pour tout ça?




Avatar
Gilles Vollant
"Cyrcocq" a écrit dans le message de news:
4318d597$0$21295$

Je cherche à:

*afficher un LARGE_INTEGER
Faut il redefinir le << ou y a t'il d'autre solutions?
(en fait je cherche à mettre ce LARGE_INTEGER dans une chaine pour un
affichage dans une messagebox)

* Comparer 2 LARGE_INTEGER
mais le == n'est pas défini pour eux

* Soustraire 2 LARGE_INTEGER
Mais il faut un opérateur spécial que je ne retrouve pas.

* effectuer une division non entiere entre 2 LARGE_INTEGER



LARGE_INTEGER est un type defini comme une union
utilisez le membre QuadPart (LONGLONG donc __int64) pour les opération
entiere 64 bits.



Exemple :

#include <iostream>
#include <stdio.h>
#include <windows.h>

void main()
{
LARGE_INTEGER l1, l2, l3, l4, l5;


l1.QuadPart = 0x123456789abcdef;
l2.QuadPart = 0x789456789abcdef;

std::cout << "l1=" << l1.QuadPart << std::endl;
std::cout << "l1Low =" << l1.LowPart << "l1High =" << l1.HighPart <<
std::endl;
std::cout << "l2=" << l1.QuadPart << std::endl;

l3.QuadPart = l1.QuadPart + l2.QuadPart;
std::cout << "l3=" << l1.QuadPart << std::endl;

l4.QuadPart = 123489467941228165;
l5.QuadPart = 625027070285028318;
std::cout << "l4=" << l1.QuadPart << std::endl;
std::cout << "l5=" << l1.QuadPart << std::endl;
std::
cout << "compare l3 & l4=" << ((l3.QuadPart == l4.QuadPart) ? "true" :
"false") << std::endl;
std::
cout << "compare l3 & l5=" << ((l3.QuadPart == l5.QuadPart) ? "true" :
"false") << std::endl;
std::cout << std::endl;

}
Avatar
Cyrcocq
"Zorro" a écrit dans le message de news:
43192f9f$0$4067$

"Cyrcocq" a écrit dans le message de
news:4318d597$0$21295$
Bonjour,

J'utilise visual studio.net 2002

Je cherche à:

*afficher un LARGE_INTEGER
Faut il redefinir le << ou y a t'il d'autre solutions?
(en fait je cherche à mettre ce LARGE_INTEGER dans une chaine pour un
affichage dans une messagebox)

* Comparer 2 LARGE_INTEGER
mais le == n'est pas défini pour eux

* Soustraire 2 LARGE_INTEGER
Mais il faut un opérateur spécial que je ne retrouve pas.

* effectuer une division non entiere entre 2 LARGE_INTEGER

Que me conseillez vous pour tout ça?






Si tu utilises windows, les __int64 ne te suffisent pas?



En l'occurence, c'est une valeur renvoyée qui est en LARGE_INTEGER
Donc, j'y peux rien, c'est des LARGE_INTEGER.
Avatar
Cyrcocq
"Gilles Vollant" a écrit dans le message de news:
43196f56$0$24673$

"Cyrcocq" a écrit dans le message de news:
4318d597$0$21295$

Je cherche à:

*afficher un LARGE_INTEGER
Faut il redefinir le << ou y a t'il d'autre solutions?
(en fait je cherche à mettre ce LARGE_INTEGER dans une chaine pour un
affichage dans une messagebox)

* Comparer 2 LARGE_INTEGER
mais le == n'est pas défini pour eux

* Soustraire 2 LARGE_INTEGER
Mais il faut un opérateur spécial que je ne retrouve pas.

* effectuer une division non entiere entre 2 LARGE_INTEGER



LARGE_INTEGER est un type defini comme une union
utilisez le membre QuadPart (LONGLONG donc __int64) pour les opération
entiere 64 bits.



Exemple :

#include <iostream>
#include <stdio.h>
#include <windows.h>

void main()
{
LARGE_INTEGER l1, l2, l3, l4, l5;


l1.QuadPart = 0x123456789abcdef;
l2.QuadPart = 0x789456789abcdef;

std::cout << "l1=" << l1.QuadPart << std::endl;
std::cout << "l1Low =" << l1.LowPart << "l1High =" << l1.HighPart <<
std::endl;
std::cout << "l2=" << l1.QuadPart << std::endl;

l3.QuadPart = l1.QuadPart + l2.QuadPart;
std::cout << "l3=" << l1.QuadPart << std::endl;

l4.QuadPart = 123489467941228165;
l5.QuadPart = 625027070285028318;
std::cout << "l4=" << l1.QuadPart << std::endl;
std::cout << "l5=" << l1.QuadPart << std::endl;
std::
cout << "compare l3 & l4=" << ((l3.QuadPart == l4.QuadPart) ? "true" :
"false") << std::endl;
std::
cout << "compare l3 & l5=" << ((l3.QuadPart == l5.QuadPart) ? "true" :
"false") << std::endl;
std::cout << std::endl;

}



Effectivement c'était pas super compliqué...
Bon bein... heu... J'essaierai de faire mieux la prochaine fois.
Avatar
Pierre Maurette
Gilles Vollant, le 03/09/2005, a écrit :
"Cyrcocq" a écrit dans le message de news:
4318d597$0$21295$

Je cherche à:

*afficher un LARGE_INTEGER
Faut il redefinir le << ou y a t'il d'autre solutions?
(en fait je cherche à mettre ce LARGE_INTEGER dans une chaine pour un
affichage dans une messagebox)

* Comparer 2 LARGE_INTEGER
mais le == n'est pas défini pour eux

* Soustraire 2 LARGE_INTEGER
Mais il faut un opérateur spécial que je ne retrouve pas.

* effectuer une division non entiere entre 2 LARGE_INTEGER



LARGE_INTEGER est un type defini comme une union
utilisez le membre QuadPart (LONGLONG donc __int64) pour les opération
entiere 64 bits.



Exemple :

#include <iostream>
#include <stdio.h>
#include <windows.h>

void main()
{
LARGE_INTEGER l1, l2, l3, l4, l5;


l1.QuadPart = 0x123456789abcdef;
l2.QuadPart = 0x789456789abcdef;

std::cout << "l1=" << l1.QuadPart << std::endl;
std::cout << "l1Low =" << l1.LowPart << "l1High =" << l1.HighPart <<
std::endl;
std::cout << "l2=" << l1.QuadPart << std::endl;

l3.QuadPart = l1.QuadPart + l2.QuadPart;
std::cout << "l3=" << l1.QuadPart << std::endl;

l4.QuadPart = 123489467941228165;
l5.QuadPart = 625027070285028318;
std::cout << "l4=" << l1.QuadPart << std::endl;
std::cout << "l5=" << l1.QuadPart << std::endl;



C'est voulu qu'il n'y ait que de l1 en sortie, ou est-ce un abus de
copier / coller ?

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette
Avatar
Pierre Maurette
Cyrcocq, le 03/09/2005, a écrit :
"Zorro" a écrit dans le message de news:


[...]
Si tu utilises windows, les __int64 ne te suffisent pas?



En l'occurence, c'est une valeur renvoyée qui est en LARGE_INTEGER
Donc, j'y peux rien, c'est des LARGE_INTEGER.



Peut-être auriez vous intérêt à convertir au plus près de la fonction
en le type 64bits que vous avez l'habitude d'utiliser (__int64,
int64_t, etc.).
Si vous menez des calculs sur ces valeurs, vous y gagneriez en
lisibilité du code (en fait, vous rédigez l'illisible une fois pour
toutes, puis le cachez par exemple dans un .h) et peut-être en
performance.
Vous pourriez essayer de "wrapper" les fonctions concernées pour en
modifier l'interface, soit par une macro, soit par une fonction (inline
si possible).
Le cas le plus compliqué serait quand le LARGE_INTEGER sera au fin fond
d'une structure. Mais ce n'est pas la mer à boire.
Les images mémoire d'un __int64 et du LARGE_INTEGER de même valeur sont
identiques. Donc, un simple cast sauvage de pointeur permettra de
passer d'un type à l'autre sans effet sur le code généré. Par exemple:

extern void g(LARGE_INTEGER);
extern void f(LARGE_INTEGER*);



inline void g_int64_1(__int64 x){
LARGE_INTEGER li;
li.QuadPart = x;
g(li);
}

// ou mieux:

inline void g_int64_2(__int64 x){
g(*((LARGE_INTEGER*)&x));
}

inline void f_int64(__int64* px){
f((LARGE_INTEGER*)px);
}

A partir du même schéma *((type1*)&VARtype2) -> VARtype1, vous pouvez
écrire des macros de conversion.


--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette
Avatar
Gilles Vollant
"Pierre Maurette" a écrit
dans le message de news:

C'est voulu qu'il n'y ait que de l1 en sortie, ou est-ce un abus de copier
/ coller ?



C'étais pour voir si tout le monde suivait :-)