Problème boucle For

Résolu/Fermé
Romain - Modifié par Romain le 5/02/2013 à 08:31
 Romain - 6 févr. 2013 à 08:24
Bonjour,

Ayant l'habitude du .NET, je suis assez désorienté en C.
Ainsi je souhaiterais parcourir une boucle pour extraire les données d'un objet.

Voici ce que je souhaiterais faire ne langage algorithmique :

J'ai un objet tag_t qui va contenir des statuts : Attente, Préparation, Expedition, Livré.

Par exemple mon objet tag_t[1] va contenir Attente, et mon objet tag_t[2] contiendra : "Attente","Préparation".

Je souhaite donc extraire les statuts grace à une boucle, les stocker dans une variable et effacer par la suite :

Pour i=0 jusqu'à nb_objets faire 
           QRY_OBJET(tag_t[i], nb_statuts) 
           QRY_LIST(tag_t[i],status_list) 
     Pour j=0 jusqu'à nb_statuts faire 
           QRY_STATUT(status_list[j]) 
           MaVariable = Mavariable + statut 
     Fin Pour 

Fin Pour 

fprint("Les statuts sont : %s", Mavariable); 

Mavariable= nothing //"destruction" ou "réinitialisation" de la variable


J'espère que j'ai été assez clair,

j'arrive bien a faire la boucle, mais cx'est "Mavariable qui me pose problème, pour ajouter les statut et les concaténer à l'interieur. J'ai bien essayé strcat() mais je n'ai pas réussi....

En vb ou c# c'est tellement facile ! mais là je sèche.

Dans l'attente de vos réponses,

Cordialement
A voir également:

7 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 févr. 2013 à 14:27
Il faut dire que tu ne t'attaque pas à la partie la plus simple du C : les chaines de caractères. Avant, il vaut mieux avoir bien compris la notion de tableau et de pointeur. Le problème viens des 2 premières lignes :
char *temp1; tu déclares un pointeur de char
temp1="" outre qu'il manque le ";", tu fais pointé temp1 vers la chaine de caractère constante "", ce qui cause le problème, car par la suite tu ne peux plus modifier ce qu'elle contient.
à mon avis, la meilleur solution pour toi est de définir un tableau :
char temp1[1024]; // mai tu mettre autre chose comme taille.
puis temp1[0]='\0'; comme initialisation afin que strcat fonctionne correctement.
1
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 5/02/2013 à 19:39
Si je peux me permettre, j'ajouterai aussi que :

if (release_status_type != ""){ 

est erroné, même si ton compilateur ne te dit rien (en fait, un compilateur bien intentionné devrait émettre un warning, du moins gcc le fait avec les options de compilation -Wall, qui moi me dit "comparison with string literal results in unspecified behavior"), même s'il n'empêche pas la compilation. En faisant cela, tu compares l'adresse mémoire du pointeur release_status_type (c'est un pointeur sur char), à un littéral.

Si tu veux faire une comparaison de chaînes en C, c'est à la fonction strcmp que tu dois recourir, donc normalement :

if (strcmp(release_status_type, "") != 0){

http://www.cplusplus.com/reference/cstring/strcmp/

Cependant, si tu extrapoles les (excellentes) explications de Char Snipeur, dans le cas présent, tu t'es peut-être aussi rendu compte, que tu pourrais obtenir le même résultat, en testant si le premier caractère du tableau de caractères accessible à l'index 0 est égal au caractère '\0', car cela indique une chaîne vide. Et là, en revanche, tu peux légalement écrire :

if (release_status_type[0] != '\0'){

En fait, un char (un caractère) est un type d'entier en C, et on peut le comparer avec les opérateurs de comparaison à la valeur du caractère '\0'. Note que, comme c'est un caractère, il est entouré d'apostrophes, et non de guillemets.


Dal
1
En effet j'ai bien des warning qui s'affichent et en ecrivant cette condition je ne pensais pas que mon IDE allait accepter et pourtant si. ALors je n'ai pas été chercher plus loin :$.

Super en tout cas merci beaucoup, je vais progresser grace à vous
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 févr. 2013 à 09:19
Salut.
C'est un peu trop abstrait pour te donner une réponse.
Si c'est du C (et non du C++) il faut bannir l'idée d'objet de ton esprit.
La gestion création, destruction se fait par malloc et free.
0
Bonjour,
merci de ta réponse mais le souci n'est pas au niveau de l'objet (je ne sais pas si on peut appeller ca "objet" mais ça en a tout l'air. Je travaille avec des API et tag_t est fourni par une API mais ça j'arrive tres bien a le manipuler).
Ce que je n'arrive pas à faire c'est concatener. Tout bête me diras tu....

par exemple j'arrive à afficher temp1=statut. mais ça ne marche que pour 1 statut. je voudrais récuperer les statuts ddans la boucle et les mettre un par un dans MaVariable.

J'espere que tu m' as compris

ps : c'est bien du C.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 févr. 2013 à 11:35
Si tu préfère, il me manque les types et les dimensionnement.
Comment déclare tu MAvariable ? En C, concaténer des chaines de caractère se fait avec strcat ou strncat.
0
Ah oui désolé ...

char *MaVariable;


Mais je doute que ce soit bon.

Avec char temp[100] ; j'avais essayé de faire en sorte que les statuts concaténés se retrouvent dans cette variable temp :
strcat(temp, statut);
mais sans succès.

Je pense que mon problème vient de la déclaration des variables mais j'avoue que je suis un peu perdu...

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 févr. 2013 à 12:02
Le plus simple serait de nous mettre un bout de code C, éventuellement simplifié.
Pourquoi sans succès ? Il se passe quoi ?
Quel est le type de "statut" ?
0
Voici mon code très simplifié car c'est vraiment juste la variable temp1 dans laquelle je n'arrive pas a concatener des champs
:
char *temp1; 

temp1="" 

for (j=0; j< status_count; j++){ 
   irc = CR_ask_release_status_type(status_list[j], release_status_type); 
if (release_status_type != ""){ 
//temp1= release_status_type; // en commentaire
strcat(temp1, release_status_type); // c'est ici que ca ne va pas 

} 
printf("voici ce que donne la concaténation : %s", temp1);
 


Voilà je ne sais pas si ça te suffit mais le code en lui même fonctionne très bien, c'est jsute au niveau de la varible temp. Est ce que ce que je souhaites faire est impossible ? est ce qu'il faut procéder d'une autre maniere ou est ce moi tout simplement qui ne sait pas déclarer une variable...

merci pour ton aide
0
A vrai dire je ne pensais absolument pas que manipuler des chars allait me poser problème...

Ta solution permet à mon programme de fonctionner correctement et je t'en remercie.

Cependant, j'aimerais comprendre pourquoi temp1[0]='\0'; change quelque chose ?
cela réinitialise toute la chaine temp1 (qui est vu comme un tableau). L'indice zéro est particulier ?

Encore merci pour le temps que tu m'as accordé
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
5 févr. 2013 à 15:16
https://www.commentcamarche.net/contents/118-langage-c-les-chaines-de-caracteres

:-)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 févr. 2013 à 15:23
strcat prend le premier argument et cherche la fin de la chaine pour écrire dedans le deuxième argument.
char tmp[100]; crée un tableau de char, mais on ne sais pas ce qu'il y a dedans tm[0]='\0'; dit que le premier caractère correspond à la fin de la chaine, c'est à dire que la chaine est vide, peu importe ce qu'il y a après en fait.
0
Merci pour ce complément d'informations ! :)
0