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 :

Retour paramètres avec Return


Sujet :

C

  1. #1
    Membre éclairé Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Par défaut Retour paramètres avec Return
    Bonjour,
    voilà, je programme un µc PIC en C dont l'une des fonctions est de retourner un paramétre à une autre; ma question est la suivante :
    peut-on renvoyer deux paramètres (à 2 fonctions différentes) lors de l'appel?
    Voici mon idée :
    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
     
    int speed_select (void)
    {
        char select_speed; // variable locale
        int speed;
        int speeddec;
     
        if(PORTC.F0==0)
        {
            select_speed=PORTA.F4+PORTA.F5;
     
            {
                if (PORTA.F1!=PORTA.F2){
                    switch(select_speed){
                        case 0b00:
                            speed=100;
                            speeddec=300;
                            break;
                        case 0b01:
                            speed=700;
                            speeddec=1200;
                            break;
                        case 0b10:
                            speed=1700;
                            speeddec=2500;
                            break;
                        default:
                            speed=toto;
                            break;
                    }
                }
                else 
                    speed=80;
     
                return speed,speeddec; // retour de mes param
            }
        }
    }
    je ne retourne apparament qu'un seul paramète
    La syntaxe est-elle la bonne?

    Merci de votre aide

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Non une seule variable peut être retournée avec "return".
    Ce que tu peux faire, c'est retourner l'adresse d'un tableau contenant tes deux valeurs:
    -> deux solutions:
    1) retourner un pointeur comme valeur de retour de ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int *exemple(){
        int *p;
        p = malloc(2*sizeof(int));
        p[0] = 1;
        p[1] = 2;
        return p;
    }
    2) avoir un pointeur sur un tableau de deux éléments en paramètre entrant et sortant de ta fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exemple(int *p){
        p[0] = 1;
        p[1] = 2;
    }
    Dans ce cas, attention a bien allouer la mémoire dans dans ta fonction appelante ou appelée. Tu peux aussi passer la dimension de ton tableau en paramètre.


  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Super, du code pas indenté et sans la balise de code, c'est plus facile à lire...

    Sinon, plus sérieusement, ce que tu veux faire n'est pas possible.

    Une fonction ne retourne qu'une et une seule valeur à son appelant.

    Par contre, la syntaxe de ton return, bien que syntaxiquement correcte, est vraiment tordue (et à proscrire ?).

    En fait, je ne sais même pas dire a priori ce qui est retourné comme valeur : speed ou speeddec ? Après un test, je le sais, c'est speeddec qui est retourné.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre éclairé Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Par défaut
    Ram > Excuses moi pour la syntaxe, cela ne fait qu'un petit moi que je m'essaie à la programmation...je sais que de grosses lacunes sur la présentation, mais à force de voir les forum, j'apprendrais bien qqchose non?
    En tout cas merci à vous deux pour votre aide.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    En fait, je ne sais même pas dire a priori ce qui est retourné comme valeur : speed ou speeddec ? Après un test, je le sais, c'est speeddec qui est retourné.
    La "," n'est pas ici un séparateur mais l'opérateur , (virgule).
    Avec cet opérateur, le premier terme est évalué en premier et sa valeur est écartée. Le second terme est évalué et l'expression prend pour valeur le résultat de cette évaluation. Par conséquent, pour que cet opérateur serve vraiment à quelque chose, il faut que la première évaluation provoque des effets de bords (ce qui n'est pas le cas ici). On le trouve assez souvent dans des expressions du type :

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Manitenant que le code est indenté avec un balise , une deuxième erreur saute au yeux : si PORTC.F0 est différent de 0, le code de retour de la fonction est indéfini.

    Soit il n'y a pas tous le code dans ton post et dans ce cas, oublie ma réponse, soit il faut rajouter du code pour prendre en compte ce cas de figure.

    Les warning du compilateurs devraient le dire aussi (si le niveau de verbosité est suffisemment élevé)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre éclairé Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Par défaut
    Ram_0000, pour ta dernière réponse, cette fonction n'est appelée sous certaine conditions dont celle où PORTC.F0 serait égal à 1 :j'avance petit à petit sur mon code parceque la gestion de mon clavier peut prendre beaucoup de conditions.
    Mais merci de me le faire remarquer.

    Homeostasie propose :

    int *exemple(){
    int *p;
    p = malloc(2*sizeof(int));
    p[0] = 1;
    p[1] = 2;
    return p;
    }

    cette fonction doit-elle être appelée par ma fonction ou une partie doit être intégrée à la mienne?
    J'ai un peu de mal avec les pointeurs là...je vais relire les tutos du site; je pense en avoir grand besoin !

  8. #8
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int *exemple(){
    int *p;
    p = malloc(2*sizeof(int));
    p[0] = 1;
    p[1] = 2;
    return p;
    }
    cette fonction doit-elle être appelée par ma fonction ou une partie doit être intégrée à la mienne?
    Tu peux faire ces modifications dans ta fonction. A toi de bien adapter. C'est une méthode permettant entre autres de retourner tes deux valeurs.
    Par contre, avec cette méthode, tu devras libérer la mémoire allouée dans la fonction appelante (utilisation de free()).

    D'autre part, d'autres solutions sont disponibles:
    - l'autre méthode que j'ai présenté plus haut
    - retourner une structure avec deux champs contenant tes deux valeurs de retour
    - passer en paramètre de ta fonction un pointeur sur une structure

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Ou plus simple s'il n'y a que deux entiers à retourner:
    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
    /* La valeur de retour est 0 si OK, -1 si erreur.
       En cas d'erreur, les pointeurs sont ignorés. */
    int exempleDivision(int dividende, int diviseur, int *pQuotient, int *pReste)
    {
    	/* Vérification des paramètres */
    	if(diviseur == 0)
    		return -1;
     
    	/* Corps de la fonction */
    	if(pQuotient != NULL)
    	{
    		*pQuotient = dividende/diviseur;
    	}
    	if(pReste != NULL)
    	{
    		*pReste = dividende%diviseur;
    	}
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [WD14] Dll Delphi paramétré avec valeur de retour
    Par mail.spam dans le forum WinDev
    Réponses: 2
    Dernier message: 01/07/2009, 11h49
  2. Réponses: 4
    Dernier message: 29/09/2008, 15h48
  3. Problème avec return
    Par Rémiz dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 25/08/2005, 17h15
  4. Date nulle dans une requete paramétrée avec TParameter
    Par denrette dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/06/2004, 08h37
  5. Récupération des paramètres avec une procedure stockée
    Par samlerouge dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/03/2004, 22h00

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