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 :

Erreur de segmentation et concaténation


Sujet :

C

  1. #21
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Euh, on pourrait revenir à mon nouveau problème svp???

  2. #22
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Ben le pointeur te sert à déclarer le tableau.

    unsigned char* Y[4*longueur_streaming/6];
    Mais maintenant quand tu veux référence UN élémnet, tu ne mets pas *, car tu définis l'adresse par le numéro d'élément [] :

    donc

    *Y[i]=imgbuffer[i];
    ne te mets pas la valeur dans le iième élément du tableau, mais

    Y[i]=imgbuffer[i];
    le mets

  3. #23
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Bonsoir,

    Citation Envoyé par Flophx
    Ah oui, et j'oubliais, le printf initial me renvoie une valeur de 0, ce qui est impossible....
    Est-ce que le premier caractère de imgbuffer est TOUJOURS différent de '\0' ?
    Si la réponse est "non" ou "ça dépend", alors le printf() initial peut afficher "0".

    Cordialement,
    DS.

  4. #24
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par souviron34
    Ben le pointeur te sert à déclarer le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     unsigned char* Y[4*longueur_streaming/6];
    Mais maintenant quand tu veux référence UN élémnet, tu ne mets pas *, car tu définis l'adresse par le numéro d'élément [] :

    donc
    ne te mets pas la valeur dans le iième élément du tableau, mais
    le mets
    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char* Y[4*longueur_streaming/6];
    soit : un tableau de 4*ls/6 pointeurs sur des caractères non signés.
    Pour stocker un caractère non signé, il faut :
    - allouer de la mémoire (les pointeurs contenus dans le tableau ne sont pas initialisés) + déréférencer le pointeur (donc ne pas enlever le "*" devant "Y") ;
    OU
    - plutôt (et si j'ai bien compris ce que le PO voulait faire) déclarer des tableaux de caractères non signés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char Y[4*longueur_streaming/6];
    .

    PS : pour les extraits de code, . Merci.
    PS2 : je ne comprends pas la phrase "le pointeur te sert à déclarer le tableau".

  5. #25
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par souviron34
    je ne vais pas polémiquer [...]
    Moi non plus mais...

    Citation Envoyé par souviron34
    Et il FAUT IMPERATIVEMENT initialiser les pointeurs à NULL dans les déclarations si on s'en sert pour faire de l'allocation dynamique dans des routines (voir autre discussion http://www.developpez.net/forums/sho...d.php?t=269868
    dans le forum ), car cela peut générer des crash suivant le niveau de profondeur et le nombre de paramètres de la routine.
    ...à mon humble avis et sans vouloir blesser personne, ça c'est ce que j'appelle vulgairement "du grand n'importe quoi" et j'y reviendrai dans la discussion citée quand j'aurai dormi un peu et que j'aurai du temps...

  6. #26
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bien, j'ai donc fait ainsi:

    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
     
    unsigned char Y[4*longueur_streaming/6];
    unsigned char U[longueur_streaming/6];
    unsigned char V[longueur_streaming/6];
     
    int i;
    for(i=0; i<4*longueur_streaming/6; i++){
    printf("i: %d\n",i);
    Y[i]=imgbuffer[i];
    }
     
    for(i=4*longueur_streaming/6; i<5*longueur_streaming/6; i++){
    U[i-4*longueur_streaming/6]=imgbuffer[i];
    }
     
    for(i=5*longueur_streaming/6; i<longueur_streaming; i++)
    {
    V[i-(5*longueur_streaming/6)]=imgbuffer[i];
    }
    Mais l'erreur de segmentation est toujours présente....

    J'aurais voulu aussi savoir précisément dans quel cas il faut utiliser un pointeur, la conséquence exacte de son utilisation..... (bon, mais priorité à mon problème hein

  7. #27
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Te serait-il possible de poster un code minimal et compilable reproduisant le probleme ?

    Citation Envoyé par Flophx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int longueur_streaming= ((unsigned)strlen(imgbuffer));
    Citation Envoyé par Flophx
    Pour résumé, j'ai dans imgbuffer un flux d'octet correspondant à une image avec une palette YUV420P.
    strlen applique sur une image ca risque de donner des resultats surprennant. strlen() est prevu pour donner la longueur d'une chaine de caracteres, pas d'un tableau quelconque et s'arrete au premier 0 rencontre, or 0 est une valeur tout a fait possible dans une image.

  8. #28
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Le problème, c'est que mon programme ce compose comme suit: image.c, image.h, camera.c, camera.h et main.c. Ca me parait difficile de vous poster le programme.

    Le problème intervient dans image.c

    je vous donne le code au complet:
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #include <string.h>
    #include "image.h"
    void extractPix(unsigned char* imgbuffer, int hauteur, int largeur, int num)
    {
     
        printf("Debut traitement\n");  
        char* nom_image = NULL;
        int longueur = 17;
     
        nom_image = malloc(longueur);
        if (nom_image == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
        memset(nom_image, '\0', sizeof(nom_image));
        snprintf(nom_image, longueur, "Image_%.05d.ppm", num);
        printf("nom_image = '%s'\n",nom_image);
     
     
    size_t longueur_streaming= ((unsigned)strlen(imgbuffer));
    printf("taille: %d\n",longueur_streaming);
     
    unsigned char Y[4*longueur_streaming/6];
    unsigned char U[longueur_streaming/6];
    unsigned char V[longueur_streaming/6];
     
    int i;
    for(i=0; i<4*longueur_streaming/6; i++){
    printf("i: %d\n",i);
    Y[i]=imgbuffer[i];
    }
     
    for(i=4*longueur_streaming/6; i<5*longueur_streaming/6; i++){
    U[i-4*longueur_streaming/6]=imgbuffer[i];
    }
     
    for(i=5*longueur_streaming/6; i<longueur_streaming; i++)
    {
    V[i-(5*longueur_streaming/6)]=imgbuffer[i];
    }
     
    free(imgbuffer);
     
    printf("En cours d'ecriture de l'image...\n");
    fp = fopen(nom_image, "w");
    free(nom_image); nom_image = NULL;
     
    if(fp==NULL)
    {
    printf("Impossible d'ouvrir le fichier\n");
    exit(-1);
    }
     
    fprintf(fp, "P6\n%d %d\n255\n",largeur, hauteur);
     
       p=0;
       jDebut=0;
       j = jDebut;
       for(ligne=0;ligne<hauteur;ligne++)   
       {
          if(ligne%2!=0)
             j=jDebut;
          else
             jDebut=j;
          for(colonne=0;colonne<largeur;colonne++)
          {
             y = Y[p]; p++;
             u = U[j];
             v = V[j];
     
             r=2*y+u+v;
             g=-0.396*u+2.029*v;
    	 b= 1.14*y-0.581*u;
     
             putc(r, fp);
             putc(g, fp);
             putc(b, fp);
     
             if(colonne%2==0)
                j++;
          }
       }
     
    printf("Image écrite...\n");
    fflush(fp);
    fclose(fp);
    }

  9. #29
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bien, j'ai créé un fichier text contenant imgbuffer avec cette commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FILE *test;
     
    	test=fopen("test.txt","w");
    		if(test==NULL){
    			printf("erreur d'ouverture de fichier");
    			perror("test"); }
    		else{
     
    			fprintf(test, "resulat: %d\n",imgbuffer);}
    fclose(test);
    et j'obtiens ce résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resulat: -1211133952

  10. #30
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Flophx
    Bien, j'ai créé un fichier text contenant imgbuffer avec cette commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FILE *test;
     
    	test=fopen("test.txt","w");
    		if(test==NULL){
    			printf("erreur d'ouverture de fichier");
    			perror("test"); }
    		else{
     
    			fprintf(test, "resulat: %d\n",imgbuffer);}
    fclose(test);
    et j'obtiens ce résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resulat: -1211133952
    Et ?

    imgbuffer est un pointeur, il n'y a aucun interet de connaitre sa valeur (qui changera probablement d'une execution a l'autre).

  11. #31
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Effectivement, ca ne sert à rien, mais j'aimerais retourner la valeur de ce qui est contenu à l'adresse imgbuffer, pour que quelqu'un puisse exécuter mon code...

  12. #32
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Flophx
    Le problème, c'est que mon programme ce compose comme suit: image.c, image.h, camera.c, camera.h et main.c. Ca me parait difficile de vous poster le programme.

    Le problème intervient dans image.c

    je vous donne le code au complet:
    Ne connaissant ni comment est creer imgbuffer ni comment il est creer, ca va etre coton de t'aider.

    Mes commentaires au fur et a mesure. Ca ne concerne que le code, pour l'algorithme je te fais confiance.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <string.h>
    #include "image.h"
    void extractPix(unsigned char* imgbuffer, int hauteur, int largeur, int num)
    {
     
        printf("Debut traitement\n");  
    /** GL: pourquoi utiliser une allocation dynamique de longueur fixe et courte ?
    nom_image[17] = ""; aurait tout aussi bien convenu */
     
        char* nom_image = NULL;
        int longueur = 17;
     
        nom_image = malloc(longueur);
        if (nom_image == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
        memset(nom_image, '\0', sizeof(nom_image));
        snprintf(nom_image, longueur, "Image_%.05d.ppm", num);
        printf("nom_image = '%s'\n",nom_image);
     
    /** GL: meme remarque que precedement,  imgbuffer n'est pas, d'apres tes explications, une chaine de caracteres. strlen n'est pas adapte (d'autant que tu connais la largeur et hauteur de l'image ainsi que le codage, tu peux donc recalculer la taille. */   
    size_t longueur_streaming= ((unsigned)strlen(imgbuffer));
    printf("taille: %d\n",longueur_streaming);
     
    /** GL: les VLA sont une nouveaute C99 et pas fonctionnelle a 100% sur tout les compilateurs.
    En outre si il est impossible de reserve assez de memoire, il n'y a aucun retour de l'indiquant, et on va donc dans le mur (peut etre ce qui t'arrive d'ailleurs.
    Autant passer par l'allocation dynamique */
    unsigned char Y[4*longueur_streaming/6];
    unsigned char U[longueur_streaming/6];
    unsigned char V[longueur_streaming/6];
     
    /** GL: pour un index de tableau, c'est size_t pas int */
    int i;
    for(i=0; i<4*longueur_streaming/6; i++){
    printf("i: %d\n",i);
    Y[i]=imgbuffer[i];
    }
     
    for(i=4*longueur_streaming/6; i<5*longueur_streaming/6; i++){
    U[i-4*longueur_streaming/6]=imgbuffer[i];
    }
     
    for(i=5*longueur_streaming/6; i<longueur_streaming; i++)
    {
    V[i-(5*longueur_streaming/6)]=imgbuffer[i];
    }
     
    /** GL: il n'y a nul par dans cette fonction d'allocation de imgbuffer. Es-tu crertain qu'il s'agit bien d'une allocation dynamique et non d'un tableau statique ? */
    free(imgbuffer);
     
    printf("En cours d'ecriture de l'image...\n");
    fp = fopen(nom_image, "w");
    free(nom_image); nom_image = NULL;
     
    if(fp==NULL)
    {
    printf("Impossible d'ouvrir le fichier\n");
    /** GL: pourquoi -1 ? */
    exit(-1);
    }
     
    fprintf(fp, "P6\n%d %d\n255\n",largeur, hauteur);
     
    /** GL : d'ou sortent les variable p, j, jDebut, y, u, v, r, g et b ? 
    De quel type sont-elles ?*/
       p=0;
       jDebut=0;
       j = jDebut;
       for(ligne=0;ligne<hauteur;ligne++)   
       {
          if(ligne%2!=0)
             j=jDebut;
          else
             jDebut=j;
          for(colonne=0;colonne<largeur;colonne++)
          {
             y = Y[p]; p++;
             u = U[j];
             v = V[j];
     
             r=2*y+u+v;
             g=-0.396*u+2.029*v;
    	 b= 1.14*y-0.581*u;
     
             putc(r, fp);
             putc(g, fp);
             putc(b, fp);
     
             if(colonne%2==0)
                j++;
          }
       }
     
    printf("Image écrite...\n");
    fflush(fp);
    fclose(fp);
    }
    Quels commentaires d'ordre general:
    * les declarations de fonctions au milieu du code ce n'est pas terrible. Outre le fait que ce n'est valable qu'en C99 et non en C90 (tu perds un peu en portabilite), c'est assez penible a lire.
    * ton indentation est horrible.

  13. #33
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Je sais que ce que contient imgbuffer est bon (dans la mesure ou j'ai déjà obtenu des images, mais de mauvaises qualités du au fait de la non prise en compte de la conversion YUV->RGB24)

    Si je donne ce qui est contenu dans l'adresse du pointeur, vous serez à même d'éxécuter le code non?

  14. #34
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bien, j'ai essayé d'allouer de la mémoide dynamiquement comme suit:
    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
     
    Y = malloc(4*sizeof(*imgbuffer)/6);
        if (Y == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
    U = malloc(sizeof(*imgbuffer)/6);
        if (U == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
    V = malloc(sizeof(*imgbuffer)/6);
        if (V == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
    Mais ca me génère des erreurs de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    : assignment makes integer from pointer without a cast

  15. #35
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    y serait peut etre temps d'ouvrir un bouquin de C et d'arreter de tapper des trucs au hasard en esperant que ça marche ...

    --

    et puis il me semble que d'autres intervenant n'arretent pas de te le repeter : poste du code compilable !

  16. #36
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Flophx
    Bien, j'ai essayé d'allouer de la mémoide dynamiquement comme suit:
    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
     
    Y = malloc(4*sizeof(*imgbuffer)/6);
        if (Y == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
    U = malloc(sizeof(*imgbuffer)/6);
        if (U == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
    V = malloc(sizeof(*imgbuffer)/6);
        if (V == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
    Mais ca me génère des erreurs de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    : assignment makes integer from pointer without a cast
    Comment sont defini Y, U et V ? Ce sont bien des pointeurs ?

  17. #37
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bon, voilà, j'ai fais ainsi, et si on excepte des problèmes de couleur, qui n'appartiennent pas à ce topic, ça fonctionne:

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <string.h>
    #include "image.h"
    void extractPix(unsigned char* imgbuffer, int hauteur, int largeur, int num)
    {
     
        printf("Debut traitement\n"); 
        char* nom_image = NULL;
        int longueur = 17; 
        nom_image = malloc(longueur);
        if (nom_image == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
        memset(nom_image, '\0', sizeof(nom_image));
        snprintf(nom_image,longueur, "Image_%.05d.ppm", num);
        printf("nom_image = '%s'\n",nom_image);
     
    	/*Pour récupérer les différents tableaux Y,U,V*/	
    	int i;
    	for(i=0; i<hauteur*largeur; i++){
    		Y[i]=imgbuffer[i+1];
    	}
     
    	for(i=hauteur*largeur; i<hauteur*largeur*5/4; i++){
    		U[i-hauteur*largeur]=imgbuffer[i+1];
    	}
     
    	for(i=hauteur*largeur*5/4; i<hauteur*largeur*3/2; i++)
    	{
    		V[i-(hauteur*largeur*5/4)]=imgbuffer[i+1];
    	}
     
     
    	printf("En cours d'ecriture de l'image...\n");
    	fp = fopen(nom_image, "w");
    	free(nom_image); nom_image = NULL;
     
    	if(fp==NULL)
    		{
    			printf("Impossible d'ouvrir le fichier\n");
    			exit(-1);
    		}
     
    	fprintf(fp, "P6\n%d %d\n255\n",largeur, hauteur);
     
       	p=0;
       	jDebut=0;
       	j = jDebut;
       		for(ligne=0;ligne<hauteur;ligne++)   
      			 {
         				 if(ligne%2!=0)
           				 j=jDebut;
         		else
    		         jDebut=j;
    		for(colonne=0;colonne<largeur;colonne++)
       			{
            			y = Y[p]; p++;
            			u = U[j];
            			v = V[j];
     
            			r=y+(1.13983)*v;
            			g=y-0.396*u-0.58*v;
    				b= y-2.03211*u;
     
           				putc(r, fp);
           				putc(g, fp);
            			putc(b, fp);
     
           	  if(colonne%2==0)
                j++;
          }
       }
     
    printf("Image écrite...\n");
    fflush(fp);
    fclose(fp);
    }

  18. #38
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Tu n'as toujours pas déclaré (à moins qu'elles ne soient globales ?) les variables citées ci-dessus par gl...

    En plus il n'y même plus les allocations de Y etc.. !!

    Effectivement je pense que Dark_Ebola a raison...

  19. #39
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bien, en fait pour la déclaration des variables Y, U, V, je les ai déclaré comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char Y[HEIGHT*WIDTH],U[HEIGHT*WIDTH/4],V[HEIGHT*WIDTH/4];
    dans le fichier image.h!

Discussions similaires

  1. Erreur de segmentation sur une concaténation
    Par cypher.sephiroth dans le forum Débuter
    Réponses: 14
    Dernier message: 18/08/2009, 17h42
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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