Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Muuttuvan muuttujan jakolasku tekstikenttään

Sivun loppuun

juffe [24.05.2019 23:13:33]

#

Moi.

Nyt on käynyt niin että en ole yli 10 vuoteen ohjelmointia juuri harrastanut.
Kaivoin vanhan kunnon vb6:n naftaliinista ja sillä jotain yritän räpeltää.

Eli mulla tulee comportista 5kertaa sekunnissa vaihtuva luku muuttujaan.
Tämä luku pitäisi saada reaaliajassa jaettua 60:llä

Ei vaan toimi ainakaan näin:

Text2.Text = muuttuja / 60

Eikö tuo ehdi sitten sitä jakaa reaaliajassa, kun tekstiruutu pysyy tyhjänä eikä virheilmoituksia tule? Muuttuja sisältää esim. luvun 4.15

Metabolix [24.05.2019 23:21:03]

#

Onko tuo rivi ollenkaan oikeassa paikassa? Rivin pitäisi olla siinä, missä myös muuttujan arvo muuttuu. Jos laitat tuon vaikka ohjelman alkuun, tekstilaatikko ei ikinä päivity.

AimoKulaus [25.05.2019 07:06:27]

#

Ulkomuistista yli vuosikymmenen takaa:

Text2.Text = Format(muuttuja/60)
Text2.Refresh

Grez [25.05.2019 09:53:18]

#

Ei tolla text2.refreshillä ole mitään väliä (ellei sitten ohjelma ole aivan pöljästi tehty ja pyöri ikuisessa loopissa). Kyllä se VB6 sen päivittää heti kun vaan työn ala olevien eventtien suorittaminen on valmis.

Oikea tapa, kuten Metabolix sanoikin on asettaa se sinne comin receive -eventiin.

Eli tyyliin (funktion nimet, parametrit ja sisältö on viitteelliset)

Sub Com_Datareceived(data as jotain)
   muuttuja = jotain koodia
   Text2.Text = muuttuja / 60
End Sub

juffe [25.05.2019 12:58:17]

#

Kiitoksia vastauksista, mutta ei vaan toimi.
Vaikka tämän laittaisi napin taakse näin:

Private Sub nappi_Click()
                txt.Text = muuttuja

End Sub

Niin txt.Text ruutuun tulee luku 4.2194503

Mutta jos muutan sen muotoon:

Private Sub nappi_Click()
                txt.Text = muuttuja / 60

End Sub

niin antaa virheilmoituksen Runtime error 13 type mismatch

Tosiaan tuo data ei tule ihan suoraan comportista, vaan sitä parsetetaan välissä silmukassa ja viedään muuttujaan tuo 5kertaa sek vaihtuva arvo

Grez [25.05.2019 13:03:47]

#

Tuon virheilmoituksen perusteella tietotyyppi on väärä. Voisi olla että "muuttuja" on tyypiltään merkkijono.

Voisit kokeilla laittaa :

txt.Text = val(muuttuja)/60

juffe [25.05.2019 13:21:54]

#

Jee se toimii. Kiitos!

juffe [25.05.2019 19:35:32]

#

Tää mun ohjelmahan lukee gps:ltä gga koordinaatteja ja tarkoitus olisi ne muuntaa helpommin ymmärrettävään UTM muotoon.

Löysin valmiin php scriptin http://www.loukko.net/koord_proj/
joka alla. Tuli vain tuossa käännöksessä heti ongelmaksi ymmärtää mitä tuossa tapahtuu. Heti toisessa rivissä on (1 + (pow($n, 2)/4) niin mikä ihme tuo ",2" on?

Noh tää mun koodaustaito on mitä on, niin voisiko joku koittaa suomentaa, jotta saisin sen käännettyä VB6 kielelle?

function koordGT($lev_aste, $pit_aste) {

	// Vakiot
	$f = 1 / 298.257222101;				// Ellipsoidin litistyssuhde
	$a = 6378137;									// Isoakselin puolikas
	$lambda_nolla = 0.471238898;	// Keskimeridiaani (rad), 27 astetta
	$k_nolla = 0.9996;						// Mittakaavakerroin
	$E_nolla = 500000;						// Itäkoordinaatti

	// Kaavat

	// Muunnetaan astemuotoisesta radiaaneiksi
	$fii = deg2rad($lev_aste);
	$lambda = deg2rad($pit_aste);

	$n = $f / (2-$f);
	$A1 = ($a/(1+$n)) * (1 + (pow($n, 2)/4) + (pow($n, 4)/64));
	$e_toiseen = (2 * $f) - pow($f, 2);
	$e_pilkku_toiseen = $e_toiseen / (1 - $e_toiseen);
	$h1_pilkku = (1/2)*$n - (2/3)*pow($n, 2) + (5/16)*pow($n, 3) + (41/180)*pow($n, 4);
	$h2_pilkku = (13/48)*pow($n, 2) - (3/5)*pow($n, 3) + (557/1440)*pow($n, 4);
	$h3_pilkku =(61/240)*pow($n, 3) - (103/140)*pow($n, 4);
	$h4_pilkku = (49561/161280)*pow($n, 4);
	$Q_pilkku = asinh( tan($fii));
	$Q_2pilkku = atanh(sqrt($e_toiseen) * sin($fii));
	$Q = $Q_pilkku - sqrt($e_toiseen) * $Q_2pilkku;
	$l = $lambda - $lambda_nolla;
	$beeta = atan(sinh($Q));
	$eeta_pilkku = atanh(cos($beeta) * sin($l));
	$zeeta_pilkku = asin(sin($beeta)/(1/cosh($eeta_pilkku)));
	$zeeta1 = $h1_pilkku * sin( 2 * $zeeta_pilkku) * cosh( 2 * $eeta_pilkku);
	$zeeta2 = $h2_pilkku * sin( 4 * $zeeta_pilkku) * cosh( 4 * $eeta_pilkku);
	$zeeta3 = $h3_pilkku * sin( 6 * $zeeta_pilkku) * cosh( 6 * $eeta_pilkku);
	$zeeta4 = $h4_pilkku * sin( 8 * $zeeta_pilkku) * cosh( 8 * $eeta_pilkku);
	$eeta1 = $h1_pilkku * cos( 2 * $zeeta_pilkku) * sinh( 2 * $eeta_pilkku);
	$eeta2 = $h2_pilkku * cos( 4 * $zeeta_pilkku) * sinh( 4 * $eeta_pilkku);
	$eeta3 = $h3_pilkku * cos( 6 * $zeeta_pilkku) * sinh( 6 * $eeta_pilkku);
	$eeta4 = $h4_pilkku * cos( 8 * $zeeta_pilkku) * sinh( 8 * $eeta_pilkku);
	$zeeta = $zeeta_pilkku + $zeeta1 + $zeeta2 + $zeeta3 + $zeeta4;
	$eeta = $eeta_pilkku + $eeta1 + $eeta2 + $eeta3 + $eeta4;

	// Tulos tasokoordinaatteina
	$N = $A1 * $zeeta * $k_nolla;
	$E = $A1 * $eeta * $k_nolla + $E_nolla;

	$array = array ('N' => $N, 'E' => $E);
	return $array;
}

Grez [25.05.2019 22:34:53]

#

No ihan jos klikkaat tuosta liittämästäsi koodista jotain pow-funktiota, niin päädyt dokumentaatiosivulle https://www.php.net/pow, jossa kerrotaan sen olevan potenssifunktio.

Eli pow($n,2) on $n^2 eli $n*$n

juffe [25.05.2019 23:23:00]

#

Oi. Kiitos. Tarkastelin tätä koodia notepadillä, niin ei linkit auennut:) pow funktiota kyllä googlettelin, mutta ymmärrys ei riittänyt miten sitä php:lla käytetään. Yksinkertaista matematiikkaa siis..

juffe [26.05.2019 18:43:58]

#

Moi
Nyt sain tuon suurinpiirtein tehtyä. Tulee valitus runtime error 5 Invalid procedure call or argument. Valittaa tuosta Q_2pilkku rivistä. Mulla on tuo atanh funktiona. Mikähän mättää?

Public Function Atanh(ByVal Value As Double) As Double
    Atanh = Log((1 + Value) / (1 - Value)) / 2
End Function

koodi alla:

Dim f As String
Dim a As String
Dim lambda_nolla As String
Dim k_nolla As String
Dim E_nolla As String
Dim fii As String
Dim lambda As String
Dim lev_aste As String
Dim pit_aste As String
Dim N As String
Dim A1 As String
Dim e_toiseen As String
Dim e_pilkku_toiseen As String
Dim h1_pilkku As String
Dim h2_pilkku As String
Dim h3_pilkku As String
Dim h4_pilkku As String
Dim Q_pilkku As String
Dim Q_2pilkku As String
Dim Q As String
Dim l As String
Dim beeta As String
Dim eeta_pilkku As String
Dim zeeta_pilkku As String
Dim zeeta1 As String
Dim zeeta2 As String
Dim zeeta3 As String
Dim zeeta4 As String
Dim eeta1 As String
Dim eeta2 As String
Dim eeta3 As String
Dim eeta4 As String
Dim zeeta As String
Dim eeta As String

Dim NN As String
Dim EE As String


f = 1 / 298.257222101
a = 6378137
lambda_nolla = 0.471238898
k_nolla = 0.9996
E_nolla = 500000

fii = Val(LatDD) * 3.14159265 / 180
lambda = Val(LonDD) * 3.14159265 / 180

N = Val(f) / (2 - Val(f))

A1 = (Val(a) / (1 + Val(N))) * (1 + (Val(N) * Val(N)) / 4) + (Val(N) * (Val(N) * Val(N) * Val(N)) / 64)
e_toiseen = (2 * Val(f)) - (Val(f) * (Val(f)))
e_pilkku_toiseen = Val(e_toiseen) / (1 - Val(e_toiseen))
h1_pilkku = (1 / 2) * Val(N) - (2 / 3) * (Val(N) * Val(N)) + (5 / 16) * (Val(N) * Val(N) * Val(N)) + (41 / 180) * (Val(N) * Val(N) * Val(N) * Val(N))
h2_pilkku = (13 / 48) * (Val(N) * Val(N)) - (3 / 5) * (Val(N) * Val(N) * Val(N)) + (41 / 180) * (Val(N) * Val(N) * Val(N) * Val(N))
h3_pilkku = (61 / 240) * (Val(N) * Val(N) * Val(N)) - (103 / 140) * (Val(N) * Val(N) * Val(N) * Val(N))
h4_pilkku = (49561 / 161280) * (Val(N) * Val(N) * Val(N) * Val(N))
Q_pilkku = ASinH(Tan(Val(fii)))
Q_2pilkku = Atanh(Sqr(Val(e_toiseen)) * Sin(Val(fii)))
Q = Q_pilkku - Sqr(Val(e_toiseen)) * Val(Q_2pilkku)
l = Val(lambda) - Val(lambda_nolla)
beeta = Atn(SinH(Val(Q)))
eeta_pilkku = Atanh(Cos(Val(beeta)) * Sin(Val(l)))
zeeta_pilkku = Asin(Sin(Val(beeta)) / (1 / CosH(Val(eeta_pilkku))))
zeeta1 = Val(h1_pilkku) * Sin(2 * Val(zeeta_pilkku)) * CosH(2 * Val(eeta_pilkku))
zeeta2 = Val(h2_pilkku) * Sin(4 * Val(zeeta_pilkku)) * CosH(4 * Val(eeta_pilkku))
zeeta3 = Val(h3_pilkku) * Sin(6 * Val(zeeta_pilkku)) * CosH(6 * Val(eeta_pilkku))
zeeta4 = Val(h4_pilkku) * Sin(8 * Val(zeeta_pilkku)) * CosH(8 * Val(eeta_pilkku))
eeta1 = Val(h1_pilkku) * Cos(2 * Val(zeeta_pilkku)) * SinH(2 * Val(eeta_pilkku))
eeta2 = Val(h2_pilkku) * Cos(4 * Val(zeeta_pilkku)) * SinH(4 * Val(eeta_pilkku))
eeta3 = Val(h3_pilkku) * Cos(6 * Val(zeeta_pilkku)) * SinH(6 * Val(eeta_pilkku))
eeta4 = Val(h4_pilkku) * Cos(8 * Val(zeeta_pilkku)) * SinH(8 * Val(eeta_pilkku))
zeeta = Val(zeeta_pilkku) + Val(zeeta1) + Val(zeeta2) + Val(zeeta3) + Val(zeeta4)
eeta = Val(eeta_pilkku) + Val(eeta1) + Val(eeta2) + Val(eeta3) + Val(eeta4)

NN = Val(A1) * Val(zeeta) * Val(k_nolla)
EE = Val(A1) * Val(eeta) * Val(k_nolla) + Val(E_nolla)

Text5.Text = NN

Metabolix [26.05.2019 18:57:49]

#

En nyt heti näe, mikä mättää, mutta ainakin koodista saisi paremmin selvää, jos muuttujat olisivat Double-tyyppisiä eikä olisi ollenkaan Val-funktion käyttöä. Mahdollisesti ongelma ratkeaakin jo tällä. Muuten kannattaa esimerkiksi tulostaa kyseisellä rivillä esiintyvät luvut (vaikka jollain message boxilla), ja jos joukossa on 0 tai INF tai NAN tai muuta vastaavaa kummallista, pitää jatkaa selvittelyjä vastaavasti sieltä, missä kyseinen luku lasketaan.

jalski [26.05.2019 19:21:41]

#

Metabolix kirjoitti:

En nyt heti näe, mikä mättää, mutta ainakin koodista saisi paremmin selvää, jos muuttujat olisivat Double-tyyppisiä eikä olisi ollenkaan Val-funktion käyttöä.

Samaa mieltä, numerot ja merkkijonot erilleen laskentaa tehtäessä. Vaikka käytetty ohjelmointikieli osaisikin tarvittaessa muuntaa merkkijonon luvuksi, niin lopputulos on helposti vähintään 10x hitaampi.

En tiedä miten VB6 käyttäytyy, mutta nopealla vilkaisulla ainakin Q_pilkku merkkijono muuttujaan tallennetaan double ja myöhemmin käytetään sitä suoraan lukuna.

juffe [26.05.2019 20:29:50]

#

Rupesi toimimaan hienosti, kun muutin muuttujatyypit Doubleksi. Kiitos

Nyt mulla on desimaaleja ihan liikaa tuossa laskun muunnoksessa, miten järkevintä sieventää 3 desimaalin tarkkuuteen?

Metabolix [26.05.2019 20:34:39]

#

Pyöristykseen sopii esim. Round, jolle voi antaa luvun ja desimaalien määrän.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta