Segmentation fault ( core dumped )

di il
3 risposte

Segmentation fault ( core dumped )

Salve,
ho scritto il seguente programma per implementare il metodo di eliminazione di Gauss su matrici con un procedimento iterativo senza ricorrere alla ricorsione.
Viene compilato correttamente ma mi restituisce il codice 139, ossia Segmentation fault (core dumped).
Qualcuno di voi riesce a capire il motivo?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define MAX 20

typedef float tMatrice[MAX][MAX];

int validazione_input_intero ( int );
int conta_gradini ( tMatrice, int, int );
void stampa_matrice ( tMatrice, int, int );
void eliminazione_gauss ( tMatrice, int, int);

int main()
{
   int i, j, m, n, p, v;
   double t;
   tMatrice M;

   printf ("\nInserisci il numero di righe della matrice: ");
	m = validazione_input_intero (v);

   printf ("\nInserisci il numero di colonne della matrice: ");
   n = validazione_input_intero (v);

   printf("\nInserisci i valori della matrice da sx a dx in ordine di riga:\n");
	 
	 for (i=0; i<m; i++) {
	    for (j=0; j<n; j++) { 
          scanf("%f", &M[i][j]) ; }
       printf ("\n"); }

   stampa_matrice (M, m, n);

   srand(time(NULL));

   clock_t start=clock();

   eliminazione_gauss ( M, m, n );

   clock_t end=clock();
     t=((double)(end-start)) / CLOCKS_PER_SEC;
     printf("\nTempo di esecuzione = %f secondi\n", t) ;

   return 0;
}

int validazione_input_intero ( int v )
{
	int c;
	do
	    { c=scanf("%d", &v);
	      if (c==0)
	          {
	      	scanf ("%*[^\n]");
	      	printf ("Attenzione: input non valido. Inserire input valido: ");
	           }
	     } while (c==0);
	  
	  if (v<=0)
	    {  v=-v;
	       printf ("%d", v);
	    }
	 else 
	     { if(v>MAX)
	         {   printf ("%d", v);
	             printf(" viene scalato a %d", MAX);
	        v=MAX;
	         }
	      else
	         { printf("%d", v); }
	     }
	  
	  return v;
}

int conta_gradini ( tMatrice M, int m, int n)
{
   int i, j = 0;
   int zeri = 0, k = 0;
   int zericolonnapreced;

   for ( i = m-1; i >= 0; i--) {
       if ( M[i][j] == 0) { zeri++; }
       else { 
           i = -1; 
           zericolonnapreced = zeri;
           zeri = 0; } }
     
     for (j = 1; j < n; j++) {
        for (i = m-1; i >= 0; i--) {
           if (M[i][j] == 0) { zeri++; }
           else { 
              i = -1;
              if ( zeri < zericolonnapreced ) { k++; }
              zericolonnapreced = zeri; 
              zeri = 0; } } }

return k;
}

void stampa_matrice ( tMatrice M, int m, int n )
{
 int i, j;

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

void eliminazione_gauss ( tMatrice M, int m, int n )
{
int i, j, r, s, k, iterazione = 0;
tMatrice T;
    
         k = conta_gradini ( M, m, n );
         printf ("\ngradini = %d", k);
         printf ("\n");

   if ( m >= n ) { r = n - 1; }
   else { r = m - 1; }

  while ( k <= r ) {
   for ( j = iterazione; j < n; j++ ) {
        s = 0;
         for ( i = iterazione; i < m; i++ ) {
            if ( (int)M[i][j] == 0 ) { s = i+1; }
            else {
               i = m;
               j = n; } } }
   printf ("\ns = %d", s); 
   printf ("\n");

   for ( i = 0; i < MAX; i++ ) {
    for ( j = 0; j < MAX; j++ ) {
    T[i][j] = 0; } }
 
   if ( (int)M[iterazione][iterazione] == 0 ) {
      for ( j = iterazione; j < n; j++ ) {
         T[s][j] = M[s][j];
         M[s][j] = M[iterazione][j];
         M[iterazione][j] = T[s][j]; } }
   else {
      for ( i = iterazione+1; i < m; i++ ) {
         for ( j = iterazione; j < n; j++ ) {
            T[i][j] = M[i][j] - M[iterazione][j] * ( M[i][iterazione] / M[iterazione][iterazione] ) ; } }

   for ( i = iterazione+1; i < m; i++ ) {
    for ( j = iterazione; j < n; j++ ) {
     M[i][j] = T[i][j]; } } }

   stampa_matrice (M, m, n);

   iterazione++;

   k = conta_gradini ( M, m, n );
   printf ("\ngradini = %d", k);
   printf ("\n"); }

}

3 Risposte

  • Re: Segmentation fault ( core dumped )

    Mah ... non ho controllato l'algoritmo (non ho il tempo) ma ho eseguito in debug per capire il problema ...

    La conta_gradini restituisce sempre 1 e k non varia mai in quanto anche r è 1. Il ciclo continua all'infinito e iterazione aumenta finché non va oltre i limiti degli array e hai il seg fault. Parti da queste informazioni per capire cosa devi correggere.
  • Re: Segmentation fault ( core dumped )

    @beowulf nell'altro topic ti ho dato alcuni consigli, ma noto che li hai completamente ignorati!
  • Re: Segmentation fault ( core dumped )

    Nippolo ho visto le tue risposte all'altro post solo ora. Al più presto proverò a mettere in pratica i tuoi consigli.
Devi accedere o registrarti per scrivere nel forum
3 risposte