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 :

Probleme de malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Par défaut Probleme de malloc
    Salut a tous,

    Je dois rendre un programme pour la semaine prochaine en C.
    Mais j'ai un problème , j'explique :

    Je suis sous Vista donc je ne peux utiliser que Visual C++ qui a été mis a jour pour Vista (sinon y'a des problemes de compilation )
    Je veux tester ce programme sous une autre machine et la ca foire, j'essaye encore sous une autre et ca refoire;
    En faisant plusieurs test je me rend compte que ca bloque sur un malloc

    Est-ce que c'est possible que l'ordi bloque tout seul sur un malloc?
    En plus c'est pour faire une copie donc j'avais déjà fait ce même malloc avant.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin montre ton code ... là c'est un peu dur de t'aider.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre confirmé Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Par défaut
    ok...

    en fait dans un .c j'ai ca:

    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
    TYPE** InitialiserEchiquier(Coordonnees* taille_tab){			
     
    ..........
     
    echiquier = (TYPE**)malloc(sizeof(TYPE*)*x);
    		if (echiquier == NULL){							
    			fprintf(stderr,"!! . ..Erreur d'allocation (colonnes).. . !!\n\n");
    			exit(1);
    		}
    		for ( i = 1 ; i <= x ; i++){							
    			echiquier[i] = (TYPE *)malloc(sizeof(TYPE)*y);			
    			if (echiquier[i] == NULL){							
    				fprintf(stderr,"!! . ..Erreur d'allocation (ligne %d).. . !!\n\n",i);
    				exit(1);
    			}
    		}
    ....
     
        }
     
    	return echiquier;
    }
    ce malloc marche mais appres j'ai cette fonction :


    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
    TYPE** CopieEchiquier(TYPE** echiquier,Coordonnees taille_tab){
    	TYPE** copie;
    	int i;
    	int j;
     
    	copie = (TYPE**)malloc(sizeof(TYPE*)*taille_tab.x); // apparament (si mes tests sont exact... ) c'est la que ca bloque
    		if (copie == NULL){
    			printf("!! . ..Erreur d'allocation (colonnes).. . !!\n\n");
    			exit(1);
    		}
    		for ( i = 1 ; i <= taille_tab.x ; i++){
    			copie[i] = (TYPE *)malloc(sizeof(TYPE)*taille_tab.y);
    			if (copie[i] == NULL){
    				printf("!! . ..Erreur d'allocation (ligne %d).. . !!\n\n",i);
    				exit(1);
    			}
    		}
    		for ( i = 1 ; i <= taille_tab.x ; i++){
    			for ( j = 1 ; j <= taille_tab.y ; j++){
    				copie[i][j].coord.x=echiquier[i][j].coord.x;
    				copie[i][j].coord.y=echiquier[i][j].coord.y;
    				copie[i][j].representation=echiquier[i][j].representation;
    			}
    		}
     
     
    		return copie;
    }

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Franchement, je reste perplexe quant à l'endroit où ton programme plante, il est déjà rare qu'un malloc échoue donc cela pourrait très bien venir d'autre part, à tester mais sans le programme complet je ne peut t'en dire plus pour le moment.

    Juste un conseil pour améliorer la lisibilité et la maintenance de ton code pour un malloc, prennons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier = (TYPE**)malloc(sizeof(TYPE*)*x);
    fait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier = malloc (x * sizeof (** echiquer));
    de même pour allouer les indices de ton tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier[i] = (TYPE *)malloc(sizeof(TYPE)*y);
    fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier[i] = malloc (y * sizeof (* echiquier));
    Tu peux remarquer que j'ai supprimé les cast car en effet, ils sont inutiles en C sauf si tu veux que ton programme soit compilable par un compilateur C++
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre confirmé Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Par défaut
    Ca marche en metant autre chause que des types dans le sizeof ??
    J'avais appris comme ca.
    Mais je trouve ca bizarre aussi que ca foire aux malloc...

    peut etre que c'est un autre probleme je vais retester mais quand je met un printf apres la ligne ou je croyais que ca merdais, il n'affiche pas a l'ecran.

    Sinon on est d'accord que le probleme c'est sur copie par sur echiquier.
    (enfin le probleme sur Code::Blocks... c'est bizarre ca...?)

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par L8O8L
    Ca marche en metant autre chause que des types dans le sizeof ??
    J'avais appris comme ca.
    Oui biensûr que ca fonctionne, un pointeur pointe sur une donnée d'un type mais c'est que du point de vue maintenance, la solution que je te propose est nettement mieux.

    Imagine en utilisant ta méthode, le type change, tu sera obligé de revoir toutes tes allocations pour changer le type dans tes sizeof alors qu'avec la mienne, juste à changer le type dans la déclaration du pointeur

    Voilà le gros avantage
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Franck.H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier[i] = malloc (y * sizeof (* echiquier));
    ce ne serait pas plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier[i] = malloc (y * sizeof (* echiquier[i]));

  8. #8
    Membre confirmé Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Par défaut
    Aparament ca depend des machines
    Donc on va mettre 'resolu' et voila..

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par salseropom
    ce ne serait pas plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echiquier[i] = malloc (y * sizeof (* echiquier[i]));
    Je n'ai jamais testé cette approche mais ma solution fonctionne !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Probleme avec malloc sur tableau de chaine
    Par grex1 dans le forum C
    Réponses: 2
    Dernier message: 12/09/2010, 22h36
  2. probleme avec malloc
    Par coyotemk dans le forum Débuter
    Réponses: 5
    Dernier message: 20/12/2009, 21h34
  3. probleme avec malloc
    Par Hisoka_Hunter dans le forum C
    Réponses: 4
    Dernier message: 14/01/2009, 08h43
  4. Probleme de malloc détecté par valgrind
    Par photonman dans le forum Débuter
    Réponses: 10
    Dernier message: 06/05/2008, 14h54
  5. Probleme avec malloc
    Par boula dans le forum C
    Réponses: 6
    Dernier message: 03/07/2007, 09h36

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