9
votes

Défaut SEG lors de l'initialisation de la matrice

Je prends une classe sur C et je suis en train de faire une faute de segmentation. D'après ce que je comprends, les défauts SEG sont censés se produire lorsque vous accédez à la mémoire qui n'a pas été allouée ou autrement en dehors des limites. Parcours, tout ce que j'essaie de faire est d'initialiser un tableau (bien que très grand à cela)

suis-je simplement mal compris comment analyser un tableau 2D? Égaré une liaison est exactement ce qui pourrait causer une faute SEG - je me trompe d'utiliser un imbriqué pour la boucle code> pour cela? P>

Le professeur a fourni les fonctions de l'horloge, alors je " m espérant que ce n'est pas le problème. Je cours ce code dans Cygwin, pourrait-il être le problème? Le code source suit. Utiliser également la norme C99. P>

Pour être parfaitement clair: je cherche de l'aide Comprendre (et finalement à la fixer) La raison que mon code produit une défaillance SEG. P>

#include <stdio.h>
#include <time.h>
int main(void){
   //first define the array and two doubles to count elapsed seconds.   
   double rowMajor, colMajor;
   rowMajor = colMajor = 0;
   int majorArray [1000][1000] = {};

   clock_t start, end;

   //set it up to perform the test 100 times.
   for(int k = 0; k<10; k++)
   {
   start=clock();
   //first we do row major
   for(int i = 0; i < 1000; i++)
   {
       for(int j = 0; j<1000; j++)
       {
           majorArray[i][j] = 314;
       }
   }
   end=clock();
   rowMajor+= (end-start)/(double)CLOCKS_PER_SEC;
   //at this point, we've only done rowMajor, so elapsed = rowMajor
   start=clock();
   //now we do column major
     for(int i = 0; i < 1000; i++)
   {
       for(int j = 0; j<1000; j++)
       {
           majorArray[j][i] = 314;
       }
   }
   end=clock();
   colMajor += (end-start)/(double)CLOCKS_PER_SEC;
   }
   //now that we've done the calculations 100 times, we can compare the values.
   printf("Row major took %f seconds\n", rowMajor);
   printf("Column major took %f seconds\n", colMajor);
   if(rowMajor<colMajor)
   {
     printf("Row major is faster\n");
   }
   else
   {
      printf("Column major is faster\n");
   }

   return 0;

}


2 commentaires

C'est une grande question de devoirs. Bien écrit, bien pensé, et quelques réponses de personnes me apprenaient en fait quelque chose que je ne savais pas (spécifiquement des limites de taille de la pile). Je vous félicite pour cela, op.


Non liée à votre question, mais que vous voyez comme il s'agit de devoirs: il apparaît que votre premier Démarrer = heure (); est au mauvais endroit, il devrait être juste avant la boucle, sinon sa réinitialisation boucle, servant aucun but


6 Réponses :


1
votes

Ce code se déroule bien pour moi sous Linux et je ne vois rien de manifestement faux à ce sujet. Vous pouvez essayer de le déboguer via GDB. Compilez-le comme ceci: xxx

puis dites xxx

et dans gdb disent exécuter

S'il se bloque, dites et GDB vous indique, où le crash s'est produit. Ensuite, vous êtes maintenant dans quelle ligne l'erreur est.


0 commentaires

6
votes

Vous essayez de saisir 1000 * 1000 * Tailleof (int) code> octets sur la pile. C'est plus que votre système d'exploitation permet de la croissance de la pile. Si sur n'importe quel Unix - vérifiez le ulimit -a code> pour Max pile taille du processus.

en règle générale - allouer de grandes structures sur le tas avec malloc (3) code> . Ou utilisez des matrices statiques - en dehors de la portée de toute fonction. P>

Dans ce cas, vous pouvez remplacer la déclaration de majorArray code> avec: p>

int (*majorArray)[1000] = calloc(1000, sizeof majorArray);


0 commentaires

11
votes

Votre programme fonctionne correctement sur mon ordinateur (X86-64 / Linux), donc je suppose que vous rencontrez une limite spécifique au système sur la taille de la pile d'appel. Je ne sais pas combien de pile vous obtenez sur Cygwin, mais votre tableau est de 4 000 000 octets (avec int ) - qui pourrait facilement être trop gros.

Essayez de déplacer la déclaration de < Code> MajoraRay Out of Main (Mettez-le juste après le #include s) - il s'agira d'une variable globale, qui vient d'une allocation différente. piscine qui peut être beaucoup plus grande.

Au fait, cette comparaison est à l'envers: xxx

aussi, pour faire un test comme celui-ci que vous devez vraiment faire Répétez le processus pour de nombreuses tailles et formes de matrices différentes.


1 commentaires

Oh, whoops. Merci pour cette prise! ^. ^ ;; Aussi: déplacer le majorparray hors de la fonction principale a fait le tour, merci!



1
votes

Le programme fonctionne parfaitement lors de la compilation de GCC, et d'exécuter Linux, Cygwin peut très bien être votre problème ici.


0 commentaires

3
votes

Je n'ai pas pu trouver d'erreur dans votre code. Je l'ai donc compilé et je l'exécutions et travaillé comme prévu.

Vous avez, cependant, une erreur sémantique dans votre code: P>

#include <stdio.h>
#include <time.h>

int majorArray [1000][1000];

int main(void){
   //first define the array and two doubles to count elapsed seconds.   
   double rowMajor, colMajor;
   rowMajor = colMajor = 0;


1 commentaires

Merci. J'ai attrapé le problème avec l'horloge de départ moi-même et j'ai maintenant mis à jour le PO pour refléter cela.



0
votes

Si cela fonctionne correctement ailleurs, vous essayez probablement de saisir plus d'espace de pile que le système d'exploitation le permet. Vous allouez 4 Mo sur la pile (1 entiers de moulin), qui est beaucoup trop pour allouer "en toute sécurité" sur la pile. Malloc () et Gratuit () sont vos meilleurs paris ici.


0 commentaires