Forum: PC-Programmierung incompatible types when returning type ‘int *’ but


von Jens (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade mit Codesignals. Dort sind aufgaben gestellt, 
welche man mit einem Code lösen muss. Das ganze mache ich in C.

Bei meiner Aufgabe handelt es sich um eine art UNO spiel. Gegeben ist 
die Anzahl der Spieler und die reihenfolge der Gespielten Karte. In den 
Regeln steht dann wie viele punkte eine Karte gibt. Die Ausgabe soll 
dann ein Array sein, mit der Länge der Anzahl der Spieler und Inhalt mit 
den entsprechenden Punkten. Das ganze zu berechnen und auszuwerten ist 
nicht mein Problem. Mein Problem liegt bei den Datentypen.

Anfangs das der Code wie folgt aus:
1
// Definition for arrays:
2
// typedef struct arr_##name {
3
//   int size;
4
//   type *arr;
5
// } arr_##name;
6
//
7
// arr_##name alloc_arr_##name(int len) {
8
//   arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
9
//   return a;
10
// }
11
//
12
//
13
arr_integer guno(int playercount, arr_string moves) {
14
}

Anzahl der Player ist klar und die Anzahl der moves und die Karten sind 
auch klar. Allerdings bekomme ich den output nicht richtig hin.

In der Beschreibug steht:
[output] array.integer
An array of integers containing the score of each player. For example, 
in a game with 3 players, the first player's score would be at index 0 
and the last player's score would be at index 2.

[C] Syntax Tips

// Prints help message to the console
// Returns a string
char * helloWorld(char * name) {
    char * answer = malloc(strlen(name) + 8);
    printf("This prints to the console when you Run Tests");
    strcpy(answer, "Hello, ");
    strcat(answer, name);
    return answer;
}

Wenn ich jetzt aber ein array initialisiere
1
int output[playercount];
und am ende des Codes
1
return output;
bekomme ich die Fehlermeldung
main.c on line 54:12: error: incompatible types when returning type ‘int 
*’ but ‘arr_integer’ {aka ‘struct arr_integer’} was expected
     return output;

das heißt, dass mein Ausgabetyp doch nicht richtig ist? Wie muss dieser 
denn sein?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du benutzt da irgendeinen recht kruden Code-Hack, der hier schon vor 
einiger Zeit durchs Forum geisterte.


Dein "arr_integer" ist kein Array, sondern eine zusammengebastelte 
Struktur, die ein Array enthält.

Wenn Deine Funktion so ein Ding zurückgeben soll, muss sie die 
Konventionen dieses kruden Code-Hacks verwenden, das bedeutet, eine 
entsprechend geformte Struktur zurückgeben.

Das ist übrigens potentiell problematisch; C übergibt Strukturen als 
Kopie an Funktionen und gibt sie auch als Kopie wieder zurück. Der 
dafür benötigte Speicher wird dem Stack entnommen, bei größeren 
Strukturen kann es also zu Stacküberläufen kommen. Obendrein wird hier 
ständig Speicher hin- und herkopiert.

Bei echten Arrays verhält sich C komplett anders, an eine Funktion wird 
nur ein Pointer auf das erste Arrayelement übergeben. Damit ist in der 
Funktion die Größe des Arrays nicht bestimmbar, was dadurch gelöst wird, 
daß in solchen Fällen der Funktion als weiterer Parameter die Größe des 
Arrays übergeben wird oder es eine Konvention zur Kennzeichnung des 
letzten Arrayelements gibt. Ein Beispiel für diese 
Kennzeichnungskonvention sind Zeichenketten, deren Ende durch \0 
gekennzeichnet wird.

Das erzeugt keine Stackprobleme, und erfordert keine kruden 
Array-in-Struktur-verpack-Hacks.

von mh (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Das ist übrigens potentiell problematisch; C übergibt Strukturen als
> Kopie an Funktionen und gibt sie auch als Kopie wieder zurück. Der
> dafür benötigte Speicher wird dem Stack entnommen, bei größeren
> Strukturen kann es also zu Stacküberläufen kommen. Obendrein wird hier
> ständig Speicher hin- und herkopiert.

Das ist an diesem Hack nun wirklich das kleinste Problem oder gerade der 
Vorteil. Es handelt sich bei der Struktur nur um einen int und einen 
Pointer. Beim Funktionsaufruf ohne die Struktur müssen int und Pointer 
seperat übergeben werden. Und wenn man in der Funktion ein Array 
erzeugt, dessen größe außerhalb unbekannt ist aber benötigt wird, muss 
man mit Output-Parametern arbeiten. Der Stack wird also nicht mehr 
belastet. Mich stören bei diesem Ansatz die Makros.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.