Problema sottomatrice c

di il
5 risposte

Problema sottomatrice c

Ciao a tutti,avrei bisogno di una mano. Devo creare un programma che estragga una sottomatrice a partire da una matrice inserita da tastiera. Cio' deve avvenire in una funzione dove vengono restituiti la matrice e i parametri. Ci deve essere qualche problema perché il programma viene compilato ma se mandato in esecuzione si chiude automaticamente. Mi date una mano?? Grazie!

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


int ** get_submatrix(int **M, int n, int m, int startRow, int endRow, int startCol, int endCol, int *row, int *col);
void print_matrix(int **M, int n, int m);

int main() {

int i,j, n,m, val;
int **M;
int startRow=2;
int endRow=3;
int startCol=2; int endCol=3;
int **M1;
int n1,m1;

scanf("%d", &n);
scanf("%d", &m);

M = (int**)malloc(sizeof(int*)*n);
for (i = 0; i < n; i++) {
M = malloc(sizeof(int)*m);
}

for (i = 0; i < n; i++)
for (j = 0; j < m; j++) {

scanf("%d", &val);
M[j] = val;
}

print_matrix(M, n, m);
M1 = get_submatrix(M,n,m,startRow,endRow,startCol,endCol,&n1,&m1);

print_matrix(M1, n1, m1);

int s;

for (s = 0; s < n1; s++) free(M1[s]);

free(M1);

return 0;
}


int ** get_submatrix(int **M, int n, int m, int startRow, int endRow, int startCol, int endCol, int *row, int *col){
int i,j,r,c,l,k,primo,primoj;
int **M1;
k=0;l=0;
r=endRow-startRow+1;
primo=startRow+1; primoj=startCol+1;
c=endCol-startCol+1;
M1=(int**)malloc(sizeof(int*)*r);
for (i=startRow;i<endRow;i++)
for(j=startCol;j<endCol;j++)
for(k=0;k<r;k++)
for(l=0;l<c;l++)

// if(i >= startRow && i <= endRow && j >= startCol && j <= endCol)
{

M1[k][l]=M[j]; }
*row=r;
*col=c;
return M1;
}


void print_matrix(int **M, int n, int m){

int i,j;

for (i = 0; i < n; i++){
for (j = 0; j < m; j++){
printf("%d\t",M[j]);
}
printf("\n");
}

printf("\n");
}

5 Risposte

  • Re: Problema sottomatrice c

    Di solito quando il programma si chiude automaticamente e perchè evidentemente c'è un errore tra l'indice della matrice e la dimensione della matrice.
    cioè in parole povere un indice sfora.
    dal programma non riesco a capire la dimensione della matrice.
    comunque se devi solo visualizzare la matrice la get_submatrix è inutile in quanto puoi usare la matrice originaria per trarre i dati.
    basta che fai la funzione di stampa.
    la matrice la passi per puntatore e passi le altre informazioni.
    per esempio cosi
    void print_matrix(int **M, int n, int m, int startRow, int endRow, int startCol, int endCol)
    {
    int i,j;
    for (i = StartRow; i < endRow; i++){
    for (j = startCol; j < endCol; j++){
    printf("%d\t",M[i][j]);
    }
    printf("\n");
    }
    
    printf("\n");
    }
  • Re: Problema sottomatrice c

    Appoggio il commento di smalldragon.
    Comunque per tornare al tuo codice originario, nella funzione get_submatrix() la matrice M1 non viene completamente allocata (nel main, invece, M è allocata correttamente) e quindi al primo tentativo di scrivere in M1 probabilmente manda in crash il programma.
    Pignoleria: anche se non ti darà nessun crash, non deallochi M...
  • Re: Problema sottomatrice c

    Grazie a tutti per le risposte!Il fatto è che questo è un estratto di un programma più complesso (e lungo), ho bisogno che la funzione Getsubmatrix restituisca una matrice e i parametri di Row e Col... scusami Candaluar, che intendi quando dici che la matrice non è completamente allocata? La dichiarazione viene fatta mel main, è la funzione get submatrix che dovrebbe allocarla.. dove sbaglio? Grazie ancora!
  • Re: Problema sottomatrice c

    Ok non è vero, sono d'accordo che era mal allocata e l'ho modificato, purtroppo il problema non era (solo) solo quello...
  • Re: Problema sottomatrice c

    Allora se vuoi conservare la get_submatrix
    devi allocare la matrice m1 nella main
    infatti l'istruzione
    M1 = get_submatrix(M,n,m,startRow,endRow,startCol,endCol,&n1,&m1);
    vorrebbe significarmi esegui get_submatrix con questi parametri e ritornami una matrice.
    ma essendo m1 definita e non allocata cio' fa si che il programma venga eseguito in maniera anomale.
    se noti mentre la matrice m nel main ha:
    int **M;
    M = (int**)malloc(sizeof(int*)*n);
    for (i = 0; i < n; i++) {
    M[i] = malloc(sizeof(int)*m);
    non c'è la stessa sequenza per m1.
    m1 viene definita ed allocata all'interno di get_submatrix.
    quindi come potrebbe ricevere i dati la m1 del main se non è allocata ?
    ciò che ti consiglio è di definire ed allocare la matrice m1 nel main
    poi la passi come parametro modificabile alla funzione.
    ciò si fa passandola per puntatore.
    ricordati che alla fine del main devi liberare la memoria allocata di entrambe le matrici e non solo di una come fai.
    per quanto riguarda la get_submatrix ti consiglio di usare un tipo void.
    spero di esserti stato di aiuto.
Devi accedere o registrarti per scrivere nel forum
5 risposte