De C++ au java

cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008 - 6 févr. 2008 à 09:22
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008 - 8 févr. 2008 à 09:35
bonjour:
merci pour la répnse de gouessej.
mais comme je travaille en java en reprenaant un projet fait en C++;
questions:
- comment convertir une chaine ASCII de type "-XXX.Y" en un SDWORD correspond au nombre obtenu fois 10,
c'est à dire:  la chaine "-123.4" retourne -1234,en gardant le signe?

il y avait dans mon projet cette ligne de coçde sans commentaire, et je ne comprennait ce qu'elle fait:
- status = (status<<4) + (stringx[0]-0x30);
avec;
 BYTE px;
 char stringx[2]="0\0";
 SDWORD status=0;
quelq'un peut me expliquer?
merci

19 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 févr. 2008 à 10:31
Salut,

il te suffit simplement de faire:
(si tu manip des float)
String myFloat = "-123.4";
float f = Float.parseFloat(myFloat);

(si tu manip des double)
String myDouble = "-123.4";

double d = Double.parseDouble(myDouble);

le portage d'un projet d'un langage vers un autre, ne veut pas forcément dire porter mot pour mot chaques lignes du code...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 11:40
salut Twinuts

merci pour ta réponse, je comprend ce que tu veux dire, mais je n'ai jamais repris un projet fait en C++.
mais comme même je t'envoie le contenu de la fonction; et je pense que je manipule des char.
et le SDWORD je l'utilise dans les classes filles pour décoder la chaines à envoyer des commandes pour mon générateur.

SDWORD ASCIIMult10ToSDWord(char *str)
{
SDWORD n=0;
BYTE i=0, neg=0;

//Convertie la partie avant le point en valeur entiere
while((str[i]!='.')&(str[i]!=0)) // Jusqu'a rencontrer '.' ou fin de chaine
{
//Si carac est un chiffre
if ((str[i]>='0')&(str[i]<='9'))
n = n*10 + (str[i]-'0');
//Si carac est le signe -
if (str[i]=='-')
neg=1;
i++;
}

i++; // pour passer le caractere '.'
n = n*10;
//Convertie le premier caractere après le point en valeur entiere
if ((str[i]>='0')&(str[i]<='9'))
{
n = n + (str[i]-'0');
}

//Tient compte du signe si necessaire
if (neg!=0)
n = -n;

return(n);
}

je suis désolée si j'ai tout mis, car j'arrive pas avancer mon projet en java, si je ne comprend ce qui était fait en C++

merci encore
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 févr. 2008 à 11:58
Salut,

je ne connais pas les différents types C/C++ sous windows (j'en connais certains mais n'aimant pas dev sur cet OS je n'ai pas approfondi plus que ça) donc le SDWORD ça me parle pas des masses...<gras></gras>

en java si tu veux passer une chaine vers un float ou un double cf mon poste ci-dessus... pour ce qui est des long et int :

String myLong = "-123";
long l = Long.parseLong(myLong);

String myInt = "-123";
int i = Integer.parseInt(myInt);

c'est aussi simple que ça donc si tu veux garder ta méthode il suffit de faire :
(je mets le type de retour au pif ne sachant pas ce que représente SDWORD)

public static double stringToDouble(String str) {
    if(str == null)
        throw new NullPointerException("La chaîne est null...");
    double d = 0.0;
    try {
        d = Double.parseDouble(str);
    } catch(NumberFormatException nfe) {
        // la chaîne n'est pas un entier
       nfe.printStackTrace();
    }
    return d;
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 12:14
salutTwinuts
merci encore pour ta réponse, je vais essayer avec ce que tu m'as montré

et je essayer de comprendre mieux les différentes fonctions qui sont déclarées dans l'ancien projet en C++
et si je comprend pas la ligne de code...j'envoie un message au forum.....

merci pour tout Twinuts
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
6 févr. 2008 à 13:29
Reprendre un programme C++ pour le traduire en Java n'est pas un
exercice très compliqué si c'est du C++ pur qui ne tire pas partie de
fonctionnalités de très bas niveau. Il faut surtout que tu fasses
attention aux différences de comportement dans la gestion du typage
quand tu utilises le polymorphisme.

Par
défaut, toute méthode de Java a le même comportement qu'une méthode
préfixée "virtual" en C++ sauf si elle est préfixée "final". Java
calcule le type à l'exécution par défaut alors que C++ calcule le type
à la compilation.

L'équivalent des classes virtuelles pures de
C++ sont les interfaces en Java et pour les classes virtuelles, ce sont
les classes abstraites.

Voici une sorte de récapitulatifs des différences entre les deux langages :
http://www.skytopia.com/project/articles/compsci/programming.html

Je vois que ton programme C++ n'était pas très portable déjà au niveau des types. Essaie de passer à des types ISO si tu veux passer ça dans un programme qui ferait la conversion.

Il existe des outils automatiques pour
traduire un programme C++ en Java : Jazillian et ceci :
tp://www.tangiblesoftwaresolutions.com/Product_Details/CPlusPlus_to_Java_Converter_Details.htm
http://www.experts-exchange.com/Programming/Languages/Java/Q_10214542.html
http://in.tech.yahoo.com/020513/94/1nxuw.html

Sinon, tu peux
te servir d'ANTLR avec les grammaires des langages respectifs pour
construire les arbres de syntaxe abstraites.

Une autre solution peut être de laisser le programme en C++ et de le faire communiquer avec un autre programme Java en utilisant JNI ou bien JNA mais si ton code n'est pas portable, le programme Java ne pourra pas marcher sur toutes les plateformes compatibles avec Java. Si ton code C++ est pour Windows, ça ne marchera ni sous Mac ni sous Linux.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 13:35
salut
j'ai une erreur variable Double
 
quand je met :
d = Double.parseDouble(str);
je na sais pas pourquoi, et dans ma librairiehelp dans java.lang.number:
je n'ai pas trouvé de type Double

merci
0
Utilisateur anonyme
6 févr. 2008 à 13:42
La classe Double se trouve dans le package java.lang, tu n'as pas à rajouter d'import pour ça. Attention, parseDouble renvoie un double, c'est-à-dire dans le type primitif.

Si tu as déclaré d ainsi :
Double d;
ça ne marche pas. Il faut déclarer plutôt comme ça :
double d;

Il se peut que tu aies une erreur ailleurs alors montre un plus gros bout de ton code si ça ne suffit pas. Donne nous le détail de ton erreur, le message d'erreur complet.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 13:52
salut
la fonction ( c'est celle queTwinuts m'a eenvoyée et expliquée)
 est comme suit:

public static double stringToDouble(String str)
 {
  if(str == null)
   throw new NullPointerException("La chaîne est null...");
  double d = 0.0;
     try
  {
         d = Double.parseDouble(str);
     }
  catch(NumberFormatException e)
  {
    
     }
     return d;
 }

merci pour les sites internets
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 févr. 2008 à 14:21
Salut,

@[auteur/GOUESSEJ/684669.aspx gouessej]
"Si tu as déclaré d ainsi :
Double d;
ça ne marche pas. Il faut déclarer plutôt comme ça :
double d;"

Faux, si tu utilises le jdk 1.5 ou plus tu as accès à l'autoboxing

@[auteur/DUNITH/1260620.aspx dunith]
Assure toi de bien utiliser le JDK de "SUN Microsystems" et non un autre...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 14:31
bonjour
j'éxagère, mais si je ne comprend pas comment  marche ce bout de code en C++, je ne peux pas avancer en java:
mais si queq'un peut m'expliquer ça en java, je vais avancer :
// TraitementDcampsRFPP : decodage de la trame DCAMPS gene RFPP
// Decode la trame Dcamps et stock les donnees dans un seule mot : prm1*1000 + prm2

void TraitementDcampsRFPP(char str1[30], BYTE nbparamretour, BYTE indxprm, char separator)
{
 BYTE px,index, cptParam;
 char stringx[10];
 SDWORD Dcamps=0;



 index=0;
 px=-1;



 // Pour les x parametres a lire
 for (cptParam=0; cptParam<nbparamretour; cptParam++)
 {
  index = index+px+1;
  // Recupere tous les caracteres jusqu'au separateur
  for(px=0;((str1[px+index]!=separator)&(px+index<strlen(str1)));px++)  //ligne 2
  {
   stringx[px]=str1[px+index];
  }
  stringx[px] = '\0';
  Dcamps = Dcamps*100 + atol(stringx)/10;



 } // fin for cptParam
 PLCWrite[indxprm]=Dcamps;



}//fin traitement trame retour

car j'ai essayer de faire:
void TraitementDcampsRFPP(char[30] str1, byte nbParamRetour, byte indxPrm, char Separator)
il met erreur expected] pour char[30] str1
mais si je déclarre str1 en String (String str1 au lieu un tableau de char), comment je vais stocker  index de ma chaine de caractère dans un tableau.
si je met la même chose dans la ligne2, et mon str1 est de type String:il met erreur:
 array required, but java.lang.String found

si quelq'un a une idée comme écrire cette fonction mais en java, j'avancerai.
je suis encore une fois, d'avoir exagéré, j'aimearai tellement avancer.

merci
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 15:06
bonjour

pour le tableau de string j'ai trouvé:
il existe la méthodes toCharArray(), qui retourne un tableau de char.
str1.toCharArray()[px+index]

ouff

mais, pour le cas de :
 d = Double.parseDouble(str);
j'ai bien déclaré:
double d.

et j'ai déclaré au départ de mon programme les bibliothèques suivantes:
import java.lang.*;
import java.util.*;
import hms_jtk.serial.*;

je vais encore cherché.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 févr. 2008 à 15:28
Salut,

- Pour tes imports tu peux oublier le "java.lang.*" qui est implicite...
- Pour le double je ne comprend pas pourquoi tu as une erreur... la seule possibilité que je vois est que tu n'utilises pas le JDK de SUN ? et encore même là je reste septique... c'est quand même un élément de base en java...
- Pour la méthode si tu veux du "mot pour mot" bête et méchant voici ce que ça donne en java :
byte traitementDcampsRFPP(char str1[], byte nbparamretour, byte indxprm, char separator) {
        byte px,index, cptParam;
        char [] stringx = new char[10];
        long dcamps = 0; //(visiblement SDWORD est un signed long)

        index = 0;
        px = -1;

        // Pour les x parametres a lire
        for (cptParam = 0; cptParam < nbparamretour; cptParam++) {
            index = (byte)(index + px + 1);
            // Recupere tous les caracteres jusqu'au separateur
            for(px = 0; ((str1[px + index] != separator) & (px + index < str1.length)); px++) { //ligne 2
                stringx[px] = str1[px + index];
            }
            stringx[px] = '\0';
            dcamps = dcamps * 100 + Long.parseLong(new String(stringx)) / 10;

        } // fin for cptParam
        PLCWrite[indxprm]=dcamps;//qui est PLCWrite ???

}//fin traitement trame retour

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Utilisateur anonyme
6 févr. 2008 à 16:08
Je ne suis pas sensé connaître la version de Java qu'elle utilise et l'autoboxing est une fonctionnalité assez piègeuse.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 16:09
salut

pour:
- d = Double.parseDouble(str); il voit l'erreur du Double (en rouge), pour lui  Double est une variable que je n'ai pas déclaré.

-  PLCWrite[indxprm]=dcamps;// correspond demande d'écriture dans mon automatePLC (c'est tout ce que j'ai trouvé)

dans l'ancien projet en C++, il n'y avait pas de commentaire pour chaque fonction et je n'ai même pas de la documentation pour savoir le format dela commande et les répondes de commandes. et ça c'est embêtant....

et merci encore une fois.
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 16:21
salut

j'ai le même problème, pour convertir mon string en long ( cette ligne de code):
Long.parseLong(new String(stringx));

il m'affiche la même erreur: variable Long

je crois ma bibliothèque ne voit pas ni Long, ni Double.....

je ne sais pas pourquoi

merci encore pour l'aide
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 févr. 2008 à 16:45
Salut,

simplement que tu ne dois pas utiliser le bon jdk....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
6 févr. 2008 à 17:03
salut
c'est normal qu'il y a ses erreurs car dans ma bibliothèque ne contient pas les types:
long et double

et pour mon sdword; je le déclare en Integer

et puis mon string je le convertit en Integer

merci pour vos réponses
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
8 févr. 2008 à 09:23
bonjour:

j'ai une autre question

Quelle est la syntaxe exacte pour affecter plusieurs valeurs dans un case en java ?
exeple en c:
case 2;4,5,6:
     // qui correspondent auxtraitement de retour RFPP
     TraitementRetourRFPP( reponse.sRep,Cmd.iNbCarOut , ' ');

mais en java; il met erreur: expected

merci
0
cs_dunith Messages postés 100 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 11 avril 2008
8 févr. 2008 à 09:35
bonjour

c'est encore  moi, après plusieurs test:

en fait: il faut faire:
case 2|4|5|6: au lieu de la ","

merci
0
Rejoignez-nous