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
Bonjour,
Si quelqu'un a une piste / suggestion, qu'il n'hésite pas une seconde !
Je cherche à retourner un objet Scol de type tab S pour avoir un tableau de caractères d'une chaîne quelconque.
char c[2];
int i = 0;
char * string; /* une chaine quelconque */
int size = .... la longueur du tableau à retourner
size = sizeof (char) * strlen (string) + 1;
tabmem = MMmalloc (m, size, TYPETAB);
for (; i < size, i++)
{
c[0] = string[ i];
c[1] = 0;
MMstore (m, tabmem, i, (int) c);
}
MMpush (m, tabmem+tabmem+1);
return 0;
Sous Linux, c'est foireux.
Sous XP, ça ne crashe pas mais je pense que Vista ou 7 crasheront. Peu importe, le résultat est que :
- un sizetab de ce que me retourne la fonction me donne la bonne valeur : le nombre de cases du tableau est ok (donc ça c'est ok).
- les valeurs des cases ne sont pas correctes : soit les cases sont 'vides' (même pas à NIL), soit elles ont toute la même valeur.
En revanche, le même code retournant un tableau d'entiers (tab I) ne pose aucun problème.
J'ai essayé sans passer par les macros / fonctions :
char * c; /* à la place de char c[2]; */
m->tape[tabmem+SizeHeader] = size;
for (; i < size; i++)
{
c = (char *) &m->tape[ i];
c[0] = string[ i];
c[1] = 0;
}
m->top[m->pp] = tabmem+tabmem+1;
J'ai tenté plusieurs variantes au niveau de c = (char *) &m->tape[ i];. J'ai de meilleurs résultats mais je n'ai toujours pas toutes les bonnes valeurs dans les cases du tableau (et parfois certains index font crasher Scol : tableau.x passe et tableau.y fait crasher, y étant bien sur < à la taille du tableau retourné par sizetab).
Bref, si vous avez une piste pour éclairer ma petite lanterne .. ;-)
Offline
Bon, en fait, je me suis escagassé à vouloir garder le type Scol tab S mais ça me fout un bordel monstre ensuite ...
Donc, la solution est de ne pas garder ce type mais d'en créer un nouveau et à partir de là, ça roule tout seul
Cela dit, le problème ci-dessus reste entier : comment coder convenablement un tab S en sortie .... ?
Le problème n'est pas véritablement le tableau lui-même, c'est facile de sortir un tab S comme montré au-dessus. C'est après que ça se corse. Les fonctions internes du noyau ne gère pas les char en tant que tel mais sous forme de char * ("c\0").
Offline
Yop
Le tableau devrait contenir des pointer de S scol existant dans la pile
essais avec ça :
(pas testé si ça compile c'est du bol)
static int StringToTab(mmachine m)
{
int i ,s, t, len;
char* str;
char c[2];
s= MTOP(MMget(m,0));
if (s == NIL)
return 0;
// get the string from Scol
str = MMstartstr(m, s);
// get the string size
len = MMsizestr(m, s);
// tab with string size
t = MMmalloc(m, len, TYPETAB);
if (t==NIL) return MERRMEM;
for(i=0; i<len; i++)
{
c[0] = str[i];
c[1] = 0;
//push the string in scol
Mpushstrbloc(m, c);
//store in tab the last string ptr
MMstore(m, t, i, MMpull());
}
MMset(m, 0, PTOM(t));
return 0;
}
Offline
Ça compile (en rajoutant le 'm' dans le MMpull de MMstore ). Ça résoud peut être le pb de création de tab S (là, j'ai pas testé, je lui ai juste fait un tour de compilo), je testerai plus tard mais ça ne résoud pas mon pb initial car tu as bien un tableau de char[2] et non un tableau de char.
Mpushstrbloc prend un char * et non un char (et le fait de lui donner un char[2] n'est pas valide en C normé). Du coup, ta solution fait intervenir la gestion actuelle de la VM qui ne me convient pas
Je le répète, il est possible que ce soit ok si on veut un tableau "classique" tab S.
Une piste serait peut-être une fonction interne de ce type :
int MMpushChar (mmachine m, char c)
{
m->pp--;
m->top[m->pp] = c;
return MMneedMemory (m, 0, sizeof (char));
}
Créer ensuite un nouveau type "C" pour char ?
À vérifier, car il existe déjà la possibilité, dans un package Scol, d'utiliser la notation 'c (apostrophe suivi d'un caractère) pour avoir un équivalent char.
La gestion des char est peut-être déjà possible mais n'aurait jamais été exploité / codé. À creuser.
Offline
il suffit sans doutes de rajouter un (char*)c
Mpushstrbloc(m, (char*)c);
sinon si ce que tu veux est un tableau de bytes
dans ce cas c'est un type [tab I] et tu remplaces le Mpushstrbloc par un
MMpush(ITOM((int)str[i]))
??
ensuite en scol tu fais un ctoa pour récupérer le catactère, mais dans ce cas la solution tab S semble plus directe
(j'aime pas les char suis sur de rien )
Last edited by arkeon (28-Jan-2011 21:22:50)
Offline
C'est à voir, je regarderai ça ce we
Là, pour ma question initiale, j'ai réussi en créant un nouveau type mais l'inconvénient c'est qu'au lieu d'avoir par exemple
machaine[i] pour avoir le i-ème caractère de machaine
set machaine[i] = 'a pour affecter le caractère a à la position i de machaine
je suis obligé de passer par une fonction :
get machaine i
set machaine a i
(ça rejoint un peu nth_char et set_nth_char mais sans devoir passer par la conversion I (ascii) S)
cependant, avec mon nouveau type, je peux aussi supprimer ou ajouter un caractère ou un groupe de caractères, ce qui rend le tableau de caractères dynamique au niveau de Scol sans que le développeur s'en soucie. Je peux aussi appliquer une fonction (callback) pour un traitement sur tout ou partie des caractères. Bref, quelques potentiels supplémentaires par rapport à un tab S.
J'updaterai sur le svn ce we, dans ma bibliothèque test, j'ai déjà une bonne partie de l'API de faite. Mais je regarderai aussi ta solution, voir s'il y a moyen de faire quelque chose avec aussi pour améliorer l'existant
il suffit sans doutes de rajouter un (char*)c
Mpushstrbloc(m, (char*)c);
Oui, mais le compilo va gueuler car c'est pas du C normé et que je m'oblige à suivre la norme (même si je reconnais que parfois ça m'arrangerait de prendre des libertés !!)
Offline
char c[2];
int i = 0;
char * string; /* une chaine quelconque */
int size = .... la longueur du tableau à retournersize = sizeof (char) * strlen (string) + 1;
tabmem = MMmalloc (m, size, TYPETAB);for (; i < size, i++)
{
c[0] = string[ i];
c[1] = 0;
MMstore (m, tabmem, i, (int) c);
}
MMpush (m, tabmem+tabmem+1);
return 0;
Eclaire moi sur les premières lignes: "char* string", c'est déclaré comme tel, ou ça pointe sur une valeur entre ""?
Parce que sinon, tu as un beau pointeur pas initialisé, et tu pointe n'importe ou en mémoire. Donc tu peux écraser une partie de la mémoire (éventuellement utilisée par un autre programme)...
Et si ce n'est pas le cas, ton strlen fais n'awak aussi, il va chercher le premier "\0" qui suit la zone mémoire pointée...
Sinon, pourquoi ne pas se faire une ptite lib String, j'en ai une toute faite si tu veux, plus qu'a la binder à Scol (avec trim, char replace, maj / minuscule, etc, etc...)
Nodrev
Offline
Oublie ma remarque, je lirais mieux ce que tu souhaite la prochaine fois, ma réponse est à coté de la plaque
Par contre, la classe String avec toutes les fonctions peux quand même être "pratrique" (désolé, private joke, pas pu m'en empêcher ).
Offline
Yop
C'est surtout que j'ai tout faux
Ce que j'ai fait c'est "simplement" refaire l'existant, à savoir créer un nouveau type identique à S et y appliquer des fonctions.
Donc oui, faut que je trouve la solution de mon tab S mais en même temps se pose le pb de l'extension d'un tel tableau dynamiquement ...
Offline
Sinon, oui, le C++ pourrait apporter un plus. Mais je n'aime pas le C++ (c'est pas un scoop ! ), surement parce que je ne le connais pas assez pour en tirer avantage
Offline
Pages: 1