Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [C]Insertion de caractère
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

[C]Insertion de caractère

Posté le 29/04/2014 17:42

Hello world,
Je travaille actuellement sur une fonction de saisie en C avec un curseur permettant de placer des caractères entre d'autres caractères (ou d'en supprimer), existe-t-il donc une fonction permettant d'intercaler (ou de supprimer) un caractère dans un tableau de char tout en déplaçant la suite? Ou alors faut-il que je crée ma propre fonction?


Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 30/04/2014 12:35 | #


#include <stdlib.h>

int main()
{
  char *str = (char *)malloc(20);
  return 0;
}

Si ceci ne fonctionne pas...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 30/04/2014 12:38 | #


Justement c'est ce que j'avais fait: "Violation d'accès à l'adresse 0x..." en essayant de modifier la chaîne une fois le programme lancé.
Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 30/04/2014 12:44 | #


#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *str = (char *)malloc(20);
  sprintf(str,"Ceci est une chaine");
  ch[3] = 65;
  return 0;
}

Est-ce que ce code-ci fonctionne ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 30/04/2014 12:57 | #


Bizarre, là ça a marché avec sur mon PC et avec le SDK casio, alors que
code
Cliquer pour enrouler
void decaler(char *ch, int debut, int longueur, int dec)
{
    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[debut+dec+1]='\0';
}

char* getInputChar(int maxChar, int pos, int size, int state){
    char *text=(char*)malloc(maxChar);
    int i;
    for(i=0; i<maxChar; i++)text[i]=32;
    text="test";
    PrintXY(1,1,text,0);
    decaler(text,1,maxChar,1);
    PrintXY(1,10,text,0);
}
Ne fonctionne pas, la chaîne n'est pas modifiée.

Ajouté le 30/04/2014 à 12:59 :
J'ai compris, c'est dût au text="test"; au lieu de "sprintf(text,"test");":
void decaler(char *ch, int debut, int longueur, int dec)
{
    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[debut+dec+1]='\0';
}

char* getInputChar(int maxChar, int pos, int size, int state){
    char *text=(char*)malloc(maxChar);
    int i;
    for(i=0; i<maxChar; i++)text[i]=32;
    sprintf(text,"test");
    PrintXY(1,1,text,0);
    decaler(text,1,maxChar,1);
    PrintXY(1,10,text,0);
}
Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 30/04/2014 13:00 | #


text="test";


Jamais d'allocation directe de texte, sauf à la déclaration !

#include <stdio.h>

sprintf(text,"test");

Parce que là tu modifiais ton pointeur.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 30/04/2014 13:00 | #


Je me disais aussi
Ok, merci
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 30/04/2014 14:39 | #


Ca me fait penser qu'il faut que je poste une astuce pour les entrées de texte avec le GetKey et les syscalls, parce que le code des touches correspond au code ASCII du caractère

Du coup (je vous montre vite fait)
chaine[21];
int i = 0;

Cursor_SetPosition(1, 1); // c'est des syscalls
Cursor_SetFlashMode(1);
Cursor_SetFlashStyle(2); // 2 = ALPHA

while(key != KEY_CTRL_EXE)
{
  GetKey(&key);
  
  if(key >= 'A' && key <= 'Z')
  {
    chaine[i ] = key;
    i++;
  }

  locate(1,1);
  Print(chaine);
}


Y'a pas le "delete", mais ça fonctionne bien (j'ai utilisé cette astuce pour mon Serial_DLFiles)
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 30/04/2014 14:45 | #


Merci, je vais essayer de voir ça avec le code des touches.
EDIT: C'est bon, je vais pouvoir adapter ça! Par contre il faudra que je modifie la valeur de sortie si je suis en minuscules (key+32), par exemple, si j'appuie sur 'A' j'ai 65 et si je veux 'a' j'ai juste à ajouter 32
Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 30/04/2014 14:57 | #


@Dark Storm
Mon premier add-in ayant été le GetKey, j'ai également remarqué que la validation d'un entrée du catalogue générait d'autres nombres, ce qui intéréssant du point de vue de la composition de l'application PRGM.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 30/04/2014 15:01 | #


J'ai pas tout compris... Qu'est-ce que tu veux en faire ?

@Alpha: c'est ça.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 30/04/2014 17:31 | #


Ce que je veux en faire ? Rien de spécial.
Je remarque juste que le catalogue, comme la fonction Capture, fait partie de l'OS à un niveau plus bas que les applications habituelles puisqu'ils sont accessibles partout, y compris dans les applications ajoutées, et que les fonctions Basic Casio génèrent des codes qui leur sont propres au niveau du GetKey().
Du coup, il est à noter que l'on peut se servir à volonté des entrées du catalogue dans nos add-ins.

Mais bon, à part refaire un éditeur Basic (ce qui serait totalement inutile)...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 127 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