[C]Estrarre sottomatrice
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[i] = malloc(sizeof(int)*m); } for (i = 0; i < n; i++) for (j = 0; j < m; j++) { scanf("%d", &val); M[i][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[i][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[i][j]); } printf("\n"); } printf("\n"); }
Risposte
ahahahah per caso è la prima volta che usi un compilatore?
prova a scrivere
prova a scrivere
system("PAUSE")prima di
return 0dentro la funzione main e vedi che succede
Ti ho modificato il codice in modo che venisse inserito usando il tag CODE e riformattato per una più agevole lettura.
"walter89":
ahahahah per caso è la prima volta che usi un compilatore?
prova a scriveresystem("PAUSE")prima direturn 0dentro la funzione main e vedi che succede
Questa è una "soluzione" non portabile e poco sensata per risolvere il problema. Molti IDE possiedono metodi ad hoc per farlo, anche se non sono sicuro lo faccia quel rottame di Dev-C++. Di fatto ti basta metterci un scanf per fare lo stesso di system... Oppure anche bloccare il debug nella riga prima del return.
@Viola: che cosa usi per programmare
P.S.: Il problema non è nel compilatore.
Grazie a tutti per le risposte! Sì sono alle prime armi con il compilatore (dev c++ con Mingw anche se mi interessano file .c), sicuramente l'errore è nel programma, forse allocazione delle matrici? o gli indici? Ho fatto vari programmi, non è il system pause... grazie per la pazienza!
"apatriarca":
Ti ho modificato il codice in modo che venisse inserito usando il tag CODE e riformattato per una più agevole lettura.
Grazie mille non sapevo come fare!
Ho dato una occhiata al tuo codice e credo che il problema sia dovuto all'allocazione sbagliata di M1. Allochi infatti l'array di puntatori, ma non allochi (ne inizializzi) le righe.
"apatriarca":
Ho dato una occhiata al tuo codice e credo che il problema sia dovuto all'allocazione sbagliata di M1. Allochi infatti l'array di puntatori, ma non allochi (ne inizializzi) le righe.
Cavolo, hai ragione! Brutte notizie però... non mi funziona cmq... ho provato a cambiare indici (arrivando a cose in effetti improbabili) quest'altra versione mi sembra più intelligente ma non funziona comunque...

for (i=0;i<n;i++) for(j=0;j<n;j++) if((i>=startRow)&&(i<=endRow)&&(j>=startCol)&&(j<=endCol)) M1[i-startRow][j-endRow]=M[i][j];
Riguardo agli indici puoi scriverlo nel modo seguente:
Ho eliminato la selezione e corretto alcuni errori di distrazione (come usare endRow al posto di startCol per j..).
for (i=startRow;i<n && i <= endRow;i++) { for(j=startCol;j<m && j <= endCol;j++) { M1[i-startRow][j-startCol]=M[i][j]; } }
Ho eliminato la selezione e corretto alcuni errori di distrazione (come usare endRow al posto di startCol per j..).