salve a tutti!
sono nuovo del forum, avrei un quesito da proporre a voi che sicuramente siete più esperti.
Ho quest'esercizio:
In un file binario è memorizzata una sequenza non ordinata di numeri(pari e dispari);
il numero di questi interi è dispari;
dichiarare, chiamare e definire opportune funzioni che sono in grado di allocare in memoria dinamica, una matrice quadrata la cui dimensione è uguale all'elemento che sta al centro della sequenza;
inizializzare la matrice con tutti gli interi presenti nel file (escluso l'intero che stabilisce la dimensione);
riempire le restanti celle della matrice allocata con zero.
ho abbozzato qualche riga di codice ma... non funge; qualcuno di voi può darmi una mano?
vi ringrazio in anticipo
codice:
#include<stdio.h>
#include<stdlib.h>
int** carica(int*,int***);
void stampa(int,int***);
int main(void)
{
int** matrice=NULL;
int dim=0;
matrice=carica(&dim,&matrice);
stampa(dim,&matrice);
return 0;
}
int** carica(int* dim, int*** mat)
{
FILE* fp;
int i,j,ele;
int conta=0;
int k=0;
int z=0; // indice del vettore
int* vett;
fp=fopen("immagine.dat","rb");
while(!feof(fp))
conta++; //voglio sapere il numero degli elementi
conta= conta/2; // ho il numero degli elementi della prima parte
rewind(fp);
for(i=0;i<conta+1;i++)
fread(dim,sizeof(int), 1, fp);
rewind(fp);
//allocazione dinamica vettore
conta=conta*2; // vettore di soli elementi escluso l'elemento centrale del file binario
vett=malloc(sizeof(int)*conta);
i=0;
for(;i<conta/2;i++)
fread(&vett[i],sizeof(int),1,fp);
fseek(fp,4,1); //salto i 4 byte dell'elemento centrale
for(;i<conta/2;i++)
fread(&vett[i],sizeof(int),1,fp);
fclose(fp);
//allocazione dinamica matrice
*mat=malloc((*dim)*sizeof(int*));
for(i=0;i<*dim;i++)
*mat[i]=malloc(sizeof(int)*(*dim));
/*inserimento in matrice*/
for(i=0;i<*dim && z<conta;i++)
{
for(j=0;j<*dim && z<conta;j++)
{
(*mat)[i][j]=vett[z];
z++;
}
}
if(z==(*dim)*(*dim)) //caso particolare in cui il numero degli elementi dell'array concide esattamente con gli elementi della matrice
return *mat;
else if(j==*dim)
{
i++; // altrimenti passa alla nuova riga
j=0;
if(i==*dim)
return *mat;
}
// ora avrò i e j corrispondenti alla posizione dove comincia l'assegnamento degli zeri
while(j!=*dim)
{
(*mat)[i][j]= 0; // completo la riga di zeri
j++;
}
for(;i<*dim;i++)
{
for(j=0;j<*dim ;j++)
{
(*mat)[i][j]=0;
}
}
return *mat;
}
void stampa(int dim, int*** mat)
{
int i,j;
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
printf("%d\t", (*mat)[i][j]);
}
printf("\n\n");
}
}