warning: return makes pointer from integer without a cast
-
Hallo,
ich hab ne Funktion implementiert, welche ein 1 dimensionales array zurückliefern sollte, jedoch kriege ich immer diese warnung..
nur diese bibliotheken sind erlaubt:
#include <stdio.h>
#include <stdlib.h>int *findCharacterFunction(char* string) { int length; int i = 0; int array[i]; length = countLetter(string); printf("%d\n", length); int counter; for(counter = 0; counter < length; counter++) { if(string[counter] == ' ' || string[counter] == '\n' || string[counter] == '.' || string[counter] == ',') { array[i++] = counter + 1; } } return *array; }
versteh leider den grund von diesem casting nicht.. gibts da noch eine möglichkeit dazu?
danke für eure hilfe im voraus.
lg
-
Was soll die Funktion denn überhaupt machen? Der Name ist leider auch ziemlich nichtssagend..
-
Steht doch da: Beim return wird hier ein Pointer aus einem Integer gemacht. Deine funktion gibt einen int* zurück. Beim return steht *array, was das erste Element von array ist und daher ein int.
Doch selbst wenn du das korrigierst, wird das nichts. Du kannst nicht einfach Zeiger auf lokale Variablen aus einer Funktion heraus geben. Die Variablen gehen beim Verlassen nämlich aus dem Scope (d.h. sie existieren nicht mehr). Auch wenn ein Zugriff auf die Speicherstelle vielleicht noch geht, ist das Verhalten übelst undefiniert, weil der Speicherbereich wieder für andere Zwecke zur Verfügung steht (und in der Regel auch benutzt wird).
edit: Und dein Array hat übrigens 0 Elemente. Und später greifst du fröhlich auf diese 0 Elemente zu, als seien es viel mehr. Wie hast du denn C gelernt? Das sind ziemlich üble Fehler, die du da machst. Deutet auf schlechtes Buch/Lehrer hin.
-
Also es geht darum dass ich einen text hab welcher bei gewissen zeichen so wie ('.' ',' '\n' ' ') in einzelne strings zerlegt werden soll und diese strings sind 2 dimensionale arrays. Dafür hab ich ne funktion implementiert welche diese stellen dieses textes in ein int array[] einspeichern soll.
Wie zb. : an der 26. stelle dieses textes ist so ein zeichen. falls es das erste zeichen ist dann muss in dieser for loop array[0] = 26 initialisiert werden.
und wenn zb array[0] = 26, array[1] = 45, array[i] = ..., am ende dieser initialisierungen sollte dieses array zurückgeliefert werden.
Ich weiss dass der name der Funktion nicht passend ist, aber das werd ich noch aendern.
-
Übrigens, ich hab noch kaum erfahrung was überhaupt programmieren anbelangt, ich spiel mich nur mit solchen versuchen rum, ich hab aber kappiert was du meinst, jedoch brauch ich einen Lösungsansatz dafür..
-
strtok() scheint das zu sein, was du willst. Wenn du strtok() nicht nutzen darfst (weil der Lehrer gesagt hat, dass du so etwas selbst schreiben sollst) dann guck dir zumindest mal an wie strtok() funktioniert und lasse dich etwas inspirieren.
-
andromeda_3050 schrieb:
Also es geht darum dass ich einen text hab welcher bei gewissen zeichen so wie ('.' ',' '\n' ' ') in einzelne strings zerlegt werden soll und diese strings sind 2 dimensionale arrays. Dafür hab ich ne funktion implementiert welche diese stellen dieses textes in ein int array[] einspeichern soll.
Strings sind üblicherweise eindimensionale Arrays.
Wie willst du die Strings in ein int array abspeichern?
Was du brauchst ist wohl eher ein char *array[], d.h. ein Array von Zeigern auf char (=Strings).
-
Ich will weder sowas wie strtok verwenden noch will ich ein int array[] als strings abspeichern (was eben sowieso nicht geht).
Ausserdem ja, es sind 2 dim. char arrays, so wie string[0][characteranzahl], string[1][characteranzahl]..... string[i][characteranzahl].
Diese funktion dient nur dazu um die stellenwerte der (',' '.' '\n' ' ')
abzuspeichern und diese stelllenwerte werden in ein int array[] abgespeichert.Dann muss ich eben schauen dass ich dieses int array[] für die zerteilung des textes verwende.
Ist es vielleicht jetzt verstaendlich?
-
und noch was, wenn in diesem text solche zeichen mittendurch aufeinander folgen muss ich diese zeichen auch zur trennung verwenden. Es können doch mehrere solche zeichen auch hintereinder kommen, was eben dann? dafür ist eben dieses int array[] gedacht..
wie hier: char *text = "sdfs..,dfg. sfghu-3498uegnd"
-
andromeda_3050 schrieb:
Diese funktion dient nur dazu um die stellenwerte der (',' '.' '\n' ' ')
abzuspeichern und diese stelllenwerte werden in ein int array[] abgespeichert.Ist es vielleicht jetzt verstaendlich?
Aha. Jetzt wird es verständlicher. Ist aber nicht ganz optimal, was du da vor hast. Erste Methode: int * übergeben.
void foo(const char *s, int *positions, unsigned int max_positions) { } int main(void) { int positions[200]; foo("...", positions, sizeof(positions) / sizeof(*positions)); }
Nachteil: Du bist auf eine feste Anzahl Positionen begrenzt. Zweite Methode:
int *foo(const char *s) { int *positions; // Gefrickel in einer Schleife und mit realloc() return positions; } int main(void) { int *positions = foo("..."); // .. free(positions); }
Nachteil: realloc() ist recht unperformant, je mehr du da tricksen willst (mehr auf einmal reservieren), desdo komplizierter wird das Ganze.
Ein Array kannst du übrigens nicht zurückgeben.
int *foo() { int array[100]; return array; // böse }
Weil das Array auf dem Stack angelegt wird, und somit bei verlassen des Scopes ungültig wird.
Mein Vorschlag: Nimm strtok().
Oder zumindest etwas, was nach dem nächsten Zeichen sucht.const char *foo(const char *s) { // Erstes Zeichen suchen und Position zurückgeben } int main(void) { const char *p = "dein String"; for (; (p = foo(p)); ++p) { } }
-
na endlich, jetzt ist mir zumindest klar das meine methode kompletter schwachsinn war, enttäuschung pur aber was solls, also ich darf wie gesagt strtok nicht direkt verwenden, aber ich versuch mir zumindest so was wie strtok zu implementieren...