Problème avec les fonctions
Résolu/Fermé
geekon
Messages postés
25
Date d'inscription
lundi 9 juillet 2012
Statut
Membre
Dernière intervention
8 janvier 2016
-
25 nov. 2012 à 16:41
[Dal] Messages postés 6057 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 17 mars 2023 - 28 nov. 2012 à 01:37
[Dal] Messages postés 6057 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 17 mars 2023 - 28 nov. 2012 à 01:37
A voir également:
- Problème avec les fonctions
- Codes secrets Android : accéder aux fonctions cachées - Guide
- Fonction si avec date ✓ - Forum Excel
- Youtube ne fonctionnera pas sans les services google play ✓ - Forum Android
- Impossible d'installer hyper-v le processeur ne dispose pas des fonctions de virtualisation requises ✓ - Forum Hyper-V
- Ce document a activé les fonctions etendues d'adobe reader ✓ - Forum Windows
1 réponse
[Dal]
Messages postés
6057
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 mars 2023
1 043
26 nov. 2012 à 15:42
26 nov. 2012 à 15:42
Salut geekon,
La fonction (qui est dans ton code) "void tri_selection(int table[],int n)" ne t'inspire pas ?
Dal
La fonction (qui est dans ton code) "void tri_selection(int table[],int n)" ne t'inspire pas ?
Dal
26 nov. 2012 à 18:48
Au fait j'ai essayé, mais rien... ici le programme demande de remplir le tableau de choisir le tri à faire et il affiche quel tri j'ai choisi, mais il ne retourne pas un résultat (affichage du tableau trier).
De l'aide sur ce point svp ^^...
Voila:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
int remplir_tableau(int table[100],int n)
{
int i;
do
{printf("Veuillez entrer la taille du tableau...\n");
scanf("%d",&n);
printf("Taille du tableau: -%i-\n\n",n);
}
while (n>=100);
Sleep(1000);
for (i=0;i<n;i++)
{
printf("Veuillez entrer l'element %d \n %d)",i+1,i+1);
scanf("%d",&table[i]);
}
}
int affiche(int table[],int n)
{
int i;
for (i=0; i<n; i++)
{
printf("%d ",table[i]);
}
}
void tri_selection(int table[],int n)
{
int i,min,j,tmp;
for (i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if (table[j]<table[min])
min=j;
if (min!=i)
{
tmp=table[i];
table[i]=table[min];
table[min]=tmp;
}
}
}
int main()
{
int table[100],tri,n,i;
remplir_tableau(table,n);
printf("Merci, maintenant etape suivante...\n\n");
system("PAUSE");
printf("\nVeuillez choisir le type de tri que le programme va effectuer...\n\n");
Sleep(1000);
printf("Le nombre 0 refere au Tri de selection\n\n");
Sleep(500);
printf("Le nombre 1 refere au Tri shell\n\n");
Sleep(500);
printf("Le nombre 2 refere au Tri rapide\n\n");
Sleep(500);
printf("Le nombre 3 au Tri comptage\n\n");
tri=getch();
switch(tri){
case '0': printf("Vous avez choisi le Tri par selection.\n");
tri_selection(table,n);
break;
case '1':printf("Vous avez choisi le Tri shell.\n\n");
break;
case '2':printf("Vous avez choisi le Tri rapide.\n\n");
break;
case '3':printf("Vous avez choisi le Tri comptage.\n\n");
break;
default:printf("Entrer un nombre entre 0 et 3...\n\n");
}
affiche(table,n);
system("PAUSE");
}
Modifié par [Dal] le 27/11/2012 à 10:29
Tu y es presque :-)
1.
Ton problème vient de ta fonction remplir_tableau.
Vu que ta fonction va modifier les valeurs de "table" et de "n", tu dois passer des références aux variables (des pointeurs).
Comme "table" est un tableau, tu n'as rien à faire pour cet argument (tu passes en fait déjà un pointeur sur le premier élément du tableau).
En revanche, pour "n", qui est un entier, tu dois spécifier dans ta définition de fonction qu'elle attend un pointeur sur un entier, et non un entier (int * n).
Du coup, dans ton code, tu dois de plus :
- modifier l'appel à cette fonction dans main pour passer une référence à n (en utilisant &n)
- modifier le code dans ta fonction remplir_tableau pour déréférencer n (en utilisant *n)
2.
Les autres fonctions ne modifient pas les valeurs passées, ou seulement le tableau, qui est déjà passé par référence.
3.
Il y a aussi les problème suivants, qui ont dû t'être signalés par ton compilateur si tu compiles avec les avertissements, et que tu devrais résoudre pour avoir un code plus propre :
- à la fin de ta fonction main, fais "return 0;" (après ton "system("PAUSE");")
- si tes fonctions ne retournent rien, déclare le type de valeur de retour comme étant "void" et non "int".
- c'est une bonne habitude de mettre des "break" à la fin de chaque "case", et même du "default", même si dans ton cas ci-dessus un pass-through n'occasionne pas de problèmes (on ne sais jamais quelles modifications du code peuvent être faites plus tard)
- tu déclares une variable "i" que tu n'utilises pas
Dal
27 nov. 2012 à 18:18
Je savais pas qu'en C, on pouvait faire des références ;-).
27 nov. 2012 à 22:13
28 nov. 2012 à 01:37
- l'opérateur unaire & donne l'adresse d'un objet (d'une variable dans notre cas) en mémoire
- cette adresse peut être affectée à un pointeur
- c'est ce qui se produit en passant celle-ci à une fonction dont les paramètres sont déclarés comme des pointeurs
- l'opérateur unaire * est l'opérateur de déréférencement (ou d'indirection), permettant notamment à partir d'un pointeur contenant l'adresse d'un objet, d'accéder à l'objet pointé par ce pointeur
- ce procédé permet de modifier les valeurs de l'objet à l'intérieur de la fonction appelée, quand bien même il est déclaré dans la fonction appelante
... pas sûr que cela soit plus clair, mais bon.
Tiens, pour information en Perl, ou on appelle les pointeurs ou emplacements mémoire de données des "références" : http://oreilly.com/catalog/advperl/excerpt/ch01.html
Et après tout, si on peut déréférencer en C avec l'opérateur *, c'est bien qu'on a pu référencer au préalable. On a beau programmer, on a quand même le droit de parler français :-D
Dal