我在编写一段简单的代码时遇到了麻烦。以下是详细信息:
变量声明:
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编译器。 第一个语句不会工作,但第二个会工作,这真的很奇怪,因为AFAIK第一个语句中LHS数组的大小将为N(索引从1到1不等) N)和RHS的大小也应该是N(0到N-1),而在第二个语句中LHS的大小是N-1。
谢谢,
答案 0 :(得分:2)
英特尔阵列部分表示法是 [start:length]
,而不是[start:end]
。因此,这一行
fl[0][1:N+1] = u[1][0:N]*u[0][0:N]; // this does not work
无效,因为您正在索引数组的末尾(具体而言,您要求[1, N+2)
数组中的索引fl
,其最后一个维度只有N+1
个元素)。
错误可能应该更温和一些(&#34;灾难性的&#34;不是我应用于用户错误的术语),但这最终不是编译器的错误。< / p>