In one of my classes, fooI insert values into some static member array,, static unsigned int index[9][9][9][9]with the following
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
for (int l = 0; l < 9; l++) {
if (index[i][j][k][l] != 100) {
setIndex(i, j, k, l, &index[j][i][k][l]);
setIndex(i, j, k, l, &index[i][j][l][k]);
setIndex(i, j, k, l, &index[j][i][l][k]);
setIndex(i, j, k, l, &index[k][l][i][j]);
setIndex(i, j, k, l, &index[k][l][j][i]);
setIndex(i, j, k, l, &index[l][k][i][j]);
setIndex(i, j, k, l, &index[l][k][j][i]);
}
}
}
}
}
The function is as setIndexfollows:
void foo::setIndex(int i, int j, int k, int l, unsigned int *p) {
*p = getIndex(i,j,k,l);
}
and he needs
unsigned int foo::getIndex(int i, int j, int k, int l) {
return index[i][j][k][l];
}
When I try to compile this in Visual Studio 2013, I get a strange internal compiler error
error MSB6006: "CL.exe" exited with code -1073740940.
or, sometimes, also:
fatal error c1001 internal compiler error
Now, if I changed my code only a little, for example, in the first lines:
int i;
for (int a = 0; a < 9; a++) {
i = a;
[...]
}
It compiles without problems.
Can anyone understand what is causing the problem?
Here is the minimal code I reproduce it with:
foo.h:
class foo{
public:
static void setIndexes();
static unsigned int getIndex(int i, int j, int k, int l);
private:
static void setUniqueIndexes();
static void setIndex(int i, int j, int k, int l, unsigned int *p);
static unsigned int index[9][9][9][9];
};
foo.cpp:
#include "foo.h"
unsigned int foo::index[9][9][9][9];
void foo::setIndexes() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
for (int l = 0; l < 9; l++) {
index[i][j][k][l] = 100;
}
}
}
}
setUniqueIndexes();
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
for (int l = 0; l < 9; l++) {
if (index[i][j][k][l] != 100) {
setIndex(i, j, k, l, &index[j][i][k][l]);
setIndex(i, j, k, l, &index[i][j][l][k]);
setIndex(i, j, k, l, &index[j][i][l][k]);
setIndex(i, j, k, l, &index[k][l][i][j]);
setIndex(i, j, k, l, &index[k][l][j][i]);
setIndex(i, j, k, l, &index[l][k][i][j]);
setIndex(i, j, k, l, &index[l][k][j][i]);
}
}
}
}
}
}
void foo::setIndex(int i, int j, int k, int l, unsigned int *p) {
*p = getIndex(i,j,k,l);
}
unsigned int foo::getIndex(int i, int j, int k, int l) {
return index[i][j][k][l];
}
void foo::setUniqueIndexes() {
index[0][0][0][0] = 0;
}
What is really strange is that it compiles if I comment on one of the previous parts of the function setIndexes()or if I delete the operator in setUniqueIndexes()!
NB: , ,