web-dev-qa-db-fra.com

Exception de virgule flottante (vidage de mémoire

Programme: J'ai donc créé un programme qui prend deux nombres, N et L. N est la taille d'un tableau 2D et L est un nombre compris entre 3 et 16. Le programme construit le tableau et commence au centre et se fraye un chemin dans une spirale antihoraire. I est la valeur du centre et lorsque vous parcourez le tableau (dans la spirale), la valeur augmente d'une unité. Si c'est premier, ce numéro sera attribué à cet endroit et sinon * prendra sa place à la place.

Erreur: je reçois une erreur "exception à virgule flottante", comment pourrais-je résoudre ce problème?

Code:

 void Array_Loop( int *Array, int n, int L ) ;

int Is_Prime( int Number ) ;

int main( int argc, char *argv[] ){

  int **Array ;
  int n, L ;

  n = atoi( argv[1] ) ;
  L = atoi( argv[2] ) ;

  Matrix_Build( &Array, n, n ) ;
  Array_Loop( Array, n, L ) ;


  return 0 ;

}

void Array_Loop( int *Array, int n, int L ){

  int i, j, k, h ;
  int lctn, move;

  lctn = n / 2 + 1 ;
  i = lctn ;
  j = lctn ;
  move = 1

  while( i != 0 && j != n ){

    for( j = lctn ; j < lctn + move ; j++ ){

         if( L % 2 == 2) Array[i][j] = -1 ;
         else Array[i][j] = Is_Prime( L ) ;
         L++ ;
    }

    move = move * -1 ;

    for( i = i ; i > lctn - move ; i-- ){

      if( L % 2 == 2) Array[i][j] = -1 ;
      else Array[i][j] = Is_Prime( L ) ;
      L++ ;
    }

    move-- ;

    for( j = j ; j > lctn - move ; j-- ){

      if( L % 2 == 2) Array[i][j] = -1 ;
      else Array[i][j] = Is_Prime( L ) ;
      L++ ;
    }

    move = move * -1 ;

    for( i = i ; i < lctn - move ; i-- ){

      if( L % 2 == 2) Array[i][j] = -1 ;
      else Array[i][j] = Is_Prime( L ) ;
      L++ ;
    }

    move++ ;

  }

}


int Is_Prime( int Number ){

  int i ;

  for( i = 0 ; i < Number / 2 ; i++ ){

    if( Number % i != 0 ) return -1 ;

  }

  return Number ;

}
15
X_Trust

Vous obtenez une exception à virgule flottante car le nombre% i, lorsque i est 0:

int Is_Prime( int Number ){

  int i ;

  for( i = 0 ; i < Number / 2 ; i++ ){

    if( Number % i != 0 ) return -1 ;

  }

  return Number ;

}

Commencez simplement la boucle à i = 2. Puisque i = 1 dans Number% i, il sera toujours égal à zéro, puisque Number est un int.

Btw: Mysticial a fait remarquer d'abord sur les commentaires.

26
dreamcrash

L'exception de virgule flottante se produit en raison d'une infinité inattendue ou de NaN. Vous pouvez suivre cela en utilisant gdb, qui vous permet de voir ce qui se passe à l'intérieur de votre programme C pendant son exécution. Pour plus de détails: https://www.cs.swarthmore.edu/~newhall/unixhelp/howto_gdb.php

En un mot, ces commandes pourraient être utiles ...

gcc -g myprog.c

gdb a.out

gdb core a.out

ddd a.out

7
Amitesh Ranjan

En effet, dans la première itération, Number est , et le code

Number % i

donne une valeur infinie et pour éviter les erreurs, le compilateur la gère dans la gestion des exceptions, vous donnant cette erreur d'exécution.

Pour éviter cela, exécutez simplement une boucle for indexée en 2.

1
Vedant Jain