Προς το περιεχόμενο

Microsoft Visual Basic .Net


Perris

Προτεινόμενες αναρτήσεις

Δημοσ.

Ρε παιδιά μπας και έχει τίποτα περίεργο αυτή η γλώσσα;;

Μάγια του χω κάνει και δε μου βγάζει σωστό αποτέλεσμα;;

Ίδιος ακριβώς κώδικας σε Matlab και τρέχει μια χαρα και εδώ μου βγάζει... τρίχες..

Έχω τα εξής μέσα σε ένα for..next:

 

1. xold(i) = z(i) / ((1 - psi) + psi * k(i))

2. yold(i) = k(i) * xold(i)

3. x = ...

 

Τρέχω λοιπόν το πρόγραμμα και βάζω να κάνει break στη γραμμή 2 και στη γραμμή 3 για να δω τα αποτελέσματα. Κάνει break στη 2η γραμμή, κοιτάω τα αποτελέσματα και είναι σωστά (το xold έχει πάρει τις σωστές τιμές και το yold έχει κάτι παλιές..). Πατάω continue και κάνει break στην 3η γραμμή και εκεί γίνεται χαμός! Μου αλλάζει -και- το xold και βάζει στη θέση του την τιμή του yold!! Στο yold εμφανίζει τη σωστή τιμή! Γιατί μου αλλάζει και το xold;;;;;

 

PS: Οι μεταβλητές όλες είναι δηλωμένες ως public arrays.

Δημοσ.

γεια σου.

 

δώσε λίγο περισσότερο κώδικα από το πρόγραμμα σου αν σου είναι εύκολο, για να το δω στην πράξη να καταλάβω τι κάνεις

Δημοσ.

Τα z,x,y είναι public arrays 4x1. Το z το δηλώνω σε άλλη subroutine. Τα x,y τα ψάχνω από αυτή τη ρουτίνα:

 

Public Sub SRK()

 

Dim MB(4), Tc(4), Pc(4), zc(4), ww(4) As Double

Dim Tr(4), Pr(4), m(4), aa(4), A1(4), B1(4), Alfa(4, 4) As Double

Dim F_V(4), F_L(4), A_V, A_L, B_V, B_L, Z_V, Z_L, Z_V_old, Z_L_old As Double

Dim ff, df, psi_old As Double

Dim i, j As Integer

 

MB(1) = 78.114 : MB(2) = 2.016 : MB(3) = 84.161 : MB(4) = 86.177

Tc(1) = 562.16 : Tc(2) = 33.19 : Tc(3) = 553.58 : Tc(4) = 507.6

Pc(1) = 4.88 * 10 ^ 6 : Pc(2) = 1.32 * 10 ^ 6 : Pc(3) = 4.1 * 10 ^ 6 : Pc(4) = 3.04 * 10 ^ 6

zc(1) = 0.273 : zc(2) = 0.307 : zc(3) = 0.274 : zc(4) = 0.269

ww(1) = 0.209 : ww(2) = 0.215 : ww(3) = 0.212 : ww(4) = 0.304

 

xold = z

yold = z

 

For i = 1 To 4

Tr(i) = T / Tc(i)

Pr(i) = P / Pc(i)

m(i) = 0.48508 + 1.55171 * ww(i) - 0.15613 * ww(i) ^ 2

aa(i) = (1 + m(i) * (1 - Tr(i) ^ 0.5)) ^ 2

A1(i) = 0.42748 * aa(i) * Pr(i) / Tr(i) ^ 2

B1(i) = 0.08664 * Pr(i) / Tr(i)

Next

 

For i = 1 To 4

For j = 1 To 4

Alfa(i, j) = (A1(i) * A1(j)) ^ 0.5

Next

Next

 

'Arxikes times (mono gia xrhsh sto while..end thn 1h fora)

F_V(1) = 1 : F_V(2) = 1 : F_V(3) = 1 : F_V(4) = 1

F_L(1) = 0 : F_L(2) = 0 : F_L(3) = 0 : F_L(4) = 0

 

While Math.Abs(F_V(1) - F_L(1)) > 0.001 Or Math.Abs(F_V(2) - F_L(2)) > 0.001 Or Math.Abs(F_V(3) - F_L(3)) > 0.001 Or Math.Abs(F_V(4) - F_L(4)) > 0.001

 

A_V = 0 : A_L = 0

For i = 1 To 4

For j = 1 To 4

A_V = A_V + yold(i) * yold(j) * Alfa(i, j)

A_L = A_L + xold(i) * xold(j) * Alfa(i, j)

Next

Next

 

B_V = 0 : B_L = 0

For i = 1 To 4

B_V = B_V + yold(i) * B1(i)

B_L = B_L + xold(i) * B1(i)

Next

 

ff = 0 : df = 0

Z_V = 1 : Z_V_old = 0

 

While Math.Abs(Z_V - Z_V_old) > 0.0001

ff = Z_V ^ 3 - Z_V ^ 2 + (A_V - B_V - B_V ^ 2) * Z_V - A_V * B_V

df = 3 * Z_V ^ 2 - 2 * Z_V + (A_V - B_V - B_V ^ 2)

Z_V_old = Z_V

Z_V = Z_V - ff / df

ff = 0 : df = 0

End While

 

ff = 0 : df = 0

Z_L = 0 : Z_L_old = -1

 

While Math.Abs(Z_L - Z_L_old) > 0.0001

ff = Z_L ^ 3 - Z_L ^ 2 + (A_L - B_L - B_L ^ 2) * Z_L - A_L * B_L

df = 3 * Z_L ^ 2 - 2 * Z_L + (A_L - B_L - B_L ^ 2)

Z_L_old = Z_L

Z_L = Z_L - ff / df

ff = 0 : df = 0

End While

 

Uliq = Z_L * 8.3143 * T / P

Uv = Z_V * 8.3143 * T / P

 

For i = 1 To 4

F_V(i) = yold(i) * P * Math.Exp((Z_V - 1) * B1(i) / B_V - Math.Log(Z_V - B_V) - A_V / B_V * (2 * A1(i) ^ 0.5 / A_V ^ 0.5 - B1(i) / B_V) * Math.Log((Z_V + B_V) / Z_V))

F_L(i) = xold(i) * P * Math.Exp((Z_L - 1) * B1(i) / B_L - Math.Log(Z_L - B_L) - A_L / B_L * (2 * A1(i) ^ 0.5 / A_L ^ 0.5 - B1(i) / B_L) * Math.Log((Z_L + B_L) / Z_L))

k(i) = Math.Exp((Z_L - 1) * B1(i) / B_L - Math.Log(Z_L - B_L) - A_L / B_L * (2 * A1(i) ^ 0.5 / A_L ^ 0.5 - B1(i) / B_L) * Math.Log((Z_L + B_L) / Z_L)) / Math.Exp((Z_V - 1) * B1(i) / B_V - Math.Log(Z_V - B_V) - A_V / B_V * (2 * A1(i) ^ 0.5 / A_V ^ 0.5 - B1(i) / B_V) * Math.Log((Z_V + B_V) / Z_V))

Next

 

ff = 0 : df = 0

psi = 0.5 : psi_old = 2

 

While Math.Abs(psi - psi_old) > 0.0001

For i = 1 To 4

ff = ff + z(i) * (1 - k(i)) / (1 + psi * (k(i) - 1))

df = df - z(i) * (1 - k(i)) * (k(i) - 1) / (1 + psi * (k(i) - 1)) ^ 2

Next

psi_old = psi

psi = psi - ff / df

ff = 0 : df = 0

End While

 

' MEXRI EDW ola leitourgoun kala. Parakatw ta xalaei..

 

For i = 1 To 4

xold(i) = z(i) / ((1 - psi) + psi * k(i))

yold(i) = k(i) * xold(i)

x(i) = xold(i)

y(i) = yold(i)

Next

 

p_liq = (x(1) * MBb + x(2) * MBh + x(3) * MBk + x(4) * MBe) / Uliq / 10 ^ 6

End While

End Sub

Δημοσ.

Όντως, δώσε παραπάνω στοιχεία. Δεν βγάζουμε άκρυ έτσι...

ΜΕγάλο ρόλο παίζει και πως έχεις δηλώσει τις μεταβλητές αυτές..

Δημοσ.

Παιδιά δεν έχει άλλο! Όλο τον υπόλοιπο κώδικα δίνω παρακάτω:

 

Public L, D, di, m_cat, F, w, h, MBb, MBe, MBh, MBk As Single

Public P, T, A, V, pkl, zz, psi As Double

Public Ntot, NBtot, NEtot, NHtot, NCtot, NBv, NBliq, NEv, NEliq, NHv, NHliq, NCv, NCliq As Double

Public FH, Fliq, Fv, Uv, Uliq, p_liq As Double

Public x(4), y(4), z(4), k(4), xold(4), yold(4) As Double

 

Public Sub CmdRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdRun.Click

LoadData()

Systash()

SRK()

End Sub

 

Public Sub LoadData()

 

L = txtLengthReactor.Text

D = txtDiameterInterior.Text

di = txtDiameterShell.Text

m_cat = txtMassCatalyst.Text

F = txtFlowLiquid.Text

FH = txtFlowHydrogen.Text

w = txtBenzeneW.Text

 

MBb = 78.114

MBe = 86.177

MBh = 2.016

MBk = 84.161

 

T = txtTemperature.Text

P = txtPressure.Text

h = txtRungeKuttaStep.Text

 

A = (3.141592654 * D ^ 2 / 4 - 3.141592654 * di ^ 2 / 4)

V = A * L

pkl = m_cat / V

 

NBliq = w / MBb * F : NBv = 0 : NBtot = NBliq + NBv

NHliq = 0 : NHv = FH / 22.4 : NHtot = NHliq + NHv

NCliq = 0 : NCv = 0 : NCtot = NCliq + NCv

NEliq = (1 - w) / MBe * F : NEv = 0 : NEtot = NEliq + NEv

zz = 0

Ntot = NBtot + NEtot + NHtot + NCtot

End Sub

 

Public Sub Systash()

z(1) = NBtot / Ntot

z(2) = NHtot / Ntot

z(3) = NCtot / Ntot

z(4) = NEtot / Ntot

End Sub

Δημοσ.

perri [baggeli?] :D, an thes na doume ti simbenei kane to exis:

 

kane ena RAR ta arxeia pou ehi sto solution pou douleveis, bale kai to sln mesa [diladi na eine etimo pros anoigma kai debug], kai anebase ta oste na boroume na doulepsoume pano sta idia pou douleveis esi. ego prosopika dokimasa na enoso ta dio kommatia tou kodika, kai akoma mou elipan pragmata.

 

filika,

themos :P

Δημοσ.

Περικλής... όχι Βαγγέλης :)

 

Anyway, το βρήκα το λόγο αλλά δεν μπορώ να καταλάβω γιατί το κάνει αυτό...

Στην αρχή της sub SRK δηλώνω ότι xold = z και yold = z ως αρχικές τιμές. Έβαλα άλλες άσχετες αρχικές τιμές και δούλεψε. Ποιος όμως του είπε ότι όταν αλλάζει κάποιο από τα xold, yold θέλω να παίρνουν και τα δύο την ίδια τιμή;;; Δεν ξέρω γιατί το κάνει αυτό..

 

Κάτι άσχετο... Το option base 1 που υπήρχε στις παλιές visual basic (αρχίζει τα arrays μετρώντας από 1) δεν υπάρχει στην vb.net;;

Δημοσ.

δεν ξέρω τι νόημα μπορεί να έχει να γράφεις

xold = z

yold = z

 

αφού και τόσο το xold, yold αλλά και το z είναι arrays με 4 στοιχεία.

 

εγώ άλλαξα τα εξής:

 

>
Public Sub Systash()
       z(0) = NBtot / Ntot 
       z(1) = NHtot / Ntot
       z(2) = NCtot / Ntot
       z(3) = NEtot / Ntot            // apo to 0 os to 3 kai pali
   End Sub

 

>
For i = 0 To 3
           xold(i) = z(i)
           yold(i) = z(i)     // και οχι yold = xold = z που είχες.
Next

 

>
           For i = 0 To 3   // apo to 0 os to 3, eine 4 epanlipseis kai imaste OK
               xold(i) = z(i) / ((1 - psi) + psi * k(i))
               yold(i) = k(i) * xold(i)
               x(i) = xold(i)
               y(i) = yold(i)
           Next

 

βασικά to xold() yold() x() καi y()

δεν παίρνουν τιμές για i=0. το Option Base πέθανε [και καλώς γιατί δημιουργούσε σύγχυση]

 

Dim Weight(20) As Single

 

Visual Basic .NET

In Visual Basic .NET, the lower bound of every array dimension is 0, and you cannot declare it to be otherwise. The Option Base statement is not supported.

 

The number you specify for each dimension in the declaration is the upper bound, and the initial element count is equal to the upper bound plus one. The declaration in the preceding example reserves 21 elements for Weight, with subscripts 0 through 20.

 

 

δεν ξέρω αν τώρα κάνει την δουλεία που θες.

το

xold = z

yold = z

 

μάλλον αυτό ήταν που προκαλούσε την ταύτιση.

 

Όταν δηλώνεις έναν array πχ xold()

και στη συνέχεια τον αναφέρεις μόνο του xold

[αυτό τουλάχιστον στην C++ γυρίζει την διεύθυνση του xold(0)] :)

 

έτσι στην C++ ισχύουν οι Ταυτολογίες:

όνομα_πίνακα = &όνομα_πίνακα[0]

 

και γιαυτό κάνεις "μαγκιές"

*(όνομα_πίνακα + i) = όνομα_πίνακα

 

τώρα στην VB.NET *άγνωστο* τι συμβαίνει. [αλλά για να λες ότι ταυτίζουν τιμές, τότε μάλλον με τις παραπάνω εντολές ταυτίζονται τα references στον σωρό(;)]

δες

ms-help://MS.VSCC/MS.MSDNVS/vbls7/html/vblrfVBSpec6_8.htm

 

 

ίσως χρειαστεί να αλλάξει και αλλού το 1 ως 4 σε 0 ως 3 (ξέρεις καλύτερα τον κώδικα σου απο εμένα)

 

ελπίζω να κάνει αυτό που θες.

Εδώ είμαστε για ότι θέλει προκύψε

 

 

ΥΓ. καλό θα ήταν να γράφεις με κάποιο σύστημα στην ονομοτοδοσία των μεταβλητών ώστε να κάνεις τον κώδικα σου πιο ευανάγνωστο, αλλά και εσύ να μην πέφτεις σε τέτοια μπερδέματα [τι είναι array, τι string κλπ].

Δες:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconNamingGuidelines.asp

 

και για πιο σκληρούς devs:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.asp

Δημοσ.

Αυτό το xold = yold = z είχε ξεμείνει από τον κώδικα του Matlab (ήταν copy paste απο κει). Το matlab κάνει πράξεις και με πίνακες και αυτό ήταν σωστό...

Τώρα γιατί δημιουργεί ταύτιση η vb.net σε δύο διαφορετικές μεταβλητές άγνωστο, όπως λες και εσύ. Όσο για το option base εγώ προτιμούσα όταν άρχιζε από το 1 στις παλιές basic :) Τώρα θα το συνηθίσουμε τι να κάνουμε..

Τέλος, για την ονοματοδοσία των μεταβλητών, στη συγκεκριμένη περίπτωση, πρόκειται καθαρά για χημικούς όρους και γι'αυτό είναι με τέτοιο τρόπο ώστε να καταλαβαίνω τι είναι το καθένα. Μπορεί να φαίνονται λίγο κινέζικα και τυχαία αλλά δεν είναι :) Σε τίποτα text boxes κλπ objects τηρώ κάποιο σύστημα...

 

Thanx για τη βοήθεια!

Δημοσ.

ok. esi loop itheles na kanei otan egrafes xold=yold=z ?? kai na bazei ta i elements opos sto ekana ego pio pano?

 

 

pados se kamia glossa [VB.NET,C++,C#] den simbenei afto etsi apla anaferodas ta.

 

>
       xold = z
0000041f  mov         eax,dword ptr [edi+00000280h] 
00000425  lea         edx,[edi+00000288h] 
0000042b  call        73926BE0 
       yold = z
00000430  mov         eax,dword ptr [edi+00000280h] 
00000436  lea         edx,[edi+0000028Ch] 
0000043c  call        73926BE0 

 

>
       For i = 0 To 4
0000041f  xor         esi,esi 
           xold(i) = z(i)
00000421  mov         eax,dword ptr [edi+00000288h] 
00000427  mov         dword ptr [ebp+FFFFFF60h],eax 
0000042d  mov         eax,dword ptr [edi+00000280h] 
00000433  cmp         esi,dword ptr [eax+4] 
00000436  jb          0000043F 
00000438  xor         ecx,ecx 
0000043a  call        7379C1FF 
0000043f  fld         qword ptr [eax+esi*8+8] 
00000443  fstp        qword ptr [ebp+FFFFFF58h] 
00000449  mov         eax,dword ptr [ebp+FFFFFF60h] 
0000044f  cmp         esi,dword ptr [eax+4] 
00000452  jb          0000045B 
00000454  xor         ecx,ecx 
00000456  call        7379C1FF 
0000045b  mov         edx,dword ptr [ebp+FFFFFF58h] 
00000461  mov         dword ptr [eax+esi*8+8],edx 
00000465  mov         edx,dword ptr [ebp+FFFFFF5Ch] 
0000046b  mov         dword ptr [eax+esi*8+0Ch],edx 
           yold(i) = z(i)
0000046f  mov         eax,dword ptr [edi+0000028Ch] 
           yold(i) = z(i)
00000475  mov         dword ptr [ebp+FFFFFF54h],eax 
0000047b  mov         eax,dword ptr [edi+00000280h] 
00000481  cmp         esi,dword ptr [eax+4] 
00000484  jb          0000048D 
00000486  xor         ecx,ecx 
00000488  call        7379C1FF 
0000048d  fld         qword ptr [eax+esi*8+8] 
00000491  fstp        qword ptr [ebp+FFFFFF4Ch] 
00000497  mov         eax,dword ptr [ebp+FFFFFF54h] 
0000049d  cmp         esi,dword ptr [eax+4] 
000004a0  jb          000004A9 
000004a2  xor         ecx,ecx 
000004a4  call        7379C1FF 
000004a9  mov         edx,dword ptr [ebp+FFFFFF4Ch] 
000004af  mov         dword ptr [eax+esi*8+8],edx 
000004b3  mov         edx,dword ptr [ebp+FFFFFF50h] 
000004b9  mov         dword ptr [eax+esi*8+0Ch],edx 
       Next

Δημοσ.

Nai ithela na kanei loop... Auto pou ekanes kai esi. Na adistoixei dhladh mia mia tis times. Auto to xold = yold = z doulevei sto matlab kai otan to ekana copy paste sthn vb de mou vgale error kai ypethesa oti doulevei swsta kai gi'ayto den to alla3a...

Apodeixthke oti exei diafora :)

 

Asxeto twra.. VB.net den eixa 3anaasxolhthei kai vlepw oti exei arketes diafores apo tis prohgoumenes vb. Kai pio berdemenh ... alla vevaia me poly perissoteres dynatothtes.

Δημοσ.

ne eine ligo koufo pou i VB.NET den sou xtipise error

 

 

se C# an kaneis kati paromoio:

 

int[] a,b,z;

 

a=b=z;

 

xtipaei error akoma kai static na ta kaneis ta idia

 

perierga pragmata :P

 

rotao edo:

http://www.csharp-station.com/ShowPost.aspx?PostID=3801

 

ps. alitheia to MatLab bgazei kodika VB.NET ?? i to ekanes me to xeri?

 

ps2. ξαναδιάβασε το [έκανα κάτι αλλαγές]

http://www.insomnia.gr/phpBB2/viewtopic.php?p=491524#491524

Δημοσ.

Otan grapheis a=b=z ypothetw oti den ennoeis auto alla

a=z

b=z

swsta? Giati ston kwdika pou eixa grapsei auto eixa grapsei... oxi a=b=z... allo twra ti katalabaine h vb :)

 

Oso gia to matlab, ti ennoeis an vgazei kwdika vb.net? Apla eixa grapsei kapote ton kwdika se matlab kai ithela na to kanw se vb. Opote to kana copy paste kai diorthwna ta lathi pou mou vgaze h vb...

Δημοσ.

a=z

b=z

 

είνα το ίδιο με

a=b=z (από δεξιά προς τ' αριστερά διάβασε το)

 

 

ΟΚ. πάντως σίγουρα το παραπάνω δνε κάνει τα elements.

το GUI εσύ το έκανες;

πολύ παράξενα πράγματα που σου το κάνει compile.

αυτά είναι static arrays? ή ανοίκουν σε κάποιο object?

Δημοσ.

Και τον κώδικα και το GUI εγώ τα έκανα. Δεν έχει τελειώσει όμως... ή μάλλον ούτε καν που έχει αρχίσει :) Πριν 3-4 μέρες το ξεκίνησα.

Γιατί είναι παράξενο που τα κάνει compile? Τα περισσότερα είναι public arrays γιατί χρησιμοποιούνται παντού..

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...