[gcc] problème d'exécution très bizarre
Bonjour,
J'ai écrit cette fonction très simple qui me permet de concaténer deux tableaux en un troisième :
Code:
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;
} |
J'essaie de la tester grâce au main suivant :
Code:
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;
} |
La compilation avec gcc 4.1.1 suivante :
Code:
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 |
donne comme warnings :
Code:
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 |
A l'exécution, mon programme donne parfois les résultats attendus, et parfois pas, sans que j'arrive à saisir la logique du bug.
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.