返回类型我只想做: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