turns out that fixed size arrays are the only type which cannot actually be returned from a function
I'm sorry to say this, but this is very basic C here. As said above, a possible workaround is to put the array inside a struct and return that.
One very simple way of at least "trying" what you wanted to do, instead of having to look for the appropriate syntax, would have to have defined an array type and use this as the return type. Like so:
typedef int MyArray_t[N];
(...)
MyArray_t SomeFunction(...) ...
Of course, then you get an appropriate error instead of a cryptic syntax error: "error: 'SomeFunction' declared as function returning an array".
That is something I recommend for instance to use function pointer types. Easier to deal with with a typedef.
And that said, returning an "array" (or any struct that is big enough for that matter), is pretty inefficient due to how C handles return values, so that's probably the main reason why the authors thought it was silly.
The associated C rule that makes it consistent is that you can't assign an array to an array. The corresponding error will be: "error: assignment to expression with array type".
So returning an array from a function wouldn't really make sense. Arrays are a special beast in C, designed merely for convenience of simple allocation. The "value" of an array in C is not an "array" of items, it's just a pointer to it. The only exception to this is that sizeof() returns the correct size. Yes it seems a bit inconsistent, but again it's very basic C.
Now why did the authors of C think returning a struct was interesting, and not an array: well as much as they decided, again, that structs could be used as values. That was probably meant to be used with relatively small structs as a convenience to avoid passing many parameters to functions instead of one, or likewise returning several scalar values from functions instead of just one. Arrays have been thought of as a convenience from the start, structures have always been a "proper" data structure.
And there is one of my biggest gripes, no offense meant to anyone, just something that I've seen often enough to think it's not just a random fact: C is very often seen as so "simple" that many people actually do not care learning the language properly. An astounding number of C programmers actually *don't* know the language. They just appear to know enough to write code. And this is one of the biggest problems with C: not the language itself (even though there are things to be said here), but the way it's taught (or even self-taught most often)... It's simple enough that many don't learn it right, yet flexible enough that you may think you don't *need* to learn it all, and then you can shoot yourself in the foot with it. Some languages are even simpler than C, such as Pascal or even more so, Oberon, but then they are so rigid that people have no choice but learn them right. So even though those languages are too rigid for my taste, I definitely think Wirth was right about the learning factor.
And so to finally answer the OP's question: "does anybody learn C anymore?" Well, the right question, to me, would look more like: how many have actually learned C properly, and why would you think things had gotten any better? Most C courses are a complete disaster.
And obviously, the part of the question dealing with "is C still useful today", the answer is a gigantic YES.