Rechercher : dans
Par :

[C] Tri d'un tableaux à deux dimensions

Dernière réponse le 6 déc 2007 à 09:57:00 Tisiph0n3, le 5 déc 2007 à 20:26:44 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Firefox 1.0.1

Meilleures réponses pour « [C] Tri d'un tableaux à deux dimensions » dans :
Manipulations élémentaires des tableaux sous MatLab VoirSommaire I. Stockage des tableaux II. L'indexation linéaire II.1. Accéder à un élément d'un tableau en utilisant l'indexation linéaire II.2. Passer d'une indexation à l'autre II.2.1. La fonction ind2sub II.2.2. La fonction sub2ind III. La...
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
MySQL - Chargement d'un fichier texte dans une table VoirPour charger une fichier texte défini comme suit : $ tail /home/user1/test.txt 'nom1',1,9 'nom2',2,3 'nom3',3,54 'nom4',4,2 'nom5',5,9 Dans une table définie comme suit : CREATE TABLE chargertest ( ...
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
PHP - Les variables VoirConcept de variable avec PHP Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage PHP peuvent être de trois...

1

Tisiph0n3, le 5 déc 2007 à 20:38:27

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;
}

Répondre à Tisiph0n3

2

mamiemando, le 5 déc 2007 à 20:52:07

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

Répondre à mamiemando

3

mype, le 5 déc 2007 à 20:53:41

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;

Répondre à mype

5

le père, le 5 déc 2007 à 22:15:39

*c=*a
ça m'étonnerait.... qui initialise ton pointeur c ? erreur garantie à l'éxécution

Répondre à le père

7

mype, le 5 déc 2007 à 22:28:49

En effet je me suis trompé...
merci pour ton attention le pere

Répondre à mype

4

Tisiph0n3, le 5 déc 2007 à 21:25:03

>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

Répondre à Tisiph0n3

6

le père, le 5 déc 2007 à 22:20:46

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*

Répondre à le père

9

Tisiph0n3, le 6 déc 2007 à 00:07:59

Eh bien en fait j'ai essayé avec
my_swap(&tab[i], &tab[i + 1]);
mais ça refuse de compiler comme ça /)

Répondre à Tisiph0n3

11

 le père, le 6 déc 2007 à 09:57:00

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

Répondre à le père

8

mamiemando, le 5 déc 2007 à 23:15:52

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

Répondre à mamiemando

10

Tisiph0n3, le 6 déc 2007 à 00:13:12

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 ;)

Répondre à Tisiph0n3