Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
KOLLIAK
0 / 0 / 0
Регистрация: 26.06.2014
Сообщений: 3
1

Динамическое создание и удаление массива в разных функциях.

10.09.2014, 22:59. Просмотров 305. Ответов 2
Метки нет (Все метки)

Всем привет)
Вопрос такого характера:
Создаю в одной функции массив, считываю в него файл(массив == длине файла)
Далее в другой функции его удаляю, но он:
1) Не удаляется(если в конце массива поставить 0)
2) Удаляется(если этого не делать)
Посмотрел через отладчик - то ли у меня глюки, то ли я чего-то не понимаю:памяти выделяется больше, чем надо
Исходник проги скидываю(ошибка выскакивает при пункте 6 и его повторном вызове, или же при пункте 5)
Заранее благодарен.
Проект1.zip
Ну и собственно на всякий пожарный
Кликните здесь для просмотра всего текста
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
#include "common.h"
using namespace std;
void get_name(char *&n,int count)
{
    cout<<"Введите имя файла(50): ";
    n = new char[count];
    int i=0;
    getchar();
    fgets(n, 50, stdin);
    for (; n[i] != '\n'; i++){}
    n[i] = 0;
}
void out_cons_str(char *&arr)
{
    if(arr!=0)
        cout<<arr<<"\n\n";
}
void in_file_blk_int(int *&length, int *&array)
{
    int count_endl = 0;
    char *temp = 0;
    if (in_file_blk_str(length, temp)==1)
    {
        if (array != 0)
            delete[] array;
        for (int i = 0; i < *length; i++)
        {
            if (temp[i] == '\n')
                count_endl++;
        }
        array = new int[count_endl];
        *length = count_endl;
        for (int i = 0, j = 0, k = 0; i < *length; i++)
        {
            array[i] = atoi((const char*)&temp[j]);
            for (k = j; temp[k] != '\r'&&temp[k + 1] != '\n'; k++){}
            j = k + 1;
        }
        delete[] temp;
    }
    else
    {
        cout << "Can't read file!\n";
    }
}
/*void in_file_blk_int(int *&length, int *&array)
{
    int count_endl = 0;
    char *temp=0;
    char *fname;
    get_name(fname, 50);
    ifstream in(fname, ios::binary | ios::in); //Открываем файл в двоичном режиме только для чтения
    if (in)
    {
        // получим количество СИМВОЛОВ!!!
        in.seekg(0, in.end);
        *length = in.tellg();
        in.seekg(0, in.beg);
        temp = new char[*length];
        in.read(temp, *length);//читаем весь файл целиком
        in.close();
        if (array != 0)
            delete[] array;
        for (int i = 0; i < *length; i++)
        {
            if (temp[i] == '\n')
                count_endl++;
        }
        array = new int[count_endl];
        *length = count_endl;
        for (int i = 0, j = 0, k = 0; i < *length; i++)
        {
            array[i] = atoi((const char*)&temp[j]);
            for (k = j; temp[k] != '\r'&&temp[k + 1] != '\n'; k++){}
            j = k + 1;
        }
        delete[] temp;
    }
    else
    {
        cout << "Can't read file!\n";
    }
}*/
int in_file_blk_str(int *&length, char *&array)
{
    ifstream in;
    char *fname;
    get_name(fname, 50);
    in.open(fname);
    if (in) 
    {
        // получим количество СИМВОЛОВ!!!
        in.seekg(0, in.end);
        *length = in.tellg();
        in.seekg(0, in.beg);
        if (array != 0)
            delete[] array;
        array = new char[(*length)];
        in.read(array, *length);//читаем весь файл целиком
        in.close();
        array[*length]=0;
        return 1;
    }
    else
    {
        cout << "Can't read file!\n";
        return 0;
    }
}
void in_cons(int length, int *&array)
{
    for (int count = 0; count<length; count++)
        cin>>array[count];
}
void out_cons(int length, int *&array)
{
    for(int count=0;count<length;count++)
        cout << array[count] << "\n";
    cout << endl;
}
void in_file(int length, int *&array)
{
    ifstream in;
    in.open(FILENAME);
    if (!in)
    {
        cout << "Can't read file!\n";
        return;
    }
    for(int count=0; count<length||in;count++)
        in >> array[count]; 
    in.close();
}
void out_file(int length, int *&array)
{
    ofstream out;
    out.open(FILENAME);
    for(int count=0; count<length;count++)
        out << array[count] << "\n";
    out.close();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2014, 22:59
Ответы с готовыми решениями:

Динамическое создание/удаление и перебор противников в 2D игре visual studio
Всем доброго времени суток! Решил сделать простую 2d игру, но появился...

Динамическое выделение массива и удаление одного элемента
Нужно динамически выделить массив из 10 элементов(через new) и при определённом...

C++ try catch throw в разных функциях
try и catch находятся в одной функции а throw вызывается из другой. ну MVS...

Динамическое создание массива
Помогите пожалуйста. Пытаюсь создать массив char* выделяя под него память...

Goto [определение одного имени в разных функциях]
Добрый день форумчане, Чет никак не могу найти Допустим: void f1() { //...

2
KOLLIAK
0 / 0 / 0
Регистрация: 26.06.2014
Сообщений: 3
11.09.2014, 00:31  [ТС] 2
Проблему нашел - при создании массива выделяется еще дополнительное место. Но как этого избежать, или я чего-то не понимаю и туплю
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 01:33 3
В in_file_blk_str():
C++
1
2
3
array = new char[(*length)];
...
array[*length]=0;
Выход за границу массива, с соответствующими последствиями при delete. Последний допустимый индекс *length - 1.

Добавлено через 8 минут
C++
1
2
3
4
5
array = new char[*length + 1];
in.read(array, *length);//читаем весь файл целиком
in.close();
array[*length] = 0;
++(*length);
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 01:33

Динамическое создание массива (одномерного и двумерного)
Скажите, пожалуйста, как создать динамически два массива (одномерный и...

Динамическое создание двумерного массива string
Необходимо создать двумерный массив. Каждый элемент массива является массивом...

динамическое создание двумерного массива и передача его как параметр функции
Здравствуйте, подскажите пожалуйста, как можно передать параметром динамически...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru