Ошибка утверждения при использовании struct vector C++

У меня есть программа, где я хочу обновить переменную из строки. Функция прочитает строку, найдет ее сложение, вычитание и т. Д., А затем добавит ее в переменную. Функция такова:

    using namespace std;

struct variable{
    string name;
    int value;
};

void update_varabile(string line, vector<variable> & v)
{
    char c = line[0];   //variable to be updated
    string b;
    char d[0];
    int flag = 0;       //counter
    int a = 0;
    int temp_value = 0;
    int perm_value = 0;
    for (int i = 0; i < v.size(); i++) {
        if (c == v[i].name[0]) {
            flag = 1;
            temp_value = v[i].value;
            break;
        }
    }
    if (flag == 1) {                //variable is present
        for (int i = 0; i< line.size(); i++) {
            if (line[i] == '+'|| line[i] =='-'|| line[i] == '*'|| line[i] =='/') {
                b[0] = line[i+1];               //assuming the integer is between 0 and 9
                d[0] = b[0];
                a = atoi (d);
            if (line [i] == '+') {
                perm_value = temp_value + a;
            } else if (line [i] == '-') {
                perm_value = temp_value - a;
            } else if (line [i] == '*') {
                perm_value = temp_value * a;
            } else if (line [i] == '/') {
                perm_value = temp_value / a;
            }
        }
        }
        for (int i = 0; i < v.size(); i++) {
            if (v[i].name[0] == 'c') {
                v[i].value = perm_value;
                break;
            }
        }
    }

}

Вызов в основном выглядит так:

int main()
{
    variable a;
    int val = 0;
    string up = "c=c+2";
    string f = "c";
    vector<variable> q;
    a.name = f;
    a.value = val;
    q.push_back(a);
    update_varabile(up, q);
    return 0;
}

Однако, когда я запускаю код, я получаю это сообщение об ошибке:

Assertion failed: ((m_->valid == LIFE_MUTEX) && (m_->busy > 0)), file C:/crossdev/src/winpthreads-git20141130/src/mutex.c, line 57

Process returned 1 (0x1)   execution time : 0.014 s
Press any key to continue.

Я запускал отладчик построчно, и он показывает, что функция выполняется правильно. Я также пытался найти этот файл C:/ на моем компьютере, и он не существует. Не уверен, почему это не работает.

1 ответ

Решение

Первым делом, избавьтесь от всех перерывов. В C++ следует использовать только разрывы мест в конце каждого оператора case. Делает практически невозможным чтение кода с кучей перерывов, потому что мне нужно спуститься вниз и выяснить, что есть каждый перерыв и почему. Если вам нужно рано выйти из цикла for, используйте цикл while. вам не нужны разрывы в конце операторов if и else, потому что они заставляют программу досрочно выходить из функции, ваши операторы if и else естественным образом пропускаются, если вы используете форматирование условий if, else if и else.

Сказав это, вам нужно лучше разбить то, что вы пытаетесь сделать. Например, вы получаете строковое значение, подобное этому. 2+3+4-5+6 Ваша программа будет читать слева направо. Я предполагаю, что вы хотите, чтобы оно приняло первое значение, равное двум, а затем добавило к нему три, затем четыре и так далее, и так четвертое.

Способ сделать это - сначала проанализировать строку для значений int, а затем проанализировать значения сложения и вычитания. Другими словами, читайте значения int из строки, пока не достигнете значения, которое не находится между 0 и 9. Затем посмотрите, является ли это нечисловое значение оператором, который вы ищете. Таким образом, ваша программа не сработает, например, 2555 и 2.

IE

//intValueHolder is a string.
while(i < line.size() && line[i] >= '0' && line[i] <= '9' ) {
      intValueHolder.push_back(string[i]);
}

Затем, когда вы нажмете "+" или что-то в этом роде, введите значение char в операторах case. и не забудьте добавить значение по умолчанию в конце для учета ввода мусора, например "а". Возможно, вы захотите сохранить значение только в том случае, если вам нужно сначала получить левое значение, прежде чем вы сможете получить правое значение. Но это звучит так, как будто вы начинаете с левого значения, так что вам действительно нужно только найти право и какой оператор ему нужен. Я не собираюсь переписывать вашу программу, потому что это похоже на задание для школы. Но я укажу вам в правильном направлении. Дай мне знать, если я не пойму твой вопрос.

Вы можете также захотеть использовать для этого очереди, если вы не ограничены только строками и векторами.

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