Entraides et échanges autour de la technologie Scol - Informations and exchanges on the Scol technology
Vous pouvez changer la langue de l'interface une fois inscrit - You can change the language once registered
You are not logged in.
Pages: 1
Salut !
Soit une fonction Scol admettant, en entrée, une liste (de types quelconques).
Comment taduire en interne cette liste pour avoir une va_list ?
Exemple (C) :
void fonctionVariable (int a, ...)
{
va_list args;
...
}
int fonction (mmachine m)
{
int mlisteScol, element;
mlisteScol = MMpull (m)>>1
while (mlistScol != NIL)
{
element = MTOP (MMfetch (m, mlistScol, 0));
... /* comment ajouter element à une liste d'argument ?? Est-ce possible ?? */
mlistScol = MMfetch (m, mlistScol, 1)>>1;
}
fonctionVariable (10, ??????); /* ma liste d'arguments provenant de la liste Scol ??? */
...
}
Si c'est clair ...!
Ça me simplifierait bien les choses
Offline
Hello,
Tu n'aimes pas le C++, mais là, un bête std::vector remplacerais efficacement le "..." dans la signature de la fonction.
Et je crois me rappeller que ces "va_list" sont vraiment pas recommandés en général (pour moi c'est "forbiden", à ne pas utiliser, et il y a une bonne raison, même si je me rappelle plus pourquoi , mais bon faut avoir des convictions dans la vie ).
Sinon, en fouillant un peu sur le net:
http://bytes.com/topic/c/answers/639132 … on-va_list
Donc à priori, c'est faisable, mais avec un code par plate-forme (voir par compilo étant donné que la bidouille est destinée à s'assurer que la taille des variables ajoutés à la va_list est correcte), ce qui est beaucoup plus lourd à maintenir qu'un std::vector, et ça fait beaucoup plus de code aussi...
Nodrev
Offline
Yop
En fait, j'en ai marre de strcatn : c'est pas pratique du tout.
genre :
strcatn "Alice a " :: (itoa age) :: " ans, habite au " :: (itoa numero) :: " de la rue " :: rue :: " et possède " :: (ftoa compte) :: "euros sur son compte" :: nil;
J'aimerais une sorte de sprintf mais avec une liste Scol du coup car pas possible de passer un nb variable d'arguments en Scol :
strF "Alice a %d ans, habite au %d de la rue %s et possède %f euros sur son compte", age :: numero :: rue :: compte :: nil;
Comme tout codeur, je suis paresseux et cela m'aurait permis ensuite une utilisation directe de sprintf et de renvoyer le résultat tout frais, tout beau
Concernant les va_list, je suis complètement d'accord, c'est à proscrire. Je comptais juste l'utiliser dans ce cas précis (comme les fonctions *printf).
La VM les utilise dans le cas de MMechostr par exemple mais c'est en interne.
Mon problème n'est pas la va_list en elle-même, mais la "conversion" entre la liste Scol provenant d'une application et la liste d'arguments interne à la VM.
Sur un autre forum, des intervenants m'ont donné d'autres idées sans les va_list. Plus long à coder mais le résultat, si résultat il y a, sera effectivement plus propre.
Quant au C++, je sais, pas taper !!
Offline
Ok, j'ai réussi ma strF (string formatted) Le code est à affiner mais il fonctionne.
_fooS strF "%s is a %s language !" "Scol" :: "good" :: nil;
affiche bien "Scol is a good language !"
Ça donne une syntaxe moins exotique que strcatn.
Cependant, j'avais oublié un point important que j'avais déjà étudié à de multiples reprises par le passé : on ne peut pas panacher les types dans une liste Scol !
genre : S :: S :: I :: S :: F :: S :: nil;
(sauf cas r2 voire r3, ... mais ce sont des cas particuliers).
Donc, il faut que la liste ne soit que de récursivité 1 pour que la strF fonctionne (Scol plante logiquement sinon). C'est quelque peu dommage. Donc que des S, des I ou des F ...
Offline
S'il eiste un moyen pour obtenir des listes panachées, le code source est déjà près. Reste juste à le rendre joli
Donc, le prototype de strF est :
strF : fun [S [u0 r1]] S
Pour l'heure, les options %s, %d, %f, %x sont prises en compte mais il est facile d'en ajouter le cas échéant :
_fooS strF "%s is a %s language !" "Scol" :: "good" :: nil; -> Scol is a good language !
_fooS strF "%d + %d = %d" 3 :: 4 :: 7 :: nil; -> 3 + 4 = 7
_fooS strF "J'ai un découvert de %f euros" 1254.25 :: nil -> J'ai un decouvert de 1254.25 euros
_fooS strF "La couleur choisie est : %x" 0x445522 :: nil; -> La couleur choisie est : 445522
Reste aussi à prendre en considération les valeurs liées à ces options : par exemple %.2f ppur n'afficher que 2 décimales aux flottants.
Offline
wouaw, cela me change du Java ^^
ArrayList<String> mesString = new ArrayList<String>();
mesString.add("Canarie");
System.out.println(mesString.get(0));
// affiche sur la console le 1ier élement de la liste: Canarie
Last edited by cyberfred (5-Mar-2011 18:57:04)
Kyle Macstone
Offline
Cela me fait penser que j'ai corrigé depuis mais oublié de poster
strF et son alias sprintf permettent l'usage de chaînes formattées :
Prototype Scol :
fun [S u0] S
Les formats acceptés sont %d, %s, %x, %f standards (respectivement entier, chaine, hexa et flottant).
Le second argument doit être un tuple.
Par exemple :
typeof chaine = S;;
...
set chaine = sprintf "4 / 7 = %f" [4.0 /. 7.0];
_fooS chaine;
set chaine = sprintf "La prise de la %s eut lieu le %d %s %d à %s." ["Bastille" 14 "juillet" 1789 "Paris"];
_fooS chaine;
Sur les chaînes, j'ai codé quelques autres nouvelles fonctions :
strextrS, listextr, strfind2List, strfindAnyChar, strncat, strtruncate, _fooF, _fooFn, strreplace, strF, sprintf, printf.
Ainsi que les PCRE.
Offline
wouaw, cela me change du Java ^^
ArrayList<String> mesString = new ArrayList<String>(); mesString.add("Canarie"); System.out.println(mesString.get(0)); // affiche sur la console le 1ier élement de la liste: Canarie
Oui, le C n'est pas particulièrement simplifié pour les chaînes ! Et Scol encore moins !
Ce n'est pas Nodrev qui me contredira !!
Offline
Pages: 1