problème avec malloc enfin je pense ...

problème avec malloc enfin je pense ... - C - Programmation

Marsh Posté le 12-05-2005 à 10:33:25    

Bonjour a tous!
 
Voila je cherche à remplir un tableau d'entier de taille max 1200 * 1200 qui stocke le nbre de passage sur un pixel.
 
je realise mon allocation ds le  .hpp :
 

Code :
  1. long int *passage =   (long int *) malloc (DIMENSION * DIMENSION * sizeof (long int));


 
tout ca est initialisé a zero:

Code :
  1. void InitCarte(int dimbord)
  2. {
  3.     int i,j;
  4.     for(i = 0; i < dimbord; i++) 
  5.     {
  6.         for(j = 0; j < dimbord; j++)
  7.         {
  8.             *(passage + i * (dimbord) + j) = 0;
  9.         }
  10.     }
  11. }


 
 
je remplis au fur et à mesure avec:
 

Code :
  1. *(passage + y * (dimension) + x) += 1;


 
puis a la fin j'écris tout dans un fichier .txt:
 

Code :
  1. FILE  *frequence;
  2.         if ((frequence = fopen("frequence.txt","w+" )) == NULL) 
  3.         {
  4.             printf("Impossible d'ouvrir le fichier : %s\n",frequence);
  5.             exit(1); 
  6.         }
  7.         long int valeur;
  8.         for(int i = 0; i < dimension;i++) 
  9.         {
  10.             if (i != 0)
  11.                 fprintf(frequence,";\n" );
  12.             for(int j = 0; j < dimension; j++)
  13.             {
  14.                 valeur = *(passage + j * (dimension) + i);
  15.                 fprintf(frequence,"%d ",valeur);
  16.             }
  17.         }
  18.         fclose(frequence);


 
 
le truc c'est que je fais de la simulation et donc des replicats et a partir de 20réplicats avex 20000 pas de temps mon .txt est remplit de caracteres des plus farfelus.

Reply

Marsh Posté le 12-05-2005 à 10:33:25   

Reply

Marsh Posté le 12-05-2005 à 10:44:10    

Tout d'abord, si tu initialises tout à 0 après l'allocation, utilise calloc() au lieu de malloc(), qui fait exactement ça : allocation + initialisation à 0 (malloc() ne fait qu'allouer).
 
Ensuite :

Citation :

le truc c'est que je fais de la simulation et donc des replicats et a partir de 20réplicats avex 20000 pas de temps mon .txt est remplit de caracteres des plus farfelus.


 
Je n'ai pas bien compris ce que tu voulais dire.
 
Ceci dit, j'utiliserais %ld et non %d pour tes long int.


Message édité par Elmoricq le 12-05-2005 à 10:46:08
Reply

Marsh Posté le 12-05-2005 à 11:34:56    

utilise l'operateur [], et si tu fais ca en c++ (tu parles de .hpp) tu pourrais indexer ta matrice comme un tableau 2d

Reply

Marsh Posté le 12-05-2005 à 11:40:32    

ok merki pour vos réponses je vais regarder ca

Reply

Marsh Posté le 12-05-2005 à 11:45:40    

attend, tu fais du C ou du C++ ?

Reply

Marsh Posté le 12-05-2005 à 13:56:14    

seldon1 a écrit :

Voila je cherche à remplir un tableau d'entier de taille max 1200 * 1200 qui stocke le nbre de passage sur un pixel.
 
je realise mon allocation ds le  .hpp :


!!! En C on utilise .h pour les headers, .hpp, c'est pour un autre langage. (Ca ne change rien fonctionellement, mais ça permet d'y voir clair...)
 
D'autre part, dans un header, on ne met pas de code.  

Citation :

Code :
  1. long int *passage =   (long int *) malloc (DIMENSION * DIMENSION * sizeof (long int));



Ceci appartient clairement à un fichier .c , et s'écrit tout simplement

Citation :

long *passage = malloc (DIMENSION * DIMENSION * sizeof *passage);



 
http://mapage.noos.fr/emdel/notes.htm#malloc

Citation :


tout ca est initialisé a zero:

Code :
  1. void InitCarte(int dimbord)
  2. {
  3.     int i,j;
  4.     for(i = 0; i < dimbord; i++) 
  5.     {
  6.         for(j = 0; j < dimbord; j++)
  7.         {
  8.             *(passage + i * (dimbord) + j) = 0;
  9.         }
  10.     }
  11. }




Ok, bonjour la globale... passons...

           passage [(i * dimbord) + j] = 0;


ceci fonctionne:


#include <stdlib.h>
#include <stdio.h>
 
void InitCarte (long *passage, int dimbord)
{
   int i, j;
   for (i = 0; i < dimbord; i++)
   {
      for (j = 0; j < dimbord; j++)
      {
#if 0
         *(passage + i * (dimbord) + j) = 0;
#else
         *(passage + i * (dimbord) + j) = i * j;
#endif
      }
   }
}
 
int main (void)
{
#define DIMENSION     10
   long *passage = malloc (DIMENSION * DIMENSION * sizeof (long));
   if (passage != NULL)
   {
      InitCarte (passage, DIMENSION);
      {
         char const *fname = "frequence.txt";
         FILE *frequence = fopen (fname, "w" );
         if (frequence == NULL)
         {
            perror (fname);
            exit (EXIT_FAILURE);
         }
         long int valeur;
         int i;
         for (i = 0; i < DIMENSION; i++)
         {
            int j;
            for (j = 0; j < DIMENSION; j++)
            {
               valeur = *(passage + j * (DIMENSION) + i);
               fprintf (frequence, "%ld ", valeur);
            }
            fprintf (frequence, ";\n" );
         }
         fclose (frequence);
      }
      free (passage);
   }
   return 0;
}


Ce qui donne :


0 0 0 0 0 0 0 0 0 0 ;
0 1 2 3 4 5 6 7 8 9 ;
0 2 4 6 8 10 12 14 16 18 ;
0 3 6 9 12 15 18 21 24 27 ;
0 4 8 12 16 20 24 28 32 36 ;
0 5 10 15 20 25 30 35 40 45 ;
0 6 12 18 24 30 36 42 48 54 ;
0 7 14 21 28 35 42 49 56 63 ;
0 8 16 24 32 40 48 56 64 72 ;
0 9 18 27 36 45 54 63 72 81 ;


Pour les calculs d'index, j'aurais fait une macro ou une fonction.


Message édité par Emmanuel Delahaye le 12-05-2005 à 14:05:38

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 12-05-2005 à 14:08:39    

Emmanuel Delahaye a écrit :

!!! En C on utilise .h pour les headers, .hpp, c'est pour un autre langage. (Ca ne change rien fonctionellement, mais ça permet d'y voir clair...)
 
D'autre part, dans un header, on ne met pas de code.  


 
Dans un autre langage, ça peut arriver ... ;)

Reply

Marsh Posté le 12-05-2005 à 14:15:20    

++fab a écrit :

Dans un autre langage, ça peut arriver ... ;)


 
mais on peut quand meme separer l'interface de l'implementation dans cet autre langage donc on peut faire mumuse avec le cpp pour rendre ca propre :) (je ne sais meme pas si ca se fait, c'est mal?)

Reply

Marsh Posté le 12-05-2005 à 16:21:57    

++fab a écrit :

Dans un autre langage, ça peut arriver ... ;)


... et même en C99 avec inline. J'ai un peu simplifié pour ne pas noyer le newbie...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-05-2005 à 13:12:18    

Ok merci pour vos réponses
 
l'explication du .hpp au lieu du .h c'est que je dois exporter ce code dans une interface graphique (en C++)
 

Reply

Marsh Posté le 26-05-2005 à 13:12:18   

Reply

Marsh Posté le 27-05-2005 à 22:23:17    

skelter a écrit :

mais on peut quand meme separer l'interface de l'implementation dans cet autre langage donc on peut faire mumuse avec le cpp pour rendre ca propre :) (je ne sais meme pas si ca se fait, c'est mal?)


 
Ca dépend, si tu utilises une fonctionnalité avancée de cet autre langage nommée template, ça peut devenir difficile de ne pas mettre de code dans le header.  
c'est sûr que ce constat peut donner de l'urticaire à certains (non non, je ne vise personne en particulier ;) ), mais on n'est pas du tout obligé d'utiliser lesdites fonctionnalités avancées. :p


Message édité par el muchacho le 27-05-2005 à 22:25:18
Reply

Marsh Posté le 28-05-2005 à 11:10:31    

el muchacho a écrit :

Ca dépend, si tu utilises une fonctionnalité avancée de cet autre langage nommée template, ça


CPP c'est le C-Pre-Processor et non 'un autre langage' !
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-05-2005 à 16:25:06    

je voulais dire que meme si c++ impose avec les templates (ou inline) de mettre les definition dans un header il est toujours possible de separer visuellement l'interface de l'implementation, avec le cpp on peut faire un fichier contenant les definition inclu a la fin de l'header mais est ce que ca se fait ?

Reply

Marsh Posté le 02-06-2005 à 20:48:54    

oui, libstdc++ le fait

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed