Kovertieren von char* nach System::Drawing:Color



  • Hi Leute,

    ich bin hier gerade an einem Netzwerk-Paint zu Gange und habe ein kleines Problem.

    Ich bekomme über das Netzwerk einen String zugeschickt (z.B. "255,147,34,0"), den ich mit folgender Funktion in einen System::Drawing::Color umwandeln will. Die einzelnen Farbewerte werden richtig aus dem CharArray ausgelesen, aber wenn ich die Farbe dann erzeugen will mit diesen Werten, sagt er mir, dass der Alpha-Wert (hier mein a) keine 962342 sein darf. Kann es sein dass ein int nicht zu einem int 32 kompatibel ist?

    Das beste ist aber: Wenn ich das Programm im Debugger laufen lasse (MS Visual Studio 2005), funktioniert das einwandfrei. Der Fehler kommt nur bei der fertigen exe-Datei.

    Hier der Code, es müsste aber alles richtig sein

    Color Konverter::CharArray_to_Color(char* w)
    {
    	char* word;
    	word = w;
    
    	//die vier Farbwert-Informationen werden aus dem String gelesen
    	int a, b, g, r;
            a = CharArray_to_Int(code_teilen(word,','));
    	word = code_spalten(word,',');
    	b = CharArray_to_Int(code_teilen(word,','));
    	word = code_spalten(word,',');
    	g = CharArray_to_Int(code_teilen(word,','));
    	word = code_spalten(word,',');
    	r = CharArray_to_Int(word);
    
    	return Color::FromArgb(a,r,g,b);	
    }
    

    Danke



  • Warum verwendest Du nicht (VC2005 ungetestet):

    String ^s = gcnew String(w);
    array<Char>^chars = {','};
    array<String^> ^arr = str->Split(chars);
    int a = int::Parse(arr[0]);
    int r = int::Parse(arr[1]);
    int g = int::Parse(arr[2]);
    int b = int::Parse(arr[3]);
    return Color::FromArgb(a, r, g, b);
    


  • hm, das Problem ist, dass ich ein char* bekomme.

    Und eigentlich sollte das ja gehen, (tuts ja auch im Debug-Modus)



  • Und was verträgt sich bei "char* w" nicht mit meinem Beispiel?
    Nochmal zu Deinem Beispiel: Da Du nicht verrätst, was CharArray_to_Int und code_teilen macht, ist es schwer zu raten, warum es nicht geht...



  • Es geht ja gar nicht um das Auslesen der Integer-Werte aus dem String (char*). Das funktioniert.

    Das Problem ist das Erzeugen der Farbe mit diesen Werten. Der gibt auf die Weise wie ich das da machen (->FromArgb(... ) eine leere Farbe wieder (Color[Empty]). Und bei der releaseten exe-Datei schmiert das Programm sogar ab.



  • Wenn Du Dich da mal nicht täuscht...
    Wenn er meckert, dass der A-Wert nicht "962342" sein, kann, dann wirst Du ihm auch diesen Wert geben. Somit ist nicht das erzeugen der Farbe das Problem, sondern das umwandeln des Strings in eine Zahl.
    Debug doch einfach mal, dann siehst Du was Du umwandelst...



  • beim Debug in Visual Studio funktioniert das alles ja einwandfrei. Der Alpha-Wert ist bei 255, also normal. Da wird die Farbe auch richtig erzeugt.

    Nur bei der releaseten EXE-Datei, die selbstständig ohne Visual Studio ausgeführt wird, macht er den Fehler. Das ist ja das seltsame. 😕

    Vielleicht muss ich irgendeine Einstellung fürs Kompilieren einstellen. Oder irgendeine DLL einfügen, damit der Release genauso funktioniert wie der Debug-Modus.



  • Wie gesagt, ohne die anderen Funktionen zu kennen, kann man Dir nicht helfen. AUch initialisiert Du "word" überhaupt nicht...



  • word ist ein Pointer auf ein CharArray, es muss nicht initialisiert werden:

    Ok, dann gebe ich hier die Unter-Funktionen frei:

    Wandelt ein CharArray (String) in einen Integer um

    int Konverter::CharArray_to_Int(char* w)
    {
    	int result;
    
    	char letter;
    	char* word;
    	word = w;
    
    	//jede Ziffer im String wird nach einander ausgelesen und der Zehnerpotenz der jeweiligen Stelle multipliziert
    	for (int i = 0; i < (int) strlen(word); ++i)
    	{
    		letter = word[i] - 48;
    		result += letter * (int) pow(10.0,(int) strlen(word) - i - 1);
    	}
    
    	return result;
    }
    

    Hat einen String, der Zahlen enthält, die mit den Zeichen c getrennt sind und streicht die erste Zahl und das Trennzeichen weg (gibt also ab der zweiten Zahl den Rest wieder)

    char* Konverter::code_spalten(char* source, char c)
    {
    	//Abfrage ob die Quelle leer ist
    	if ((source == NULL) || (*source == 0))
    	{
    		return NULL;
    	}
    
    	char* next_cut;
    	next_cut = source;
    	int cut_pos = 0;
    
    	//Zählen der Zeichen bis zum Trennzeichen
    	while (*next_cut != c)
    	{
    		cut_pos++;
    		next_cut++;
    	}
    
    	//Rervieren des Speichers für den Teilstring nach dem Trennzeichen
    	char* out;
    	out = (char*) malloc(sizeof(char) * (strlen(source) - cut_pos + 1));
    
    	//Übergeben des Pointers auf das Zeichen nach dem Trennzeichen
    	out = next_cut + 1;
    
    	return out;	
    }
    

    Bearbeitet die selbe Stringform wie code_spalten, gibt allerdings die erste Zahl wieder (bzw. einen String mit der ersten Zahl)

    char* Konverter::code_teilen(char* source, char c)
    {
    	if ((source == NULL) || (*source == 0))
    	{
    		return NULL;
    	}
    
    	char* next_cut;
    	next_cut = source;
    	int cut_pos = 0;
    
    	//Zählen der Zeichen bis zum Trennzeichen
    	while (*next_cut != c)
    	{
    		cut_pos++;
    		next_cut++;
    	}
    
    	//Reservieren des Speichers für den Teilstring
    	char* out;
    	out = (char*) malloc(sizeof(char) * (cut_pos + 1));
    	int i;
    
    	//Übergabe der Zeichen bis zum Trennzeichen an den Ergebnisstring und anschließend Terminierung
    	for (i = 0; i < cut_pos; ++i)
    	{
    		out[i] = source[i];
    	}
    	out[i] = 0;
    
    	return out;	
    }
    


  • out = (char*) malloc(sizeof(char) * (strlen(source) - cut_pos + 1));
    out = next_cut + 1;
    

    Ich bezweifle irgendwie, daß blanke Pointer unter CLI plötzlich tiefe Kopien erzeugen - da solltest du eher strcpy() verwenden, um den hinteren Teil des Strings zu kopieren (oder der malloc()-Aufruf ist überflüssig und du gibst gleich einen Zeiger in den vorhandenen Datenbereich raus).

    Ansonsten kann es auch helfen, testweise deine Werte mal auszugeben, wenn du der Meinung bist, daß etwas falsch gelaufen ist.

    (PS: und cut_pos mußt du nicht ständig mitschleifen, das kannst du am Ende als "next_cut-source" berechnen ;))



  • Warum musst Du es so kompliziert machen???
    Nimm einfach meinen Vorschlag und dann geht alles... was ist denn Dein Problem damit?


Anmelden zum Antworten