C中三维结构的结构

时间:2015-10-13 13:44:23

标签: c arrays struct

您好我正在努力寻找解决方案我已经定义了以下3D结构阵列。

typedef struct{
 double x;
 double y;
 float z;
} Point;

我可以遍历数组来打印它的内容,但是在修改了一些元素之后,在程序的某个时刻,我不再能够访问数组中的某些结构,并且我得到了段错误。任何帮助表示感谢,谢谢。

PD:我刚注意到我错误地定义了我的结构......

`## =======================================================================
## Now suppose we do not know K and r and they are to be fitted...
## The "observations" are the analytical solution
## =======================================================================

# You need these packages
library('deSolve')
library('FME')

## logistic growth model
TT <- seq(1, 100, 2.5)
N0 <- 0.1
r <- 0.5
K <- 100

## analytical solution

Ana <- cbind(time = TT, N = K/(1 + (K/N0 - 1) * exp(-r*TT)))

time <- 0:100
parms <- c(r = r, K = K)
x <- c(N = N0)

logist <- function(t, x, parms) {
  with(as.list(parms), {
    dx <- r * x[1] * (1 - x[1]/K)
    list(dx)
  })
}

## Run the model with initial guess: K = 10, r = 2

parms["K"] <- 10
parms["r"] <- 2
init <- ode(x, time, logist, parms)

## FITTING algorithm uses modFit
## First define the objective function (model cost) to be minimised
## more general: using modFit

Cost <- function(P) {
  parms["K"] <- P[1]
  parms["r"] <- P[2]
  out <- ode(x, time, logist, parms)
  return(modCost(out, Ana))
} 
(Fit<-modFit(p = c(K = 10,r=2), f = Cost))
summary(Fit)` 

我一交换双重浮动类型就固定了段错误...仍在试图找出它为什么是segfaulting

1 个答案:

答案 0 :(得分:0)

考虑分配单个缓冲区(使用pow( num_bezier, 3)个元素),而不是分别分配行,列和单元格。这样你可以避免过多的分配,但也可以避免内存碎片。

struct Point { float x, y, z; }

size_t bufferLength;
size_t bufferSquareLength;
struct Point* buffer; // pointer to a dynamically-allocated cubic buffer of Point values, stored in row x, column y, and depth z order.

void allocateBuffer(size_t squareLength) {
    bufferSquareLength = squareLength;
    bufferLength = squareLength * squareLength * squareLength;
    buffer = calloc( bufferLength, sizeof(struct Point) );
}

struct Point* getElement(size_t x, size_t y, size_t z) {

    Point* p = buffer + ( x * bufferSquareLength * bufferSquareLength ) + ( y * bufferSquareLength ) + z;
    return p;
}

更简单,更容易理解。

迭代每个值:

void forEachPoint( void(*callback(size_t x, size_t y, size_t z, struct Point* value) ) {
    for(size_t x = 0; x < bufferSquareLength; x++) {
        for(size_t y = 0; y < bufferSquareLength; y++) {
            for(size_t z = 0; z < bufferSquareLength; z++) {
                callback( x, y, z, getElement( x, y, z ) );
            }
        }
    }
}

只需使用自定义callbakc函数调用forEachPoint即可迭代每个struct Point值。