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 :

Changement de cast


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut Changement de cast
    Bonjour à tous,

    J'ai encore un petit problème, j'ai fait un petit programme qui lit des "images" au format RAW codées en UINT16 (c.a.d. unsigned short int), la lecture se fait au moyen de la fonction readraw.
    Une fois les données lues, je veux les ranger dans un tableau de tableaux (ce que j'appelle une matrice 2D), tout en changeant sont cast, j'ai besoin pour la suite de mes calculs qu'il soit d'un type double qui autorise les valeurs signées et flottantes, c'est ce que j'essaie de faire tout à la fin de ce bout de code, mais ça ne marche pas :/ (erreur de segmentation)

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <tiff.h>
    #include <tiffio.h>
    #include <math.h>
     
    #define PATH_IR108 "/home/flaherty/Bureau/hauteur_panache/IR108.raw"
    #define PATH_IR120 "/home/flaherty/Bureau/hauteur_panache/IR120.raw"
     
    unsigned short int ** readraw(char *path, long nbelt);
    double ** createmat2D(int nblig, int nbcol);
     
    //####################### Fonction main#####################################
    int main(void)
    {
    int i=0, j=0, k=0;
    unsigned short int **tab_IR108, **tab_IR120;
    double **mat_IR108, **mat_IR120, tempBTD;
    int nblig=0, nbcol=0;
    long nbelt=0;
     
    nblig=600;
    nbcol=600;
    nbelt=nblig*nbcol;
     
    tab_IR108=readraw(PATH_IR108,nbelt);
    tab_IR120=readraw(PATH_IR120,nbelt);
     
    mat_IR108=createmat2D(nblig,nbcol);
    mat_IR120=createmat2D(nblig,nbcol);
     
    printf("controle : %i - %i\n",tab_IR108[0],tab_IR120[0]);
     
    k=0;
    for (i=0;i<nblig;i++)
       {
       for (j=0;j<nbcol;j++)
          {
          mat_IR108[i][j]=(double)*tab_IR108[k]/100.0;
          mat_IR120[i][j]=(double)*tab_IR120[k]/100.0;
          k++;
          }
       }
     
    ... blablabla

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour, Peux tu poster le code des fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned short int **readraw(char *path, long nbelt);
    double **createmat2D(int nblig, int nbcol);

  3. #3
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Bien sûr, les voilà :

    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
    47
    48
    49
    50
    51
    //##################### fonction de lecture des images raw ###############################
    unsigned short int **readraw(char * path, long nbelt)
    {
    unsigned short int *buff, **tab;
    int i=0;
    FILE *fic;
     
    fic=fopen(path,"r");
    if (fic==NULL)
       {
       printf("\nerreur lors de l'ouverture de :\n%s\n\n",path);
       exit(EXIT_FAILURE);
       }
    else
       {
       tab=malloc(nbelt * sizeof(unsigned short int*));
       if (tab==NULL)
          {
          printf("\nerreur lors de l'allocation memoire de : tab\nDans : unsigned short int *tab=readraw(char * path)\n");
          free(tab);
          tab=NULL;
          exit(EXIT_FAILURE);
          }
       else
          {
          buff=malloc(1 * sizeof(unsigned short int*));
          if (buff==NULL)
             {
             printf("\nerreur lors de l'allocation memoire de : buff\nDans : unsigned short int *tab=readraw(char * path)\n");
             free(buff);
             buff=NULL;
             free(tab);
             tab=NULL;
             exit(EXIT_FAILURE);
             }
          else
             {
             while(fread(buff,2,1,fic)>0)
                {
     
                tab[i]=buff[0];
                i++;
                }
             free(buff);
             buff=NULL;
             fclose(fic);
             }
          }
       }
    return(tab);
    }
    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
     
    //########################## fonction de creation d'un tableau 2D ##########################
    double **createmat2D(int nblig, int nbcol)
    {
    double **mat;
    int i=0, j=0;
     
    mat=malloc(nblig*sizeof(double*));
    if (mat==NULL)
       {
       printf("erreur lors de l'allocation memoire de : mat\nDans : unsigned short int *mat=createmat2D(int * nblig, int * nbcol)\n");
       free(mat);
       mat=NULL;
       exit(EXIT_FAILURE);   
       }
    else
       {
       for (i=0;i<nblig;i++)
          {
          mat[i]=malloc(nbcol*sizeof(double*));
          if (mat[i]==NULL)
             {
             printf("erreur lors de l'allocation memoire de : mat[i]\nDans : unsigned short int *mat=createmat2D(int * nblig, int * nbcol)\n");
             for (j=0;j<i;j++)
                {
                free(mat[j]);
                mat[j]=NULL;
                }
             free(mat);
             mat=NULL;         
             }
          }
       }
    return(mat);
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour! Dans create2dmat, le second malloc doit etre de sizeof(double) et non pas double* . Meme remarque pour buf dans readraw, d'ailleurs si tu n'as besoin que d'une case ne t'embete pas à faire un malloc, utilise une variable toute simple. Au passage, quelques conseils: Si le retour d'un malloc est null, tu n'as pas besoin de free ensuite. Si tu utilises exit, ne t'embete pas à remettre à null des pointeurs puisque le programme quitte, par contre il faut free les variables malloquées, comme tu le fais. Bonne continuation!

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Même réponse que feydaykyn.

    Voici une version simplifiée de readraw (attention, j'en ai changé le prototype) :

    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
    //##################### fonction de lecture des images raw ###############################
    unsigned short int *readraw(char *path, long nbelt)
    {
        unsigned short int *tab;
        int i = 0;
        FILE *fic;
     
        fic = fopen(path, "r");
        if (fic == NULL) {
            printf("\nerreur lors de l'ouverture de :\n%s\n\n", path);
            exit(EXIT_FAILURE);
        } else {
            tab = malloc(nbelt * sizeof(unsigned short int));
            if (tab == NULL) {
                printf
                    ("\nerreur lors de l'allocation memoire de : tab\nDans : unsigned short int *tab=readraw(char * path)\n");
                tab = NULL;
                exit(EXIT_FAILURE);
            } else {
                fread(tab, sizeof buff, nbelt, fic);
                fclose(fic);
            }
        }
        return tab;
    }

  6. #6
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Merci pour vos réponses.

    Toute fois, quand j'utilise ma version de "readraw" le contrôle effectué dans main après l'appel de "readraw" me donne ça :

    controle : 27321 - 27128
    Ce qui est juste, ce sont des valeurs de températures en centièmes de Kelvins.

    Et quand j'utilise la version proposé par mabu, me donne ceci :

    controle : 1796696761 - 1786276344
    Ce qui me laisse penser que mon problème vient plutôt de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    k=0;
    for (i=0;i<nblig;i++)
       {
       for (j=0;j<nbcol;j++)
          {
          mat_IR108[i][j]=(double)*tab_IR108[k]/100.0;
          mat_IR120[i][j]=(double)*tab_IR120[k]/100.0;
          k++;
          }
       }

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

Discussions similaires

  1. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49
  2. Changement de l'icone d'une appli sous kdevelop
    Par vedder dans le forum Linux
    Réponses: 3
    Dernier message: 06/02/2003, 14h16
  3. Changement de langue dynamique (D6 et outils de traduction)
    Par agon dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2002, 16h15
  4. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

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