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

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

08.03.2013, 10:53. Просмотров 844. Ответов 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, или другой программой можно узнать?))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 10:53
Ответы с готовыми решениями:

Узнать что возвращает функция
Вопрос уже задавал раньше, но никто не смог ответить :) В общем есть...

Что возвращает функция size()?
что выполняет функция size() не могу найти кто знает скажите плиз

Объясните что возвращает функция
Здравствуйте. int is_file_folder(const TCHAR *pth) { HANDLE hfind; ...

Что возвращает функция acos?
Какие бы длины сторон я не подставлял постоянно считает по второй формуле из-за...

Что возвращает функция после сравнения?
Здравствуйте, необходимо реализовать код Хаффмана используя такие контейнеры...

13
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.03.2013, 10:58 2
Ничего не понятно. Объект стуктуры JassStringData был создан? И что это за доступ: CJassString->data->data ? CJassString - это тип данных, а не указатель.
0
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; // тут виснет
 
...
}
0
Кудаив
410 / 409 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
08.03.2013, 11:05 4
а код функции увидеть можно?
0
HighPredator
5686 / 2006 / 722
Регистрация: 10.12.2010
Сообщений: 5,768
Записей в блоге: 3
08.03.2013, 11:06 5
karaulov2, подозреваю вы хотели скопировать строки? А то у вас только указатель копируется.
0
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
08.03.2013, 11:11  [ТС] 6
Цитата Сообщение от Кудаив Посмотреть сообщение
а код функции увидеть можно?

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



Цитата Сообщение от HighPredator Посмотреть сообщение
karaulov2, подозреваю вы хотели скопировать строки? А то у вас только указатель копируется.
как правильно строку копировать?
0
HighPredator
5686 / 2006 / 722
Регистрация: 10.12.2010
Сообщений: 5,768
Записей в блоге: 3
08.03.2013, 11:14 7
C++
1
strcpy(Text,Jass->data->data);
0
Кудаив
410 / 409 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
08.03.2013, 11:16 8
Цитата Сообщение от karaulov2 Посмотреть сообщение
Обязательно?
ну желательно бы
функция как видно возвращает указатель на объект, если объект создаётся статически то при выходе из функции он уничтожается и указатель указывает куда то в мусор...





Цитата Сообщение от karaulov2 Посмотреть сообщение
как правильно строку копировать?
strcpy(char*, char*)
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
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;
};
нуль терминальная строка, счётчик ссылок, идентификатор некой таблицы (или стола) и пять резервных полей.
0
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
*/
};
0
Кудаив
410 / 409 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
08.03.2013, 11:23 11
Цитата Сообщение от HighPredator Посмотреть сообщение
karaulov2, подозреваю вы хотели скопировать строки? А то у вас только указатель копируется.
прокапитаню наверно, но если объект актуален, то можно просто ссылаться указателем на какое либо его поле и копировать не обязательно
0
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);
при попытке копирования вся функция зацикливается. И выполняется до этого места.
0
Кудаив
410 / 409 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
08.03.2013, 11:53 13
функцию в студию
0
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
Что, никто не может помочь? :)
0
08.03.2013, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 19:35

Функция, что возвращает динамический массив
Функция возвращает динамический массив int *A1 (BYTE val) { int *mass =...

Линейный и бинарный поиск: что возвращает функция, если ключ не найден?
Есть функция линейного поиска int linesearch(int *V, int n, int b) { int...

Как узнать, что ты уже в интернете, функция InternetGetConnectedState().
Здравствуйте! Есть такая функция InternetGetConnectedState(); из WinInet, так...


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

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

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