PDA

Visualizza la versione completa : [C] Esercizio: vettori e matrici con allocazione dinamica


dodo154
07-02-2011, 09:47
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


#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");
}

}

LeleFT
07-02-2011, 13:37
Originariamente inviato da dodo154
ho abbozzato qualche riga di codice ma... non funge;

Cioè?
Dà errori in compilazione? Quali?
Dà errori in esecuzione? Quali?
Dà risultati errati? Quali?

Non si può lasciare il problema all'immaginazione di chi legge. Si deve essere quanto più precisi possibile, riportando tutti i messaggi di errore che si hanno.


Ciao. :ciauz:

dodo154
07-02-2011, 13:55
errore di segmentazione...

Laikius91
08-02-2011, 09:08
Originariamente inviato da dodo154
errore di segmentazione...

Con il debugger non riesci a capire almeno dove ha luogo questo errore?
Nelle allocazioni dinamiche non metti mai il casting dei puntatori ma non penso sia quello...

YuYevon
09-02-2011, 10:24
Tanto per dirne una dato che non ho letto per intero tutto il codice, sbagli l'allocazione dinamica della memoria per la matrice all'interno della funzione. Qui (http://forum.html.it/forum/showthread.php?s=&threadid=1444634) c'è una discussione utile su questo problema. Correggi quello, poi magari riposta il codice corretto se ti dà ancora problemi (possibilmente con un'indentazione migliore :))

Loading