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

Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.02.2013, 13:16     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #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
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
#include <stdio.h> 
#include <Windows.h> 
#include <tlhelp32.h>
#include <vector>
#include <string> 
using namespace std;
 
//структура "узел"
struct uzel {
 
 public:
 
 //конструктор
 uzel (string ima_processa, HANDLE hProcessSnap) {
 
     //Заполняем PROCESSENTRY32
     PROCESSENTRY32 pe32;
     Process32First(hProcessSnap, &pe32);
 
     printf ("hProcessSna= %x\n", hProcessSnap);
     
     //Тут выводится лажа полнейшая!
     printf ("\npe32_.th32ProcessID= %d\n", pe32.th32ProcessID);
     printf ("pe32_.szExeFile= %s\n\n", pe32.szExeFile);
 
     //Вот кладу в вектор один элемент типа PROCESSENTRY32
     v_PROCESSENTRY32.push_back(pe32);
 
     //А тут всё корректно
     printf ("v_PROCESSENTRY32.size()= %d\n", v_PROCESSENTRY32.size());
     printf ("ima_processa= %s\n", ima_processa.c_str());
 
     //НО если вот с этими двумя строчками поэксперементировать,
     //например: закомментить, или закомментить одну из них
     //ТО почему-то код, который находится ВЫШЕ, отработает корректно, то есть выведется
     //PID, равный 0 и имя процесса [System Process]
     //ПОЧЕМУ ТАК?
     if (ima_processa== string(pe32.szExeFile)) 
       it= v_PROCESSENTRY32.begin()+ v_PROCESSENTRY32.size()- 1;      
     
 
 }
 
 //Это итератор 
 vector<PROCESSENTRY32>::iterator it;
 
 //это вектор
 vector<PROCESSENTRY32> v_PROCESSENTRY32;
 
};
                                  //+
                                  //+
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 HANDLE hProcessSnap= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 uzel uz ("explorer.exe", hProcessSnap); 
 getchar ();
 getchar ();
 return 0;
}

Спасибо, кто откликнется
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 13:16     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему?
Посмотрите здесь:

C++ Проверьте правильность кода. Почему выдаёт ошибку?
Что делает этот участок кода? C++
Найти непрерывный участок C++
Заполнить участок памяти C++
C++ Объясните пожалуйста участок кода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.02.2013, 14:50     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #2
Цитата Сообщение от kravam Посмотреть сообщение
it= v_PROCESSENTRY32.begin()+ v_PROCESSENTRY32.size()- 1;
Зачем такие танцы с итераторами? Есть же advance().
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.02.2013, 15:45  [ТС]     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #3
advance() конечно, хорошо, но... Вот несколько другой пример:

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
    #include <stdio.h> 
    #include <Windows.h> 
    #include <tlhelp32.h>
    #include <vector>
    #include <string> 
    using namespace std;
    
    //структура "узел"
    struct uzel {
     
     public:
    
    
     //В качестве эесперимента (или пока тестируем) можно ввести и такой конструктор.
     //Опять же процесс ima_processa должен быть, иначе неопределённое поведение
     uzel (string ima_processa, HANDLE hProcessSnap) {
    
         printf ("hProcessSna= %x\n", hProcessSnap);
    
         //Заполняем v_PROCESSENTRY32
         PROCESSENTRY32 pe32_;
         Process32First(hProcessSnap, &pe32_);
    
         v_PROCESSENTRY32.push_back(pe32_);
         advance (it, v_PROCESSENTRY32.size()- 1);
         printf ("это видим\n");
    
         Process32Next(hProcessSnap, &pe32_);
         v_PROCESSENTRY32.push_back(pe32_);
         advance (it, v_PROCESSENTRY32.size()- 1);
    
         printf ("это видим\n");
         printf ("(*it).th32ProcessID= %d\n", (*it).th32ProcessID);
         printf ("а это ни хрена не видим\n");
     }
    
    
    
    
     //Инфа о процессе
     vector<PROCESSENTRY32>::iterator it;
     
     //Это вот будет такая херь как вектор элементов типа PROCESSENTRY32
     vector<PROCESSENTRY32> v_PROCESSENTRY32;
    
    };
                                      //+
                                      //+
    int main () {
     SetConsoleCP (1251);
     SetConsoleOutputCP (1251);
     HANDLE hProcessSna= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     printf ("hProcessSna= %x\n", hProcessSna);
     uzel uz ("explorer.exe", hProcessSna); 
     getchar ();
     return 0;
    }
Программу тупо выбивает. В чём дело?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.02.2013, 17:04     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #4
Так итератор не валидный вестимо. Если нужен последний - взять rbegin() для контейнера.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.02.2013, 18:32  [ТС]     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #5
Что значит невалидный? Строчка 30
C++
1
advance (it, v_PROCESSENTRY32.size()- 1);
Размер v_PROCESSENTRY32 какой? 2, значит можно так написать:
C++
1
advance (it, 1);
Вот и всё, первый элемент ЕСТЬ. Никуда он не делся. Ибо я этот код:
C++
1
v_PROCESSENTRY32.push_back(pe32_);
вызывал два раза. Всё, в массиве v_PROCESSENTRY32 два элемента, нулевой и первый. Вот пусть он мне th32ProcessID первого элемента и выдаст. Не выдаёт!

+++++++++++++++++++++++++++++++++++

Это мне щас последний элемент нужно взять, а в другие разы придётся брать не последний. Так чё, постоянно от конца что ли отсчитывать элементы? Лучше работать что ли будет?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.02.2013, 18:40     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #6
Цитата Сообщение от kravam Посмотреть сообщение
Что значит невалидный? Строчка 30
начально значение it где задается?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.02.2013, 18:49  [ТС]     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #7
э, батенька, я всяко пробовал, вы уж поверьте... Кстати, тут мне удалось почему-то в отдельной функции всё это дело продемонстрировать. Ну, короче: какие-то длинные длинные числа выводятся.

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
#include <stdio.h> 
#include <Windows.h> 
#include <tlhelp32.h>
#include <vector>
#include <string> 
using namespace std;
                                  //+
                                  //+
                                  //+
 
void uzel (string ima_processa, HANDLE hProcessSnap) {
 
     vector<PROCESSENTRY32>::iterator it;
     vector<PROCESSENTRY32> v_PROCESSENTRY32;
 
 
     PROCESSENTRY32 pe32_; 
     pe32_.dwSize = sizeof(PROCESSENTRY32);
 
 
     Process32First(hProcessSnap, &pe32_);
     v_PROCESSENTRY32.push_back(pe32_);
     it= v_PROCESSENTRY32.begin();
     advance (it, v_PROCESSENTRY32.size()- 1);
 
 
     printf ("pe32_.th32ProcessID= %d\n", pe32_.th32ProcessID);
     printf ("(*it).th32ProcessID= %d\n", (*it).th32ProcessID);
 
 
     Process32Next(hProcessSnap, &pe32_);
     v_PROCESSENTRY32.push_back(pe32_);
     advance (it, v_PROCESSENTRY32.size()- 1);
 
 
     printf ("pe32_.th32ProcessID= %d\n", pe32_.th32ProcessID);
     printf ("(*it).th32ProcessID= %d\n", (*it).th32ProcessID);
 
 
     Process32Next(hProcessSnap, &pe32_);
     v_PROCESSENTRY32.push_back(pe32_);
     advance (it, v_PROCESSENTRY32.size()- 1);
 
 
     printf ("pe32_.th32ProcessID= %d\n", pe32_.th32ProcessID);
     printf ("(*it).th32ProcessID= %d\n", (*it).th32ProcessID);
 
 
     Process32Next(hProcessSnap, &pe32_);
     v_PROCESSENTRY32.push_back(pe32_);
     advance (it, v_PROCESSENTRY32.size()- 1);
 
 
     printf ("pe32_.th32ProcessID= %d\n", pe32_.th32ProcessID);
     printf ("(*it).th32ProcessID= %d\n", (*it).th32ProcessID);
 }
 
 
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 HANDLE hProcessSna= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 printf ("hProcessSna= %x\n", hProcessSna);
 uzel ("explorer.exe", hProcessSna);//uz ("explorer.exe", hProcessSna); 
 getchar ();
 return 0;
}
Добавлено через 54 секунды
Цитата Сообщение от Jupiter Посмотреть сообщение
начально значение it где задается?
строчка 23
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.02.2013, 18:55     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вы каждый раз итератор сдвигаете на size-1. Но сдвиг идет от уже сдвинутого значения, а не от начала вектора. Вот и получается невалидный на очередной итерации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 18:57     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему?
Еще ссылки по теме:

C++ Объясните участок кода
C++ Как проверить работоспособность участка кода без остальной части программы?
Параметр конструктора класса нигде не задействован, но его отсутствие влияет на компиляцию, почему так? C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.02.2013, 18:57     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему? #9
Цитата Сообщение от kravam Посмотреть сообщение
э, батенька, я всяко пробовал, вы уж поверьте... Кстати, тут мне удалось почему-то в отдельной функции всё это дело продемонстрировать. Ну, короче: какие-то длинные длинные числа выводятся.
почти после каждого push_back it может становится невалидным
Yandex
Объявления
19.02.2013, 18:57     Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему?
Ответ Создать тему
Опции темы

Текущее время: 18:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru