0
votes

Pourquoi ce code me donne-t-il une erreur SIGSEGV?

Pourquoi ce code me donne-t-il une erreur d'exécution SIGSEGV? J'ai essayé d'exécuter le code et fonctionne parfaitement dans codeblocks, mais certains IDE me donnent ces erreurs.

Il prend une série Fibonacci puis module chaque numéro de la série et prend uniquement les numéros à Eve Places jusqu'à ce qu'un seul numéro soit obtenu. . P>

Par exemple: entrée 1 9 {0 1 1 2 3 5 8 13 21} -> {0 1 1 2 3 5 8 3 1} -> {1 2 5 3} -> {2 3} -> 3 P>

#include <stdio.h>

int main(void) {
    // your code goes here
    int n,j,k,r,o;
    o=0;


//  printf("enter the number of test cases: ");
    scanf("%d",&n);
    int s[n];
    int a;
    a=n;

    while(n!=0)
    {


         r=k;
         int e[k/2];
         int m;
         scanf("%d",&k);//enter say 9
      if(k!=1)
            {
              int i[k];
              i[0]=0;
              i[1]=1;

              for(j=0;j<k;j++)
                  {
                     if(j>1)
                       {
                         i[j]=(i[j-2]+i[j-1])%10;
                       }


                  }


              while(r!=1)
                {
                 m=0;

                 for(j=0;j<r;j++)
                    {

                      if(j!=0)
                       {

                        if(j%2!=0)
                         {
                           e[m]=i[j];
                           m++;
                         }
                       }
                    }

                 for(j=0;j<k/2;j++)
                    {
                      i[j]=e[j];
                    }
                 r=r/2;
                }
             s[o]=e[0];
             o++;
             n--;
           }
        else
           {
             return 0;
           }


    }
    if(k!=1)
      {
        for(j=0;j<a;j++)
         {
             printf("%d\n",s[j]);
         }
      }


    return 0;
}


5 commentaires

Compiler avec le niveau d'avertissement maximisé (généralement -w4 ou -w4 en fonction du compilateur, bien qu'il existe d'autres possibilités et des améliorations) et résolvent les problèmes qu'il avertit de . L'un d'entre eux est assez grave.


r = k; int e [k / 2]; int m; scanf ("% d", & k);


Modification de la question après que les réponses ont déjà été données pour résoudre le problème initial ne sont pas utiles pour les futurs utilisateurs en regardant cet article. Il invalide les réponses qui ont résolu le problème initial.


Désolé je vais le modifier


Conseil général: Exécution du programme dans un débogueur devrait vous montrer où se produit l'exception. Cela peut être utilisé comme point de départ pour rechercher la raison.


3 Réponses :


0
votes

Votre variable K est ininitialisée lorsque vous l'accédez d'abord à

r=k;
int e[k/2];


3 commentaires

D'accord, j'ai donc oublié que je l'ai fait initialement et ma déclaration de R = K, et int E [k / 2] après la fonction Scanf, mais cela me donne toujours une erreur SIGSEGV dans et différent IDE Le code fonctionne bien dans CodeBlocks


Je les écris pour Codechef mais que vous obtenez ces erreurs encore et encore


Après l'initialisation k avant de l'utiliser, je ne peux pas reproduire le problème. Vous devez peut-être vous assurer que les entrées sont valides. Vous pouvez ajouter une erreur d'erreur pour vous assurer que les numéros de N et k sont dans une certaine plage par exemple.



0
votes

Il suffit de mettre le scanf ("% d", & k); code> ci-dessus r = k; code>

Un SIGSEGV est une erreur (signal) causée par une référence de mémoire invalide ou une défaillance de la segmentation. Vous essayez probablement d'accéder à un élément de matrice hors limites ou d'essayer d'utiliser trop de mémoire. P> blockQuote>

aussi. Je ne suis pas sûr du retour 0; code> dans la déclaration d'autre. Je n'ai pas exécuté le code alors je peux me tromper, mais il devrait être retour 1; code> au lieu de retour 0; code> p>

if(j!=0)
{
      if(j%2!=0)
      {
            e[m]=i[j];
            m++;
      }
}


4 commentaires

Ouais, j'ai fait que le code est exécuté et me donne la sortie requise, mais lorsque je soumets le code sur Codechef, il me donne une erreur d'exécution.Je saisie une entrée personnalisée qui fonctionne bien


Au lieu de définir toutes les variables en haut, définissez une variable temporaire dans la boucle elle-même.


Je veux dire la variable 'J'


par exemple. pour (int j = 0; ...; ...; ...);



0
votes

Je sais que cela vous fait référence à ... Ce n'est pas comme si vous censez le résoudre ... vous devez trouver le numéro qui restera dans O (1) heure ... comme les endroits étranges sont en train d'être Enlevé, nous ne devons nous inquiéter que même sur des endroits ... maintenant, ces endroits même peuvent devenir étranges lorsqu'ils sont divisés à plusieurs reprises ... par conséquent, il existe un nombre de marches qui convertissent l'ensemble de l'ensemble dans un seul élément ... à chaque Le point de cette étape Même le nombre est divisé par 2, par conséquent, il n'y aura qu'un nombre même placé qui ne deviendra pas étrange entre ou après ces étapes ... Vous devez trouver ce numéro simplement en regardant n, au moins J'ai fait la même chose ... C'est juste un indice, si ce n'est pas clair, je peux expliquer plus de logique dans le commentaire ... upvote😝


2 commentaires

Tout va bien, mais si je trébuche à nouveau sur ces choses à l'avenir, je veux juste savoir comment identifier la partie du code qui me donne l'erreur et comment éviter l'erreur de nouveau


Il est très normal d'avoir des erreurs comme celles-ci lorsque vous êtes neuf dans la programmation concurrentielle ... vous apprendrez d'eux et apprendrez à éviter la prochaine fois ... Personne ne peut vous apprendre ce truc sauf vous, continuez à aller et à pratiquer ... N'oubliez-vous qu'un maître a échoué plus de fois que vous avez déjà essayé ... CODING HEUREUX