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

Collection et Stream Java Discussion :

[Collections]Drole de problème dans tableau


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut [Collections]Drole de problème dans tableau
    Bonjour,

    voilà je sui s en train de jouer avec un tableau et j'ai un drole de problème ! J'ai récupéré un exemple de classe qui réalise un snmpwalk donc je suppose que la manière dont ils le font est correct. La classe de base plaçait le résultat dans un tableau et l'affichait. Moi j'aimerais retourner le tableaux comme valeur de retour ! Cependant j'ai de drôle de problèmes !

    - quand je réalise une boucle pour afficher tous les éléments du tableau, ils les affichent tous mais si avant chaque affichage de chaque élément je place l'élément dans un autre tableau, il semble que la taille du tableau initial passe à 1.

    - quand je retourne le tableau il semble que sa taille devient 1 et seul le premier élément est retourné.

    J'ai tout essayé, tableau comme étant membre de la classe, placer les éléments du tableau dans ArrayList (mais la taille devient 1), ...

    voic le code
    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
     
    	public String [ ] snmpWalk(String oid){ 
                    //Tout ça on s'en fout ça marche.
    		target = new SnmpTarget();   
    	        target.setTargetHost(adr);             		 		
    	        target.setCommunity(community);			    		 
    	        target.setSnmpVersion(version); 					 
    	        target.setObjectID(oid);
    	        int maxtry = 0;	 		
    	        SnmpOID[] oidList = target.getSnmpOIDList();
     
                    //Element qui va poser problème
                    String result_tab [];
     
    	        if(oidList == null){
    	    	       System.out.println("Invalid OID has been specified");
    	        }
    	        else{
    		       SnmpOID rootoid = oidList[0];   				 
    		        while(maxtry++ < 1000){ 
     
    		 	//C'est ici que ça foire !
     
    		    	result_tab = target.snmpGetNextList();   //Renvoie un tableau de String   
                            //Ca on s'en fiche ça marche
    		    	if(result_tab == null) break;
    		    	if(!SnmpTarget.isInSubTree(rootoid,target.getSnmpOID())) break;  
     
    		    	for (int i=0;i<result_tab.length;i++){ 
                                        //Ici ça affiche tout correctement mais si par exemple je mets l'élément de resul_tab dans un autre tableau tout s'arrete après le premier.
    				    System.out.println(target.getObjectID(i) + ": " + result_tab[i]);
    				}
    		    }
     
                        //Ca on s'en fout.
    		    if(maxtry == 1){  // we did not get a valid row
    		    	System.err.println("Request failed, timed out or no available data. \n"+
    				target.getErrorString());
    		    } 
    		}
     
                //Renvoie le tableau : quoi que je fasse il ne renvoie que le premier element.
    	    return result_tab;
    	}
    Si j'utilise cette méthode pour récupérer un tableau càd si je fais String [] tab= snmpwalk (); je ne reçois que le premier élément.

    qqun aurait une idée ?

    merci d'avance[/b]

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Si c'est un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String [] tab=snmpwalk();
    plutot que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String tab=snmpwalk();

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Salut,

    merci de ta réponse.

    Je me suis trompé en recopiant, je l'ai déclaré en String tab []

  4. #4
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    Moi ce qui me parait bizare, c'est ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(maxtry++ < 1000){
       //....
       if(result_tab == null) break;
       //....
    }
    j'ai l'impression que tu vas sortir de ta méthode avec un tableau null la plupart du temps.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    En fait ce code vient d'un exemple tout fait fourni avec la bibliothèque snmp de AdventNet. Tant que je ne chipote pas au tableau et ne fait qu'afficher les résultats ça marche je reçois bien toutes mes réponses mais dès que je retourne le tableau alors il ne renvoie que le premier élément.

    Moi aussi ce code me paraissait bizarre, pourtant la boucle d'affichage fonctionne toujours quand une réponse arrive et ça me dit "no response" quand y en a pas, donc je suppose que ça marche.

    Si dans ma boucle d'affichage du résultat je fais un truc comme tab2[i] = result_tab [i] alors l'affichage ne marche plus et seul le premier élément est traité et affiché.

  6. #6
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    tu pourrais mettre le code, tel qu'il est quand ca marche pas

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Beh en fait renvoyer le tableau ne marche jamais. J'essaie vite autre chose puis si ça ça marche pas je mets tout le code de ce que je viens de faire.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bon voilà le code des deux méthodes qui posent problèmes. La méthode snmpwalk fonctionne et provient de l'exemple fournit par la bibliothèque AdventNet. La deuxième réalise deux snmpwalk et analyse le résultat.

    Dans snmpwalk, la boucle for de l'affichage des résultats m'affiche bien toutes les réponses, là c'est ok. Par contre dans la deuxième méthode, le fait de faire les deux snmpwalk qui sont sensé me renvoyer le tableau de String, fait en sorte que je ne reçois que le premier élément. Tout se passe comme si le tableau renvoyé n'avait qu'un seul élément, le premier.

    Dans snmpwalk un autre soucis est si je rajoute juste au dessus du System.out.println de l'affichage (boucle for) un truc du genre "tab2 [i] = result[i]" alors là pareil le tableau résult se comporte comme s'il n'avait qu'un seul élément et un seul, le premier s'affiche. Si je renvoie le tableau tab2 au lieu de result, même problè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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    	//Method to do a snmpwalk.
    	public String [] snmpWalk(String oid){ 
    		String [] result = null;
    		target = new SnmpTarget();      					  //Create a target object for the snmp request.
    		target.setTargetHost(adr);             		 		  //Set host.
    	    target.setCommunity(community);			    		  //Set the community.
    	    target.setSnmpVersion(version); 					  //Set the version.
    	    target.setObjectID(oid);                              //Set the oid.
    	    int maxtry = 0;	 									  //Number of max getnexts.
    	    SnmpOID[] oidList = target.getSnmpOIDList();		  //Construct the list of OIDs to retrieve, after the root oid specified. 
    	    if(oidList == null)	{
    	    	System.out.println("Invalid OID has been specified / Check if the OID is present in the MIB loaded if any"); 
    	    }
    	    else{
    		    SnmpOID rootoid = oidList[0];               	      //Root oid.
    		    while ( maxtry++ < 1000) {                   	      //Limit the max getnexts to 1000
    		    	result = target.snmpGetNextList();                //Get the variable (string) of all the oid of the list.
    		    	if(result == null) break;
    		    	if(!SnmpTarget.isInSubTree(rootoid,target.getSnmpOID())) break;  // check first column
     
    		    	if (maxtry == 1) System.out.println("Response received: ");
     
    		    	for (int i=0;i<result.length;i++) {               //Print the values
    		    		System.out.println(target.getObjectID(i) + ": " + result[i]);
    		    	}
    		    }
     
    		    if (maxtry == 1) {  // we did not get a valid row
    			System.err.println("Request failed, timed out or no available data. \n"+
    				   target.getErrorString());
    		    }  
    		}
    	    //Return the array of String (i.e. all the responses of the router).
    	    return result;
    	}
     
     
    	//Method used to retrieve and complete the index, IP adress and netmask off all interfaces (not only these of the ISIS table).
    	public void setIndIpMask(){
     
    		//Retrieve the two snmpwalk result array.
    		String [] mask_result = snmpWalk(ifmask);			//Get the masks result.  
    		String [] index_result = snmpWalk(ifindex); 		//Get the indexes result.
     
    		//Parse thes results to do the matching between index and ip.
    		ArrayList ipadr = null;     //Array of the ip adresses.
    		ArrayList indexes = null;   //Array of the indexes (element i correspond to the index of element i ipadr).
    		ArrayList netmask = null;   //Array of the netmask (idem).
    		ArrayList prefix = null;	//Array of the prefix (idem).
    		String index = null;		//The index.
    		String ip = null;			//The ip.
    		String mask = null;			//The mask.
    		String pref = null;			//The prefixe.
     
    		ipadr = new ArrayList();     
    		indexes = new ArrayList();   
    		netmask = new ArrayList();	 
     
    		//Complete the arrays.
    		for(int i = 0; i < index_result.length; i++){
    			String ipoid = target.getObjectID(i);      //Retrieve the oid because it contains the ip as last id.
    			Pattern ipPattern = Pattern.compile("((\\.[\\d+\\.]+)(\\d+\\.\\d+\\.\\d+\\.\\d+))");  //Search this pattern.
    			Matcher ipMatcher = ipPattern.matcher(ipoid);
    			if (ipMatcher.find()){   
                	index = index_result[i];
                	System.out.println("INDEX : "+index);
                	ip = ipMatcher.group(3);
                	System.out.println("IP : "+ip);
                	indexes.add(index);         //Set the index in the array.
                	ipadr.add(ip);				//Set the ip in the array.
                	//Search the corresponding mask.
                	for(int j = 0 ; j < mask_result.length ; j++){
                		System.out.println("-----------> : "+ mask_result[i]);
                		//Pattern maskPattern = Pattern.compile("(([\\d\\.]+)(\\d\\.\\d\\.\\d\\.\\d)(\\s*:\\s*)(\\d))");
            			//Matcher maskMatcher = maskPattern.matcher(mask_result[j]);
                	}
                }
    		}
     
    		//The interfaces are sorted by prefix --> find the prefix with the mask and IP
     
    	}
    PS : je n'ai pas les sources des méthodes snmp utilisée dans la bibliothèque, que les .class

    edit : l'erreur vous tombera peut être directement aux yeux mais moi ça fait une nuit et un jour que je suis dessus, c'est pour ça que je suis venu vous demandez de jeter un oeil, pour avoir une vue extérieure

    merci

  9. #9
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    tu pourrais rajouter ca avant le "return result;" dans la methode snmpWalk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Taille du tableau en sortie de snmpWalk : " + (result != null ? result.length : "result is null"));
    Parce que je vois pas comment il peut contenir quelquechose.

    Pour moi il n'y a que 2 facons de sortir du while :


    donc dans la plupart des cas, il est null.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Beh oui je sais bien,

    pourtant je t'assure que la boucle for m'affiche bien toutes les réponses dont j'ai besoin mais dès que je fais ce que j'ai expliqué plus haut alors tout foire !

  11. #11
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    si tu parle de cette boucle, je suis d'accourd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                 for (int i=0;i<result.length;i++) {               //Print the values
                    System.out.println(target.getObjectID(i) + ": " + result[i]);
                 }
    par contre si tu parle de celle là , ca m'etonnerais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                   for(int j = 0 ; j < mask_result.length ; j++){
                      System.out.println("-----------> : "+ mask_result[i]);
                      //Pattern maskPattern = Pattern.compile("(([\\d\\.]+)(\\d\\.\\d\\.\\d\\.\\d)(\\s*:\\s*)(\\d))");
                     //Matcher maskMatcher = maskPattern.matcher(mask_result[j]);
                   }
    tu as mis le bout de code que je t'ai filé pour voir ce qui sort effectivement de ta methode snmpWalk.

    normalement tu devrait avoir 2 fois la ligne que ca affiche, pour ces deux appels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          String [] mask_result = snmpWalk(ifmask);         //Get the masks result. 
          String [] index_result = snmpWalk(ifindex);       //Get the indexes result.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    En effet, je parlais du premier for, celui de l'affichage dans snmpwalk. Le deuxième ne m'affiche que le premier élément car le tableau retourné semble avoir perdu sa taille en cours de route.

    Je vais tester ce que tu m'as proposé mais je ne comprends quand même pas pourquoi si je m'amuse à écrire une instrution d'affectation dans le premier for (celui de snmpwalk) même cet affichage ne marche plus. Si j'écris : "tab2[i] = result_tab[i]" puis juste après je fais le println alors ça ne m'affiche que le premier élément comme si la taille devient 1.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    bien, avant le return result j'ai placé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(result!=null){
          System.out.print("result : " +result.length);
    }
    else{
          System.out.print("result null");
    }
    Chaque fois que je teste mon application et que la requete walk est ok, toutes les infos s'affichent, donc "result.length" dans la boucle for de l'affichage de snmpwalk est bien à la bonne taille.

    MAIS ce qui ne me fait pas rire c'est que la taille "result.length" placé avant le "return result" vaut, je te le donne en mille, 1 !

    Et ça ça me sort par tous les trous ;-)

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    BON ! j'ai trouvé, du moins je pense ! Un tout grand merci à la javadoc qui n'est pas claire.

    snmpGetNextList() ne renvoie pas un tableau de String dans le cas où je l'applique mais chaque appel renvoie une réponse et pas toute celles de la liste ! Bref à coup sur c'est ça !

    Je vais essayer autrement !

    Merci du temps que tu (et vous) m'avez consacré !


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

Discussions similaires

  1. [VBA-E] Problème de tableau dans macro VBA
    Par Chouls dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/06/2006, 15h20
  2. Problème dans le calcul d'éléments d'un tableau
    Par vidocq dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2006, 13h14
  3. Réponses: 7
    Dernier message: 21/12/2005, 16h44
  4. Problème dans un tri de tableau
    Par pmboutteau dans le forum ASP
    Réponses: 5
    Dernier message: 29/11/2005, 13h12
  5. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 17h42

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