Forum: PC-Programmierung C# Enumeration als Rückgabewert


von Paul (Gast)


Lesenswert?

Hallo zusammen,
eine Anfängerfrage:

folgendes Beispiel des Herstellers in VB:
1
Dim owd_enum As java.util.Enumeration
2
// enumerate through all the 1-Wire devices found (with Java-style enumeration)
3
owd_enum = adapter.getAllDeviceContainers

Wie deklariere ich das in C#? Bzw. in was speichere ich die Rückgabe?

Wenn ich eine enum in C# erstelle muss ich doch schon alle Elemente der 
Enum festlegen.
Bei der Rückgabe von getAllDeviceContainers() weiß ich doch aber gar 
nicht was da alles kommt? ODER?

Hier die Definition von getAllDeviceContainers:
1
Enumeration getAllDeviceContainers() throws OneWireIOException, OneWireException
2
3
// Returns an enumeration of OneWireContainer objects corresponding to all 
4
// of the iButtons or 1-Wire devices found on the 1-Wire Network.
5
6
// If no devices are found, then an empty enumeration will be returned. In 
7
// most cases, all further communication with the device is done through 
8
// the OneWireContainer.

Vielen Dank für deine Hilfe.

von Rinde (Gast)


Lesenswert?

Du scheinst da was zu verwechseln: Ein Enum ist ein statischer Datentyp.
Was du brauchst ist eher ein dynamischer Container, wie z.B. eine List<>

von Paul (Gast)


Lesenswert?

Vielen Dank für deine Antwort,
aber ... wenn die die Rückgabe per Definition eine Enumeration ist, was 
soll ich dann mit einer Liste?

-> // Returns an enumeration of OneWireContainer

von Huch (Gast)


Lesenswert?

Das ist ein Missverständnis.

"Enumeration" heisst zunächst einfach "Aufzählung"

Es gibt nun in C einen Typ enum, in dem integer-Werte aufgezählt und 
benannt werden können.

Anderersseits gibt es in Programmen hin und wieder die Notwendigkeit 
allgmein Dinge aufzuzählen, die nicht notwendigerweise integer sind bzw. 
deren Labels dynamisch erzeugt werden müssen. Dann benutzt man allgemein 
gesehen kann eine "Aufzählung" von Werten die auch ein Array oder eine 
Liste von Srings oder structs o.ä. sein kann.

Das ist also hier als Bezeichnung einer gewissen Zusammenstellung von 
Daten, nicht als Angabe eines Datentyps zu verstehen.

von Rinde (Gast)


Lesenswert?

Ich bin mir ziemlich sicher, dass hier mit enumeration eine Liste (oder 
etwas ähnliches) gemeint ist. Das entnehme ich dem von dir geposteten 
Kommentar.

von Huch (Gast)


Lesenswert?

Um das von mir geschriebene noch zu verdeutlichen:

Ein ähnliches "Missverständnis" könnte man mit dem Wort "case" 
konstruieren.

Das heisst "Fall", und ist ja auch ein C-Schlüsselwort.

Dennoch folgt aus der Verwendung des Wortes in einem Prosatext über ein 
Programm, wie etwa "... in case n is even to seven" nicht 
notwendigerweise, das in dem Programm auch das Schlüsselwort case 
verwendet wird. Das sind einfach zwei verschiedene Sprachebenen, der 
Programmtext selbst und ein Text, der das Programm beschreibt. Da gibt 
es notwendigerweise Überschneidungen, eine Art "falsche Freunde".

von Markus V. (valvestino)


Lesenswert?

Das C#-Pendant zu java.util.Enumeration ist 
System.Collections.Generic.IEnumerator. Beides sind generische Klassen 
mit deren Hilfe Du über die Elemente einer Collection iterieren kannst.

von Florian (Gast)


Lesenswert?

Enumeration ist in java eine schnitstelle,
mit dessen hilfe generische aufzählungen
durchlaufen werden (class Vector<T>)
und das hat nix mit einem enum zu tun.
lediglich die übersetzung deuted in beiden
fällen auf eine "aufzählung" hin.

Rinde (Gast) hat es bereits gesagt in C# kannst
du dafür die klasse List<T> verwenden.

von Markus V. (valvestino)


Lesenswert?

Ersetze in meinem letzten Beitrag Klassen durch Interfaces.

von Arc N. (arc)


Lesenswert?

Stichworte u.a. IEnumerable und IEnumerator.
Hier reicht z.B.
1
    class DSPortAdapter {
2
        List<OneWireContainer> _container;
3
        // oder
4
        // OneWireContainer[] _container;
5
        // oder LinkedList etc. solange der Container IEnumerable implementiert 
6
        // Nimmt man keinen fertigen Container und implementiert das/die 
7
        // Interfaces, kann man die Ergebnisse auch erst bei der Anforderung
8
        // erzeugen und nicht wie hier vorher
9
        public IEnumerable<OneWireContainer> getAllDeviceContainers() {
10
            return _container;
11
        }
12
    }
13
14
    foreach (OneWireContainer oc in ds.getAllDeviceContainers()) {
15
        oc...
16
    }

von Paul (Gast)


Lesenswert?

super, langsam kommt Licht ins Dunkle.
Hab das also zu wörtlich genommen mit der Enumeration.
Vielen Dank Euch allen.

Aber ...
ich muss für die API folgende Verweise ins Projekt einbinden:
oneWireApi.net und vjslib

Ich weiß jetzt, dass das C#-Pendant zu java.util.Enumeration die
System.Collections.Generic.IEnumerator ist. Danke.

Die API verlangt die Initialisierung (oder wie auch immmer) als 
java.util.Enumeration -> deshalb wohl auch die Einbindung von vjslib!!!

-> Dim Var_enum As java.util.Enumeration (VB Beispiel aus der API)

Frage:
Wie lautet das in C# ->> Dim Var_enum As java.util.Enumeration

Vielen Dank

von Paul (Gast)


Lesenswert?

adapter.getAllDeviceContainers();

VStudio sagt mir als Tip für die obere Zeile:

java.util.Enumeration DSPortAdapter.getAllDeviceContainers()

Deshalb meine ich ein Objekt zum abspeichern der Rückgabe vom Typ 
java.util.Enumeration zu benötigen.

evtl. hat Herr Arc Net im Post zuvor schon alles gesagt was nötig ist, 
bloß blick ichs nicht ;-)

Grüße 2all

von Florian (Gast)


Lesenswert?

erzähl mal bitte was diese oneWireApi.net genau ist
und was du da vorhast.
vjslib ist für J#
gibt es die oneWire API nicht direkt als
C# version dann ist dieser umweg nicht nötig.

von Paul (Gast)


Lesenswert?

Die API ermöglicht den Zugriff auf 1-Wire Devices von Maxim Dallas z.B. 
über einen USB Adapter.

Mit eigenen Worten würde bestimmt was fehlen ...

The Java class files from the 1-Wire API for Java were compiled in 
Microsoft J# to create the above .NET library.  Please see the OW.NET 
API Primer for a nice overview/tutorial of the assembly library and how 
to use. Also, make sure that the .NET framework version 2.0 and Visual 
J# redistributable version 2.0 Second Edition are installed prior to 
running or compiling the example programs.  These are available for 
download from Microsoft.  To create your own 1-Wire .NET program, create 
a Visual Studio 2005  project and simply add a reference to the 
OneWireAPI.NET.dll and vjslib (the J# redistributable) libraries.  Then 
start coding. The OneWireAPI.NET.dll library provides powerful 
"Container" classes that wrap the entire functionality of a 1-Wire 
device into easy-to-program methods and properties.

Beispiele sind bis auf eines alle in VB. Das eine C# Beispiel 
beantwortet nicht meine Frage.

Ich kann bisher ein Device an meinem Adapter erkennen und dessen 
Seriennummer auslesen. Supi

von Arc N. (arc)


Lesenswert?

Paul schrieb:
> adapter.getAllDeviceContainers();
>
> VStudio sagt mir als Tip für die obere Zeile:
>
> java.util.Enumeration DSPortAdapter.getAllDeviceContainers()
>
> Deshalb meine ich ein Objekt zum abspeichern der Rückgabe vom Typ
> java.util.Enumeration zu benötigen.
>
> evtl. hat Herr Arc Net im Post zuvor schon alles gesagt was nötig ist,
> bloß blick ichs nicht ;-)
>
> Grüße 2all

War halt die Frage was das werden sollte, eine Portierung der 
Java/VB-Sachen oder nur die Nutzung...
Wenn VS das sagt, dann sollte das so
1
    java.util.Enumeration result;
2
    result = ...getAllDeviceContainers();
gehen.
Obwohl... wenn ich mir das
http://www.maxim-ic.com/app-notes/index.mvp/id/155
so ansehe, hätte ich wahrscheinlich direkt auf TMEX aufgesetzt und nicht 
dieses merkwürde Konstrukt von Maxim genommen...

von Paul (Gast)


Lesenswert?

@ Arc Net:
Vielen Dank - das war der Bringer. Einfach trivial.

Ich wollte halt mal in C#.
Ich dachte bei TMEX müsste ich C verwenden.
Wenn ich das so lese, hab ich mich wohl geirrt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.