Почему я получаю ошибку сегментации из-за этого?

#python #c #cython

Вопрос:

Я просто хочу создать простую структуру C , которая имеет индекс int и значение серого цвета int .Функции задается вектор со значениями серого цвета. Когда я пытаюсь его скомпилировать, я получаю ошибку сегментации, кто-нибудь знает, почему? (не отсортировал вектор) Спасибо.

 vector<gray> createStruct( vector<int> grayValues)
{
   vector <gray> grayStruct;
     for (int i = 0; i<grayValues.size();i  )
      {
         grayStruct[i].originalIndex= i;
         grayStruct[i].grayValue= grayValues[i];
     }

     return grayStruct;
}



int main() {

  vector <int> grayVals={411,21,78,23};
  vector <gray> grayStruct=createStruct(grayVals);
//  sort(grayStruct);

  for (int i = 0; i < grayStruct.size(); i  )
      {cout << grayStruct[i].originalIndex<<' '<<grayStruct[i].grayValue;
      cout<<endl;
    }
return 0;

}
 

Комментарии:

1. о , и это структура, извините: структура серого цвета { int originalIndex; int grayValue; };

2. Вы никогда не меняете размер grayStruct , отсюда и неопределенное поведение.

3. @G. M. что значит изменить его размер?

4. Он создан с размером 0, и вы не выполняете никаких операций, которые изменят его размер (см. Ответ @MikeCAT ).

Ответ №1:

Это потому , что вы используете grayStruct в функции элементы, которых на самом деле не существует createStruct .

Вы должны создавать элементы перед использованием или использовать push_back() для создания элементов.

Создавайте элементы с помощью конструктора:

 vector<gray> createStruct( vector<int> grayValues)
{
   vector <gray> grayStruct(grayValues.size()); // add number of elements to create
     for (int i = 0; i<grayValues.size();i  )
      {
         grayStruct[i].originalIndex= i;
         grayStruct[i].grayValue= grayValues[i];
     }

     return grayStruct;
}
 

Создавайте элементы с помощью resize() :

 vector<gray> createStruct( vector<int> grayValues)
{
   vector <gray> grayStruct;
   grayStruct.resize(grayValues.size()); // create elements
     for (int i = 0; i<grayValues.size();i  )
      {
         grayStruct[i].originalIndex= i;
         grayStruct[i].grayValue= grayValues[i];
     }

     return grayStruct;
}
 

Добавляйте элементы один за другим с помощью push_back() :

 vector<gray> createStruct( vector<int> grayValues)
{
   vector <gray> grayStruct;
     for (int i = 0; i<grayValues.size();i  )
      {
         gray value;
         value.originalIndex= i;
         value.grayValue= grayValues[i];
         grayStruct.push_back(value); // add an element
     }

     return grayStruct;
}
 

Комментарии:

1. О да, как я этого не заметил, большое спасибо