IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Re-problème avec realloc() (désolé)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut Re-problème avec realloc() (désolé)
    Désolé mais j'ai mit l'autre sujet un peu trop vite pour le delestage

    Bon alors voilà le bug qui sévit depuis un bon moment et pour lequel je m'arrache les cheveux


    Je déclare ma structure et l'alloue avec calloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cont[count].Container = (struct ItemsContainer *)calloc(Nbr_Container+1,sizeof(struct ItemsContainer));
    Ensuite l'utilisateur doit pouvoir ajouter des container à son gré donc j'utilise un realloc() lorsqu'il décide d'ajouter un container :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    realloc(theApp.Cont[theApp.CurEntry].Container,(count+1)*sizeof(struct ItemsContainer))
    Et ca plante lorsque l'utilisateur ajoute un 3eme container !

    count représente le nombre de container déjà présent.

    Une idée ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Par défaut
    Salut

    realloc revoie un pointeur sur la nouvelle emplacement, si elle a changer, sinon retourne le meme pointeur et NULL en cas d'erreur. alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if((NewPointer = realloc(theApp.Cont[theApp.CurEntry].Container,(count+1)*sizeof(struct ItemsContainer))) != NULL)
        theApp.Cont[theApp.CurEntry].Container = NewPointer;

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut
    Oui mais mon problème est que arrivé sur mon instruction realloc() le programme plante mechamment (erreur l'adresse 0x... ne peut pas accéder à 0x.... La mémoire ne peut être "written").

    C'est ca le problème

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Par défaut
    Salut

    Surment que tu a fait fais un debordement lors d'un acces au pointeur. Malloc et realloc mettent des informations a la fin du bloc allouer, si lors d'une ecriture dans le bloc tu fais un debordement et vient ecrire par dessus ces informations, tu auras l'erreur que tu as eu dans le prochain malloc ou realloc.

    Il te reste juste a trouver ou il y a le debordement

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut
    Le problème est que donc c'est une fonction "AddContainer" et que je n'écrit pas dans container (ca contient juste d'autres structures).

    La fonction du realloc en entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    void CItemContainer::OnGitemsAdd() 
    {
    	UpdateData();
     
    	int count = m_cGItems.GetCount();
     
    	count++;
     
    	char * c = new char[12];
     
    	char * string = new char[32];
     
    	itoa(count,c,10);
     
    	memset(string,'\0',32);
     
    	strcpy(string,"Groupe d'items ");
    	strcat(string,c);
     
    	m_cGItems.AddString(string);
     
    	delete[] c;
    	delete[] string;
     
    	c = NULL;
    	string = NULL;
     
    	realloc(theApp.Cont[theApp.CurEntry].Container,(count+1)*sizeof(struct ItemsContainer));
    	theApp.Cont[theApp.CurEntry].Container[count].Nbr_Drop = 0;
    	theApp.Cont[theApp.CurEntry].Nbr_Container++;
    	theApp.Cont[theApp.CurEntry].IfCont[count] = true;
     
    	UpdateWindow();
    }
    C'est du MFC je sais et c'est compilé avec VC++ 6.0 mais c'est pas grave ca doit marcher quand même

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Par défaut
    Bonjour,

    Je suppose que la table 'IfCont' est suffisament grande ou est reallouee
    autre part ?

    Cordialement

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut
    Oui IfCont était alloué ailleur mais pour m'assurer que c'était assez alloué j'ai ajouté la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    realloc(theApp.Cont[theApp.CurEntry].IfCont,(count+1)*sizeof(bool));
    Mais ca ne change pas le fait qu'au 3eme Container ca plante (la même erreur)

    Le débuggeur me sort ca comme erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    First-chance exception in Edit Tool.exe (MSVCRTD.DLL): 0xC0000005: Access Violation.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Par défaut
    Salut

    ton realloc n'es pas correcte regare le premier message que je t'es envoyer

    quand tu fais un realloc, tu n'es jamais sur que la zone de memoire renvoyer est la meme que celle de depart, mais realloc ne modifie par ton pointeur de depart.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut
    Yeah ! merci j'ai fais ce code et ca marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ItemsContainer * NewContainer = (ItemsContainer *)realloc(theApp.Cont[theApp.CurEntry].Container,(count+1)*sizeof(struct ItemsContainer));
    	if(NewContainer != theApp.Cont[theApp.CurEntry].Container)
    	{
    		theApp.Cont[theApp.CurEntry].Container = NewContainer;
    	}
    	theApp.Cont[theApp.CurEntry].Container[count].Nbr_Drop = 0;
    	theApp.Cont[theApp.CurEntry].Nbr_Container++;
    	bool * NewIfCont = (bool *)realloc(theApp.Cont[theApp.CurEntry].IfCont,(count+1)*sizeof(bool));
    	if(NewIfCont != theApp.Cont[theApp.CurEntry].IfCont)
    	{
    		theApp.Cont[theApp.CurEntry].IfCont = NewIfCont;
    	}
    	theApp.Cont[theApp.CurEntry].IfCont[count] = true;
    Merci je crois que j'arrive au terme d'une longue quète en terre hostile


    RESOLU enfin je crois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec realloc
    Par darkwall_37 dans le forum Débuter
    Réponses: 28
    Dernier message: 10/12/2009, 17h37
  2. Réponses: 4
    Dernier message: 10/03/2008, 03h59
  3. Problème avec realloc et struct
    Par _SamSoft_ dans le forum Bibliothèque standard
    Réponses: 38
    Dernier message: 27/12/2007, 10h13
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo