2012-11-14 218 views
-2

出于某种原因,我认为我所有的比率是x * y * z长度指针双打和利率本质上是一个三维数组。但我不记得这是如何工作的。我做了什么?指向指向double的指针的指针?

// Allocate 3D Rate Array 
double *allRates = malloc(x*y*z*sizeof(double)); 
    if (!allRates) exit(1); 
double ***rates = malloc(x*sizeof(double **)); 
    if (!rates) exit(1); 

for(i=0; i<x; i++) { 
    rates[i] = malloc(y * sizeof(double *)); 
// Check rates[i] allocation? 
    for(j=0; j<y; j++) { 
    rates[i][j] = allRates + (i*y*z) + (j*z); 
    } 
} 

它运行正常...我只是在处理文档,自3月份以来没有在这部分代码上工作。

+6

为什么你应该评论你的代码的一个很好的理由 - 这不是*只是为了其他人的利益...... –

+0

通常在这种情况下,最好问自己什么是代码背后的_idea_。然后,代码很乱,因为它更好理解。因为你知道这个想法,所以你有最好的机会来解决这个问题。让我们拭目以待的时间再次成为您文件实用性的教训。 – Richard

+0

你知道我评论过代码的所有数学部分......我只是忘记了这些晦涩的(对我来说)数据结构。 –

回答

3
// Allocate 3D Rate Array 
double *allRates = malloc(x*y*z*sizeof(double)); 
    if (!allRates) exit(1); 

分配存储器足够大以保持double类型(如果尺寸是足够小的值x*y*z块;如果产品的数学结果是不能表示为一个size_t,它分配所述的该剩余模SIZE_MAX + 1)。

double ***rates = malloc(x*sizeof(double **)); 
    if (!rates) exit(1); 

分配存储足够大的块以保持double**类型的x值(再次,如果x足够小)。这些被用作第一维度的指数。

for(i=0; i<x; i++) { 
    rates[i] = malloc(y * sizeof(double *)); 
// Check rates[i] allocation? 

检查分配是绝对可取的。如果没有失败,则使每个rates[i]指向足够大的内存块以容纳y指向double的指针。

for(j=0; j<y; j++) { 
    rates[i][j] = allRates + (i*y*z) + (j*z); 
    } 
} 

每个double*小号rates[i][j]的由点进分配给allRates块,在i*(y*z) + j*z元件,y×z - 平面的尺寸i倍加上z - 元素的j倍的长度的偏移行,以便rates[i][j]指向平面i中的第j行的第一个元素。

如果C99是可用的,或yz是编译时间常数,这将是简单的通过处理时用更少的间接性分配

double (*rates)[y][z] = malloc(x * sizeof *rates); 

实现。

+0

谢谢。我真的不确定这些对象的结构是什么。 –

+0

其实x和y都是运行时选项。 z是程序中早些时候确定的变量。 –