| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Variablen in Main werden aus UnterFunktion heraus geändert (1864 mal gelesen)
|
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 03. Feb. 2011 10:43 <-- editieren / zitieren --> Unities abgeben:
hallo liebes Forum, Habe da eine Prozedur die versucht einen Punktzug off(zu)setten. Ja, das stellt aber nicht das Problem dar... Komischerweise werden die in der Oberfunktion definierten Variablen durch die Unterfunktion geändert, obwohl diese dort in keinerlei Weise angesprochen werden. Bin noch relativ neu in VBA, dachte jedoch dass die Variablen lokal definiert sind? ja, hier mal bissi was an Code:
Code:
Option ExplicitPublic Sub test() Dim Pkt_1(1) As Double Pkt_1(0) = 0 Pkt_1(1) = 0 Dim Pkt_2(1) As Double Pkt_2(0) = 5 Pkt_2(1) = 5 Dim Pkt_3(1) As Double Pkt_3(0) = 5 Pkt_3(1) = 5 Dim Pkt_4(1) As Double Pkt_4(0) = 10 Pkt_4(1) = 5 Dim PunkteG1() As Variant Dim PunkteG2() As Variant Dim offsetDistance As Double offsetDistance = 2 PunkteG1 = offset_Punkte(Pkt_1, Pkt_2, offsetDistance) PunkteG2 = offset_Punkte(Pkt_3, Pkt_4, offsetDistance) Dim a() As Double Dim b() As Double a = PunkteG1(0) b = PunkteG1(1) Dim c() As Double Dim d() As Double c = PunkteG2(0) d = PunkteG2(1) Dim s() As Double 's = S_Pkt(a, b, c, d) s = S_Pkt(Pkt_1, Pkt_2, Pkt_3, Pkt_4) End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'S U B S ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function vektor(Pkt01() As Double, Pkt02() As Double) As Variant Dim Vek() As Double ReDim Vek(0 To min(UBound(Pkt01), UBound(Pkt02)) + 1) As Double Dim sum_quad As Double Dim i As Integer For i = 1 To UBound(Vek) Vek(i) = Pkt02(i - 1) - Pkt01(i - 1) sum_quad = sum_quad + Vek(i) ^ 2 Next Dim Distance As Double Distance = Sqr(sum_quad) If Distance = 0 Then 'Same Point Exit Function Else For i = 1 To UBound(Vek) Vek(i) = Vek(i) / Distance Next Vek(0) = Distance vektor = Vek End If End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function NormalVektor(a() As Double, b() As Double) As Variant Dim Vek() As Double Vek = vektor(a, b) Dim NormVek01(1) As Double NormVek01(0) = Vek(2) * -1# NormVek01(1) = Vek(1) Dim NormVek02(1) As Double NormVek02(0) = Vek(2) NormVek02(1) = Vek(1) * -1# Dim Ausgabe(1) As Variant Ausgabe(0) = NormVek01 Ausgabe(1) = NormVek02 NormalVektor = Ausgabe End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function GeradenGleichung(a() As Double, b() As Double) As Variant Dim m As Double m = (b(1) - a(1)) / (b(0) - a(0)) Dim n As Double n = a(1) - (b(1) - a(1)) / (b(0) - a(0)) * a(0) Dim Ausgabe(1) As Double Ausgabe(0) = m Ausgabe(1) = n GeradenGleichung = Ausgabe End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function SchnittPunkt(Gerade01() As Double, Gerade02() As Double) As Variant Dim s(1) As Double s(0) = (Gerade02(1) - Gerade01(1)) / (Gerade01(0) - Gerade02(0)) s(1) = (Gerade01(0) * Gerade02(1) - Gerade02(0) * Gerade01(1)) / (Gerade01(0) - Gerade02(0)) SchnittPunkt = s End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function S_Pkt(Pkt01_G01() As Double, Pkt02_G01() As Double, Pkt01_G02() As Double, Pkt02_G02() As Double) As Variant Dim G1() As Double Dim G2() As Double Select Case 0 Case Pkt02_G01(0) - Pkt01_G01(0), Pkt02_G02(0) - Pkt01_G02(0) 'Beide Geraden Vertikal Exit Function Case Pkt02_G01(0) - Pkt01_G01(0) G2 = GeradenGleichung(Pkt01_G02, Pkt02_G02) S_Pkt = G2(0) * Pkt01_G01(0) + G2(1) Case Pkt02_G02(0) - Pkt01_G02(0) G1 = GeradenGleichung(Pkt01_G01, Pkt02_G01) S_Pkt = G1(0) * Pkt01_G02(0) + G1(1) Case Else G1 = GeradenGleichung(Pkt01_G01, Pkt02_G01) G2 = GeradenGleichung(Pkt01_G02, Pkt02_G02) If G1(0) = G2(0) Then 'Geraden Parallel Exit Function Else S_Pkt = SchnittPunkt(G1, G2) End If End Select End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function min(a As Double, b As Double) As Double If a < b Then min = a Else min = b End If End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Function offset_Punkte(a() As Double, b() As Double, PosNeg_Abstand As Double) As Variant Dim NormVek() As Variant NormVek = NormalVektor(a, b) Dim i As Integer For i = 0 To 1 a(i) = a(i) + NormVek(0)(i) * PosNeg_Abstand b(i) = b(i) + NormVek(0)(i) * PosNeg_Abstand Next i Dim Ausgabe() As Variant ReDim Ausgabe(0 To 1) As Variant Ausgabe(0) = a Ausgabe(1) = b offset_Punkte = Ausgabe End Function
ja, VAR: PKT01-04 werden geändert, warum auch immer... Stellt in dem Sinne nicht das größte Problem dar, da das Ergebnis richtig ist, trotzdem beunruhigt es mich ein wenig... hoffend auf Hilfe vorausgeschicktes Danke
Lg reltro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Feb. 2011 10:56 <-- editieren / zitieren -->
Hi, guck Dir in der VBA-Hilfe mal den Unterschied zwischen ByRef - und - ByVal an, die Parameter in der Funktionsdeklaration sind damit auszustatten, das hast Du unterlassen, damit ist es ungeklärt. Es macht einen Unterschied, ob Du Public sub myTest(ByRef A as Integer) - oder - Public sub myTest(ByVal A as Integer) machst. Im ersteren Fall hast Du die Dinge referenziert übergeben, Änderungen innerhalb der Sub an der Variable A beeinflussen die Einstellung der übergebenen Variable im übergeordneten Sub/Function. Im zweiteren Fall wird der Wert nicht referenziert übergeben, so als wäre es eine Kopie, dann bekommt die übergeordnete Sub/Function von einer Änderung von A nichts mit. Vorsicht: mit Werten (String, Integer, Double, ...) geht das, mit Objekten musst Du ein wenig mehr aufpassen. Aber nun auf in die Hilfe. - alfred - ------------------ www.hollaus.at |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 04. Feb. 2011 09:59 <-- editieren / zitieren --> Unities abgeben:
hallo alfred, danke für die aufklärung... wieder etwas fundamentales über VBA gelernt... sehr schön. =) das eröffnet ganz neue möglichkeiten... =) ja, die hilfe... =) das ist so ein thema. dort muss man halt wissen nach was man sucht, was sich ab und zu sehr mühsam gestaltet. alles was ich über VBA weiß hab ich entwedder von dort oder von hier Danke ans forum, danke an dich lg reltro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|