Accueil > Forum > > > > Fonction recursive et parametre
Fonction recursive et parametre
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
|
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
|
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
|
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
|
|
Cette discussion est classée 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
lien texte dans jsp appelle fonction javascript [ par hammouda311283 ]
salut bon j'ai une page jsp dans laquelle un lien texte (qui est ici le nom d'une chanson 'goodbye my lover') en cliquant sur le lien, en principe on
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-----
JAVA: Faire appel à une fonction javascript [ par betty555 ]
Bonjour, Dans mon code javascript, j'ai déclaré une méthode pour faire appel à un service (Suppression d'un ouvrage); function appel_supp_ouvr(); ..
int String Convert [ par Taz1984 ]
Bonjour, 1) j'ai cette fonction : [code=java] public static int convertStringToInt(String string) { int i = 0; if (string != null && !"".equal
Livres en rapport
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|