您好我正在努力寻找解决方案我已经定义了以下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
答案 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
值。