2010-06-09 14 views
5

Jeśli mogę przechodzić w tablicy znanej wielkości:Zwraca tablicę znanego rozmiaru w C++?

void fn(int(*intArray)[4]) 
{ 
    (*intArray)[0] = 7; 
} 

dlatego nie może wrócić pierwszy:

int intArray[4] = {0}; 
int(*)[4] fn() 
{ 
    return &intArray; 
} 

Tutaj, „)” w „(*)” tworzy " błąd składni :)".

+0

Przekazujesz wskaźnik do tablicy o znanym rozmiarze. W C++, odniesienie może być lepsze, ponieważ będzie się zachowywać jak tablica, zamiast konieczności dereferencji. –

Odpowiedz

4

[4] idzie po nazwie funkcji, podobnie jak to idzie po nazwie zmiennej w definicji zmiennej:

int (*fn())[4] 
{ 
    return &intArray; 
} 

Ponieważ jest to składnia bardzo niejasne, podatne na być mylące dla wszystkich, którzy go czytają, poleciłbym zwrócić tablicę jako prosty int*, jeśli nie masz żadnego specjalnego powodu, dla którego ma to być wskaźnik do tablicy.

Można również uprościć definicję funkcji z typedef:

typedef int intarray_t[4]; 

intarray_t* fn() { ... } 
+0

hmm, to nie działa na żadnym z kompilatorów online – Will

+0

@Will: Działa z gcc v3.4.3 i v4.4.1, a także z Sun cc v5.9, więc powiedziałbym, że to problem z tymi kompilatory online. – sth

+0

Możesz użyć typedef, aby ułatwić problemy z składnią. Ale tak naprawdę lepiej jest zwracać int **, a nawet int *. – Arkadiy

1

Możesz powrócić int**

+0

Lub void *. Oba mają tyle informacji o rozmiarze tablicy. –

2

Its not allowed to return arrays from functions, but there are workarounds.

Na przykład, następujący kod:

int fn()[4] { 
    ... 

nie dostaje przyjęte przez różne kompilatory internetowych; Próbowałem go na kompilator internetowym Comeau, która jest uważana za jedną z najbardziej standardowej naśladowaniu kompilatorów, a nawet w trybie swobodnej mówi:

error: function returning array is not allowed

Kolejny plakat sugeruje powrót int** ; to zadziała, ale bądź bardzo ostrożny, aby zwracać pamięć przydzieloną sterty, a nie alokować ją na stos.