Форум программистов, компьютерный форум CyberForum.ru

Вылет при записи структуры в файл [C++] - C++

Восстановить пароль Регистрация
 
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 02:59     Вылет при записи структуры в файл [C++] #1
Здраствуйте!
Я совсем недавно начал изучать C++. конечно же, написал калькулятор, и теперь решил написать небольшую игру-рогалик с псевдослучайной генерацией мира.
Проблема в чём - всё компилируется отлично, но при выполнении записи x[i].mapping в файл программа вылетает.
Вот мои наработки :
Classes.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct unit // "Блок"
{
    int t; // Техническая перменная
    char *mapping;
    bool accessibility;
    bool thereis; // Показывает, существует ли данный "блок"
};
unit wall;
unit ground;
unit tree;
int classes_main()
{
    wall.mapping="\xDB";
    wall.accessibility=false;
    wall.thereis=true;
    ground.mapping="\xB2";
    ground.accessibility=true;
    ground.thereis=true;
    tree.mapping="\xED";
    tree.accessibility=false;
    tree.thereis=true;
return 0;
}
Game.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <fstream>
#include <Classes.h>
using namespace System;
using namespace std;
int main()
{
    ifstream in; // Поток in будем использовать для записи
    ofstream out; // Поток out будем использовать для записи
    in.open("input.txt");
    out.open("output.txt");
    srand ( time(NULL));
    Console::SetWindowSize (120, 50);
    SetConsoleTitle("Ultra Old-Shcool RPG Game");
    int a,b; // "Технические" переменные
    unsigned int points=10,ag=10,str=10,mpmax=100,hpmax=100,df=10,mp,hp; // Переменные характеристик игрока
    char name[36];
    system("color 8F"); // Меняет цвет консоли и текста
    cout <<"\n \n \t \t \t \t \t  \x04 Hi! It's very old-school game! \x04 \n";
    cout <<"\n\n\t\t\t\t\t\tTell your name, hero! \n \n";
    cin >>name;
    system("cls"); // Очистка экрана 
    int xx[2056]; // Массивы координат
    unit x[2056]; // Символы присвоенные координатам
    for (int i=0;2056;i++)
    {
        xx[i]=(rand()+47)/4;
        if (xx[i]<1000)
        {
        x[i]=tree;
        in>>x[i].mapping;
        }
        if (xx[i]<2500)
        {
        x[i]=wall;
        in>>x[i].mapping;
        }
        else
        {
        x[i]=ground;
        in>>x[i].mapping;
        }
    }
    cout <<"\n \n \t \t \t \t \t \t CONTROLS \n \n \t \t 'Space' to skip text \n";
    while(getch()!=32); // Продолжение действий при нажатии на пробел
    system("cls");
    cout <<"\n \n \t \t \t \t \t Okay, "<<name<<" did you prepare for journey?\n \n";
    while(getch()!=32);
    system("cls");
    cout <<"\n \n \t \t \t \t \t Then, let the journey BEGIN!\n";
    while(getch()!=32);
    system("cls");
    cout <<"\n \t \t \t Tell your characteristics, "<<name<<"! \n \n";
    while(getch()!=32);
    {
a:
        system("cls");
        system("color 07");
        cout <<" Your Agility is "<<ag
        <<"\n \n Your Strenght is "<<str
        <<"\n \n Your Defence is "<<df
        <<"\n \n Your Mana is "<<mpmax
        <<"\n \n Your Health is "<<hpmax
        <<"\n \n You have "<<points<<" points.";
        if (points>=1)
            cout <<"\n \n \t \t \t Do you want to increase or decrease stats? \n \n type 1 to increase and 0 to decrease \n";
        if (points<1)
            cout <<"\n \n \t \t \t Do you want to increase or decrease stats, or you done? \n \n type 1 to increase and 0 to decrease, 2 if done \n";
        cin >>b;
        while (b==2 && points==0)
        {
            goto b;
        }
        while (b==0)
        {
            cout <<"What you want to decrease? \n 1 - Agility \n 2 - Strenght \n 3 - Defense \n 4 - Mana \n 5 - Health \n";
            cin >>b;
            if (b==1)
            {
                if (ag>1)
                {
                ag=ag-1;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your agility lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==2)
            {
                if (str>1)
                {
                str=str-1;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your strenght lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==3)
            {
                if (df>1)
                {
                df=df-1;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your defence lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==4)
            {
                if (mpmax>20)
                {
                mpmax=mpmax-10;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your mana lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==5)
            {
                if (hpmax>20)
                {
                hpmax=hpmax-10;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your health lower!";
                while(getch()!=32);
                goto a;
                }
            }
        }
        if (b==1 && points>0)
        {
            cout <<"What you want to increase? \n 1 - Agility \n 2 - Strenght \n 3 - Defense \n 4 - Mana \n 5 - Health \n";
            cin >>b;
            if (b==1)
            {
                ag=ag+1;
                points=points-1;
                goto a;
            }
            if (b==2)
            {
                str=str+1;
                points=points-1;
                goto a;
            }
            if (b==3)
            {
                df=df+1;
                points=points-1;
                goto a;
            }
            if (b==4)
            {
                mpmax=mpmax+10;
                points=points-1;
                goto a;
            }
            if (b==5)
            {
                hpmax=hpmax+10;
                points=points-1;
                goto a;
            }
        }
        else
        {
            system("cls");
            cout <<"\n \t \t \t You don't have enought points! \n";
            while(getch()!=32);
            goto a;
        }
b:
        system("cls");
        cout <<"\n \n \t \t \t \t \t Once, at the dark times of myth and legends..."; //Story
        while(getch()!=32);
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2012, 02:59     Вылет при записи структуры в файл [C++]
Посмотрите здесь:

C++ ошибка при записи в файл.
C++ Ошибка при записи в файл
C++ Схема записи структуры в файл
Непонятка при записи в текстовой файл C++
C++ Вылет при срабатывании деструктора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 03:05     Вылет при записи структуры в файл [C++] #2
29 стока.
for(i = 0; i < 2056; i++)
Ваше условие (2056) всегда истина.
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 03:11  [ТС]     Вылет при записи структуры в файл [C++] #3
Цитата Сообщение от NoMasters Посмотреть сообщение
29 стока.
for(i = 0; i < 2056; i++)
Ваше условие (2056) всегда истина.
Проблема именно с in>>x[i].mapping
Я проверял его работу без цикла.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 03:21     Вылет при записи структуры в файл [C++] #4
А память кто выделять будет под этот самый mapping?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
04.01.2012, 03:22     Вылет при записи структуры в файл [C++] #5
У вас в структуре есть указатель на символ, а Вы не выделяя память пишите туда данные
C++
1
wall.mapping="\xDB";
так делать нельзя, где-то дальше это нельзя и проявляется.
Писать программу на 200 строк где переменные названы, x, xx, a,b,i да ещё и использовать goto - зло и чтобы теперь помочь вам найти ошибку нужно потратить много времени что будет отпугивать форумчан.
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 03:27  [ТС]     Вылет при записи структуры в файл [C++] #6
Цитата Сообщение от Gepar Посмотреть сообщение
У вас в структуре есть указатель на символ, а Вы не выделяя память пишите туда данные
C++
1
wall.mapping="\xDB";
так делать нельзя, где-то дальше это нельзя и проявляется.
Писать программу на 200 строк где переменные названы, x, xx, a,b,i да ещё и использовать goto - зло и чтобы теперь помочь вам найти ошибку нужно потратить много времени что будет отпугивать форумчан.
Извините, я просто совсем новенький в C++
А не подскажете, как точно надо выделять память?
Нечто вроде
C++
1
x[i].mapping = new char[10];
не помогает.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
04.01.2012, 03:41     Вылет при записи структуры в файл [C++] #7
volchonokilli, это же почему не помогает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct unit // "Блок"
{
        int t; // Техническая перменная
        char *mapping;
        bool accessibility;
        bool thereis; // Показывает, существует ли данный "блок"
};
 
int main()
{
    unit x;
    x.mapping=new char[10];
    x.mapping="string";
    cout<<x.mapping;
}
А вообще лучше бы вы в структуре своей использовали бы уже массив символов, char[10] тот же например, или вообще string ... хотя с последним будет сложнее писать в файл, особенно новичку так что лучше остановитесь на варианте char[10].
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 03:50     Вылет при записи структуры в файл [C++] #8
Может быть десяти символов не хватает(учитывая завершающий ноль)?

Gepar, сравни адреса, на которые у тебя указывает mapping до и после присвоения в 13.
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 03:54  [ТС]     Вылет при записи структуры в файл [C++] #9
Classes.h не изменял, вот измененный отрезок из Game.cpp
Программа продолжает сбоить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    int xx[2056]; // Массивы координат
    unit x[2056]; // Символы присвоенные координатам
    for (int i=0;i<2056;i++)
    {
        x[i].mapping=new char[10];
        xx[i]=(rand()+47)/4;
        if (xx[i]<1000)
        {
        x[i].mapping=tree.mapping;
        in>>x[i].mapping;
        }
        if (xx[i]<2500)
        {
        x[i].mapping=wall.mapping;
        in>>x[i].mapping;
        }
        else
        {
        x[i].mapping=ground.mapping;
        in>>x[i].mapping;
        }
    }
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.01.2012, 04:08     Вылет при записи структуры в файл [C++] #10
Вынеси

C++
1
x[i].mapping=new char[10];
за цикл! а то получается что ты выделяешь память 2056 раз!

И если ты выделяешь память то обязательно ее нужно очистить с помощью delete
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
04.01.2012, 04:09     Вылет при записи структуры в файл [C++] #11
Цитата Сообщение от NoMasters Посмотреть сообщение
Gepar, сравни адреса, на которые у тебя указывает mapping до и после присвоения в 13.
Сравнил, всё тот же, в моём случае можно обойтись без strcpy если Вы об этом.

Цитата Сообщение от volchonokilli Посмотреть сообщение
Программа продолжает сбоить.
У вас там целая куча всякой всячины и странных переменных, Вы бы оттестировали свой класс пытаясь для начала заставить его работать печатая данные на экран, потом попытались бы записать один объект вашей структуры в файл, а потом уже целый массив объектов пробовали бы экспортировать в файл, это хорошо что Вы сразу ещё интерфейс не прикрутили и лишь потом не заметили что структура то не рабочая ...
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 04:10  [ТС]     Вылет при записи структуры в файл [C++] #12
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Вынеси

C++
1
x[i].mapping=new char[10];
за цикл! а то получается что ты выделяешь память 2056 раз!

И если ты выделяешь память то обязательно ее нужно очистить с помощью delete
Тогда придется убирать [i], а без него компилятор не воспринимает х, как элемент структуры.

Цитата Сообщение от Gepar Посмотреть сообщение
У вас там целая куча всякой всячины и странных переменных, вы бы оттестировали свой класс пытаясь для начала заставить его работать печатая данные на экран, потом попытались бы записать один элемент в файл, а потом уже в массив, это хорошо что Вы сразу ещё интерфейс не прикрутили и лишь потом не заметили что структура то не рабочая ...
Всё работает кроме самого mapping.
То есть, программа каждый раз сбоит при попытке отоображения или записи, например, wall.mapping, которое равно "\xDB".
При этом присваивание проходит без сбоев.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
04.01.2012, 04:17     Вылет при записи структуры в файл [C++] #13
Цитата Сообщение от Infinity3000 Посмотреть сообщение
за цикл! а то получается что ты выделяешь память 2056 раз!
Ага, что удивительно, ведь он создал 2056 объектов своего класса, с чего это он память тогда аж 2056 раз выделяет, первому выдал и хватит. Давайте как у нас в обществе поступать: очередь на квартиру в 2056 человек, а мы первому дадим и всё
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 04:28     Вылет при записи структуры в файл [C++] #14
Цитата Сообщение от Gepar Посмотреть сообщение
Сравнил, всё тот же, в моём случае можно обойтись без strcpy если Вы об этом.
Это очень странно, ведь адрес(который присваивается) у сроки совсем не тот, что у выделенной памяти.
volchonokilli, думаю, проблема в том, что cin пытается запихнуть в mapping куда больше, чем можно. input.txt в студию

Добавлено через 1 минуту
Цитата Сообщение от volchonokilli Посмотреть сообщение
То есть, программа каждый раз сбоит при попытке отоображения или записи, например, wall.mapping, которое равно "\xDB".
Это уже после того, как память была выделена?
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 04:28  [ТС]     Вылет при записи структуры в файл [C++] #15
Цитата Сообщение от NoMasters Посмотреть сообщение
volchonokilli, думаю, проблема в том, что cin пытается запихнуть в mapping куда больше, чем можно. input.txt в студию
input.txt размер - 0 байт.
И да, у меня там нету cin
Цитата Сообщение от NoMasters Посмотреть сообщение
Это уже после того, как память была выделена?
Да.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
04.01.2012, 09:06     Вылет при записи структуры в файл [C++] #16
Цитата Сообщение от volchonokilli Посмотреть сообщение
но при выполнении записи x[i].mapping в файл программа вылетает.
Вы нигде не пишете в файл. Вы пытаетесь считать из файла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 01:50     Вылет при записи структуры в файл [C++]
Еще ссылки по теме:

Проверка на повтор при записи в файл C++
C++ Абракадабра при записи в файл и при чтении из него кириллицы
Кракозябры вместо слов и цифр при записи структуры в файл C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
22.01.2012, 01:50  [ТС]     Вылет при записи структуры в файл [C++] #17
Проблема решена.
Оказалось, что структура записывается немного другим образом (нечто вроде in((char*)wall,sizeof(unit)) ).
Yandex
Объявления
22.01.2012, 01:50     Вылет при записи структуры в файл [C++]
Ответ Создать тему
Опции темы

Текущее время: 23:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru