[C] Tri d'un tableaux à deux dimensions
Résolu
Tisiph0n3
-
le père -
le père -
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
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:
- [C] Tri d'un tableaux à deux dimensions
- Trier un tableau excel - Guide
- Fusionner deux tableaux excel - Guide
- Logiciel tri photo - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
6 réponses
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 :
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
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
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;
}
int my_swap(int *a, int *b)
{
int c;
int d;
c = *b;
d = *a;
*a = c;
*b = d;
}
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) 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
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
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;
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
>
>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
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*
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*
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...
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...
Merci pr ton aide ;)