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

Langage Java Discussion :

comment modifier le type d'une donnée


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut comment modifier le type d'une donnée
    Bonjour,
    Je suis en train de convertir du code VBA and code Java et je me retrouve avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub produce()
        Dim data() As Double
        Call read_file(data)
        Call create(data)
    End Sub
    Sub read_file(ByRef data() As Double)
        //toto et titi sont calculés dynamiquement ici
        ReDim data(1 To toto, 1 To titi)
        //Remplisage de data
    End Sub
    Sub create(ByRef data() As Double)
    ...
    End Sub
    Comment, en Java, je dois déclarer mon tableau de double "data" dans la méthode produce ?
    Comment déclarer "data" dans la méthode read_file pour le retrouver transformer ensuite pour le passer à la méthode create ?
    Comment changer le type/faire le ReDim dans la méthode read_file?
    Merci pour vorte aide car je reviens vers Java après plus de 10 ans d'interruption...

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pour déclarer un tableau de double, tout simplement double[] data;. A ce que je comprends de ce que fait read_file, c'est que c'est cette "procédure" qui détermine la taille du tableau : on ne peut donc pas passer le tableau en paramètre de la méthode Java équivalente. Il suffit simplement que cette méthode retourne le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public double[] readFile() {
    }
    Je ne comprends pas la syntaxe ReDim data(1 To toto, 1 To titi) : pourquoi 2 valeurs ? à quoi correspondent-elles ? En Java, on dimensionne un tableau simplement par new double[ lataille ]. A voir, en revanche, si un tableau est la structure la plus adéquate pour représenter les données à lire.

    Tu parles par contre de changer le type. Le type de quoi ? En Java, on ne change pas le type d'une variable, mais on peut le rendre paramétrable, mais le traitement peut être plus ou moins complexe selon ce qu'on veut faire.

    A mon avis, il te sera plus simple d'établir l'algorithme (ce que fait le programme avec tes mots à toi), puis de l'encoder en Java, plutôt que de chercher à "traduire" du VBA en Java.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Merci pour le retour.
    Quand je parle de changer le type c'est de passer d'un tableau à 1 dimension à un tableau à 2 dimension ("ReDim" ReDimensionne data).
    Les 2 valeurs toto et titi représentent la taille de chacune des dimensions de data.
    En fait, je me suis rendu compte qu'on sait qu'il y aura tout le temps 2 dimensions, la taille n'est par contre pas définie avant d'entrer dans read_file.
    J'ai donc besoin de passer data par référence à la méthode read_file (plutôt que de faire un return de mon tableau), cela afin qu'une fois sorti de read_file et de l'appel à create, j'ai bien data avec les bonnes dimensions et le bon contenu.
    J'ai progressé un peu et je me retrouve maintenant avec le code Java suivant :
    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
    void produce() {
        Double[][] data = null;
        read_file(data);
        //PROBLEME 2
        create(data);
    }
    void readFile(Double[][] data) {
        //Définition de toto et titi
        data = new Double[toto][titi];//PROBLEME 1
        boucle...//remplissage de data
            data[3][4] = 5;
    }
    void create(Double[][] data) {
        //Utilisation de data[3][4]
    }
    J'ai encore 2 problèmes cependant : à la ligne PROBLEME 1, mon tableau data semble n'avoir que la 1ère dimension d'initialisée. En effet si toto vaut 100000 et titi 59, si je regarde data[10][3] en mode debug, ça indique "<error(s)_during_the_evaluation>".
    à la ligne PROBLEME 2, mon tableau data vaut null et à donc perdu l'initialisation et le remplissage fait dans readFile, je dois pouvoir passer data par référence afin de le récupéré tel que modifié.
    D'avance merci encore.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il n'y a pas de passage par référence en Java, mais seulement par valeur. Si tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public static void main(String[] args) {
     
    		int[] array = new int[3];
     
    		changeTaille(array);
    		System.out.println(array.length);
     
    	}
     
    	private static void changeTaille(int[] array) {
    		array = new int[4];
    	}
    Ce programme affiche 3, pas 4 : parce que la référence du tableau de dimension 4 créé dans changeTaille est bien mis dans la variable array de la méthode, mais cette valeur n'est pas remontée dans l'appel : la variable array dans main continue de "pointer" sur le tableau de dimension 3.
    C'est exactement pour cette raison que lorsque tu appelles create(), la variable data vaut null, car tu lui a affecter cette valeur, et c'est donc cette valeur qu'elle a.

    Tu est obligé d'écrire :

    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
    void produce() {
        Double[][] data =  read_file();
        //PROBLEME 2
        create(data);
    }
    Double[][] readFile() {
        //Définition de toto et titi
       Double[][] data = new Double[toto][titi]; 
        boucle...//remplissage de data
            data[3][4] = 5;
         return data;
    }
    void create(Double[][] data) {
        //Utilisation de data[3][4]
    }
    Lorsque tu écris Double[][] data = new Double[toto][titi]; tu instancies un tableau de toto * titi élement(s), qui valent tous null. Le débogueur devrait afficher ça : s'il n'arrive pas à évaluer, c'est que soit il y a un autre problème qui empêche le débogueur de faire l'évaluation (ça arrive parfois dans des programmes plus complexe), soit que tu regardes la variable data de ta méthode produce() qui est null, d'où le fait qu'on ne puisse pas évaluer data[10][3] qui n'existe pas (le tableau n'existe même pas).

    PS : pourquoi un tableau de Double, et pas de double ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Vraiment??..... pas de passage en référence possible, mince alors... comment faire si je dois récupérer plusieurs objets du coup? Je dois créer un objet contenant tous les objets que je vais modifier et le remplir et en faire un return?
    Pas da raison particulière en effet de mettre Double, j'ai modifié en double. Le PROBLEME 1 était une grossière erreur de ma part, c'et bien bon. Le PROBLEME 2 doit se résoudre si je passe par un return effectivement, mais j'aurais voulu éviter ça..

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jmclej Voir le message
    Vraiment??..... pas de passage en référence possible, mince alors... comment faire si je dois récupérer plusieurs objets du coup? Je dois créer un objet contenant tous les objets que je vais modifier et le remplir et en faire un return?
    Par exemple, oui. Cependant, il est normalement rare d'avoir à faire ça, car ça signifie la plupart du temps qu'il y a un problème d'architecture. Une méthode doit retourner une seule donnée cohérente, soit éventuellement une collection de données cohérentes (à la limite un tableau, mais je préfère éviter les tableaux lorsqu'il ne s'agit pas de données statiques, ou de "matrice" ou "raster"). Une méthode qui renvoie l'age du capitaine et le temps qu'il fera demain devrait être divisée en 2 méthodes.
    Tu me citeras peut-être des exemples comme retourner des coordonnées de point (donc (x, y) ou (x,y,z), ou (x,y,z,t)...), mais pour ça, il est tout à fait cohérent en POO d'avoir une classe Point (déclinée en Point2D, Point3D, etc.) et çà évite de retourner 2 doubles, qu'on peut utiliser de manière indépendante et incohérente.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/12/2014, 14h03
  2. Réponses: 3
    Dernier message: 09/02/2011, 15h40
  3. Réponses: 5
    Dernier message: 24/03/2008, 19h49
  4. comment je peut savoir le type d'une donnée
    Par eng_dev dans le forum C++
    Réponses: 2
    Dernier message: 09/06/2007, 11h16
  5. comment modifier le type d'une table?
    Par patchouli dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/01/2007, 10h49

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