Ошибка сегментации при обращении к векторам, изменившим размер

Поэтому я инициализирую вектор в основной функции и передаю этот вектор в качестве ссылки в функцию, где изменяется его размер. Теперь я могу представить, что инициализированный вектор в основном изменит размер, но это не так. Я просто реализую это неправильно?

#include <iostream>
#include <vector>
using std::vector;

void createImage(vector<vector<char> >& img){
    int cols, rows;
    std::cin >> rows >> cols;
    img.clear();
    for(int i = 0; i < rows; i++)
        img.push_back(vector<char>(cols, 'O'));
}

void colorPixel(vector<vector<char> > &img){
    int xCoord, yCoord;
    char color;
    std::cin >> xCoord >> yCoord >> color;
    img[xCoord][yCoord] = color;
}

void printVector(vector<vector<char> > &img){
        for(int i = 0; i < img.size(); i++){
            for(int j = 0; j < img[i].size(); j++)
                std::cout << img[i][j];
            std::cout << '\n';
        }
}

int main(){

    char operation;
    
    while(std::cin >> operation){
        vector<vector<char> > myVector;
        if (operation == 'X')
            break;
        if (operation == 'I')
            createImage(myVector);
        if (operation == 'C')
            printVector(myVector);
        if (operation == 'L')
            colorPixel(myVector);
    }
}

Редактировать: Это то, что эффективно происходит. Когда вы создаете вектор, так что I 5 5 вызывает createImage(), это работает, но он начинает давать сбой, когда вы L 4 4 P вызывает colorPixel() в myVector[4][4].

Если бы я инициализировал myVector в main равным 250 250, тогда print напечатает все 250 строк, даже после изменения размера (например, 4 4) в createImage().

Короче говоря, я верю и точно знаю, что вектор внутри main не получает намека на то, что его размер изменился, есть ли какое-либо решение для этого?

Как узнать, что размер не изменился в main? У вас там нет чеков.

Dmitry Kuzminov 18.03.2022 00:06

Какой ввод приводит к сбою?

Fatih BAKIR 18.03.2022 00:06

Каждая итерация вашего цикла создает новый вектор... Переместите объявление за пределами в цикл.

ChrisMM 18.03.2022 00:08

Когда вы создаете вектор, так что I 5 5 вызывает createImage(), это работает, но он начинает давать сбой, когда вы L 4 4 P вызывает colorPixel() в myVector[4][4].

VetoFTW 18.03.2022 00:09

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

Kaz 18.03.2022 00:10

@ChrisMM Спасибо за оригинальный ответ, это сработало.

VetoFTW 18.03.2022 00:17

@VetoFTW, когда вы получаете решение вопроса, пожалуйста, не редактируйте свой вопрос, чтобы пометить его как исправленный/решенный или опубликовать спасибо. Вместо этого вы должны либо проголосовать/принять опубликованный ответ, либо напишите свой ответ.

Remy Lebeau 18.03.2022 00:26

@RemyLebeau Хорошо, извини. Не буду делать это снова в следующий раз

VetoFTW 18.03.2022 00:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
    while(std::cin >> operation){
        vector<vector<char> > myVector;

Самое первое, что происходит в этом цикле while, — это создание нового myVector. Это буквально то, что это говорит в C++.

Когда достигается конец цикла, этот myVector уничтожается. Вот как работает C++: если вы объявляете объект в цикле или внутри оператора if, объект уничтожается, когда выполнение достигает конца этой области.

Итак, когда этот while цикл достигает этого конца, этот myVector уничтожается. Его больше нет. Этого не будет. Легче будет существовать. Будет тосковать по фьордам. Он станет бывшим myVector.

Затем снова проверяется условие цикла while, и если условие по-прежнему выполняется, выполнение снова входит в while, создавая новый myVector с нуля. Это не будет иметь ничего общего с предыдущим myVector, который является лишь слабым воспоминанием.

И способ исправить это — объявить этот myVectorдо этого цикла в начале вашего main, чтобы этот myVector уничтожался только тогда, когда main завершает выполнение.

Почти буквально повторяя классику здесь.

user4581301 18.03.2022 00:24

Другие вопросы по теме