Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Fonction recursive et parametre [ Divers / Débutant(e) ] (elguevel)

jeudi 21 juin 2007 à 12:00:20 | Fonction recursive et parametre

elguevel


Bonjour tout le monde,

    Je suis débutant en Java, et j'ai un problème dont je n'arrive pas à me depatouiller ...

    J'ai une fonction recursive (qui s'appelle donc elle meme), et j'ai en paramètre un ( Integer i ) .
    Chaque fois que la fonction s'appelle j'incremente i, mais quand la fonction appellée est terminée, et que je remonte d'un niveau, je reviens à la valeur de i precedente (celle qu'avait i avant l'appel recursif).

    Pourtant en passant un objet (Integer) en paramètre, je suis cencé passer une reference, et donc si j'incremente la variable à l'interieure d'une methode, meme en sortant de cette methode, i devrait garder sa nouvelle valeur.
   
    Et en fait... non ? pourquoi à votre avis ?
   
    PS : Vous allez surement me demander le code, mais c'est assez long et dans un système proprietaire.
    S'il vous le faut vraiment je le posterai.
   
   
    Ce n'est pas réelement çà, mais schématiquement :
   
        public boolean Methode( Integer i )
        {
            // Code ..
            i++;
           
            if ( Methode( i ) )
            {
                // Code ...
            }
           
            // Code ...
            return true;
        }
   
    En vous remerciant par avance pour votre aide.

 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <

jeudi 21 juin 2007 à 12:03:50 | Re : Fonction recursive et parametre

dvoraky

Je en pense pas qu'en Jave on passe des références.
En C, cela aurait été facile à voir mais bon, en Java, je ne pense pas qu'on puisse passer une référence.
Il faut quelqu'un qui valide ou critique ma pensée ^^
c'est mieux pour toi elguevel
C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!

jeudi 21 juin 2007 à 12:52:10 | Re : Fonction recursive et parametre

elguevel

Ba quand on passe un objet en parametre il me semble que c'est la reference de cet objet et non une copie. Par contre si l'on passe un type de base (int, boolean, ..) là effectivement on passe une valeur. Est ce que qqn du monde Java peut confirmer et est capable de repondre à mon probleme :-( ?

 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <

jeudi 21 juin 2007 à 12:57:55 | Re : Fonction recursive et parametre

sheorogath

Membre Club Administrateur CodeS-SourceS
essai de mettre un peu plus de code pour voir ...

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

jeudi 21 juin 2007 à 13:13:43 | Re : Fonction recursive et parametre

elguevel

C'est delicat car c'est une application professionelle, donc j'ai enlevé une bonne partie du code non-necessaire et les commentaires. Je color en bleu les parties concernées, et un commentaire en rouge situe le probleme.

    public boolean CreateEBOMSheet( Context context, WritableWorkbook workbook, DomainObject objetDepart, StringList objectSel, StringList relationSel, HashMap mInfoEnfant, WritableSheet sheetParent, Integer ligneParent ) throws Exception
    {

        MapList expand = objetDepart.getRelatedObjects( context, "EBOM", "*", objectSel, relationSel, false, true, (short)1, "revision == last", null );

        expand.sort("attribute[Component Location]", "ascending", "Stringpad");

        if ( expand != null && expand.size() != 0 )
        {
 
            String sIdObject     = (String) objetDepart.getAttributeValue( context, SELECT_ID );
            String sLibelle     = (String) objetDepart.getAttributeValue( context, "REELLibelle"    );
            String sNumeroPlan     = (String) objetDepart.getAttributeValue( context, "REELNumeroPlan" );
            String sMasse         = (String) objetDepart.getAttributeValue( context, "Weight" );
            String sIndice         = (String) objetDepart.getInfo( context, "revision" );
            String sCodeArticle = (String) objetDepart.getInfo( context, "name"  );
            String sEmetteur     = (String) objetDepart.getInfo( context, "owner" );

             String sPage = new String();
            int nbPage = workbook.getNumberOfSheets(); // Nombre de page
 
               if ( sLibelle.length() > 26 ) {
                sPage = String.valueOf(nbPage) + "-" + sLibelle.substring(0, 26);
            } else {
                sPage = String.valueOf(nbPage) + "-" + sLibelle.toString();
            }

            sPage = sPage.replace( '\'', ' ' );
            sPage = sPage.replace( '/', ' ' );
 
            workbook.copySheet( "Modele", sPage, nbPage );
            WritableSheet sheet = workbook.getSheet( nbPage );

            mInfoEnfant.put( "sObjectId", sIdObject );
            mInfoEnfant.put( "sPage",     sPage     );

            sheet.addCell( new Label( 10, 0, CompleteDate, BorderCellHeader ) ); // K1 : Date
            sheet.addCell( new Label( 4,  2, sLibelle,        BorderCellHeader ) ); // E3 : Libellé
            sheet.addCell( new Label( 4,  4, sNumeroPlan,  BorderCellHeader ) ); // E5 : Numéro de plan
            sheet.addCell( new Label( 4,  6, sCodeArticle, BorderCellHeader ) ); // E7 : Code article
            sheet.addCell( new Label( 10, 2, sIndice,        BorderCellHeader ) ); // K3 : Indice d'en-tete
            sheet.addCell( new Label( 10, 4, sEmetteur,    BorderCellHeader ) ); // K5 : Emetteur
            sheet.addCell( new Label( 10, 6, sMasse,        BorderCellHeader ) ); // K7 : Masse

            Integer i = new Integer(9);                                         // On commence à la ligne 10
            int iNbElements = expand.size();

            // Parcour toutes les lignes et les places
            for( int ligne = 0; ligne < iNbElements; ligne++ )
            {

                // Recupère les lignes de l'expand
                Map mapObject = (Map) expand.get(ligne);

                // Prépare à chercher des lignes sous l'article
                String idEnfant = (String) mapObject.get( SELECT_ID );
                HashMap infosEnfant = new HashMap();

                // *** On recupère les différents champs ***

                String sNfoCodeArticle        = (String) mapObject.get("name");
                String sNfoRevision            = (String) mapObject.get("revision");
                String sNfoAutoDescription     = (String) mapObject.get("attribute[REELAutomaticDescription]");
                String sNfoCommentaireMatrix= (String) mapObject.get("attribute[REELCommentaire]");
                String sNfoLibelle             = (String) mapObject.get("attribute[REELLibelle]");
                String sNfoNumeroDePlan        = (String) mapObject.get("attribute[REELNumeroPlan]");
                String sNfoMasse            = (String) mapObject.get("attribute[Weight]");
                String sNfoRepereArticle    = (String) mapObject.get("attribute[Component Location]");
                String sNfoUniteQt            = (String) mapObject.get("attribute[Unit of Measure]");
                String sNfoQuantite            = (String) mapObject.get("attribute[Quantity]");
                String sNfoMaterialCategory    = (String) mapObject.get("attribute[Material Category]");
                String sNfoNiveauPieceSecu    = (String) mapObject.get("attribute[REELPieceDeSecurite]");
                String sNfoPiecePG             = (String) mapObject.get("attribute[REELIdentifiantPieceSecurite]");
                String sNfoModeAppro         = (String) mapObject.get("attribute[REELModeApprovisionnement]");
                String sNfoCommentaireAppro = (String) mapObject.get("attribute[REELCommentaireModeApprovisionnement]");
                String sNfoNature              = (String) mapObject.get("attribute[REELNature]");

    if ( isDebit(sNfoRepereArticle, sNfoNature) )
                {

// C'est ici qu'est le probleme, j'incremente le paramètre, mais quand je sort de la fonction, le i du parent (donc
ligneParent ici) revient à çà valeur d'origine.

                    ligneParent++;                   

                    sheetParent.addCell( new Label( 4, ligneParent, sNfoLibelle, WrapCellGrid ) );            // Libelle
                    sheetParent.addCell( new Label( 0, ligneParent, sNfoRevision, CenterCellGridDebit ) );  // Revision

                     // Champs non concernés par les liens
                    sheetParent.addCell( new Label( 1, ligneParent, sNfoRepereArticle, CenterCellGrid ) );    // Repère de l'article

                    // Unité de la quantité
                    if ( sNfoUniteQt.equalsIgnoreCase("PC") )
                    {
                        sheetParent.addCell( new Label( 2, ligneParent, sNfoQuantite, CenterCellGrid ) );   // Quantité
                    }
                    else
                    {
                        WritableCellFeatures wcfUnite = new WritableCellFeatures();
                        wcfUnite.setComment( "Unite : " + sNfoUniteQt.toString(), (double)0.9, (double)0.5 );
                        Label lUnite = new Label( 2, ligneParent, sNfoQuantite, CenterCellGrid );
                        lUnite.setCellFeatures( wcfUnite );
                        sheetParent.addCell( lUnite );    // Quantité
                    }

                    sheetParent.addCell( new Label( 5, ligneParent, (String) hmMatiereMap.get( sNfoMaterialCategory ), CenterCellGrid ) );  // Matière

                    // Piece de sécurité
                    if ( !sNfoNiveauPieceSecu.equals("Non") )
                    {
                        if ( sNfoPiecePG.equals("") ) { sheetParent.addCell( new Label( 3, ligneParent, sNfoNiveauPieceSecu, WrapCellGrid ) ); } else { sheetParent.addCell( new Label( 3, ligneParent, sNfoPiecePG, WrapCellGrid ) ); }
                    }
                    else
                    {
                        sheetParent.addCell( new Label( 3, ligneParent, "", WrapCellGrid ) );
                    }

                }
                else
                {

                    if ( CreateEBOMSheet( context, workbook, (DomainObject) this.getObject( context, idEnfant ), objectSel, relationSel, infosEnfant, sheet, i ) )
                    {
                        // CODE
                        // ...
                        // ...
                        // ...
                        // CODE
                    }

                    // CODE
                    // ...
                    // ...
                    // ...
                    // CODE

                    // Ligne suivante
                    i++;
                }

            }

            return true;
        }
        else
        {
            return false;
        }
    }


 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <

jeudi 21 juin 2007 à 13:54:02 | Re : Fonction recursive et parametre

sheorogath

Membre Club Administrateur CodeS-SourceS
ta essaye de metre ligne parent en static

je doit avouer que ton code est un peu gros lol ...
j'ai du mal a voir ... normalement en java on bosse par reference ... au pire essai de faire une miniclass de test de ce genre :

public classe monint {
int i ;
public monint(int i){
this.i = i;
}
public int geti(){return i;}
public void increment(){ ++i;}
}

ou alors je sais pas trop ...
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

jeudi 21 juin 2007 à 14:39:36 | Re : Fonction recursive et parametre

elguevel

Je n'ai pas mis le reste du code car bcp seraient etonnné, déja c'est plein de classes proprietaires et les classes ont toutes comme prototype :

public class ${CLASSNAME} extends ${CLASS:emxDomainObject}

Donc je ne peut ecrire mon code que dans 1 seule classe.

==> C'est en fait des scripts d'un PLM nommé Matrix. ( de chez Matrix One ).
 
Mais en gros à partir de l'arborescence de ce logiciel je genere un fichier excel qui comprend 1 onglet par niveau d'arborescence. Tout fonctionne mais on m'a demandé recement d'adapter le programme pour remonter des infos d'un certain niveau de 2 niveaux au dessus. D'où mon soucis de pouvoir interagir avec une variable d'une autre instance de ma fonction.

J'ai appris le Java y'a 2 mois sur le tas avec 1 bouquin en main, et si j'apprend vite, des concepts m'echappes comme cette histoire de reference qui n'en ai pas une à prioris !!?

 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <

jeudi 21 juin 2007 à 14:42:53 | Re : Fonction recursive et parametre

sheorogath

Membre Club Administrateur CodeS-SourceS
en fait les references en java peuvent etre parfois sujette a bug par exemple :

Vector<String> v = ......
Vector<String> j = v;

v.add(element); // a ete aussi ajoute dans v


"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

jeudi 21 juin 2007 à 14:54:52 | Re : Fonction recursive et parametre

the_wwt

Bonjour,
je viens de tester un truc simple:
public class Test {
    private Integer i;
    public Test() {
        super();
        rec(0);
    }

    public static void main(String[] args){
        new Test();
    }
   
    public int rec( Integer i){
        i++;
        System.out.println("Valeur avant l'appel: " + i);
        if( i < 10)
            rec(i);
        System.out.println("Valeur après l'appel: " + i);
        return 0;
    }   
}

Et en effet après l'appel, i a garde la valeur de avant l'appel:
Voici la Console:
Valeur avant l'appel: 1
Valeur avant l'appel: 2
Valeur avant l'appel: 3
Valeur avant l'appel: 4
Valeur avant l'appel: 5
Valeur avant l'appel: 6
Valeur avant l'appel: 7
Valeur avant l'appel: 8
Valeur avant l'appel: 9
Valeur avant l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 9
Valeur après l'appel: 8
Valeur après l'appel: 7
Valeur après l'appel: 6
Valeur après l'appel: 5
Valeur après l'appel: 4
Valeur après l'appel: 3
Valeur après l'appel: 2
Valeur après l'appel: 1

Donc on peut en déduire, que java gère les classes enveloppes(Integer->int, Float->float) comme les types primitifs... ie
en passant la valeur...
Cordialement,
Pierrick


jeudi 21 juin 2007 à 14:58:57 | Re : Fonction recursive et parametre

the_wwt

Vous allez me dire comment faire alors ? -> Avec une variable globale...
public class Test {
    private Integer i;
    public Test() {
        super();
        i = 0;
        rec(  );
    }

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args){
        new Test();
    }
   
    public int rec(){
        i++;
        System.out.println("Valeur avant l'appel: " + i);
        if( i < 10)
            rec();
        System.out.println("Valeur après l'appel: " + i);
        return 0;
    }   
}

Resultat:
Valeur avant l'appel: 1
Valeur avant l'appel: 2
Valeur avant l'appel: 3
Valeur avant l'appel: 4
Valeur avant l'appel: 5
Valeur avant l'appel: 6
Valeur avant l'appel: 7
Valeur avant l'appel: 8
Valeur avant l'appel: 9
Valeur avant l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10

J'espère que ça peut t'aider...
Cordialement,
Pierrick


1 2

Cette discussion est classé dans : fonction, code, methode, integer, recursive


Répondre à ce message

Sujets en rapport avec ce message

pb de casting sur jbutton [ par benohite ] bonjour a tous,j ai cree ma propre barre d outil heritée de jtoolbar a laquelle j ajoute plusieurs boutons par defaut (i.e: dans le constructeur) via SUN minor code: 202 [ par vinvay ] J'utilise CORBA pour mon "Application de transfert de fichiers avec CORBA" (http://www.javafr.com/code.aspx?ID=21616).J'ai voulu ajouter une fonction problème avec une méthode [ par Waldo2188 ] Bonour, Pour mon stage je dois utiliser le JRE 1.4.1 pour développer. Mais le problème c'est que j'ai trouvé un code qui utilise une methode qui n'e Besoin d'aide au code Java2D [ par huongthuy ] Bonjour, j'ai besoin d'un code de JAVA pour représenter graphiquement toutes les fonctions par exemple : la fonction linéaire y = ab, la fon Fonction ou une methode pour demarrer Internet Explorer [ par hlimaiem ] Limaiem heykelBonjour,Je cherche une fonction qui permet de demarrer internet explorer ou Fire Fox depuis un clic dans mon  programme java (qui permet Fonction Javascript dans du JSP [ par ismailfk ] bonjour,j'ai une probleme lors de l'insertion du code java script dans une page jspcontrolNom()----code----- appel d'une fonction java a partir d'un jsp [ par tularis512 ] BonjourJ'ai un probleme. Je dois a aprtir de ma page jsp quand j'appuis sur un bouton creer un fichier (a parti d'une class java cote serveur) puis le Tracé de fonction à partir de deux points x et y [ par kiranos ] Salut tlm,Est ce qu'il ya une personne qui pourra m'aider à tracer une fonction (ligne) à partir de deux point x et y données par l'utilisateur sur un lancer madkit de mon code jbuilder [ par ismailfk ] bonjour,en faite j'ai trouver mon probleme est le suivant:comment lancer madkit de mon code ecrit dans jbuilder ; j'ai trouver ce ligne :Vector c = ne Obtenir la page de code d'un fichier [ par jeanajaccio ] Salut,Je cherche une méthode qui permet de trouver l'encodage (UTF,ISO...) d'un fichier quelconque.Merci de votre aideA bientôtJean


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Appels d'offres

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.