返回n-dimensional数组的C函数的原型声明会是什么样子?
给你,n>=2。
请用动态数组/指针来解释它。
我的想法是不传递任何维数组。
请给我3个2,3和4维度的例子。
这将足以让我抓住这个想法。
发布于 2011-12-01 16:05:19
我建议这样做:
array foo();其中,array是一个定义为:
struct array
{
int *data;
unsigned int ndim; //number of dimensions
unsigned int *size; //size of each dimension is size[i].
};当然,data只是一个指向int的指针,但是可以这样使用该结构中的其他两个字段:data可以被解释为n维数组,并且每个维度的大小可以存储在另一个指针size中。
例如,以4维数组(维度大小为10、20、30、40)为例,则可以创建并初始化4维数组为:
unsigned int size[] = {10,20,30,40};
array arr = create(4, size);其中,create函数定义为:
array create(unsigned int n, unsigned int *size)
{
array arr;
arr.ndim = n;
arr.size = (unsigned int*) malloc(n * sizeof(unsigned int));
int i;
unsigned int totalElements = 1;
for( i = 0 ; i < n ; ++i)
{
arr.size[i] = size[i];
totalElements *= size[i];
}
arr.data = (unsigned int*) malloc(totalElements * sizeof(int));
return arr;
}当然,要使其看起来像n维数组,您必须对结构的字段做大量的工作。你不需要完全按照我解释的方式来理解我,但这只是一个基本的想法。您可以对其进行修改,以满足您的特定需求。
我建议您编写一些函数来操作数组,并访问数组元素。我已经编写了create函数,这里同样是destroy函数:
void destroy(array arr)
{
if (arr.size != NULL && arr.data != NULL)
{
free(arr.size);
free(arr.data);
arr.size = arr.data = NULL;
}
}发布于 2011-12-01 16:18:05
您可以返回一个简单的指针,并在函数内部为n维数组分配内存:
int* foo( int nSize )
{
int*** x;
x = (int***)malloc( sizeof(int**) * nSize );
for ( int i = 0 ; i < nSize ; i++ )
{
x[i] = (int**)malloc( sizeof(int*) * nSize );
for ( int j = 0 ; j < nSize ; j++ )
{
x[i][j] = ( int* ) malloc(sizeof(int) * nSize );
for ( int k = 0 ; k < nSize ; k++ )
{
x[i][j][k] = i + j+ k;
}
}
}
return (int*)x;
}在函数外部,因为您已经知道大小,所以可以假定指针的大小是正确的-在本例中,是一个三维数组:
int main(int argc, _TCHAR* argv[])
{
int*** x =(int***) foo(4);
for ( int i = 0 ; i < 4 ; i++ )
for ( int j = 0 ; j < 4 ; j++ )
for ( int k = 0 ; k < 4 ; k++ )
cout << x[i][j][k] << endl;
return 0;
}是的,类型转换不是很好,但它可以工作:)
发布于 2011-12-01 16:19:31
您的问题缺少一些细节(例如数组的类型、n是否作为参数传入、数组是否在函数中创建),因此我将尝试猜测您的意思。
数组由指针和偏移量引用。即
double a[10];
a[1] = 1.0f;
double *b = &(a[0]);
double c = b[1];假设您希望该函数创建一个包含n个双精度类型的元素的数组。
double * createArray(int n);这就是你的函数原型。您的函数可能如下所示
double * createArray(int n)
{
double * newarray = new double[n];
return &(newarray[0]);
}您可以像这样使用createArray
double * arrayoftendoubles = createArray(10);
double fifthelement = arrayoftendoubles[4];N的大小无关紧要。
https://stackoverflow.com/questions/8338079
复制相似问题