Scolring - Forum

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.

#1 28-Jan-2011 14:46:58

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Tableau de caractères - tab S

Bonjour,

Si quelqu'un a une piste / suggestion, qu'il n'hésite pas une seconde ! smile

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

#2 28-Jan-2011 17:45:33

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Tableau de caractères - tab S

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 smile

Cela dit, le problème ci-dessus reste entier : comment coder convenablement un tab S en sortie .... ? hmm

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

#3 28-Jan-2011 18:05:17

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 5,081
Website

Re: Tableau de caractères - tab S

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) wink

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

#4 28-Jan-2011 19:38:05

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Tableau de caractères - tab S

Ça compile (en rajoutant le 'm' dans le MMpull de MMstore tongue). Ç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 smile
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

#5 28-Jan-2011 21:20:15

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 5,081
Website

Re: Tableau de caractères - tab S

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 smile )

Last edited by arkeon (28-Jan-2011 21:22:50)

Offline

#6 28-Jan-2011 23:50:30

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Tableau de caractères - tab S

C'est à voir, je regarderai ça ce we smile

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 smile

arkeon wrote:

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

#7 31-Jan-2011 20:43:49

Nodrev
Scol Language & OS3D developer
From: Nantes, France
Registered: 29-Dec-2009
Posts: 197

Re: Tableau de caractères - tab S

iri wrote:

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;

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

#8 31-Jan-2011 20:46:10

Nodrev
Scol Language & OS3D developer
From: Nantes, France
Registered: 29-Dec-2009
Posts: 197

Re: Tableau de caractères - tab S

Oublie ma remarque, je lirais mieux ce que tu souhaite la prochaine fois, ma réponse est à coté de la plaque big_smile
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 tongue).

Offline

#9 31-Jan-2011 21:16:12

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Tableau de caractères - tab S

Yop

C'est surtout que j'ai tout faux wink

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

#10 31-Jan-2011 23:28:04

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Tableau de caractères - tab S

Sinon, oui, le C++ pourrait apporter un plus. Mais je n'aime pas le C++ (c'est pas un scoop ! tongue), surement parce que je ne le connais pas assez pour en tirer avantage smile

Offline

Board footer

Powered by FluxBB