Ошибка E0137 Выражение должно быть допустимым для изменения левосторонним значением

Рейтинг: -1Ответов: 1Опубликовано: 31.03.2023
for (int i = 0; i < 50000; i++) {
    Bomb b;
    b.weight = rand() % 100;
    b.color = "red"; // Ошибка E0137
    b.tnt = rand() % 1000;
    bombs.push_back(b);
} 

При b.color == "red"; ошибка исчезает, но слово "red" в консоль не выводится. Можете, пожалуйста, помочь решить данную проблему.

КОД:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

struct Bomb {
    float weight;
    char color[10];
    float tnt;
};

struct DynamicArray {
    Bomb* data;
    int capacity;
    int current_size;

    DynamicArray() {
        capacity = 1;
        current_size = 0;
        data = new Bomb[capacity];
    }

    ~DynamicArray() {
        delete[] data;
    }

    void resize() {
        capacity *= 2;
        Bomb* newData = new Bomb[capacity];
        memcpy(newData, data, current_size * sizeof(Bomb));
        delete[] data;
        data = newData;
    }

    void push_back(Bomb element) {
        if (current_size == capacity) {
            resize();
        }
        data[current_size++] = element;
    }

    Bomb pop_back() {
        if (current_size == 0) {
            cout << "Error: array is empty" << endl;
            return Bomb{};
        }
        Bomb element = data[current_size--];
        return element;
    }

    Bomb get(int n) {
        if (n < 0 || n >= current_size) {
            cout << "Error: index out of bounds." << endl;
            return Bomb{};
        }
        return data[n];
    }

    int size() {
        return current_size;
    }

    void print() {
        for (int i = 0; i < current_size; i++) {
            cout << "Bomb " << i << ": weight=" << data[i].weight << ", color=" << data[i].color << ", tnt=" << data[i].tnt << endl;
        }
    }

    void clear() {
        delete[] data;
        capacity = 1;
        current_size = 0;
        data = new Bomb[capacity];
    }

    void push_front(Bomb element) {
        if (current_size == capacity) {
            resize();
        }
        for (int i = current_size; i > 0; i--) {
            data[i] = data[i - 1];
        }
        data[0] = element;
        current_size++;
    }

    Bomb pop_front() {
        if (current_size == 0) {
            cout << "Error: cannot pop from empty array." << endl;
            return Bomb{};
        }
        Bomb element = data[0];
        for (int i = 0; i < current_size - 1; i++) {
            data[i] = data[i + 1];
        }
        current_size--;
        return element;
    }
};

int main() {
    DynamicArray bombs;
    clock_t startTime = clock();
    for (int i = 0; i < 50000; i++) {
        Bomb b;
        b.weight = rand() % 100;
        b.color = "red";
        b.tnt = rand() % 1000;
        bombs.push_back(b);
    }
    clock_t endTime = clock();
    double seconds = (double(endTime - startTime)) / CLOCKS_PER_SEC;
    cout << "Add 50000 items to the end: " << seconds << " s" << endl;
    return 0;
}

Ответы

▲ 2Принят

У вас Bomb.color — это массив с заранее заданным размером

char color[10];

а вы пытаетесь присваивать ему, как будто это указатель. C-строки следует копировать с помощью специальных функций, например:

strcpy(b.color,"red");

Visual C++ может попросить вас использовать более безопасную версию — strcpy_s.

Или использовать строки С++ —

string color;

Насколько ваш код верен семантически, не разбирался; после указанного исправления он компилируется; на этом я и остановился.