Bonjour,
J'ai écrit cette fonction très simple qui me permet de concaténer deux tableaux en un troisième :
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;
}
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
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 : 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
donne comme warnings :

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’
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.