1

Bonjour,

Je cherche à "ajouter" deux strings de la manière suivante:
long type=1; "objet"+strtol(type)="objet1"

Mais je ne connais pas la syntaxe ou la fonction à utiliser.

J'ai essayé plusieurs syntaxes et recherché sur Internet mais je n'ai pas trouvé comment faire en C.

Merci d'avance donc pour votre aide!
Romain [RVweb.fr]

2

sprintf(foo,"%s%ld",foo,type);
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Bon, désolé je n'arrive pas à utiliser ce que tu m'as donné. Peux-tu détailler plus s'il te plaît?
Quelle serait la syntaxe pour:
[cite]long type=1;
printf("objet"+strtol(type,NULL,0));[cite]
Par ailleurs je viens d'avoir des problèmes avec strtol(), cela s'utilise bien comme je viens de le mettre?

Merci
Romain [RVweb.fr]

4

Regarde dans la doc de TIGCC.
La syntaxe est celle que Kevin a postée. Avec foo -> chaine de caractères.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

strtol ca fait le contraire de ce que tu cherche à faire, ca convertit une chaine en nombre (long)
avatar

6

tu ne peux pas utiliser + en C pour concaténer des chaines de caractères, tu peux utiliser printf/sprintf pour formater des chaines ou strcat pour concaténer deux chaines
avatar
Wenn ich morgen meinem Gott gegenübertrete, kann ich ihm sagen: "Ich bin unschuldig, ich hab' niemandem etwas getan - außer mir selben" Und das verzeiht er mir offentlich !
Falco - Hans Hölzel 1957 - 1998
RIP

7

Merci! C'est une fonction comme strcat que je cherchais.
Bon, je pense que j'ai trouvé. Voici comment j'ai fait:
short int type=1;
char type_txt[50];
char buffer[50];
sprintf(type_txt,"%d",type);
strcpy(buffer,"objet");
strcat(buffer,type_txt); printf(buffer); // Affiche "objet1"

Est-ce correct? Peut-on optimiser ce morceau de code, car j'ai besoin de pas mal de vitesse dans mon programme? Que signifie les "50", peut-on le réduire pour gagner de la vitesse?
Romain [RVweb.fr]

8

tu fais plein d'opérations qui peuvent être faites avec seulement sprintf, voire printf si tu ne veux afficher la chaine qu'une seule fois :

short int type=1;
char buff[20];
sprintf(buff,"objet%d",type);
...
printf(buff);


tu peux fusionner le printf et le sprintf si tu ne veux pas faire d'opérations suplémentaires dessus

si tu veux de la vitesse, par contre, il faut te passer de (s)printf
tu dois convertir toi même l'int en chaine et ecrire les chiffres toi même dans la chaine
apres pour afficher il faur utiliser des fonction plus rapide comme DrawStr (ou encore plus rapide comme celless des libs graphiques)

le 50 c'est la taille maximale de la chaine (49 si on veut etre precis), ca indique la mémoire allouée à chacune des chaines
tu peux le réduire pour qu'il n'y ai pas de place de perdue, maisgarde tout de même un peu de marge ( je ne sais pas jsuqu' à cb la variable type peut monter)
mais ca ne changera rien au niveau de la vitesse
avatar

9

En fait je n'ai pas besoin d'afficher le résultat, je le fais pour tester. Par contre j'ouvre le fichier texte qui porte ce nom (ce qui, question vitesse ne doit pas être bien mieux, mais je n'en suis pas encore à de telles optimisations).
Le problème, c'est qu'il ne veut pas ouvrir le fichier texte. Voici mon code:
char type_txt[3]; // type fait au maximum 999
sprintf(type_txt,"objet%d",type);
printf(type_txt); FILE *objet=fopen(type_txt,"r");

Et il m'affiche "objet100" au lieu de "objet1".
Aurais-tu une idée pour résoudre ce problème?
Romain [RVweb.fr]

10

Rectification: Désolé, je crois qu'en fait le problème ne vient pas de ce code mais de la variable qui est bel et bizn à 100 dans mon programme. Je vais donc tenter de corriger ce problème.
En tout cas merci, j'ai réussi à faire ce que je demandais.
Romain [RVweb.fr]

11

il y a un probleme dans ton bout de code :
char type_txt[3]; ca definit une chaine de 2 caracteres (en effet, il faut reserver une case de la chaine pour le caractere de fin de chaine ( '\0' )
il faut que ta chaine fasse au minimum la taille de "objet" + le nb de chiffre max de type + 1 (char de fin de chaine)

pour mon optimisation en vitesse, oui là c completement inutile ^^
ca aurait pu etre utile si tu avais à effecter cette concatenation plusieurs dizaines de fois par secondes (affichage de fps par exemple)
avatar

12

Oui tu as raison, j'ai oublié de le modifier. Donc c'est: type_txt[9] ("objet": 5, type: 3, "\0": 1). C'est bien ça?
Romain [RVweb.fr]

13

oui, c'est ca, mais tu peux mettre [10], comme ca tu as de la marge
et en plus sur ti, il se peut que ca prene exactement la même place

autre chose : comme c'est pour des fichiers, si tu veux forcer sprintf à mettre des zéros si le nombre fait moins de 3 (par exemple 001 au lieu de 1) mets %03d à la place de %d

(regarde la doc de tigcc sur printf pour plus de détails)
avatar

14

Non justement, je préfère que mes fichiers soient objet1, objet2... plutôt que objet001, objet002... Enfin, ça ne change pas grand chose mais merci quand même.
Romain [RVweb.fr]

15

Bon, j'aurais encore besoin d'aide. J'essaie de faire une fonction qui lit des coordonnées dans un fichier texte et qui affiche des lignes en fonction de ces coordonnees. Je fais donc une boucle qui récupère toutes les coordonnées nécessaires pour dessiner une ligne jusqu'à ce qu'arrive la fin du fichier. Voici ma fonction:

// Construit le nom du fichier. Exemple: "objet"+type="objet1"
char type_txt[9];
sprintf(type_txt,"objet%d",type);
FILE *objet=fopen(type_txt,"r"); // Fichier texte contenant les attributs de l'objet

// Récupération de tous les attributs et affichage des lignes
while (i!=NULL) { // Tant qu'il y a encore des coordonnées

// 1er point
// X
fgets(x_txt,4,objet);
x=atoi(x_txt);
fgets(i,2,objet);
// Y
fgets(y_txt,4,objet);
y=atoi(y_txt);
fgets(i,2,objet);
// Z
fgets(z_txt,4,objet);
z=atoi(z_txt);
fgets(i,2,objet);
// Coordonnées sur l'écran
espace2ecran(xo+x,yo+y,zo+z);
x1=ecran_x;
y1=ecran_y;

// 2eme point (on reprend les mêmes variables)
// X
fgets(x_txt,4,objet);
x=atoi(x_txt);
fgets(i,2,objet);
// Y
fgets(y_txt,4,objet);
y=atoi(y_txt);
fgets(i,2,objet);
// Z
fgets(z_txt,4,objet);
z=atoi(z_txt);
fgets(i,2,objet);
// Coordonnées sur l'écran
espace2ecran(xo+x,yo+y,zo+z);
// Inutile d'utiliser deux nouvelles variables x2 et y2: les coordonnées sont dans ecran_x et ecran_y

// Dessine la ligne
DrawLine(x1,y1,ecran_x,ecran_y,A_NORMAL);
}

fclose(objet);

Mon fichier est de la forme: "001.002.003-004.005.006*007.008.009-010.011.012".

Le problème, c'est que la boucle ne s'arrête pas. J'ai essayé d'afficher i en fin de boucle: si je termine mon fichier par "/", il me l'affiche, et si je ne le termine par rien, il ne m'affiche rien. Pourtant la condition de ma boucle n'est pas vérifiée. Quel détail m'a echappé? Quelqu'un pourrait-il m'aider?

Merci d'avance!
Romain [RVweb.fr]

16

Il vient d'où, ton i dans la condition du while ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

17

Il est déclaré avant la boucle while en tant que: char i[2] et est défini pour la dernière fois à la fin de la boucle: fgets(i,2,objet); .
En considérant le format de mon fichier, il ne prend que les valeurs "*" et normalement "" à la fin du fichier (je parle ici du dernier i car ceux d'avant peuvent prendre les valeurs "." et "-").
Le problème, c'est que le test: if (i=="") ne marche pas, ou if (i==NULL). Quelle peut donc être sa valeur?
Sinon j'ai cherché une autre méthode: je termine mon fichier par "1" et je fais un atoi. Donc le seul endroit ou i==1 est à la fin, mais bon c'est moins propre...
Romain [RVweb.fr]

18

i est un pointeur sur une variable locale, donc déjà, sa valeur ne change jamais, et ensuite, elle n'est jamais nulle.

Il faut que tu testes avec i[0] je pense.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

19

Bon ça ne semble pas marcher avec i[0]. Tant pis, ce n'est pas bien grave, je vais garder la méthode que je t'ai dis pour le moment. Je reviendrai peut-être sur la question quand j'en serai à l'optimisation de mon programme.
Merci quand même pour ton aide!
Romain [RVweb.fr]

20

Nu :
tu fais plein d'opérations qui peuvent être faites avec seulement sprintf, voire printf si tu ne veux afficher la chaine qu'une seule fois :

short int type=1;
char buff[20];
sprintf(buff,"objet%d",type);
...
printf(buff);


tu peux fusionner le printf et le sprintf si tu ne veux pas faire d'opérations suplémentaires dessus

si tu veux de la vitesse, par contre, il faut te passer de (s)printf
tu dois convertir toi même l'int en chaine et ecrire les chiffres toi même dans la chaine
apres pour afficher il faur utiliser des fonction plus rapide comme DrawStr (ou encore plus rapide comme celless des libs graphiques)

le 50 c'est la taille maximale de la chaine (49 si on veut etre precis), ca indique la mémoire allouée à chacune des chaines
tu peux le réduire pour qu'il n'y ai pas de place de perdue, maisgarde tout de même un peu de marge ( je ne sais pas jsuqu' à cb la variable type peut monter)
mais ca ne changera rien au niveau de la vitesse


strcat risque quand meme dans bcp de cas d'etre plus rapide que sprintf si tu ne fait que de la concaténation de chaines de caracteres.

mais effectivement si il met une valeur long dans la chaine, un seul a sprintf sera bcp plus rapide que plusieurs apel a strcat, mais faut garder en émméoire quand meme que *printf est un gros gros lourdeau smile
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

21

oui, c'est vrai, mais comme il y a une conversion num->str à faire strcat seul ne sufirait pas
(il y a d'autres fonctions de conversion que *printf ?)

et puis comme je l'avais dit : calcul à la main powa grin
avatar

22

post annulé

23

Ton source est toujours gangréné par char type_txt;
Pour un nom de fichier, il te faut au moins char type_txt[9] pour que le sprintf puisse tout stocker.

Parce qu'avec char type_txt, tu n'as la place de stocker qu'un seul octet, qui sera le caractère nul de fin de chaine.
En conséquence, avec char type_txt, tu as à peine la place de stocker une chaine vide.

le mieux est char type_txt[9], je pense...

Edit: Bon, ben le source devait être correct, vu que ce n'est qu'après avoir posté que j'ai compris que l'erreur venait de l'interpréteur de couleurs du forum...
Bon ben j'ai rien dit alors
avatar
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.

24

Hum ça se sent que yAro a modifié les scripts :/
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

25

Ah, oui, il faut le mettre en [pre] ou en source...
Ou bien, rajouter deux balises au milieu du [9], je pense...

Bon, j'édite le mien...
avatar
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.