строго не судить) по с++ я только вчера написал HelloWorld. вопрос такой:
юзаю Dev-C++
есть простое консольное приложение
функция должна выводить список процессов. она выводит, но почему то при поиске в списке процесса firefox.exe она ничего не находит. т.е почему то не выполняетсяif (pe.szExeFile=="firefox.exe")
я понимаю что это возможно разные классы\кодировки.. но не могу это исправить. гуглить даже не знаю по какому вопросу.
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
void ProcessList()
{
HANDLE ps;
ps=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 pe;
pe.dwSize=sizeof(PROCESSENTRY32);
int i;
i=0;
if (Process32First(ps,&pe))
do
{
printf("%s – %d\n",pe.szExeFile,i++);
if (pe.szExeFile=="firefox.exe") printf("-=-=-=-=-=-=-=-=\n");
}
while (Process32Next(ps,&pe));
CloseHandle(ps);
};
21 августа 2009 в 20:04
Нет языка "Visual С++". Visual Studio – это среда разработки, батенька. Отличается большим количеством нонстандартной хрени, MFC и дотнетом. А еще там можно писать void main().
21 августа 2009 в 19:04
давно назрел вопрос, чем отличается язык С++ от Visual С++ (консоль)?
10 августа 2009 в 18:01
Спасибо,всё понял, надо было просто дописать в цикл fahr=fahr+step.
10 августа 2009 в 18:00
Нет. В цикле забыт fahr++;
10 августа 2009 в 16:02
Задача:вывести две таблицы температур по Фаренгейту и Цельсию
Решение:
// Programm 2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
int lower,upper,step;
float fahr,cels;
lower=0;
upper=300;
step=20;
fahr=lower;
while(fahr <= upper)
{
cels=(5.0/9.0)*(fahr-32.0);
printf("%4.0f %6.1f\n",fahr,cels);
}
_getch();
}
Появляются две ошибки:
warning C4244: '=' : conversion from 'int' to 'float', possible loss of data
warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
Вопрос: правильно ли я решил задачу и как избавиться от ошибок, когда я запускаю прогу появляется какой-то бесконечный цикл.
4 августа 2009 в 22:02
Читай выше. Тут делокак бы не в приоритетах а то что в выражении , изменяется несколько раз переменная, что в стандарте описано как the behavior is unspecified . Хм всё ложитcя на рукиhttp:компилятора.
Более подробно//alenacpp.blogspot.com/2005/11/sequence-points.html
И //blog.sjinks.org.ua/c-cpp/537-how-much-is-the-...
4 августа 2009 в 19:05
На MSVS ответ получается 12, видимо префиксные операции имеют самый высокий приоритет. В gcc возможно твое выражение интерпретируется как 4+(3+3), поэтому получается 10. Различие компиляторов очевидно
3 августа 2009 в 19:02
Всё выяснил.
Except where noted, the order of evaluation of operands of individual operators and subexpressions of indi-
vidual expressions, and the order in which side effects take place, is unspecified.53) Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined. [Example:
// the behavior is unspecified
i = v[i++];
// i becomes 9
i = 7, i++, i++;
// the behavior is unspecified
i = ++i + 1;
// the value of i is incremented
i = i + 1;
3 августа 2009 в 18:03
Ну я выше написал что я так же предположил. Но если теперьsum=(++i)+(++i)+(++i) предположение станет не верным ибо получается ответ 10. а не 12.
Компилятор gcc 4.3.3 Может кто-нибудь проверит на других компилляторах
3 августа 2009 в 17:04
Все правильно: инкремент выполняется перед сложением 2 раза, если разложить по шагам, получается выражение типа:
1. i=1
++i
2. i=2
++i
3. i=3
i+i
4. sum=6
3 августа 2009 в 17:04
А во втором случае у меня никак не получается 10 :-/. Ответ вроде 12 должен быть… Ну если еще есть вопросы, поробуй так:
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int sum=0,i=1;
++i;
cout << "sum = " << sum<<endl<<"i="<<i<<endl;
getch();
++i;
cout << "sum = " << sum<<endl<<"i="<<i<<endl;
getch();
sum=i+i;
cout << "sum = " << sum<<endl<<"i="<<i<<endl;
getch();
return 0;
}
3 августа 2009 в 17:02
Решил не создавать новую тему.Вообщем есть вопросец насчёт пост, пре инкрементов.
Код
#include <iostream>
using namespace std;
int main()
{
int sum=0,i=1;
sum=(++i)+(++i);
cout << "sum = " << sum<<endl<<"i="<<i<<endl;
return 0;
}
В результате выводит
sum = 6
i=3
Я не ожидал такого ответа. А собсвенно ожидал
sum=5
i=3
Собсвенно надумал на одно единсвенное обьснения сего. Что мол gcc 4.3.3 упрощает для себя это выражение тоесть сначало делает два раза операцию постинкремента а дальше просто напросто умножает на 2. Хм типо наподобие (1+1)+(1+1)=(1+1)*2 Моё предположение оказалось не верным. Так как
int sum=0, i=1;
sum=(++i)+(++i)+(++i)
Выдаёт
sum = 10
i=4
Не понимаю почему, ведь должно получится
sum=2+3+4=9
i=4
Кто знает почему, поделитесь знаниями. Жаль ассемблер не знаю.
29 июля 2009 в 21:01
нашел WinApi функцию )
if (CompareString(LOCALE_NEUTRAL,0,pe.szExeFile,-1,"firefox.exe",-1)==CSTR_EQUAL) printf("wakwawawka");
так сработало
_
согласен что так легче:
if (!strcmp(pe.szExeFile,"firefox.exe")) printf("wawawaw");
спасибо, разобрался
29 июля 2009 в 20:04
да) я и понял что странно, потому что помню из php что str ищет подстроку в строке. и чтобы точно сравнить ттам надо повозюкаться )
29 июля 2009 в 20:02
strcmp, strwcmp вроде сравнивает
29 июля 2009 в 20:02
а, перепутал немного: wcscmp используй
29 июля 2009 в 20:01
интересно.. а strstr можно сравнивать разные типы строк? потому что в мелкософтовской Visual Studio сейчас смотрел там тип szExeFile WCHAR
29 июля 2009 в 20:00
в С++ невозможно сравнить две строки с помощью оператора ==. Можно использовать стандартную библиотечную функцию strstr для поиска нужного названия процесса