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

Bibliothèque standard C Discussion :

problème sur un malloc


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut problème sur un malloc
    Voila j'ai un soucis sur la ligne du malloc. En effet, j'ai deux fonctions qui supprime un element d'un tableau.Lorsque je lance ces deux fonctions cela me fait une erreur (le pc rame et ne repond plus..). Ce problème se trouve lors de l'appel à la second fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void algorithmeTournee(s_livraison** tabLivraisonTotale, s_livraison** tabLivraisonParPlateforme, s_plateforme* tabPlateforme,int *nbLivraisonTotale, int *nbLivraisonParPlateforme, int nbPlateforme, int numPlat){
     
    suppElement(tabLivraisonTotale,(*tabLivraisonParPlateforme+numeroLivraison)->nBon, nbLivraisonTotale);
    retirerElement(tabLivraisonParPlateforme, numeroLivraison, nbLivraisonParPlateforme);
    et voici le code des deux fonctions...
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    void retirerElement(s_livraison **tab, int indice, int *nbLivraison){
     
    int i;
    int j=0;
    s_livraison *temp=NULL;
    printf("debut indice = %d et nbLivraison = %d\n",indice,*nbLivraison);
    system("pause");
     
    temp = (s_livraison*)malloc ((*nbLivraison-1) * sizeof(s_livraison));
    if(temp==NULL) printf("ERREUR \n"); else printf("OK \n");
     
    for(i=0,j=0; i<(*nbLivraison) && j<(*nbLivraison); i++,j++){
     
         //element different de celui à supprimer
         if (i != indice){
           //recopie de lelement a garder  
           *(temp+i)=*(*tab+j);
         }else{
               j=j+1;           
               if(j<(*nbLivraison))*(temp+i)=*(*tab+j);
        } 
     }
     
    //Free du tableau
    free(*tab);
     
    *tab=temp;  
     
    // Taille = taille -1
    *nbLivraison = *nbLivraison - 1;
     
    }
     
    void suppElement(s_livraison **tab, int nBonAsupp, int *nbLivraison){
     
    int i;
    int j=0;
    s_livraison *temp;
     
    temp = (s_livraison*)malloc ((*nbLivraison-1) * sizeof(s_livraison));
    if(temp==NULL) printf("ERREUR \n"); else printf("OK \n");
     
    for(i=0,j=0; i<(*nbLivraison) || j<(*nbLivraison); i++,j++){    
         //element different de celui à supprimer
         if((*tab+i)->nBon != nBonAsupp){
           //recopie de lelement a garder  
           *(temp+i)=*(*tab+j);
         }else{
           j=j+1;
           if(j<(*nbLivraison))*(temp+i)=*(*tab+j);
        }
     }
     
    //Free du tableau
    free(*tab);
     
    *tab=temp;  
     
    // Taille = taille -1
    *nbLivraison = *nbLivraison - 1;
    }
    Merci.

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for(i=0,j=0; i<(*nbLivraison) || j<(*nbLivraison); i++,j++){    
         //element different de celui à supprimer
         if((*tab+i)->nBon != nBonAsupp){
           //recopie de lelement a garder  
           *(temp+i)=*(*tab+j);
         }else{
           j=j+1;
           if(j<(*nbLivraison))*(temp+i)=*(*tab+j);
        }
     }
    Je pense que tu voulais mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0,j=0; i<(*nbLivraison) && j<(*nbLivraison); i++,j++){    
         ...
     }

  3. #3
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temp = (s_livraison*)malloc ((*nbLivraison-1) * sizeof(s_livraison));
    il ne faut pas utilisé du CAST avec malloc



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    }else{
               j=j+1;           
               if(j<(*nbLivraison))*(temp+i)=*(*tab+j);
        }
    C'est pas bien ça, tu remplie la même zone par des différent valeurs !!! et je sais pas pourquoi ?

  4. #4
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Ok pour le CAST.

    Non je ne rempli pas la même zone par differente valeur vu que j = j+1 dans le cas ou c'est bien l'element que je veux supprimer donc je prend l'element suivant.. et je decalle l'indice j d'une case.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le code n'est pas sûr. Si pour une raison, (parce que peut être déjà supprimé) aucun élément n'est supprimé (indice >= nbLivraison ou nBonAsupp pas trouvé) le tableau temp est sous-dimensionné.

    Il serait plus économique de faire l'élimination sur place, dans *tab, puis à la fin de le redimensionner éventuellement.
    Pour la première fonction, on aurait quelque chose du genre :
    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
    void retirerElement(s_livraison **tab, int indice, int *nbLivraison)
    {
    int i;
    int j;
    for(i=0,j=0; i< *nbLivraison; i++)
    {
         if (i == indice) i++;
         else 
         {
           *(*tab+j)=*(*tab+i);
           j++;
         }
     }
    if( j != *nbLivraison)
    {
     s_livraison *temp = realloc(*tab,j*sizeof(s_livraison));
     if(temp != NULL) *tab = temp;
     *nbLivraison =*nbLivraison -1;
    }
    [Code non testé]

  6. #6
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Exactement... jaurais du y penser.
    merci.

    Problème resolu.

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

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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