2012-07-18 51 views
0

返回類型我只想做:C:定義的長數組作爲在C#中的函數

private long[] myMethodName() 
{ 
    //etc 
} 

什麼是在C相同呢?

這給出了一個錯誤:

long[] readSeqFile(char *fileName) 
+0

糾正我,如果我錯了,但不會在方法中創建的任何long []在堆棧上(因此一旦你返回就烘烤)? – 2012-07-18 18:16:43

回答

1

通常對於C你會通過一個指針和長度

// returns number of elements written 
size_t myMethodName(long* dest, size_t len) 
{ 
    //etc 
} 
1
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);longArraylong*型的,它是調用者的責任,後來釋放它。結果爲成功爲零,錯誤爲-1。

這是你用C++和STL類獲得的喜歡的地方,比如vector<long>,因爲你只需要push_back()就可以了,只要它從文件中出來而不必擔心memeory管理。

+0

是的,謝謝。我會將此標記爲答案 – Matt 2012-07-18 14:04:52

+0

誰分配長*?誰釋放?通常在C中,調用者將負責數據分配和銷燬。 – 2012-07-18 14:05:43

+0

我想要做的是在文件中讀取,填充整數列表並將其返回給調用者。 – Matt 2012-07-18 14:08:13

0

沒關係..我得到它:

long *readSeqFile(char *fileName) 

由於無論如何

+1

這被聲明爲返回*指針*,而不是*數組*。數組和指針不是一回事。然而,正式的(無用的)答案是在C和C++中不可能聲明一個返回內置數組類型的對象的函數。數組在這些語言中是「不可退貨的」。 – AnT 2012-07-18 14:35:03

0

在C中,函數不能返回數組類型;他們可以返回指針到陣列,比如

long (*readSeqFile(char *filename))[N] 
{ 
    ... 
} 

壞處在於N必須是一個編譯時間常數,如果您使用的是C89或更早版本的編譯器,或C2011編譯器不支持可變長度數組。你可能如果你不知道這個陣列應該提前多久纔會走這條路。