Posté le 29/04/2014 17:42
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 213 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 29/04/2014 17:50 | #
Tu dois pouvoir utiliser memmove pour décaler tes données (en écrasant dans le cas d'une suppression) et ensuite tu peux écrire dans la case souhaitée si c'est un rajout.
Citer : Posté le 29/04/2014 17:51 | #
Il y a deux "problèmes" à ce que tu cherches.
Premièrement, il faut déplacer la suite de la chaîne.
Deuxièmement, il faut qu'il reste assez d'espace pour pouvoir la décaler, cette suite.
On realloue une taille suffisante
Fin Si
On deplace la suite de la chaine
On insere le(s) caractere(s) dans l'espace libere
Ce qui donne en C, avec ch la chaîne d'origine, sup celle à insérer et pos l'index où se trouver le premier caractère inséré:
{
char *tmp;
tmp = realloc(ch, strlen(ch)+strlen(sup)+1);
if(tmp==NULL) return;
ch = tmp;
}
memmove(ch+pos,ch+pos+strlen(sup),strlen(sup));
strncpy(ch+pos,sup,strlen(sup));
Citer : Posté le 29/04/2014 18:41 | #
J'ai fait quelques tests avec memmove, mais cela ne fait rien
test="test";
PrintXY(1,1,test,0);
memmove(test,test+3,1);
PrintXY(1,10,test,0);
Citer : Posté le 29/04/2014 18:55 | #
Oui, ça ne peut pas fonctionner.
{
int i;
for(i=longueur-1 ;i+1;i--) ch[debut+longueur+i] = ch[debut+i];
}
Citer : Posté le 29/04/2014 19:04 | #
C'est bizarre, je ne peux pas modifier un élément du tableau, chaque fois que je veux modifier quelque chose, il n'en fait rien
Citer : Posté le 29/04/2014 19:07 | #
Tu as essayé avec le code juste au-dessus ?
Avec moi, ça fonctionne.
Citer : Posté le 29/04/2014 19:08 | #
J'ai essayé mais non, marche toujours pas
Citer : Posté le 29/04/2014 19:13 | #
void decaler(char *ch, int debut, int longueur)
{
int i;
for(i=longueur-1 ;i+1;i--) ch[debut+longueur+i] = ch[debut+i];
}
int main()
{
char ch[20] = "DebutFin";
decaler(ch,5,3);
printf("%s\n",ch);
return 0;
}
Essaie ça, sur un PC.
Ça doit fonctionner.
Citer : Posté le 29/04/2014 19:21 | #
Sur un PC ça marche mais pas sur ma caltos (après serai-ce dût à l'allocation dynamique?)
Citer : Posté le 29/04/2014 19:23 | #
Je ne pense pas, mais tu peux vérifier.
Dans ton add-in, est-tu sûr que les données ne sont pas copiées ou autre ?
Citer : Posté le 29/04/2014 19:35 | #
C'est effectivement dût à l'allocation:
decaler(str,5,3);
PrintXY(1,1,str,0);
ML_display_vram();
str="TEST test";
decaler(str,5,3);
PrintXY(1,1,str,0);
ML_display_vram();
Citer : Posté le 29/04/2014 19:39 | #
J'ai testé avec l'allocation dynamique sur PC, et ça fonctionne.
Citer : Posté le 29/04/2014 20:32 | #
L'autre solution serait de créer un chaîne de taille fixe (256 octets je pense) que je pourrais modifier avec ta fonction.
Citer : Posté le 29/04/2014 20:53 | #
Ma fonction est incomplète, en fait voilà le vrai code.
{
int i;
for(i=longueur-1;i+1;i--) ch[debut+dec+i] = ch[debut+i];
for(i=debut+longueur;i<debut+dec;i++) ch[i] = 32;
}
ch est la chaîne où l'on décale, debut l'index du premier caractères à décaler, longueur la longueur de la chaîne à décaler (strlen(ch)-debut), et dec la longueur du décalage.
La deuxième boule remplit de blancs l'espace entre la fin du bloc non décalé ([0;debut[) et le debut du bloc décalé ([debut+dec;strlen(ch)[). Tu n'en as pas forcément besoin, c'est surtout pour éviter que si l'on décale de plus que la longueur du bloc à décaler, des 0 restent au milieu et coupent la chaîne.
Citer : Posté le 29/04/2014 21:09 | #
Euh, ça me donne des trucs bizarre parfois... Du genre "Test ttestzP f nY" pour la chaîne "Test test" (de 20 caractères) et avec decaler(str,5,4,1);
Par contre ça ne marche toujours pas avec l'allocation. Du coup je vais me débrouiller différemment.
Citer : Posté le 29/04/2014 21:41 | #
Non, c'est normal.
C'es ton allocation qui n'a pas vidé le tableau.
Du coup tu te retrouves avec de la mémoire non nettoyée au bout de ta chaîne.
En fait c'est parce que ma fonction a écrasé le 0 de fin et ne l'a pas remis.
Citer : Posté le 30/04/2014 07:35 | #
Bon, j'ai modifié ta fonction en prenant compte ton message (ch[debut+dec+1]='\0';) et je remplis ma chaîne avec des espaces au début. Par contre c'est toujours pareil, ça marche quand j'initialise normalement mais quand j'alloue, rien.
Citer : Posté le 30/04/2014 07:38 | #
Sur PC aussi ?
Citer : Posté le 30/04/2014 12:32 | #
Justement, avec visual C++ je n'arrive pas à faire char *str=malloc(20)
Mais je me demande si ce n'est pas une question de pointeurs, je suis en train de regarder
Citer : Posté le 30/04/2014 12:35 | #
int main()
{
char *str = (char *)malloc(20);
return 0;
}
Si ceci ne fonctionne pas...