Процесс завершает работу с кодом -1073741819
Здравия. Какая-то проблема с выделением памяти.
#include <stdlib.h>
using namespace std;
int n = 1;
int index = 0;
struct weapon {
string weap_name;
string weap_type;
int distance;
int mag_vol;
int fire_rate;
string calibre;
double bul_speed;
double weight;
};
weapon* pointer;
void input() {
cout << "Название: ";
cin >> pointer[n-1].weap_name;
cout << "Тип: ";
cin >> pointer[n - 1].weap_type;
cout << "Макс дист(м): ";
cin >> pointer[n - 1].distance;
cout << "Объем магазина: ";
cin >> pointer[n - 1].mag_vol;
cout << "Скорострельность(выстр/с): ";
cin >> pointer[n - 1].fire_rate;
cout << "Калибр(мм): ";
cin >> pointer[n - 1].calibre;
cout << "Скорость пули(м/c): ";
cin >> pointer[n - 1].bul_speed;
cout << "Вес(кг): ";
cin >> pointer[n - 1].weight;
n++;
}
void output(weapon* pointer) {
cout << "Введите индекс: ";
cin >> index;
cout << "Название: " << pointer[index].weap_name << "\n";
cout << "Тип: " << pointer[index].weap_type << "\n";
cout << "Макс дист: " << pointer[index].distance << "\n";
cout << "Объем магазина: " << pointer[index].mag_vol << "\n";
cout << "Скорострельность: " << pointer[index].fire_rate << "\n";
cout << "Калибр: " << pointer[index].calibre << "\n";
cout << "Скорость пули: " << pointer[index].bul_speed << "\n";
cout << "Вес: " << pointer[index].weight << "\n";
}
void table(weapon* pointer) {
cout << "Индекс | Название | Тип | Макс Дист | Объем магазина | Скорострельность | Калибр | Скорость пули | Вес\n";
for (int x = 0; x < 105; x++) {
cout << "-";
}
cout << "\n";
for (int x = 0; x < n; x++) {
cout << x << " | " << pointer[x].weap_name << " | " << pointer[x].weap_type << " | "
<< pointer[x].distance << " | " << pointer[x].mag_vol << " | "
<< pointer[x].fire_rate << " | " << pointer[x].calibre << " | "
<< pointer[x].bul_speed << " | " << pointer[x].weight << "\n";
for (int y = 0; y < 105; y++) {
cout << "-";
}
cout << "\n";
}
}
void menu() {
weapon* new_pointer;
cout << "Ввод(1), Вывод по одному ружью(2), Таблица(3), Закрыть (0)\n\n";
int choice = 100;
cin >> choice;
switch (choice) {
case 1:
cout << "\033[2J\033[1;1H";
input();
new_pointer = (struct weapon*)realloc(pointer, n*(sizeof(weapon)+1));
if (new_pointer != NULL) {
pointer = new_pointer;
} else {
exit(1);
}
n++;
break;
case 2:
output(pointer);
break;
case 3:
table(pointer);
break;
case 0:
free(pointer);
exit(0);
break;
default:
cout << "\nНеверный выбор\n";
exit(0);
break;
}
}
int main(void) {
setlocale(LC_ALL, "Russian");
pointer = (struct weapon*)calloc(5, sizeof(weapon));
for (;;) {
menu();
}
return 0;
}
Раньше выдавал ошибку при первом вводе после просьбы ввести "название". Не знаю в чем была проблема, но тогда в main'e до цикла у меня был malloc вместо calloc, и когда я поменял, то начало записывать в структуру данные хотя бы раз. Уже при втором вводе код нагибается на том же месте. Я вообще без понятия, в чем проблема. Через new weapon делать не вариант, препод говорит делать именно через malloc и подобные ему.
(Когда попросил другого препода помочь, он сказал, что первый живодер какой-то, потому что при работе с таким выделением памяти в неопытных руках может все поломаться, и он не знает чем тут помочь)
Я умоляю о помощи, я уже и так, и сяк перепробовал, и в нейросеть код кидал - ничего вообще не помогает.
Ответы (1 шт):
Как минимум ваш код не компилируется :) В нем не хватает массы #include
ов...
И еще - эта жуткая смесь глобальных и локальных переменных мешает чтению кода:(
Потом, наверное, вы хотели написать не n*(sizeof(weapon)+1)
, а (n+1)*sizeof(weapon)
?
А главное — беда в смеси французского с нижегородским, а именно выделения памяти в стиле C с использованием классов C++. Вы понимаете, что у вас при всех ваших malloc/calloc/realloc
не вызываются никакие конструкторы, и что у вас вместо string
в памяти получается — лучше и не думать...
new/delete
— вот единственно верный путь для C++
P.S. Ваш "С++" заставляет вспомнить эту байку...
Известный физик Лео С[ц]илард читал свой первый доклад на английском языке. После доклада к нему подошёл физик Джексон и спросил:
— Послушайте, С[ц]илард, на каком, собственно, языке вы делали доклад?
С[ц]илард смутился, но тут же нашёлся и ответил:
— Разумеется, на венгерском, разве вы этого не поняли?
— Конечно, понял. Но зачем же вы натолкали в него столько английских слов? — отпарировал Джексон.