Portée d'une variable / Java

macErmite

Membre confirmé
23 Décembre 2005
94
0
51
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
 
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] ...
 
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[]) {

int a=10;
toto=new double[10];
cerise();
System.out.println("toto[0] a comme valeur"+toto[0]);
}

public static void cerise() {
toto[0] = cerisier;
// pourquoi renvoyer quelque chose ?
// j'ai laissé en static meme si je n'en vois pas l'intérêt (mais je n'ai pas tout le code donc il se peut que cela soit nécessaire).

}

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

}
 
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;
}
 
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).
 
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é :rolleyes:

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
 
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 (.) :siffle:
(je prefere un point :rose: )
 
Le séparateur "," ou "." est choisit en fonction de la "Local". Mais tu peux effectivement le préciser.
 
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+
 
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 ? :confused:
 
macErmite a dit:
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

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;
eAposition = nposition-2;
nAposition = nposition+1;

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

...
 
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 ?
 
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;
}
return retValue;
}



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 ;))
 
Bloc de code:
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);
            }
        }
    }
    
}
 
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:
 
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;

}
return retValue;

}

public void fooClient() {
int[] clientValue = foo();
for (int i=0; i< clientValue.length; i++) {
System.out.println("n°" + i +" = " + clientValue);

}

}
 
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 :confused: :confused: