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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
#1

Получение значения из функции - C++

13.06.2014, 00:09. Просмотров 407. Ответов 7
Метки нет (Все метки)

Здравствуйте! Помогите понять что делаю не так. Очевидно неправильно возвращаю значение из функции, но как правильно реализовать не могу додуматься. Есть такой вот класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CSystemApi
{
public:
    CSystemApi(void);
    ~CSystemApi(void);
    BOOL filePathExist(LPCTSTR szPath);
    LPCSTR getGUID() const;
    LPCSTR getHWID() const;
private:
    CHAR guid[17];
    CHAR hwid[17];
    VOID initGUID(LPSTR guid);
    BOOL initHWID(LPSTR hwid);
};
Функция initGUID по задумке генерит некий уникальный ID и сохраняет его в приватное поле hwid. Выглядит она так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
VOID CSystemApi::initGUID(LPSTR guid)
{
    BYTE buff[MAX_PATH];
 
    RtlGenRandom(buff, sizeof(buff));
 
    MD5 md5;
 
    guid = md5.digestMemory(buff, sizeof buff);
 
    printf("Process ID is: %s\n", guid);
 
    SecureZeroMemory(buff,sizeof(buff));
};
Вызывается это все хозяйство в конструкторе:
C++
1
2
3
4
CSystemApi::CSystemApi(void)
{
    CSystemApi::initGUID(guid);
}
Далее, я пытаюсь уже в приложении создать экземпляр класса и получить значение через аксессор:
C++
1
2
3
    CSystemApi api;
 
    printf("Process ID is: %s\n", api.getGUID());
При этом тот printf, который выводит значение непосредственно в функции показывает нормальную строку, а тот, что используется в приложении возвращает мусор:

Program started...
Process ID is: 451f61e3bb66c3df5027865a30679a88
Machine ID is: cfcd208495d565ef66e7dff9f98764da
Process ID is: 9+4☺→l├H■***&&4☺>&4☺Ё.4☺╨∙<
Machine ID is: &4☺Ё.4☺╨∙<

Подскажите как правильно реализовать возврат значения?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 00:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получение значения из функции (C++):

Схема алгоритма. Как по ГОСТу отобразить обращение и получение значения из функции? - C++
Возник вопрос относительно построения блок-схемы. Операции записываются в символе процесса, прямоугольнике, это я, как ни странно, понимаю,...

Вычислить значения функции F на интервале от начального значения до конечного значения - C++
Написать консольное приложение на С++ Перепечатайте пожалуйста текст задания на форум.

Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции - C++
Написал код, в котором 2 функции одна возвращает стринговое значение, вторая должна бы вернуть значение, отталкиваясь от первой. Возможно...

Получение значения из адреса - C++
Я имею адрес DWORD Vehicle = { 0x00B6F5F0 }; он содержит число(я могу узнать его вне кода), мне нужно получить его в переменную value,...

Получение битов и байтов от значения - C++
Здравствуйте! И так, дано к примеру значение формата 0x0000FF00 . Как получить 2 байт данного значение? или 5 бит? Прошу подробно...

Tuple, получение значения по индексу - C++
Есть вот такая реализация Tuple: template &lt;class...Args&gt; class typle; template&lt;class Head, class...Tail&gt; class typle&lt;Head,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
13.06.2014, 00:43 #2
guid = md5.digestMemory(buff, sizeof buff);
guid - LPSTR, то есть указатель на C строку, а не сама строка. Что либо присваивать указателю бессмысленно, на строчку это никак не повлияет. Надо было написать md5.digestMemory(guid, 17);
0
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 08:22  [ТС] #3
Нет, так как вы написали не пойдет. В функцию передается указатель на область памяти и длинна массива по этому адресу, а возвращает она md5-хеш.
C++
1
2
  /// Digests a byte-array already in memory
  char* digestMemory( BYTE *memchunk, int len )
Пытался писать так
C++
1
*guid = md5.digestMemory(buff, sizeof buff);
, но IDE ругается, говорит "Значение типа char* нельзя присвоить сущности типа char".

Добавлено через 33 минуты
Написал кратко то, что я хочу. Выводится 1 как и задумывалось.
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
#include <iostream>
#include <string>
 
using namespace std;
 
class C
{
    public:
        C(void);
        char getI();
    private:
        void initI(char* i);
        char i;
};
 
C::C(void)
{
    C::initI(&i);
};
 
void C::initI(char* i)
{
    *i = '1';
}
 
char C::getI()
{
    return i;
}
 
int main() {
    C c;
    cout << "i: " << c.getI() << endl;
    return 0;
}
Так что меняю вопрос: как прописать заголовок функции принимающей указатель на массив элементов типа char? Что бы можно было сделать с параметром guid из первого сообщения то же, что я сделал тут с целым числом.

Добавлено через 43 минуты
Решено:

1. добавил символов в массив guid
C++
1
CHAR guid[80];
2. присваивание значения в функции делаю через strcpy
C++
1
2
3
4
5
6
7
8
9
10
11
12
VOID CSystemApi::initGUID(LPSTR guid)
{
    BYTE buff[MAX_PATH];
 
    RtlGenRandom(buff, sizeof(buff));
 
    MD5 md5;
 
    strcpy(guid, md5.digestMemory(buff, sizeof buff));
 
    SecureZeroMemory(buff,sizeof(buff));
};
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
13.06.2014, 08:24 #4
Цитата Сообщение от caldwell Посмотреть сообщение
CHAR guid[80];
а чем тебе структура GUID не угодила?
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
13.06.2014, 08:25 #5
Цитата Сообщение от caldwell Посмотреть сообщение
Так что меняю вопрос: как прописать заголовок функции принимающей указатель на массив элементов типа char? Что бы можно было сделать с параметром guid из первого сообщения то же, что я сделал тут с целым числом.
Ну правильно же ответили - digestMemory возвращает адрес строки в памяти объекта md5.
Вы присваиваете этот адрес своему указателю, и после разрушения объекта md5 он указывает на уже освобожденную память. Нужно копировать хеш, на пример функцией strncpy.
C++
1
2
char* md5_guid = md5.digestMemory(buff, sizeof buff);
strncpy(guid,md5_guid,16);
1
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 09:09  [ТС] #6
ValeryS, согласен с 80 символами я пожадничал, достаточно 32. Без этого был выход за границы массива при копировании через strcpy (без указания количества копируемых символов).

uglyPinokkio, ну дак я сам себе и ответил.

Добавлено через 5 минут
ValeryS, погоди, ты ведь не про количество символов спрашивал. Я так понял это формат хранения и представления данных, а не способ генерации. Мне удобнее все обезличенными хешами хранить, плюс удобно, что хеш можно взять хоть от куска памяти, хоть от строки, хоть от целого файла.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
13.06.2014, 10:18 #7
Цитата Сообщение от caldwell Посмотреть сообщение
Мне удобнее все обезличенными хешами хранить,
А причем здесь хеш???
твоя переменная обозвана CHAR guid
просто байты
кстати почему не unsigned char?
из этого я делаю вывод что это это "статистически уникальный 128-битный идентификатор"
http://ru.wikipedia.org/wiki/GUID
у которого есть своя структура
и есть готовые алгоритмы генерации
если это не так, то переобзови переменную, чтобы не путать не себя не других
1
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 11:35  [ТС] #8
ValeryS, про GUID понял. Это не та структура. Решил, что вопрос в том, почему использую md5-хеш, а не GUID напрямую.

unsigned char больше подходит. Поменяю тип. Спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 11:35
Привет! Вот еще темы с ответами:

Ошибка в получение значения (LIFO) - C++
bool CStack::GetVal( int &amp;val) { if(pFirst==NULL) return 0; else { val=pFirst-&gt;val; } Elem *pCur=pFirst; ...

Получение значения переменной в Dll - C++
Добрый день, как можно задавать и получать значение переменной которая описана в Dll. Я попробовал создать переменную, и написать процедуру...

Получение типа возвращаемого методом значения - C++
Есть некий класс, в классе есть метод возвращающий значение типа T. Можно ли как-то получить это самое T? Пробовал decltype, он требует...

Получение значения через список параметров - C++
Доброго времени суток! есть переменная: int *X=NULL; Необходимо передать её адрес в функцию в которой выделяется для неё память и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.06.2014, 11:35
Ответ Создать тему
Опции темы

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