Bonjour,
J'ai écrit cette fonction très simple qui me permet de concaténer deux tableaux en un troisième :
J'essaie de la tester grâce au main suivant :
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 #include "concat.h" /* fonction qui met bout à bout tab2 avec tab1 */ unsigned int* concat(unsigned int* tab1, unsigned int* tab2) { unsigned int* tab3; unsigned int k, l1, l2; l1 = longueur(tab1,0,900); l2 = longueur(tab2,0,900); tab3 = malloc((l1+l2)*sizeof(unsigned int)); for (k=0;k<l1;k++) { tab3[k] = tab1[k]; } for (k=l1;k<l1+l2;k++) { tab3[k] = tab2[k-l1]; } return tab3; } /* fonction longueur : calcule le nombre de cases mémoires effectivement utilisées dans un tableau de taille taille_max (taille maximale que peut prendre ce tableau). => permet de calculer la longueur d'un vecteur. k doit être mis à 0 pour que le calcul soit correct. */ unsigned int longueur(unsigned int* vecteur, unsigned int k, unsigned int taille_max) { if (k != taille_max && vecteur[k] != 0) { k = longueur(vecteur, k + 1, taille_max); } return k; }
La compilation avec gcc 4.1.1 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 /* test de concat */ #include <stdio.h> #include "concat.h" int main() { unsigned int l1,l2,k,p; unsigned int* tab1; unsigned int* tab2; unsigned int* tab3; printf("longueur du premier tableau : \n"); scanf("%u",&l1); tab1 = malloc(l1*sizeof(unsigned int)); for (k=0;k<l1;k++) { printf("entrez la valeur n %u \n",k); scanf("%u",&tab1[k]); } printf("longueur du deuxieme tableau : \n"); scanf("%u",&l2); tab2 = malloc(l2*sizeof(unsigned int)); for (k=0;k<l2;k++) { printf("entrez la valeur n %u \n",k); scanf("%u",&tab2[k]); } tab3 = concat(tab1,tab2); for (k=0;k<l1+l2;k++) { p = tab3[k]; printf("valeur n %u de tab3 : %u \n",k,p); } free(tab1); free(tab2); free(tab3); return 0; }
donne comme warnings :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 gcc -Wall -ansi -pedantic -W -c concat.c gcc -Wall -ansi -pedantic -W -c test_concat.c gcc concat.o test_concat.o -o test_concat.out
A l'exécution, mon programme donne parfois les résultats attendus, et parfois pas, sans que j'arrive à saisir la logique du bug.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 concat.c: In function concat: concat.c:12: attention : implicit declaration of function malloc concat.c:12: attention : incompatible implicit declaration of built-in function malloc test_concat.c: In function main: test_concat.c:15: attention : implicit declaration of function malloc test_concat.c:15: attention : incompatible implicit declaration of built-in function malloc test_concat.c:39: attention : implicit declaration of function free
Par exemple, il m'affiche le bon vecteur tab3 pour tab1 = {1} et tab2 = {2,3}, par contre pour tab1={1,2,3,4,5} et tab2 = {1,2,3}, il me donne tab3 = {1,2,3,4,5,17,1,2}.
J'ai constaté qu'à chaque fois que la sortie n'était pas celle attendue, les valeurs issues de tab1 étaient correctes, par contre il était inséré un nombre dont j'ignore la provenance à la suite de celle-ci dans tab3, puis venaient les valeurs de tab2 dans l'ordre.
Quelqu'un pourrait-il m'aider à résoudre ce problème s'il vous plaît?
Merci beaucoup d'avance
Agnès
PS : les tests sur la fonction "longueur" étaient bons, donc je suppose qu'elle est correctement écrite.
Partager