Ça se fait, ça ?

Le
Pierre Maurette
Bonjour,

Je sens que mon prochain message sera un "Oooops !" ;-)

Est-il envisageable de faire ça:

[main.c]
#include<stdio.h>

/* declare & define
* void func1(int* tab);
* void func2(int* tab)
*/
#define PETRUS1
#include "testfunc.c"
#undef PETRUS1
#define PETRUS2
#include "testfunc.c"
#undef PETRUS2

int main(void)
{
int tabtest[]= {1, 2, 3};
func1(tabtest);
func2(tabtest);
return 0;
}

[testfunc.c]
#ifdef PETRUS1
void func1(int* tab)
#endif
#ifdef PETRUS2
void func2(int* tab)
#endif
{
printf("%d", tab[0]);
#ifdef PETRUS1
printf("%d", tab[1]);
#endif
}

Le but est de centraliser le code source en évitant quelques boucles
(ou plus généralement des tests) mal placées. Il est clair que je
n'utiliserai un truc tordu comme ça uniquement si les performances le
justifient. En revanche, je ne veux pas dupliquer le code source.

En regardant ce que VC8 générait, il m'a semblé constater que sur des
fonctions de cette forme (mais plus complexes):

void func(int* tab, int commutateur)
{
printf("%d", tab[0]);
if(commutateur)printf("%d", tab[1]);
/* etc. */
}

avec les bonnes options d'optimisation, il pouvait générer deux
fonctions, ou au moins deux blocs avec duplication de certaines parties
du code.

Bonne fin de journée

--
Pierre Maurette
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 6
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Makkhdyn
Le #992211
Bonjour,
Essaye plutôt ceci :

[main.c]
#include #include "testfunc.h"

int main(void){
int tabtest[]= {1, 2, 3};
func(tabtest, 1);
func(tabtest, 2);
return 0;
}

[testfunc.c]
#include "testfunc.c"
void func(int* tab, int max){
int i;
for(i = 0; i < max; ++i){
printf("%dn", tab[i]);
}
}

[testfunc.h]
#ifndef TESTFUNC
#define TESTFUNC

void func(int*, int);

#endif

Beaucoup plus simple et surtout ne nécessite pas d'appels préprocesseurs.

--
I'm trying a new usenet client for Mac, Nemo OS X.
You can download it at http://www.malcom-mac.com/nemo
Pierre Maurette
Le #992209
Bonjour,


Bonjour

Essaye plutôt ceci :

[main.c]
#include #include "testfunc.h"

int main(void){
int tabtest[]= {1, 2, 3};
func(tabtest, 1);
func(tabtest, 2);
return 0;
}

[testfunc.c]
#include "testfunc.c"


??

void func(int* tab, int max){


int ??

int i;
for(i = 0; i < max; ++i){
printf("%dn", tab[i]);
}
}

[testfunc.h]
#ifndef TESTFUNC
#define TESTFUNC

void func(int*, int);

#endif

Beaucoup plus simple et surtout ne nécessite pas d'appels préprocesseurs.


Hum. #include ? #ifndef ? #define ? #endif ?

Je dois non seulement faire des progrès en C, mais également en
expression écrite. Je me suis de toute évidence mal exprimé :-(

--
Pierre Maurette

Marc Boyer
Le #992072
Le 13-06-2007, Pierre Maurette
#define PETRUS1
#include "testfunc.c"
#undef PETRUS1
#define PETRUS2
#include "testfunc.c"
#undef PETRUS2

int main(void)
{
int tabtest[]= {1, 2, 3};
func1(tabtest);
func2(tabtest);
return 0;
}

[testfunc.c]
#ifdef PETRUS1
void func1(int* tab)
#endif
#ifdef PETRUS2
void func2(int* tab)
#endif
{
printf("%dn", tab[0]);
#ifdef PETRUS1
printf("%dn", tab[1]);
#endif
}

Le but est de centraliser le code source en évitant quelques boucles
(ou plus généralement des tests) mal placées. Il est clair que je
n'utiliserai un truc tordu comme ça uniquement si les performances le
justifient. En revanche, je ne veux pas dupliquer le code source.


Quitte à dérouler des boucles à la main, je le ferais plutot avec
le préprocesseur.

On peut aussi générer les identifiant, avec # et ##.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Makkhdyn
Le #992070
#include "testfunc.c"
??

#include "testfunc.h", c'était une faute de copier/collage, désolé.


int i;
int ??

int = integer = entier, donc un nombre. En fait celui-ci va permettre

deparcourir le tableau "tab" et d'en afficher les valeurs jusqu'à atteindre
le nombre "max". C'est un peu comme le système de commutateur dont tu
parlait précédemment, mais en "plus évolué".


[testfunc.h]
#ifndef TESTFUNC
#define TESTFUNC

void func(int*, int);

#endif
Hum. #include ? #ifndef ? #define ? #endif ?

#include permet d'inclure un fichier

#ifndef permet de vérifier si une variable est indéfinie
#define permet de définir une constante de préprocesseur
#endif permet de terminer une condition

Dans le cas présent, tu inclus testfunc.h, seulement pour éviter qu'il ne
soit inclus a plusieurs reprises et que cela ne cause des problèmes lors de
la compilation, nous allons voir avec #ifndef si la constante TESTFUNC a
été déclarée. Si elle ne l'est pas, cela signifie que le préprocesseur
n'est pas encore passé par là, donc a ce moment nous définissons la
constante TESTFUNC et nous appelons les prototypes des fonctions. Le
toutterminé par un #endif, pour signaler que le test de la condition est
terminé. Si jamais le préprocesseur repasse dans le fichier testfunc.h,
étant donné que la constante TESTFUNC aura été déclarée plus tôt,
lepréprocesseur n'analysera pas une seconde fois le contenu de testfunc.h

Je dois non seulement faire des progrès en C, mais également en
expression écrite. Je me suis de toute évidence mal exprimé :-(
Si tu souhaites apprendre le C, je peux te conseiller siteduzero.com, ou

alors developpez.com

--
I'm trying a new usenet client for Mac, Nemo OS X.
You can download it at http://www.malcom-mac.com/nemo


Pierre Maurette
Le #992069
#include "testfunc.c"
??

#include "testfunc.h", c'était une faute de copier/collage, désolé.


int i;
int ??

int = integer = entier, donc un nombre. En fait celui-ci va permettre

deparcourir le tableau "tab" et d'en afficher les valeurs jusqu'à atteindre
le nombre "max". C'est un peu comme le système de commutateur dont tu
parlait précédemment, mais en "plus évolué".


Oui. Mais pour parcourir un tableau de façon "évoluée", on utilise de
préférence un size_t, il me semble.



[testfunc.h]
#ifndef TESTFUNC
#define TESTFUNC

void func(int*, int);

#endif
Hum. #include ? #ifndef ? #define ? #endif ?

#include permet d'inclure un fichier

#ifndef permet de vérifier si une variable est indéfinie
#define permet de définir une constante de préprocesseur
#endif permet de terminer une condition

Dans le cas présent, tu inclus testfunc.h, seulement pour éviter qu'il ne
soit inclus a plusieurs reprises et que cela ne cause des problèmes lors de
la compilation, nous allons voir avec #ifndef si la constante TESTFUNC a
été déclarée. Si elle ne l'est pas, cela signifie que le préprocesseur
n'est pas encore passé par là, donc a ce moment nous définissons la
constante TESTFUNC et nous appelons les prototypes des fonctions. Le
toutterminé par un #endif, pour signaler que le test de la condition est
terminé. Si jamais le préprocesseur repasse dans le fichier testfunc.h,
étant donné que la constante TESTFUNC aura été déclarée plus tôt,
lepréprocesseur n'analysera pas une seconde fois le contenu de testfunc.h

Je dois non seulement faire des progrès en C, mais également en
expression écrite. Je me suis de toute évidence mal exprimé :-(
Si tu souhaites apprendre le C



Non. En fait, j'y renonce.

--
Pierre Maurette



Marc Boyer
Le #992068
Le 13-06-2007, Makkhdyn
Je dois non seulement faire des progrès en C, mais également en
expression écrite. Je me suis de toute évidence mal exprimé :-(
Si tu souhaites apprendre le C, je peux te conseiller siteduzero.com, ou

alors developpez.com


Makkhdyn,

ton aide est sympatique, mais tu lis un peu trop vite, et tu n'as rien
compris ni à la demande (un peu particulière) de Pierre, et tu te
méprends complètement sur son niveau en C.

Quand à conseiller "developpez.com", sur fclc, c'est en général mal vu
;-)

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Makkhdyn
Le #992067
Makkhdyn,

ton aide est sympatique, mais tu lis un peu trop vite, et tu n'as rien
compris ni à la demande (un peu particulière) de Pierre, et tu te
méprends complètement sur son niveau en C.

Quand à conseiller "developpez.com", sur fclc, c'est en général mal vu
;-)


Bonjour Marc,

Apparemment la demande était bien telle que je l'avais comprise, puisque
leniveau de Pierre était apparemment bas :
- "Je dois non seulement faire des progrès en C"
- "En regardant ce que VC8 générait" (Bien que ça soit un préjugé :-° )
- "int ??"

Quand à l'idée de conseiller des sites, même si c'est "mal vu", pour un
débutant mieux vaut passer par là et apprendre plus ou moins par
soi-mêmeplutôt que de poser des questions à tord et à travers (en plus de
cela, je
dois avouer [comme vous avez pu le remarquer] que je suis tout nouveau ici
et que de fait je ne suis pas encore familier avec les règles présentes).

Mais il est vrai que la question de départ en elle même est intéressante,
même si ce n'était apparemment pas ce que cherchait réellement Pierre.

PS: Dans le cas ou je me serais réellement trompé sur son niveau (ce qui me
parait, ma foi, fort peu probable) je tiens a m'en excuser.

--
I'm trying a new usenet client for Mac, Nemo OS X.
You can download it at http://www.malcom-mac.com/nemo

Marc Boyer
Le #992066
Le 13-06-2007, Makkhdyn
Makkhdyn,

ton aide est sympatique, mais tu lis un peu trop vite, et tu n'as rien
compris ni à la demande (un peu particulière) de Pierre, et tu te
méprends complètement sur son niveau en C.

Quand à conseiller "developpez.com", sur fclc, c'est en général mal vu
;-)


Bonjour Marc,

Apparemment la demande était bien telle que je l'avais comprise, puisque
leniveau de Pierre était apparemment bas :
- "Je dois non seulement faire des progrès en C"


Il est modeste. En fait, plus on en connaît en C, plus on sait
qu'on doit apprendre. A part Antoine Leca (et Gabriel, qui ne passe
plus), je pense que nous pouvons tous faire des progrès en C.

- "int ??"


Ben, le but de son post était justement d'éviter le coût d'évaluation
d'une taille, et une boucle. Il s'agit de déroulement de boucle, un
pb classique en ASM.

Quand à l'idée de conseiller des sites, même si c'est "mal vu", pour un
débutant mieux vaut passer par là et apprendre plus ou moins par
soi-mêmeplutôt que de poser des questions à tord et à travers (en plus de
cela, je
dois avouer [comme vous avez pu le remarquer] que je suis tout nouveau ici
et que de fait je ne suis pas encore familier avec les règles présentes).


Oui et non. En général, le forum accueille bien les débutants qui
demandent gentillement, et en français. Et puis c'est surtout que ce
site là a mauvaise presse (mais j'y vais très rarement).

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Marc Boyer
Le #991937
Le 13-06-2007, Harpo
On Wed, 13 Jun 2007 14:31:13 +0000, Marc Boyer wrote:

Oui et non. En général, le forum accueille bien les débutants qui
demandent gentillement, et en français. Et puis c'est surtout que ce
site là a mauvaise presse (mais j'y vais très rarement).


Vous dites ça parce qu'on peut y rencontrer Emdel...


Non, non.

Je l'ai consulté plusieurs fois en le trouvant par des recherches sur
google, j'y ai plutôt vu de bons articles (dans la mesure où j'ai pu les
apprécier).


Je viens d'y faire un saut. Il me semble qu'il y a eut une nette
amélioration depuis la dernière fois. M'enfin bon, on y passe 10mn
et on trouve une bétise (Ex: Les chaînes de caractères sont en fait stockées
dans un tableau de caractères dont la fin est marquée par un caractère
nul, de code ASCII 0 et représenté par le caractère pour ne pas
confondre avec le caractère 0 (zéro) qui à un code ASCII de 48.).

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Makkhdyn
Le #991936
In article Harpo
On Wed, 13 Jun 2007 14:22:46 +0000, Makkhdyn wrote:

PS: Dans le cas ou je me serais réellement trompé sur son niveau (ce qui
me parait, ma foi, fort peu probable) je tiens a m'en excuser.


En fait Pierre Maurette est un faux faux-modeste qui n'y connais rien à
rien, je sais de source sûre que c'est son chien Garrigou qui écrit
sesprogrammes, Petrus les poste ensuite ici pour comprendre comment ils
marchent avant de les désassembler pour les revendre.
Han, apparemment je me suis fais complètement eu :-°


--
I'm trying a new usenet client for Mac, Nemo OS X.
You can download it at http://www.malcom-mac.com/nemo


Publicité
Poster une réponse
Anonyme