ah oui, ça crashe bien !
Bon, ben je verrais ça demain...
Au fait, ton code mieux présenté (mais non 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
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 <stdlib.h> #include <stdio.h> #include <ctype.h> #include <string.h> #include <assert.h> int main (int argc, char **argv) { int ret = EXIT_SUCCESS; if (argc > 1) { FILE *f = fopen (argv[1], "r"); if (f != NULL) { char s[2000] = ""; int i; int j; char lit[4] = ""; char clause[4] = ""; int conj_L = 0; //nombre de litteraux int conj_C = 0; //nombre de clauses while (fgets (s, sizeof s, f) != NULL) { if ((s[0] == 'p') && (s[2] == 'c') && (s[3] == 'n') && (s[4] == 'f')) { i = 6; j = 0; while (s[i] != ' ') { lit[j] = s[i]; i++; j++; } i++; j = 0; while ((s[i] != '\n')) { clause[j] = s[i]; i++; j++; } conj_L = atoi (lit); conj_C = atoi (clause); } } fclose (f), f = NULL; { char **Conjonction = malloc (sizeof (*Conjonction) * conj_L); for (i = 0; i < conj_L; i++) Conjonction[i] = malloc (sizeof (**Conjonction) * conj_C); assert (f == NULL); f = fopen (argv[1], "r"); if (f != NULL) { int k = 0; char s2[2000] = ""; while (fgets (s2, 2000, f) != NULL) { if (((s2[0] == ' ') || (s2[0] == '-'))) { i = 0; while ((s2[i + 1] != ' ') && (s2[i + 2] != '0')) { Conjonction[k][i] = 'a'; i++; } k++; } } fclose (f), f = NULL; } } } else { perror (argv[1]); ret = EXIT_FAILURE; } } return ret; }
oki thanks pour la présentation déjà.
Et bien @ demain alors pour la suite, je vais dormir également, la nuit porte conseil dit-on.
Une simple instrumentation du code à coup d'assert() pour surveiller la validité des indices montre qu'il y a un dépassement de tableau entrainant un comportement indéfini :
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 /* http://delahaye.emmanuel.free.fr/clib */ #include "ed/inc/prt.h" #include <stdlib.h> #include <stdio.h> #include <ctype.h> #include <string.h> #include <assert.h> #define NELEM(a) (sizeof(a)/sizeof*(a)) int main (int argc, char **argv) { int ret = EXIT_SUCCESS; if (argc > 1) { FILE *f = fopen (argv[1], "r"); if (f != NULL) { char s[2000] = ""; int i; int j; char lit[4] = ""; char clause[4] = ""; int conj_L = 0; //nombre de litteraux int conj_C = 0; //nombre de clauses while (fgets (s, sizeof s, f) != NULL) { if ((s[0] == 'p') && (s[2] == 'c') && (s[3] == 'n') && (s[4] == 'f')) { i = 6; j = 0; while (s[i] != ' ') { assert (j < NELEM (lit)); assert (i < NELEM (s)); lit[j] = s[i]; i++; j++; } i++; j = 0; assert (j < NELEM (lit)); assert (i < NELEM (s)); while ((s[i] != '\n')) { assert (j < NELEM (lit)); assert (i < NELEM (s)); clause[j] = s[i]; i++; j++; } conj_L = atoi (lit); conj_C = atoi (clause); } } PRT_I (conj_L); PRT_I (conj_C); rewind (f); { char **Conjonction = malloc (sizeof (*Conjonction) * conj_L); if (Conjonction != NULL) { for (i = 0; i < conj_L; i++) { Conjonction[i] = malloc (sizeof Conjonction[i] * conj_C); } { int k = 0; char s2[2000] = ""; while (fgets (s2, 2000, f) != NULL) { if (((s2[0] == ' ') || (s2[0] == '-'))) { i = 0; assert (i + 2 < NELEM (s2)); while ((s2[i + 1] != ' ') && (s2[i + 2] != '0')) { assert (k < conj_L); assert (i < conj_C); #if 1 Conjonction[k][i] = 'a'; #endif i++; } k++; } } fclose (f), f = NULL; } for (i = 0; i < conj_L; i++) { free (Conjonction[i]), Conjonction[i] = NULL; } free (Conjonction), Conjonction = NULL; } } } else { perror (argv[1]); ret = EXIT_FAILURE; } } return ret; }Je te laisse corriger le bug.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 conj_L = 60 conj_C = 160 Assertion failed: k < conj_L, file main.c, line 86 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. Press ENTER to continue.
Tite question : comment ça se fait que quand je fais ...
il rentre dans le test même quand dans mon fichier le premier caractère de chaque ligne est un p ou un c ??? Si change le != par un == il m'affiche par contre bien que les lignes commençant par p ou c ....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if(((s2[0]!='p')||(s2[0]!='c'))) { i=0; j=i+1; while(s2[i]!='\n') { i++; } printf("%d\n",i); k++; }
Parce que c'est exactement ce que tu demandes. Simple problème de logique booléenne... Pour que OU soit vrai, il suffit qu'une des conditions soit vraie. Donc, si s2[i] vaut 'p', l'expression s2[0]!='c' est vraie (ben oui 'p' est différent de 'c'), donc le if devient actif. Je te laisse réfléchir et corriger.
Ca y'est j'ai tout résolu le soucis d'expresseion booléen et l'erreur de débordement qui était du à une mauvaise allocation ... je vais pouvoir continuer mon projet tranquille, peut être à tout à l'heure si d'autres problème surgissent ... et MerKi encore !!!!!!
Petite question supplémentaire: si pour une conjonction je veux calculer le nombre de "nombres présents" comme par exemple dans le fichier joint précédemment comment je peux procéder pour prendre en paramètre de la fonction qu'un char *conjonction au lieu de prendre le tableau char **conjonction:
Pour résumer dans le main j'aimerais procéder à un appel de ce type: nb_Lit(Conjonction[0]); Comment je peux modifier ma fonction pour obtenir celà ???
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 int nb_Lit(char **clause) { int C=0, nb=0; int L=0; while(clause[C]!='\0') { if(clause[C][L]!=' ') { nb++; while(clause[C][L]!=' ') L++; } else L++; } return nb; }
Non testé, non compilé. Et j'ai peut être mal compris la question...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int nb_Lit(char *clause) { int nb=0; int L=0; if(clause[L]!=' ') { nb++; while(clause[L]!=' ') L++; } else L++; return nb; }
lol c'est dur dur le matin, en fait je veux que cette fonction permette de calculer le nombre d'éléments qu'il y'a dans chaque conjonction. c'est à dire par exemple si Conjonction[0]=" 37 40 1 " je veux que la fonction renvoit 3 car il y'a 3 nombre dans la conjonction.
Mais le truc c'est que pour moi le tableau Conjonction est un char **, donc en fait je veux savoir comment l'utiliser cette fonction afin d'avoir dans le main un appel à cette fonction de la forme: nb_Lit(Conjonction[0]), donc en fait sans utiliser la 2ème dimension dans l'appel de la fonction.
Je sais pas si j'ai été un peu plus clair ...
MerKi
Donc Conjonction[0] est un char *.Envoyé par bartmanb
Envoyé par bartmanb
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int nb_Lit(char * conj) { int i, nb_elements = 0; for(i = 0; conj[i] != '\0'; i++) { ... } return nb_elements; }
Voilà c'est exactement celà que je veux mais si dans le for je souhaite faire des test sur conjonction[i][j] pour pouvoir calculer le nombre d'éléments dans la conjonction ça ne marchera pas non ???
Mais dans ce cas t'as pas le choix tu dois passer Conjonction et pas seulement Conjonction[i] à la fonction alors puisque tu veux également acceder à Conjonction[<autre que i>]. Tu dois juste fournir en argument l'indice de la conjonction qui t'intéresse, donc finalement on a quelque chose du genre :
Donc on ne fait plus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int nb_Lit(char **t, int i) { char * conj = t[i]; int j, nb_elements = 0; for(j = 0; conj[j] != '\0'; j++) { ... } return nb_elements; }mais
Code : Sélectionner tout - Visualiser dans une fenêtre à part ... = nb_Lit(Conjonction[0]);C'est ce que tu cherchais?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ... = nb_Lit(Conjonction, 0);
vais mettre ça en oeuvre mais je pense que c'est nickel oui merçi, je te confirmerais tout à l'heure là je révise mon réseau.
En tout cas merKi beaucoup
UP ! Merci Melem ça a été nickel ce que tu mas dit.
Now j'ai une autre question (et oui toujours et encore) : comment fait-on pour faire une fonction qui renvoie une chaîne de caractères ???
ça c'est dans la ! http://c.developpez.com/faq/?page=fo..._string_return
On peut aussi directement faire ceci :
Ce qui n'a rien à voir avec ceci (!!!DANGER!!!) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char * bonjour() { return "bonjour"; }
Dans la première on retourne bien un pointeur (abus de langage ...) sur la chaîne "bonjour". Dans la deuxième on retourne l'adresse du premier élément du tableau s qui est une variable locale automatique à la fonction (et qui n'est donc connue qu'à l'intérieur de cette fonction ...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char * khonerie() { char s[] = "bonjour"; return s; }
@Melem : Je ne comprends pas pourquoi ce code est bon :
La fonction retourne juste un pointeur : alors où est stockée la chaîne de caractères lorsque la fonction se termine ? Il n'y a aucune allocation mémoire... c'est un comportement indéfini ou non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char * bonjour() { return "bonjour"; }
Une chaîne c'est un tableau de char, or il est impossible de retourner un tableau entier en langage C, tout comme on ne peut pas non plus passer un tableau en paramètre, on se contente de passer des pointeurs... d'où mon incompréhension devant ton code
La FAQ semble aller dans mon sens, si on veut récupérer une chaîne :
- soit on envoie un pointeur sur un tableau de char à la fonction, qui va pouvoir utiliser l'espace du tableau pour y mettre une chaîne de caractères
- soit on fait une allocation dynamique et on récupère un pointeur,
J'ai dit des bêtises ?
Une chaine étant un tableau de char, il y a des précautions...
http://emmanuel-delahaye.developpez....ourner_tableau
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