Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Variablen in Main werden aus UnterFunktion heraus geändert

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von reltro an!   Senden Sie eine Private Message an reltro  Schreiben Sie einen Gästebucheintrag für reltro

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 Explicit

Public 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


Sehen Sie sich das Profil von reltro an!   Senden Sie eine Private Message an reltro  Schreiben Sie einen Gästebucheintrag für reltro

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz