Code:
typedef Digit Sail[ 3+1 ];
typedef char Name[ MaxName + 1 ];
This is wrong. No, you're right, it actually does compile. But it's still wrong. You are declaring what exactly here? The first translates to:

typedef char Sail[4];

Which in your mind is doing what eactly? Also, since this is actually declaring a new data type, please illustrate how you'd create an instance of said type. It boggles my mind.

For example, all of the following still allow my program to compile:

Sail;
Sail a;
Sail b[5];

And yet, I'm still not exactly sure what type of data you're trying to create or how you'd use these instances. It's just very very odd.

Anyway, while it does compile, it's likely not behaving how you want it to.

Quzah.