我在编译一段简单的代码时遇到了麻烦。详情如下:
变量声明:
double q_old[3][N], q_new[3][N], u[3][N], flux[3][N+1], fl[3][N+1], fr[3][N+1];
以下行似乎是错误的来源:
fl[0][1:N+1] = u[1][0:N]*u[0][0:N]; // this does not work
fl[0][1:N] = u[1][0:N]*u[0][0:N]; // this works
错误:
shocktube.c(47): catastrophic error: section length mismatch in array expression
compilation aborted for shocktube.c (code 1)
我正在使用intel icpc编译器。 第一个语句不起作用,但第二个语句起作用,这真的很奇怪,因为据我所知,第一个语句中 LHS 数组的大小将为 N(索引从 1 到N),RHS的大小也应该是N(0到N-1),而在第二个语句中LHS的大小是N-1。
谢谢
最佳答案
英特尔阵列部分符号为[start:length]
,而不是[start:end]
。因此,这一行
fl[0][1:N+1] = u[1][0:N]*u[0][0:N]; // this does not work
无效,因为您的索引超出了数组末尾(具体来说,您要求在 fl
数组中提供索引 [1, N+2)
,其索引最后一个维度只有 N+1
元素)。
错误可能应该稍微温和一些(“灾难性”不是我适用于用户错误的术语),但这最终不是编译器的错误。
关于c++ - 奇怪的编译错误: catastrophic error: section length mismatch in array expression compilation aborted for shocktube. c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252909/