Сбой С ++ Сегментация: 11

0

Я работаю над программой, чтобы проверить несколько возможностей манипулирования строками. В основном предполагается, что он будет читать список строк и сможет найти соседей-персонажей для прохождения строк в виде схемы. Здесь код:

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>

    std::string grid[20]={" "};

    std::string get(int string, int member){
      return grid[string].substr(member,1);
    }
    std::string* getNeighbors(int string, int member){
      std::string neighbors[4];
      neighbors[0]=grid[string-1].substr(member,1);//up
      neighbors[1]=grid[string+1].substr(member,1);//down
      neighbors[2]=grid[string].substr(member-1,1);//left
      neighbors[3]=grid[string].substr(member+1,1);//right
      std::string* p=neighbors;
      return p;//Returns up,down,left,right.
    }
    int main(int argc, char** argv){
      grid[1]="@----^---0";
      grid[2]="abcdefghi0";
      grid[3]="jklmnopqr0";//TODO Change to read of txt*/
      std::string* neighbors;
      for(int i=0;grid[1].length()>i;i++){
        neighbors=getNeighbors(2,1);
        if(neighbors[3]=="-" | neighbors[3]=="^"){
          std::string r=get(1,i);
          (r!="0") ? std::cout<<r:0;//Dangerous. TODO Unknown symbol handling
          std::cout<<neighbors[3];
        }
      }
    }

Это хорошо компилируется, но имеет ошибку времени выполнения "Ошибка сегментации: 11". Я использую несколько предметов и методов, к которым я не привык, и, вероятно, злоупотребляю. Любая помощь будет большой.

  • 0
    под каким компилятором это не получается? с g ++ 4.8 (после небольшого исправления - он не скомпилировался!) он работает coliru.stacked-crooked.com/a/bbc1a7134ee38989 , но не выводится.
  • 0
    Да, я должен был упомянуть это. Я на Mac с 10,9 Mavericks с Apple LLVM версии 5.0 (clang-500.2.79). Я могу остановить ошибку времени выполнения, удалив каждый вызов и ссылку getNeighbors (), но в этом вся суть программы и контролирует вывод.
Теги:
runtime-error
segmentation-fault
crash

2 ответа

1
Лучший ответ

std::string neighbors[4]; выделен стек. Когда вы выходите из getNeighbors он теряет область действия. Попробуйте поставить его на другое место (даже глобальное, как доказательство концепции). Лучшим дизайном должно быть передано это как parater для вашей функции.

void getNeighbors(int string, int member, std::vector<std::string>& neighbors){
      ;
      neighbors[0]=grid[string-1].substr(member,1);//up
      neighbors[1]=grid[string+1].substr(member,1);//down
      neighbors[2]=grid[string].substr(member-1,1);//left
      neighbors[3]=grid[string].substr(member+1,1);//right
    }

РЕДАКТИРОВАТЬ:

#include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>

    std::string grid[20]={" "};
    std::string neighbors[4]; //<---------------------------

    std::string get(int string, int member){
      return grid[string].substr(member,1);
    }
    std::string* getNeighbors(int string, int member){
      neighbors[0]=grid[string-1].substr(member,1);//up
      neighbors[1]=grid[string+1].substr(member,1);//down
      neighbors[2]=grid[string].substr(member-1,1);//left
      neighbors[3]=grid[string].substr(member+1,1);//right
      std::string* p=neighbors;
      return p;//Returns up,down,left,right.
    }
    int main(int argc, char** argv){
      grid[1]="@----^---0";
      grid[2]="abcdefghi0";
      grid[3]="jklmnopqr0";//TODO Change to read of txt*/
      std::string* neighbors;
      for(int i=0;grid[1].length()>i;i++){
        neighbors=getNeighbors(2,1);
        if(neighbors[3]=="-" | neighbors[3]=="^"){
          std::string r=get(1,i);
          (r!="0") ? std::cout<<r:"0";//Dangerous. TODO Unknown symbol handling
          std::cout<<neighbors[3];
        }
      }
    }

Теперь neighbors глобальны (мне это не нравится, но выполняйте работу для POC).

  • 0
    Вы используете вектор в качестве параметра, но моя переменная - это std :: string *, которую я использую в качестве массива. Не могли бы вы уточнить, как реализовать ваш вектор с моим кодом?
  • 0
    ХОРОШО. Я отредактирую свой ответ!
Показать ещё 1 комментарий
0

getNeighbors() возвращает указатель на локальную переменную.

  • 0
    Я попытался объявить соседей как глобальную переменную вне каких-либо функций и сослаться на нее с помощью :: соседей внутри getNeighbors (). Это не имело никакого эффекта и все еще возвращало ошибку сегментации 11.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню