Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Akrage
5 / 5 / 4
Регистрация: 26.03.2015
Сообщений: 28
#1

Функция возвращает неверное значение - C++

07.11.2015, 16:05. Просмотров 302. Ответов 4
Метки нет (Все метки)

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

1 функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char* SearchClientInBase(LoginPasswordKeeper *LKM, char *ClientLogin, int &count)
{
    char *ServerPassword;
    srand(time(NULL));
    int rnd = -1000000 + rand() % 1000000;
    ServerPassword = new char[8];
    _itoa(rnd,ServerPassword,10);
 
    for (int i = 0; i < count;++i)
    if (!strcmp(LKM[i].login, ClientLogin))
    {
        delete[] ServerPassword;
        ServerPassword=new char[strlen(LKM[i].password)+1];
        ServerPassword = LKM[i].password;
    }
    return ServerPassword;
}
2 функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char* Hashing(const char *login, const char *password, const char *number)
{
    const int  lenght = strlen(login)+strlen(password)+strlen(number)+1;
    char *StringForHashing = new char[lenght];
    strcat(strcat(strcpy(StringForHashing, number),login), password);
    cout << StringForHashing << "\n";
    MD5 md5;
    char* hash_value = new char[33];
    hash_value=md5.digestString(StringForHashing);
    cout << hash_value << "\n";
    return hash_value;
}
Работа с функциями:
C++
1
2
3
4
char *ServerPassword = SearchClientInBase(LKM, ClientLogin, count);
    cout << ServerPassword << "\n";
    char *ServerHash=Hashing(ClientLogin, ServerPassword, number);
    cout << ServerHash << "\n";
То есть в ServerPassword передается корректное значение, а в ServerHash - неверное, причем если в самой функции вывести возвращаемое значение перед return-ом - то оно правильное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2015, 16:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция возвращает неверное значение (C++):

Функция не возвращает значение
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; #include...

Функция не возвращает значение
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Функция get() не возвращает значение
Есть класс, в котором определен объект типа SDL_Surface*. Пытаюсь передать его...

Функция не возвращает значение
Функция ничего не возвращает: int Return(int s) { return s; } Передаю...

Функция возвращает неправильное значение
Нужно выполнить 3 задачи с веденным с клавиатуры массивом. Первая и третья...

Функция неправильно возвращает значение
double SparseMatrix::get(int i, int j)const { if (rows != nullptr &amp;&amp; cols !=...

4
Melg
538 / 159 / 79
Регистрация: 23.09.2013
Сообщений: 316
07.11.2015, 16:15 #2
Akrage, Поскольку полного кода вы не предоставили, и большинство типов не известно, то можно только догадываться, но уже есть одна вещь, которая меня смущает:
C++
1
2
3
4
5
6
 MD5 md5;
    char* hash_value = new char[33];
    hash_value=md5.digestString(StringForHashing);
    cout << hash_value << "\n";
    return hash_value;
}
Вы выделяете память под 33 чара, записываете указатель на начало этого динамического массива в hash_value.
Следующей строчкой вы затираете значение hash_value - другим адресом, который получен из md5.digestString(StringForHashing);

Для начала это означает, что здесь происходит утечка 33 байт памяти.
Кроме того, если на строке cout << hash_value << "\n"; выводится, как Вы говорите, правильное значение, а при выходе из функции - уже не правильное, логично предположить следующее:
у MD5 есть деструктор, он вызывается по выходу из данной функции. В нём прописана очистка его внутренних буферов, в том числе того, в котором хранился результат выполнения digestString. Либо еще хуже - просто по выходу из функции эта память освобождена, и её место занял уже другой объект.
Поскольку вы не уточнили что конкретно за строки получаются, в чем разница того, что Вы ожидали получить, и что на самом деле получили - сказать более конкретно трудно.
Попробуйте правильно копировать результат вычисления метода digestString в другую память, за время жизни которой Вы отвечаете.
0
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,381
07.11.2015, 16:17 #3
Во-первых, В 14-й строке должна быть strcpy().
Ты как попало работаешь с памятью. StringForHashing кто удалять будет в конце? Во второй функции что возвращает digestString? Не локальный объект? Покажи текст этой функции.
0
zss
Модератор
Эксперт С++
6960 / 6522 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
07.11.2015, 16:52 #4
Цитата Сообщение от Akrage Посмотреть сообщение
rand() % 1000000
Зачем %1000000, в то время, когда rand() не бывает больше RAND_MAX=32767
Если нужны числа в диапазоне [-1000000,1000000]
C++
1
 int rnd = (int)((double)rand()/(RAND_MAX+1.0)*2e6-1e6);
0
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,381
07.11.2015, 16:58 #5
Цитата Сообщение от zss Посмотреть сообщение
не бывает больше RAND_MAX=32767
Там говорится, что не менее 32767. Может где-то и больше бывает.
0
07.11.2015, 16:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2015, 16:58
Привет! Вот еще темы с решениями:

Почему функция не возвращает значение?
По заданию из учебника, нужно написать небольшую поисковую систему, используя...

Функция возвращает странное значение
Да, понимаю, что скорее всего ошибка глупая, но голова разбитая и найти не...

Функция не возвращает значение (консолька, си++)
Функция не возвращает значение, но указывает по какому if'у она прошла. Почему...

Рекурсивная функция не возвращает ожидаемое значение
В функции исчесляется {\sin}^{2}(x) разложением в ряд Тэйлора. Все работает...


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

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

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