Autor Beitrag
Ploetzi
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 14.11.08 09:10 
Hallo,
ich habe folgenden VBA Code:
ausblenden Quelltext
1:
Public Const ERR As Long = &H81000043					

in C# so geschrieben:
ausblenden C#-Quelltext
1:
public const int ERR = 0x81000043;					


und bekomme jetzt die Fehlermeldung:

Zitat:
Fehler 19 Der Typ "uint" kann nicht implizit in "int" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung

bei
ausblenden C#-Quelltext
1:
public const int ERROR_CODE= 0x83001A03;					

Erhalte ich die Fehlermeldung:
Zitat:
Fehler 1 Der Konstantenwert "2164260865" kann nicht in "int" konvertiert werden. (Verwenden Sie zum Überschreiben die unchecked-Syntax.)


Waere super wenn mir wer helfen koennte, weis echt nimma weiter

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 14.11.08 11:29 
Deine Errorwerte(HRESULTs) sind größer als der von int darstellbare max. Wert. Deshalb interpretiert der Compiler die Werte als unsigned int die du dann selbst einer int Variablen zuweist. Das mag der Compiler nicht. Wen es unbedingt ein int Typ sein muß und kein unsigned int, solltest du den dem HRESULT entsprechenden negativen Dezimalwert zuweisen da es bei einem HRESULT eh nur auf das Bitmuster ankommt.

Also anstatt

0x81000043 nimm -2130706365
0x83001A03 nimm -2097145341
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 14.11.08 19:13 
Müsste es nicht reichen, einen expliziten Cast zu benutzen?
ausblenden C#-Quelltext
1:
public const int ERR = (int) 0x81000043;					

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 15.11.08 13:26 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Müsste es nicht reichen, einen expliziten Cast zu benutzen?
ausblenden C#-Quelltext
1:
public const int ERR = (int) 0x81000043;					


Nein. Egal ob expliziter oder impliziter Cast der Wert bleibt zu groß für int.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 15.11.08 13:27 
Das ist mir klar :roll: Aber der explizite Cast sollte automatisch zu dem negativen int-Wert führen, was viel bequemer ist.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 15.11.08 13:35 
Da hast du recht. Das wäre bequemer. Macht der Compiler aber leider nicht.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 15.11.08 13:41 
Hab's gerade probiert, tatsächlich muss man noch ein unchecked einsetzen:
ausblenden C#-Quelltext
1:
public const int ERR = unchecked((int)0x81000043);					


Da war ich wohl zu sehr den Oxygene-Compiler gewöhnt, der verlangt nicht das man einen expliziten Cast noch mal expliziter macht *g*

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 15.11.08 13:49 
8) Dachte man könnte unsafe nur im Context einer Methode anwenden. Ist nicht wirklich schön, aber lesbarer als selbst umzurechnen ist es auf jeden Fall.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 15.11.08 16:43 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
8) Dachte man könnte unsafe nur im Context einer Methode anwenden.
unsafe ist wieder was Anderes ;) . Eigentlich sollte dich der Compiler bei public const int ERR = (int0x81000043; auch auf unchecked hinweisen.
Und dass C# unchecked hier verlangt, finde ich gut, muss/sollte man schließlich im restlichen Code auch machen, wenn man einen Overflow zulassen will.

_________________
>λ=
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 15.11.08 16:49 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Und dass C# unchecked hier verlangt, finde ich gut, muss/sollte man schließlich im restlichen Code auch machen, wenn man einen Overflow zulassen will.
Ich find das überflüssig. Ich bekomme erst den Hinweis, dass uint nicht implinzit in int konveritert werden kann, aber eine explizite Konvertierung existiert. Und wenn ich die dann benutze, reicht das immer noch nicht (ich stelle mir hier ein lautes "Ätsch!" aus Richtung Compiler vor).

Wollen Sie uint in int konvertieren? - Ja
Wirklich? - Ja!
Sind Sie sich sicher? - Ja!!
Ganz sicher?
...

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Aconcagua
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 23.12.08 21:28 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Und dass C# unchecked hier verlangt, finde ich gut, muss/sollte man schließlich im restlichen Code auch machen, wenn man einen Overflow zulassen will.
Ich find das überflüssig. Ich bekomme erst den Hinweis, dass uint nicht implinzit in int konveritert werden kann, aber eine explizite Konvertierung existiert. Und wenn ich die dann benutze, reicht das immer noch nicht (ich stelle mir hier ein lautes "Ätsch!" aus Richtung Compiler vor).

Wollen Sie uint in int konvertieren? - Ja
Wirklich? - Ja!
Sind Sie sich sicher? - Ja!!
Ganz sicher?
...


Man betrachte mal folgendes:

ausblenden C#-Quelltext
1:
2:
3:
long l = int.MaxValue + 1L;
Console.WriteLine((int) l);
Console.WriteLine(int.MinValue);

In beiden Zeilen wird dann - oh großes Wunder - beide Male dieselbe Zahl geschrieben - also insbesondere tritt keine Ausnahme auf (VS 2005).

Wenn ein Überlauf kritisch und es somit interessant sein könnte, zu unterscheiden, ob man ihn zulassen will oder nicht, dann
doch bei der Konvertierung von Variablen - dabei kann kommt es doch normalerweise zu den versehentlichen Überläufen.

Wenn das nicht zwischenzeitlich geändert worden ist (gerade kein VS 2008 zur Hand - kann das jemand bestätigen oder widerlegen?) , dann ist das unchecked wirklich unsinnig.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 23.12.08 22:08 
user profile iconAconcagua hat folgendes geschrieben Zum zitierten Posting springen:
In beiden Zeilen wird dann - oh großes Wunder - beide Male dieselbe Zahl geschrieben - also insbesondere tritt keine Ausnahme auf (VS 2005).
Nicht unbedingt, das hängt vom "/checked"-Switch ab.
Eigentlich ist das Konzept in sich völlig schlüssig: Ausdrücke, bei denen man einen Überfluss hinnehmen/verhindern will, umgibt man explizit mit unchecked/checked; den Rest des Codes stempelt man damit implizit mit "hier sollte eigentlich kein Overflow vorkommen" ab. Debuggt man nun mit /checked+, wird man auf alle weiteren Overflows hingewiesen, im Release-Build sind diese zusätzlichen Abfragen der Performance zuliebe verschwunden.
VS benutzt nun in den Standardeinstellungen leider selbst beim Debug-Build /checked-, womit der Sinn von unchecked schon ein wenig infrage gestellt wird. Aber nicht jeder benutzt die Mainstream-Settings, also immer schön unchecked benutzen, wenn man einen Overflow provozieren will ;) .

Das Ganze geht aber eigentlich an der Diskussion vorbei :mrgreen: , denn Konstanten werden ja zur Compile Time ausgewertet, da hat kein Compiler-Schalter Auswirkungen.

@Christian: Angenommen, ich habe irgendwoher (andere Assembly?) eine uint-Konstante, rechne damit ein bisschen herum und will es dann in einer int-Konstanten speichern. Und wundere mich dann, warum ein negativer Wert herauskommt... und was das gerade für ein realistisches Beispiel ist :mrgreen: [*]. Nunja, "ich will nen anderen Typ" und "bitte ohne Warnanlage" sind aber einfach zwei verschiedene Aussagen an den Compiler, zur Compile- und zur Runtime. So :schmoll: ;) .

[*]Genauso realitätsfern wie imho das gesamte Thema :gruebel: . Overflow in Konstanten... ich bin immer davon ausgegangen, dass man uint-Werte am besten in uint-Konstanten speichert :D .

_________________
>λ=