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 dans le langage C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut fonction dans le langage C
    bonjour cher dévelloppeurs!!!je suis un débutant dans le langage C.
    s'il vous plait je viens de découvrir le site et je sollicite votre aide pour mettre sur pied une fonction qui renvoie une chaine2 de longueur n contenue dans une chaine1.le prototype proposé est le suivant:MID(chaine1[],chaine2[],n).

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fabibass Voir le message
    et je sollicite votre aide pour mettre sur pied une fonction qui renvoie une chaine2 de longueur n contenue dans une chaine1.le prototype proposé est le suivant:MID(chaine1[],chaine2[],n).
    Bonjour

    Je ne comprends pas trop les paramètres de cette fonction "MID" (middle?) et ta façon de l'utiliser (avant de la coder). Si par exemple tu lui passes "bonjour" en chaine n° 1, que comptes-tu lui passer en chaine n° 2 et en valeur "n" ?
    En fait, tu dis "je veux qu'elle renvoie la chaine2" alors que tu lui passes justement cette chaine2. Bref si j'appelle (éventuellement) MID("bonjour", "our", 3) et qu'elle me renvoie "our" je ne vois pas à quoi ça m'a servi de l'appeler...
    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]

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    A moins qu'il ne s'agisse d'écrire dans la seconde un morceau de la première.
    C'est envisageable, mais il manque plusieurs informations en arguments:

    Pour copier un morceau, il faut savoir sa longueur et sa position.
    Il faut aussi savoir où le copier: position et longueur acceptable.
    Et enfin, il serait éventuellement intéressant de limiter la zone lisible.

    La fonction pourrait avoir pour signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /*
    copie un segment de chaine dans une autre
    s'attend à ce que chaine soit au moins longue de début+longueur+1 (pour le \0) caratères 
    s'attend aussi à ce que chaine_cible puisse accueil longueur+1 caratères
    */
    morceau(chaine, chaine_cible, début, longueur)
    .

    on peut aussi imaginer quelque chose plus ordonné, comme morceau(chaine, début, longueur, chaine_cible), ou une variante début+fin, telle que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /*
    copie le segment de chaine compris entre début inclus et fin exclus, dans chaine_cible.
    s'attend à ce que chaine soit au moins longue de fin (pour le \0) caratères 
    s'attend aussi à ce que chaine_cible puisse accueil (fin-début)+1 caratères
    */
    morceau(chaine, début, fin, chaine_cible)
    .

    Par ailleurs, comme tu demandes de l'aide, c'est que tu n'as pas compris comment faire.
    Dis nous ce que tu penses faire, et montre nous ta tentative, et nous t'aiderons à comprendre.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut modification
    salut les développeurs.merci pour les réactions.j'ai commis une erreur. en fait la fonction a pour prototype MID(chaine[],n1,n2) et doit me renvoyer un extrait de chaine[],commençant par le caractère numéro n1 et de longueur n2.voila!!!!! MERCI

  5. #5
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Bonjour fabibass et bonjour à tous,

    Dans le Basic d'antant, "MID" permettait de renvoyer une chaîne à l'intérieur d'une autre chaîne en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat$ = MID(chaine$, 10, 5)
    d'une façon qui ressemble à ce que Visual Basic fait aujourd'hui : http://msdn.microsoft.com/fr-fr/libr...=vs.90%29.aspx

    Je suppose que ce que fabibass veux faire est en fait de répliquer le fonctionnement de cette instruction.

    S'agissant du cas où le nombre de caractères demandés dépasse le nombre de caractères disponibles à partir de la position donnée, Basic ne s’embarrasse pas et retourne le nombre de caractères disponibles à partir de la position.

    fabibass pourrait décider de faire la même chose. C'est un choix d'implémentation qui doit être fait, en tout cas (et documenté, en autres informations à documenter).

    Citation Envoyé par fabibass Voir le message
    (...) j'ai commis une erreur. en fait la fonction a pour prototype MID(chaine[],n1,n2) et doit me renvoyer un extrait de chaine[],commençant par le caractère numéro n1 et de longueur n2 (...)
    Ton prototype est toujours incomplet, car il n'indique pas comment est renvoyée la chaîne.

    Il est difficile d'imiter l'instruction Basic, en créant une fonction qui renvoie une chaîne d'une taille indéterminée qui serait renvoyée avec une instruction return en fin de fonction.

    La façon de faire normale en C est de laisser au programme appelant la responsabilité d'allouer un espace mémoire suffisant pour la chaîne à retourner et de passer à la fonction le pointeur sur cette chaîne.

    C'est pourquoi leternel t'a donné un exemple de prototype correct en te proposant un prototype à 4 paramètres.

    Il t'a aussi suggéré d'y travailler et de poster ton code, afin que l'on t'aide utilement.

    Vu la formulation de ta demande, il a toutes les chances que ta "demande" corresponde à l'énoncé d'un devoir qu'on te demande de faire, et je ne pense pas qu'on te rende service en faisant le travail à ta place, ni que cela soit la philosophie de ce site que de faire cela. Mais comme je suis moi même nouveau sur le forum, je peux me tromper :-)

    Bon courage !


    Eks

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fabibass Voir le message
    en fait la fonction a pour prototype MID(chaine[],n1,n2) et doit me renvoyer un extrait de chaine[],commençant par le caractère numéro n1 et de longueur n2.voila!!!!!
    Eh ben crois-le ou non, ce genre de truc n'est pas un travail de débutant.
    Il te faut allouer une zone de (n2+1) caractères (malloc), y recopier les n2 caractères de la chaine en commençant à la position n1 et rajouter en final un '\0' pour que cette zone soit conforme aux standards des chaines en C. Puis enfin renvoyer l'adresse de la zone créé. Charge alors à l'appelant de libérer ensuite (free) l'adresse reçue puisque tout malloc (allocation mémoire) implique un free (libération) et que ce n'est pas à la fonction de faire ce free sinon la zone ne serait plus utilisable par celui qui en a besoin et qui a appelé ta fonction

    Ce n'est pas un travail de débutant car il nécessite déjà une connaissance de malloc (ce qui implique alors de connaitre les pointeurs) et des différences qu'il y a entre les zones mémoires du langage (pile, tas)...

    Citation Envoyé par fabibass Voir le message
    je suis un débutant dans le langage C...
    le prototype proposé est le suivant:MID(chaine1[],chaine2[],n)...
    j'ai commis une erreur
    Proposé par qui ? Comment peut-on commettre une telle erreur de ne pas être capable de recopier un prototype donné ?? Comment peut-on te donner un tel travail à faire si tu débutes à peine en C ???

    Citation Envoyé par -Eks- Voir le message
    Dans le Basic d'antant, "MID" permettait de renvoyer une chaîne à l'intérieur d'une autre chaîne en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat$ = MID(chaine$, 10, 5)
    Ah, le basic, toute une histoire...

    Citation Envoyé par -Eks- Voir le message
    Je suppose que ce que fabibass veux faire est en fait de répliquer le fonctionnement de cette instruction.
    Oui, je l'avais envisagé (surtout quand j'ai mentionné "middle"). Mais dans ce cas le prototype ne convenait pas...

    Citation Envoyé par -Eks- Voir le message
    La façon de faire normale en C est de laisser au programme appelant la responsabilité d'allouer un espace mémoire suffisant pour la chaîne à retourner et de passer à la fonction le pointeur sur cette chaîne.
    C'est en effet une autre possibilité. L'appelant se charge alors du malloc et du free (ou bien plus simplement il a dans sa pile un tableau de la bonne taille). Mais alors il n'y a plus besoin de retourner quoi que ce soit (hormis un flag éventuel de réussite ou d'échec) et cela ne cadre plus avec l'énoncé d'origine (or moi j'aime bien l'exactitude).
    Toutefois on ne peut pas lui attribuer le qualificatif de "normale" sous-entendant que la première façon serait alors "anormale". C'est simplement une autre façon de procéder dans laquelle c'est à l'appelant de tout organiser pour que la fonction se déroule sans anicroche.

    Citation Envoyé par -Eks- Voir le message
    Mais comme je suis moi même nouveau sur le forum, je peux me tromper :-)
    Nan nan nan, c'est exactement ça. Quand l'énoncé présente un code dénotant une certaine habitude, associé à des phrases qui indiquent que le posteur sait ce qu'il dit et que c'est un pro qui a un soucis, on donnera volontier un code avec la solution. Mais si l'énoncé ressemble trop à un "TP", effectivement on ne donne plus le code. Donne un poisson à un homme et il mangera un jour, apprends-lui à pêcher et il mangera tous les jours (Lao Tzeu)
    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]

  7. #7
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est en effet une autre possibilité. L'appelant se charge alors du malloc et du free (ou bien plus simplement il a dans sa pile un tableau de la bonne taille). Mais alors il n'y a plus besoin de retourner quoi que ce soit (hormis un flag éventuel de réussite ou d'échec) et cela ne cadre plus avec l'énoncé d'origine (or moi j'aime bien l'exactitude).
    Toutefois on ne peut pas lui attribuer le qualificatif de "normale" sous-entendant que la première façon serait alors "anormale". C'est simplement une autre façon de procéder dans laquelle c'est à l'appelant de tout organiser pour que la fonction se déroule sans anicroche.
    Comme l'énoncé d'origine n'est pas des plus fiables, je pense qu'on peut se permettre des libertés, et que fabibass a peut-être mal recopié ou interprété à sa façon ce qu'on lui demande de faire.

    Cela dit, dans son message d'origine, il mettait déjà sans son prototype (incomplet) la chaine2[] à "renvoyer" (et pas à "retourner") dans les arguments de sa fonction :-)

    fabibass devrait s'exprimer là dessus, en tout cas, on le peut pas l'aider sur l'énoncé de son problème, c'est entièrement de sa responsabilité.

    Le terme "normal" que j'ai utilisé pour affirmer que c'est au programme appelant qu'incombe la responsabilité d'allouer un espace mémoire suffisant pour la chaîne à retourner et de passer à la fonction le pointeur sur cette chaîne, n'est probablement pas très heureux. Néanmoins, c'est une façon habituelle de procéder et qui ne choque pas de développeur C qui est habitué devoir se discipliner sur le sujet avec les fonctions de la bibliothèque standard.

    En fait passer le pointeur sur la chaîne de destination en paramètre et retourner la chaîne de destination avec return ne sont pas non plus antinomiques, et on pourrait faire les deux. La fonction mid() à réaliser pourrait ainsi être vue comme une extension de la fonction standard strncpy accessible par string.h, dont le prototype est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * strncpy ( char * destination, const char * source, size_t num );
    et qui en l'occurrence, retourne aussi le pointeur sur char "destination", même si cela n'est pas indispensable au fonctionnement de strncpy, mais qui est utile si on veut directement mettre l'appel à cette fonction dans une autre fonction prenant un pointeur sur char en paramètre.

    cela donnerait quelque chose comme (la fonction mid reste à implémenter) :

    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
    39
    40
    #include <stdio.h>
     
    /**
     * mid() - retourne une sous-chaîne
     * @res:    C string où le résultat doit être retourné
     * @str:    C string contenant le texte à utiliser
     * @start:  index de départ (zéro est le premier caractère)
     * @len:    longueur de la sous-chaîne à rechercher
     *
     * Il est de la responsabilité de la fonction appelante
     * d'allouer une chaîne res de taille d'au moins len + 1,
     * qui contiendra le résultat renvoyé.
     *
     * Si len dépasse la taille de str à partir de start, res
     * renvoie les caractères disponibles à partir de start
     * jusqu'à la fin.
     *
     * Si start est au delà de la taille de str, une chaine
     * vide est renvoyée dans res.
     *
     * Return: res est retourné
     */
    char * mid(char * res, char * str, int start, size_t len) {
        /* fonction à implémenter */                                                                        
        return res;
    }
     
    int main(void)
    {
        char * st = "Bonjour tout le monde";
        char resultat[6] = { '\0' };                                                                        
     
        /* capture "monde" */
        mid(resultat, st, 16, 5);
        printf("résultat : %s\n", resultat);
        /* capture et affiche directement "tout" */
        printf("résultat : %s\n", mid(resultat, st, 8, 4));
     
        return 0;
    }

    Eks

Discussions similaires

  1. Stdcall, Langage C et fonction dans type
    Par Champitox dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2012, 09h08
  2. Fonction random comme dans le langage Pascal
    Par habilité dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 24/07/2009, 18h58
  3. Utiliser les fonctions dans le langage c
    Par dev0712 dans le forum Débuter
    Réponses: 3
    Dernier message: 14/12/2008, 20h41
  4. [langage] Appel de fonction dans un lien
    Par drakan dans le forum Langage
    Réponses: 1
    Dernier message: 17/05/2005, 18h30
  5. Réponses: 4
    Dernier message: 26/01/2005, 13h08

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