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 ne fonctionne pas


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut fonction qui ne fonctionne pas
    Bonjour à Tous!
    Cette fonction perso ne renvoie rien:
    création de la fonction tabul
    je cherche à découper une chaine appellée chaine"precedente"
    à une position précise de la chaine precedente ici 5:
    precedente devient chaine"racourcie"
    pour ajouter au bout une chaine"form" de long. fixe ici 10
    la chaine racourcie+form devient chaine"nouvelle"
    et fait bien 15 carac.
    Mais le programme cesse de fonctionner en sortant de la fonction.
    L'erreur manifeste ne me saute aux yeux mais vous?

    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
    41
    42
    43
    44
    45
    46
    47
     
    //ajouter une chaine formatée au bout d'une chaine existante
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    //string s1 = s2.substr(posdeb,posfin);
    //int ichform1,lonchform1=chform1.size();                                       //int iunechaine, tailleunechaine = unechaine.size ();
     
     
    string tabul(int posatabuler,string precedente,string form,string nouvelle)
    {//fc tabul
          cout<<"---------------"<<endl;
          int iprecedente,lonprecedente=precedente.size();                           
          cout<<"    precedente:"<<precedente<<"("<<lonprecedente<<")"<<endl;       //controle de ch.precedente
     
                     string racourcie;                                              //init ch.racourcie var.locale
                     racourcie=precedente.substr(0,posatabuler);                    //construction de ch.racourcie
                     int iracourcie,lonracourcie=racourcie.size();                  
                     cout<<"     racourcie:"<<racourcie<<"("<<lonracourcie<<")"<<endl;
     
          nouvelle=racourcie+form;                                                  //construction de ch.nouvelle  
          int inouvelle,lonnouvelle=nouvelle.size();                                
          cout<<"      nouvelle:"<<nouvelle<<"("<<lonnouvelle<<")"<<endl;
          cout<<"---------------"<<endl;
     
    return nouvelle;
    }//fc tabul
     
     
    int zer;
    string    echelled=":         1         2         3         40 colonnes";
    string    echelleu=":1234567890123456789012345678901234567890";
    int posatabulerI=5;                                                             //position où on doit concaténer la chaine formI..
    string precedenteI="1234567890123456789012345678901234567890";                  //..sur la chaine precedenteI
    string formI="FormUVWXYZ";                                                      //la chaine de longueur toujours fixe,ici 10 car.
     
    int main()
    {
        string nouvelleI;
        string tabultabul;
               tabultabul =  tabul(posatabulerI,precedenteI,formI,nouvelleI);
               cout<<"     nouvelle:"<<nouvelleI<<"|<<<<<"<<endl;
    cout<<" "<<endl;
    cout <<"0/q"<<endl;
    cin>>zer;    
    }
    Avec mes remerciements.
    Sen.
    Cordialement.
    Sen.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu passe à ta fonction une copie de la chaîne nouvelleI, il est donc normal que nouvelleI ne soit pas modifiée.

    Tu peux donc :
    - Soit passer une référence à nouvelleI : void tabul(int posatabuler,string precedente,string form,string &nouvelle)
    - Soit utiliser la valeur de retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabultabul =  tabul(posatabulerI,precedenteI,formI);
               cout<<"     nouvelle:"<<tabultabul <<"|<<<<<"<<endl;
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    bonjour,
    Merci pour ces 2 solutions proposées.
    A la lecture la 2e qui raccourci la fonction m'a paru "étonnante" car la fonction et son appel doivent être identiques:elle n'a pas marché.
    La 1er avec void et & ne marche pas non plus.
    Mais je ne désespère pas.
    @+++.
    Cordialement.
    Sen.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ok, je détaille un peu plus :

    1ère :


    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
    41
    42
    43
    44
    //ajouter une chaine formatée au bout d'une chaine existante
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    //string s1 = s2.substr(posdeb,posfin);
    //int ichform1,lonchform1=chform1.size();                                       //int iunechaine, tailleunechaine = unechaine.size ();
     
     
    void tabul(int posatabuler,string precedente,string form,string &nouvelle)
    {//fc tabul
    	cout<<"---------------"<<endl;
    	int lonprecedente=precedente.size();                           
    	cout<<"    precedente:"<<precedente<<"("<<lonprecedente<<")"<<endl;       //controle de ch.precedente
     
    	string racourcie;                                              //init ch.racourcie var.locale
    	racourcie=precedente.substr(0,posatabuler);                    //construction de ch.racourcie
    	int lonracourcie=racourcie.size();                  
    	cout<<"     racourcie:"<<racourcie<<"("<<lonracourcie<<")"<<endl;
     
    	nouvelle=racourcie+form;                                                  //construction de ch.nouvelle  
    	int lonnouvelle=nouvelle.size();                                
    	cout<<"      nouvelle:"<<nouvelle<<"("<<lonnouvelle<<")"<<endl;
    	cout<<"---------------"<<endl; 
    }//fc tabul
     
     
    int zer;
    string    echelled=":         1         2         3         40 colonnes";
    string    echelleu=":1234567890123456789012345678901234567890";
    int posatabulerI=5;                                                             //position où on doit concaténer la chaine formI..
    string precedenteI="1234567890123456789012345678901234567890";                  //..sur la chaine precedenteI
    string formI="FormUVWXYZ";                                                      //la chaine de longueur toujours fixe,ici 10 car.
     
    int main()
    {
    	string nouvelleI;
    	string tabultabul;
    	tabul(posatabulerI,precedenteI,formI,nouvelleI);
    	cout<<"     nouvelle:"<<nouvelleI<<"|<<<<<"<<endl;
    	cout<<" "<<endl;
    	cout <<"0/q"<<endl;
    	cin>>zer;    
    }
    Deuxième :

    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
    41
    42
    43
    44
    //ajouter une chaine formatée au bout d'une chaine existante
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    //string s1 = s2.substr(posdeb,posfin);
    //int ichform1,lonchform1=chform1.size();                                       //int iunechaine, tailleunechaine = unechaine.size ();
     
     
    string tabul(int posatabuler,string precedente,string form)
    {//fc tabul
    	cout<<"---------------"<<endl;
    	int lonprecedente=precedente.size();                           
    	cout<<"    precedente:"<<precedente<<"("<<lonprecedente<<")"<<endl;       //controle de ch.precedente
     
    	string racourcie;                                              //init ch.racourcie var.locale
    	racourcie=precedente.substr(0,posatabuler);                    //construction de ch.racourcie
    	int lonracourcie=racourcie.size();                  
    	cout<<"     racourcie:"<<racourcie<<"("<<lonracourcie<<")"<<endl;
     
    	string nouvelle=racourcie+form;                                                  //construction de ch.nouvelle  
    	int lonnouvelle=nouvelle.size();                                
    	cout<<"      nouvelle:"<<nouvelle<<"("<<lonnouvelle<<")"<<endl;
    	cout<<"---------------"<<endl; 
    	return nouvelle;
    }//fc tabul
     
     
    int zer;
    string    echelled=":         1         2         3         40 colonnes";
    string    echelleu=":1234567890123456789012345678901234567890";
    int posatabulerI=5;                                                             //position où on doit concaténer la chaine formI..
    string precedenteI="1234567890123456789012345678901234567890";                  //..sur la chaine precedenteI
    string formI="FormUVWXYZ";                                                      //la chaine de longueur toujours fixe,ici 10 car.
     
    int main()
    {
    	string tabultabul;
    	string nouvelleI = tabul(posatabulerI,precedenteI,formI);
    	cout<<"     nouvelle:"<<nouvelleI<<"|<<<<<"<<endl;
    	cout<<" "<<endl;
    	cout <<"0/q"<<endl;
    	cin>>zer;    
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    bonjour!
    Les deux solutions marchent!
    1) avec un & solution "pointeur" mais je n'accroche pas trop encore et cherche à m'en passer!(merci accessoirement pour la simplification pour le calcul des longueurs calcul qui n'intervient pas dans le fonctionnement de la fonction..)
    2) je vais retenir la 2e plus classique.J'avais mal lu,mal cherché à comprendre:
    si on raccourci la fonction on doit racourcir son appel,c'était évident
    Merci beaucoup:rapide,efficace.
    Sen.
    @+++
    Cordialement.
    Sen.

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

Discussions similaires

  1. fonction qui ne fonctionne pas sous firefox
    Par megavolte dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/10/2009, 23h48
  2. Fonction qui ne fonctionne pas
    Par Herlece dans le forum PL/SQL
    Réponses: 18
    Dernier message: 12/08/2008, 16h05
  3. Réponses: 26
    Dernier message: 20/07/2007, 10h29
  4. [javascript]fonction qui ne fonctionne pas(concernant div)
    Par ranell dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/04/2007, 17h38
  5. [Javascript] Fonction qui ne fonctionne pas sous Opera et Safari
    Par frechy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/02/2007, 10h04

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