Che bello, tutti i punti che hai esposto sono frutto di mie conclusioni, derivate da dubbi.
Nippolo ha scritto:
- per inizializzare gli elementi di gen a 0 basta fare
unsigned int gen[DIM] = {0};
quindi il primo for è superfluo;
Visto, infatti in debug ci sono tutti zeri dopo la dichiarazione, avevo già fatto questo controllo ed ero convinto sbagliando che ={0} riempisse solo un elemento, bene, quasta istruzione fa comodo per inizializzare i vettori.
- se conc ha DIM+1 elementi, allora l'ultimo elemento avrà indice DIM, quindi con l'istruzione
conc[DIM+1] = '\0'; // terminatore
stai andando a scrivere in zone di memoria che non competono all'array. Al massimo avresti potuto scrivere
conc[DIM] = '\0';
Ovvio, un errore, non è una bella cosa scrivere in una locazione ram alla cieca.
ma sarebbe stato comunque superfluo in quanto la sequenza di escape \0 è del tutto equivalente a 0 e l'array era già stato inizializzato al momento della dichiarazione
char conc[DIM+1]={0};
Qui torniamo all'uso del tappo, che avevo deciso di non mettere...
Ora capisco che il tappo va messo, ma se l'array di char è inizializzato non serve, perché praticamente gia c'è.
- non serve includere string.h;
Come si fa a sapere se le istruzioni che uso non hanno bisogno delle librerie che avevo inizialmente incluso? a volte provo a cancellare gli include e vedo se ho degli errori, ma non mi sembra un bel sistema.
- come indice per scorrere un array, al posto di col opterei per il più classico i.
Se è generico si, ma in questo caso l'indice è la colonna e col ci calza a pennello.
Inoltre ti consiglio di dichiarare tale variabile all'interno dello stesso for.
Sono abituato in C# a dichiarare le variabili all'interno del for, ma ho letto che non è C standard, si fa solo in C++
Mi piacerebbe scrivere in C, anche perché se dovessi usare le peculiarità del C++, allora programmo in C#, o no?
Il codice è ancora più corto:
#include <stdio.h>
#define DIM 4 // lunghezza della passw, modificabile a piacere
int main()
{
char alfabeto[] = "0123456789ABCDEF"; // alfabeto personalizzato, modificabile a piacere anche in lunghezza, in fila solo per testing
unsigned int LUN = sizeof(alfabeto)-1;
unsigned int n=0, col=0, i=0;
unsigned int gen[DIM]={0}; // conterrà gli indici della stringa generata, si parte con tutti zeri
char conc[DIM+1]={0}; // inizializzata con spazio per il terminatore
do{
for (col=0; col<DIM; col++){
conc[col]=alfabeto[gen[col]];// concateno il carattere che corrisponde all'indice
}
printf("%s combinazioni n. %d\n", conc, ++n);
gen[DIM-1]++; // incremento indice più a destra
for (col=DIM-1; col>0; col--){ // tutte le colonne eccetto la zero
if (gen[col]==LUN){ // raggiunto il massimo indice colonna corrente
gen[col]=0; // azzero l'indice colonna corrente
gen[col-1]++; // incremento l'indice colonna precedente
}else break;
}
}while (gen[0]<LUN); // controllo indice su colonna zero
return 0;
}