Te rends tu compte que tu déclares une variable globale i dans ton .h ???
C'est le genre de pratique à exclure définitivement.
Te rends tu compte que tu déclares une variable globale i dans ton .h ???
C'est le genre de pratique à exclure définitivement.
Ca aussi c'est pas terrible
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char *tmp=NULL; ... *tmp = ...;
Ca, c'est toujours pas bon
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sprintf(nom,"%s%s",tmp);
Et les remarques d'Emmanuel sur realloc sont toujours valables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 tmp = realloc(nom, sizeof(char*));
Peux mieux faire :Envoyé par Flophx
Voici du code corrigé qui a l'air de fonctionner, mais on a pas les specs... EDIT
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 Compiling: video.c In file included from video.c:1: video.h:5: warning: initialization discards qualifiers from pointer target type video.h:5: warning: initialization discards qualifiers from pointer target type video.h:5: warning: initialization discards qualifiers from pointer target type video.h:5: warning: initialization discards qualifiers from pointer target type video.h:5: warning: initialization discards qualifiers from pointer target type video.c: In function `main': video.c:63: warning: implicit declaration of function `realloc' video.c:72: warning: too few arguments for format video.c:73: warning: implicit declaration of function `free' video.c:94: warning: too few arguments for format video.c: In function `commande_acquisition': video.c:21: warning: 'commandeLog' might be used uninitialized in this function Linking console executable: console.exe Process terminated with status 0 (0 minutes, 6 seconds) 0 errors, 10 warnings
Donne ceci :
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> /** **Cette fontion permet de vérifier qu'il y a bien le nombre de paramètres nécessaires **à l'initialisation de la vidéo **/ void test_parametres (char const **a, char *b) { if (b == NULL) { printf ("Erreur de chargement sur %s\n", *a); } else { *a = b; } } /* Fonction main qui permet de créer un fichier vidéo */ int main (int argc, char *argv[]) { #define NB_PARAM 5 char const *parametres[] = { "duree", "width", "height", "nomDossier", "device" }; int j = sizeof parametres / sizeof *parametres; char *nom = NULL; int i; for (i = argc - 1; i > 0; i--) { printf ("i: %d\n", i); switch (j) { case 4: assert (i > 0); printf ("Parametre lu: %s\n", argv[i]); if (strncmp (argv[i], "/dev/", 5) == 0) { assert (j >= 0); test_parametres (¶metres[j], argv[i]); printf ("parametre defini #%d: %s\n", j, parametres[j]); j--; printf ("j: %d\n", j); } break; case 3: printf ("ici"); if (strncmp (argv[i], "/mnt/", 5) == 0) { size_t size; if (nom == NULL) { size = strlen (argv[i]) + 1; nom = malloc (size); if (nom != NULL) { strcpy (nom, argv[i]); } } else { assert (i > 0); size = strlen (nom) + strlen (argv[i]) + 1; void *tmp = realloc (nom, size); if (tmp != NULL) { nom = tmp; strcat (nom, argv[i]); } else { free (nom), nom = NULL; } } if (nom != NULL) { test_parametres (¶metres[j], nom); printf ("parametre defini #%d: %s\n", j, parametres[j]); j--; printf ("j: %d\n", j); } } else { size_t size; if (nom == NULL) { assert (i > 0); size = strlen (argv[i]) + 1; nom = malloc (size); if (nom != NULL) { strcpy (nom, argv[i]); } } else { assert (i > 0); size = strlen (nom) + strlen (argv[i]) + 1; void *tmp = realloc (nom, size); if (tmp != NULL) { nom = tmp; strcat (nom, argv[i]); } else { free (nom), nom = NULL; } } if (nom != NULL) { printf ("Construction nom: %s\n", nom); } } break; default: free (nom), nom = NULL; assert (i > 0); test_parametres (¶metres[j], argv[i]); assert (j >= 0); printf ("parametre defini #%d: %s\n", j, parametres[j]); j--; printf ("j: %d\n", j); } } return 0; }
avec cela :
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 i: 8 parametre defini #5: /dev/video0 j: 4 i: 7 Parametre lu: drive i: 6 Parametre lu: U3 i: 5 Parametre lu: /mnt/My i: 4 Parametre lu: 240 i: 3 Parametre lu: 320 i: 2 Parametre lu: 00:01:00 i: 1 Parametre lu: ./video Press ENTER to continue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Project : Forums Compiler : GNU GCC Compiler (called directly) Directory : C:\dev\forums2\ -------------------------------------------------------------------------------- Checking for existence: console.exe Executing: C:\CodeBlocks/console_runner.exe "C:\dev\forums2\console.exe" ./video 00:01:00 320 240 /mnt/My U3 drive /dev/video0 (in .) Process terminated with status 0 (0 minutes, 4 seconds) 0 errors, 0 warnings
Donc, en utilisant le compilateur "amélioré" et les remarques , voici le code modifié:
et j'ai enlevé la variable globlae du video.h
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 #include "video.h" /** **Cette fontion permet de vérifier qu'il y a bien le nombre de paramètres nécessaires **à l'initialisation de la vidéo **/ void test_parametres(char **a, char *b){ if(b==NULL){ printf("Erreur de chargement sur %s\n", *a);} else{ *a=b; } } /** **Permet de composer la commande qui permet de déclencher la video. **/ char *commande_acquisition(char *param[NB_PARAM]){ char *commandeLog=NULL; commandeLog = malloc(256); if(commandeLog!=NULL){ sprintf(commandeLog, "streamer -t %s -s %sx%s -r 24 -o %s.yuv -c %s",param[0], param[1], param[2],param[3],param[4]); printf("Commande exécutée: '%s'\n", commandeLog); } else{ printf( "Erreur sur la création de la commande"); } return commandeLog; } /* Fonction main qui permet de créer un fichier vidéo */ int main(int argc,char *argv[]){ int j=4; char* nom=NULL; char *tmp=NULL; int i=argc-1; for(i=argc-1; i>0; i--){ printf("i: %d\n", i); if(j==4){ printf("Parametre lu: %s\n", argv[i]); if(strncmp(argv[i],"/dev/",5)==0){ test_parametres(¶metres[j],argv[i]); printf("parametre defini n°%d: %s\n", j, parametres[j]); j--; printf("j: %d\n",j); } else{ } } else if(j==3){ printf("ici\n"); fflush(stdout); if(strncmp(argv[i],"/mnt/",5)==0){ tmp = realloc(nom, (strlen(nom)+2)); if(tmp!=NULL){ nom=tmp; nom=realloc(nom, (strlen(argv[i])+strlen(tmp)+2)); if(nom!=NULL){ strcpy(nom,argv[i]); sprintf(nom,"%s",tmp); free(tmp); test_parametres(¶metres[j],nom); printf("parametre defini n°%d: %s\n", j, parametres[j]); j--; printf("j: %d\n",j); } } } else{ tmp = realloc(nom, sizeof(char*)); if(tmp!=NULL){ tmp=nom; nom=realloc(nom, (strlen(argv[i])+strlen(tmp)+2)); if(nom!=NULL){ strcpy(nom,argv[i]); sprintf(nom,"%s",tmp); printf("Construction nom: %s\n", nom); } } } } else{ free(nom); test_parametres(¶metres[j],argv[i]); printf("parametre defini n°%d: %s\n", j, parametres[j]); j--; printf("j: %d\n",j); } } return 0; }
Voici ce le résultat de la compilation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 [florian@192 Prog_principal]$ gcc video.c -o video -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes In file included from video.c:1: video.h:6: warning: initialization discards qualifiers from pointer target type video.h:6: warning: initialization discards qualifiers from pointer target type video.h:6: warning: initialization discards qualifiers from pointer target type video.h:6: warning: initialization discards qualifiers from pointer target type video.h:6: warning: initialization discards qualifiers from pointer target type
J'ai "corrigé" le code (uniquement le main) pour qu'il ne plante plus, mais c'est tout.
Regarde le modifs et à partir de ça prends les mesures pour programmer correctement ce que tu veux faire.
Le code de la fonction SortiePrematuree
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
100
101 int main(int argc,char *argv[]){ int j=4; char* nom=NULL; char *tmp=NULL; int i; for(i=argc-1; i>0; i--) { printf("i= %d argv[%d]= %s\n", i, i, argv[i]); printf("Valeur de j %d\n", j); if (j < 0) { printf("Valeur de j incorrecte %d\n", j); } else if(j==4) { printf("Parametre lu: %s\n", argv[i]); if(strncmp(argv[i],"/dev/",5)==0) { test_parametres(¶metres[j],argv[i]); printf("parametre defini n°%d: %s\n", j, parametres[j]); j--; printf("j: %d\n",j); } else { } } else if(j==3) { printf("ici\n"); if(strncmp(argv[i],"/mnt/",5)==0){ tmp = realloc(nom, 1 + strlen(argv[i])); if(tmp!=NULL) { nom = tmp; strcpy(nom,argv[i]); test_parametres(¶metres[j],nom); printf("parametre defini numero %d: %s\n", j, parametres[j]); j--; printf("j: %d\n",j); } else { free(nom); SortiePrematuree(); } } else { tmp = realloc(nom, 1 + strlen (argv[i])); if(tmp!=NULL) { nom = tmp; strcpy(nom,argv[i]); printf("Construction nom: %s\n", nom); /* strcpy(tmp,nom); *nom=realloc(nom, (strlen(argv[i])+strlen(tmp)+2)); if(nom!=NULL){ strcpy(nom,argv[i]); sprintf(nom,"%s%s",tmp); printf("Construction nom: %s\n", nom); } */ } else { free(nom); SortiePrematuree(); } } } else { puts("dans le else"); if (nom != NULL) { free(nom); nom = NULL; } test_parametres(¶metres[j],argv[i]); printf("parametre defini numero %d: %s\n", j, parametres[j]); j--; printf("j: %d\n",j); } } return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void SortiePrematuree(void) { fprintf(stderr, "Pb alloc Memoire\n"); exit(EXIT_FAILURE); }
Merci, j'en demandais pas tant, simplement pour comprendre pourquoi il plante, et le corriger de moi-même...
De mon côté j'avais trouvé le point de blocage en faisant ainsi:
et la console donnant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 printf("là2\n"); tmp = realloc(nom, strlen(nom)); printf("là3\n");
Donc effectivement ca bloque lors du realloc... Mais y a t-il un moyen de savoir ce qui s'y passe vraiment?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 [florian@192 Prog_principal]$ ./mainCommande invoquée: ./video 00:01:00 320 240 /mnt/My U3 Drive/240307_1335 /dev/video0 & i: 7 Parametre lu: /dev/video0 parametre defini n°4: /dev/video0 j: 3 i: 6 ici là2 [florian@192 Prog_principal]$
Je vais regarder le code de Trap D, merci.
Emmanulel et moi t'avons déjà expliqué les erreurs de ce bout de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 *tmp = realloc(nom, sizeof(char*)); if(tmp!=NULL){ strcpy(tmp,nom); *nom=realloc(nom, (strlen(argv[i])+strlen(tmp)+2)); if(nom!=NULL){ strcpy(nom,argv[i]); sprintf(nom,"%s%s",tmp);
J'ai posté le code avec ces erreurs déjà corrigées!!
C'est pour cela que je demande pourquoi cela cloche!!
JE vais tester le morceau de code donné, mais il n'empeche que j'aimerais comprendre ce qui cloche encore dans le code posté en #45 qui ETAIT CORRIGE!
Ceci :Envoyé par Flophx
Il faut poster du code compilable, sinon, ça énerve... D'autre part, pourquoi tu fais 2 realloc() à la suite ? Ca n'a aucun sens. Un seul suffit, on l'a montré...
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 Compiling: main.c main.c: In function `test_parametres': main.c:10: error: `NULL' undeclared (first use in this function) main.c:10: error: (Each undeclared identifier is reported only once main.c:10: error: for each function it appears in.) main.c:11: warning: implicit declaration of function `printf' main.c: At top level: main.c:20: error: `NB_PARAM' undeclared here (not in a function) main.c: In function `commande_acquisition': main.c:22: error: `NULL' undeclared (first use in this function) main.c:24: warning: implicit declaration of function `malloc' main.c:28: warning: implicit declaration of function `sprintf' main.c: In function `main': main.c:47: error: `NULL' undeclared (first use in this function) main.c:57: warning: implicit declaration of function `strncmp' main.c:59: error: `parametres' undeclared (first use in this function) main.c:72: warning: implicit declaration of function `fflush' main.c:72: error: `stdout' undeclared (first use in this function) main.c:75: warning: implicit declaration of function `realloc' main.c:75: warning: implicit declaration of function `strlen' main.c:75: warning: assignment makes pointer from integer without a cast main.c:79: warning: assignment makes pointer from integer without a cast main.c:83: warning: implicit declaration of function `strcpy' main.c:85: warning: implicit declaration of function `free' main.c:97: warning: assignment makes pointer from integer without a cast main.c:101: warning: assignment makes pointer from integer without a cast main.c: At top level: main.c:20: warning: unused parameter 'param' Process terminated with status 1 (0 minutes, 2 seconds) 8 errors, 14 warnings
Bon, moi quand je compile mon code, j'ai pas autant d'erreur, juste ce que j'ai donné précédemment... J'ai compris pour l'unique realloc, j'ai donc appliqué les corrections données par Trap D.
ce qui me donne, à l'issu de l'exécution:
La boucle s'effectue donc bien (ouf..), mais il me manque simplement la concaténation de tous les éléments à partir du moment où j=3.
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 i= 7 argv[7]= /dev/video0 Valeur de j 4 Parametre lu: /dev/video0 parametre defini n°4: /dev/video0 j: 3 i= 6 argv[6]= Drive/240307_1528 Valeur de j 3 ici Construction nom: Drive/240307_1528 i= 5 argv[5]= U3 Valeur de j 3 ici Construction nom: U3 i= 4 argv[4]= /mnt/My Valeur de j 3 ici parametre defini n°3: /mnt/My j: 2 i= 3 argv[3]= 240 Valeur de j 2 dans le else parametre defini n°2: 240 j: 1 i= 2 argv[2]= 320 Valeur de j 1 dans le else parametre defini n°1: 320 j: 0 i= 1 argv[1]= 00:01:00 Valeur de j 0 dans le else parametre defini n°0: 00:01:00 j: -1
En revanche, j'utilise ca pour compiler:
Mais j'ai pas autant de lignes de warning....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gcc video.c -o video -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes
A mon avis, ca plante plutot sur strlen(nom), parce que nom vaut NULL.Envoyé par Flophx
Normal. Les options, il faut le mettre au début...Envoyé par Flophx
Mais tu devrais apprendre à utiliser make...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gcc -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes video.c -o video
http://emmanuel-delahaye.developpez.com/make.htm
Premiere fois que j'entends ca !Envoyé par Emmanuel Delahaye
Je viens de faire le test et ca confirme ce que je pensais, l'ordre n'a visiblement pas d'importance
Je vais étudier make, si ca peut me simplifier la vie, je vais en profiter...
Sinon, je n'arrive pas à concaténer les différents éléments.. Dans mon cheminement de pensée:
tmp>=nom
nom<=argv
concaténation(nom, tmp)
lorsqu'on fait
strcpy est bien sensé recopier la chaîne 2 dans la chaine 1. Seulement si l'espace n'est pas suffisant, je suppose que la chaine 2 "écrase" la première. Puisque je n'ai pas de concaténation, c'est ce qui se passe je suppose, donc je n'alloue pas assez de mémoire à tmp lors de realloc()?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 nom = tmp; strcpy(nom,argv[i]);
Il faut que les options soient avant le -o, non ?Envoyé par gl
J'ai utilisé celui qui a été envoyé par TRAP D, et c'est avec celui là que je n'arrve pas à concaténer!!
Je n'avais pas vu le tien Emmanuel, vu qu'il a apparemment été rajouté ensuite!!
Bien, au risque de passer pour un rabat-joie.... Ton exemple se bloque un peu au ^même moment que le mien, à j=3!!
ET d'après ce que je vois, c'est à cause du strcat...
J'obtiens ceci moi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 [florian@192 Prog_principal]$ ./video 00:01:00 320 240 /mnt/My U3 drive /dev/video0 i: 7 Parametre lu: /dev/video0 parametre defini #4: /dev/video0 j: 3 i: 6 Erreur de segmentation
Apparement non. Pas d'apres les quelques tests que je viens de faire.Envoyé par Emmanuel Delahaye
Je vais jeter un coup d'oeil a la doc de gcc pour confirmer ou infirmer ce point. Mais ca me surprendrais beaucoup qu'il y ait cette limitation, c'est precisement un des avantages des options dans un format particulier comme -xxxx (ou /xxx) de ne pas avoir a compter sur l'ordre des parametres.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager