hex in string
-
so ähnlich hatte ich das vorher auch schon probiert (siehe auskommentierten Teil).
Schaut aktuell so aus:
char getCol(int _hCol) { char strCol[2]; //sprintf(&strCol,"%2d",_hCol); //char string[3]; sprintf (strCol, "%02x", _hCol); return strCol; }
Bekomme dann beim return aber einen Fehler:
[Warning] return makes integer from pointer without a cast
[Warning] function returns address of local variable
-
char *getCol (int _hCol) { static char strCol[4]; sprintf (strCol, "%02x", _hCol); return strCol; }
probier mal so^^
-
hm ... die Funktion scheint OK zu sein. Nur verstehe ich sie leider nicht. Kannst du mir noch etwas auf die Sprünge helfen?
char *getCol (int _hCol) { static char strCol[2]; sprintf (strCol, "%02x", _hCol); return strCol; } char strX=getCol(0x03);
Wieso haben wir jetzt ein static? Wozu brauche ich hier denn etwas statisches? Ist ja kein Zähler oder ähnliches.
Was bewirkt der * beim Funktionsnamen?
Und einen Fehler erhalte ich jetzt leider beim Funktionsaufruf:
[Warning]initialization makes integer from pointer without a cast
Also immer noch der gleiche Fehler, nur woanders.
-
deedee schrieb:
Wieso haben wir jetzt ein static?
weil der string sonst das verlassen der funktion nicht überlebt.
deedee schrieb:
Was bewirkt der * beim Funktionsnamen?
dass ein pointer auf den string zurückgegeben wird.
deedee schrieb:
Also immer noch der gleiche Fehler, nur woanders.
du brauchst eine char* variable, keinen einzelnen char, der du den rückgabewert der funktion zuweisen kannst.
-
static char strCol[2]
^^übrigens, die '2' ist ein zu kleiner wert. nimm 3. ein c-string hat 'ne 0 am ende. also brauchst du für 2 zeichen ein array mit 3 elementen (die 2 zeichen und die 0).
-
Und warum funktioniert das folgende ohne * und static:?
int meine_f(int x) { int z; z=x; return z; } printf("%i",meine_f(3));
-
deedee schrieb:
Und warum funktioniert das folgende ohne * und static:?
weil du ein 'int' und kein array zurückgibst. arrays können nicht als rückgabewert herhalten. dafür braucht man dann z.b. pointer. du könntest vielleicht die zeichen und die 0 in einen int packen:
int getCol (int _hCol) { char strCol[4]; assert (sizeof(int) >= 3); sprintf (strCol, "%02x", _hCol); return *(int*)strCol; }
und dann:
int x = getCol(13); printf ("%s\n", (char*)&x);
^^ das ist aber ein übler hack und eher nicht zu empfehlen.
-
Ah ... ich glaube, jetzt habe ich es verstanden.
Übergebe ich in irgendeine Richtung z. B. einen int-Typ, habe ich call-by-value. Habe ich ein Array (bzw. String), dann call-by-reference. Bei call-by-reference brauche ich static und *, bei call-by-value nicht. Richtig?
-
deedee schrieb:
Bei call-by-reference brauche ich static und *, bei call-by-value nicht. Richtig?
fast. das 'static' war nur dazu da, damit der string nach verlassen der funktion seine gültigkeit behält. sonst hast du's durchschaut.
-
Dann schaut das also folgendermaßen aus:
char *getCol(int _hCol) { /** * @param _hCol: Integer * @return: String, call-by-reference */ static char strCol[3]; // 2 Zeichen + NULL (static, damit Wert nach return erhalten bleibt) sprintf (strCol,"%02x",_hCol); // konvertieren in String return strCol; } char *strX=getCol(0x03); printf(strX);
Aber irgendwie gefällt mir das nicht. Jetzt definiere ich in der Funktion eine Variable. Und mit der Variable, die ich in der Funktion definiert habe, arbeite ich dann im Hauptprogramm? Hm
Wie wärs mit dieser Variante:
char getCol(int _hCol,char *_strCol) { /** * @param _hCol: Integer * @param _strCol: String, call-by-reference */ sprintf(_strCol,"%02x",_hCol); // konvertieren in String } char strCol[3]; // 2 Zeichen + NULL getCol(0xA3,strCol); printf(strCol);
Nachdem die Funktion abgearbeitet wurde, kann sie C eingentlich vergessen. Es gibt dann keine Variable mehr in der Funktion, mit der im Hauptprogramm noch weitergearbeitet werden müsste.
Sehe ich das richtig?