Euh, on pourrait revenir à mon nouveau problème svp???
Euh, on pourrait revenir à mon nouveau problème svp???
Ben le pointeur te sert à déclarer le tableau.
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 [] :unsigned char* Y[4*longueur_streaming/6];
donc
ne te mets pas la valeur dans le iième élément du tableau, mais*Y[i]=imgbuffer[i];
le metsY[i]=imgbuffer[i];
Bonsoir,
Est-ce que le premier caractère de imgbuffer est TOUJOURS différent de '\0' ?Envoyé par Flophx
Si la réponse est "non" ou "ça dépend", alors le printf() initial peut afficher "0".
Cordialement,
DS.
DéclarationEnvoyé par souviron34
soit : un tableau de 4*ls/6 pointeurs sur des caractères non signés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned char* Y[4*longueur_streaming/6];
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".
Moi non plus mais...Envoyé par souviron34
...à 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...Envoyé par souviron34
Bien, j'ai donc fait ainsi:
Mais l'erreur de segmentation est toujours présente....
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]; }
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![]()
Te serait-il possible de poster un code minimal et compilable reproduisant le probleme ?
Envoyé par Flophx
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.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:
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); }
Bien, j'ai créé un fichier text contenant imgbuffer avec cette commande:
et j'obtiens ce résultat:
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);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2resulat: -1211133952
Et ?Envoyé par Flophx
imgbuffer est un pointeur, il n'y a aucun interet de connaitre sa valeur (qui changera probablement d'une execution a l'autre).
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...
Ne connaissant ni comment est creer imgbuffer ni comment il est creer, ca va etre coton de t'aider.Envoyé par Flophx
Mes commentaires au fur et a mesure. Ca ne concerne que le code, pour l'algorithme je te fais confiance.
Quels commentaires d'ordre general:
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); }
* 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.
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?
Bien, j'ai essayé d'allouer de la mémoide dynamiquement comme suit:
Mais ca me génère des erreurs de ce type:
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); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 : assignment makes integer from pointer without a cast
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 !
Comment sont defini Y, U et V ? Ce sont bien des pointeurs ?Envoyé par Flophx
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); }
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...
Bien, en fait pour la déclaration des variables Y, U, V, je les ai déclaré comme suit
dans le fichier image.h!
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];
Partager