OVH Cloud OVH Cloud

Calcul de parité (was: Nombre Pair et Variable)

15 réponses
Avatar
Jean-Marc
Hello,

le petit problème de calcul de lma parité m'a amusé et j'ai continué
encore un peu. Nous avions vu que l'implémentation la plus rapide était

EstPair = ((n and 1)=0)

J'ai poussé l'exercice en faisant la même chose en C, puis en mixant
les 2: Programme en VB et appel de la fonction codée en C dans une DLL.

Les résultats sont la, ils sont sympas:
http://membres.lycos.fr/jeanmarcn/bench/bench3.htm

Ils confirment ce que je pense et défend depuis longtemps: Pour des
besoins ponctuels, genre calcul ou manipulations de chaînes de
caractères, le compromis "programme en VB, calcul en C" est tout à fait
efficace et adapté. On garde toute la simplicité de VB et on code les
fonctions demandant de hautes performance en C. Evidemment, cela n'a de
sens que pour de gros calculs, devant s'effectuer un très grand nombre
de fois.
--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ; _no_spam_jean_marc_n2@yahoo.fr

5 réponses

1 2
Avatar
Patrice Henrio
J'ajoute bien entendu moi aussi un grand merci, même si mes occupations
actuelles ne me permettent pas de libérer du temps avant une semaine pour
tester toute cela.
En tout cas je cherchais ce genre de chose depuis un moment.

"pas-de-spam>Wanadoo.fr Wanadoo.fr >" <"pas-de-spam> a écrit dans le message
de news: 42caed84$0$3143$
Jean-Marc a écrit :

A tous:

Merci pour les mercis, content que ça puisse aider :-)

Sérieusement, il y a beaucoup de cas concrets ou l'utilisation
de fonctions codées dans un autre langage se révèle payant. Le
C se prête particulièrement bien à l'exercice car c'est un
langage généraliste, très utilisé (il est facile de trouver du
code, la littérature est abondante) et bénéficiant de performances
élevées en terme de vitesse d'exécution (les compilateurs C génèrent
du code efficace).





Parfaitement d'accord avec toi.

Mais programmeur autodidacte j'ai lu l'excellent "Programmer en C++" de C.
Delannoy et j'ai compris que l'investissement en temps pour retrouver de
l'aisance dans la conception des interfaces utilisateur par rapport à ma
connaissance de VB, était prohibitif.

Plus maintenant !

comme quoi ça sert de lire les posts de ce NG.

Christophe


Avatar
Patrice Henrio
Je viens de tester ton tutorial : c'est très bien et très clair. J'ai réussi
à faire une dll.
J'ai un gros bouquin sur la programmation, "Visual C++6" de chez "Solutions
développeurs" et ils n'indiquent pas du tout comment s'y prendre pour
réussir une dll, en particulier ce qui concerne le stdcall
J'ai deux questions
1) comment faire pour indiquer au programme vb que la dll doit être
recherchée dans le répertoire de l'application sacahnt que ce ne sera pas le
même en compilation ou en exécution : mon but n'est pas
de partager une fonction avec plusieurs programmes mais uniquement
d'améliorer le temps d'exécution.
2) j'ai essayé de faire une fonction qui utilise une structure de données
comme dans le tutoriel dont tu indiques l'adresse, mais en utilisant ta
méthode : j'ai eu une erreur dés la compilation et je ne la comprends pas
(je fais sûrement quelque chose qu'il ne faut pas mais quoi ?). Je te file
le code pour que tu me dises ce qui cloche.


/*definition du symbole export*/
#define export _declspec (dllexport)

/* inclusion des librairies nécessaires */
#include<stdlib.h>
#include<stdio.h>


struct Pt {
long X;
long Y;
};


/* prototype d'export*/
export int _stdcall EstPair (long n);
export int _stdcall Phi (long Gauche,long Droite,long Haut, long Bas, long
X, long Y);
export int _stdcall Psi (Pt A, Pt B);

/* définition de la fonction */
int _stdcall EstPair(long n)

{
return ((n & 1)==0);
}


int _stdcall Phi(long Gauche,long Droite,long Haut, long Bas, long X, long
Y)

{
int Resultat;

if ((X<Gauche)||(X>Droite)||(Y<Haut)||(Y>Bas))
Resultat=-1;
else if ((X>Gauche)&&(X<Droite)&&(Y>Haut)&&(Y<Bas))
Resultat=1;
else
Resultat=0;


return Resultat;
}

int _stdcall Psi (Pt A, Pt B)
{
return (A.X-B.X);
}


--------------------Configuration: test - Win32 Debug--------------------
Compiling...
main.c
D:Histoiredlltestmain.c(18) : error C2146: syntax error : missing ')'
before identifier 'A'
D:Histoiredlltestmain.c(18) : error C2061: syntax error : identifier 'A'
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ';'
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ','
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ')'
D:Histoiredlltestmain.c(44) : error C2146: syntax error : missing ')'
before identifier 'A'
D:Histoiredlltestmain.c(44) : error C2061: syntax error : identifier 'A'
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ';'
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ','
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ')'
Error executing cl.exe.

test.dll - 10 error(s), 0 warning(s)



"Jean-Marc" a écrit dans le message de news:
42c9842f$0$329$
"Patrice Henrio" a écrit dans le message de
news:
C'est vrai que ça donne envie de se mettre au C

J'ai déjà essayé mais j'ai du mal à trouver un exemple de dll pour
comprendre comment ça fonctionne (si quelqu'un a un exemple) et surtout
de
comment l'appeler ensuite à partir de Vb.



Hello,

voici un petit tutorial, pas à pas:

http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm

Il reprend comme exemple le codage de la fonction EstPairC.
Il donne aussi un lien vers un vrai tutorial très bien fait
et très complet.

Bonne lecture!

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;




Avatar
jean-marc
Hello,
1) emplacement Dll
- La bonne façon est de la placer dans le répertoire de WindowsSystem
et de la registrer avec regsvr32.
- Plus simplment, il suffit de toujours placer la dll dans le répertoire de
l'appli,
y compris en dévelloppement. Il suffit alors de ne pas mentionner de chemin
dans le "Declare ..."
- On doit pouvoir aussi jouer avec App.path, faut voir.

Note: tu peux demander au linker de toujours générer la dll dans
le répertoire ou tu développes ton pgm VB. Ca règle aussi le problème.

// Il faut tester tout ça, mais c'est l'idée générale.

2) Erreur de compilation.
C'est tout simple. En C, il faut un typedef quand on veut définir un type.
Le mot clé struct ne suffit pas.
VOila ce qu'il faut changer:

typedef struct _Pt {
long X;
long Y;
}Pt;

et du coup:
--------------------Configuration: ng4864 - Win32 Debug--------------------
Compiling...
test.c
Linking...
Creating library Debug/ng4864.lib and object Debug/ng4864.exp

ng4864.dll - 0 error(s), 0 warning(s)

Ca roule :o)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;

"Patrice Henrio" wrote in message
news:
Je viens de tester ton tutorial : c'est très bien et très clair. J'ai


réussi
à faire une dll.
J'ai un gros bouquin sur la programmation, "Visual C++6" de chez


"Solutions
développeurs" et ils n'indiquent pas du tout comment s'y prendre pour
réussir une dll, en particulier ce qui concerne le stdcall
J'ai deux questions
1) comment faire pour indiquer au programme vb que la dll doit être
recherchée dans le répertoire de l'application sacahnt que ce ne sera pas


le
même en compilation ou en exécution : mon but n'est pas
de partager une fonction avec plusieurs programmes mais uniquement
d'améliorer le temps d'exécution.
2) j'ai essayé de faire une fonction qui utilise une structure de données
comme dans le tutoriel dont tu indiques l'adresse, mais en utilisant ta
méthode : j'ai eu une erreur dés la compilation et je ne la comprends pas
(je fais sûrement quelque chose qu'il ne faut pas mais quoi ?). Je te file
le code pour que tu me dises ce qui cloche.


/*definition du symbole export*/
#define export _declspec (dllexport)

/* inclusion des librairies nécessaires */
#include<stdlib.h>
#include<stdio.h>


struct Pt {
long X;
long Y;
};


/* prototype d'export*/
export int _stdcall EstPair (long n);
export int _stdcall Phi (long Gauche,long Droite,long Haut, long Bas, long
X, long Y);
export int _stdcall Psi (Pt A, Pt B);

/* définition de la fonction */
int _stdcall EstPair(long n)

{
return ((n & 1)==0);
}


int _stdcall Phi(long Gauche,long Droite,long Haut, long Bas, long X, long
Y)

{
int Resultat;

if ((X<Gauche)||(X>Droite)||(Y<Haut)||(Y>Bas))
Resultat=-1;
else if ((X>Gauche)&&(X<Droite)&&(Y>Haut)&&(Y<Bas))
Resultat=1;
else
Resultat=0;


return Resultat;
}

int _stdcall Psi (Pt A, Pt B)
{
return (A.X-B.X);
}


--------------------Configuration: test - Win32 Debug--------------------
Compiling...
main.c
D:Histoiredlltestmain.c(18) : error C2146: syntax error : missing ')'
before identifier 'A'
D:Histoiredlltestmain.c(18) : error C2061: syntax error : identifier


'A'
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ';'
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ','
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ')'
D:Histoiredlltestmain.c(44) : error C2146: syntax error : missing ')'
before identifier 'A'
D:Histoiredlltestmain.c(44) : error C2061: syntax error : identifier


'A'
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ';'
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ','
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ')'
Error executing cl.exe.

test.dll - 10 error(s), 0 warning(s)



"Jean-Marc" a écrit dans le message de


news:
42c9842f$0$329$
> "Patrice Henrio" a écrit dans le message de
> news:
>> C'est vrai que ça donne envie de se mettre au C
>>
>> J'ai déjà essayé mais j'ai du mal à trouver un exemple de dll pour
>> comprendre comment ça fonctionne (si quelqu'un a un exemple) et surtout
>> de
>> comment l'appeler ensuite à partir de Vb.
>
> Hello,
>
> voici un petit tutorial, pas à pas:
>
> http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
>
> Il reprend comme exemple le codage de la fonction EstPairC.
> Il donne aussi un lien vers un vrai tutorial très bien fait
> et très complet.
>
> Bonne lecture!
>
> --
> Jean-marc
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
>




Avatar
Patrice Henrio
Tout simplement génial.

Quand je pense que dans l'ouvrage cité et qui m'a quand même coûté pas loin
de 50 ? ils n'expliquent rien de tout cela !!!

A moins que la syntaxe de C++ soit très différente de celle du C ?


"jean-marc" a écrit dans le message de news:
42d78f19$0$322$
Hello,
1) emplacement Dll
- La bonne façon est de la placer dans le répertoire de WindowsSystem
et de la registrer avec regsvr32.
- Plus simplment, il suffit de toujours placer la dll dans le répertoire
de
l'appli,
y compris en dévelloppement. Il suffit alors de ne pas mentionner de
chemin
dans le "Declare ..."
- On doit pouvoir aussi jouer avec App.path, faut voir.

Note: tu peux demander au linker de toujours générer la dll dans
le répertoire ou tu développes ton pgm VB. Ca règle aussi le problème.

// Il faut tester tout ça, mais c'est l'idée générale.

2) Erreur de compilation.
C'est tout simple. En C, il faut un typedef quand on veut définir un type.
Le mot clé struct ne suffit pas.
VOila ce qu'il faut changer:

typedef struct _Pt {
long X;
long Y;
}Pt;

et du coup:
--------------------Configuration: ng4864 - Win32
Debug--------------------
Compiling...
test.c
Linking...
Creating library Debug/ng4864.lib and object Debug/ng4864.exp

ng4864.dll - 0 error(s), 0 warning(s)

Ca roule :o)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;

"Patrice Henrio" wrote in message
news:
Je viens de tester ton tutorial : c'est très bien et très clair. J'ai


réussi
à faire une dll.
J'ai un gros bouquin sur la programmation, "Visual C++6" de chez


"Solutions
développeurs" et ils n'indiquent pas du tout comment s'y prendre pour
réussir une dll, en particulier ce qui concerne le stdcall
J'ai deux questions
1) comment faire pour indiquer au programme vb que la dll doit être
recherchée dans le répertoire de l'application sacahnt que ce ne sera pas


le
même en compilation ou en exécution : mon but n'est pas
de partager une fonction avec plusieurs programmes mais uniquement
d'améliorer le temps d'exécution.
2) j'ai essayé de faire une fonction qui utilise une structure de données
comme dans le tutoriel dont tu indiques l'adresse, mais en utilisant ta
méthode : j'ai eu une erreur dés la compilation et je ne la comprends pas
(je fais sûrement quelque chose qu'il ne faut pas mais quoi ?). Je te
file
le code pour que tu me dises ce qui cloche.


/*definition du symbole export*/
#define export _declspec (dllexport)

/* inclusion des librairies nécessaires */
#include<stdlib.h>
#include<stdio.h>


struct Pt {
long X;
long Y;
};


/* prototype d'export*/
export int _stdcall EstPair (long n);
export int _stdcall Phi (long Gauche,long Droite,long Haut, long Bas,
long
X, long Y);
export int _stdcall Psi (Pt A, Pt B);

/* définition de la fonction */
int _stdcall EstPair(long n)

{
return ((n & 1)==0);
}


int _stdcall Phi(long Gauche,long Droite,long Haut, long Bas, long X,
long
Y)

{
int Resultat;

if ((X<Gauche)||(X>Droite)||(Y<Haut)||(Y>Bas))
Resultat=-1;
else if ((X>Gauche)&&(X<Droite)&&(Y>Haut)&&(Y<Bas))
Resultat=1;
else
Resultat=0;


return Resultat;
}

int _stdcall Psi (Pt A, Pt B)
{
return (A.X-B.X);
}


--------------------Configuration: test - Win32 Debug--------------------
Compiling...
main.c
D:Histoiredlltestmain.c(18) : error C2146: syntax error : missing ')'
before identifier 'A'
D:Histoiredlltestmain.c(18) : error C2061: syntax error : identifier


'A'
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ';'
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ','
D:Histoiredlltestmain.c(18) : error C2059: syntax error : ')'
D:Histoiredlltestmain.c(44) : error C2146: syntax error : missing ')'
before identifier 'A'
D:Histoiredlltestmain.c(44) : error C2061: syntax error : identifier


'A'
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ';'
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ','
D:Histoiredlltestmain.c(44) : error C2059: syntax error : ')'
Error executing cl.exe.

test.dll - 10 error(s), 0 warning(s)



"Jean-Marc" a écrit dans le message de


news:
42c9842f$0$329$
> "Patrice Henrio" a écrit dans le message
> de
> news:
>> C'est vrai que ça donne envie de se mettre au C
>>
>> J'ai déjà essayé mais j'ai du mal à trouver un exemple de dll pour
>> comprendre comment ça fonctionne (si quelqu'un a un exemple) et
>> surtout
>> de
>> comment l'appeler ensuite à partir de Vb.
>
> Hello,
>
> voici un petit tutorial, pas à pas:
>
> http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
>
> Il reprend comme exemple le codage de la fonction EstPairC.
> Il donne aussi un lien vers un vrai tutorial très bien fait
> et très complet.
>
> Bonne lecture!
>
> --
> Jean-marc
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
>








Avatar
Jean-Marc
La syntaxe de C++ est effectivement différente, mais ce sont surtout les
principes sous-jacents qui sont différents.
- Pour ce qui est des typedef, la syntaxe est la même en C qu'en C++.
- Pour écrire des Dll, les principes sont aussi les mêmes en C qu'en C++ et
la syntaxe est identique (_stdcall, etc).

Pas facile de trouver de bons bouquins. Pour le C, un seul livre est à
conseiller (cette opinion est la miennes, mais elle est partagée par
l'ensemble de la communauté des programmeurs C):
"Le Langage C - norme Ansi, 2eme Edition", B.W. Kernighan & D. Ritchie
Ce sont les 2 inventeurs du langage C.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



"Patrice Henrio" a écrit dans le message de
news:
Tout simplement génial.

Quand je pense que dans l'ouvrage cité et qui m'a quand même coûté pas


loin
de 50 ? ils n'expliquent rien de tout cela !!!

A moins que la syntaxe de C++ soit très différente de celle du C ?


"jean-marc" a écrit dans le message de news:
42d78f19$0$322$
> Hello,
> 1) emplacement Dll
> - La bonne façon est de la placer dans le répertoire de WindowsSystem
> et de la registrer avec regsvr32.
> - Plus simplment, il suffit de toujours placer la dll dans le répertoire
> de
> l'appli,
> y compris en dévelloppement. Il suffit alors de ne pas mentionner de
> chemin
> dans le "Declare ..."
> - On doit pouvoir aussi jouer avec App.path, faut voir.
>
> Note: tu peux demander au linker de toujours générer la dll dans
> le répertoire ou tu développes ton pgm VB. Ca règle aussi le problème.
>
> // Il faut tester tout ça, mais c'est l'idée générale.
>
> 2) Erreur de compilation.
> C'est tout simple. En C, il faut un typedef quand on veut définir un


type.
> Le mot clé struct ne suffit pas.
> VOila ce qu'il faut changer:
>
> typedef struct _Pt {
> long X;
> long Y;
> }Pt;
>
> et du coup:
> --------------------Configuration: ng4864 - Win32
> Debug--------------------
> Compiling...
> test.c
> Linking...
> Creating library Debug/ng4864.lib and object Debug/ng4864.exp
>
> ng4864.dll - 0 error(s), 0 warning(s)
>
> Ca roule :o)
>
> --
> Jean-marc
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>
> "Patrice Henrio" wrote in message
> news:
>> Je viens de tester ton tutorial : c'est très bien et très clair. J'ai
> réussi
>> à faire une dll.
>> J'ai un gros bouquin sur la programmation, "Visual C++6" de chez
> "Solutions
>> développeurs" et ils n'indiquent pas du tout comment s'y prendre pour
>> réussir une dll, en particulier ce qui concerne le stdcall
>> J'ai deux questions
>> 1) comment faire pour indiquer au programme vb que la dll doit être
>> recherchée dans le répertoire de l'application sacahnt que ce ne sera


pas
> le
>> même en compilation ou en exécution : mon but n'est pas
>> de partager une fonction avec plusieurs programmes mais uniquement
>> d'améliorer le temps d'exécution.
>> 2) j'ai essayé de faire une fonction qui utilise une structure de


données
>> comme dans le tutoriel dont tu indiques l'adresse, mais en utilisant ta
>> méthode : j'ai eu une erreur dés la compilation et je ne la comprends


pas
>> (je fais sûrement quelque chose qu'il ne faut pas mais quoi ?). Je te
>> file
>> le code pour que tu me dises ce qui cloche.
>>
>>
>> /*definition du symbole export*/
>> #define export _declspec (dllexport)
>>
>> /* inclusion des librairies nécessaires */
>> #include<stdlib.h>
>> #include<stdio.h>
>>
>>
>> struct Pt {
>> long X;
>> long Y;
>> };
>>
>>
>> /* prototype d'export*/
>> export int _stdcall EstPair (long n);
>> export int _stdcall Phi (long Gauche,long Droite,long Haut, long Bas,
>> long
>> X, long Y);
>> export int _stdcall Psi (Pt A, Pt B);
>>
>> /* définition de la fonction */
>> int _stdcall EstPair(long n)
>>
>> {
>> return ((n & 1)==0);
>> }
>>
>>
>> int _stdcall Phi(long Gauche,long Droite,long Haut, long Bas, long X,
>> long
>> Y)
>>
>> {
>> int Resultat;
>>
>> if ((X<Gauche)||(X>Droite)||(Y<Haut)||(Y>Bas))
>> Resultat=-1;
>> else if ((X>Gauche)&&(X<Droite)&&(Y>Haut)&&(Y<Bas))
>> Resultat=1;
>> else
>> Resultat=0;
>>
>>
>> return Resultat;
>> }
>>
>> int _stdcall Psi (Pt A, Pt B)
>> {
>> return (A.X-B.X);
>> }
>>
>>
>> --------------------Configuration: test - Win32


Debug--------------------
>> Compiling...
>> main.c
>> D:Histoiredlltestmain.c(18) : error C2146: syntax error : missing


')'
>> before identifier 'A'
>> D:Histoiredlltestmain.c(18) : error C2061: syntax error :


identifier
> 'A'
>> D:Histoiredlltestmain.c(18) : error C2059: syntax error : ';'
>> D:Histoiredlltestmain.c(18) : error C2059: syntax error : ','
>> D:Histoiredlltestmain.c(18) : error C2059: syntax error : ')'
>> D:Histoiredlltestmain.c(44) : error C2146: syntax error : missing


')'
>> before identifier 'A'
>> D:Histoiredlltestmain.c(44) : error C2061: syntax error :


identifier
> 'A'
>> D:Histoiredlltestmain.c(44) : error C2059: syntax error : ';'
>> D:Histoiredlltestmain.c(44) : error C2059: syntax error : ','
>> D:Histoiredlltestmain.c(44) : error C2059: syntax error : ')'
>> Error executing cl.exe.
>>
>> test.dll - 10 error(s), 0 warning(s)
>>
>>
>>
>> "Jean-Marc" a écrit dans le message de
> news:
>> 42c9842f$0$329$
>> > "Patrice Henrio" a écrit dans le message
>> > de
>> > news:
>> >> C'est vrai que ça donne envie de se mettre au C
>> >>
>> >> J'ai déjà essayé mais j'ai du mal à trouver un exemple de dll pour
>> >> comprendre comment ça fonctionne (si quelqu'un a un exemple) et
>> >> surtout
>> >> de
>> >> comment l'appeler ensuite à partir de Vb.
>> >
>> > Hello,
>> >
>> > voici un petit tutorial, pas à pas:
>> >
>> > http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
>> >
>> > Il reprend comme exemple le codage de la fonction EstPairC.
>> > Il donne aussi un lien vers un vrai tutorial très bien fait
>> > et très complet.
>> >
>> > Bonne lecture!
>> >
>> > --
>> > Jean-marc
>> > "There are only 10 kind of people
>> > those who understand binary and those who don't."
>> > mailto: remove '_no_spam_' ;
>> >
>> >
>>
>>
>
>




1 2