Typdeklaration mit string^



  • Guten Morgen,
    bin gerade wieder dabei, seit längerer Zeit (ca. 5 Jahre) etwas mit vc++ (arbeite grade mit vc++ express 2008) zu programmieren. Habe zum Start ein Programm geerbt, was ich erweitern muss, und stehe vor einem Problem:

    Strings sind immer über string^ deklariert, habe bisher nicht gefunden, was das ^ heisst. Diese deklarierten Strings kann ich aber nicht zwischen Funktionen übergeben:

    String^ msg;
    msg = message; // message Typ String^ - funktioniert
    Logger::NewMsg(msg) // funktioniert nicht, msg von Typ String^. Kein Inhalt in msg
    

    Raffs grade überhaupt nicht, wieso das so ist... was mach ich falsch?

    danke und grüße,

    Daniel


  • Mod

    Das ist kein C++, dass ist C++/CLI.

    Eine Erweiterung der C++ Sprache für die Common-Language-Runtime.

    Das "Hütchen" bedeutet soviel wie "Handle", "Managed-Objekt", oder was immer Du willst.
    Solche Objekte werden vom GC verwaltet.

    Zudem falsches Forum: Ich verschiebe.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • danke, sowas in der Art hab ich mir schon gedacht... aber wieso kann ich den Handle nicht als Funktionsaufruf übergeben? muss ich davor noch konvertieren?



  • verwirrend finde ich auch, dass intellisense funktionen vorschlägt, eine kompilierung erfolgt und bei anschließendem aufruf existieren diese Funktionen nicht mehr...
    Bsp:

    msg->Substring(32)->StartsWith("123") // wird beim eintippen vorgeschlagen, später aber nicht mehr vorhanden laut überwachung
    


  • daniel12345 schrieb:

    verwirrend finde ich auch, dass intellisense funktionen vorschlägt, eine kompilierung erfolgt und bei anschließendem aufruf existieren diese Funktionen nicht mehr...
    Bsp:

    msg->Substring(32)->StartsWith("123") // wird beim eintippen vorgeschlagen, später aber nicht mehr vorhanden laut überwachung
    

    Ja, IntelliSense hat da manchmal etwas Probleme.
    Simon



  • daniel12345 schrieb:

    danke, sowas in der Art hab ich mir schon gedacht... aber wieso kann ich den Handle nicht als Funktionsaufruf übergeben? muss ich davor noch konvertieren?

    Das kommt auf die Signattur von Logger::NewMsg(..) an. Wie sieht die denn aus?
    Simon



  • DAs ist die Signatur in der Logger.h:

    String^ NewMsg(String^);
    


  • daniel12345 schrieb:

    DAs ist die Signatur in der Logger.h:

    String^ NewMsg(String^);
    

    Das scheint zu passen. Und was geht jetzt nicht?
    Ist msg leer? Ist message leer?

    Simon



  • ja genau, das was übergeben wird, ist einfach leer. in der überwachung steht dann, dass die Variable ausserhalb des Zugriffsbereiches ist.



  • also, wenn ich msg (als string^) übergebe, ist in NewMsg die Variable leer...



  • Zeig mal ein wenig mehr Code oder ein Mini Bsp. wo das Problem auftritt.
    An dem was ich hier bis jetzt sehe ist nicht ungewöhnliches oder falsches.

    Simon



  • also, das ist die Logger.cpp:

    #include "stdafx.h"
    #include "string.h"
    
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace System::Net::Sockets;
    
    void Logger::ReadMsg(String^ message)
    {
    String^ msg;
    msg = message;  //Zuweisung funktioniert
    this->GenMessage(msg); // Übergabe an Funktion
    
    }
    
    void Logger::GenMessage(String^ s_Text)
    {
    if (s_Text->Substring(32)->StartsWith("123")) //Fehler: Funktion existiert nicht, s_Text ist leer
    	this->SendMessage("Erfolgreich"); //Funktioniert
    }
    

    das ist im Prinzip alles... Hab mir jetzt grade mal die trial-version von visual studio runtergeladen, vlt. wirds damit ja einfacher



  • void Logger::GenMessage(String^ s_Text) 
    { 
    if (s_Text->Substring(32)->StartsWith("123")) //Fehler: Funktion existiert nicht, s_Text ist leer 
        this->SendMessage("Erfolgreich"); //Funktioniert 
    }
    

    Was heisst hier Funktion existiert nicht?
    Das würde dir der Compiler schon mitteilen.

    Hab mir jetzt grade mal die trial-version von visual studio runtergeladen, vlt. wirds damit ja einfacher

    Wie hast Du denn bis jetzt programmiert? 😮
    Also mit debuggen findet man schon recht viel raus, nur falls Du noch nicht gedebuggt hast...

    Simon



  • hab bisher mit der express-version programmiert, und wechsle jetzt mal probeweise auf die studio-trial...

    theta schrieb:

    void Logger::GenMessage(String^ s_Text) 
    { 
    if (s_Text->Substring(32)->StartsWith("123")) //Fehler: Funktion existiert nicht, s_Text ist leer 
        this->SendMessage("Erfolgreich"); //Funktioniert 
    }
    

    Was heisst hier Funktion existiert nicht?
    Das würde dir der Compiler schon mitteilen.

    Nein, der Compiler teilts mir nicht mit, kompiliert wirds ohne probleme. Aber beim debuggen sagt dann der Überwacher, dass s_Text->Substring(32) nicht vorhanden ist. Hab grade etwas weiter getestet, s_Text->Contains funktioniert. Und um die Weitergabe zwischen Funktionen zu vermeiden, habe ich einen string^ als public in der Logger.h definiert... damit gehts bisher, aber trotzdem verwirrend.


Anmelden zum Antworten