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

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

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

Узнать, что возвращает функция - C++

08.03.2013, 10:53. Просмотров 696. Ответов 13
Метки нет (Все метки)

Функция возвращает указатель на неизвестную структуру

но как определить что содержится в структуре?

это нашел в интернете

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct JassStringData {
    DWORD vtable;
    DWORD refCount;
    DWORD dwUnk1;
    DWORD pUnk2;
    DWORD pUnk3;
    DWORD pUnk4;
    DWORD pUnk5;
    char *data;
};
 
 
struct CJassString {
    DWORD vtable;
    DWORD dw0;
    JassStringData *data;
    DWORD dw1;
};
, но при попытке доступа к структуре(CJassString->data->data), или вызова функции которая возвращает ее — виснет(остальное не выполняется, доходит только до этого)


Каким образом можно это исправить? (зависания. Нужна правильная структура? Если да, то как найти? (через cheat engine, или другой программой можно узнать?))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.03.2013, 10:58     Узнать, что возвращает функция #2
Ничего не понятно. Объект стуктуры JassStringData был создан? И что это за доступ: CJassString->data->data ? CJassString - это тип данных, а не указатель.
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
08.03.2013, 11:04  [ТС]     Узнать, что возвращает функция #3
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
struct JassStringData {
    DWORD vtable;
    DWORD refCount;
    DWORD dwUnk1;
    DWORD pUnk2;
    DWORD pUnk3;
    DWORD pUnk4;
    DWORD pUnk5;
    char *data;
};
 
 
struct CJassString {
    DWORD vtable;
    DWORD dw0;
    JassStringData *data;
    DWORD dw1;
};
 
// GetPlayerName
typedef CJassString * (__cdecl *GAME_GetPlayerName)(HPLAYER whichPlayer);
GAME_GetPlayerName GetPlayerName = (GAME_GetPlayerName)(GameDllAddress + 0x3C0F60);
 
void InitJ()
{
CJassString * Jass=GetPlayerName(Player(1));  // CJassString * GetPlayerName(HPLAYER)
char * Text=Jass->data->data; // тут виснет
 
...
}
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
08.03.2013, 11:05     Узнать, что возвращает функция #4
а код функции увидеть можно?
HighPredator
5458 / 1824 / 335
Регистрация: 10.12.2010
Сообщений: 5,391
Записей в блоге: 3
08.03.2013, 11:06     Узнать, что возвращает функция #5
karaulov2, подозреваю вы хотели скопировать строки? А то у вас только указатель копируется.
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
08.03.2013, 11:11  [ТС]     Узнать, что возвращает функция #6
Цитата Сообщение от Кудаив Посмотреть сообщение
а код функции увидеть можно?

Обязательно? ведь дальше ничего не выполняется. На этом месте обрывается выполнение.



Цитата Сообщение от HighPredator Посмотреть сообщение
karaulov2, подозреваю вы хотели скопировать строки? А то у вас только указатель копируется.
как правильно строку копировать?
HighPredator
5458 / 1824 / 335
Регистрация: 10.12.2010
Сообщений: 5,391
Записей в блоге: 3
08.03.2013, 11:14     Узнать, что возвращает функция #7
C++
1
strcpy(Text,Jass->data->data);
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
08.03.2013, 11:16     Узнать, что возвращает функция #8
Цитата Сообщение от karaulov2 Посмотреть сообщение
Обязательно?
ну желательно бы
функция как видно возвращает указатель на объект, если объект создаётся статически то при выходе из функции он уничтожается и указатель указывает куда то в мусор...





Цитата Сообщение от karaulov2 Посмотреть сообщение
как правильно строку копировать?
strcpy(char*, char*)
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.03.2013, 11:17     Узнать, что возвращает функция #9
Цитата Сообщение от karaulov2 Посмотреть сообщение
struct JassStringData {
* * DWORD vtable;
* * DWORD refCount;
* * DWORD dwUnk1;
* * DWORD pUnk2;
* * DWORD pUnk3;
* * DWORD pUnk4;
* * DWORD pUnk5;
* * char *data;
};
нуль терминальная строка, счётчик ссылок, идентификатор некой таблицы (или стола) и пять резервных полей.
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
08.03.2013, 11:21  [ТС]     Узнать, что возвращает функция #10
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
struct JassStringData {
    DWORD vtable;
    DWORD refCount;
    DWORD dwUnk1;
    DWORD pUnk2;
    DWORD pUnk3;
    DWORD pUnk4;
    DWORD pUnk5;
    char *data;
};
 
 
struct CJassString {
    DWORD vtable;
    DWORD dw0;
    JassStringData *data;
    DWORD dw1;
};
 
// S2I
typedef int  (__cdecl *GAME_S2I)(CJassString *s);
GAME_S2I S2I = (GAME_S2I)(GameDllAddress + 0x3B2D10);
 
// GetPlayerName
typedef CJassString * (__cdecl *GAME_GetPlayerName)(HPLAYER whichPlayer);
GAME_GetPlayerName GetPlayerName = (GAME_GetPlayerName)(GameDllAddress + 0x3C0F60);
 
// Player
typedef HPLAYER  (__cdecl *GAME_Player)(int number);
GAME_Player Player = (GAME_Player)(GameDllAddress + 0x3BBB30);
 
 
void InitS
{
int j = S2I(GetPlayerName(Player(1)));  // Тут зависает
PrintText(1, "Nebudet texta!"); // Текст не отображается 
}
вот так тоже не работает, хотя S2I принимает указатель CJassString а GetPlayerName его возвращает. По идее должно было работать, но почему-то не хочет.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
struct JassStringData {
* * DWORD vtable;
* * DWORD refCount;
* * DWORD dwUnk1;
* * DWORD pUnk2;
* * DWORD pUnk3;
* * DWORD pUnk4;
* * DWORD pUnk5;
* * char *data;
};

так будет правильно?

сейчас добавлю пример данных
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
struct CStringData{ // the actual class name is CStringRep ;)
    DWORD vtable;      //0x00
    DWORD refCount; // 0x04 ?
    DWORD dwUnk1;   // 0x08 ?
    DWORD pUnk2;   // 0x0C ?
    DWORD pUnk3;   // 0x10 ?
    DWORD pUnk4;   // 0x14 this-0xC .o0
    DWORD pUnk5;   // 0x18
    char *data;          // 0x1C ...
 
 
 
 
/* sample data :
0000 - pointer to   ->6F954658          ->6F954658
0004 - Dword        2                   1
0008 - Dword        790393882           3076342506
000C - pointer to   ->1942F14C          ->1942230C
0010 - pointer to   ->078191FC          ->13FE454C
0014 - pointer to   ->13FF3C60          ->13FF3C80
0018 - pointer to   ->13FF3C8C          ->13FF3CAC
001C - pointer to   ->1262B848          ->1262B858
*/
};
 
struct CJassString{
    DWORD vtable;    //0x00
    DWORD dw0;       //0x04  - allways 0 ?
    CStringData *data;//0x08
    DWORD dw1;        //0x0C  - string type ? probably... there is also RCStaticString etc...
 
 
 
 
/* sample data :
0000 - pointer to   ->6F87688C          ->6F87688C
0004 - Dword        0                   0
0008 - pointer to   ->13FF3C6C          ->13FF3C6C
000C - Word         15                  15
*/
};
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
08.03.2013, 11:23     Узнать, что возвращает функция #11
Цитата Сообщение от HighPredator Посмотреть сообщение
karaulov2, подозреваю вы хотели скопировать строки? А то у вас только указатель копируется.
прокапитаню наверно, но если объект актуален, то можно просто ссылаться указателем на какое либо его поле и копировать не обязательно
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
08.03.2013, 11:41  [ТС]     Узнать, что возвращает функция #12
Цитата Сообщение от taras atavin Посмотреть сообщение
нуль терминальная строка, счётчик ссылок, идентификатор некой таблицы (или стола) и пять резервных полей.
куча ошибок

синтаксическая ошибка: отсутствие ";" перед идентификатором "vtable"
отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию

... по 10 раз повторяются


Цитата Сообщение от HighPredator Посмотреть сообщение
C++
1
strcpy(Text,Jass->data->data);
при попытке копирования вся функция зацикливается. И выполняется до этого места.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
08.03.2013, 11:53     Узнать, что возвращает функция #13
функцию в студию
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 19:35     Узнать, что возвращает функция
Еще ссылки по теме:

Написать программу:функция что возвращает элемент массива,и удаляет этот элемент з массива C++
Что возвращает функция после сравнения? C++
Линейный и бинарный поиск: что возвращает функция, если ключ не найден? C++
C++ Функция не возвращает значение
Объясните что возвращает функция C++

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

Или воспользуйтесь поиском по форуму:
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
08.03.2013, 19:35  [ТС]     Узнать, что возвращает функция #14
Цитата Сообщение от Кудаив Посмотреть сообщение
функцию в студию
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
struct JassStringData {
    DWORD vtable;
    DWORD refCount;
    DWORD dwUnk1;
    DWORD pUnk2;
    DWORD pUnk3;
    DWORD pUnk4;
    DWORD pUnk5;
    char *data;
};
 
 
struct CJassString {
    DWORD vtable;
    DWORD dw0;
    JassStringData *data;
    DWORD dw1;
};
 
void PrintText(float stayUpTime, char* message)
{
    // note: stayUpTime is in seconds (==0 means stay forever, ==10 default)
 
    if(!IsInGame())
        return;
 
    DWORD ptrList = GAME_GetPtrList();
    if(!ptrList)
        return;
 
    // *basicly taken from Sheppard PrintText_ASM and translated to C++,
    // didn't research what exactly means offset 0x3EC, possibly its chatPtrList or smth,
    // it's just working and thats all (c) wc3noobpl.
    static DWORD color = 0xFFFFFFFF;    // (c) Dennis
    GAME_Print(*((DWORD*)(ptrList + 0x3EC)), ptrList, message, &color, *((DWORD*)&stayUpTime), NULL);
}
 
 
DWORD StormDllAddress=(DWORD)GetModuleHandleA("Storm.dll");
DWORD GameDllAddress=(DWORD)GetModuleHandleA("Game.dll");
 
 
// S2I
typedef int  (__cdecl *GAME_S2I)(CJassString *s);
GAME_S2I S2I = (GAME_S2I)(GameDllAddress + 0x3B2D10);
 
 
// GetPlayerName
typedef CJassString * (__cdecl *GAME_GetPlayerName)(HPLAYER whichPlayer);
GAME_GetPlayerName GetPlayerName = (GAME_GetPlayerName)(GameDllAddress + 0x3C0F60);
 
// Player
typedef HPLAYER  (__cdecl *GAME_Player)(int number);
GAME_Player Player = (GAME_Player)(GameDllAddress + 0x3BBB30);
 
 
void InitS()
{
    PrintText(2, "1");
    CJassString * Jass = GetPlayerName(Player(0));
    char * Text;
    strcpy(Text,Jass->data->data);// при попытке копирования - получается цикл
    PrintText(2, Text);
}
 
 
void InitS2()
{
    PrintText(2, "1");
    int i = S2I(GetPlayerName(Player(0))); // просто обрывается выполнение 
    PrintText(2, "2");
}
InitS и InitS2 не работают. InitS - зацикливается на "PrintText(2, "1");", а InitS2 останавливается на "PrintText(2, "1");"

Добавлено через 6 часов 3 минуты
Javascript
1
Что, никто не может помочь? :)
Yandex
Объявления
08.03.2013, 19:35     Узнать, что возвращает функция
Ответ Создать тему
Опции темы

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