char zuweisen und return, aber konvertierungsfehler
-
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; 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 FunktionsformatWäre echt dankbar wenn mir mal jemand nen Denkansatz geben könnte, oder mir sagt was ich falsch mache...
Danke schonmal,
Stew
-
bei den case anweisungen fehlt das break denke ich mal.
also: case 1: z="Hallo"; break;
[...]
-
Hallo,
1. Kannst du einem char* oder char[] nicht per Zuweisungsoperator einen Wert zuseisen, sondern nur mit strcpy
2. Wenn du das tust, würde der Zeiger z nach dem Verlassen der Funktion zerstört (also einfach einen Zeiger übergeben, der später auf das char array zeigt)
3. Semikolons und Breaks fehlen in der case Anweisung.Außerdem verstehe ich diese Zeile nicht: x=y+1; Wenn du x eh neu berechnest, brauchst du es ja nicht in der Parameterliste zu übergeben.
-
...tut mir leid, die breaks und semikolons sind verloren gegangen, in meinem Prog aber vorhanden, daran lags nich, ist wirklich nur diese eine Fehlermeldung
siehe oben...hmm, danke trotzdem, aber noch andre Vorschläge?
Stew
-
CarstenJ hat es doch eigentlich schon geschrieben! Eon bissel nachdenken, und ich denke du schaffst das.
-
...jo, sorry, war ein bisschen voreilig.
Hab auch grad mitgekriegt, dass meinen müden Augen das was entgangen ist.
So probier ichs mal.....danke,
Stew
-
...habs jetzt so probiert:
... char * BerechneM(char stream[55]) { char M; char* tag = new char[5]; M= M+1; switch(M) { case 1: strcpy(*tag,"MO"); break; case 2: strcpy(*tag,"DIE"); break; } return tag; }
..und jetzt sagt er:
error C2664: 'strcpy' : Konvertierung des Parameters 1 von 'char' in 'char *' nicht moeglich Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Was hat denn der Typ vom Parameter eigentlich mit dem Ausgabewert zu tun??
Da besteht doch der Konflikt, oder?Stew
-
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 FunktionsformatWä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