Laden...

Forenbeiträge von &(*null)->Hallo Ingesamt 4 Beiträge

21.02.2017 - 12:24 Uhr

In C++ ist folgendes möglich:

++i = ++i + ++i;

Was würde die Console für i anzeigen?


int i=0; 
++i = ++i + ++i;
cout<<"i = "<<i;

Bei mir wurde der Wert 6 angezeigt, erst wurde i dreimal inkrementiert, dann wurde 3 + 3 addiert.

Im C++ -Forum wurde das als Undefined Behavior eingestuft und mir als UB-Test empfohlen:


int i=0, a, b, c; 
a = ++i = (b=++i) + (c=++i); 
cout<<"a = "<<a<<endl; 
cout<<"b = "<<b<<endl; 
cout<<"c = "<<c<<endl; 
cout<<"i = "<<i<<endl;

14.02.2017 - 11:35 Uhr

Hallo,

warum klappt Folgendes nicht:


Task[] tasks = new Task[] { 
                      ()=>{object1.run;}, 
                      ()=>{object2.run;}, 
                      ()=>{object3.run;}, 
                      ()=>{object4.run;}  
};

Es kommt dann die Fehlermeldung, dass ein Lambda kein Delegat sei.

Wenn ich es einzeln machen würde mit Task t=new Task(()=>{...};), klappt es ja normal. Warum nicht bei einem Array wie oben? Es wird doch normal pro Element der Konstruktor Task (Action Action) aufgerufen oder läuft es bei einer Array-Initialisierung anders?

Nach Lektüre der Microsoftl-lib sehe ich als Lösung:


List<Task> tasks = new List<Task>();
foreach(){Task t = new Task( () => {...});}

Es müsste aber auch mit Array wie oben vorgestellt gehen?

Würde das funktionieren?


Task[] tasks = new Task[] { 
                      delegate{object1.run;}, 
                      delegate{object2.run;}, 
                      delegate{object3.run;}, 
                      delegate{object4.run;}  
};

Aber warum funktioniert dann nicht die Schreibweise mit ()=>? Ich habe C#10

22.11.2016 - 10:25 Uhr

In einem Lehrbuch wurde Hashtable.ContainsValue (System.Collections) und ein Beispiel hierzu vorgestellt, welches bei mir nicht funktioniert hat (VS C# 2010). Das inhaltsgleiche, mit new neu erstellte Element (welches nicht Bestandteil der Hashtable ist) wurde trotz Inhaltsgleichheit nicht gefunden.

Meine Hash-Tabelle:



Hashtable hash = new Hashtable();

Gegenstand gegenstand1 = new Gegenstand(101, "Basispreis", 2.33);
Gegenstand gegenstand2 = new Gegenstand(45, "Volitilät", 0.31);
Gegenstand gegenstand3 = new Gegenstand(45, "Marktwert", 3.41);
Gegenstand gegenstand4 = new Gegenstand(6, "Ausübungstermin", 5.12);
Gegenstand gegenstand5 = new Gegenstand(22, "Zinssatz", 1.03);


Diese Gegenstände werden über hash.Add eingefügt.

Hier die zwei Suchfunktionen:



public static void Wertsuche(Hashtable hash, Gegenstand gegenstand)
{
     if (hash.ContainsValue(gegenstand)) Console.WriteLine("enthalten"); else Console.WriteLine("nicht enthalten.");
}

public static void Wertsuche2(Hashtable hash, Gegenstand gegenstand)
{
     bool gefunden=false;

     foreach (Gegenstand item in hash.Values) if (item == gegenstand) gefunden = true;
            
     if (gefunden) Console.WriteLine("enthalten"); else Console.WriteLine("nicht enthalten");
}


Wenn ich nun einen vorhandenen Gegenstand suche, wird er klar von beiden Suchfunktionen gefunden:



Wertsuche(hash, gegenstand3); // --> "enthalten"
Wertsuche2(hash, gegenstand3); // --> "enthalten"


Nicht aber, wenn ich einen inhaltsgleichen neuen Gegenstand erstelle:



Wertsuche(hash, new Gegenstand(45, "Marktwert", 3.41)); // --> "nicht enthalten"
Wertsuche2(hash, new Gegenstand(45, "Marktwert", 3.41)); // --> "nicht enthalten"


Ich vermute daher, dass über Contains.Value und über Hashtable.value == Gegenstand nicht die Inhalte der Variablen abgeglichen werden, sondern ob beide Variablen dieselbe Adresse haben. Liege ich richtig oder ich habe einfach etwas völlig falsch verstanden?

Also Frage bitte: Was wird verglichen in den beiden obigen Suchfunktionen: Der Inhalt der Variablen oder deren Adressen? Wenn Inhalt - warum funktioniert dann der Abgleich der über new neu instanzierten inhaltsgleichen Gegenstände nicht?