IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction qui retourne l'indice du tableau respectant une condition


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut Fonction qui retourne l'indice du tableau respectant une condition
    Bonjour à tous.
    Je vous expose mon problème :
    J'ai un tableau de cette forme que j'ai rempli après une étape de simulation (500x):
    En gros, chaque i correspond a la valeur tirée, et proba[i] correspond au nombre de fois où i a été tiré lors des 500 fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    proba[0]=0
    proba[1]=0
    proba[2]=49
    proba[3]=133
    proba[4]=110
    proba[5]=90
    proba[6]=47
    proba[7]=34
    proba[8]=20
    proba[9]=10
    proba[10]=5
    proba[11]=2
    Je veux ensuite calculer une proba, je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(i=0;i<repeat;i++){
    		if(proba[i] != 0){
    			double pval = (proba[i])/(float)repeat;
    			printf("proba[%d]=%d, p-val = %.3f \n",i,proba[i],pval);
    		}
    	}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    proba[0]=0 pval non calculée
    proba[1]=0 pval non calculée
    proba[2]=49, p-val = 0.098
    proba[3]=133, p-val = 0.266
    proba[4]=110, p-val = 0.220
    proba[5]=90, p-val = 0.180
    proba[6]=47, p-val = 0.094
    proba[7]=34, p-val = 0.068
    proba[8]=20, p-val = 0.040
    proba[9]=10, p-val = 0.020
    proba[10]=5, p-val = 0.010
    proba[11]=2, p-val = 0.004
    Je cherche en fait à avoir l'indice de proba pour lequel p-val < 0.05, dans l'exemple, 8.

    J'avais donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i=0;i<repeat;i++){
    		if(proba[i] != 0){
    			double pval = (proba[i])/(float)repeat;
    			if(pval < 0.05){
    				break;
    				return(i);
    			}
    		}
    Mais cela ne fonctionne pas ....
    Comment puis je procéder ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Isabella83 Voir le message
    Je cherche en fait à avoir l'indice de proba pour lequel p-val < 0.05, dans l'exemple, 8.

    J'avais donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i=0;i<repeat;i++){
    		if(proba[i] != 0){
    			double pval = (proba[i])/(float)repeat;
    			if(pval < 0.05){
    				break;
    				return(i);
    			}
    		}
    Mais cela ne fonctionne pas ....
    Comment puis je procéder ?
    Bien le bonjour,

    Le break a pour effet de briser une séquence. Là en l'occurrence, à cause de ton break, jamais tu ne rentreras dans le return.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    J'ai modifié en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(i=0;i<500;i++){
    		if(proba[i] != 0){
    			double pval = (proba[i])/500;
    			if(pval < 0.05){
    				return(i);
    				break;
    			}
    		}
     
    	}
    Mais j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    warning: control reaches end of non-void function

  4. #4
    Invité
    Invité(e)
    Par défaut
    Dans ces cas-là, on lit le message d'erreur.... (et on les comprends)

    Il est assez explicite pour que je n'ai besoin de te le traduire.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Et bien non, je ne comprends pas mon erreur. Enfin je pense que la fonction rencontrera un problème lorsque je n'aurai aucune pval <0.05. et dans ce cas comment puis-je procéder ?
    J'ai déclarer la fonction (simulation )contenant cette portion de code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int simulation(mes arguments)
    Ensuite, dans mon main que j'ai déclaré comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(void)
    {	
    	srand(time(NULL));
    	int mrna_length = 2349 ;
    	int exp_tag_nb = 42.08;
    	int repeat = 500;
    	double mRNA_coverage = 12.2;
    	int j;
    	j=simulation(mrna_length, mRNA_coverage, exp_tag_nb, repeat);
    	printf("valeur de j = %d\n",j);	
    	return 0;
     
    }

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Je suis en train de penser, je vais peut etre creer un tableau avec mes proba en valeur.
    Ensuite, je vais créer une fonction qui me retourne le premier élément du tableau où valeur < seuil.
    Je lui passerai en paramètre un tableau et sa taille, et le seuil .
    Je vais essayer, ce serait peut être plus simple.

  7. #7
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Ton warning vient du fait que ta fonction ne renvoie pas de valeur si elle ne trouve rien (ce qui fait couiner le compilateur évidemment).
    Bref en comprenant un minimum l'anglais ça peut servir pour faire de la programmation

    Puis ta seconde méthode est effectivement "meilleure" étant donné qu'elle généralise ta recherche à un tableau de n'importe quelle taille et à n'importe quelle valeur de seuil.
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    J'essai de créer une fonction comme je l'ai dit dans mon précédent poste.
    Mon problème c'est lorsque aucune de mes valeurs n'est <0.05, et je ne vois vraiment pas comment faire :
    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
    #include <stdio.h> 
     
    int find(double * ptr, size_t n_elements) 
    { 
    	size_t i; 
    	int result;
    	for(i = 0; i < n_elements; i++){ 
    		if(ptr[i]<0.05){
    			result=i;
    			break;
    		}
    		else{
    			result=0;
    		}
    	}
    	return(result);
     
    } 
     
    int main() 
    { 
    	int f;
    	double t[10]; 
    	t[0]=0.5;
    	t[1]=0.5;
    	t[2]=0.5;
    	t[3]=0.5;
    	t[4]=0.5;
    	t[5]=0.5;
    	t[6]=0.05;
    	t[7]=0.03;
    	t[8]=0.02;
    	t[9]=0.01;
     
    	size_t n_elements = sizeof(t) / sizeof(t[0]); 
    	f=find(t,n_elements);
    	printf("%d",f); 
    }

  9. #9
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Tu peux renvoyer une valeur "impossible" (par exemple un indice négatif), qu'il te suffit de vérifier dans la fonction appelante pour savoir si la fonction a trouvé un élément ou non.
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    J'ai fait comme ceci :

    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
    #include <stdio.h> 
     
    int find(double * ptr, size_t n_elements, double target) 
    { 
    	int i=0;
    	while((i <= (int) n_elements) && (ptr[i] >= target)){
    		i++;	
    	}
    	if(i < (int)n_elements){
    		return i;
    	}
    	else{
    		return -1;
    	}
    }
    Qu'en pensez vous ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Et toi, qu'en penses-tu ?
    As-tu testé/essayé ?

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    je n'avais pas testé tous les cas possibles .....
    Finalement j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int find_index(double * ptr, size_t n_elements, double target) 
    { 
    	int i;
    	for(i=0;i<(int) n_elements;i++){
    		if(ptr[i] < target){
    			return(i);
    			break;
    		}	
     
    	}
    return(-1);
     
     
    }
    Et je pense que cette fois ci, c'est la bonne !!!

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Isabella83 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while((i <= (int) n_elements) && (ptr[i] >= target)){
    	i++;	
    }
    je n'avais pas testé tous les cas possibles
    Bonjour
    C'est surtout que tu tapais dans ptr[i] quand i = n_elements donc en dehors des valeurs licites du tableau (qui vont de 0 à n-1 !!!)...

    Citation Envoyé par Isabella83 Voir le message
    Finalement j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int find_index(double * ptr, size_t n_elements, double target) 
    { 
    	int i;
    	for(i=0;i<(int) n_elements;i++){
    		if(ptr[i] < target){
    			return(i);
    			break;
    		}	
     
    	}
    return(-1);
     
     
    }
    Et je pense que cette fois ci, c'est la bonne !!!
    As-tu réfléchi au sens du mot clef return et de l'utilité du break placé juste après ???

    PS: pas besoin de parenthèses pour return. Ce n'est pas une fonction...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    As-tu réfléchi au sens du mot clef return et de l'utilité du break placé juste après ???
    Si je ne me trompe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int find_index(double * ptr, size_t n_elements, double target) 
    { 
    	int i;
    	for(i=0;i<(int) n_elements;i++){
    		if(ptr[i] < target){
    			return(i); /* me retourne la premiere valeur de mon tableau pour laquelle j'ai la valeur < 0.05 (mon seuil) */
    			break;  /* on sort de la boucle dès qu'on trouve une valeur <0.05 car je veux la première */
    		}	
     
    	}
    return(-1);  /* si jamais aucune valeur n'est <0.05, alors la fonction retourne -1 */
    Je peux ainsi vérifier dans mon main si la valeur retournée par find_index() est >0.

  15. #15
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, si, tu te trompes.
    return provoque la sortie de la fonction.
    Toute instruction placée après un return (dans le flux de controle) est inatteignable.
    ton break n'est même pas atteint.

    Par ailleurs toute fonction (non void) doit se terminer par l'exécution un return.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  16. #16
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par leternel Voir le message
    En fait, si, tu te trompes.
    return provoque la sortie de la fonction.
    Toute instruction placée après un return (dans le flux de controle) est inatteignable.
    ton break n'est même pas atteint.
    D'accord.
    J'ai supprimé le break et effectivement cela me retourne pareil.
    Merci pour cette explication

  17. #17
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Merci de cliquer sur le bouton en bas de page si vous n'avez plus de question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/08/2011, 22h12
  2. Fonction qui retourne un tableau ou 2 variables ? possible ou non
    Par jiojio dans le forum VB 6 et antérieur
    Réponses: 45
    Dernier message: 05/06/2006, 15h00
  3. [VB] Fonction qui retourne un tableau
    Par ptitsoleil87 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/12/2005, 10h52
  4. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo