vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Problem beim Zugriff auf globale List (Of T) 
Autor: ModeratorFZelle (Moderator)
Datum: 13.11.12 15:02

Da hast Du aber ForEach nicht wirklich verstanden.

ForEach benutzt IEnumerable um durch eine "Auflistung" zu gehen.
Diese muss in keinster weise überhaupt eine Liste sein.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Problem beim Zugriff auf globale List (Of T) 
Autor: sledgehammer89
Datum: 13.11.12 13:01

Hallo Gemeinde

Ich brauch mal wieder eure Hilfe, irgendwie hakt es bei meinem Programm mal wieder an einer Stelle, die eig gar keine Probleme verursachen dürfte (das ist zumindest meine Meinung, dass sie das nicht dürfte ).

Es geht konkret darum, dass ich mir in einer Klasse eine globale Liste angelegt habe und zwar wie folgt:

Private FoundAdaptersList As New List( Of StrctAdapterCables )
Hierbei ist anzumerken, dass der Typ der Liste eine Struktur ist, die ich mir selbst angelegt habe. Der Aufbau der Struktur ist der folgende:

Public Structure StrctAdapterCables
 
    Dim serialNumber As String
    Dim adapterType As String
    Dim testPoint As Integer
    Dim cableStatus As EnStates
    Dim ledStatus As Boolean
 
End Structure
Ich versuch nun in einer Funktion, die IN DIESER KLASSE als Private deklariert ist, auf diese Liste zuzugreifen. Das funktioniert auch. Ich kann auch ein Element dieser Liste herauspicken aber NICHT dieses Element in irgendeiner Form ändern.

Der Code, mit dem ich das versuche, ist der folgende:
For Each adapter As StrctAdapterCables In FoundAdaptersList
 
    If adapter.testPoint = tp Then
 
        adapter.cableStatus = EnStates.reserved
        adapter.ledStatus = LED_ON
 
        Exit For
 
    End If
 
Next adapter
Kleine Anmerkung: tp wir der oben genannten Funktion als Parameter übergeben. EnStates ist eine Enumeration (ebenfalls selbst angelegt).

Das Problem (nochmal) ist jetzt, dass in der For-Next-Schleife die Variable "adapter" zwar geändert wird und auch als geändert angezeigt wird, solange ich eben in der Schleife bin, aber sobald das "Exit For" Statement kommt, ist dieser Inhalt in der globalen Liste nicht geändert worden.

Kann mir da einer sagen, wie ich dieses Element dennoch ändern kann?

Ich kenne solche Probleme, Stichwort "lokale Änderungen", aber das sollte in diesem Fall ja eigentlich nicht so sein oder? Es ist ja eigentlich eine "globale Änderung" oder irre ich?

MfG
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: powerzone3000
Datum: 13.11.12 13:14

Hallo,
ich würde vermuten das liegt daran, dass eine Struktur ein Wert- und kein Referenztyp (wie z. B. eine Klasse ist).

Somit änderst du nur die Laufvariable der For Each-Schleife (lokale Kopie deiner Struktur). Machst du aus deiner Structure eine Class, sollte es gehen.

edit:
Wenn du keine Klasse verwenden möchtest, könnte eine andere Lösung so aussehen (ungetestet):
Dim adapter As StructAdapterCables
For i As Integer = 0 To FoundAdaptersList.Count - 1
    adapter = FoundAdaptersList(i)
 
    If adapter.testPoint = tp Then
 
        adapter.cableStatus = EnStates.reserved
        adapter.ledStatus = LED_ON
        FoundAdapterList(i) = adapter
        Exit For
 
    End If
 
Next adapter
Die Problematik ist auch hier erklärt: http://www.knowdotnet.com/articles/boxedstructures.html

Beitrag wurde zuletzt am 13.11.12 um 13:33:02 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: sledgehammer89
Datum: 13.11.12 13:37

Hallo powerzone3000,

dein Tipp mit der Klasse hat geholfen, ich kann die Werte jetzt ändern ohne mit der Wimper zu zucken. Vielen Dank dafür.

Deine Ausweichmöglichkeit dürfte eigentlich auch nicht funktionieren, denn eigentlich existiert doch kein Unterschied zwischen einer ForEach-Next- und einer normalen For-Next-Schleife oder? Zumindest was die Funktion dahinter angeht...

Ich werde mir deinen Link auch mal durchlesen, vielen Dank auch dafür.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: powerzone3000
Datum: 13.11.12 13:41

Bitte
Doch, das funktioniert.
Hier wird die veränderte Struktur am Ende wieder manuell dem Listenelement zugewiesen, das macht die For Each-Schleife nicht.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: sledgehammer89
Datum: 13.11.12 13:46

Ich habs auch grade in deinem Link gelesen, dass das gehen soll. Find ich ehrlich gesagt ne Schweinerei Ok, ich bin auch selbst Schuld, wenn ich mir die Unterschiede zwischen ForEach und normalem For nicht aneigne, aber wer kommt bitte auf SO nen Bockmist

Aber ich glaub, das wird jetzt Off-Topic wenn wir uns da drüber auslassen. Von daher nehm ich mal 2 Dinge mit:

1) Auf Boxing achten (das wird ja in deinem Link erklärt)
2) Lieber die normale For-Schleife verwenden bzw. mir mal die Doku durchlesen, was denn da genau der Unterschied ist.

Vielen Dank nochmal. Man lernt nie aus, proofed it once again
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: powerzone3000
Datum: 13.11.12 13:52

Du hast schon recht, zwische For Each und For gibt es eigentlich keinen Unterschied. Aber mit der normalen For-Schleife habe ich halt die Möglichkeit den veränderten Wertetyp wieder zurück in die Liste zu packen (boxing)
FoundAdapterList(i) = adapter
Den wichtigen Unterschied den du dir aneigenen solltest ist der zwischen Value und Reference-Types, aber selbst dann kann man sich den Fehler im ersten Moment noch nicht erklären Ich hab den jedenfalls auch schon gemacht.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: Manfred X
Datum: 13.11.12 13:59

Hallo!

Hat sich schon erledigt ....

((( Mit dem Schleifentyp hat das nur indirekt zu tun.
Strukturen mußt Du (z.B. in Auflistungen) stets als Ganzes
lesen, die Elemente ändern und komplett wieder zuweisen.

Mit einer For Each-Schleife klappt es nur deshalb nicht,
weil Du keinen Index für die Zuweisung der geänderten Structure
hast. Oder Du läßt separat einen Index in einer Integer mitlaufen. )))

MfG
Manfred

Beitrag wurde zuletzt am 13.11.12 um 14:01:49 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: sledgehammer89
Datum: 13.11.12 14:03

Hallo Manfred X,

die Erklärung leuchtet einem natürlich auch ein Es ist aber wieder so, dass dieser Unterschied zwischen den beiden For-Schleifen nicht wirklich groß beleuchtet ist. Es könnte ja nämlich theoretisch der Fall sein, dass eine ForEach durchaus im Hintegrund einen Index verwendet. Aber das wird, wie bereits gesagt, eher ein Off-Topic-Fall
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: sledgehammer89
Datum: 13.11.12 15:22

Ich hab zum Thema "Unterschied ForEach zu ForNext" einen Beitrag über google gefunden. Der ist ganz interessant für diejenigen, die auch über den Thread hier stolpern und weitere Infos suchen:

http://www.vbdotnetforums.com/vb-net-general-discussion/40288-difference-between-each-i.html
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem beim Zugriff auf globale List (Of T) 
Autor: ModeratorFZelle (Moderator)
Datum: 13.11.12 16:49

Auch der Artikel zeigt nicht worum es geht, sondern nur die Symptome die aus der Implementation entstehen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel