[C] Tri d'un tableaux à deux dimensions

Résolu/Fermé
Tisiph0n3 - 5 déc. 2007 à 20:26
 le père - 6 déc. 2007 à 09:57
Bonjour,
voila je veux mettre dans l'ordre alphabétique les arguments qui sont passés a mon programme, pour ça j'ai une fonction dont le prototypage est
char **my_sort_char_tab(char **tab, int size)
je l'appelle comme ceci
my_sort_char_tab(argv,argc);
comme je n'ai pas le temps de me prendre la tete du coup ma fonction de tri est bourrin:

char **my_sort_char_tab(char **tab, int size)
{
int i;
int i2;
int flag;

flag = 1;
while (flag == 1)
{
flag = 0;
i = 0;
while (i < size)
{
if (tab[i] > tab[i + 1])
{
i2 = 0;
flag == 1;
while (i2 != my_strlen(*tab[i]))
{
my_swap(&tab[i][i2], &tab[i + 1][i2]);
i2++;
}
}
i++;
}
}
return (tab);
}

la ligne qui pose probleme au compilateur est:

my_swap(&tab[i][i2], &tab[i + 1][i2]);
my_swap est une fonction qui échange la premiere adresse avec la deuxieme.
deux questions:
pourquoi ça compile pas?
et
est ce possible de simplement échanger l'adresse des premieres entrées du tableau afin d'éviter de devoir échanger les entrées caractère par caractère un truc du style:
my_swap(&tab[i], &tab[i + 1]);
sans préciser la position sur la deuxieme entrée.
Merci
A voir également:

6 réponses

mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
5 déc. 2007 à 23:15
Je reconnais bien la les règles débiles de programmation de l'epitech. Pas de for, pas le droit d'utiliser des fonctions standards... enfin passons, c'est un débat que j'ai eu avec un de tes confrères (marinaris, je ne sais pas si tu le connais...)

Je confirme ce que dit le père au sujet de la fonction swap : à l'exécution l'adresse c n'est pas initialisée, donc écrire à cette adresse (*c = ...) entraînera une seg fault. Si le but c'est de permuter les valeurs situées aux adresses a et b tu peux faire :
void swap(int *a,int *b){
  int c = *a;
  *a = *b;
  *b = c;
}

Pour résoudre ton exercice tu devrais aborder le problème proprement en t'inspirant des fonctions standards, qui en fait forment le découpage logique de ton problème :
1) définir l'équivalent de strcmp pour implémenter une relation d'ordre total sur les chaînes.
2) définir une fonction de tri générique sur un tableau et prenant en paramètre un pointeur sur la fonction implémentant ta relation d'ordre, à l'image de la fonction qsort.

Bonne chance
1
C'st sur que c'est débile de nous interdire le for mais il parait que certains ne savent pas l'utiliser correctement(parfois des teks 3 -_-') donc c'est pour ça qu'il nous est interdit, pour les fonctions système c'est simplement une façon de nous faire programmer a un niveau encore plus bas que le programmeur basique, ceci dit ils sont quand meme sympa et ns laissent en utiliser certaines quand c'est vraiment trop galère a coder pour nous. Enfin bon c'est une bonne école mais c'est vrai que sont fonctionnement est un peu déroutant parfois.

Merci pr ton aide ;)
0
voici le code de my_swap, ça peut etre utile

int my_swap(int *a, int *b)
{
int c;
int d;

c = *b;
d = *a;
*a = c;
*b = d;
}
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
5 déc. 2007 à 20:52
Sur la forme :

1) Moi j'utiliserais qsort et strcmp. Ton programme serait beaucoup plus lisible avec des boucles for qu'avec des while.
2) Pourquoi ne pas utiliser les fonctions standards (genre strlen au lieu de my_strlen) ? Tu es à l'epita ?

Sur le fond :

1) L'instruction flag == 1 ne fait rien.
2) Il n'y a pas besoin de parenthèse autour de tab dans la ligne "return tab" (return n'est pas une fonction mais une instruction).
3) A priori il faut passer tab[i] et non *tab[i] à strlen.
4) La fonction my_swap ne retourne rien alors qu'elle est sensée retourner un entier (ou alors il faut écrire void my_swap(...))
5) Les pointeurs passés à my_swap ne sont pas du bon type.

Bonne chance
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
5 déc. 2007 à 20:53
il faut que c et d soit des pointeurs aussi
et tu est pas obligé d'utiliser deux variables temporaires une suffit pour faire l'echange d'adresses
int *c;
*c = *a;
*a = *b;
*b = *c;
0
*c=*a
ça m'étonnerait.... qui initialise ton pointeur c ? erreur garantie à l'éxécution
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436 > le père
5 déc. 2007 à 22:28
en effet je me suis trompé...
merci pour ton attention le pere
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
>Sur la forme :
>
>1) Moi j'utiliserais qsort et strcmp. Ton programme serait beaucoup plus lisible avec des boucles for qu'avec des while.
>2) Pourquoi ne pas utiliser les fonctions standards (genre strlen au lieu de my_strlen) ? Tu es à l'epita ?
>
>Sur le fond :
>
>1) L'instruction flag == 1 ne fait rien.
>2) Il n'y a pas besoin de parenthèse autour de tab dans la ligne "return tab" (return n'est pas une fonction mais une instruction).
>3) A priori il faut passer tab[i] et non *tab[i] à strlen.
>4) La fonction my_swap ne retourne rien alors qu'elle est sensée retourner un entier (ou alors il faut écrire void my_swap(...))
>5) Les pointeurs passés à my_swap ne sont pas du bon type.
>
>Bonne chance

1 et 2) Epitech ;)
1 bis) si flag dit si le tableau a besoin d'étre trié et reste a 0 si le tableau n'a plus besoin d'etre trié
4) en effet merci
5) c'est à dire? my_swap prend deux ints soit deux adresses de pointeurs
0
Bonsoir,

5) c'est à dire? my_swap prend deux ints soit deux adresses de pointeurs
tu appelles my_swap avec des char*, alors qu'il faut des int*
0
eh bien en fait j'ai essayé avec
my_swap(&tab[i], &tab[i + 1]);
mais ça refuse de compiler comme ça /)
0
le père > Tisiph0n3
6 déc. 2007 à 09:57
Bien sûr que ça refuse encore. Visiblement, tu n'as pas compris pourquoi c'est refusé
my_swap attebd toujours des int * si tu n'as pas changé sa définition, et maintenant tu lui passes des char **. ça n'est guère mieux qu'avant.

Soit tu passes à ta fonction des int * (mais alors là lesquels ? tu ne manipules pas des int), soit tu modifies my_swap pour qu'elle travaille avec des char *. ça passera en compilation à ce niveau là. De là à dire que ça fait ce que tu voudrais...
0