2012-06-09 80 views
1

问题的简化描述的Fortran数组。他们每个人都有一个购物清单,包含物品的价格(作为整数)。使用Fortran数组,我怎样才能表示所有的购物清单。购物清单可能包含任何件数(1,10,1000000000)。可变大小的数组

(注:实际的问题要复杂得多它甚至不是关于购物。)

懒惰的做法是:

integer :: array(maxSize, A_REALLY_BIG_NUMBER) 

然而,这是非常浪费的,我基本上要第二维是可变的,然后分配给每个人分开。

明显的企图,注定要失败的:

integer, allocatable :: array(:,:) 
allocate(array(maxSize, :)) ! Compiler error 

Fortran语言似乎要求阵列具有在每个维度一个固定的大小。

这很奇怪,因为大多数语言将多维数组视为“数组数组”,因此您可以分别在“数组数组”中设置每个数组的大小。

下面是一些工作:

type array1D 
    integer, allocatable :: elements(:) ! The compiler is fine with this! 
endtype array1D 

type(array1D) :: array2D(10) 
integer :: i 

do i=1, size(array2D) 
    allocate(array2D(i)%elements(sizeAt(i)) 
enddo 

如果这是唯一的解决办法,我想我会用它。但我希望有一种方法可以使用内在函数来做到这一点。必须为这样一个简单的事情定义一个自定义类型有点烦人。

在C,因为数组基本上是花哨的语法的指针,你可以用一个指针数组做到这一点:

int sizeAt(int x); //Function that gets the size in the 2nd dimension 
int * array[maxSize]; 

for (int x = 0; x < maxSize; ++x) 
     array[x] = (int*)(calloc(sizeAt(x) , sizeof(int))); 

Fortran语言似乎有指针了。但我发现的唯一教程都说“永远不要使用这些”或类似的东西。

+9

这是一个咆哮,而不是一个问题。 –

+3

这是Fortran的一个标准解决方案,用于执行您想要的任务。没有什么问题。 Fortran指针没有错。我将它们用于链接列表等数据结构。如果allocatables可以工作,我建议不要使用指针。不要指望Fortran和C是一样的。 –

+0

我当然不是故意冒犯每个人发布C代码! 我只是好奇,是否有更好的方法在Fortran中实现,可能类似于C解决方案。 – cerberus586

回答

6

你似乎在抱怨Fortran不是C.的确如此。标准委员会为什么选择做不同的事情可能有几乎所有的原因,但这里有一些想法:

fortran数组的一个强大的功能是它们可以被切片。

a(:,:,3) = b(:,:,3) 

是一个完全有效的陈述。 如果数组是“指向数组的指针”,这是不可能实现的,因为沿着每个轴的尺寸不一定是一致的(你试图实现的情况)。

在C中,实际上没有多维数组这样的东西。您可以使用指向数组的指针数组来实现类似的东西,但这并不是一个真正的多维数组,因为它不共享公共的内存块。这可能会影响性能。事实上,在HPC(很多Fortran用户花费时间)中,多维C数组通常是一个包含在宏中的一维数组,用于根据维度的大小计算步幅。此外,取消引用7D阵列像这样:

a[i][j][k][l][m][n][o] 

更是一个好一点很难输入比:

a(i,j,k,l,m,n,o) 

最后,你已经张贴的解决方案是最接近C代码,你试图模仿 - 它有什么问题?请注意,对于您的问题陈述,可能需要更复杂的数据结构(如链接列表)(可以用C或Fortran实现)。当然,链接列表在性能上是最差的,但如果这不是问题,那么用作“购物者”的正确数据结构可能决定将更多东西添加到他们的“购物车”中,即使它不在他们到商店购物清单上。

+0

这是一个很好的答案,但我不能为此投票。谢谢。 – cerberus586

+1

你作为一个问题海报不应该投票,但接受或不接受一个问题。其他人会或不会为这个答案投票(但问题已关闭)。 –