问题的简化描述的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语言似乎有指针了。但我发现的唯一教程都说“永远不要使用这些”或类似的东西。
这是一个咆哮,而不是一个问题。 –
这是Fortran的一个标准解决方案,用于执行您想要的任务。没有什么问题。 Fortran指针没有错。我将它们用于链接列表等数据结构。如果allocatables可以工作,我建议不要使用指针。不要指望Fortran和C是一样的。 –
我当然不是故意冒犯每个人发布C代码! 我只是好奇,是否有更好的方法在Fortran中实现,可能类似于C解决方案。 – cerberus586