Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
786 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problème avec malloc enfin je pense ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème avec malloc enfin je pense ...

n°1080586
seldon1
Posté le 12-05-2005 à 10:33:25  profilanswer
 

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.

mood
Publicité
Posté le 12-05-2005 à 10:33:25  profilanswer
 

n°1080598
Elmoricq
Modérateur
Posté le 12-05-2005 à 10:44:10  profilanswer
 

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
n°1080646
skelter
Posté le 12-05-2005 à 11:34:56  profilanswer
 

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

n°1080658
seldon1
Posté le 12-05-2005 à 11:40:32  profilanswer
 

ok merki pour vos réponses je vais regarder ca

n°1080665
Taz
bisounours-codeur
Posté le 12-05-2005 à 11:45:40  profilanswer
 

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

n°1080779
Emmanuel D​elahaye
C is a sharp tool
Posté le 12-05-2005 à 13:56:14  profilanswer
 

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/
n°1080798
++fab
victime du syndrome IH
Posté le 12-05-2005 à 14:08:39  profilanswer
 

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 ... ;)

n°1080807
skelter
Posté le 12-05-2005 à 14:15:20  profilanswer
 

++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?)

n°1081060
Emmanuel D​elahaye
C is a sharp tool
Posté le 12-05-2005 à 16:21:57  profilanswer
 

++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/
n°1097917
seldon1
Posté le 26-05-2005 à 13:12:18  profilanswer
 

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++)
 

mood
Publicité
Posté le 26-05-2005 à 13:12:18  profilanswer
 

n°1100108
el muchach​o
Comfortably Numb
Posté le 27-05-2005 à 22:23:17  profilanswer
 

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
n°1100229
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-05-2005 à 11:10:31  profilanswer
 

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/
n°1101901
skelter
Posté le 30-05-2005 à 16:25:06  profilanswer
 

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 ?

n°1106112
Taz
bisounours-codeur
Posté le 02-06-2005 à 20:48:54  profilanswer
 

oui, libstdc++ le fait


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problème avec malloc enfin je pense ...

 

Sujets relatifs
Probleme d'affichage d'un JComponent redefini.[javascript] probleme onmouseover avec frame
Probleme de requete sous access svp aideproblème de décalage aléatoire
Probleme javascript avec safarimail php problème...
Probleme avec la fonction onunloadproblème de get sur les chaines de caracteres (buffer)
Problème ftpProblème JList, avec 2 affichages pour 1 selection
Plus de sujets relatifs à : problème avec malloc enfin je pense ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR