Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 894
от 02.11.2007, 04:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 479, Экспертов: 68
В номере:Вопросов: 6, Ответов: 13


Вопрос № 107006: Почему не работает cin.getline я так и не смог разобраться, решил пойти другим путем: считывать посимвольно с помощью getch(). Но при запуске куска кода, привиденного ниже, все ступориться......
Вопрос № 107022: Здраствуйте!!! У меня проблемы с вводом getline(когда-то раньше давно были такие проблемы, не спрашивал! а когда уже надо исп. возникают проблемы:( ). пишу на MVS c++ 2003! getline просто игнорируеться!!! ну если убрать cin>>c! То работ...
Вопрос № 107035: Здравствуйте, эксперты! Не подскажите как мне считать информацию из данной ячейки памяти данного процесса. Как это делает программа ArtMoney. То есть у меня есть процесс и адрес памяти, мне нужно значение получить. И второй вопрос. Меняются ли адреса...
Вопрос № 107037: Не компилируется след. программа, что Вы можете сказать по этому поводу? ..
Вопрос № 107043: Здравствуйте! Подскажите, пожалуйста, где ошибка: вот кусочек программы: float xr[3][6]={{1,2,3,4,5,7},{1,7,4,8,3,7},{3,5,2,2,1,7}}; Label2->Caption=xr[0][0]; Label3->Caption=xr[1][0]; Label4->Caption=xr[2][0]; Label9...
Вопрос № 107049: Здраствуйте, Уважаемые Эксперты. Подскажите пожалуйста с помощью какой функции можно узнать список запущенных процессов и список запущенных приложений в диспетчере задач и как это реализовать. Заранее спасибо....

Вопрос № 107.006
Почему не работает cin.getline я так и не смог разобраться, решил пойти другим путем: считывать посимвольно с помощью getch(). Но при запуске куска кода, привиденного ниже, все ступориться...

Приложение:

Отправлен: 27.10.2007, 17:33
Вопрос задал: Copogu4 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 8)

Отвечает: Гальцов Андрей Михаилович
Здравствуйте, Copogu4!

Потому что getch() возвращает код нажатой клавиши, а не символ нажатой клавиши...Функция возвращающая символ - getche()...Во воторых getch() возвращает переменную типа int...
Если Вы хотита запоминать в какой то массив символы тех клавиш, котоые нажимаете, то тут getch() не поможет...попробуйте getche()...
getch() в основном используется для создания меню...Например если была нажата клавиша с кодом 49(соответсвует 1), то осуществляется переход по данной теме(очищается экран и выводится нужнвя информаци и др.)...если код 27(Esc), то осуществляется выход...и так далее...
---------
Да здравтствует С++!!!...;)
Ответ отправил: Гальцов Андрей Михаилович (статус: 10-ый класс)
Ответ отправлен: 27.10.2007, 18:12
Оценка за ответ: 5

Отвечает: SiRuS
Здравствуйте, Copogu4!
1) - это символ новой строки, а не символ перевода коретки.
2) у вас не происходит вывод. getch() считывает, но не выводит
Попробуйте так. В этом методе можно легко добавить проверку вводимых символов, обеспечив "защиту от дурака".

Приложение:

Отправлен: 27.10.2007, 20:58
Вопрос задал: CruelHity (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Воробьёв Алексей Викторович
Здравствуйте, CruelHity!

Похоже, что cin >> c; не убирает перевод строки из входного буфера. Когда Вы читаете следующую строку, то и получаете всё, что после числа и до конца строки. Если Вы вводили только одно числ, то получите пустую строку. Если Вы вводили что-то ещё после числа, то увидите остаток строки.
Я нашёл метод cin.ignore(count, ' '); вызов которого после cin >> c; удалит все символы до конца строки включительно в пределах 'count' символов.
Ответ отправил: Воробьёв Алексей Викторович (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 05:01
Оценка за ответ: 5
Комментарий оценки:
Отлично работает!!!! простенко и со вкусом)))))))

Отвечает: Попов А.С.
Здравствуйте, CruelHity!
Попробуете перед cin.getline() вставить следующее:
cin.clear();
_flushall();
Ответ отправил: Попов А.С. (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 17:11
Оценка за ответ: 5
Комментарий оценки:
Хорошо! тоже работает!!1 только не пойму зачем сбрасывать флаги ведь и с ними нормально работает??


Вопрос № 107.035
Здравствуйте, эксперты! Не подскажите как мне считать информацию из данной ячейки памяти данного процесса. Как это делает программа ArtMoney. То есть у меня есть процесс и адрес памяти, мне нужно значение получить. И второй вопрос. Меняются ли адреса памяти одних и тех же переменных с перезапуском процесса? Вообщем расскажите, если не трудно, как выхватить чужие переменные из процессов. Спасибо!
Отправлен: 27.10.2007, 22:06
Вопрос задал: Tossha (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Воробьёв Алексей Викторович
Здравствуйте, Tossha!

Про чтение чужих переменных ничего сказать не могу. Естественно, что это возможно, поскольку именно так работают дебаггеры.
Вы бы поделились деталями проблемы, потому что разные проблемы допускают разные решения.
Например, если Вам не важно отлавливать значение переменной в реальном времени, то Вы можете приаттачиться к процессу из дебаггера и посмотреть Ваш адрес.

Что касается смены адресов, то всё зависит под какой операционкой Вы работаете.
Под Линуксом по умолчанию процесс всегда получает новый адрес, но это можно отключить.
Под Windows XP по умолчанию адрес тот же, но можно настроить компьютер на смену.
Если я не ошибаюсь, то под Вистой загрузчик может выбирать один из 256 возможных адресов для загрузки процесса.
Это всё сделано для усложения работы вирусов, которые чато атакуют уязвимости в программах по определённому адресу.
Ответ отправил: Воробьёв Алексей Викторович (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 07:08
Оценка за ответ: 4

Отвечает: QDSota
Здравствуйте, Tossha!

Посмотрите функцию ReadProcessMemory например на
http://megalib.com/books/860/api32_29.htm.

Адрес переменной относительно начала блока обычно постоянен.
---------
Открыть глаза навстречу солнцу
Ответ отправил: QDSota (статус: Профессионал)
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 29.10.2007, 09:30


Вопрос № 107.037
Не компилируется след. программа, что Вы можете сказать по этому поводу?

Приложение:

Отправлен: 27.10.2007, 22:25
Вопрос задал: Aleha (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Воробьёв Алексей Викторович
Здравствуйте, Aleha!

Вот такой вот вариант собирается под Visual Studio 2003:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

struct CharAndCounter
{
char Char;
int Counter;
CharAndCounter( char _char = ' ' ,int _counter=0) : Char(_char), Counter(_counter) {}
};

struct VocElement
{
string String;
bool Busy;

VocElement(const string& str = "", bool b = false) : String(str),Busy(b) {}
};

struct WordCoords
{
static const char VERTICAL ='v', HORIZONTAL = 'h';
int X,Y;
char Dir;
int Length;

WordCoords(int _x, int _y, int _len, char _dir) : X(_x), Y(_y), Dir(_dir), Length(_len) {}

int dx() { return (Dir == HORIZONTAL) ? 1 : 0; }
int dy() { return (Dir == VERTICAL) ? 1 : 0; }
};

vector<VocElement> Vocabulary;
vector<WordCoords> Crossword;
vector<vector<CharAndCounter> > Field;
bool Less(const VocElement& lhs,const VocElement &rhs)
{
return lhs.String.length() < rhs.String.length();
}

void ReadData()
{
ifstream crossw("Crossword.txt"), voc("vocabulary.txt");

string temp;
while (!voc.eof()){
voc >> temp;
Vocabulary.push_back(VocElement(temp,false));
}

// sort(Vocabulary.begin(), Vocabulary.end(), Less);

int W,H,x,y,len;
char dir;

crossw >> W; crossw >> H;

for (;;) {
crossw >> x; crossw >> y;
crossw >> len; crossw >> dir;
if (crossw.eof())
break;
Crossword.push_back(WordCoords(x,y,len,dir));
}

for (int i = 0; i < W; i++) {
vector<CharAndCounter> col(H);
fill(col.begin(), col.end(), CharAndCounter());
Field.push_back(col);
}
}

bool CanPlace(WordCoords c, const string& word)
{
for (unsigned i = 0; i < word.length(); i ++)
{
if ( Field[c.X+i*c.dx()][c.Y+i*c.dy()].Char != ' ' &&
Field[c.X+i*c.dx()][c.Y+i*c.dy()].Char != word[i])
return false;
}
return true;
}

void PlaceWord(WordCoords c, const string& word)
{
for (unsigned i = 0; i < word.length(); i++)
{
Field[c.X+i*c.dx()][c.Y+i*c.dy()].Char = word[i];
Field[c.X+i*c.dx()][c.Y+i*c.dy()].Counter++;
}
}

void RemoveWord(WordCoords c,const string& word)
{
for (unsigned i = 0; i < word.length(); i++)
{
if (--Field[c.X+i*c.dx()][c.Y+i*c.dy()].Counter == 0)
Field[c.X+i*c.dx()][c.Y+i*c.dy()].Char = ' ';
}
}

bool Solve(unsigned CoordNo)
{
if(CoordNo == Crossword.size())
return true;

pair<vector<VocElement>::iterator, vector<VocElement>::iterator> range;
// pair<vector<VocElement>::iterator, vector<VocElement>::iterator> range =
// equal_range(Vocabulary.begin(), Vocabulary.end(), string(Crossword[CoordNo].Length, ' ',Less);

for (vector<VocElement>::iterator p = range.first; p!=range.second; p++)
if (!p->Busy && CanPlace(Crossword[CoordNo], p->String)) {
p->Busy = true;
if(Solve(CoordNo+1))
return true;
RemoveWord(Crossword[CoordNo], p->String);
p->Busy = false;
}
return false;
}

int main(int argc, char* argv[])
{
ReadData();
if(Solve(0))
{
for (unsigned y = 0; y < Field[0].size(); y++)
{
for (unsigned x = 0;x < Field.size(); x++)
cout << Field[x][y].Char;
cout << endl;
}
}
else
cout << "Решения нету";

return 0;
}
Ответ отправил: Воробьёв Алексей Викторович (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 07:20


Вопрос № 107.043
Здравствуйте! Подскажите, пожалуйста, где ошибка:
вот кусочек программы:
float xr[3][6]={{1,2,3,4,5,7},{1,7,4,8,3,7},{3,5,2,2,1,7}};
Label2->Caption=xr[0][0];
Label3->Caption=xr[1][0];
Label4->Caption=xr[2][0];
Label9->Caption=xr[0][1];
Label10->Caption=xr[1][1];
Label11->Caption=xr[2][1];
Label12->Caption=xr[0][2];
Label13->Caption=xr[1][2];
Label14->Caption=xr[2][2];
Label15->Caption=xr[0][3];
Label16->Caption=xr[1][3];
Label17->Caption=xr[2][3];
Label18->Caption=xr[0][4];
Label19->Caption=xr[1][4];
Label20->Caption=xr[2][4];
Label21->Caption=xr[0][5];
Label22->Caption=xr[1][5];
Label23->Caption=xr[2][5];
не поверите, но это все...и уже не работает :(. значения
xr[0][0]; xr[0][1]; xr[0][2] выводятся не те которые есть 1, 1, 3...а вообще левые....подскажите, пожалуйста, в чем загвоздка.
Отправлен: 27.10.2007, 22:56
Вопрос задала: Mart (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Гальцов Андрей Михаилович
Здравствуйте, Mart!
Label#->Caption имеет тип string...поэтому Ваши елементы массива надо переводить в string, так как они являются переменными типа int...Воспользуйтесь функцией itoa()...тут возможно ошибаюсь, возможно эта функция пишется inttostr()...просто нет сейчас возможности проверить...иногда путаю их...но вобщем Вам нужна функция, котороя переводит целое число в символ или строку...
Label2->Caption=itoa(xr[0][0]); или
Label2->Caption=intotstr((xr[0][0]);

---------
Да здравтствует С++!!!...;)
Ответ отправил: Гальцов Андрей Михаилович (статус: 10-ый класс)
Ответ отправлен: 27.10.2007, 23:14

Отвечает: Виктор Пырлик
Здравствуйте, Mart!

Вы пытаетесь присвоить строковому значению (свойству) число с плавающей запятой.
Надеяться на то, что это сработает не стоит, хотя, Borland иногда и делает такое не явное приведение.

В этом случае, требуется использовать приведение типа - например, функцию
FloatToStr.
Label2->Caption=FloatToStr(xr[0][0]);
И так всегда, в данном случае, для всех меток (Label)


---------
Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: Практикант)
Ответ отправлен: 27.10.2007, 23:18

Отвечает: Архипов Александр Леонидович
Здравствуйте, Mart!
Уважаю мнение других экспертов, и сам всегда в таких случаях привожу присвоение типа Label2->Caption=FloatToStr(xr[0][0]), но попробовал как написано и всё получилось нормально... У меня BCPP6. Возможно тут нет ошибки, а просто Метки идут не попорядку... просто проверить надо.
Ответ отправил: Архипов Александр Леонидович (статус: 7-ой класс)
Ответ отправлен: 29.10.2007, 08:36


Вопрос № 107.049
Здраствуйте, Уважаемые Эксперты.
Подскажите пожалуйста с помощью какой функции можно узнать список запущенных процессов и список запущенных приложений в диспетчере задач и как это реализовать.
Заранее спасибо.
Отправлен: 28.10.2007, 01:16
Вопрос задал: MARTALEX (статус: 4-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lestat de Lionkur
Здравствуйте, MARTALEX!
Привожу пример программы, которая сканирует запущенные процессы.

Приложение:

Ответ отправил: Lestat de Lionkur (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 01:33
Оценка за ответ: 4
Комментарий оценки:
Большое спасибо. К сожилению не компилируется.

Отвечает: Mihail Yarlykov
Здравствуйте, MARTALEX!
Вот небольшой код - получает и выводит список процессов.
Структура PROCESSENTRY32 entry содержит данные о процессе.

Приложение:

---------
Нет ничего невозможного!

Ответ отправил: Mihail Yarlykov (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 07:55
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо. Тлько хотелось бы отметить, что бы вы в следующий раз писали с комментариями.

Отвечает: CruelHity
Здравствуйте, MARTALEX!
Вопрос кончено чуть не суда надо было задавать!А в системное программировани WinApi! так как для разных ОС разные способы! Для виндовс пример в приложении!

Вот отрывок из справочника
//________________________________________
Как получить список всех запущенных процессов и потоков?
Для Windows 9x:
используйте CreateToolhelp32Snapsot/ Process32First(Process32Next)/ Thread32First(Thread32Next).

Для WinNT:
NTQuerySystemInformation. А можно так: получаете список окон в системе (каким угодно способом, если нужны только процессы - можно ограничиться top-level), далее - GetWindowTreadProcessID - получаете ID процесса (и нити). OpenProcess - дает handle процесса.

Приложение:

Ответ отправил: CruelHity (статус: 3-ий класс)
Ответ отправлен: 28.10.2007, 10:00
Оценка за ответ: 4
Комментарий оценки:
Спасибо. Но к сожалению повторный ответ.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.61.1 от 16.10.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное