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 :

Comment utiliser fread pour remplire 1tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut Comment utiliser fread pour remplire 1tableau dynamique
    Bonjour

    je m'y connais pas trop dans l'allocation dynamique, mais j'en ai besoin pour allouer une grande taille de données.

    j'ai une image Tiff de grande taille, je veux la charger dans une matrice dynamique ( vu qu'avec la statique les grande tailles c'est pas possible)
    enfin bref je veux utiliser fread successivement afin de lire la premiere ligne (12000 premiers bytes ou 6000 Word) ensuite je la réutilise pour la deuxieme ligne et ainsi de suite.
    je sais que ca se fait mais je sais pas le aire, et en plus je ne sais pas si fread prend en compte les matrices, ou elle charge uniquement dans des vecteurs?


    pour le moment mon programme ressemble a ça

    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
    //Déclaration
    const T=6000;     
     
    Word** ptr=new Word*[T];    //j'utilise Word car les données sont codées sur 16bits
    for(int i=0;i<T;i++)        //allocation dynamique de ptr le pointeur que je vais utiliser dans fread
        ptr[T] = new Word[T];
     
    Word ** Matrice=new Word*[T];
    for(int i=0;i<T;i++)        //allocation dynamique de la matrice qui va contenir l'image
        Matrice[T] = new Word[T];
     
    //Routine d'ouverture 
    if(OpenDialog1->Execute())
      {
     
       FILE *fichier1 = fopen (Form2->OpenDialog1->FileName.c_str(), "rb") ;
       if (!fichier1){
            ShowMessage ("Impossible d'ouvrir le fichier\n" +Form2->OpenDialog1->FileName);
            return ;
            }
     
      fread (ptr,T, T, fichier1); // là  je me demande si  il va me charger 6000 ligne et 6000 colonne dans la matrice ptr 
     
     
      for (int j=0; j<T; j++)
      for (int i=0; i<T; i++)
          {
     
           Matrice[i][j]= ptr[i][j];
           if  (Matrice[i][j] > 255) Matrice[i][j]=255; //Seuillage à la valeur maximale
           if  (Matrice[i][j] < 0) Matrice[i][j]=0;     //Seuillage à la valeur minimale
     
           Form2->Image1->Canvas->Pixels[i][j]=         //Affichage de l'image 
           TColor (RGB(Matrice[i][j],Matrice[i][j],Matrice[i][j]));
          }
       }
    mais à l'exécution sur la ligne Matrice[i][j]= ptr[i][j]; il me fait une erreur : "le projet a provoqué une classe d'exception avec le message débordement de pile"

    alors correction please et merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tout d'abord, ce code n'est pas du C. Quant à fread, cette fonction lit des données depuis un fichier pour les placer dans un buffer c'est-à-dire un espace continu alloué. Ta matrice n'utilise pas une mémoire continue parce qu'elle est issue de plusieurs allocations dynamiques. Tu dois appeller fread pour chaque ligne de ta matrice c'est-à-dire faire une lecture ligne par ligne.

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    ah désolé je me suis trompé de rubrique, je suis nouveau excusez moi ( vous pouvez transférer le sujet a la rubrique C++ )

  4. #4
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Quant à fread, cette fonction lit des données depuis un fichier pour les placer dans un buffer c'est-à-dire un espace continu alloué. Ta matrice n'utilise pas une mémoire continue parce qu'elle est issue de plusieurs allocations dynamiques. Tu dois appeller fread pour chaque ligne de ta matrice c'est-à-dire faire une lecture ligne par ligne.
    donc si j'ai bien compris ca doit etre ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //déclaration
    Word ptr[6000]; 
     
    // utilisation de fread
     
    for (int j=1; j<T; j++)
    {
     fread (ptr,T, 1, fichier1);
     for (int i=0; i<T; i++)
          {
           Matrice [i][j]=ptr[i];
          }
    }
    et comme ça a chaque fread il va lire le "bloc" suivant de 6000 Word?


    je viens d'essayer j'ai encore une classe d'exception avec violation d'acces dans la ligne Matrice [i][j]=ptr[i];
    comment faire donc pour manipuler cet espace dans le buffer?

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Déjà, je l'avais pas remarqué ce matin, il y a une erreur dans ton allocation. Le code doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Word ** p = malloc(NLIGNES * sizeof(Word*));
    for(i = 0; i < NLIGNES; i++)
        p[i] = malloc(NCOLONNES * sizeof(Word));
    Ou avec new si tu veux le faire en C++. Et j'ai pas mis les tests d'erreurs (qui sont obligatoires).

    Pour la lecture ligne par ligne t'as bien vu, je l'adapte dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i = 0; i < NLIGNES; i++)
        fread(ptr[i], sizeof(Word), NCOLONNES, f_in);
    Mais ça :
    Citation Envoyé par MClover
    Je ne comprends pas comment as-tu pu écrire une chose pareille. Correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(j = 0; j < NCOLONNES; j++)
        Matrice[i][j] = ptr[i][j];
    Sinon tu as aussi memset qui fait déjà ça. Et au fait, je ne comprends pas vraiment pourquoi tu utilises deux matrices (ptr et Matrice) mais bon, c'est ton code.

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Merci Melem pour les indications
    Maintenant je maitrise mieux les allocations dynamiques, mais cette fois je préfère charger les données sur un vecteur au lieu d’une matrice, et a chaque lecture de ligne je l’affiche puis je l’écrase avec la suivante.
    la deuxième matrice c’était pour la sauvegarde, mais je n’ai pas encore trouvé la fonction qui sauvegarde une matrice dans un fichier !!

    Voila le programme corrigé


    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
    const T=12000 ;            //résolution de l’image  
    int temp;
    Word * ptr;
    ptr= new  Word [T];
     
    Word ** Matrice;
    Matrice = new  Word*[T];
    for (int i=0; i<T; i++)
     Matrice [i]=new Word[T];
     
     
    if(OpenDialog1->Execute())
      {
     
      FILE *fichier1 = fopen (Form2->OpenDialog1->FileName.c_str(), "rb") ;
      if (!fichier1) {
                        ShowMessage ("Impossible d'ouvrir le fichier\n" +Form2->OpenDialog1->FileName);
                        return ;
                        }
     
      for (int j=0; j<(T/2); j++)
           {
            fread (ptr,2, T, fichier1);
     
            for (int i=0; i<(T/2); i++)
                 {
                 Matrice[i][j]= ptr[i];
                 temp = (ptr[i]*255)/1000;  // car les valeurs que j’ai sont des altitudes donc les plus grandes seront les plus claires (règle de trois)
                 if (temp>255)temp=255; // seuillage pour les altitudes dépassant 1000
                 Form2->Image1->Canvas->Pixels[i][j]=TColor(RGB(temp,temp,temp));
      }
          }
      }

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

Discussions similaires

  1. [TPW] Comment utiliser tdw pour tpw 1.5 ?
    Par Grebarne dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 20/12/2006, 15h03
  2. comment utiliser Scanner pour parser un String?
    Par ricardvince dans le forum Langage
    Réponses: 4
    Dernier message: 03/10/2006, 14h15
  3. Réponses: 4
    Dernier message: 18/05/2006, 09h20
  4. comment utiliser Notepad pour modifier un fichier texte?
    Par moon13_698 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 06/05/2006, 15h41
  5. Réponses: 2
    Dernier message: 27/04/2006, 16h45

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