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

preprocesseur: Concatenation de chaines

3 réponses
Avatar
Eric Deveaud
Bonjour,

je voudrais savoir si il est possible de concatener des chaines au
niveau du préprocesseur.

je m'explique

je me trouve a devoir écrire un pattern d'expression régulière assez
^complexe. plutôt que d'écrire un truc du genre
#define CHRO_PATTERN "^([[:alnum:]-]+)(_[[:alpha:]]*)?[.]([[:alpha:]]{1})[[:alnum:]]*_([[:alpha:]]{1}[[:digit:]]{2})_([[:digit:]]{2,3})[.]txt"

je'aurais aimer pour des raisons de lisibilité et de maitenance pouvoir
faire un truc du genre

#define CHRO_CHAMPS1 "([[:alnum:]-]+)"
#define CHRO_CHAMPS2 "(_[[:alpha:]]*)"
#define CHRO_CHAMPS3 "([[:alpha:]]{1})"
#define CHRO_CHAMPS4 "([[:alpha:]]{1}[[:digit:]]{2})"
#define CHRO_CHAMPS5 "([[:digit:]]{2,3})"

puis définir le pattern en indiquant que celui-ci se compose de la
manière suivante

pattern = "^" + CHRO_CHAMPS1 + CHRO_CHAMPS2 + "?[.]" + CHRO_CHAMP3 + etc
etc

existe-t il une astuce pour faire ce genre de gymnastique ??

Eric

PS: pour le momment je le fais de manière dynamique, ce qui implique un
calcul de taille, un malloc et son free associé et un snprintf




--
> Quelqu'un aurait-il une solution pour réinitialiser un MBR
Si tu veux qu'il soit complètement blanc (pas souhaitable, à mon avis) :
dd if=/dev/zero of=/dev/hda bs=512k count=1 (sous Linux)
-+- OT in Guide du linuxien (très) pervers - "Pour les K difficiles" -+-

3 réponses

Avatar
Erwann ABALEA
Bonjour,

On Thu, 16 Sep 2004, Eric Deveaud wrote:

je'aurais aimer pour des raisons de lisibilité et de maitenance pouvoir
faire un truc du genre

#define CHRO_CHAMPS1 "([[:alnum:]-]+)"
#define CHRO_CHAMPS2 "(_[[:alpha:]]*)"
#define CHRO_CHAMPS3 "([[:alpha:]]{1})"
#define CHRO_CHAMPS4 "([[:alpha:]]{1}[[:digit:]]{2})"
#define CHRO_CHAMPS5 "([[:digit:]]{2,3})"

puis définir le pattern en indiquant que celui-ci se compose de la
manière suivante

pattern = "^" + CHRO_CHAMPS1 + CHRO_CHAMPS2 + "?[.]" + CHRO_CHAMP3 + etc
etc


"A" "B" == "AB". Partant de là:
pattern = "^" CHRO_CHAMPS1 CHRO_CHAMPS2 "?[.]" CHRO_CHAMPS3 ...

devrait marcher...

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
It's okay to call someone stupid; just don't prove it.

Avatar
Targeur fou
Eric Deveaud wrote:

Bonjour,


Bonjour,


je voudrais savoir si il est possible de concatener des chaines au
niveau du préprocesseur.


oui.

je m'explique

je me trouve a devoir écrire un pattern d'expression régulière assez
^complexe. plutôt que d'écrire un truc du genre
#define CHRO_PATTERN "^([[:alnum:]-]+)(_[[:alpha:]]*)?[.]([[:alpha:]]{1})[[:alnum:]]*_([[:alpha:]]{1}[[:digit:]]{2})_([[:digit:]]{2,3})[.]txt"

je'aurais aimer pour des raisons de lisibilité et de maitenance pouvoir
faire un truc du genre

#define CHRO_CHAMPS1 "([[:alnum:]-]+)"
#define CHRO_CHAMPS2 "(_[[:alpha:]]*)"
#define CHRO_CHAMPS3 "([[:alpha:]]{1})"
#define CHRO_CHAMPS4 "([[:alpha:]]{1}[[:digit:]]{2})"
#define CHRO_CHAMPS5 "([[:digit:]]{2,3})"

puis définir le pattern en indiquant que celui-ci se compose de la
manière suivante

pattern = "^" + CHRO_CHAMPS1 + CHRO_CHAMPS2 + "?[.]" + CHRO_CHAMP3 + etc
etc

existe-t il une astuce pour faire ce genre de gymnastique ??


Enlever les +. Si tu souhaites conserver les + pour la lisibilité, tu ne
pourras pas le faire en C, et là, c'est vrai, on se dit que le type
std::string en C++ est bien sympathique.

Eric

PS: pour le momment je le fais de manière dynamique, ce qui implique un
calcul de taille, un malloc et son free associé et un snprintf



Un autre avantage que tu peux tirer de la solution péprocesseur, outre
l'économie de malloc/free et de sprintf, est de qualifier ta variable
pattern ou ce qui est pointé avec const.

#define CHRO_CHAMPS1 "([[:alnum:]-]+)"
#define CHRO_CHAMPS2 "(_[[:alpha:]]*)"
...
char const * pattern = "^" CHRO_CHAMPS1 CHRO_CHAMPS2 /*...*/ ;
...

Regis

Avatar
Eric Deveaud
Targeur fou wrote:


Eric Deveaud wrote:

Bonjour,


Bonjour,


je voudrais savoir si il est possible de concatener des chaines au
niveau du préprocesseur.


oui.


[SNIP]

#define CHRO_CHAMPS1 "([[:alnum:]-]+)"
#define CHRO_CHAMPS2 "(_[[:alpha:]]*)"
...
char const * pattern = "^" CHRO_CHAMPS1 CHRO_CHAMPS2 /*...*/ ;
...


[SNIP]

merci à toi et Erwan.

le pattern vas être défini en plusieurs bouts et sera bien évidement
défini en const.

Eric



--
Bon, je recherche toujours un mec qui " touche " sous linux sur rochefort
Il m'arrive de toucher, mais dans ces moments la, je pense pas trop a

linux.
-+- ST in Guide du linuxien pervers : "Linux c'est une affaire de doigté"