C++.NET: Umwandlung eines Strings in eine Integer Zahl

DaSashStYle

Mitglied
Ich habe folgendes Problem.

Ich sitze hier grade in einem C++-Kurs. Hier haben wir einen Code bekommen. Im moment Progammieren wir nur für die Console.

So haben wir eine Stelle

Code:
		String* input = Console::ReadLine();		
		int frequenz = input->ToInt32(0);

Hier soll eine Eingabe die in der Console Getätigt wurde auf einen String geladen werden und nachher in eine 32-Bit IntegerZahl konvertiert werden.

Bei dem Befehl (Klasse,Methode, was auch immer) ToInt32(0) verstehe ich nicht, warum man eine 0 in die klammern schreibt. Welche Zahlen wären noch möglich und was bedeuten diese?

Hoffe mir kann da jemand weiterhelfen.

Danke schonmal im vorraus.
 
Hallo,

also der Code, den du gepostet hast, erscheint mir schon etwas seltsam. Erstmal werden bei Managed C++ (wenn man mit der .NET-Bibliothek arbeitet) die Zeiger mit "^" verwendet, weil das Speicherbereiche sind, die vom Garbage Collector verwaltet werden. Außerdem hat die Klasse "String" keine Methode "ToInt32()". Dafür wird die Klasse "Convert" verwendet und der String als Parameter übergeben.

Richtig sollte es so sein:
C++:
String^ input = Console::ReadLine();
int frequenz = Convert::ToInt32(input);

Ansonsten ist bei solchen Fragen immer der Blick in die .NET-Klassenreferenz sehr hilfreich: http://msdn2.microsoft.com/de-de/library/ms306608(vs.80).aspx

Gruß
MCoder
 
Danke dir! das Programm hatte aber so auch funktioniert.
Ich habe gelernt, dass man die Zeiger mit einem "*" kennzeichnet. So greift der auf die Speicheradresse zu. Dies soll man wohl so machen, wenn man auf Klassen zugreift. Habe das irgendwie noch nicht so ganz verstanden warum man das macht. Von Java kenn cih das zum beispiel so, dass man die Klasse so initialisiert:
Beispiel.

Schatzplan schatz;

in C++ sollte das dann so aussehen:

Schatzplan *schatz;

Man soll in C++ also nur mit dem Pointer initialisieren können. Warum ist das so?

Erstellt man Referenzen mit einem " & " ? So habe ich es zumindest gelernt.
 
Zuletzt bearbeitet:
ch habe gelernt, dass man die Zeiger mit einem "*" kennzeichnet. So greift der auf die Speicheradresse zu. Dies soll man wohl so machen, wenn man auf Klassen zugreift.
Das ist richtig. Aber die Java-Variante funktioniert auch in C++. Allerdings ist die Arbeitsweise unterschiedlich. Während bei Java grundsätzlich immer Referenztypen angelegt werden, erzeugt die Schreibweise "Schatzplan schatz;" einen Werttyp, der auf dem Stack der aktuellen Funktion angelegt wird und auch nur innerhalb der Funktion verfügbar ist. Das reicht in vielen Fällen aus und man hat kein Stress mit Aufräumen (delete).

Soll das Objekt allerdings auch ausserhalb der Funktion verwendet werden, muss ein Referenztyp angelegt werden.
Der Referenztyp sieht so aus:
C++:
Schatzplan *schatz = new Schatzplan();

//...

delete schatz; // Wichtig, sonst gibt's ein Speicherloch
oder
C++:
Schatzplan *schatz = Funktion_Die_Einen_Zeiger_Liefert(); // Hier ist die Gretchenfrage: Wer räumt auf?
Der große Unterschied zu Java ist das Reservieren/Freigeben von Speicher. Während die Runtime von Java (oder auch C#) den Speicher automatisch verwaltet (Stichwort: Garbage Collector), muss sich bei C/C++ der Programmierer selber darum kümmern.

Mit "&" bekommt man den die Adresse eines als Werttyp angelegten Datentyps bzw. kann bei Funktionsdeklarationen die Übergabe eine Referenztyps deklarieren.

das Programm hatte aber so auch funktioniert
Zmindest der Part mit der Konvertierung hätte eigentlich im Ursprungscode nicht funktionieren dürfen, weil die String-Klasse keine Methode "ToInt32" besitzt.

Sobald du mit der .NET-Bibliothek arbeitest, kommt eine Besonderheit ins Spiel: Microsoft hat das C++ aufgebohrt und ein sogenanntes "Managed C++" daraus gemacht. Damit kommt man wieder in den Genuss eines Garbage Collectors, d.h. die Runtime kümmert sich um das Anlegen und Freigeben von Speicher. Solcherart Speicher wird nicht "*" sondern mit "^" definiert. Zumindest bei der Verwendung von Klassen aus der .NET-Bibliothek sollte man das auch so einsetzen.

Gruß
MCoder
 
Ja, in unserem Kurs arbeiten wir ja mit der .Net-Bibliothek von dem microsoft visuell studio. Denke mal, dass es deshalb funktioniert mit der ToInt32 Methode. Ich brauch halt nur eine erklärung dafür, warum ich ToInt(0) schreiben muss. Also was die 0 in den klammern aussagt. Ich kann auch in der Visuell-Studio Hilfe keine Erklärung dazu finden.
 
Also ich verstehe nicht, dass sich der Code aus deinem allerersten Post:
C++:
String* input = Console::ReadLine();		
int frequenz = input->ToInt32(0);
überhaupt kompilieren lässt. Bei mir (Visual Studio 2005) hagelt's Fehlermeldungen. Es funktioniert nur so:
C++:
String^ input = Console::ReadLine();
int frequenz = Convert::ToInt32(input);
Da hat sich dann die Frage nach dem Parameter "0" erledigt, weil's den schlichtweg so nicht gibt :-)

Gruß
MCoder
 
Hi.
Ja, in unserem Kurs arbeiten wir ja mit der .Net-Bibliothek von dem microsoft visuell studio. Denke mal, dass es deshalb funktioniert mit der ToInt32 Methode.
Das es funktioniert ist nicht der Punkt. Auf http://msdn2.microsoft.com/de-de/library/system.string.system.iconvertible.toint32(VS.80).aspx ist zu lesen:
Diese Methode unterstützt die .NET Framework-Infrastruktur und ist nicht für die direkte Verwendung in Code bestimmt.
Man verwendet in der Tat die Convert::ToInt32() Methode wie MCoder bereits sagte.

@MCoder: C++/CLI wird soweit ich weiß erst seit Visual Studio 2005 unterstützt. In früheren Versionen muß man noch mit dem * arbeiten.

Ich brauch halt nur eine erklärung dafür, warum ich ToInt(0) schreiben muss. Also was die 0 in den klammern aussagt. Ich kann auch in der Visuell-Studio Hilfe keine Erklärung dazu finden.
Man kann dort einen Zeiger auf einen IFormatProvider angeben, der angibt wie die Eingabe interpretiert werden kann bzw. muß um die Konvertierung durchzuführen. Hier (http://msdn.microsoft.com/library/d.../html/frlrfsystemconvertclasstoint32topic.asp) ist Beispielcode zur Verwendung eines IFormatProviders.

Gruß
 
ja, das mit dem Studio kann angehen, wir arbeiten mit dem 2003er. Das mit dem input macht das ganze auch verständlicher. dneke mal, dass es nichts anderes heißt als input. Danke euch Leute. Sollte ich noch mehr darüber in Erfahrung bringen, werde ich es hier reinstellen.
 
Hab ich schon fast geahnt, dass das die Unterschiede zwischen VS2003 und 2005 die Ursache für die Verständigungsprobleme sind. Na ja, da habe ich echt eine Lücke, denn die 2003er Version habe ich komplett ausgelassen :-)

Gruß
MCoder
 
Zurück