When you #define a macro you are setting up a text substitution. Your code:
#define zero[5][3] = {{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}};
void test() {
for(int a = 0; a < 5; a++) {
for(int b = 0; b < 3; b++) {
VirtArray1[a][b] = zero[a][b];
}
}
}
gets expanded when the macro is processed into:
void test() {
for(int a = 0; a < 5; a++) {
for(int b = 0; b < 3; b++) {
VirtArray1[a][b] = [5][3] = {{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}};[a][b];
}
}
}
As you can see, after the macro substitution this make no syntactic sense. You can't use a #define to create an array. You best bet it to define a const array. Since your values are 0 and 1 you might be able to save a lot of space by using a boolean (0/1, false/true) array. At least use byte rather than storing each bit in a 16-bit integer!
const boolean zero[5][3] = {{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}};
void test() {
for(int a = 0; a < 5; a++) {
for(int b = 0; b < 3; b++) {
VirtArray1[a][b] = zero[a][b];
}
}
}