Guarda il prog è questo...
Creo una matrice di interi,la memorizzo in un vettore rispettando le posizioni(nel senso che la stendo :-)per capirci prima tutta la riga 1 poi la riga 2 etc..). Fatto questo voglio dividere la matrice originale in n sottomatrici partendo dall'array. Quindi divido le dimensioni di base e altezza in 2(o 4 o 8 etc..)e mi calcolo i quadrati risultanti,che poi memorizzo dinamicamente in una lista. Dico che è un errore di heap(grazie per la dritta sono riandato a leggere la differenza fra stck e heap e ho chiarito la lacuna)perchè per matrici piccole tutto funziona bene ma se divido matrici grandi in tanti pezzi(ad es divido larghezza e altezza di una matrice 1000x1000 per 16)dopo qualche passo mi appare la finestra di windows con la scitta "il programma ProvaMatrici.exe ha smesso di funzionare" e devo killare tutto.Il fatto che questo accada solo per matrici grandi mi fa pensare a un problema di occupazione di memoria per questo volevo anche sapere come si gesticono gli errori....Grazie mille e scusa per le varie imprecisioni.
Per inciso uno CodeBlocks 8.02 su Vista
codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define ALTEZZA 100
#define LARGHEZZA 100
#define NOT_COVERED 0
#define COVERED 1
struct lista_array{
int *elemento;
int largh;
int alt;
struct lista_array *next;
};
int main (int argc,char *argv[])
{
int vect[ALTEZZA][LARGHEZZA];
int arr[ALTEZZA*LARGHEZZA];
int cover[ALTEZZA*LARGHEZZA];
int larghezzasub,altezzasub; int larghezzasubBase=LARGHEZZA/2,altezzasubBase=ALTEZZA/2;
int x,i,j,ptr=0,h,k,cnt=1,tmp=0;
struct lista_array *head=NULL,*queue=NULL,*tmp2;
for (i=0;i<ALTEZZA*LARGHEZZA;i++) cover[i]=NOT_COVERED; for(i=0;i<ALTEZZA;i++)//inizializzo matrice e ricavo array lineare
for(j=0;j<LARGHEZZA;j++){
vect[i][j]=cnt++; arr[tmp++]=vect[i][j];
}
if(larghezzasubBase*altezzasubBase>16) {
for (ptr=0;ptr<ALTEZZA*LARGHEZZA;ptr++)
{ if (cover[ptr]==NOT_COVERED)
{ larghezzasub=larghezzasubBase;
altezzasub=altezzasubBase;
k=0;
h=ptr;
if(((((ptr/LARGHEZZA)+1)*LARGHEZZA)-(ptr))<larghezzasub*2) larghezzasub=((((ptr/LARGHEZZA)+1)*LARGHEZZA)-(ptr));
if (ALTEZZA-(ptr/LARGHEZZA)<altezzasub*2) altezzasub=ALTEZZA-(ptr/LARGHEZZA);
tmp2=(struct lista_array *)malloc(sizeof(struct lista_array));
tmp2->largh=larghezzasub;
tmp2->alt=altezzasub;
tmp2->elemento=malloc((larghezzasub*altezzasub)*sizeof(int));
if(head==NULL){
head=tmp2;
tmp2->next=NULL;
queue=tmp2; }
else{ tmp2->next=NULL;
queue->next=tmp2;
queue=tmp2; }
for(i=0;i<altezzasub;i++)
{ for(j=0;j<larghezzasub;j++)
{ tmp2->elemento[k++]=arr[h++];
cover[h-1]=COVERED; }
h+=LARGHEZZA-larghezzasub; }
}
}
}
else printf("\n\nPORZIONE TROPPO PICCOLA DA ANALIZZARE\n\n");
x=1;
tmp2=head;
while(tmp2!=NULL)
{ printf("\n\nSTAMPO %d° SOTTOPORZIONE DELLA MATRICE - DIMENSIONI %d X %d\n\n",x,tmp2->largh,tmp2->alt);
for(i=0;i<(tmp2->largh*tmp2->alt);i++)
{ printf("%5d",tmp2->elemento[i]); }
tmp2=tmp2->next; x++; }
return 0; }