Salut !
J'essaye de concatener un entier avec un char*, mais cela me donne un resultats faux avec cette technique: transformation du short en char* par sprintf, et concatenation des 2 char* par strcpy (donné dans TiWiki):
attribute__((regparm)) char * strcpy_fast(char * dst, const char * src)
{
register char * result;
__asm__ (
"move.l %1,%0 \n\t"
"move.b %0@+,%2@+ \n\t" /* copie d'un caractère */
"bne .-2 \n\t" /* bouclage jusqu'à un caractère \0 */
: "=a" (result)
: "g" (dst), "a" (src)
);
return result-1; /* result a été incrémenté une fois de trop */
}
[...]
{
while(key != -35)
{
key = ngetchx();
key = key - 48;
char * keyC = sprintf(keyC, "%d", key);
calcul = strcpy_fast(calcul, keyC);
printf("%s", calcul);
}
}
Et cela ne maffiche rien a l'écran et finit meme par me donner un Out Of Memory !
Merci d'avance.
Merci pour l' idée de l'allocatoin dynamimique, mais malhereusement, c'est la variable calcul qui provoque le Out of Memory. Mais comme je ne connais malheureusement pas la taille de cette derniere lors de son allocation, je n'ai donc pas la constante.
Je pense que le probleme vient de sprintf car apres avoir regardé la valeur de varible, je remarque que sprintf concatene 2 fois la variable key dans la variable keyC !
Donc: comment transformer un short en char* ?
Merci d'avance
> char * keyC = sprintf(keyC, "%d", key);
Please RTM pour savoir ce que retourne sprintf, et pourquoi ça ne se convertit pas en char*.
Link Le 30/07/2005 à 17:14 euh... Pourquoi tu utilises un strcpy pour concaténer ?
c'est pas plutot un strcat qu'il faudrait utiliser?
Et tu ne peux pas convertir directement un entier en chaîne, sans réserver un buffer quelque part qui contiendra ladite chaîne.
Pour les entiers, il me semble qu'un buffer de 12 octets suffit à représenter n'importe quel entier sous forme décimale. (mais pas un float)
Pour un short, un buffer de 8 octets devrait suffire. En suite, tu utilises strcat pour concaténer les deux buffers (lebuffer de destination doit être assez grand pour les contenir tous les deux!)
Edit: Cross

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Bien vu: il utilise strcpy... Ceci dit, ça pourrait marcher, en exploitant correctement la valeur de retour de sprintf.
Link Le 30/07/2005 à 17:44 C'est vrai, sprintf renvoie le nombre de caractères écrits...
(Au passage, les "pointer from integer without a cast", ils doivent pleuvoir dans ce code.
Mais ce que j'ai du mal à voir, c'est pouquoi il parle de concaténer, alors que je ne vois aucune concaténation dans le code, ni aucune raison de concaténer quoi que ce fût...
car si c'est pour écrire un nombre en affichant chaque shiffre entrée à l'écran, y'a beaucoup plus simple que des conversiosn dans un sens puis dans l'autre...

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Ok.
Mais le probleme: on ne peut faire des calculs de plus de 42 caractère ! Le probleme est que le calcul peut etre des fois extremement long et extrement cours. Donc, le seul moyen que j'ai trouvé pour remlédier a cette situation est d'utiliser des pointeurs..... Donc si pointeur l'utilisation de [i]buf = k; devient mauvaise, on ne peut plus connaitre la limite de i, etc....
Merci d'avance.
Link Le 30/07/2005 à 21:59 Ben, tu fais de l'allocation dynamique: tu alloues ton buf avec un malloc, et puis dès que i atteint la taille maximale actuelle, tu fais un realloc en doublant la taille...

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Mais lorsque j'essaye cette technique, la valeur du buffer est tres innatendu:
short size = 10 * sizeof(char);
size_t i;
short k=0;
char *buf = malloc(size);
while(k != -35 && k != 216)
{
for(i = 0 ; i < size-1 && k != -35 && k != 216; i++)
{
k = ngetchx() - 48;
if(k != -35 && k != 216)
{
buf[i] = k;
i++;
printf("%d", k);
}
}
if(k != -35 && k != 216)
{
size = size * 2;
buf = realloc(buf, size);
}
}
printf("\n \n %s\n\n", buf);
buf = realloc(buf, size+1);
buf[size] = '\0';
printf("\n \n %s\n\n", buf);
Merci d'avance
> (Au passage, les "pointer from integer without a cast", ils doivent pleuvoir dans ce code.)
Probable.
"Nanar_duff", poste tes options de compilation (Projet / Options si tu es dans l'IDE). Moins de -W -Wall -Wextra -Os -ffunction-sections -fdata-sections -mregparm=5 -mpcrel -Wa,-l -Wa,--all-relocs + toutes les optimisations du linker, ce n'est pas bien.
Alors a ton avis :
for(g=0 ; g < size ; g++)
{
buf[g] = ""
}
Mais la je ne suis pas trop car ceci est la meme chose que buf[x] = k non ?
Merci d'avance.
> Heuh, mes options de compilations ne vont pas bien loin: tigcc t.c => aucune option de compilation.
Horreur. Je sais bien que certains profs le font, mais franchement, compiler sans optimisation et compiler sans warnings (surtout du C !)...
Vrai, bien que le charset des TI-68k ne soit pas de l'ASCII, mais un ISO 8859-1 (je crois) modifié pour avoir les symboles mathématiques et les lettres grecques, par exemple, car la partie 32-127 est identique pour tous (sauf bizarre).