Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Probleme mit Übergabe durch ByRef

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
Autor Thema:  Probleme mit Übergabe durch ByRef (828 mal gelesen)
LayKris
Mitglied
Student


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

Beiträge: 12
Registriert: 28.03.2012

@home:
i5-750 @ 4x2,66GHz
4GB DDR3
Radeon HD5770
@mobile:
Amd A8-3520 @ 4x2.5GHz
4GB DDR3
Radeon HD6740G2

erstellt am: 25. Mai. 2012 12:39    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 zusammen, ich habe ein kleines Problemchen aus dem ich nicht ganz schlau werde... vielleicht verstehe ich da ja was grundlegend falsch, wenn dem so ist, klärt mich bitte auf 

Ich rufe innerhalb einer Sub eine Function auf, mit einem ByRef-Übergabewert. Meine Absicht ist eigentlich, den übergebenen Wert zu verändern. Innerhalb der Function funktioniert das auch wunderbar, aber im Kontext der Sub bleibt der Wert der Variable unverändert. Ich dachte, genau zu diesem Zweck wäre ByRef da, eben damit ich den Wert verändern kann?

Wenn ich eine globale Variable definiere und diese direkt verändere funktioniert's zwar, aber das ist ja alles andere als elegant.

Vielleicht hat ja jemand von euch eine Idee, warum das bei mir nicht klappt? Hier mal ein vereinfachter Beispiel-Code, um zu illustrieren was ich versuche:

Code:
Sub CATMain()
Dim Wert1 As Integer
TestFunc (Wert1)
MsgBox (Wert1)
End Sub

Function TestFunc (ByRef Wert2 As Integer)
Wert2 = 100
End Function


Wie gesagt nur ein sehr einfacher Beispielcode, aber im Grunde reicht der aus, um mein Problem zu illustrieren. Nach meinem Verständnis sollte ich eine MsgBox kriegen, die mir "100" sagt, oder? Leider sagt die bei mir "0". Habe ich was falsch gemacht/die Syntax nicht richtig angewandt oder spinnt mein Makro einfach unerklärlich rum? 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

geekv5
Mitglied
Konstrukteur


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

Beiträge: 214
Registriert: 13.07.2011

Notebook<P>MSI GX660R
Intel Core i5 460M
8GB DDR3
1GB Mobility HD5870
80GB Intel X25-M Postville
250GB HDD<P>Desktop<P>AMD Phenom II X4 965
1GB HD4890@ FirePro V8700
8GB DDR3-1600
2,5TB HDD<P>Belinea 2485 S1W 24" MVA

erstellt am: 25. Mai. 2012 12:52    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 Nur für LayKris 10 Unities + Antwort hilfreich

Hi, habe mal schnell probiert und herausgefunden, dass es so funktioniert:

Code:

Sub CATMain()
Dim Wert1 As Integer
call TestFunc (Wert1)
MsgBox (Wert1)
End Sub
Sub TestFunc (ByRef Wert2 As Integer)
Wert2 = 100
End Sub

Also mit einer Prozedur anstatt Function.. BTWBy the way (So nebenbei bemerkt). bis VB6 ist ByRef eh die Standardübergabemethode, ist also nicht unbedingt notwendig, außer du programmierst in VB.NET..

P.S.

Ist natürlich keine Lösung, weil irgendwie muss das ja auch mit Funktionen gehen 

[Diese Nachricht wurde von geekv5 am 25. Mai. 2012 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

LayKris
Mitglied
Student


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

Beiträge: 12
Registriert: 28.03.2012

@home:
i5-750 @ 4x2,66GHz
4GB DDR3
Radeon HD5770
@mobile:
Amd A8-3520 @ 4x2.5GHz
4GB DDR3
Radeon HD6740G2

erstellt am: 25. Mai. 2012 13:01    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

Hey, danke schonmal für die schnelle Antwort. Dass ByRef Standard ist, wusste ich, aber ich wollte es hier nochmal deutlich machen.

Habe das nochmal schnell ausprobiert, bei mir klappt's allerdings leider nicht. Also zumindest in meinem echten Makro, kann natürlich sein, dass das Beispiel hier funktioniert. Ist denn die Anwendung (also Syntax usw) soweit korrekt?

EDIT: Bin jetzt drauf gekommen, wie das läuft, aber etwas wundern tut's mich schon, weil mir die Syntax so nicht bekannt war.

Code:
TestFunc Wert2:=Wert1

war die Lösung. Werd jetzt nochmal nachlesen, wie und vor allem warum das so funktioniert, aber hauptsache es tut erstmal 

[Diese Nachricht wurde von LayKris am 25. Mai. 2012 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

geekv5
Mitglied
Konstrukteur


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

Beiträge: 214
Registriert: 13.07.2011

Notebook<P>MSI GX660R
Intel Core i5 460M
8GB DDR3
1GB Mobility HD5870
80GB Intel X25-M Postville
250GB HDD<P>Desktop<P>AMD Phenom II X4 965
1GB HD4890@ FirePro V8700
8GB DDR3-1600
2,5TB HDD<P>Belinea 2485 S1W 24" MVA

erstellt am: 25. Mai. 2012 13:34    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 Nur für LayKris 10 Unities + Antwort hilfreich

Puh, keine Ahnung, was bei dem Aufruf von dir passiert, aber ich glaube die Lösung gefunden zu haben 

Code:

Sub CATMain()
Dim Wert1 As Integer
TestFunc Wert1
MsgBox (Wert1)
End Sub
Function TestFunc (ByRef Wert2 As Integer)
Wert2 = 100
End Function

Habe einfach die Klammern beim Funktionsaufruf entfernt!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

LayKris
Mitglied
Student


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

Beiträge: 12
Registriert: 28.03.2012

@home:
i5-750 @ 4x2,66GHz
4GB DDR3
Radeon HD5770
@mobile:
Amd A8-3520 @ 4x2.5GHz
4GB DDR3
Radeon HD6740G2

erstellt am: 25. Mai. 2012 13:38    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

Tatsache, das funktioniert bei mir dann auch. Ich hätte nicht gedacht, dass die Klammern da einen Unterschied machen, dachte die wären halt optional, wenn man eh nur einen Wert hat bzw werden auf jeden Fall gebraucht, wenn man mehrere Parameter hat.
Und das mit dem ":=" kannte ich bisher nur aus C#.
Klappt jetzt auf jeden Fall, Frage hat sich also erledigt.

Besten Dank nochmal!

EDIT: Habe grade nochmal etwas recherchiert und dabei rausgefunden, dass die Klammern wohl genau das bewirken (sollen), was bei mir nicht beabsichtigt war: nämlich dass der ursrüngliche Wert eben nicht verändert wird. Gut zu wissen.

[Diese Nachricht wurde von LayKris am 25. Mai. 2012 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

geekv5
Mitglied
Konstrukteur


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

Beiträge: 214
Registriert: 13.07.2011

Notebook<P>MSI GX660R
Intel Core i5 460M
8GB DDR3
1GB Mobility HD5870
80GB Intel X25-M Postville
250GB HDD<P>Desktop<P>AMD Phenom II X4 965
1GB HD4890@ FirePro V8700
8GB DDR3-1600
2,5TB HDD<P>Belinea 2485 S1W 24" MVA

erstellt am: 25. Mai. 2012 13:56    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 Nur für LayKris 10 Unities + Antwort hilfreich

Ahja, also mit Klammern ist das sozusagen ein ByVal Parameter.. Mit Klammern funktioniert es allerdings auch, wenn man die Funktion/Prozedur mit Call aufruft, siehe meine erste Antwort.. Nur dachte ich vorhin, dass es an der Prozedur liegt..

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

buecherm83
Mitglied
Ingenieur IT Application Software


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

Beiträge: 78
Registriert: 20.09.2011

SIEMENS NX10
CATIA V5 R26
VB7.1
Tecnomatix Process Designer/Simulate<P>Win7 64bit
Office 2016

erstellt am: 21. Jul. 2016 08:54    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 Nur für LayKris 10 Unities + Antwort hilfreich

Hallo,

habe ein ähnliches Problem.

Ich rufe gerne eine Function innerhalb eines Click Events auf. Bis jetzt sieht mein Code so aus.

Code:
Private Sub Button_Click()
...
Dim TestVariable as String
testfunktion Testvariable
...
End Sub

Function testfunktion (ByRef Testvariable as String)
MsgBox Testvariable
End Function



Mein Code überspringt die Funktion komplett. Ich habe es in einem neuen Makro getestet und da lief es. Ich habe keine Idee mehr voran es liegen kann.
Gibt es irgendwelche weiteren Tips?

Danke

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