Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1347 connectés 

  FORUM HardWare.fr
  Programmation
  C

  pile memoire - modification donnees

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pile memoire - modification donnees

n°788820
kungouf
Posté le 07-07-2004 à 10:31:15  profilanswer
 

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
mood
Publicité
Posté le 07-07-2004 à 10:31:15  profilanswer
 

n°788822
kungouf
Posté le 07-07-2004 à 10:34:04  profilanswer
 

houla, excusez moi pour les couleurs....

n°788834
cricri_
Posté le 07-07-2004 à 10:45:40  profilanswer
 

utilise strcat()

n°788846
Worldofdad​a
Posté le 07-07-2004 à 11:01:18  profilanswer
 

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

n°788885
kungouf
Posté le 07-07-2004 à 11:34:49  profilanswer
 

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

n°788908
Worldofdad​a
Posté le 07-07-2004 à 11:47:57  profilanswer
 

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

n°788943
kungouf
Posté le 07-07-2004 à 12:09:47  profilanswer
 

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 :)

n°789120
Worldofdad​a
Posté le 07-07-2004 à 14:01:00  profilanswer
 

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 ?

n°789322
kungouf
Posté le 07-07-2004 à 16:33:17  profilanswer
 

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?
 
 
 

n°789358
Worldofdad​a
Posté le 07-07-2004 à 17:07:35  profilanswer
 

#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 :)

mood
Publicité
Posté le 07-07-2004 à 17:07:35  profilanswer
 

n°789361
Worldofdad​a
Posté le 07-07-2004 à 17:09:10  profilanswer
 

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

n°789574
Taz
bisounours-codeur
Posté le 07-07-2004 à 20:12:49  profilanswer
 

ça manque de const bordel :o

n°789785
gilou
Modérateur
Modzilla
Posté le 08-07-2004 à 02:16:30  profilanswer
 

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é!  --
n°789794
Taz
bisounours-codeur
Posté le 08-07-2004 à 07:37:30  profilanswer
 

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

n°789812
Worldofdad​a
Posté le 08-07-2004 à 08:39:47  profilanswer
 

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

n°789828
kungouf
Posté le 08-07-2004 à 09:26:15  profilanswer
 

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

n°790110
gilou
Modérateur
Modzilla
Posté le 08-07-2004 à 11:56:33  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  pile memoire - modification donnees

 

Sujets relatifs
modification du nom d'un service sous C++BuilderComment transferer des donnees d'une base a l'autre ? ( access )
Insertion de données excel dans un tableaux phpmyadmin[Weblogic] pas assez de mémoire sous l'EDI Workshop
[PHP/HTML] Recupéré des données vers le HTMLZE LAST ONE - modification des champs de la base
récupération de donnéesComment lister les bases de données Mysql en java?[resolut]
recuperer des donnees dans une bdd! 
Plus de sujets relatifs à : pile memoire - modification donnees


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR