Ошибка сегментации при вызове правильной функции - PullRequest
2 голосов
/ 31 марта 2012

Я решаю проблему с нулевой сумкой.Я решил проблему с помощью алгоритма перебора.

В main.cpp

  int main(int argc, char *argv[])
  {
     ......
     int solution;
     solution = bruteForce();
     ......
  }

Странно то, что когда я реализую bruteForce () в main.cpp, моя программа работает правильно,однако после того, как я переместил bruteForce () в bruteForce.cpp и включил его в main.cpp, программа вызовет ошибку сегментации при вызове bruteForce ().

Вот как я перемещаю bruteForce () в bruteForce.каст.Сначала я создал заголовок functions.h (потому что я хочу решить проблему другим методом после успешного применения грубой силы)

  functions.h:

  #include "global.h"
  int bruteForce();
  int multiplication( int );

А затем я переместил bruteForce () в bruteForce.cpp

  #include <iostream>
  #include <stdlib.h>
  #include <vector>
  #include "global.h"
  #include "functions.h"

  using namespace std;

  int bruteForce()
  {
     int bestValue = 0;
     int j, tempSize, tempValue;
     int bestChoice[n+1];

     for(int i=0; i<multiplication(n); i++)
     {
         tempSize = 0;
         tempValue =0;
         j = n;

         while(x[j]!=0 && j>0)
         {
             x[j] = 0;
             j--;
         }
         x[j] = 1;

         for(int k=1; k<=n; k++)
         {
             if(x[k] == 1)
             {
                 tempSize += size[k];
                 tempValue += value[k];
             }
         }


        if((tempValue > bestValue) && (tempSize <= S)) 
        {   
            bestValue = tempValue;
            for(int p=1; p<=n; p++)
                bestChoice[p] = x[p];
        }
    }
    for(int p=1; p<=n; p++)
       x[p] = bestChoice[p];

    return bestValue;
 }

В global.h я объявил некоторые глобальные переменные:

  #include <vector>
  using std::vector;

  static int n, S;
  static vector<int> value, size, x;

Отладчик GDB показывает

  Program received signal SIGSEGV, Segmentation fault.
  0x08049308 in main()

Есть идеи о том, почему это происходит?

Заранее спасибо.

О, кстати, если вам нужна дополнительная информация, вот пакет .Вы можете сначала ввести make в корне этого пакета.Затем введите это для выполнения.

  ./bin/01knapsack -BF inputs/n5S11.in n5s11.out

1 Ответ

2 голосов
/ 31 марта 2012

Вы не должны помещать свои переменные в заголовочный файл. Когда вы включаете это из обоих ваших исходных файлов, оба получат свою собственную копию этой переменной - и, таким образом, вы не сможете передавать данные между вашими функциями так, как вы думаете (или, по крайней мере, это мое понимание того, как это должно происходить). работа - я признаю, что я не уверен на 100%, что на самом деле происходит).

Лучший способ передачи данных в функцию - использовать параметры. Вызывайте функцию с тем, что ей нужно, и возвращайте данные либо через возвращаемое значение функции, либо через указатель или ссылочный параметр. Использование глобальных переменных для подобных вещей подвержено ошибкам (как вы уже видели), и для других, которые смотрят на ваш код, это гораздо менее очевидно.

Если вы абсолютно хотите использовать глобальные переменные, объявите их в одном ваших исходных файлов и поместите их в глобальный заголовочный файл с extern Заявление перед этим. Когда вы затем включаете заголовок из другого файла, extern сообщает компилятору, что он на самом деле не должен создавать саму переменную, а скорее предоставляет ее другим объектным файлом.

Итак, в main.cpp:

int n, S;
vector<int> value, size, x;

И в global.h:

extern int n, S;
extern vector<int> value, size, x;
...