Prego.
Ci sono delle imperfezioni nel codice che hai scritto:
1) Inizializzazione array cellula - Non è sufficiente definire <spazio> il primo carattere dell'array -
gli altri elementi possono essere sporchi. Le soluzioni:
...
for (i=0;i<80;i++)
for (j=0;j<80;j++)
cellula[i][j]=' ';
...
// oppure
...
memset (&cellula[0][0],' ', 80*80);
..
2) Non devi ciclare 40 volte su fill(cellula,80) - devi chiamarla solo una volta
3) E' incorretto il passaggio del primo argomento alla funzione fill - Alcuni compilatori lo segnalano:
>warning: passing argument 1 of ‘fill’ from incompatible pointer type
>note: expected ‘char *’ but argument is of type ‘char (*)[80]’
bisona passare l'indirizzo del primo elemento cioè:
&cellula[0][0]
4) La visualizzazione che usi dovrebbe aggiungere un '\n' all'uscita del secondo ciclo
Chiarimento:
Quando si definisce un array multidimensionale, si alloca della memoria contigua nell' heap.
Per cui se definisco cellula[80][80] possono tranquillamente affermare che l'indirizzo:
&cellula[1][0] == (&cellula[0][0])+80.
Soluzione:
Conoscendo questo, rilevando dei valori di incremento costante, vado direttamente a puntare sull'elemento da modificare che nel tuo caso si trova sempre ad 80-1 dal precendente. La lunghezza di riempimento aumenta sempre di 2.
Avrei potuto scrivere fill usando un solo ciclo for. Per esempio:
void fill (char *buf,int size)
{
int i,len;
for (len=1,i=size/2;len<=size;i+=(size-1),len+=2)
memset (buf+i,'X',len);
}
Saluti,
Max