PDA

Просмотр полной версии : Вопрос Ответ


loader159
20.11.2011, 02:34
Если нельзя создавать такие темы удалите.

Нужна помощь. Почему переменная " i " первый раз выводит правельное количество 8-рок ( 2 штуки ) а потом на 1 единицу меньше? (9 4- штуки. а печатает 3 )
вот содержимое файла mix2.txt
8
8
9
9
9
9
10
10
10
10
10
10
10
10
10
10
10
10
10
11
12
12
12
12
12
13
13
14

14
14
14
14
15
15
15
15
15
15
15
15
15
15
15
15
15
15
16
16
16
16
16
18
18

19
20
20
20
20
21

21
21
21
21
22
22
22
22
22
23
23
23
23
23
23
23
23
23
23
24
24
24
24

#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
#include "iostream"
main()
{
FILE * fi;
FILE * fo;
fi = fopen("mix2.txt","rt");
fo = fopen("mix3.txt","wt");
int n = 0, x = 8, i = 0;

while (5<10){
fscanf( fi, "%d", &n );
if( n == x )
{
printf("%d\n",n);
++i;
}
else
{
fprintf( fo, "%d\n", i );
printf("%d\n",i);
x++;
i = 0;
}
Sleep(1000);
}
Sleep(5000);

fclose(fi);
fclose(fo);
Sleep(5000);

alexteam
20.11.2011, 02:41
x++;
i = 0;
у нас тут как бы не совсем 0 элементов... 1 уже есть...

loader159
20.11.2011, 03:16
у нас тут как бы не совсем 0 элементов... 1 уже есть...
Я тоже сразу так подумал.
i= 1;
количество повторяющихся чисел выводит верно, но в условие если n != x обязательно должно напечатать 0.

if( n <= x )
{
printf("%d\n",n);
++i;
}
принтует на 1-ну меньше. (не 4ри 9ки а 3)

Добавлено через 12 минут
Все понял почему одну цифру не досчитывал. переделал все заработало
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
#include "iostream"
main()
{
FILE * fi;
FILE * fo;
fi = fopen("mix2.txt","rt");
fo = fopen("mix3.txt","wt");
int n = 0, x = 5, i = 0;
fscanf( fi, "%d", &n );
while (5<10){

if( n == x )
{
++i;
printf("%d\n",n);
fscanf( fi, "%d", &n );
}
else
{
fprintf( fo, "%d\n", i );
printf("%d\n",i);
x++;
i = 0;
}
Sleep(1000);
}
Sleep(5000);

fclose(fi);
fclose(fo);
Sleep(5000);




return 0;

}


часто сканил mix2.txt
fscanf( fi, "%d", &n );

alexteam
20.11.2011, 03:28
fscanf( fi, "%d", &n );
while (5<10){
while(fscanf( fi, "%d", &n )) ?

loader159
20.11.2011, 03:32
while(fscanf( fi, "%d", &n )) ?
fscanf( fi, "%d", &n );
while( !feof(fi) ) вот =)

alexteam
20.11.2011, 03:35
2 варианта
1. пока есть что читать из файла и это чтото соотвествует формату
2. пока не конец файла

спорно.

loader159
20.11.2011, 03:56
while(fscanf( fi, "%d", &n )) ;
после того как сосканила последние число из mix2.txt, программа не продолжается тупо висит. не переходит к этим строкам Sleep(5000);

fclose(fi);
fclose(fo);
Sleep(5000);

и все равно на одну меньше выводит количество цифер.

алекс спасибо за помощь, одну часть задачи вроде решил. завтра продолжу 2ю

etoken
21.11.2011, 21:57
while(fscanf( fi, "%d", &n ) != EOF ) в случае еофа фскан вернет "-1" и цикл будет бесконечным ибо "-1" это тоже не false

по поводу i:
if(i){
printf("%d",i+1)
}
else{
printf("0");
}
не красиво но достигнешь желаемого )

З.ы. кстати а зачем эти безумные слипы ?

vahes
29.11.2011, 00:53
напишу сюда, чтобы не разводить флуд.
Столкнулся с проблемой считывания с памяти данных типа WideString;
процедура вызывается при приходе пакета UserInfo (UserInfo:d(X)d(Y)d(Z)d(Heading)d(ObjectID)s(Name) ...) где PPck указательна пакет без ID

Procedure OnUserInfo(PPck: pointer);
begin
UserInfo.X:=PDword(Dword(PPck))^;
UserInfo.Y:=PDword(Dword(PPck)+4)^;
UserInfo.Z:=PDword(Dword(PPck)+8)^;
UserInfo.ObjectID:=PDword(Dword(PPck)+16)^;
UserInfo.Name{<-тип WideString}:=PWideString(Dword(PPck)+20)^; //здесь ошибка Out Of Memory
...

Подозреваю надо как-то выделять память под это дело, или неправильно читаю. Подскажите плз

xkor
29.11.2011, 01:51
vahes, PWideString - это указатель на WideString который сам по сути является указателем, то есть указатель на указатель получается...
чтоб работало надо так:
Procedure OnUserInfo(PPck: pointer);
begin
UserInfo.X:=PDword(Dword(PPck))^;
UserInfo.Y:=PDword(Dword(PPck)+4)^;
UserInfo.Z:=PDword(Dword(PPck)+8)^;
UserInfo.ObjectID:=PDword(Dword(PPck)+16)^;
UserInfo.Name:=PWideChar(Dword(PPck)+20);
...
и компилятор уже сам позаботится о превращении PWideChar в WideString

vahes
29.11.2011, 02:00
спасибо xkor, ты мозг )

xkor
29.11.2011, 10:16
vahes, я натц)

SeregaZ
29.11.2011, 17:00
- привет мозг!
- привет клтуху, орехи принес?

vahes
15.01.2012, 17:35
Ребяты, я читал вы в своих программах создаете несколько потоков (для прорисовки радара, функций обработки пакетов тд.), вот и до меня дошло, что без этого никак. Использую system.BeginThread для главного потока формы, и в нем как бы все обрабатывалось. Хотел сделать, чтобы функция хука и добавления в свой буффер были в отдельном потоке, но недопру, как сделать, чтобы поток постоянно висел. Пробовал запускать в другом потоке еще 1 форму и не показывать или показывать, а потом скрывать - ошибка Canvas does not allow drawing, если показывать все нормально, но все же иногда тоже вылазит эта ошибка, и интерефейс как бы перенасыщен изобилием форм.
Будьте добры подскажите как правильно запустить поток чтобы он постоянно висел или как вы организовываете в отдельных потоках буферизацию пакетов и их дальнейшею обработку.

xkor
16.01.2012, 01:26
vahes, поток завершается тогда когда завершается которую ты задал выполнять в этом потоке, соответственно чтобы он не завершился надо чтобы эта функция не завершилась)

ЗЫ VCL рассчитано на роботу только в основном потоке, из других потоков не то что создавать а даже обращаться к VCL контролам настоятельно не рекомендуется. Оно в принципе может и будет работать пока работа с контролами в разных потоках не пересекается, но никто не знает когда она может пересечься и что в этом случае произойдет...

mira
16.01.2012, 10:38
Пакеты кладет в буффер пакеты (их копию) сам клиент в хуке.
Сервисный поток разбирает буфер и обрабатывает пакеты занося данные в бд, онже обрабатывает события и состояния программы. Он резидентный.
Другой поток крутит скрипт оперируя инфой из бд, его можно завершать и запускать снова (что и происходит при запуске другова скрипта или паузе). Краш в этой нити максимум останавливает скрипт.

форм никаких нет. Нелюблю лишние окна. У програмы свой графический оконный движок внутри клиента.

ziher
16.01.2012, 19:38
У меня такой вопрос: как читать из памяти клиента НПЦ и игроков? ХП МП И СР разобрался, а это ума не приложу. буду благодарен за любой ответ.

vahes
16.01.2012, 21:39
Пакеты кладет в буффер пакеты (их копию) сам клиент в хуке.
Сервисный поток разбирает буфер и обрабатывает пакеты занося данные в бд, онже обрабатывает события и состояния программы. Он резидентный.
Другой поток крутит скрипт оперируя инфой из бд, его можно завершать и запускать снова (что и происходит при запуске другова скрипта или паузе). Краш в этой нити максимум останавливает скрипт.

форм никаких нет. Нелюблю лишние окна. У програмы свой графический оконный движок внутри клиента.

Я почти также хотел, только чуть по другому, поскольку у меня есть форма (до своего графического движка я еще не дорос) она оперирует данными с бд и тд. В отдельном потоке запустить ф-ю хука которая кладет в буффер пакеты, и еще 1 поток который будет тикать и доставать с буфера пакеты и заносить данные в бд (ф-ю тика засунуть в таймер). Вот но я не догоню как запустить таймер в отдельном потоке, ему вроде как нужна родительская форма.
Ну и тут у меня еще куча вопросов, как таймер загружает систему, вот у меня в режиме радара работает 7 таймеров и когда я их включаю куллер заметно начинает шуметь( может это параноя :D ), может не стоит так много таймеров использовать?
И еще как себя поведет например программа если в буфер данные одновременно будут ложится одним потоком и извлекаться другим?
И как вообще лучше организовать буфер? Я думал, например, array[50] of TFixPck = packed record case Integer of
0:(ch: array[Word] of Char); 1:(bt: array[Word] of Byte);
2:(size: Word; id: Byte; dbt: array[0..65532] of Byte);
end; (спер у xkorа) или вместо массива как в клиенте указатель, но блин я не силен в выделении/освобождении памяти под указатели 100% где-то напартачу.
Звиняйте, что так много вопросов, просто говнокодствую, а потом по 20 раз переписываю. Думаю лучше все точно узнать, и сделать сразу нормально. Спасибо за помощь.

Добавлено через 8 минут
У меня такой вопрос: как читать из памяти клиента НПЦ и игроков? ХП МП И СР разобрался, а это ума не приложу. буду благодарен за любой ответ.

Ну смотря как ты узнаешь хп мп и цп, если по фиксированым смещениям в памяти от этого приема лучше уйти сразу. Можно перехватывать пакеты как л2пх или уже расшифрованые хукая UNetworkHandler::AddNetworkQueue(NetworkPacket *) или UNetworkHandler::DispatchNetworkQueue(NetworkPacke t * *) или хукая ф-и которые эти пакеты вызывают UNetworkHandler::OnЧего-то там ну на этом мои познания заканчиваются :) , а вообще здесь вот http://coderx.ru/showthread.php?t=1077 и еще в этой ветке очень много полезной инфы по этому поводу. По 20 раз перечитывая одно и тоже на 21й обычно доходит (так делал я) :D

mira
17.01.2012, 10:19
Смотря с каким периодом таймеры. Если даже 1мс не должны грузить, если ты канечно в них обсчитываеш мегабайты памяти.
Зачем в хуке поток? Хук на то и хук что выполняетса в контексте родного потока клиента.

мой совет не лезь сразу в дебри то запутаешся и ниче не выдет.
Сделай максимально просто как умееш чтоб работало. Потом неспеша оптимизируй и модифицируй. Ранняя оптимизация и начало со сложного это мертворожденная программа (c)

supernewbie
17.01.2012, 16:16
кстати насчёт графического движка, насколько хорошо надо знать директ3д и ваще знать всякие фишки чтобы рисование движка не снижало фпс в игре? видел пару трейнеров к играми, которые рисуют свои менюшки в игре - дык когда их активируешь фпс в 2 раза падает

mira
17.01.2012, 19:02
у меня фпс почти не меняет .несмотря на то что там анимируютса кнопки при наведении мышки, окошки перетаскиваютса подсвечиваютса меню.
посути возможности неограничены что рисовать

скрины удалил в целях конспирации)

зы. перешол на шейдеры. теперь интерфейс полностью рисуетса шейдером