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

Теряется адрес динамического массива после выхода из блока команд

31.01.2021, 17:50. Показов 1008. Ответов 2

Здравствуйте. Пишу функцию, которая по данным двум строкам составит массив из индексов, в которых одна строка встречается в другой. Возникла следующая проблема: после покидания блока команд else адрес динамического массива thislo теряется. Как можно это исправить?

В листинге
- st1 - это строка, в которой ищется строка st2;
- c_st1 - копия st1, c_st2 - копия st2;
- index - переменная, в ячейке памяти которой записано значение индекса элемента строки st1;

Листинг
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
#include <iostream>
#include <windows.h>
using namespace std;
 
int **sost_massiw(char *st1, char *st2);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char s1[256], s2[256];
    int **s;
 
    cout << "Пожалуйста, введите строку, в которой нужно будет искать другую строку\n";
    cin.getline(s1, 256);
    cout << "\n";
    cout << "Пожалуйста, введите строку, которую нужно будет искать в другой строке\n";
    cin.getline(s2, 256);
 
    cout << "\n";
 
    s = sost_massiw(s1, s2);
    cout << "Вывод  массива:\n";
    for (int t = 0; *s + t <= *(s + 1); t++)
        cout << *(*s + t) << " ";
 
    return 0;
}
 
int **sost_massiw(char *st1, char *st2)
{
    int  rasm_massiwa, index;
    int **snatenia = new int*[2];
    static int *thislo = new int[1];
    int *s_m1, *end1, *s_m2, *end2;
    char *c_st1, *c_st2;
 
    *thislo = 0;
    s_m1 = thislo;
    end1 = thislo;
    snatenia[0] = thislo;
    snatenia[1] = thislo;
    c_st1 = st1;
    c_st2 = st2;
    index = 0;
    rasm_massiwa = 1;
 
    while (*st1)
    {
        while (*st2 && *st2 == *st1)
        {
            st1++;
            st2++;
        }
        if (*st2)
        {
            if (!*st1) return snatenia;
            st1 = ++c_st1;
            st2 = c_st2;
            index++;
        }
        else
        {
            cout << index << " " << rasm_massiwa << " " << thislo << " " << thislo + rasm_massiwa - 1 << "\n\n";
            *(thislo + rasm_massiwa - 1) = index;  // Тут возникает ошибка
            rasm_massiwa++;
            int *thislo_1 = new int[rasm_massiwa];
            for (s_m2 = thislo_1; s_m1 <= end1; s_m1++, s_m2++)
                *s_m2 = *s_m1;
            *s_m2 = -1;
            end2 = s_m2;
            s_m2 = thislo_1;
            delete[] thislo;
            static int *thislo = new int[rasm_massiwa];
            cout << rasm_massiwa << " " << thislo << "\n\n";
            for (s_m1 = thislo; s_m2 <= end2; s_m2++, s_m1++)
                *s_m1 = *s_m2;
            s_m1--;
            end1 = s_m1;
            s_m1 = thislo;
            delete[] thislo_1;
            snatenia[0] = s_m1;
            snatenia[1] = end1;
 
            if (!*st1) return snatenia;
            st1 = ++c_st1;
            st2 = c_st2;
            index++;
            cout << "(2) " << rasm_massiwa << " " << thislo << "\n\n";
        }
    }
    return snatenia;
}
Ошибка (замазал то, что не относится к конкретной программе: в программе на скриншоте я убрал не все лишние строки)
Миниатюры
Теряется адрес динамического массива после выхода из блока команд  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2021, 17:50
Ответы с готовыми решениями:

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива....

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Народ подскажите такую вещь я написал программку для вставки элементов в массив при этом...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Всем привет, нашла код на С++ может кто то перевести C# так как я в этом языке не сильна Создайте...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива....

2
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
31.01.2021, 18:02 2
Лучший ответ Сообщение было отмечено IvanShch как решение

Решение

Вы переопределяете thislo в строке 75, так делать нельзя
вы можете просто написать thislo = new int[rasm_massiwa]
И ещё, зачем вам понадобилось объявлять его static?
1
0 / 0 / 0
Регистрация: 16.09.2020
Сообщений: 5
31.01.2021, 18:13  [ТС] 3
Большое спасибо! Я слышал о том, что нельзя переопределять массивы, переменные и др., но тут я его удалял, отчего думал, что его нужно определить заново, так как его нет. Я объявил этот массив static на всякий случай: мне он нужен был вне этой функции. Да, спецификатор static не нужен.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2021, 18:13

Класс динамического массива с проверкой выхода за границы массива
Задание такое: Создайте класс динамического массива, в котором реализована проверка выхода за...

Сгорел контроллер HDD после выхода из строя блока питания
Такая история: сгорел блок питания, из-за него материнка и жесткий диск. Насчет жесткого диска:...

Адрес элемента динамического массива
Здравствуйте, создан динамический массив, нужно вычислить адрес какого-нибудь элемента (зная адрес...

Как правильно указать начальный адрес для динамического (обычного) массива?
Предположим у меня есть динамически выделяемый массив int *ptr0 = new int; Данный массив мне...

Не получается адрес динамического двумерного массива передать, как аргумент функции
/* Лабораторная работа №3 Во всех вариантах необходимо написать три функции, которые будут...

Теряется адрес указателя
Доброго времени суток! Если, что-то не так, извиняюсь за беспокойство. Пишу реализацию...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru