Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C# Char nach Int32: aus 3 wird 51 (https://www.delphipraxis.net/49188-char-nach-int32-aus-3-wird-51-a.html)

CalganX 6. Jul 2005 19:38


Char nach Int32: aus 3 wird 51
 
Hi,
ich versuche gerade ein wenig mit Strings und Integern herum zu hantieren. Leider funktioniert das nicht ganz so, wie ich das gerne hätte. :(

Ich habe also einen String in ein Array of Char packen können. Nun will ich aber alle Elemente dieses Arrays als Zahlen haben, also dachte ich mir - schlau wie ich bin -, dass ich mit Convert.ToInt32 eigentlich auf das gewünschte Ergebnis kommen würde. Aber leider dann doch nicht. :?
Ich habe mit Debuggen bereits herausgefunden, dass in dem entsprechenden Array-Element '3' drin steht. Nach der Umwandlung in Int32 ist die int-Variable mit dem Wert 51 gefüllt. Sozusagen das 17fache von 3. Aber warum? Ich kann eigentlich keinen Fehler entdecken. :gruebel:

Meine Methode sieht so aus:
Code:
   char cCurThing = ISBN.ToCharArray()[idx-1]; // idx ist eine beliebige Integervariable. cCurThing hat lt. Debugging auch den richtigen Wert (z.B. '3')

   int iCurThing = Convert.ToInt32(cCurThing); // hier hapert's: denn cCurThing hat immer noch den richtigen Wert, aber iCurThing bekommt den Wert 51, obwohl cCurThing eigentlich '3' ist

   iCheckSum = idx * iCurThing;
Hat jemand eine gute Idee?

Chris

Olli 6. Jul 2005 19:45

Re: Char nach Int32: aus 3 wird 51
 
Geht in C# kein normaler C++-Cast mehr?

Code:
int iCurThing = int(cCurThing);

NicoDE 6. Jul 2005 19:48

Re: Char nach Int32: aus 3 wird 51
 
Zitat:

Zitat von Chakotay1308
Sozusagen das 17fache von 3.

Ich würde eher sagen: das (16+1)-fache.
Oder anders ausgedrückt: 3 or 3 shl 16

CalganX 6. Jul 2005 19:48

Re: Char nach Int32: aus 3 wird 51
 
Hi Olli,
naja... geben tut es das schon:
Code:
iCurThing = (int) cSomeThing;
Aber dabei habe ich genau das gleiche Problem. ;)

@Nico: ähm. Ja, und?

Chris

JasonDX 6. Jul 2005 19:50

Re: Char nach Int32: aus 3 wird 51
 
cCurThing hat den Wert '3'
nach dem Convert hat iCurThing den Wert 51
Man beachte die >'< ;)
Soll heißen: Du hast sowas ähnliches wie den Ascii-Code ;)
versuch mal nicht 3 im String an der Stelle stehn zu haben, sondern 4
dann wird der integerwert 52 sein ;)
Dass du aus einem Char den wirklichen Integerwert bekommst musst du ihn erst in einen String umwandeln:
Code:
Convert.ToInt32(cCurThing.ToString())

Khabarakh 6. Jul 2005 19:54

Re: Char nach Int32: aus 3 wird 51
 
Es gibt sogar eine Methode "Char.GetNumericValue", die gibt aber Double zurück:
Code:
char c = '3';
int i = (int)Char.GetNumericValue(c);
Console.WriteLine(i);
Console.ReadLine();

Olli 6. Jul 2005 19:58

Re: Char nach Int32: aus 3 wird 51
 
Zitat:

Zitat von Chakotay1308
Code:
iCurThing = (int) cSomeThing;

Kannst ruhig einen C++-style-Cast benutzen. Es müssen ja nicht immer alle Dämlichkeiten von C weitergepflegt werden! "int(Bla)" ist nämlich besser lesbar/verstehbar als "(int)Bla".
Zumal ja gerade Operatoren für Typumwandlung seit C++ existieren und so nichtmal das Argument zieht, daß "int(Bla)" einem Funktionsaufruf zu ähnlich sähe.

@Chimaira: Du hast vollkommen recht. :wall:

CalganX 6. Jul 2005 20:02

Re: Char nach Int32: aus 3 wird 51
 
Hi,
@Mike: ah. :idea: So geht's. Habe mir schon fast gedacht, dass es damit zusammenhängt, aber wusste nicht, wie ich das Umgehen konnte. :) Danke dir! :thumb:

@Sebastian: naja, dann habe ich aber zwei Umwandlungen auf einmal. ;) Das kostet mehr Zeit. :tongue:

@Olli: Naja... int(bla) geht aber nicht. :zwinker:

Chris

Khabarakh 6. Jul 2005 20:07

Re: Char nach Int32: aus 3 wird 51
 
Ich sehe nicht, dass Chimaira weniger hätte :P .

Olli 6. Jul 2005 20:08

Re: Char nach Int32: aus 3 wird 51
 
Zitat:

Zitat von Chakotay1308
@Olli: Naja... int(bla) geht aber nicht. :zwinker:

:gruebel: wie jetzt? C# hat diesen Stil wieder abgeschafft? Oder meinst du, daß die Umwandlung eines ASCII-Zeichens von '0'..'9' nicht geht. Doch geht - aber nur mit Subtraktion! Das war aber deiner anfänglichen Frage nicht zu entnehmen.

CalganX 6. Jul 2005 20:11

Re: Char nach Int32: aus 3 wird 51
 
Hi,
@Sebastian: :wall: Stimmt. :oops:

@Oliver: naja, es geht technisch nicht. ;) Der Debugger meckert einfach.

Chris

Robert_G 6. Jul 2005 20:16

Re: Char nach Int32: aus 3 wird 51
 
@Chris
Nico wollte damit andeuten, dass char unicode enthält. ;)
Zitat:

Zitat von Olli
Zitat:

Zitat von Chakotay1308
@Olli: Naja... int(bla) geht aber nicht. :zwinker:

:gruebel: wie jetzt? C# hat diesen Stil wieder abgeschafft?

@Olli ein direkter cast auf einen falschen Typen führt in C# zu einer null reference als Rückgabewert.
Ein safe cast auf einen falschen Typen (x as SomeType) führt zur Exception.
Bei value types führt es unweigerlich zur Exception, da value types in .Net keine null references sein können.
Zitat:

Oder meinst du, daß die Umwandlung eines ASCII-Zeichens von '0'..'9' nicht geht. Doch geht - aber nur mit Subtraktion! Das war aber deiner anfänglichen Frage nicht zu entnehmen.
Dafür gibt es die Convert Klasse und gut ist. ;)
Für eigene Klassen/value types kann man den Operator für implizite oder explizite Umwandlung überladen.
Es gibt diese Überladung zum Bleistift für einen expliziten Cast von Char <-> Int32.

Olli 6. Jul 2005 20:23

Re: Char nach Int32: aus 3 wird 51
 
Zitat:

Zitat von Robert_G
@Olli ein direkter cast auf einen falschen Typen führt in C# zu einer null reference als Rückgabewert.

Wenn in int(Bla) das Bla vom Typ char wäre, wäre der Cast aber gültig. Oder hat sich soviel geändert und die Integertypen sind untereinander nicht mehr kompatibel? Klärt mal auf.

nailor 6. Jul 2005 20:27

Re: Char nach Int32: aus 3 wird 51
 
der "harte" typecast geht in c# weiterhin (sofern man jetzt nich irgendwas absolut unmögliches machen will) mit den implicit/explicit typecasts. das problem scheint mir hier wirklich das verwechseln des "ASCII"-Wertes (oder was auch immer es jetzt genau ist) mit der Zahl, die dieser Wert darstellt zu sein.

btw: der gute alte freund google: http://www.cs.arizona.edu/classes/cs...ndouts/10.html

Robert_G 6. Jul 2005 20:59

Re: Char nach Int32: aus 3 wird 51
 
Zitat:

Zitat von nailor
der "harte" typecast geht in c# weiterhin (sofern man jetzt nich irgendwas absolut unmögliches machen will) mit den implicit/explicit typecasts.

Aber nur wenn man den explicit/implicit Operator überlädt!!!
Code:
class X{}

class Y{}

struct A{}

struct B{}


class Z
{
  void Miep()
  {
   
    X x = new X();
    Y y = (Y)x; // null reference

    A a = new A();
    B b = (B)a; // boom, da b nicht null sein darf!   
  }
}
[edit=alcaeus]Code-Tag repariert ;) Mfg, alcaeus[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz