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
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.
Ulkomuistista yli vuosikymmenen takaa:
Text2.Text = Format(muuttuja/60)
Text2.Refresh
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
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
Tuon virheilmoituksen perusteella tietotyyppi on väärä. Voisi olla että "muuttuja" on tyypiltään merkkijono.
Voisit kokeilla laittaa :
txt.Text = val(muuttuja)/60
Jee se toimii. Kiitos!
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; }
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
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..
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
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.
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.
Rupesi toimimaan hienosti, kun muutin muuttujatyypit Doubleksi. Kiitos
Nyt mulla on desimaaleja ihan liikaa tuossa laskun muunnoksessa, miten järkevintä sieventää 3 desimaalin tarkkuuteen?
Pyöristykseen sopii esim. Round, jolle voi antaa luvun ja desimaalien määrän.
Aihe on jo aika vanha, joten et voi enää vastata siihen.