2016-12-07 16 views
1

Fondamentalement, il s'agit d'un code C pour le défi Oil Well du site hackerrank (https://www.hackerrank.com/challenges/oil-well). J'obtiens une erreur de segmentation ou j'abandonne quand je soumets ce code (il fonctionne parfois dans mon compilateur système).Comment déboguer une erreur de segmentation en C pour le code suivant .. J'ai utilisé malloc et libre dans de nombreuses fonctions ainsi que

Quelqu'un peut-il me dire comment résoudre ce problème? Merci d'avance.

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 

int *min, c, r, q = 0; 

void findmin() 
{ 
    int i, minimum = min[0]; 
    for (i = 0; i < q; i++) 
    { 
     if (min[i] > minimum) 
      minimum = min[i]; 
    } 
    printf("%d", minimum); 
} 

void calculate(int a[], int r) 
{ 
    int sum = 0; 
    int i; 
    int *x, *y; 
    x = (int *) malloc(sizeof(int) * 3); 
    y = (int *) malloc(sizeof(int) * 3); 
    for (i = 0; i <= r; i++) 
    { 
     x[i] = a[i] % c; 
     y[i] = a[i]/c; 
    } 
    for (i = 1; i <= r; i++) 
    { 
     if ((x[i] - x[i - 1]) > (y[i] - y[i - 1])) 
      sum = sum + (x[i] - x[i - 1]); 
     else 
      sum = sum + (y[i] - y[i - 1]); 
    } 
    min[q] = sum; 
    q++; 
    free(x); 
    free(y); 
} 

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; 
} 

void permute(int a[], int l, int r) 
{ 
    int i; 
    if (l == r) 
    { 
     for (i = 0; i <= r; i++) 
      calculate(a, r); 
    } 
    else 
    { 
     for (i = l; i <= r; i++) 
     { 
      swap((a + l), (a + i)); 
      permute(a, l + 1, r); 
      swap((a + l), (a + i)); 
     } 
    } 

} 

int main(void) 
{ 
    int i, j, k = 0; 
    scanf("%d%d", &r, &c); 
    int *arr; 
    arr = (int *) malloc(sizeof(int) * r * c); 
    int **x = (int **) malloc(r * sizeof(int *)); 
    for (i = 0; i < r; i++) 
     x[i] = (int *) malloc(c * sizeof(int)); 

    for (i = 0; i < r; i++) 
     for (j = 0; j < c; j++) 
      scanf("%d", &x[i][j]); 

    for (i = 0; i < r; i++) 
    { 
     for (j = 0; j < c; j++) 
     { 
      if (x[i][j] == 1) 
      { 
       arr[k] = c * i + j; 
       k++; 
      } 
     } 
    } 

    /*printf("Content of arr array is:\n"); 
    for(i=0;i<k;i++) 
    printf("%d \n",arr[i]); 
    */ 

    min = (int *) malloc(sizeof(int) * r * c); 
    permute(arr, 0, k - 1); 
    findmin(); 

    free(arr); 
    free(x); 
    free(min); 
} 

code mis à jour (avec toutes les suggestions et les réponses prises en compte)

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 
int *min,c,r,q=0; 
void findmin() 
{ 
    int i,minimum=min[0]; 
    /*printf("\nmin array is \n"); 
    for(i=0;i<q;i++) 
    { 
     printf("%d ",min[i]); 
    }*/ 
    for(i=0;i<q;i++) 
    { 
     if(min[i]<minimum) 
     minimum=min[i]; 
    } 
    printf("%d",minimum); 
} 
void calculate(int a[],int r) 
{ 
    int sum=0; 
    int i; 
    int *x,*y; 
    x = (int *)malloc(sizeof(int)*r+1); 
    y = (int *)malloc(sizeof(int)*r+1); 
    for(i=0;i<=r;i++) 
    { 
     x[i]=a[i]%c; 
     y[i]=a[i]/c; 
    } 
    for(i=1;i<=r;i++) 
    { 
     if(abs(x[i]-x[i-1])>abs(y[i]-y[i-1])) 
      sum=sum+abs(x[i]-x[i-1]); 
     else 
      sum=sum+abs(y[i]-y[i-1]); 
    } 
    min[q]=sum; 
    q++; 

    free(x); 
    free(y); 
    //printf("I am here also"); 
} 
void swap(int *x,int *y) 
{ 
    int temp; 
    temp=*x; 
    *x=*y; 
    *y=temp; 
} 
void permute(int a[],int l,int r) 
{ 
    int i; 
    if(l==r) 
    { 
    for(i=0;i<=r;i++) 
    //printf("%d ",a[i]); 
    calculate(a,r); 
    //printf("\n"); 
    } 
    else 
    { 
     for(i=l;i<=r;i++) 
     { 
      swap((a+l),(a+i)); 
      permute(a,l+1,r); 
      swap((a+l),(a+i)); 
     } 
    } 

} 

int main(){ 
    int i,j,k=0; 
    scanf("%d%d",&r,&c); 
    int *arr; 
    arr = (int *)malloc(sizeof(int)*r*c); 
    int **x = (int **)malloc(r * sizeof(int *)); 
    for (i=0; i<r; i++) 
     x[i] = (int *)malloc(c * sizeof(int)); 

    for(i=0;i<r;i++) 
    for(j=0;j<c;j++) 
    scanf("%d",&x[i][j]); 

    /*for(i=0;i<r;i++) 
    { 
    for(j=0;j<c;j++) 
    printf("%d ",x[i][j]); 
    printf("\n"); 
    }*/ 


    for(i=0;i<r;i++) 
    { 
    for(j=0;j<c;j++) 
    { 
    if(x[i][j]==1) 
    { 
     arr[k]=c*i+j; 
     k++; 
    } 
    }  
    } 
    //printf("Content of arr array is:\n"); 
    //for(i=0;i<k;i++) 
    //printf("%d \n",arr[i]); 
    //printf("\nCalling permutation\n"); 

    min = (int *)malloc(sizeof(int)*r*c); 
    permute(arr,0,k-1); 
    //printf("\nFinding min call\n"); 
    findmin(); 

    free(arr); 
    for (i = 0; i < r; i++) 
    { 
    free(x[i]); 
    } 
    free(x); 
    free(min); 
    return 0; 
} 
+1

1) 'min [i]> minimum' ->' min [i] BLUEPIXY

+1

utilise gdb ou similaire. –

+1

2) 'x = (int *) malloc (sizeof (entier) * 3); y = (int *) malloc (sizeof (int) * 3); ':' 3' -> 'r + 1' – BLUEPIXY

Répondre

1
  1. ici ne *(r+1) plutôt que *3

    x = (int *)malloc(sizeof(int)*3); 
    y = (int *)malloc(sizeof(int)*3); 
    
  2. changement min[i] > minimum à min[i] < minimum

  3. free toute la mémoire que vous avez alloué à savoir x[0]-x[r] et y[0] à y[r].

    À part cela, vous êtes probablement tous bons.

+0

J'ai fait les changements suggérés dans mon code. Maintenant, le code fonctionne parfaitement dans mon compilateur système (Dev C++). Mais sur hackerrank, le message du compilateur est "Abort Called" et Error (stderr): "*** Erreur dans' solution ': munmap_chunk(): pointeur invalide: 0x0000000000692110 *** ". –

+0

@ BLUEPIXY, @ LPs, @ Sourav Ghosh Guys s'il vous plaît aider –

+0

J'ai posté mon code mis à jour dans la question elle-même –

1

Vous allouez (r * sizeof (int)) + 1 octets,

x = (int *)malloc(sizeof(int)*r+1); 
y = (int *)malloc(sizeof(int)*r+1); 

mais votre boucle accès r+1int objets:

for(i=0;i<=r;i++) 
{ 
    x[i]=a[i]%c; 
    y[i]=a[i]/c; 
} 

corriger le comportement en fonction de ce que votre intention est - Je suppose que vous voulez allouer (r + 1) * sizeof (int) octets.