cs_dunith
Messages postés100Date d'inscriptionsamedi 5 janvier 2008StatutMembreDernière intervention11 avril 2008
-
6 févr. 2008 à 09:22
cs_dunith
Messages postés100Date d'inscriptionsamedi 5 janvier 2008StatutMembreDernière intervention11 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
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.
//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++
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 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 ..."
cs_dunith
Messages postés100Date d'inscriptionsamedi 5 janvier 2008StatutMembreDernière intervention11 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.....
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.
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.
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.
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.
cs_dunith
Messages postés100Date d'inscriptionsamedi 5 janvier 2008StatutMembreDernière intervention11 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
// 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.
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 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 ..."
cs_dunith
Messages postés100Date d'inscriptionsamedi 5 janvier 2008StatutMembreDernière intervention11 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....
cs_dunith
Messages postés100Date d'inscriptionsamedi 5 janvier 2008StatutMembreDernière intervention11 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 , ' ');