Ho pensato ad un paio di possibili estensioni del linguaggio C che mi piacerebbe conoscere l'opinione degli altri su. 1 Questo riguarda gli array multidimensionali.
Immagina la seguente situazione in C:
void matrix_mul(double **res, double **a, double **b, size_t n, size_t m, size_t r);
Non puoi passare una double mat[4][4]
(per esempio) a questa funzione. Se si definisce la funzione come:
void matrix_mul_N_M_R(double res[N][R], double a[N][M], double b[M][R]);
Stai solo perdendo un algoritmo fine perfettamente scritto su una certa dimensione di matrici.
Ciò che è venuto a me (nella doccia ovviamente), era il decadimento di array multidimensionali a puntatori multi-livello. Questa è un'estensione al decadimento degli array 1d ai puntatori.
Semanticamente, questo consentirebbe al primo tipo di funzione di funzionare su qualsiasi array bidimensionale. Tecnicamente, questo è il modo in cui sarebbe implementato. Il seguente codice:
double a[3][5];
double b[5][4];
double c[3][4];
...
matrix_mul(c, a, b, 3, 5, 4);
sarebbe equivalente a:
double a[3][5];
double b[5][4];
double c[3][4];
...
double **__a_decay = {a[0], a[1], a[2]}; /* generated by compiler */
double **__b_decay = {b[0], b[1], b[2], b[3], b[4]}; /* generated by compiler */
double **__c_decay = {c[0], c[1], c[2]}; /* generated by compiler */
matrix_mul(__c_decay, __a_decay, __b_decay, 3, 5, 4); /* first three arguments decayed */
L'applicazione per tale estensione è molto limitata? Ci sono insidie? Questo potrebbe portare a codice non sicuro dove non usare questa funzione non lo farebbe? In quale altro posto potrebbe essere utile una funzione del genere?
1 Nota che non ho intenzione di creare un'altra lingua da solo, ma vorrei essere sicuro dei vantaggi e delle insidie della funzione prima di provare a suggerirli al C Standard Committee.