Nel main, dim non è inizializzata e anche se lo fosse l'istruzione:
double *A[dim];
appartiene allo standard C99, che in pratica è supportato solo da gcc e vari porting. Appena cambi compilatore non funziona più.
Se devi dimensionare al volo qualcosa l'unica strada è usare puntatori, doppi puntatori e new.
Tra l'altro non capisco il senso di:
N[dim] = new (nothrow) double[dim];
Con quella forma il new non lancia eccezioni, pertanto non sai se hai davvero allocato la memoria o no. Per di più non fai nessun test su N, ma ti limiti a usarlo come se tutto vada bene.
Ora è vero che è praticamente impossibile avere eccezioni su una simile allocazione, ma operator new è ridefinibile a livello globale e non è detto che in futuro non ti ritrovi a usare una libreria che lo ridefinisca per qualche scopo particolare (ad esempio usare un allocatore più performante di quello di sistema).