# Portée d'une variable / Java



## macErmite (11 Mars 2006)

Bonjour,

Je n'arrive pas à maîtriser la portée d'une variable tableau, alors que les autres types de variables semblent plus facile à utiliser ...

Pouvez-vous m'aider.

Merci


----------



## macErmite (11 Mars 2006)

Exemple :

import java.io.*;
import java.util.*;


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class confiture {

    public static void main (String args[]) {

a=10;
double toto[]=new double [10];
double b = cerise();

public static void cerise()
{
toto[0] =  cerisier;   
...
return b;             
}


}

public int a;
public double toto[];
public double cerisier = 200;



}
----> Exception in thread "main" java.lang.NullPointerException

En fait, il est impossible d'affecter la valeur cerisier à toto[0] ...


----------



## olwin (11 Mars 2006)

tes variables toto et cerisier doivent être static si on respecte tes méthodes.
donc

public static double toto[];
public static double cerisier = 200;

ensuite il faut juste indiquer que toto est un tableau qui va contenir 10 doubles , comme ceci :
toto=new double[10];



> Exemple :
> 
> public static void main (String args[]) {
> 
> ...


----------



## macErmite (11 Mars 2006)

Merci, je vais tester ces conseils.

Bon Week end


----------



## OlivierL (11 Mars 2006)

Effectivement, tu peux déclarer tes variables comme étant "static", mais c'est mal...
C'est plus mieux bien de travailler avec des instances de classe.

Fait plutôt :

public class Confiture{

// déclaration des variables membres :
double toto[] = new double[10];

public *static* void main(String args){
   Confiture maConfiture = new Confiture();
   maConfiture.cerise();
}

public void cerise(){
   // faire quelque chose avec les variables membres...
   toto[0] = 1.0;
}


----------



## molgow (12 Mars 2006)

Pour répondre à la question originale, la portée d'une variable en Java est la même quelque soit son type (y compris si c'est un tableau).


----------



## macErmite (14 Mars 2006)

Merci pour toutes ces précisions.

Je dois avoué qu'il n'est pas facile de taper du code avec l'idée de créer des instances de class. Surtout quand celui-ci est dejà structuré  

Actuellement j'obtiens enfin des résulats numériques, mais je m'étonne de ne pas trouver une fonction permettant un affichage avec quelques chiffres après la virgule. Trois serait bien (Ne pas confondre avec la précision des calculs)

Une idée ?

exemple :


FocaleImage = focaleParaxialle();

double tirage_image= Pos_image[nombre_surface];
System.out.println("focale image paraxialle = "+FocaleImage);
System.out.println("Tirage image  s("+nombre_surface+") F image = "+ tirage_image);
(...)


Cela donne :

[Session started at 2006-03-14 20:37:04 +0100.]
0.3 micrometre
focale image paraxialle = 44.90318731477361
Tirage image  s(27) F image = 60.98319209448683
focale objet paraxialle = -44.903187314773625
Tirage objet  s(1) F objet = 55.50664477925259
0.33999999999999997 micrometre
focale image paraxialle = 47.67877288772071
Tirage image  s(27) F image = 66.26882697719938
focale objet paraxialle = -47.67877288772073
Tirage objet  s(1) F objet = 54.59474805566207
0.37999999999999995 micrometre
focale image paraxialle = 49.708199958354086
Tirage image  s(27) F image = 70.13522589460773
focale objet paraxialle = -49.70819995835403
Tirage objet  s(1) F objet = 53.88968588209987
0.41999999999999993 micrometre
focale image paraxialle = 51.221833833039845
Tirage image  s(27) F image = 73.01092861690888
focale objet paraxialle = -51.22183383303984
Tirage objet  s(1) F objet = 53.34892945828395


----------



## OlivierL (15 Mars 2006)

java.text.NumberFormat

et son petit frère
java.text.DecimalFormat


----------



## macErmite (15 Mars 2006)

En essayant cette forme :

import java.text.DecimalFormat;
(...)
DecimalFormat *form* = new DecimalFormat("0.0000");
(...)
System.out.println(*form.format*(onde)+" micrometre");
(...)
System.out.println("focale image paraxialle = "+*form.format*(FocaleImage));
System.out.println("Tirage image  s("+nombre_surface+") F image = "+ *form.format*(tirage_image));
(...)


Ce qui donne :

[Session started at 2006-03-15 19:25:35 +0100.]
0,3000 micrometre
focale image paraxialle = 44,9032
Tirage image  s(27) F image = 60,9832
focale objet paraxialle = -44,9032
Tirage objet  s(1) F objet = 55,5066
0,3400 micrometre
focale image paraxialle = 47,6788
Tirage image  s(27) F image = 66,2688
focale objet paraxialle = -47,6788
Tirage objet  s(1) F objet = 54,5947
0,3800 micrometre
focale image paraxialle = 49,7082
Tirage image  s(27) F image = 70,1352
focale objet paraxialle = -49,7082
Tirage objet  s(1) F objet = 53,8897
0,4200 micrometre
focale image paraxialle = 51,2218
Tirage image  s(27) F image = 73,0109
focale objet paraxialle = -51,2218
Tirage objet  s(1) F objet = 53,3489


Juste une remarque, on a une virgule (,) à la place d'un point (.) 
(je prefere un point  :rose:   )


----------



## GrandGibus (15 Mars 2006)

Tu peux spécifier le séparateur décimal (setDecimalSeparator)... tous les détails en suivant ce lien...


----------



## OlivierL (16 Mars 2006)

Le séparateur "," ou "." est choisit en fonction de la "Local". Mais tu peux effectivement le préciser.


----------



## macErmite (16 Mars 2006)

J'ai essayé cette syntaxe :


//*************
String *pattern* = "#.####";

DecimalFormatSymbols *symbols* = new DecimalFormatSymbols();
*symbols*.setDecimalSeparator('*.*');

DecimalFormat *numerique* = new DecimalFormat(*pattern*, *symbols*);
//**************
(...)

System.out.println(*numerique*.format(onde)+" micrometre");
(...)

System.out.println("focale image paraxialle = "+*numerique*.format(FocaleImage));
System.out.println("Tirage image  s("+nombre_surface+") F image = "+ *numerique*.format(tirage_image));

Ce qui donne :

0.3 micrometre
focale image paraxialle = 44.9032
Tirage image  s(27) F image = 60.9832
focale objet paraxialle = -44.9032
Tirage objet  s(1) F objet = 55.5066
0.34 micrometre
focale image paraxialle = 47.6788
Tirage image  s(27) F image = 66.2688
focale objet paraxialle = -47.6788
Tirage objet  s(1) F objet = 54.5947
0.38 micrometre
focale image paraxialle = 49.7082
Tirage image  s(27) F image = 70.1352
focale objet paraxialle = -49.7082
Tirage objet  s(1) F objet = 53.8897
0.42 micrometre
focale image paraxialle = 51.2218
Tirage image  s(27) F image = 73.0109
focale objet paraxialle = -51.2218
Tirage objet  s(1) F objet = 53.3489


Merci, a+


----------



## macErmite (26 Mars 2006)

Il m'arrive quelque chose de curieux  sur ces lignes de codes :

int nombre_surface = 27;
int nposition = 8;

int rAposition;
int eAposition;
int nAposition;

if ( nposition <= nombre_surface){

		rAposition = nposition-1;
		eAposition = nposition-2;
		nAposition = nposition+1;
}
if (nposition > nombre_surface+1){

		rAposition = nombre_surface;
		eAposition = nombre_surface-1;
		nAposition = nombre_surface+1;
}

int p=1;
		int cr = rAposition; *-->variable rAposition might not have been initialized*



			for	(int i = cr; i >= 1; i--)
				{
				rayonTravailConjugaison[p]=-rayonData_;
				surfaceTypeTravailConjugaison[p]=surfaceTypeData;
				p++;
				}	
p=1;

		int cn = nAposition; *--> variable nAposition might not have been initialized*


			for	(int i = cn; i >= 1; i--)
				{
				n_travailConjugaison[p] = n;
				matiereTravailConjugaison[p] = matiereData;
				p++;
				}	

p=1;	
		int ce = eAposition;*--> variable eAposition might not have been initialized*


			for(int i=ce;i>=0;i--)
				{
				espaceTravailConjugaison[p]=espaceData;
				p++;
				}


tout ce passe comme si les conditions attribuent aucune valeur pour rAposition, nAposition, eAposition.

Une idée sur la raison de ce problème ?    _


----------



## GrandGibus (26 Mars 2006)

macErmite a dit:
			
		

> Il m'arrive quelque chose de curieux  sur ces lignes de codes :
> 
> int nombre_surface = 27;
> int nposition = 8;
> ...



C'est tout à fait normal: rien ne garantit au compilateur que rAposition est initialisé... car rien ne garantit que tu passes dans l'une des deux conditions.

Remplace tes 2 if par un if / else... non seulement plus performant... mais surtout cela fera disparaître ton soucis :




			
				grandgibus a dit:
			
		

> ...
> if ( nposition <= nombre_surface){
> 
> rAposition = nposition-1;
> ...


----------



## macErmite (28 Mars 2006)

Avec la fonction *return* l'on peut renvoyer des valeurs numériques. Ce qui est très utile parfois. Mais comment peut-on renvoyer avec *return* les données d'un tableau ?


----------



## GrandGibus (28 Mars 2006)

il suffit de renvoyer le tableau (au lieu de ses données)... Un exemple :



> public int[] foo() {
> int[] retValue = new int[10];
> for (int i=0; i<reValue.length; i++) {
> retValue_ = i * i;
> ...


_

C'est pareil pour les objets... voire les tableaux d'objets (à noter que int n'est pas un objet, mais un type simple... contrairement à son homologue objet Integer )_


----------



## tatouille (28 Mars 2006)

```
public class GrafArr{

    private int mWidth ;
    private int mHeight ;
    private int mNumCol ;
    private int[] mValue ;
    private int mMinValue;
    private int mMaxValue ;
    private int i;

    public GrafArr() {
        this.mWidth = 5 ;
        this.mNumCol = 20 ;
        this.mHeight = 100;
        this.mMinValue = 0 ;
        this.mMaxValue = 512 ;
        //initialiser le tableau
        this.mValue= new int[mNumCol];
        
        for(i=0;i<mNumCol;i++){
            mValue[i] = 0 ;
        }
    }

    public void addValue(int theValue) {
        theValue = Math.max(theValue,mMinValue) ;
/*        theValue = Math.min(theValue,mMaxValue) ; */

        for(i=0;i<mNumCol-1;i++) {
            mValue[i] = this.mValue[i+1] ;
        }

        mValue[this.mNumCol-1] = theValue ;
    }

    public void drawGraph(Graphics g) {
        
        
        for(i=0;i<this.mNumCol;i++) {
            System.out.println(mValue[i]);
            
            int theHeight = Math.round((this.mValue[i]-this.mMinValue)*this.mHeight/this.mMaxValue) ;
            if (theHeight>0) {
                g.setColor(Color.red) ;
                g.fillRect(i*mWidth,50,mWidth,-theHeight) ;
            }
/*
            if (theHeight>0) {
                g.setColor(Color.orange) ;
                g.fillRect(i*mWidth,50,mWidth,theHeight) ;
            }
*/
        }
    }
}

public class GraficArrayRunner extends java.applet.Applet implements Runnable{
    
    private GrafArr graficarr;
    private Thread thread;
    Random rand;
    
    public void init() {
        graficarr = new GrafArr() ;
        thread = new Thread(this);
        thread.start();
        setBackground(Color.black) ;
    }
    
    public void paint (Graphics g) {
        super.paint(g);
        graficarr.addValue(rand.nextInt(200)) ;
        graficarr.drawGraph(g);
    }
    
    public void run(){
        while (true) {
            try{thread.sleep(1000);
                rand = new Random();
                repaint();
            }catch(InterruptedException e){
                System.out.println(e);
            }
        }
    }
    
}
```


----------



## macErmite (28 Mars 2006)

GrandGibus a dit:
			
		

> il suffit de renvoyer le tableau (au lieu de ses données)... Un exemple :
> 
> 
> 
> C'est pareil pour les objets... voire les tableaux d'objets (à noter que _int_ n'est pas un objet, mais un type simple... contrairement à son homologue objet _Integer[:i] )_


_


J'ai essayé cette forme, mais je n'arrive pas à définir la variable qui va recevoir les données du tableaux grace à return :rose:_


----------



## GrandGibus (28 Mars 2006)

Voici l'ajout de la méthode cliente:



> public int[] foo() {
> int[] retValue = new int[10];
> for (int i=0; i<retValue.length; i++) {
> retValue_ = i * i;_​_
> ...


----------



## macErmite (28 Mars 2006)

J'ai essayé cet exemple :

*public static void conjugaisonObjet*(double onde, double apositionObjet,int aposition){

(...)

double[] conteneurPositionImageInverse = Positions_des_images(aposition,apositionObjet);

(...)

}

*public static double Positions_des_images*(int aposition,double apositionObjet){

(...)
double 	positionImageInverse [] = new double [rAposition+1];
(...)
return 	positionImageInverse;
}

Xcode me retourne : incompatible types


----------



## tatouille (28 Mars 2006)

macErmite a dit:
			
		

> J'ai essayé cet exemple :
> 
> *public static void conjugaisonObjet*(double onde, double apositionObjet,int aposition){
> 
> ...


fais un peu attention a ce que tu fais

double     positionImageInverse [] = new double [rAposition+1];

-> regarde bien

int[] mValue ;
mValue= new int[10];

tu assignes double à double[]

tu confonds le type et l'adresse


----------



## macErmite (28 Mars 2006)

Comment corriger cet exemple, car là je ne comprends pas ou est l'erreur.


----------



## tatouille (28 Mars 2006)

double[] tab=new double[100]; // double     positionImageInverse [] 

la tu l'as la voie  elle va partir 

pour aller plus loin :

Double[] tab=new Double[100];
Double d=new Double(x);
tab_=d;

_double[] tab=new double[100];
 double d=new Double(x);
 tab_=d;_

_double__[] tab=new double[100];
  double d=x;
  tab=d.doubleValue();

!!!!!
il y a une difference entre double et Double pour Java < 5
les primitives ne sont pas des objets_


----------



## macErmite (28 Mars 2006)

Merci pour tout ces exemples possibles.

Ceci dit, appliqué à l'exemple cité ci-dessus cela donne quelle forme ?


----------



## tatouille (28 Mars 2006)

double     positionImageInverse [] = new double [rAposition+1];

double[] positionImageInverse = new double [rAposition+1];

alors la paf  le taquet


----------



## macErmite (28 Mars 2006)

tatouille a dit:
			
		

> double     positionImageInverse [] = new double [rAposition+1];
> 
> double[] positionImageInverse = new double [rAposition+1];
> 
> alors la paf  le taquet




Je croyais que les syntaxes suivantes étaient équivalentes :

    double positionImageInverse [] = new double [rAposition+1];
                              ou
    double []positionImageInverse = new double [rAposition+1];
                              ou
    double positionImageInverse [] ;
    positionImageInverse = new double [rAposition+1];
                              ou
    double  []positionImageInverse ;
    positionImageInverse = new double [rAposition+1];

non ?


----------



## tatouille (28 Mars 2006)

test et tu vas voir ce que te dis l'interpreteur


----------



## macErmite (28 Mars 2006)

Toutes ces versions ont fait l'objet d'une vérification, elles fonctionnent toutes sans aucun problème. Je pense que le soucis lié à la méthode *return* doit se situer ailleurs. Même si il s'agit bien de définir correctement soit les variables et ou soit les méthodes utilisées.

(Pour info, j'utilise la version 1.5)


----------



## tatouille (28 Mars 2006)

```
public static String[] splitString(String s)
{
    StringTokenizer tok = new StringTokenizer(s);
    Vector v = new Vector();
    String[] splitted;

    while(tok.hasMoreTokens())
        v.addElement(tok.nextToken());
    splitted = new String[v.size()];
    v.copyInto(splitted);
    
    return splitted;
}

public static double[] GetDoubleFromString(String s)
{
    String[] piece = splitString(s);
    double[] arr = new double[piece.length];

    for(int i = 0; i < arr.length; i++)
        arr[i] = (new Double(piece[i])).doubleValue();
    
    return arr;
}

public static int[] GetIntFromString(String s)
{
    String[] piece = splitString(s);
    int[] arr = new int[piece.length];

    for(int i = 0; i < arr.length; i++)
        arr[i] = Integer.parseInt(piece[i]);
    
    return arr;
}
```

il n' ya aucun probleme de type mais des erreurs


----------



## macErmite (29 Mars 2006)

En reprenant l'exemple d'origine, je me suis rendu compte qu'il y avait un oublie : les *[]*  

public static void conjugaisonObjet(double onde, double apositionObjet,int aposition){

(...)

double[] conteneurPositionImageInverse = Positions_des_images(aposition,apositionObjet);

(...)

}

public static double*[] *Positions_des_images(int aposition,double apositionObjet){

(...)
double positionImageInverse [] = new double [rAposition+1];
(...)
return positionImageInverse;
}

Maintenant cela fonctionne, je peux enfin allé me coucher :sleep:


----------

