PDA

View Full Version : [C] Assertion failure


dreadknight
10-05-2008, 13:45
Salve a tutti, ho scritto un programma che apre due file binari in cui sono contenuti degli interi, di cui gli ultimi due per ogni file rappresentano il numero di righe e colonne di una matrice quadrata: il programma deve allocare dinamicamente le 2 matrici inserendo i numeri contenuti in ciascun file. Successivamente devo confrontare le due matrici, se trovo degli elementi uguali li devo salvare in un vettore il cui contenuto verrā poi memorizzato su un file da me creato.

Questo č il codice che ho scritto:

#include<stdio.h>
#include<stdlib.h>

FILE *fp1,*fp2,*fp3;

int leggi_file(int *,FILE *,char *nome);
void crea_matrice(int *,int **,int);
void visualizza(int **,int);
int cerca_elem(int **,int **,int *,int,int);
void scrivi_file(int *,int);



int main()
{
int i,n,m,dim;
char file1[20],file2[20];
int *v1,*v2,*v3,**matrice1,**matrice2;

printf("Inserisci nome primo file: ");
gets(file1);
printf("Inserisci nome secondo file: ");
gets(file2);

n=leggi_file(v1,fp1,file1);
m=leggi_file(v2,fp2,file2);

if(v1[n]!=v1[n-1])
{
printf("La matrice 1 non e' quadrata\n");

}
else
{
if(v2[m]!=v2[m-1])
{
printf("La matrice 2 non e' quadrata\n");

}
else
{
crea_matrice(v1,matrice1,n);
crea_matrice(v2,matrice2,m);

free(v1);
free(v2);

dim=cerca_elem(matrice1,matrice2,v3,n,m);

for(i=0;i<n;i++)
free(matrice1[i]);
free(matrice1);

for(i=0;i<m;i++)
free(matrice2[i]);
free(matrice2);

scrivi_file(v3,dim);

free(v3);
}
}

return 0;
}


int leggi_file(int *v,FILE *fp,char *nome)
{
int n;
int i=0;

fp=fopen(nome,"rb");
if(fp==NULL)
{
printf("Errore apertura %s\n",nome);

}
else
{
while(!feof(fp))
{
v=(int *)realloc(v,(i+1)*sizeof(int));
n=fread(&v[i],sizeof(int),1,fp);
i++;
}
fclose(fp);

}

return n;
}


void crea_matrice(int *v,int **matrice,int q)
{
int r=v[q];

matrice=(int **)malloc(r*sizeof(int *));

for(int i=0;i<r;i++)
matrice[i]=(int *)malloc(r*sizeof(int));

for(i=0;i<r;i++)
for(int j=0;j<r;j++)
for(int k=0;k<r;k++)
{
matrice[i][j]=v[k];
}

visualizza(matrice,r);
}


void visualizza(int **mat,int c)
{
printf("MATRICE\n\n");

for(int i=0;i<c;i++)
{
for(int j=0;j<c;j++)
{
printf("%d \t", mat[i][j]);
}

printf("\n");
}
}



int cerca_elem(int **m1,int **m2,int *vet,int p,int q)
{
int flag=0;

for(int i=0;i<p;i++)
{
for(int j=0;j<p;j++)
{
for(int k=0;k<p;k++)
{
for(int l=0;l<q;l++)
{
if(m1[i][j]==m2[k][l])
{
vet=(int *)realloc(vet,(flag+1)*sizeof(int));
vet[flag]=m1[i][j];
flag++;
}
}
}
}
}

return flag;
}


void scrivi_file(int *v,int n)
{
fp3=fopen("file3.dat","wb");

if(fp3==NULL)
{
printf("Errore apertura file3.dat\n");
return;
}
else
{
for(int i=0;i<n;i++)
fwrite(&v[i],sizeof(int),1,fp3);
fclose(fp3);

printf("In file3.dat sono stati scritti i seguenti dati\n\n");

for(i=0;i<n;i++)
printf("\nv[%d]= %d",i,v[i]);
}
}




Il problema č che mandando in esecuzione il programma, dopo aver richiesto il nome dei due file da aprire, mi esce una schermata di errore con scritto:

Debug assertion failed!
Program: C:\matrix.exe
File:dbgheap.c
Line:609

Expression:_CrtIsValidHeapPointer(pUserData)


Mi sapreste dare una mano su come risolvere questo problema?

71104
10-05-2008, 20:51
Il problema č che mandando in esecuzione il programma, dopo aver richiesto il nome dei due file da aprire, mi esce una schermata di errore con scritto:

Debug assertion failed!
Program: C:\matrix.exe
File:dbgheap.c
Line:609

Expression:_CrtIsValidHeapPointer(pUserData)
una buona lettura (http://msdn.microsoft.com/en-us/library/ys6cfhhh.aspx) magari non guastava.


Mi sapreste dare una mano su come risolvere questo problema? ci serve lo stack trace.

dreadknight
11-05-2008, 14:34
ho risolto, grazie lo stesso