返回類型我只想做:C:定義的長數組作爲在C#中的函數
private long[] myMethodName()
{
//etc
}
什麼是在C相同呢?
這給出了一個錯誤:
long[] readSeqFile(char *fileName)
返回類型我只想做:C:定義的長數組作爲在C#中的函數
private long[] myMethodName()
{
//etc
}
什麼是在C相同呢?
這給出了一個錯誤:
long[] readSeqFile(char *fileName)
通常對於C你會通過一個指針和長度
// returns number of elements written
size_t myMethodName(long* dest, size_t len)
{
//etc
}
long *readSeqFile(char *filename);
你可能想使filename
常量:
long *readFileName(const char *const filename);
更新:雖然這回答了原來的問題,這不是很不錯的C的做法。如果,作爲海報說,他想從文件中讀取一個整數列表,並拿回來作爲長數組,然後原型很可能將是這個樣子:
int readSeqFile(const char *const filename,long **longArray,size_t *const len);
和實現(以草圖的形式):
#include <stdio.h>
#include <stdlib.h>
const size_t longArrayChunkSize=100;
int readSeqFile(const char *const filename,long **longArray, size_t *const len)
{
FILE *fp;
size_t nInts=0,curBufferLen;
long tmp;
fp=fopen(filename,"r");
if(fp==NULL)
return -1;
*longArray=malloc(longArrayChunkSize*sizeof(long));
if(*longArray==NULL)
return -1;
curBufferLen=longArrayChunkSize;
// let's assume file is a list of integers, one per line
while(read from file and !feof())
{
(scan line into tmp)
longArray[nInts++]=tmp;
if(nInts==curBufferLen)
(realloc *longArray by longArrayChunkSize, increase curBufferLen)
}
*len=nInts;
fclose(fp);
return 0;
}
這樣稱呼它:result=readSeqFile(filename,&longArray,&arrayLen);
longArray
是long*
型的,它是調用者的責任,後來釋放它。結果爲成功爲零,錯誤爲-1。
這是你用C++和STL類獲得的喜歡的地方,比如vector<long>
,因爲你只需要push_back()
就可以了,只要它從文件中出來而不必擔心memeory管理。
沒關係..我得到它:
long *readSeqFile(char *fileName)
由於無論如何
這被聲明爲返回*指針*,而不是*數組*。數組和指針不是一回事。然而,正式的(無用的)答案是在C和C++中不可能聲明一個返回內置數組類型的對象的函數。數組在這些語言中是「不可退貨的」。 – AnT 2012-07-18 14:35:03
在C中,函數不能返回數組類型;他們可以返回指針到陣列,比如
long (*readSeqFile(char *filename))[N]
{
...
}
壞處在於N必須是一個編譯時間常數,如果您使用的是C89或更早版本的編譯器,或C2011編譯器不支持可變長度數組。你可能如果你不知道這個陣列應該提前多久纔會走這條路。
糾正我,如果我錯了,但不會在方法中創建的任何long []在堆棧上(因此一旦你返回就烘烤)? – 2012-07-18 18:16:43