[gelöst]cannot convert from 'const char *' to 'char *' - Besitze unzureichnede Kenntniss



  • Hallo erst einmal 🙂

    Ich versuche seit geraumer Zeit den code eines Spiels unter VC++ 2005 Express zu compilieren.
    Ich habe einige Artikel gelesen und auch schon hier im forum ein bischen geschaut(ich hab leider keie Suchfunktion gefunden, und mich so ein bischen durchgeklickt), leider habe ich bisher nichts gefunden was mir bei diesem Problem geholfen hat.
    Liegt bestimmt auch an meiner ungenügenden C++ Kenntniss, jedoch arbeite ich daran dies zu ändern (was sich ohne abitur und IT-Diplom als ungeheuer schwer herrausstellt wenn es um Datentypen geht, besonderst durch die extensive Implementation von extern linguistischen Elementen innerhalb vitaler Segmente der Tutorien 😕 ).

    Folgender Fehler den ich nicht beheben konnte wird ausgegeben:
    error C2440: '=' : cannot convert from 'const char *' to 'char *'

    void EventArgDef::Setup( const char *eventName, const char *argName, const char *argType, const char *argRange )
    {
    	char        scratch[ 256 ];
    	const char  *ptr;
    	char        *tokptr;
    	const char  *endptr;
    	int         index;
    
    	// set name
    	name = argName;
    
    	// set optionality
    	if ( isupper( argType[ 0 ] ) )
    	{
    		optional = true;
    	}
    	else
    	{
    		optional = false;
    	}
    
    	// grab the ranges
    	index = 0;
    	memset( minRangeDefault, true, sizeof( minRangeDefault ) );
    	memset( minRange, 0, sizeof( minRange ) );
    	memset( maxRangeDefault, true, sizeof( maxRangeDefault ) );
    	memset( maxRange, 0, sizeof( maxRange ) );
    
    	if ( argRange && argRange[ 0 ] )
    	{
    		ptr = argRange;
    		while( 1 )
    		{
    			// find opening '['
    			tokptr = strchr( ptr, '[' );//hier tritt der fehler auf, laut compiler
    			if ( !tokptr )
                {
    				break;
                }
    			// find closing ']'
    			endptr = strchr( tokptr, ']' );//hier wird er dann sicher auch noch auftreten
    			if ( !endptr )
                {
    				assert( 0 );
    				EVENT_WDPrintf( "Argument defintion %s, no matching ']' found for range spec in event %s.\n", name.c_str(), eventName );
    				break;
                }
    			// point to the next range
    			ptr = endptr;
    			// skip the '['
    			tokptr++;
    			// copy off the range spec
    			// skip the ']'
    			strncpy( scratch, tokptr, endptr - tokptr );
    			// terminate the range
    			scratch[ endptr - tokptr ] = 0;
    			// see if there is one or two parameters here
    			tokptr = strchr( scratch, ',' );
    			if ( !tokptr )
                {
    				// just one parameter
    				minRange[ index >> 1 ] = (float)atof( scratch );
    				minRangeDefault[ index >> 1 ] = false;
    				index++;
    				// skip the second parameter
    				index++;
                }
    			else if ( tokptr == scratch )
                {
    				// just second parameter
    				// skip the first paremeter
    				index++;
    				tokptr++;
    				maxRange[ index >> 1 ] = (float)atof( scratch );
    				maxRangeDefault[ index >> 1 ] = false;
    				index++;
                }
    			else
                {
    				qboolean second;
    				// one or two parameters
    				// see if there is anything behind the ','
    				if ( strlen( scratch ) > ( tokptr - scratch + 1) )
    					second = true;
    				else
    					second = false;
    				// zero out the ','
    				*tokptr = 0;
    				minRange[ index >> 1 ] = (float)atof( scratch );
    				minRangeDefault[ index >> 1 ] = false;
    				index++;
    				// skip over the nul character
    				tokptr++;
    				if ( second )
    				{
    					maxRange[ index >> 1 ] = (float)atof( tokptr );
    					maxRangeDefault[ index >> 1 ] = false;
    				}
    				index++;
                }
    		}
    	}
    
    	// figure out the type of variable it is
    	switch( tolower( argType[ 0 ] ) )
    	{
    	case 'e':
    		type = IS_ENTITY;
    		break;
    	case 'v':
    		type = IS_VECTOR;
    		break;
    	case 'i':
    		type = IS_INTEGER;
    		break;
    	case 'f':
    		type = IS_FLOAT;
    		break;
    	case 's':
    		type = IS_STRING;
    		break;
    	case 'b':
    		type = IS_BOOLEAN;
    		break;
    	}
    }
    

    Ich würde mich über ein paar tips oder expliziete Hinweisse wirklich sehr freuen.
    Besonderst auch weil ich diesen code seit Jahren compilieren wollte und es bisher immer scheiterte.

    Danke
    IS



  • Die Meldung besagt einfach, dass man einen pointer auf const nicht in einen normalen Pointer verwandeln kann. Da du dir nicht die Mühe gemacht hast deinen Code auf das wesentliche zu reduzieren und hier sicher keiner Lust hat, die 120 Zeilen nach dem Fehler zu durchsuchen, kann dir auch nicht viel weiter geholfen werden. Abgesehen davon scheints sich bei deinem Code eher um C als um C++ zu handeln.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Auf wenige Zeilen reduziert:

    Wie kann ich folgenden Fehler umgehen, bzw beheben?

    const char  *ptr;
    char        *tokptr;
    // find opening '['
    tokptr = strchr( ptr, '[' ); // ERROR=cannot convert from 'const char *' to 'char *'
    


  • ^^na, wenn das 'const' stört, dann mach's doch einfach weg, also aus 'const char *ptr' mache er ein 'char *ptr'
    🙂



  • Danke. 🙂

    Nun tritt der Fehler leider weiter oben auf.
    Da es sich hier um ein Spiel handelt denke ich dass es sinnvoller währe
    innerhalb der Funktion eine Lösung zu finden, und die Parameter
    nicht zu verändern, so dass möglichst wenig umgeschrieben werden muss.
    Oder liege ich da falsch ?

    void EventArgDef::Setup( const char *eventName, const char *argName, const char *argType, const char *argRange )
    {
    const char  *ptr;
    
     if ( argRange && argRange[ 0 ] )
     {
     ptr = argRange;
    
     ...
     }
    
    ...
    }
    


  • ^^das ist der 'const is a virus'-effekt. 😉
    das einfachste dürfte wohl sein, wenn du alle 'const' aus dem code entfernst.
    🙂



  • pumuckl schrieb:

    Abgesehen davon scheints sich bei deinem Code eher um C als um C++ zu handeln.

    Manchmal geht mir dieser Quark echt zu weit. Das ist offensichtlich kein C, sondern C++. Das ist auch eine Fehlermeldung, die es in C überhaupt nicht gibt.



  • Mein problem ist dass zwar der meiste code für die Spiel-Logik verfügbar ist aber
    leider nicht alles, zusätzlich ist der Engine Code auch nicht verfügbar.

    Von daher gehe ich davon aus dass ich solche deratigen massiven Eingriffe
    nicht mit einer realen Erfolgs-Aussicht vornehmen kann.

    Der code ist C++, und hat zum Beispiel auch auf die ID-Tech4 Engine(Doom3) Einfluß genommen. Die meisten Ideen/Techniken die die speziell an diese Engine gekoppelt waren sind heute (endlich) standard.



  • Bashar schrieb:

    Das ist auch eine Fehlermeldung, die es in C überhaupt nicht gibt.

    in C gibts mindestens ein warning.

    illustris senicis schrieb:

    Von daher gehe ich davon aus dass ich solche deratigen massiven Eingriffe
    nicht mit einer realen Erfolgs-Aussicht vornehmen kann.

    kommt drauf an. wenn du's einfach nur zum laufen bringen willst, dann: 'search and replace' in allen files und jedes auftreten des einzelnen wörtchens 'const' durch nichts ersetzen. wenn du aber bestehenden, lauffähigen code weiterentwickeln willst, dann macht man sowas natürlich nicht.
    🙂



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Bashar schrieb:

    Manchmal geht mir dieser Quark echt zu weit. Das ist offensichtlich kein C, sondern C++. Das ist auch eine Fehlermeldung, die es in C überhaupt nicht gibt.

    Das enzige, woran das offensichtlich ist, ist die Signatur - bei der ich leider nur auf die Argumente geachtet habe. mea culpa. Alles andere (char* mit diversen strXY-Funktionen, memset, atoi) ist purer C-Code.



  • Hat keiner einen Vorschlag oder eine Idee wie man dies
    innerhalb der Funktion selbst lösen könnte ? 😞


  • Mod

    Wäre das C, wäre das legal (wenn wir den C++ - spezifischen Teil wegdenken) strchr ist dort als

    char *strchr(const char *s, int c);
    

    deklariert. Offensichtlich ist das nicht const-korrekt und würde im in undefiniertem Verhalten enden, falls argRange zufällig auf ein Stringliteral zeigt. Denn diese Funktion modifiziert diesen String (Zeile 88). Folglich ist die Funktionssignatur falsch also gelogen:

    void EventArgDef::Setup( const char *eventName, const char *argName, const char *argType, char *argRange )
    

    nebst folgender Anpassungen behebt dieses Problem (wir könnten immer noch ein Literal übergeben, aber das ist eine andere Geschichte).



  • ;fricky schrieb:

    kommt drauf an. wenn du's einfach nur zum laufen bringen willst, dann: 'search and replace' in allen files und jedes auftreten des einzelnen wörtchens 'const' durch nichts ersetzen. wenn du aber bestehenden, lauffähigen code weiterentwickeln willst, dann macht man sowas natürlich nicht.
    🙂

    Also, der Pelle ist da strikt const char* != char *, also gibt's einen handfesten error. Ich hab' das const immer weggeschmissen ohne negative Wirkungen - angeblich macht es irgendwas stabiler oder sorgt für eine Typensicherung odser so.
    Ich bin vermutlich in der Hinsicht einfach ignorant, aber was ggf. blöd rummotzt, obwohl das Zeug prima läuft, wird gekillt.

    Aber vielleicht will jemand erklären, wozu das const'en wirklich gut sein soll ...


  • Mod

    pointercrash() schrieb:

    ;fricky schrieb:

    kommt drauf an. wenn du's einfach nur zum laufen bringen willst, dann: 'search and replace' in allen files und jedes auftreten des einzelnen wörtchens 'const' durch nichts ersetzen. wenn du aber bestehenden, lauffähigen code weiterentwickeln willst, dann macht man sowas natürlich nicht.
    🙂

    Also, der Pelle ist da strikt const char* != char *, also gibt's einen handfesten error. Ich hab' das const immer weggeschmissen ohne negative Wirkungen - angeblich macht es irgendwas stabiler oder sorgt für eine Typensicherung odser so.
    Ich bin vermutlich in der Hinsicht einfach ignorant, aber was ggf. blöd rummotzt, obwohl das Zeug prima läuft, wird gekillt.

    Aber vielleicht will jemand erklären, wozu das const'en wirklich gut sein soll ...

    So jemand wird es sicher geben, dieser Thread ist allerdings nicht dazu da. Zumal das Thema oft genug wiedergekäut wird.



  • camper schrieb:

    void EventArgDef::Setup( const char *eventName, const char *argName, const char *argType, char *argRange )
    

    *(Die Deklaration in der .h Datei habe ich selbstverständlich gleich mit geändert)

    Danke 🙂
    Dies hat dieses Problem erst einmal behoben, allerdings währe mir eine Umwandlung lieber gewesen.
    Da ich nicht sagen ob alles funktionieren wird, weil der code ja nur teilweisse
    zugänig ist und noch einige Fehler vorhanden sind an anderer stelle, die ich
    aber zunächst einmal selbst beheben möchte.

    Gibt es sonst keine Möglichkeit hier eine Umwandlung vorzunehmen oder macht dies absolut keinen Sinn ? 😕


  • Mod

    tokptr wird in der Funktion für verschiedene Quellen benutzt, ab Zeile 58 zeigt es in scratch und nur ab hier muss der zugrunde liegende String modifizierbar sein. Die einfachste Lösung ist also, in der Ausgangsfunktion:
    strtok als const char* zu definieren (Zeile 5), und
    in Zeile 58 einen neuen Zeiger zu definieren:

    char* tokptr = strchr( scratch, ',' );
    

    was nichts daran ändert, dass die gesamte Funktion furchtbar und viel zu lang ist und hre Eingangsdaten ungenügend prüft, was unter anderem zu einem Pufferüberlauf führen kann.



  • Noch mal danke 🙂
    Der Funktion sind weitere Funktionen vorgeschaltet.
    Ich kann erlich noch nicht die Qualität dieses codes beurteilen,
    anscheinend soll er schnell sein.


Anmelden zum Antworten