2010-06-09 26 views
5

:C++ 'da bilinen boyutta bir dizi döndürür? Ben bilinen boyutta bir dizide geçebilir

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

neden tek döndüremez: Burada

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

, ")" bölümünde "(*)" üretir " sözdizimi hatası :)".

+0

Sen bilinen boyutta bir diziye bir işaretçi geçiyoruz. C++ 'da, bir referans, bir dizgeye benzeyecek şekilde davranmaktan ziyade, bir referans gibi daha iyi olabilir. –

cevap

4

[4] bir değişken tanımı değişken adından sonra gider gibi, fonksiyon adından sonra gider: Bu çok karanlık sözdizimi olduğundan olmaya,

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

eğilimli okur herkese kafa karıştırıcı, ben bir işaretçi-to-dizi olmak zorunda neden herhangi bir özel nedeni yoksa, basit bir int* olarak dizi dönmek öneriyoruz.

Ayrıca typedef işlevi tanımı basitleştirmek olabilir:

typedef int intarray_t[4]; 

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

hmm, bu herhangi bir çevrimiçi derleyicilerde çalışmaz – Will

+0

@Will: Gcc v3.4.3 ve v4.4.1 ile birlikte Sun cc v5.9 ile çalışır, bu yüzden bu bir sorun olduğunu söyleyebilirim çevrimiçi derleyiciler. – sth

+0

Sözdizimi sorunlarını gidermek için typedef'i kullanabilirsiniz. Ama gerçekten, int **, hatta int * 'den geri dönmekten iyidir. – Arkadiy

1

Sen dönebilirsiniz int**

+0

Veya geçersiz *. Her ikisinin de dizinin büyüklüğü hakkında çok fazla bilgi var. –

2

Its not allowed to return arrays from functions, but there are workarounds. Örneğin

, aşağıdaki kod:

int fn()[4] { 
    ... 

çeşitli çevrimiçi derleyiciler tarafından kabul edilmek yapmaz; Ben derleyicilerinde standart aşağıdakilerden biri olarak kabul edilir Comeau çevrimiçi derleyici, üzerinde denedim ve hatta rahat modunda şöyle der:

error: function returning array is not allowed

başka afiş int** dönen önerir ; Bu çalışır, ancak yığın ayrılmış bellek ve yığın ayrılmış değil, çok dikkatli olun.

İlgili konular