Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ça se fait, ça ?

58 réponses
Avatar
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\n", tab[0]);
#ifdef PETRUS1
printf("%d\n", 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\n", tab[0]);
if(commutateur)printf("%d\n", 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

10 réponses

1 2 3 4 5
Avatar
Xavier Roche
et dans la série test d'acuité visuelle : "??/??/??"[3] == '/'/'/'/'*'*'*'


A propos, quelqun sait pourquoi ces machins ont été introduits dans ISO
C ? Le clavier du mec qui a fait la spec était baisé et les touches
[,],etc. n'étaient plus fonctionnelles ?

Avatar
Pascal Bourguignon
Xavier Roche writes:

et dans la série test d'acuité visuelle : "??/??/??"[3] == '/'/'/'/'*'*'*'


A propos, quelqun sait pourquoi ces machins ont été introduits dans
ISO C ? Le clavier du mec qui a fait la spec était baisé et les
touches [,],etc. n'étaient plus fonctionnelles ?


??/ =

C'est une question d'encodage.

On peut avoir à travailler avec un terminal ISO-646-FR (une version
française d'ASCII), où il n'y a pas de caractère , le code ASCII de
étant utilisé pour encoder ç en ISO-646-FR. Dans ce cas, on est
content de pouvoir entrer un en saisissant ??/.


On peut aussi avoir à programmer en C sur un ordinateur qui ne
travaille pas avec le code ASCII du tout. Par exemple, si on veut
programmer en C sur un CDC-3000, on n'a que:

: A-Z 0-9 + - * / ( ) $ = space , . # [ ] % " _ ! & ' ? < > @ ^ ;

pas d'accolade et pas de minuscules. Alors on est content de pouvoir
taper son programme C ainsi:

INT MAIN(INT ARGC,CHAR* ARGV)??<
IF((ARGC==1)??!??!(ARGC==2))??<
PRINTF("GOOD??/n");
??>ELSE??<
PRINTF("BAD??/n");
??>
??>


--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.


Avatar
Mihamina (R12y) Rakotomandimby
Makkhdyn - :

leniveau de Pierre était apparemment bas :
- "Je dois non seulement faire des progrès en C"


Tu es nouveau sur le groupe.
Fait une recherche sur google groups avec les mots clés
"group:fr.comp.lang.c author:Pierre author:Maurette"
Tu verra qu'en fait c'est toi le débutant par rapport à lui.

Avatar
Mihamina (R12y) Rakotomandimby
Pascal Bourguignon - :

Alors on est content de pouvoir
taper son programme C ainsi:

INT MAIN(INT ARGC,CHAR* ARGV)??<
IF((ARGC==1)??!??!(ARGC==2))??<
PRINTF("GOOD??/n");
??>ELSE??<
PRINTF("BAD??/n");
??>
??>


Peut-on vraiment etre content de ce genre de malheur?

Avatar
Thierry B.
--{ Pascal Bourguignon a plopé ceci: }--

: A-Z 0-9 + - * / ( ) $ = space , . # [ ] % " _ ! & ' ? < > @ ^ ;

C'est pas un peu l'équivalent du Baudot ?


INT MAIN(INT ARGC,CHAR* ARGV)??<
IF((ARGC==1)??!??!(ARGC==2))??<
PRINTF("GOOD??/n");
??>ELSE??<
PRINTF("BAD??/n");
??>
??>


Mon gcc a vomi partout sur le clavier :)

--
David Lightman: What is the primary goal?
Joshua: You should know, Professor. You programmed me.
David Lightman: C'mon. What is the primary goal?
Joshua: To win the game.

Avatar
Pascal Bourguignon
"Mihamina (R12y) Rakotomandimby" writes:

Pascal Bourguignon - :

Alors on est content de pouvoir
taper son programme C ainsi:

INT MAIN(INT ARGC,CHAR* ARGV)??<
IF((ARGC==1)??!??!(ARGC==2))??<
PRINTF("GOOD??/n");
??>ELSE??<
PRINTF("BAD??/n");
??>
??>


Peut-on vraiment etre content de ce genre de malheur?


Bin oui! Bien sur, on ne va pas s'amuser à écrire ça à la main, mais
ça peut aider pour bootstrapper un système avec un plus grand jeu de
caractère.

--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.


Avatar
Jean-Marc Bourguet
Pascal Bourguignon writes:

Xavier Roche writes:

et dans la série test d'acuité visuelle : "??/??/??"[3] == '/'/'/'/'*'*'*'


A propos, quelqun sait pourquoi ces machins ont été introduits dans
ISO C ? Le clavier du mec qui a fait la spec était baisé et les
touches [,],etc. n'étaient plus fonctionnelles ?


??/ =

C'est une question d'encodage.

On peut avoir à travailler avec un terminal ISO-646-FR (une version
française d'ASCII), où il n'y a pas de caractère , le code ASCII de
étant utilisé pour encoder ç en ISO-646-FR. Dans ce cas, on est content
de pouvoir entrer un en saisissant ??/.


Il me semble me souvenir que ISO impose des contraintes sur la
compatibilite avec ses autres normes.

Le probleme etait reel dans les annees 80, mais il a quasiment disparu dans
les annees 90. Et on peut douter que la solution choisie etait la
meilleure possible. Mais c'est toujours facile de juger les choix faits
par apres.

A noter que la derniere fois que le sujet est apparu dans clc, il s'est
trouve quelqu'un pour declarer les utiliser (sur des IBM avec de l'EBCDIC).

On peut aussi avoir à programmer en C sur un ordinateur qui ne
travaille pas avec le code ASCII du tout. Par exemple, si on veut
programmer en C sur un CDC-3000, on n'a que:

: A-Z 0-9 + - * / ( ) $ = space , . # [ ] % " _ ! & ' ? < > @ ^ ;

pas d'accolade et pas de minuscules. Alors on est content de pouvoir
taper son programme C ainsi:


Si on n'a pas de minuscules, faire une implementation conforme du C est
impossible; ce n'est donc pas un argument en faveur des trigraphes.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Pierre Maurette

[...]

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 ##.


J'ai un peu regardé de ce coté.

Je suis tombé sur ce lien:
<URL:http://www.thescripts.com/forum/thread213073.html>
et il m'a semblé reconnaitre du code très pratique que j'avais récupéré
de Emmanuel Delahaye, pour au départ printer une série de sizeof(type).
Quand j'ai regardé les signatures, j'ai compris ;-)

J'ai aussi essayé en Python. Je pensais que ce serait très simple. Ce
n'est pas compliqué, mais ça demande quand même un minimum d'analyse si
on ne veut pas trop de contraintes sur l'écriture du code. Ou alors il
faut être Regex langue maternelle.

J'en suis resté à:

[main.c]
/* ... */
/* declare & define
* void func_1(int* tab);
* void func_2(int* tab);
* void func_3(int* tab);
*/
#define PETRUS -1
#include "testfunc.c"
/* ... */

[testfunc.c]
#ifdef PETRUS

#if PETRUS != -1

#define ENBOUCLE(nom) size_t nom; for(nom = 0; nom < PETRUS; nom++)
#define CONCAT(x, y) x ## y
#define XCONCAT(x, y) CONCAT(x, y)

void XCONCAT(func_, PETRUS)(int* tab)
{
// printf("%dn", tab[0]);
//#if PETRUS > 1
// printf("%dn", tab[1]);
//#if PETRUS > 2
// printf("%dn", tab[2]);
//
//#endif // PETRUS > 2
//#endif // PETRUS > 1

ENBOUCLE(curseur){printf("%dn", tab[curseur]);}
}
#undef CONCAT
#undef XCONCAT
#undef ENBOUCLE

#else // PETRUS == -1

#undef PETRUS
#define PETRUS 1
#include "testfunc.c"

#undef PETRUS
#define PETRUS 2
#include "testfunc.c"

#undef PETRUS
#define PETRUS 3
#include "testfunc.c"

#undef PETRUS

#endif // PETRUS == -1

#endif // #ifdef PETRUS


Je considère que même si un compilateur donné ne génère pas plusieurs
fois le code quand on lui passe une valeur en paramètre, il est au
moins capable de faire au mieux (dérouler la boucle si c'est bien)
quand il traite un for(;;) à bornes constantes.

J'ai renoncé à automatiser la boucle sur la valeur de PETRUS. C'est je
pense faisable mais très galère.

--
Pierre Maurette

Avatar
Jean-Marc Bourguet
Pierre Maurette writes:

J'ai renoncé à automatiser la boucle sur la valeur de PETRUS. C'est je
pense faisable mais très galère.


Tu peux regarder boost (www.boost.org). C'est essentiellement une
bibliotheque C++, mais il y a une section "preprocessor metaprogramming"
qui doit etre utilisable en C, au minimum, les techniques y sont exportables.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Antoine Leca
En news:,
Marc Boyer va escriure:
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.




En gros, tu (Makkhdyn) as oublié une des règles de base de Usenet, suivre un
peu un groupe avant de participer utilement.


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.


OUI. Et ce n'est vrai que pour le C, c'est une règle assez générale.

A part Antoine Leca (et Gabriel, qui ne passe
plus), je pense que nous pouvons tous faire des progrès en C.


Pour Gaby, je ne sais pas. Pour moi, je n'ai aucun doute sur le fait que
j'ai encore une grande marge de progrès possible.

Par ailleurs, il y a d'autres contributeurs (je ne vais pas en citer car
cela facherait ceux que j'oublierais; de tête j'en ai au moins 5, parmi ceux
qui ont posté ce mois-ci) qui n'ont pas vraiment besoin de conseil, et pour
qui les plus grands progrès sont derrière eux.


Antoine



1 2 3 4 5