Impeccable!!
Merci bien Jc!
Je vais attaquer l'autre partie de la routine..
Tawada
Impeccable!!
Merci bien Jc!
Je vais attaquer l'autre partie de la routine..
Tawada
C'est pas mal, mais ça manque sérieusement de contrôles de limites. Rien n'est automatique en C, Il faut TOUT contrôler.Envoyé par tawada
Inutile de grouper les définitions de variable en début de fonction. Un peu de lecture :
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NB_LIN 5 #define NB_COL 4 #define fname "A.txt" int main (void) { int ret = EXIT_SUCCESS; FILE *entreeA = fopen (fname, "r"); if (entreeA != NULL) { double tabA[NB_LIN][NB_COL]; char ligneA[50]; int i = 0; while (fgets(ligneA, sizeof ligneA, entreeA) != NULL && i < NB_LIN) { char const sep[] = "\t "; int j = 0; char *p = strtok(ligneA, sep); do { tabA[i][j] = strtod(p, NULL); printf("tabA[%d][%d] vaut %f\n", i, j, tabA[i][j]); p = strtok(NULL, sep); j++; } while (p != NULL && j < NB_COL); i++; } fclose (entreeA); } else { perror(fname); ret = EXIT_FAILURE; } return ret; }
http://emmanuel-delahaye.developpez....tes.htm#portee
Beuh, m'appelle pas par mon nom, ça me rappelle l'école (mauvais trip...). Emmanuel, ça me va... (ou Manu...)Envoyé par tawada
Ok Manu :-)
Je suis entrain de rajouter B à la routine précédente.
Je ferai signe dès que je termine,
Tawada
Je vous souhaite à tous un excellent fin de semaine..
Je n'ai malheureusement pas internet chez moi pour envoyer
les resultat ce weekend. Mais je le ferai surement lundi prochain!
Encore merci à : Jc, Manu et les autres!
Tawada
Bonjour à tous,
Voilà la denière version du code. Il permet:
- de lire un fichier A.txt et stocker les réels dans tabA [][];
- de lire ------------B.txt ------------------------------ tabB [][];
-----------------------------------------------------------------------------------------------
}
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NB_LIN 5 #define NB_COL 4 #define fnameA "A.txt" #define fnameB "B.txt" int main (void) { int ret = EXIT_SUCCESS; FILE *entreeA = fopen (fnameA, "r"); FILE *entreeB = fopen (fnameB, "r"); if (entreeA != NULL && entreeB != NULL ) { double tabA[NB_LIN][NB_COL]; double tabB[NB_LIN][NB_COL]; char ligneA[50]; char ligneB[50]; int i = 0; while (fgets(ligneA, sizeof ligneA, entreeA) != NULL && fgets(ligneB, sizeof ligneB, entreeB) != NULL && i < NB_LIN) { char const sep[] = "\t "; int j = 0; int k = 0; char *ap = strtok(ligneA, sep); do { tabA[i][j] = strtod(ap, NULL); printf("tabA[%d][%d] vaut %f\n", i, j, tabA[i][j]); ap = strtok(NULL, sep); j++; } while (ap != NULL && j < NB_COL); char *bp = strtok(ligneB, sep); do { tabB[i][j] = strtod(bp, NULL); printf("tabB[%d][%d] vaut %f\n", i, k, tabB[i][j]); bp = strtok(NULL, sep); j++; } while (bp != NULL && k < NB_COL); i++; } fclose (entreeA); fclose (entreeB); } else { perror(fnameA); perror(fnameB); ret = EXIT_FAILURE; } return ret;
-----------------------------------------------------------------------------------------------
-----------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Exemples: A.txt 1 10 2 20 B.txt 1 11 2 22
----------------------------------------------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Resultat: tabA[0][0] vaut 1.000000 tabA[0][1] vaut 10.000000 tabB[0][0] vaut 1.000000 tabB[0][0] vaut 11.000000 tabA[1][0] vaut 2.000000 tabA[1][1] vaut 20.000000 tabB[1][0] vaut 2.000000 tabB[1][0] vaut 22.000000
Le but, maintenant, est de réaliser des opérations sur tabA[i][j] et tabB[i][j] et d'écrire
le resultat dans un fichier C.txt. Le problème est que le rempilassage des tableaux A et B se font dans deux boucles différentes. J'ai essayé de mettre ce remplissage dans une seule boucle (voir ci-dessous), mais le resultat n'est pas correcte.
-------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
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 while (fgets(ligneA, sizeof ligneA, entreeA) != NULL && fgets(ligneB, sizeof ligneB, entreeB) != NULL && i < NB_LIN) { char const sep[] = "\t "; int j = 0; char *ap = strtok(ligneA, sep); char *bp = strtok(ligneB, sep); do { tabA[i][j] = strtod(ap, NULL); printf("tabA[%d][%d] vaut %f\n", i, j, tabA[i][j]); tabB[i][j] = strtod(bp, NULL); printf("tabB[%d][%d] vaut %f\n", i, j, tabB[i][j]); ap = strtok(NULL, sep); bp = strtok(NULL, sep); j++; } while (ap != NULL && bp != NULL && j < NB_COL); i++; } fclose (entreeA); fclose (entreeB); }
-------------------------------------------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Resultat avec l'exemple précédent: tabA[0][0] vaut 1.000000 tabB[0][0] vaut 1.000000 tabA[1][0] vaut 2.000000 tabB[1][0] vaut 2.000000
- Est-ce que le fait de remplir les tableaux tabA et tabB dans deux boucles séparées rend difficil la création de C.txt?
- Est-ce qu'il y a moyen de le faire d'une autre manière?
Merci d'avance,
Tawada
Ca dépend des traitements. Si tu as choisi de tout charger en mémoire, c'est qu'il doit y avoir une raison (traitement non séquenciel, je suppose), sinon, il suffit de faire le traitement "à la volée".Envoyé par tawada
En tout cas, c'est une question d'algo (donc de conception) et non de langage (réalisation).
Bref, tu vas trop vite.
Je rappelle la démarche :
1 - définition (spécification)
2 - conception
3 - codage et tests unitaire (réalisation)
Désolé Manu, mais je n'ai pas tout à fait compris ce que tu veux dire.
Ok, je vois ce que c'est que la lecture séquentielle d'un fichier. Mais, "le traitement à ala volée", je ne vois pas.
Concrétement, est ce que je dois définir une fonction qui crée A et B; ensuite dans le main je crée C?
Je ne comprend toujours pas pourquoi je ne peux pas mettre fusionner les deux boucles créant A et B...
Je ne sais pas si c'est les bonnes questions qu'il faut se poser, mais en tout cas mon but est tout à fait clair : à partir de A.txt et B.txt, je dois créer C.txt.
Votre aide me sera précieuse,
Tawada
on the fly Ca veut dire sans stockage long des données (pas besoin de tableau).Envoyé par tawada
- Lecture des deux lignes
- Analyse
- Traitement
- Ecriture du résultat
Encore une fois, ça dépend du traitement qu'il y a à faire.Concrétement, est ce que je dois définir une fonction qui crée A et B; ensuite dans le main je crée C?
Je ne comprend toujours pas pourquoi je ne peux pas mettre fusionner les deux boucles créant A et B...
Mais tu n'as toujours pas expliqué quel traitement du faisais.Je ne sais pas si c'est les bonnes questions qu'il faut se poser, mais en tout cas mon but est tout à fait clair : à partir de A.txt et B.txt, je dois créer C.txt.
En gros, tu fais C = f(A,B). Décris f().
Corrige moi Manu si j'ai dit une bêtise:
# Lecture des deux lignes : C'EST FAIT,
# Analyse : C'EST FAIT
# Traitement : C'EST FAIT
# Ecriture du résultat (obtenir C): CE N'EST PAS ENCORE FAIT, le problème à mon avis est que je ne sais pas accéder à tabA et tabB puisqu'ils sont dans DEUX BOUCLES SÉPARÉES. Je pense qu'on a besoin de stocker les deux lignes respictivement dans tabA et tabB, car, je suppose, à partir de là il serait possible de créer C.
Alors rappelle moi quel est le traitement, parce que je n'arrive pas à le retrouver dans tout ce thread...Envoyé par tawada
Tu peux deplacer les tableaux pour qu'ils soient plus accessibles# Ecriture du résultat (obtenir C): CE N'EST PAS ENCORE FAIT, le problème à mon avis est que je ne sais pas accéder à tabA et tabB puisqu'ils sont dans DEUX BOUCLES SÉPARÉES.
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 { T a[]; T b[]; /* chargement de a */ { } /* chargement de b */ { } /* traitement de c = f(a, b) */ { T c[]; /* enregistrement de c */ { } } }Je pense qu'on a besoin de stocker les deux lignes respictivement dans tabA et tabB, car, je suppose, à partir de là il serait possible de créer C.
Bonjour,
J 'ai un problème d'enregistrement d'un tableau de réel dans un fichier text.
Mon tabC se présente comme ça :
tabC[0][0] vaut 2.000000
tabC[0][1] vaut 21.000000
tabC[1][0] vaut 4.000000
tabC[1][1] vaut 42.000000
Vous auriez un exemple pour me guider sur cette question?
Merci d'avance,
Tawada
j'ai trouvé entre temps :
c'est fprintf()
Tawada
Bonjour à tous,
Bon voici la suite de la résolution du problème soumis:
Dernière version du code:
------------------------------
------------------------------------------------------
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NB_LIN 2 #define NB_COL 2 #define fnameA "A.txt" #define fnameB "B.txt" void Somme_tab (double * a, double * b, double * c, int nl, int nc ) { int i, j, k; for (i=0; i<nl*nc; i++) {/* c[i] = a[i] + b[i]; */ *c = *a + *b; a++; b++; c++; } } int main (void) { void Somme_tab (double * , double *, double *, int , int ); FILE *entreeA = fopen (fnameA, "r"); // Entrée A.txt FILE *entreeB = fopen (fnameB, "r"); //Entrée B.txt FILE *sortieC = fopen ("Resultat.txt" , "wt") ; //Sortie => Resultat .txt double tabA[NB_LIN][NB_COL]; double tabB[NB_LIN][NB_COL]; double tabC[NB_LIN][NB_COL]; char ligneA[50]; char ligneB[50]; char *ap , *bp; char const sep[] = "\t "; int i , j; if (entreeA != NULL && entreeB != NULL ) { i = 0; while (fgets(ligneA, sizeof ligneA, entreeA) != NULL && fgets(ligneB, sizeof ligneB, entreeB) != NULL && i < NB_LIN) { j = 0; ap = strtok(ligneA, sep); do { tabA[i][j] = strtod(ap, NULL); //printf("tabA[%d][%d] vaut %f\n", i, j, tabA[i][j]); ap = strtok(NULL, sep); j++; } while (ap != NULL && j < NB_COL); j = 0; bp = strtok(ligneB, sep); do { tabB[i][j] = strtod(bp, NULL); //printf("tabB[%d][%d] vaut %f\n", i, j, tabB[i][j]); bp = strtok(NULL, sep); j++; } while (bp != NULL && j < NB_COL); i++; } } fclose (entreeA); fclose (entreeB); Somme_tab( (double *) tabA, (double *) tabB, (double *) tabC, NB_LIN, NB_COL); { int x; for (x = 0; x < i ; x++) { int y; for (y = 0; y <NB_COL ; y++) { printf("tabA[%d][%d] vaut %f\n", x, y, tabA[x][y]); printf("tabB[%d][%d] vaut %f\n", x, y, tabB[x][y]); printf("tabC[%d][%d] vaut %f\n", x, y, tabC[x][y]); fprintf (sortieC, "%f\n", tabC[x][y] ); } } } }
Avec :
On obtient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 A.txt 1 10 2 20 B.txt 1 11 2 22
Et dans Resultat.txt, on peut lire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 tabA[0][0] vaut 1.000000 tabB[0][0] vaut 1.000000 tabC[0][0] vaut 2.000000 tabA[0][1] vaut 10.000000 tabB[0][1] vaut 11.000000 tabC[0][1] vaut 21.000000 tabA[1][0] vaut 2.000000 tabB[1][0] vaut 2.000000 tabC[1][0] vaut 4.000000 tabA[1][1] vaut 20.000000 tabB[1][1] vaut 22.000000 tabC[1][1] vaut 42.000000
--------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 2.000000 21.000000 4.000000 42.00000
Juste il y a un problème, c'est que lorsque j'augment NB_COL (#define NB_COL ) à 4 on a ce-ci :
J'ai essayé de remédier à ce problème en rajoutant à la dernière boucle dans main la ligne suivante:
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 tabA[0][0] vaut 1.000000 tabB[0][0] vaut 1.000000 tabC[0][0] vaut 2.000000 tabA[0][1] vaut 10.000000 tabB[0][1] vaut 11.000000 tabC[0][1] vaut 21.000000 tabA[0][2] vaut 0.000000 tabB[0][2] vaut -1.997746 tabC[0][2] vaut -1.997746 tabA[0][3] vaut 0.000000 tabB[0][3] vaut -1.997746 tabC[0][3] vaut -1.997746 tabA[1][0] vaut 2.000000 tabB[1][0] vaut 2.000000 tabC[1][0] vaut 4.000000 tabA[1][1] vaut 20.000000 tabB[1][1] vaut 22.000000 tabC[1][1] vaut 42.000000 tabA[1][2] vaut 0.000000 tabB[1][2] vaut 0.000000 tabC[1][2] vaut 0.000000 tabA[1][3] vaut 0.000000 tabB[1][3] vaut 0.000000 tabC[1][3] vaut 0.000000
Résulat avec les entrées A.txt et B.txt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part for (y = 0; y <NB_COL && tabA[x][y] !=0 &&tabB[x][y]!=0 ; y++)
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 tabA[0][0] vaut 1.000000 tabB[0][0] vaut 1.000000 tabC[0][0] vaut 2.000000 tabA[0][1] vaut 10.000000 tabB[0][1] vaut 11.000000 tabC[0][1] vaut 21.000000 tabA[0][2] vaut 0.000000 tabB[0][2] vaut -1.997746 tabC[0][2] vaut -1.997746 tabA[1][0] vaut 2.000000 tabB[1][0] vaut 2.000000 tabC[1][0] vaut 4.000000 tabA[1][1] vaut 20.000000 tabB[1][1] vaut 22.000000 tabC[1][1] vaut 42.000000
Oups, j'ai appuyé rapidement sur Envoyer
Donc quelqu'un peut m'aider à trouver une astuce pour contourner ce pb?
Merci,
Tawada
Pas terrible...Envoyé par tawada
J'ai lancé, ça m'a explosé à la tronche. (Je n'ai pas de fichier de données)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Compiling: main.c main.c:13: warning: no previous prototype for 'Somme_tab' main.c: In function `Somme_tab': main.c:14: warning: unused variable `j' main.c:14: warning: unused variable `k' main.c: In function `main_': main.c:26: warning: nested extern declaration of `Somme_tab' main.c:92:2: warning: no newline at end of file main.c:92: warning: control reaches end of non-void function main.c:40: warning: 'i' might be used uninitialized in this function Linking console executable: D:\dev\ed02\cb\ed02.exe Process terminated with status 0 (0 minutes, 1 seconds) 0 errors, 7 warnings
Les traitements d'erreur, c'est pas que de la décoration...
Apparemment vous l'avez compilé avec :
gcc -Wall -W -O2 Test.c -o Test
Pour ma part, j'ai fais ce-ci :
> gcc -c Test.c
> gcc -o Test Test.o
>./Test
Et j'ai aucun warning!
Oui, oui .. ce n'est pas "la dernière version du code" mais ce que je voulais dire "le dernier brouillon du code"
pas exactement, non... J'ai souvent publié ma config de gcc. (pas plus tard qu'aujourd'hui...)Envoyé par tawada
Ben oui. Pour faire tomber la fièvre, casser le thermomètre, c'est bien connu !Pour ma part, j'ai fais ce-ci :
> gcc -c Test.c
> gcc -o Test Test.o
>./Test
Et j'ai aucun warning!
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