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 Re Allocation dynamique 2D


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 79
    Points
    79
    Par défaut Probleme Re Allocation dynamique 2D
    Bonjour,
    J'ai un probleme de reallocation dynamique. Pas grand chose a expliquer, un probleme qui doit souvent sortir je suppose mais je ne vois pas la solution. voici un echantillon de mon programme:
    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
    void _tmain(int argc, _TCHAR* argv[])
    {
    	int **TOC_R;
    	TOC_R = (int **)malloc(100 * sizeof(int *));
    	for (int i = 0; i < 100; i++)
    	{	TOC_R[i] = (int *)malloc (20 * sizeof(int));}
     
    	int **TOC_C;
    	TOC_C = (int **)malloc(100 * sizeof(int *));
    	for (int i = 0; i < 100; i++)
    	{	TOC_C[i] = (int *)malloc (20 * sizeof(int));}
     
            for (int p=0;p<NbFile+1;NbFile++)
    	{
    		for (int q=0;q<NbFile+1;NbFile++)
    		{
                          Nb_R=LireFichier(Tab2D, namefile[p]);
                          TOC_R = (int **) realloc(TOC_R, 20*sizeof(int *));
    	              for (int i = 0; i < Nb_R; i++)
    		      {	TOC_R[i] = (int *) realloc (TOC_R[i],20 *sizeof(int));}
     
                           Nb_C=LireFichier(Tab2D, namefile[q]);
                           TOC_C = (int **) realloc(TOC_C, 20*sizeof(int *));
    	             	for (int i = 0; i < Nb_C; i++)
    			{ TOC_C[i] = (int *) realloc (TOC_C[i],20 *sizeof(int));}
     
                            [...] // traitement en lecture sur ces tableaux
     
                            for (int f = 0 ; f< Nb_C; f++)
    			{
    				free(TOC_C[f]);
    				TOC_C[f] = NULL ;
    			}
    			free(TOC_C);
    			TOC_C=NULL;
     
    			for (int f = 0 ; f< Nb_R; f++)
    			{
    				free(TOC_R[f]);
    				TOC_R[f] = NULL ;
    			}
    			free(TOC_R);
    			TOC_R=NULL;
                  }
          }
    }
    Je ne vois pas ce qui ne vas pas. d'un autre coter je ne suis pas sur que le malloc soit bien utiliser.
    je suis preneur pour toutes corrections ou autre solutions.
    Merci d'avance

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par zicos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int p=0;p<NbFile+1;NbFile++)
    	{
    		for (int q=0;q<NbFile+1;NbFile++)
    		{
    Si rien ne te choque dans ce zoom de code, il faut aller voir un opticien d'urgence.

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 79
    Points
    79
    Par défaut
    Ok j'ai vu ca apres mais ca ne repond en aucun cas a la question. c pas grave je vais me rabattre une fois de plus sur des variables statiques.

  4. #4
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par zicos
    Ok j'ai vu ca apres mais ca ne repond en aucun cas a la question. c pas grave je vais me rabattre une fois de plus sur des variables statiques.
    Si il n'y avait que ça...Ton code n'est pas du C mais du C++, sinon on ne trouverait pas de variables déclarées après des instructions, des variables dont la portée est la boucle, des casts sur les retours de malloc(). Le premier appel à LireFichier(Tab2D, namefile[p]); qui renvoie Nb_R est inutilement appelé dans la boucle ayant la variable q. Il y a des problèmes de fond qui ne vont certainement pas être résolus par le fait de mettre telle ou telle variable en statique.

    Donc si cela doit être du C, en le fait en C mais on créé un ADT de type matrice ici ou alors on simule un tableau 2D avec un seul tableau (cf. FAQ). Si c'est du C++, on oublie les tableaux 2D de la sorte et les malloc()/realloc() et free() qui vont avec, on utilise des conteneurs comme std::vector.

    A+

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par zicos
    Bonjour,
    J'ai un probleme de reallocation dynamique. Pas grand chose a expliquer, un probleme qui doit souvent sortir je suppose mais je ne vois pas la solution. voici un echantillon de mon programme:
    <...>
    Je ne vois pas ce qui ne vas pas. d'un autre coter je ne suis pas sur que le malloc soit bien utiliser.
    je suis preneur pour toutes corrections ou autre solutions.
    Merci d'avance
    Déjà, écrire du code C standard, parce que là, mon compilateur a tout revomi...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:1: error: syntax error before "_TCHAR"
    main.c:2: warning: function declaration isn't a prototype
    main.c: In function `_tmain':
    main.c:4: warning: implicit declaration of function `malloc'
    main.c:5: error: 'for' loop initial declaration used outside C99 mode
    main.c:11: error: redefinition of 'i'
    main.c:5: error: previous definition of 'i' was here
    main.c:11: error: 'for' loop initial declaration used outside C99 mode
    main.c:15: error: 'for' loop initial declaration used outside C99 mode
    main.c:15: error: `NbFile' undeclared (first use in this function)
    main.c:15: error: (Each undeclared identifier is reported only once
    main.c:15: error: for each function it appears in.)
    main.c:17: error: 'for' loop initial declaration used outside C99 mode
    main.c:19: error: `Nb_R' undeclared (first use in this function)
    main.c:19: warning: implicit declaration of function `LireFichier'
    main.c:19: error: `Tab2D' undeclared (first use in this function)
    main.c:19: error: `namefile' undeclared (first use in this function)
    main.c:20: warning: implicit declaration of function `realloc'
    main.c:21: error: 'for' loop initial declaration used outside C99 mode
    main.c:25: error: `Nb_C' undeclared (first use in this function)
    main.c:27: error: redefinition of 'i'
    main.c:21: error: previous definition of 'i' was here
    main.c:27: error: 'for' loop initial declaration used outside C99 mode
    main.c:31: error: syntax error before '[' token
    main.c:33: error: `f' undeclared (first use in this function)
    main.c:33: error: syntax error before ')' token
    main.c:36: error: `NULL' undeclared (first use in this function)
    main.c:38: warning: implicit declaration of function `free'
    main.c:40: error: 'for' loop initial declaration used outside C99 mode
    main.c: At top level:
    main.c:49: error: syntax error before '}' token
    Process terminated with status 1 (0 minutes, 1 seconds)
    24 errors, 5 warnings

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 79
    Points
    79
    Par défaut
    J'ai comme tout le monde appris le C il y a quelque temps et connais quelque truc de C++. Je sais que mon code est loin d'être propre mais je voulais juste faire tourner en C un algo écrit initialement sous matlab. Le retour au C est un peu dur ! J'ai poster cela en C car je pensais que c'était plus un probleme de C que de C++, mais j'ai du mal a voir la limite entre les deux.
    Enfin bref, je vous remercie pour vos réponses. Mon programme tourne et meme dans l'état ou il est il tourne plus vite que l'équivalent matlab.
    Je ne sais pas si il faut resoudre ou non cette nouvelle discussion. Je laisse un modérateur prendre l'initiative mais pour moi c bon!

    PS_1: je ne vois pas l'interet d'essayer de compiler un programme alors que j'ai préciser que ce n'était qu'un échantillon du code entier.
    PS_2:mon code en C me permet juste de faire des test sur une base de donnée, il ne sera plus utilisé par la suite et je n'ai pas le temps de faire qqch de plus propre.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    C'est du code en TCHAR tel que le propose Visual.
    Ces lignes devraient suffire à le faire compiler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define _tmain main
    typedef char _TCHAR;
    Ensuite, ce qui est incorrect, c'est que le reste du code suit des idiomes C++, notamment le cast du retour de malloc(), qui est inutile en C.

    De plus, en C, la tradition veut que seules les constantes connues à la compilation, defines (et sous Windows, typedefs) soient en majuscule, et surtout pas les variables.

    Quant à l'allocation dynamique 2D, c'est pratiquement une FAQ sur ce forum.
    Voir par exemple ces fonctions:
    http://www.developpez.net/forums/sho...3&postcount=14

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

Discussions similaires

  1. probleme allocation dynamique de mémoire
    Par totoscill dans le forum C
    Réponses: 18
    Dernier message: 28/02/2008, 16h44
  2. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  3. Probleme d'allocation dynamique
    Par Xav987 dans le forum C++
    Réponses: 6
    Dernier message: 04/03/2007, 13h43
  4. probleme allocation dynamique
    Par ciberju dans le forum C
    Réponses: 2
    Dernier message: 28/08/2006, 09h40
  5. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27

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