2012-07-18 48 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编译器不支持可变长度数组。你可能如果你不知道这个阵列应该提前多久才会走这条路。