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 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> imbriqué pour la boucle code> pour cela? 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;
}
6 Réponses :
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: puis dites p> et dans gdb disent S'il se bloque, dites exécuter p> p> p> p> p> p> p> P>
où code> et GDB vous indique, où le crash s'est produit. Ensuite, vous êtes maintenant dans quelle ligne l'erreur est. P> p>
Vous essayez de saisir en règle générale - allouer de grandes structures sur le tas avec Dans ce cas, vous pouvez remplacer la déclaration de 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. malloc (3) code>
. Ou utilisez des matrices statiques - en dehors de la portée de toute fonction. P> majorArray code> avec: p>
int (*majorArray)[1000] = calloc(1000, sizeof majorArray);
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 Essayez de déplacer la déclaration de < Code> MajoraRay Code> Out of Au fait, cette comparaison est à l'envers: p> 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. p> p> int code>) - qui pourrait facilement être trop gros.
Main CODE> (Mettez-le juste après le
#include code> s) - il s'agira d'une variable globale, qui vient d'une allocation différente. piscine qui peut être beaucoup plus grande. p>
Oh, whoops. Merci pour cette prise! ^. ^ ;; Aussi: déplacer le majorparray hors de la fonction principale a fait le tour, merci!
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. P>
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;
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.
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. P>
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 (); code> est au mauvais endroit, il devrait être juste avant la boucle, sinon sa réinitialisation boucle, servant aucun but