Основная магия здесь - это тождество в C:
*(a+i) == a[i]
Хорошо, теперь я сделаю так, чтобы этот текст читался на английском.
Вот проблема: имя массива не является lvalue; это не может быть назначено. Таким образом, линия у вас есть с
a = arrayGen(...)
это проблема. Смотрите этот пример:
int main() {
int a[10];
a = arrayGen(a,9);
return 0;
}
, что дает ошибку компиляции:
gcc -o foo foo.c
foo.c: In function 'main':
foo.c:21: error: incompatible types in assignment
Compilation exited abnormally with code 1 at Sun Feb 1 20:05:37
Вам нужно иметь указатель, который равен lvalue, для которого можно назначить результаты.
Этот код, например:
int main() {
int a[10];
int * ip;
/* a = arrayGen(a,9); */
ip = a ; /* or &a[0] */
ip = arrayGen(ip,9);
return 0;
}
отлично компилируется:
gcc -o foo foo.c
Compilation finished at Sun Feb 1 20:09:28
Обратите внимание, что из-за идентификатора вверху вы можете обрабатывать ip как массив, если хотите, как в этом коде:
int main() {
int a[10];
int * ip;
int ix ;
/* a = arrayGen(a,9); */
ip = a ; /* or &a[0] */
ip = arrayGen(ip,9);
for(ix=0; ix < 9; ix++)
ip[ix] = 42 ;
return 0;
}
Полный пример кода
Просто для полноты вот мой полный пример:
int gen(int max){
return 42;
}
int* arrayGen(int arrAddr[], int maxNum)
{
int counter=0;
while(arrAddr[counter] != '\0') {
arrAddr[counter] = gen(maxNum);
counter++;
}
return arrAddr;
}
int main() {
int a[10];
int * ip;
int ix ;
/* a = arrayGen(a,9); */
ip = a ; /* or &a[0] */
ip = arrayGen(ip,9);
for(ix=0; ix < 9; ix++)
ip[ix] = 42 ;
return 0;
}