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

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
#1

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

19.02.2013, 13:16. Просмотров 522. Ответов 8
Метки нет (Все метки)

Друзья! То есть суть такая, создаю объект и в конструктор передаю имя процесса и хэндл снимка системы. А в конструкторе начинается невообразимое.

Код сокращал донельзя, больше не упрощается без того, чтобы ошибка не исчезла. Так, если использовать не конструктор класса, а просто какую-нибудь функцию, то ошибка не проявляется.


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;
}

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

Объясните участок кода - C++
Такой вопрос, ребят, что означает данная часть кода for(start_v=1;start_v&lt;=n;start_v++) { rez=new int ; for...

Объясните пожалуйста участок кода - C++
Узнал что это ассоциативный массив for (map&lt;std::string,int&gt;::iterator p = count.begin(); p != count.end(); p++) cout &lt;&lt;...

Что делает этот участок кода? - C++
Уважаемые программисты не могу разобраться что делает следующий кусочек кода, помогите пожалйста int ch; if( ( ch = getch() ) == 0...

Почему не работает часть кода? - C++
Всем хай! Почему не работает часть кода с 27 по 29 строчку, в файле с функциями, я получаю в функцию аргумент указатель, вызываю вторую...

Проверьте правильность кода. Почему выдаёт ошибку? - C++
Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте. ...

Почему выводится такая ошибка? Вот отрывок кода: - C++
case 1: FILE *table; table = fopen_s(&amp;table, &quot;table.xls&quot;, &quot;w&quot;); fprintf(table, &quot; № \t x \t f1 \t f2 \t \n&quot;); for (i = 1; i &lt; n...

8
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.02.2013, 14:50 #2
Цитата Сообщение от kravam Посмотреть сообщение
it= v_PROCESSENTRY32.begin()+ v_PROCESSENTRY32.size()- 1;
Зачем такие танцы с итераторами? Есть же advance().
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
19.02.2013, 15:45  [ТС] #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;
    }
Программу тупо выбивает. В чём дело?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.02.2013, 17:04 #4
Так итератор не валидный вестимо. Если нужен последний - взять rbegin() для контейнера.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
19.02.2013, 18:32  [ТС] #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 первого элемента и выдаст. Не выдаёт!

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

Это мне щас последний элемент нужно взять, а в другие разы придётся брать не последний. Так чё, постоянно от конца что ли отсчитывать элементы? Лучше работать что ли будет?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.02.2013, 18:40 #6
Цитата Сообщение от kravam Посмотреть сообщение
Что значит невалидный? Строчка 30
начально значение it где задается?
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
19.02.2013, 18:49  [ТС] #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
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.02.2013, 18:55 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вы каждый раз итератор сдвигаете на size-1. Но сдвиг идет от уже сдвинутого значения, а не от начала вектора. Вот и получается невалидный на очередной итерации.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.02.2013, 18:57 #9
Цитата Сообщение от kravam Посмотреть сообщение
э, батенька, я всяко пробовал, вы уж поверьте... Кстати, тут мне удалось почему-то в отдельной функции всё это дело продемонстрировать. Ну, короче: какие-то длинные длинные числа выводятся.
почти после каждого push_back it может становится невалидным
1
19.02.2013, 18:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 18:57
Привет! Вот еще темы с ответами:

Почему в программах, компилированных в С++-компиляторах так много лишнего кода? - C++
Здравия всем! Никому не интересное предисловие: Захотел перенсти своего бота с C++ на ассемблер, говорят, так размер уменьшается и...

Два практически идентичных кода, но один почему-то работает медленней - C++
Почему мой код работает намного медленнее? Ведь по сути одно и то же! Мой код: int ans = 0; set&lt;int&gt; check; for...

Как проверить работоспособность участка кода без остальной части программы? - C++
Подскажите пожалуйста, есть ли в visual studios 2010 возможность проверки работоспособности определенной части кода, без наличия готовой...

Найти непрерывный участок - C++
Найти непрерывный участок из 10 элементов, сумма которых максимальна. Размер массива 50-200, диапазон чисел в массиве 0-100. Подскажите...


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

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

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