char zuweisen und return, aber konvertierungsfehler



  • Direkt aus der MSDN: Suchwort strcpy

    Example
    // crt_strcpy.c
    /* This program uses strcpy
    * and strcat to build a phrase.
    */

    #include <string.h>
    #include <stdio.h>

    int main( void )
    {
    char string[80];
    // Note that if you change the previous line to
    // char string[20];
    // strcpy and strcat will happily overrun the string
    // buffer. See the examples for strncpy and strncat
    // for safer string handling.
    strcpy( string, "Hello world from " );
    strcat( string, "strcpy " );
    strcat( string, "and " );
    strcat( string, "strcat!" );
    printf( "String = %s\n", string );
    }

    Ich hoffe das klärt einiges 😃

    EDIT: M=M+1 ergibt bei dir z.Z. immer 1, egal wie oft du die function aufrust - solltest du vlt bedenken. Dann lieber: static char M;



  • Hallo,

    nebenbei solltest du M noch initialisieren, denn sonst steht da irgendwas drin, was du nicht willst. Außerdem hast du ein Speicherleck, wenn du den Speicher für tag nicht mit delete[] wieder freigibst.



  • ..hmm, genau nach diesem Beispiel hab ich das gemacht, wo mein Fehler(im Aufruf?)
    liegt weiss ich aber trotzdem nich 😞

    ...Denkanstoss?

    P.S.: die Initialisierung von M is im Beispiel ein busschen verrutscht, aber da
    und beim delete[] meckert er auch, aber daher kommt ja mein Fehler nich oder?

    Stew



  • case 1: strcpy(*tag,"MO");
    

    Evtl. mal das Sternchen wegmachen?!



  • ...verdammt, hab mir eingebildet das schon probiert zu haben, omg.

    DANKE!! @alle

    Stew



  • StewDent84 schrieb:

    und beim delete[] meckert er auch, aber daher kommt ja mein Fehler nich oder?

    Wo hast du das denn jetzt stehen?



  • ...habs nachm return (kam mir selber komisch vor) und nach Funktionsaufruf probiert, weil muss ja erstma übergeben werden bevor ich löschen kann, oder lieg ich da falsch.

    Stew



  • Also mal ganz doof gefragt:
    Wieso machst du es nciht so:

    int foo(char* cString, int *pnLength, int nParameter)
    {
    	if(cString==NULL||pnLength==NULL)
    		return -1;
        switch(nParameter)
        {
    	case 0:
    		if(*pnLength<6) 
    		{
    			*pnLength=6;
    			return -1;
    		}
    		strcpy(cString,"Hallo");
    		*pnLength=6;
    		return 0;
    	case 1:
    		if(*pnLength<3) 
    		{
    			*pnLength=3;
    			return -1;
    		}
    		strcpy(cString,"Hi");
    		*pnLength=3;
    		return 0;
    	default:
    		if(*pnLength<5) 
    		{
    			*pnLength=5;
    			return -1;
    		}
    		strcpy(cString,"Ciao");
    		*pnLength=5;
    		return 0;
    	}
    }
    

    Natürlich ungetestet



  • [quote="StewDent84"]Hi,

    ich (und mein Programm) würde(n) gerne in einer Funktion, in der ein Wert z.B. x berechnet wird, je nach "case" von diesem x, einer anderen Variablen einen char- Wert zuweisen und diesen mit return übergeben.

    Habe auch schon in etlichen anderen Beiträgen nach einer Lösung geschaut, aber so wirklich geholfen hat mir da nix 😞

    Beispiel:

    ..
    char funktion(char x, char y)
    {
       char z[10];
       x=y+1;
    ich kenne case Anweisungen nur wenn du sie mit break beendest
    
       switch(x)
       {
          case 1: z="Hallo"
          case 2: z="Knallo"
          case 3: z="Ballo"
       }
       return z;
    
    }
    

    ...habs schon mit Zeigern probiert und weiss ich was EGAL: hat alles nich geklappt und ich kriege immer diesen einen (inzwischen sehr deprimierenden) Fehler:
    error C2440: '=' : 'char [3]' kann nicht in 'int' konvertiert werden
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Wäre echt dankbar wenn mir mal jemand nen Denkansatz geben könnte, oder mir sagt was ich falsch mache... 😕

    Danke schonmal,
    Stew[/quote]



  • ja das ist ja auch klar:
    du returnst ein char! ein char ist ein zeichen(byte) und kein string. Einen String returnen ist etwas schwiriger. Du musst der funktion einen char* parameter mitgeben, den du dann beschreibst.



  • .. ach und dazu kommt, dass du nach den anweisungen in case noch ; machen musst und breaken musst und dass du strings nicht mit = zuweisen kannst, weilö strings arrays sind - also:

    switch(x)
    {
    case 1:
      strcpy(z,"Hallo");
      break;
    case 2:
      strcpy(z,"Knallo");
      break;
    case 3:
       strcpy(z,"Ballo");
       break;
    }
    

    sondern mit strcpy.



  • ...danke auch Euch, das Problem ist inzwischen aber beinahe gelöst, danke nochmal den anderen 😉

    @miller: kann ich cString dann aber auch returnen, wenns ne int- Funktion ist wie bei Deinem Beispiel???

    @alle mein "Problem" besteht jetze nur noch darin, delete[] an die richtige Stelle zu schreiben, so dass der durch new[] bereitgestellte Speicher wieder freigegeben wird..

    Stew



  • StewDent84 schrieb:

    @miller: kann ich cString dann aber auch returnen, wenns ne int- Funktion ist wie bei Deinem Beispiel???

    😕 😮 ich bin verwirrt, hab doch hier gar nicht mitgepostet 😕
    welches beispiel meinst du ?
    bin jetzt nicht so im problem drin, aber im prinzip kannst du alles zurückgeben was du willst 😉



  • Hallo,

    das delete[] rufst du nach dem Aufruf der Funktion aus:

    ...
    char *blah;
    blah = BerechneM();
    cout << blah << endl;
    delete[] blah;
    ...
    


  • Darf man fragen, warum du dir mit C-Strings ins Knie schießt, anstatt std::string zu verwenden? Aufgabenstellung?


Anmelden zum Antworten