JS to Xojo

Ciao a tutti,
sto cercando di convertire una semplice (almeno sembra tale) funzione Javascript per utilizzarla in un programmino che sto scrivendo.

La funzione JS la seguente:

VAR lon = 10.885321;
VAR lat = 44.771835;
VAR pos1, pos2;
pos1 = Math.floor((lon % 2) * 12);
pos2= Math.floor((lat % 2) * 24);

L’ho tradotta cos in Xojo:

Dim lon as Double = 10.885321
Dim lat as Double = 44.771835
Dim pos1, pos2 as integer
pos1 = Floor((lon Mod 2) * 12) + 1
pos2 = Floor((lat Mod 1) * 24) + 1

Il valore che ottengo in pos1 e pos2 completamente diverso.
Qualcuno sa dirmi dove sbaglio?

http://developer.xojo.com/mod

The Mod operator divides number1 by number2 and returns the remainder as the result.
The remainder (as an Integer) of number1 divided by number2.
Javascript % returns double

Google translate:

L’operatore di Mod divide il numero1 per numero2 e restituisce il resto come risultato.
Il resto (come integer) del numero1 diviso per numero2.
Javascript% restituisce il doppio

Hello Julian,
thank you for help, but I’m not pretty sure this is the (only) reason.
Both pieces of code apparently return an integer, but is completely different:

Javascript:
pos1 = 10
pos2 = 21

Xojo:
pos1 = 1
pos2 = 1

My target is to obtain the same result in Xojo, but I really don’t know how.

Any help to clarify this issue will be appreciated.

Ciao Marco,

come ha sottolineato Julian mod restituisce il resto intero della divisione. Quello che utilizzi il resto decimale che puoi ottenere con questa funzione:

Public Function restoDecimale(extends numero as Double, divisore as Double) as Double dim d as Double=numero/divisore Dim n As Double=if(d<0, Ceil(d), Floor(d)) Return numero-n*divisore End Function

Quindi il tuo codice diventa:

[code]Dim lon As Double = 10.885321
Dim lat As Double = 44.771835

Dim pos1 As Double=Floor(lon.restoDecimale(2)*12)
Dim pos2 As Double=Floor(lat.restoDecimale(2)*24)[/code]

La cosa comincia ad essermi più chiara.
Antonio sto provando a richiamare la tua funzione ma ottengo un laconico:

[code]Type “Double” has no member named “restoDecimale”
Dim pos1 As Double = Floor(lon.restoDecimale(2)*12)

Type “Double” has no member named “restoDecimale”
Dim pos2 As Double = Floor(lat.restoDecimale(2)*24)

Window1.restoDecimale Declaration
The extends modifier cannot be used on a class method
Function restoDecimale(extends numero as Double, divisore as Double) As Double
[/code]

Ammetto di non avere molta pratica con le funzioni matematiche. Mi sto perdendo in un bicchier d’acqua?

tutte le funzioni il cui primo argomento inizia con extends devono essere posizionate in un modulo (pubbliche) in modo da poter estendere il linguaggio, e come dice il compilatore non possono essere utilizzate come metodo di una classe.

Non credo ci siano molte altri modi per testare questo codice, eppure ottengo solo gli errori che ho riportato.

Qui il progettino:
http://cremaschi.net/download/LATLON.xojo_binary_project

Marco, come ti ho detto devi creare un modulo e mettere il metodo restoDecimale nel modulo.
Le “estensioni”, ovvero quando il primo parametro extends, servono appunto per estendere i vari tipi (o classi) in modo da poter utilizzare la chiamata (un po’ come quando scrivi myArray.ubound o mystring.len o myInteger.toText)

In ogni caso puoi anche utilizzare il metodo in modalit non estensione (ovvero come lo stai utilizzando tu) semplicemente cambiando l’intestazione da

extends numero as Double, divisore as Double

a

numero as Double, divisore as Double

e quando la utilizzi invece di:

lon.restoDecimale(2)

devi scrivere

restoDecimale(lon, 2)

Ti avevo proposto l’estensione perch cos avevi un metodo per il numero double sempre disponibile in qualsiasi finestra/metodo e non legata alla singola finestra. Appunto una estensione del tipo double.

Antonio ti chiedo pubblicamente scusa.
Sono talmente decotto da aver confuso la tua precisazione “modulo” con “metodo”, e come hai visto insistevo pure!
Qualche giorno di ferie forse sar di aiuto :slight_smile:

Tornando nel merito, il calcolo funziona.
A dire il vero il risultato non esattamente quello che dovrebbe, ma siamo vicinissimi. Quella porzione di codice infatti estrapolata da un contesto pi ampio che avevo temporaneamente accantonato per concentrarmi su di essa, e che probabilmente devo perfezionare.

Grazie infinite.