Perris Δημοσ. 12 Φεβρουαρίου 2004 Δημοσ. 12 Φεβρουαρίου 2004 Ρε παιδιά μπας και έχει τίποτα περίεργο αυτή η γλώσσα;; Μάγια του χω κάνει και δε μου βγάζει σωστό αποτέλεσμα;; Ίδιος ακριβώς κώδικας σε 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.
zeppelin Δημοσ. 12 Φεβρουαρίου 2004 Δημοσ. 12 Φεβρουαρίου 2004 γεια σου. δώσε λίγο περισσότερο κώδικα από το πρόγραμμα σου αν σου είναι εύκολο, για να το δω στην πράξη να καταλάβω τι κάνεις
Perris Δημοσ. 12 Φεβρουαρίου 2004 Μέλος Δημοσ. 12 Φεβρουαρίου 2004 Τα 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
Επισκέπτης Δημοσ. 12 Φεβρουαρίου 2004 Δημοσ. 12 Φεβρουαρίου 2004 Όντως, δώσε παραπάνω στοιχεία. Δεν βγάζουμε άκρυ έτσι... ΜΕγάλο ρόλο παίζει και πως έχεις δηλώσει τις μεταβλητές αυτές..
Perris Δημοσ. 12 Φεβρουαρίου 2004 Μέλος Δημοσ. 12 Φεβρουαρίου 2004 Παιδιά δεν έχει άλλο! Όλο τον υπόλοιπο κώδικα δίνω παρακάτω: 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
zeppelin Δημοσ. 12 Φεβρουαρίου 2004 Δημοσ. 12 Φεβρουαρίου 2004 perri [baggeli?] , 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
Perris Δημοσ. 12 Φεβρουαρίου 2004 Μέλος Δημοσ. 12 Φεβρουαρίου 2004 Περικλής... όχι Βαγγέλης Anyway, το βρήκα το λόγο αλλά δεν μπορώ να καταλάβω γιατί το κάνει αυτό... Στην αρχή της sub SRK δηλώνω ότι xold = z και yold = z ως αρχικές τιμές. Έβαλα άλλες άσχετες αρχικές τιμές και δούλεψε. Ποιος όμως του είπε ότι όταν αλλάζει κάποιο από τα xold, yold θέλω να παίρνουν και τα δύο την ίδια τιμή;;; Δεν ξέρω γιατί το κάνει αυτό.. Κάτι άσχετο... Το option base 1 που υπήρχε στις παλιές visual basic (αρχίζει τα arrays μετρώντας από 1) δεν υπάρχει στην vb.net;;
zeppelin Δημοσ. 13 Φεβρουαρίου 2004 Δημοσ. 13 Φεβρουαρίου 2004 δεν ξέρω τι νόημα μπορεί να έχει να γράφεις 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
Perris Δημοσ. 13 Φεβρουαρίου 2004 Μέλος Δημοσ. 13 Φεβρουαρίου 2004 Αυτό το xold = yold = z είχε ξεμείνει από τον κώδικα του Matlab (ήταν copy paste απο κει). Το matlab κάνει πράξεις και με πίνακες και αυτό ήταν σωστό... Τώρα γιατί δημιουργεί ταύτιση η vb.net σε δύο διαφορετικές μεταβλητές άγνωστο, όπως λες και εσύ. Όσο για το option base εγώ προτιμούσα όταν άρχιζε από το 1 στις παλιές basic Τώρα θα το συνηθίσουμε τι να κάνουμε.. Τέλος, για την ονοματοδοσία των μεταβλητών, στη συγκεκριμένη περίπτωση, πρόκειται καθαρά για χημικούς όρους και γι'αυτό είναι με τέτοιο τρόπο ώστε να καταλαβαίνω τι είναι το καθένα. Μπορεί να φαίνονται λίγο κινέζικα και τυχαία αλλά δεν είναι Σε τίποτα text boxes κλπ objects τηρώ κάποιο σύστημα... Thanx για τη βοήθεια!
zeppelin Δημοσ. 13 Φεβρουαρίου 2004 Δημοσ. 13 Φεβρουαρίου 2004 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
Perris Δημοσ. 13 Φεβρουαρίου 2004 Μέλος Δημοσ. 13 Φεβρουαρίου 2004 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.
zeppelin Δημοσ. 13 Φεβρουαρίου 2004 Δημοσ. 13 Φεβρουαρίου 2004 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 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
Perris Δημοσ. 13 Φεβρουαρίου 2004 Μέλος Δημοσ. 13 Φεβρουαρίου 2004 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...
zeppelin Δημοσ. 13 Φεβρουαρίου 2004 Δημοσ. 13 Φεβρουαρίου 2004 a=z b=z είνα το ίδιο με a=b=z (από δεξιά προς τ' αριστερά διάβασε το) ΟΚ. πάντως σίγουρα το παραπάνω δνε κάνει τα elements. το GUI εσύ το έκανες; πολύ παράξενα πράγματα που σου το κάνει compile. αυτά είναι static arrays? ή ανοίκουν σε κάποιο object?
Perris Δημοσ. 14 Φεβρουαρίου 2004 Μέλος Δημοσ. 14 Φεβρουαρίου 2004 Και τον κώδικα και το GUI εγώ τα έκανα. Δεν έχει τελειώσει όμως... ή μάλλον ούτε καν που έχει αρχίσει Πριν 3-4 μέρες το ξεκίνησα. Γιατί είναι παράξενο που τα κάνει compile? Τα περισσότερα είναι public arrays γιατί χρησιμοποιούνται παντού..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.