Anfänger: Funktionsdeklaration.
-
Nein, dafür haben wir das ANSI-C Forum.
Warum kannst du denn nicht auf die string-Klasse zugreifen? Das kann jeder C++ Compiler.
-
Dann geht es nicht. Eine Funktion kann ihr Ergebnis nur in einen vom Aufrufer bereitgestellten Speicher kopieren (deine erste Variante), oder selbst dynamisch Speicher anfordern:
// Sinnlosbeispiel char* funktion(int x) { return new char[x]; }
Das überträgt die Verantwortung, den Speicher wieder freizugeben, dem Aufrufer. Es gibt grundsätzlich 2 Wege, das zu automatisieren: 1) Garbage Collection -- fällt aus, da es das in C++ nicht gibt 2) Verwendung von Klassen mit Destruktoren. Für letzteres kann man in dem Fall std::string verwenden. Wenn du keine Klassen verwenden kannst (warum eigentlich nicht?), bleibt dir nur, alles manuell -- und fehlerträchtig -- zu erledigen.
Richtig bist du hier auf jeden Fall, wenn du C++ programmierst, und eine überzeugende Antwort auf die Frage, warum du mit C-Mitteln auskommen willst, geben kannst.
-
Danke für die schnellen Antworten. Es ist beruhigend, dass in diesem Forum ein reges Interesse vorherrscht.
Zur Kommunikation mit einem Mikrocontroller erhielt ich den Keil-Compiler. Diesem wurden vielen Elemente entfernt und nur noch 15 Headerdateien blieben übrig. Eigentlich ist es ein C++-Compiler, leider fehlen aber viele Elemente und so sprach ich von C (?). Ich muss diesen Compiler benutzen, zu Lernzwecken. Was der Compiler nutzt sind eben keine namespaces, so wie Klassen, dafür struct. Vielleicht sollte ein Moderator meinen Thread ins C-Forum schieben?
@Bashar: Dein Beispiel spricht von 'return new char[x]'. Wenn meine Zahl 12456 ist, möchte ich diese als string (d.h. char) zurückbekommen. Bei Deinem Beispiel würde ich allerdings einen Speicherinhalt von 12456 (x = 12456) setzen. Ist dem so? Muss ich das bei solch einer Zahl, immerhin ist die Zahl gerademal etwa 14 Bit groß.
x = 10; char *funktion(int x) { char buffer[20]; sprintf(buffer, "%d", x); return new char[x]; } out = funktion(x); Was ist out nun? 10 als char (string)?
-
Bashar hat das Bsp doch selbst als "Sinnlosbeispiel" bezeichnet.
Er wollte dir das Prinzip klar machen. Du musst den Code natürlich an deine Bedürfnisse anpassen.
Übrigens: Es ist ziemlich unwahrscheinlich, dass deine Zahl nur 14 Bit hat. Sie hat entweder 16, 32 o.ä..
-
Achso: Vielleicht solltest du erst einmal richtig programmieren lernen, bevor du dich mit solchen Spezialcompilern rumschlägst.
-
@cd9000: Und was denkst Du was ich hier mache?
- 14 Bit weil: 10 Bit = 1024, 2048, 4096, 8192, 16384 (14 Bit). Die Zahl die ich nannte war 12456, was zw. 13 und 14 Bit liegt. In einem 16 Bit Register wird es 14 Bit belegen (!).
Hoffe jemand kann mir helfen. Meine bisherige Programmiererfahrung beruht nicht auf C++ (obschon es mehrere Jahre Berufserfahrung sind).
-
Welche Header sind denn noch vorhanden?
Vielleicht kannst Du Dir so ne art auto_ptr für Arrays bauen.
Damit wäre Dein Problem gelöst.MfG Jester
@cd9000: Schonmal auf die Idee gekommen, daß er das aus beruflichen Gründen machen muß und nicht aus Spaß?
-
rafa: Bist du dir wirklich sicher, dass das ein C++ Compiler ist? Von Keil kenn ich nur den C51/C251, das ist ein ANSI-C Compiler. Wenn doch, welche Features beherrscht er denn, und welche nicht?
-
wenn alles von c++ fehlt, dann wird es wohl ein c compiler sein
-
Unser 'beschnittener' Keil-Compiler nutzt nur die <stdio.h> und hardwarespezifische <reg552.h>.
Nun hatte ich mir eine Funktion gebaut die mir eine Zahl in einen Text (sage nicht String, weil String auch als Datentyp verstanden wird) umwandelt, dann bearbeitet wird. Danach wird der String in der Konsole des Controllers ausgegeben. Es ging darum, den Wert mit dem ich rechnete (long) in double umzuwandeln (nur für die Ausgabe - kein Weiterrechnen), denn double ist nicht mit dabei. Dazu multiplizierte ich den Wert mit 1000000 und wandelte den Wert entsprechend um:
Wert: 1567892 (kann durch Division und Multiplikation entstehen)
Vor-Punkt: 1
Nach-Punkt: 567892
Ergebnis (Text): 1.567892Wie Ihr seht keine große Aufgabe. Dabei stellte ich allerdings fest, dass ich nicht in der Lage bin den Wert als Rückgabeparameter zurückzugeben. Daher meine Lösung mit der Referenz auf 'void beispiel(char *rueckgabe, int wert);' rueckgabe. Das ist allerdings nicht so schön und mit Sicherheit werde ich desöfteren das Problem haben:
Anstatt (was funktioniert):
umwandeln(out, zahl); printf("Wert: %s", out);
Es folgendermaßen nutzen:
printf("Wert: %s", umwandeln(zahl));
Hoffe Ihr habt noch etwas Geduld und ich äußere mich nicht zu laienhaft. Ansonsten mag eine Verschiebung in das C-Forum von Vorteil sein, denn meine Forumwahl erscheint mir nun mehr als etwas falsch.
Danke auf jeden Fall.
-
Ich würde ja zu std::string raten, bei dem haste keine probleme.
char* bla(...) { char* wert; [...] }
Öh naja, folgendes ginge z.B.:
char* a = new char[100]; [a mit Daten füllen] return a;
Das ganze Zeug bleibt auch im Speicher, solange du nicht delete drückst...
Am Ende muss der Speicher allerdings freigegeben werden, der als Rückgabetyp zurückkommt. Nicht so schön.MfG MAV
-
Wie gesagt, die einzige Header-Datei die genutzt werden darf ist stdio.h. Wenn das die einzige Möglichkeit ist, werde ich es wohl so lassen müssen. Ich dachte nur, dass ich auch auf eine Funktion eine Referenz legen kann und somit eine entsprechende Adresse für diese Funktion festgelegt wird, auf die ich außerhalb zugreifen kann. Im Code müsste ich dieser Adresse (und dem evtl. folgenden Datenfeld) Werte übermitteln. - Schade, aber danke.
-
Hm, nur stdio.h ist nicht sehr viel. Bist Du sicher, daß es ein C**++** Compiler ist?
Falls dem so ist könnte sowas in der Art helfen:class ArrayPtr { public: ArrayPtr(const char * Text) { // länger des Textes ermitteln Buffer = new char[laenge]; // Text in Buffer kopieren } ArrayPtr(ArrayPtr & a) { Buffer = a.Buffer; a.Buffer = 0; } operator=(ArrayPtr & a) { Buffer = a.Buffer; a.Buffer = 0; } char * operator->() { return Buffer; } char & operator(int i) { return Buffer[i]; } operator char*() { return Buffer; } ~ArrayPtr() { delete [] Buffer; } private: char * Buffer; }
Noch ein paar Methoden dazu zum releasen des Buffers und so...
vielleicht nützt Dir das was.MfG Jester
-
@Jester: Danke. Die Idee ist gut. Habe eben Keil-C51 runtergeladen. Es ist definitiv C mit etwas Anpassungen.
-
Dann wirst Du Konstruktor/Destruktor wohl vergessen können...
Dann bleibt Dir wahrscheinlich nur einen Zeiger auf einen ausreichend großen Puffer an die FUnktion zu übergeben.
-
char* neu(int zahl) { static char buffer[sizeof(zahl)]; sprintf(buffer, "%d", zahl); return buffer; }
Änderung: static.
Vorteil: Von Außen nutzbar.
Nachteil: static.Nun kann ich sehr wohl beides nutzen:
char strText; strText = *neu(20); printf("Wert: %s", strText); ... als auch ... printf("Wert: %s", *neu(20));
Aber eben static. Und, C, also vielleicht doch ins C-Forum?
Meinst Du das ist eine akzeptable Lösung?
-
Also das halt ich nicht für eine gute Idee:
Was willst Du mit dem Code denn erreichen?
static char buffer[sizeof(zahl)];
sizeof(zahl) sagt Dir wieviel Speicher zahl belegt (in Bytes), bei mir sind das z.B. 4. Das ganze wird zu Compile-Zeit ausgewertet also baust Du hier immer einen char buffer[4].
Ich vermut eigentlich wolltest Du zahl characters anfordern, dafür müßtest Du in C dann aber wieder malloc nehmen...
Oder mit static nen festen Buffer, das gibt aber leider ein Problem:int * Sum(int a, int b) { static int retval = 0; retval = a+b; return &retval; } int erg = Sum(*Sum(1,2), *Sum(3,4));
Problem: die beiden Sum-Funktion überschreiben sich gegenseitig ihr Ergebnis...
Dann odch lieber gleich sprintf...
Man muß sich halt auch mal überlegen, warum sprintf so ist, wie es ist...
Ich vermute, diejenigen die die Funtkion entworfen haben kannten auch keine bessere Lösung.Aber frag trotzdem mal im Ansi-C Forum nach, vielleicht kennt da einer nen guten Trick oder kann Dir zumindest sagen, wie man sowas gewöhnlich in C macht. Ich kann nämlich kein C, daher alles ohne Gewehr