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

Release работает, Debug - ошибка

17.04.2016, 09:03. Просмотров 414. Ответов 6
Метки нет (Все метки)

Подскажите, товарищи.
Есть код (взял с форума) :
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
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
using namespace std;
 
string encode(long lSize, long * lKey, string fPath)
{
    long i, j;
    string text, line, encstr;
    ifstream ifs(fPath.c_str());
    if(!ifs)
        cout<<"Error open file : "<<fPath.c_str()<<endl;
    else
    {
        while(getline(ifs,line))
            text += line;
        ifs.close();
        cout<<"input string : "<<text.c_str()<<endl;
        for(i = 0; i < text.length(); i += lSize)
        {
            line = "";
            for(j = 0; j < lSize; j++)
                line += text[i + j];
            for(j = 0; j < lSize; j++)
                encstr += line[lKey[j]];
        }
    }
    return encstr;
}
 
string decode(long lSize, long * lKey, string fPath)
{
    long i, j;
    string text, line, decstr;
    ifstream ifs(fPath.c_str());
    if(!ifs)
        cout<<"Error open file : "<<fPath.c_str()<<endl;
    else
    {
        while(getline(ifs,line))
            text += line;
        ifs.close();
        cout<<"input string : "<<text.c_str()<<endl;
        decstr = text;
        for(i = 0; i < text.length(); i += lSize)
        {
            for(j = 0; j < lSize; j++)
                decstr[i + lKey[j]] = text[i + j];
        }
    }
    return decstr;
}
 
int main()
{
    char chr;
    long lKey[5] = {0};
    long i, lSize= sizeof(lKey)/sizeof(lKey[0]);
    
    bool bMenu = true;
    string text;
    while(bMenu)
    {
        cout<<"***MENU***\n";
        cout<<"E - encode\n";
        cout<<"D - decode\n";
        cout<<(chr = getch())<<endl;
        switch(toupper(chr))
        {
        case 'E':
            cout<<"Enter key-block : \n";
            for(i = 0; i < lSize; i++)
            {
                cout<<"KEY["<<i + 1<<"] = ";
                cin>>lKey[i];
            }
            text = encode(lSize, lKey, "encode.txt");
            cout<<"Encoded text : "<<text.c_str()<<endl;
            break;
        case 'D':
            cout<<"Enter key-block : \n";
            for(i = 0; i < lSize; i++)
            {
                cout<<"KEY["<<i + 1<<"] = ";
                cin>>lKey[i];
            }
            text = decode(lSize, lKey, "decode.txt");
            cout<<"Decoded text : "<<text.c_str()<<endl;
            break;
        default:
            cout<<"Unsupported key is pressed\n";
            break;
        }
        cout<<"Press Y for see MENU once again\n";
        cout<<"Any other key - EXIT\n";
        cout<<(chr = getch())<<endl;
        if(toupper(chr) != 'Y')
            bMenu = false;
        system("cls");
    }
    system("pause");
    return 0;
}
Это шифрование и дешифрование перестановки с длиной ключа 5.
Если запускать в VS 2013 debug, то вылезает ошибка.
Если же вверху выбрать Release, то вполне нормально запускается, указанный текст шифрует.
Файлы Encode.txt и Decode.txt находятся в папке с проектом.
Как это можно исправить и нужно ли это вообще исправлять?

Кстати, забыл добавить. Если на вылезающем окне нажать "пропустить", то даже при этом текст шифруется, НО в самом конце добавляются какие-то левые символы.
По моим наблюдениям, ошибка выдается если только длина предложения > длины ключа. Если же ключ = длине слова, то даже в Дебаге все нормально компилируется. И все равно, я не понимаю причин возникновения ошибки, когда предложение все же длиннее ключа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2016, 09:03
Ответы с готовыми решениями:

Программа в режиме Debug работает правильно, а в Release выдает бред
Сделал вот такую программу (она задаёт массив и при вводе 0 или &quot;конце&quot; массива...

Release не работает, Debug работает
Здравствуйте, подскажите в чем может быть проблема, написал программу...

Release/Debug
Здравствуйте! Пишу сложную расчётную программу. И мне важна скорость выполнения...

Debug и Release разница?
объяснить пожалуйста разница между Debug И Release? и почему после компиляции...

difference between debug and release MVS2010
Ума не приложу в какую сторону копать:read: Следующий фрагмент кода, в Дебаге...

6
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
17.04.2016, 09:04 2
Ты где-то выходишь за границы строки. Проверяй индексы.
1
Lemanos
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
17.04.2016, 09:07  [ТС] 3
nmcf,
Но почему тогда в Релизе работает абсолютно все нормально? Не должно ли в этом "режиме" тоже выходить за пределы?
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
17.04.2016, 09:10 4
Релиз просто не проверяет это, а то, что всё работает как ты говоришь - удачное совпадение. Проверяй индексы, ты же выяснил при каких условиях она возникает.
2
Lemanos
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
17.04.2016, 10:06  [ТС] 5
nmcf,
Проблема в том, что код не полностью понятен. Т.е. по частям я все понимаю. Но именно что как работает - не особо.
Укоротил текст вдвоем. В итоге в файле сейчас 45 символов, Дебаг работает нормально.
Может в моем случае действуют ограничения размера какого-то типа?

Добавлено через 7 минут
В общем. Поменял я сам текст, теперь все работает даже с очень длинным текстом. Вероятней всего, сами "буквы" были какими-то не такими.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,148
17.04.2016, 10:13 6
Цитата Сообщение от Lemanos Посмотреть сообщение
Вероятней всего, сами "буквы" были какими-то не такими.
Буквы тут ни при чем. Совершенно очевидно что внутренний цикл по j в функции зашифровки будет вылетать за пределы строки text, если ее длина не кратна lSize.
1
Lemanos
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
17.04.2016, 10:41  [ТС] 7
TheCalligrapher,
Это понятно, НО.
Длина начального текста вроде была кратна, я это проверял... Может допустил ошибку, когда вручную считал.. Новый же текст уже сам писал, может поэтому и работает, т.к. считал символы, когда вводил.. Спасибо за подсказку.
А какой функцией можно записать этот самый text.c_str() в какой нибудь new_encode.txt ? Чтобы любой текст можно было быстро зашифровать и дешифровать..

Добавлено через 8 минут
Точнее.. Я понимаю, что через ofstream . Но реализацию, опять же, не особо представляю.

Добавлено через 10 минут
Сам разобрался) Большое спасибо в любом случае. Этот форум вдохновляет)
0
17.04.2016, 10:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2016, 10:41

Неопределенное поведение в Debug и Release
Писал программу для сложения больших чисел (в файле содержатся числа с...

Debug и Release сборки в Visual Studio
Я начал писать проект на c++ с использованием sfml. При сборке тестовой...

Кодировка в режиме сборки Debug / Release
В проекте использую только Use Multi-Byte Character Set, то есть ASCII. В...


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

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

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