Geht nicht als C++ wie foo schreiben?

Gast #5781591
Lesenswert?

Wie muss ich die Funktion foo anpassen damit
a=foo;
unter C und C++ funktioniert?
ne Funktion mit "returning pointer to array 5 of char"
1
#include <stdio.h>
2

3
typedef char (* (*WTF)() )[5];
4

5
char* foo ()
6
{
7

8
}
9

10
int main ()
11
{
12
  WTF a;
13
  a = foo; // compiliert als c aber nicht als c++
14
}


Diesen Compiler benutzt:
https://www.onlinegdb.com/online_c_compiler

C++ compile:
error: invalid conversion
from
‘char* (*)()’
to
‘WTF {aka char (* (*)())[5]}’
[-fpermissive]


https://cdecl.org/
C gibberish ↔ English
char(*(*WTF)())[5];
declare WTF as pointer to function RETURNING POINTER TO ARRAY 5 OF CHAR
Moderator #5781593
Lesenswert?

1
char (*foo())[5]
2
{
3
  ...
4
}

Edit:

In C solltest du für die Funktion noch die Argumentliste angeben (bzw.
void für eine leere Argumentliste):

1
typedef char (*(*WTF)(void))[5];
2

3
char (*foo(void))[5]
4
{
5
  ...
6
}

Sonst entfällt beim Aufruf der Funktion die Typprüfung. In C++ reicht
für die leere Argumentliste das leere Klammerpaar.
#5781606
Lesenswert?

Shadow233 schrieb:
> Wie muss ich die Funktion foo anpassen damit
> a=foo;
> unter C und C++ funktioniert?
> ne Funktion mit "returning pointer to array 5 of char"
> #include <stdio.h>
>
> typedef char (* (*WTF)() )[5];
>
> char* foo ()

Wo is die 5 hier? foo() liefert einen Zeiger auf einen char zurück, 
keinen Zeiger auf ein array[5] aus char. Das ist es, was die 
Fehlermeldung dir sagen will.
#5781714
Lesenswert?

Shadow233 schrieb:
> Ah, so funktioniert es, vielen Dank.
> Ich bin immer in der Denke dass man arrays nur als zerfallene Pointer
> zurückgeben kann.

Schon, aber der Typ vom Pointer ist wichtig

Denn Unterschied merkt man wenn man Pointerarithmetik macht.

ein char-Pointer ist etwas anderes als ein Pointer auf Array 5 von char.

char feld[6][5];

da hast du als verschiedene mögliche Zeigertypen:

feld Zeiger auf Array 5 von char
feld[0] Zeiger auf char
&feld Zeiger auf Array 6 von Array 5 von char

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren