pile memoire - modification donnees

pile memoire - modification donnees - C - Programmation

Marsh Posté le 07-07-2004 à 10:31:15    

bonjours a tous!
 
j'ai un probleme en c concernant la modification d'une variable
 
voici les variables:
 
char buffer2[300];    //chaine principale
char temp[30];  //nouvelle chaine a inserer
 
but de mon programme:
 
 
en gros je parcours une liste chainee, et je stocke les donnees lues dans un buffer premier buffer temp et mon but est de rajouter toute la chaine a la fin du buffer buffer2
 
le code:

void rajout(char buffer[300], char chaine[151]){

 
    int taillebuff=0, taillenew=0, i=0, cpt=0;
     
   
    taillebuff = taille_ch(buffer);//ici taille_ch retourne la taille de la chaine
     
    if(taillebuff != 0){    
       cpt = taillebuff+2;
    }
     
    while(chaine[i] != '\0'){
        buffer[cpt] = chaine[i];
        i++;
        cpt++;
    }
    buffer[cpt] = '\0';
   
 
}
 
 
while(lect_courant->fils != NULL){
           
      memset(temp,0,sizeof(temp));                    
               
      sprintf(temp," <Source>\n  <Composition />\n  <ServiceRef>%s</ServiceRef>\n </Source>\n",lect_courant->fils->nom);          
 
      rajout(buffer2,temp);
       
      lect_courant->fils = lect_courant->fils->suivant;
 
}
 
cependant j'ai un probleme: les variables semblent etre ecrasees dans la pile d'execution?
 
En effet, à chaque fois que la fonction rajout est appelee, l'insertion du temp se fait bien dans buffer2, mais ne se rajoute pas a la fin comme prevue et la variable buffer2 est ecrasee entierement par temp  
 
comment empecher cela (je ne veux pas faire de static ce n'est pas propre...)


Message édité par kungouf le 07-07-2004 à 12:08:41
Reply

Marsh Posté le 07-07-2004 à 10:31:15   

Reply

Marsh Posté le 07-07-2004 à 10:34:04    

houla, excusez moi pour les couleurs....

Reply

Marsh Posté le 07-07-2004 à 10:45:40    

utilise strcat()

Reply

Marsh Posté le 07-07-2004 à 11:01:18    

ouais, m'enfin je pense que son problème est plus lié à l'allocation mémoire. Non ?
 
Parce que faire des allocations, parler de static et ne pas connaitre la fonction strcat me paraitrais quand meme .... bizarre   :)  
 
Peux tu modifier les couleurs STP ?
Parce que ca me dérangerais pas plus que ca de t'aider mais là, quand je lis une ligne, mes yeux n'arrive pas a faire la mise au point pour la 2eme  :D

Reply

Marsh Posté le 07-07-2004 à 11:34:49    

j'ai recreer une fonction du type strcat car en effet je ne connaissais pas strcat...ce qui a arranger tout mes problemes!
 
merci pour ca
 
cependant le probleme lie a la pile d'execution me turlupine pas mal
 
ps: comment reediter mon message? lol

Reply

Marsh Posté le 07-07-2004 à 11:47:57    

lol    :D  
C'est la premiere fois que je vois un mec qui connais les notions de static et qui ne connais pas strcat
 
Comme quoi ....  :D   c'est cool des questions comme ca
 
Pour éditer le message, il faut cliquer sur le 2eme icone en partant de la gauche qui se trouve en haut de ton post

Reply

Marsh Posté le 07-07-2004 à 12:09:47    

ouai lol
j'ai appris le c il n'y a pas longtemps, c'est pourquoi parfois j'attaque un peu bourrin lol
bon le texte flashi a ete change :)

Reply

Marsh Posté le 07-07-2004 à 14:01:00    

En fait, j'en suis pas sur mais a premiere vue, ta fonction de rajout ne rajoute pas vraiment mais modifie plutot le contenu de chaine dans buffer.
 
Tout d'abord, vu que tu ne connaissais pas strcat, je suppose que tu ne connais pas non plus strlen() qui permet d'avoir la taille d'une chaine de caractères.
Utilise : taillebuff = strlen(buffer);
au lieu de : taillebuff = taille_ch(buffer);
 
Si j'ai bien compris, le mieux serait de faire (j'ai pas compilé donc pas testé) :
 
 
char* rajout(char *buffer, char *chaine)
{  
   char *origine = buffer; /* J'ai quelques doutes sur ca. Au pire, recopie caracteres par caracteres */
 
   buffer = malloc(strlen(buffer) + strlen(chaine) + 1);
     
   strcpy(buffer, origine);
   strcat(buffer, chaine);
 
   /* Retourne la chaine contenant la chaine d'origine + la chaine a ajouter */
   return buffer;  
}
 
 
Est ce que je suis a coté de la plaque ou est ce que c'est ca qu'il te fallait ?

Reply

Marsh Posté le 07-07-2004 à 16:33:17    

merci dada pour ta reponse :)
 
c'est ca qu'il me fallait exactement cela
effectivement avec strlen, et strcat c'est quand meme mieux avec que sans, que du bonheur ahah
 
sinon je dans l'appel de fonction j'ai truc du genre
 
char buffer[300];
 
while(){
 
*buffer = rajout(buffer, chaine);
 
}
 
..pour que le contenu buffer ne soit pas ecrase par la pile d'execution, je dois retourner le pointeur de tete de ma chaine buffer dans mon programme principal et la conserver dans *buffer?
 
et si je faisais a la place:
while(){
 
rajout(buffer, chaine);
 
}
 
..la je rentrerais dans mon cas d'avant et buffer serais effectivement ecrase?  
 
est-bien comme cela que ca fonctionne?
 
ps: sinon mon programme fonctionne maintenant sous windows compile avec gcc...
sinon j'ai un probleme d'execution sous un system HP/UX..pas d'erreur de compilation, mais tous de meme des warnings si je fait un gcc -Wall sur les fonctions de strcpy, strcat et strcmp..je pense que je vais ouvrir un autre topic pour cela ;)
 
...alors pas d'erreur de compilation pour un gcc -o
cepandant quand je lance mon programme, le ksh me retourne cette erreur au plantage:
 
./to_xml[16]: 14816 Memory fault(coredump)
 
 
assez relou en perspective, des erreurs d'allocation memoire...
 
alors si tu sais d'ou ca viens worlddada tu es mon sauveur et mon genie et bien baleze avec les maigres d'infos que j'ai, sinon sais tu comment tracer mon erreur memoire?
 
 
 

Reply

Marsh Posté le 07-07-2004 à 17:07:35    

#include <string.h> ?
Etant donné que je ne connais pas l'option -Wall, je ne peux pas vraiment t'aider pour le pb d'alloc mémoire
 
Sinon, c'est pas *buffer = rajout(buffer, chaine);  
mais buffer = rajout(buffer, chaine);  
 
Apres, tu peux peut etre modifier directement le parametre mais perso, j'aime pas faire ca ... ou alors je fais si je veux faire ca : rajout(&buffer, chaine);
 
void rajout(char **buffer, char *chaine)
{
  /* Idem en rajoutant * devant buffer */
}
 
Je met toujours en valeur de retour meme si c'est possible plus simplement car dans mon esprit, c'est plus clair.
Et vu que c'est pas plus lent ... je préfere comme ca :)

Reply

Marsh Posté le 07-07-2004 à 17:07:35   

Reply

Marsh Posté le 07-07-2004 à 17:09:10    

par contre, pour savoir où ca merde, tu peux mettre des printf("x" ); un peu partout (tu met des x différents a chaque fois) et comme ca, tu prends le dernier "x" affiché et tu sais que c'est entre le printf correspondant a ce x et lui suivant  
 
Je me suis peut etre mal exprimé ...
 :D

Reply

Marsh Posté le 07-07-2004 à 20:12:49    

ça manque de const bordel :o

Reply

Marsh Posté le 08-07-2004 à 02:16:30    

Deja a la base, une fonction comme celle ci:
> void rajout(char buffer[300], char chaine[151]);
Du fait qu'elle passe ses parametres par copie, il y a peu de chances qu'elle puisse modifier le buffer initial...
:D
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-07-2004 à 07:37:30    

pauvre gilou ... tu baisse dans mon estime là ...

Reply

Marsh Posté le 08-07-2004 à 08:39:47    

Etant donné que tu passe l'adresse du buffer, pourquoi pas ...
J'aime pas mais ca devrait marcher  :)

Reply

Marsh Posté le 08-07-2004 à 09:26:15    

..oui exact worldofdada, merci de ta reponse, tout est clair maintenant :)

Reply

Marsh Posté le 08-07-2004 à 11:56:33    

Taz a écrit :

pauvre gilou ... tu baisse dans mon estime là ...

J'avais posté ca là pour voir s'il y en avaient qui suivaient (et histoire de relancer un peu le topic), mais a par toi, ca a pas l'air d'être des masses le cas.
Mon smiley etait un indice...
A+,


Message édité par gilou le 08-07-2004 à 11:57:31

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed