Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

RE: Вопросы по C/C++ (Для новичков)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> RE: Вопросы по C/C++ (Для новичков)
Имя
Сообщение << Старые топики   Новые топики >>
RE: Вопросы по C/C++ (Для новичков) - 2010-04-16 21:27:17.603333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1481
RE: Вопросы по C/C++ (Для новичков) - 2010-04-16 21:33:34.273333   
a13xb

Сообщений: 17
Оценки: 0
Присоединился: 2010-03-12 06:22:14.200000
realloc() ?
Post #: 1482
RE: Вопросы по C/C++ (Для новичков) - 2010-04-16 21:57:30.573333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Sunzer
Ассемблерные вставки в коде поддерживает только MSVS?

Нет, конечно же. А ты с gcc пытаешься разобраться? Там всё несколько иначе. Придётся разбираться с at&t синтаксисом, и писать что-то в стиле asm ("pushq %%rbp\n" "movq %%rsp, %%rbp\n" "1:\n" "pushq (%1)\n" "subq $8, %1\n" "dec %2\n" "jnz 1b\n" "call *%3\n" "movq %%rax, %0\n" "movq %%rbp, %%rsp\n" "popq %%rbp\n" : "=r" (ret) : "a" (env + nargs), "c" (i), "r" (func-&gt;compiled.func), "r" (nargs * 8) );
Post #: 1483
RE: Вопросы по C/C++ (Для новичков) - 2010-04-16 22:05:11.300000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Sunzer
Как расширить выделенную через malloc страницу памяти?

Делаю еще раз: a = (byte*) malloc(FileSize);
Но уже указатель в другое место.

realloc, но он не гарантирует, что указатель будет в то же место. Если есть куда растить кусок памяти, он увеличит его, если же увеличить не удастся, то realloc сделает:new = malloc(new_size); memcpy (old, new); free (old); return new;malloc, кстати, не выделяет страницы памяти. Он выделяет память. Из кучи. При необходимости он может попросить систему увеличить кучу процесса. Точнее система (ядро) ничего не знает про кучу, но… Почитай про cbreak, станет понятнее.
Хотя если ты на mingw, то там, скорее всего никаких cbreak'ов нету, и всё работает несколько иначе. Но я не думаю что это принципиально.
Post #: 1484
RE: Вопросы по C/C++ (Для новичков) - 2010-04-16 22:28:54.926666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1485
RE: Вопросы по C/C++ (Для новичков) - 2010-04-17 00:04:42.200000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Введи 42 и твоя первая прога вывалится, так и не найдя ответа на самый главный вопрос.

Тебе я и rgo выше уже всё написали.
Post #: 1486
RE: Вопросы по C/C++ (Для новичков) - 2010-04-17 00:11:11.556666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: Sunzer

quote:

CopyMemory(&a[PEHeaderOffset+0xF8+(SectionNum)*0x28],&NewSection,0x28); 



И есть ли аналоги этой апи? Просто не выгодно ее вызывать.


Легче использовать
quote:

MOV ECX,n
REP MOVS [EDI],[ESI]


memcpy - и компиль с включенной оптимизацией.

Можно вопрос, зачем писать не на асме и предъявлять какие-то требования к производительности? Может лучше сначала закодировать задачу, а потом уже искать "узкие" места и от них избавляться? Преждевременная оптимизация - зло.
Post #: 1487
RE: Вопросы по C/C++ (Для новичков) - 2010-04-17 03:43:58.766666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Sunzer
quote:


Нет, конечно же. А ты с gcc пытаешься разобраться? Там всё несколько иначе. Придётся разбираться с at&t синтаксисом, и писать что-то в стиле

Да я знаю про это. Мне обычный асм синтаксис нужен.

Значит тебе надо писать в msvs

quote:

ORIGINAL: Sunzer
Как то можно заполнить проще чем через CopyMemory?
CopyMemory(&a[PEHeaderOffset+0xF8+(SectionNum)*0x28],&NewSection,0x28); 

Выглядит ужасно, это да. Но… Вчитался в код. А зачем выделять Section из стека и заполнять там? Почему бы не сделать:struct Section *s = (struct Section*)(a + PEHeaderOffset+0xF8+(SectionNum)*0x28); s-&gt;VirtualSize = SectionAlignment; s-&gt;VirtualAddress = 0; s-&gt;PhysicalSize = FileAlignment; ...
quote:

ORIGINAL: Sunzer
Легче использовать
quote:

MOV ECX,n
REP MOVS [EDI],[ESI]

Может и легче. Но всякие там memcpy быстрее. Я проверял – писал на асме аналоги memcpy, пытаясь обогнать библиотечную. Удалось мне это далеко не сразу, и то с помощью гугла и sse. И то, лишь на выравненных данных с размером кратным 128 битам.
Post #: 1488
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 12:23:38.513333   
landau

Сообщений: 4
Оценки: 0
Присоединился: 2010-04-18 11:34:48.960000
Привет. Дайте исходник программы(естественно на C/C++), который после каждого запуска интернета ждёт секунд 15, после чего выполняет vbs скрипт. Для ХРюши.
Post #: 1489
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 12:33:00.810000   
Lost_boy

Сообщений: 327
Оценки: 0
Присоединился: 2009-03-25 11:07:27.910000
Конечно, какие проблемы, пол форума уже побежали строчить код для тебя, подожди пару часов и мы выложим тут код.
Post #: 1490
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 12:48:52.456666   
landau

Сообщений: 4
Оценки: 0
Присоединился: 2010-04-18 11:34:48.960000
Чтож, так грубо?Мож я про исходник программы громко сказал, да ожидание и окрытие скрипта сам могу написать , мне интересно как реализовать всё чудо ожидания запуска инета)))
Post #: 1491
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 14:06:37.016666   
koppeng

Сообщений: 17
Оценки: 0
Присоединился: 2009-10-28 15:46:52.040000
Ввести с клавиатуры многосточный текст. Для хранения текста в памяти воспользоваться функциями динамического выделения.
- ввести с клавиатуры номер строки. Удалить строку с этим номером и вывести результат на экран.

Как ввести многострочный текст? Как выделить под него память если не знаешь сколько в нем будет символов? Как удалить строку?

Я так понимаю что нужно будет использовать массив указателей? Но опять же откуда я узнаб сколько будет строк?
Post #: 1492
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 15:08:56.370000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
quote:

ORIGINAL: landau
Чтож, так грубо?Мож я про исходник программы громко сказал, да ожидание и окрытие скрипта сам могу написать , мне интересно как реализовать всё чудо ожидания запуска инета)))

Учи WinAPI ;). В 20-50 строчек ты точно не уложишься. Да и никто писать не будет, поскольку ты не сможешь сформулировать, что ты понимаешь под "запуском инета". (Намекну, мне, для "запуска инета" на работе достаточно чтобы комп просто был в сети, дома я юзаю VPN).


quote:

ORIGINAL: koppeng
Как ввести многострочный текст?

Построчно. При этом придумать, что должно обозначать конец ввода текста (конец ввода строки - Enter).

quote:

ORIGINAL: koppeng
Как выделить под него память если не знаешь сколько в нем будет символов?

Читать в промежуточный буфер по n символов и, при необходимости, перевыделять память. А вообще тут не стоит особо заморачитьваться.

quote:

ORIGINAL: koppeng
Как удалить строку?

Откуда?

quote:

ORIGINAL: koppeng
Я так понимаю что нужно будет использовать массив указателей?

А это уже как захочешь. Сам "массив указателей" тоже можно делать динамическим. Но лучше всего использовать какой-нибудь контейнер, например std::list< std:: string >.

quote:

ORIGINAL: koppeng
Но опять же откуда я узнаб сколько будет строк?

Сколько пользователь введёт строк - столько их и будет.
Post #: 1493
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 16:06:46.120000   
koppeng

Сообщений: 17
Оценки: 0
Присоединился: 2009-10-28 15:46:52.040000
quote:

quote:

ORIGINAL: koppeng
Как выделить под него память если не знаешь сколько в нем будет символов?

Читать в промежуточный буфер по n символов и, при необходимости, перевыделять память. А вообще тут не стоит особо заморачитьваться.


Почему тут не стоит заморачиваться?

quote:


quote:

ORIGINAL: koppeng
Как удалить строку?

Откуда?


Ну ввели мы 3 строки, как удалить одну из них?


Post #: 1494
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 16:16:08.456666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: koppeng
Ну ввели мы 3 строки, как удалить одну из них?

"Мы ещё пока ничего не ввели. Не вижу кода.

Давай решать вопросы по мере поступления. Напиши ввод строк (можешь со статической памятью, для начала) - потом уже займёмся остальным.

И, отвечай на мои вопросы тоже последовательно, или ничего не получится.
Post #: 1495
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 16:50:58.056666   
koppeng

Сообщений: 17
Оценки: 0
Присоединился: 2009-10-28 15:46:52.040000
//конец ввода текста '1' #include &lt;cstdlib&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;strings.h&gt; int main() { char *str,*tmp; char **pp; char buf[50]; int slength; scanf("%s",buf); slength=strlen(buf); str=tmp=(char *) malloc(slength+1); while(buf[0]!='1') { for (int i=0;i&lt;strlen(buf);i++) *tmp++=buf[i]; scanf("%s",buf); slength+=strlen(buf); str=(char *) realloc(str,slength); } }
Только не совсем правильно работает
Post #: 1496
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 16:55:51.113333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: koppeng

Вот ввод. Вроде бы работает

Ну и удаляй ненужный элемент (указатель) из массива. Это-то сделать сможешь?

P.S. какой язык программирования?
Post #: 1497
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 17:02:16.850000   
koppeng

Сообщений: 17
Оценки: 0
Присоединился: 2009-10-28 15:46:52.040000
Не совсем работает(пост выше). Там эти строчки слились в одну длинную без разделителей между строками. Что делать?
И я хотел в *pp записывать адреса начала строк. Как мне это сделать?
Язык Dev С++
Post #: 1498
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 20:07:13.536666   
landau

Сообщений: 4
Оценки: 0
Присоединился: 2010-04-18 11:34:48.960000
quote:

Язык Dev С++


Если я не ошибаюсь это-Си. А то на чом ты кодишь(IDE)-Dev-C++.

И помогите с моим вопросом. Я подразумевал: как мне устроить в программе, чтоб она ожидала, что чел сядет за свой комп , глотнёт пивка и нажмёт на иконку подключение к интернету: "ADSL".
Post #: 1499
RE: Вопросы по C/C++ (Для новичков) - 2010-04-18 20:42:08.320000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: koppeng

Не совсем работает(пост выше). Там эти строчки слились в одну длинную без разделителей между строками. Что делать?
И я хотел в *pp записывать адреса начала строк. Как мне это сделать?
Язык Dev С++


Ну раз С++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; int main( void ) { std::vector&lt; std::string &gt; str; std::string in; std::vector&lt; std::string &gt;::size_type idx; std::cout &lt;&lt; "Enter some strings:" &lt;&lt; std::endl; for ( ; ; ) { std::getline( std::cin, in ); if ( in == "1" ) break; str.push_back( in ); } std::cout &lt;&lt; "You have entered " &lt;&lt; str.size() &lt;&lt; " string" &lt;&lt; (str.size() == 1 ? "" : "s") &lt;&lt; "\n" &lt;&lt; "Enter number of string to delete: "; std::cout.flush(); std::cin &gt;&gt; idx; if ( idx &lt; str.size() ) str.erase( str.begin() + idx ); else std::cout &lt;&lt; "Invalid selection" &lt;&lt; std::endl; std::cout &lt;&lt; "\nNew text:" &lt;&lt; std::endl; for ( std::vector&lt; std::string &gt;::iterator i = str.begin(); i != str.end(); ++i ) std::cout &lt;&lt; *i &lt;&lt; std::endl; system( "pause" ); return 0; }

quote:

ORIGINAL: landau
И помогите с моим вопросом. Я подразумевал: как мне устроить в программе, чтоб она ожидала, что чел сядет за свой комп , глотнёт пивка и нажмёт на иконку подключение к интернету: "ADSL".

А если у человека DialUp, а не ADSL? Тебе именно запуск конкретного системного ярлыка отследить нужно или наличие подключения к инету? Если последнее, то:

quote:

ORIGINAL: _SaZ_
Учи WinAPI ;). В 20-50 строчек ты точно не уложишься.
Post #: 1500
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 00:40:14.326666   
iidsp

Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
как лучше записать переход к той или иной подпрограмме. в зависимости от условия. Я записал так

           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in al, 0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp al, 04h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je sm &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in al, 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp al, 01h &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je dm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in al, 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp al, 08h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je km&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in al, 0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp al, 10h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je em&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm: &nbsp; &nbsp;&nbsp; call shift_mode dm: &nbsp; &nbsp;&nbsp; call dialing_mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; km: &nbsp; &nbsp;&nbsp; call key_mode &nbsp; em:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call error_mode
Post #: 1501
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 00:57:53   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: landau
И помогите с моим вопросом. Я подразумевал: как мне устроить в программе, чтоб она ожидала, что чел сядет за свой комп , глотнёт пивка и нажмёт на иконку подключение к интернету: "ADSL".

1. Запустить `ping <ip гугла>' с перенаправлением, и ждать, когда ping начнёт писать об удачных пингах. ping лучше запускать с флагом, чтобы он бесконечно пытался бы пинговать.
2. Спросить у гугла что-нибудь типа: enumerate network interfaces windows, и почитать. Твоей программе надо будет просыпаться каждые десять секунд и перечислять их.
3. while (getnetbyname ("google.com") == NULL) sleep (10); 4. … вероятно можно придумать более сложные способы.
Post #: 1502
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 01:33:46.066666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: iidsp
для перехода к подпрограмме по условию, как лучше этот переход записать? вот, как я записал
                    in al, 0           cmp al, 04h                      je sm                                      in al, 0                        cmp al, 1h                        je dm                                      in al, 0                         cmp al, 08h                      je km                                      in al, 0           cmp al, 10h                      je em                                                                                                                                           sm:      call shift_mode dm:      call dialing_mode          km:      call key_mode         em:      call error_mode        pm:      call programming_mode

А причём здесь c++? =)
Но это неверный подход. У тебя все процедурки вызовутся по-очереди, начиная с нужной и до конца списка. Скажем надо было вызвать key_mode, вызовется она, а потом error_mode и programming_mode.
Надо подумать. Я давненько не писал на асме ничего, что не влезало бы в inline-асм.
Можно было бы в конце дописать:here_returns_from_functions: В началеpush offset here_returns_from_functions И все call заменить на jmp. Тогда можно ещё je заменить на jne .+3 (по-моему `jmp im` в 16-ти битном режиме три байта занимает) и делать так:cmp al, 08h jnz .+3 jmp key_mode cmp al, 10h jnz .+3 jmp programming_mode ...
Хотя, мне кажется, тут проще всего сделать так:key_tbl: db 04h, 01h, 08h, 10h, 0h funcs_tbl: dw offset shift_mode, offset dialing_mode, offset key_mode, ..., 0 ... ;; bl -- число, по которому мы принимаем решение. mov si, offset key_tbl; mov cx, -1 case_loop: lodsb inc cx test al, al jz no_key_found cmp al, bl jne case_loop mov ax, funcs_tbl[cx] call ax ... no_key_found: ps. где-то может я чего-то поднаврал в асме. intel синтаксис я подзабыл, да и 16-битным асмом не пользовался давненько, тоже из памяти он стал стираться. но суть, я думаю ясна.
Post #: 1503
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 01:51:37.076666   
iidsp

Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
quote:

in al, 0

=) это я с нулевого порта считываю, определяя нажатие кнопки. а потом проверяю, какая из них нажата, согласно тому, что каждой кнопке на порте соответствует свой унитарный код.

а что за операция такая jnz .3, я знаю что-то подобное, но с использованием $+

мб просто писать, например

in al, 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp al, 08h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jne $+5 call key_mode иначе, проверяем следующее условие&nbsp; in al, 0&nbsp; ...
quote:

А причём здесь c++? =)

с разделом немного промахнулся, по привычке написал.
Post #: 1504
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 03:07:50.620000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
А зачем in al, 0, перед каждым условием? Может надо одно чтение порта, а потом много проверок, типа "что же нам пришло"?
quote:

ORIGINAL: iidsp
мб просто писать, например
in al, 0               cmp al, 08h            jne $+5 call key_mode иначе, проверяем следующее условие  in al, 0  ...

Можно, но при таком подходе, если мы прочитаем 04h, мы первой же проверкой найдём нужную функцию и вызовем её – это хорошо, но потом будем много раз сравнивать al с другими числами, причём заведомо с отрицательным результатом. С одной стороны ничего страшного, с другой стороны – это лишнее процессорное время потраченное впустую. Чтобы этого избежать надо после call добавить jmp exit_switch, но тогда уж проще положить в стек адрес метки exit_switch (here_returns_from_functions) и call заменить на jmp. Что собственно я и предложил.

Мне же нравится вариант с массивом. Такой подход, неудачен если значений мало – одно-два, – но если их становится больше, то этот подход будет быстрее и меньше в размерах. Я думаю меньше он станет, когда значений штук десять наберётся. Если значений будет больше – 20-50, – то можно их расположить в порядке возрастания и использовать двоичный поиск, вместо линейного. Если значений будет очень много 100…256, то можно просто создать таблицу функций размером в 256 элементов, забив нулями неиспользуемые элементы, и обходится без цикла вообще, использовать значение прочитанное из порта как индекс в этом массиве. Последний вариант самый быстрый, но если значений мало, то уж больно много места будет расходоваться впустую, под нули которыми забиваются неиспользуемые элементы. Если же количество значений увеличивать подбираясь к 256 то этот вариант станет ещё и самым мелким по размерам.
quote:

ORIGINAL: iidsp
а что за операция такая jnz .3, я знаю что-то подобное, но с использованием $+

$ – это адрес текущей инструкции? Я именно это и имел в виду. В at&t синтаксисе для ссылки на этот адрес используется точка.
Post #: 1505
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 06:37:22.163333   
landau

Сообщений: 4
Оценки: 0
Присоединился: 2010-04-18 11:34:48.960000
quote:

ORIGINAL: rgo

quote:

ORIGINAL: landau
И помогите с моим вопросом. Я подразумевал: как мне устроить в программе, чтоб она ожидала, что чел сядет за свой комп , глотнёт пивка:D и нажмёт на иконку подключение к интернету: "ADSL".

1. Запустить `ping &lt;ip гугла&gt;' с перенаправлением, и ждать, когда ping начнёт писать об удачных пингах. ping лучше запускать с флагом, чтобы он бесконечно пытался бы пинговать.
2. Спросить у гугла что-нибудь типа: enumerate network interfaces windows, и почитать. Твоей программе надо будет просыпаться каждые десять секунд и перечислять их.
3. while (getnetbyname ("google.com") == NULL) sleep (10); 4. … вероятно можно придумать более сложные способы.


Большое спасибо! Я тоже думал на счёт пинга, но я хотел что нибуть более изящное))) Будем  рыть по вашим советам 8|
Post #: 1506
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 10:46:56.723333   
iidsp

Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
quote:

$ – это адрес текущей инструкции? Я именно это и имел в виду. В at&amp;t синтаксисе для ссылки на этот адрес используется точка.
ну да, отражает содержимое IP в месте ее написания.
подпрограмм будет штук 10.

quote:

А зачем in al, 0, перед каждым условием?
исключительно для демонстрации намерений, конечно же 1 раз.

key_tbl: db 04h, 01h, 08h, 10h, 0h funcs_tbl: dw offset shift_mode, offset dialing_mode, offset key_mode, ..., 0 ... ;; bl -- число, по которому мы принимаем решение. mov si, offset key_tbl; mov cx, -1 case_loop: lodsb inc cx test al, al jz no_key_found cmp al, bl jne case_loop mov ax, funcs_tbl[cx] call ax ... no_key_found:
не все тут понял.
вот я нажал на клавишу. С помощью команды in al, 0 - считал значение(унитарный код) с нулевого порта,
далее, мне надо определить, какую именно клавишу я нажал. Этой командой
lodsb я помещу первый байт из key_tbl в al, но, стоп, в al у меня уже считанный с порта унитарный код, который я и должен сравнивать с другими значениями, что бы определить нажатую клавишу, выходит, что он затирается! может его(считанный с порта унитарный код) переприсвоить куда-то, а потом сравнивать?
давай перейдем в раздел асм =)
Post #: 1507
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 11:24:47.760000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: iidsp
в al у меня уже считанный с порта унитарный код, который я и должен сравнивать с другими значениями, что бы определить нажатую клавишу, выходит, что он затирается! может его(считанный с порта унитарный код) переприсвоить куда-то, а потом сравнивать?

Я ж написал, что число по которому мы принимаем решение лежит в bl, ну просто чтоб не загромождать код. Потому что может нужно не присваивать, а просто прочитать в bl? Ы.

ps. Как-то видел буржуйское обсуждение, где они пытались понять, что же русские имеют в виду говоря в чат `Ы'… Буржуи никак не могли понять, что это одна буква, а не две. =)
Post #: 1508
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 16:16:56.486666   
iidsp

Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
где можно узнать, собирается ли Стенли Липпман переиздавать свою книгу http://www.ozon.ru/context/detail/id/2988768/
Post #: 1509
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 17:07:39.080000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: iidsp

где можно узнать, собирается ли Стенли Липпман переиздавать свою книгу http://www.ozon.ru/context/detail/id/2988768/


у самого Стенли Липпмана?

http://blogs.msdn.com/slippman/contact.aspx
Post #: 1510
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 20:19:09.710000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: Sunzer

Как расширить выделенную через malloc страницу памяти?


Делаю еще раз: a = (byte*) malloc(FileSize);
Но уже указатель в другое место.


если ничего не помогает - прочитайте, наконец, инструкцию

если бы этот закон Мерфи не был изобретён ранее, сейчас был бы вполне подходящий момент
Post #: 1511
RE: Вопросы по C/C++ (Для новичков) - 2010-04-19 20:34:47.633333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
однако. вероятно, следует ожидать на форуме персонажа с ником lifshitz
Post #: 1512
RE: Вопросы по C/C++ (Для новичков) - 2010-04-24 19:56:07.933333   
kazrulit

Сообщений: 79
Оценки: 0
Присоединился: 2009-07-22 14:23:31.770000
ребята создал проект Windows Form потом поставил button1 и пишу ShowMessage("kuku"); Происходит ошибка что ShowMessage несушествует, попытался сделать так MessageBox("Это MessageBox", "Ok", MB_OK); но тоже ошибка выходит только теперь вот такая

e:\мои документы\visual studio 2008\projects\form\form\Form1.h(85) : error C2065: 'MB_OK' : undeclared identifier
.\Form.cpp(16) : error C2872: 'Form1' : ambiguous symbol
could be 'Form1'
or 'e:\мои документы\visual studio 2008\projects\form\form\Form1.h(22) : Form1::Form1'
.\Form.cpp(16) : error C2061: syntax error : identifier 'Form1'

P.S На buildere работает но на Visual C++ нет. Не пойму почему. Объясните плз
Post #: 1513
RE: Вопросы по C/C++ (Для новичков) - 2010-04-24 21:43:33.966666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Windows forms - это C++ / CLI. Пробуй читать книжки. Ты что-то намутил у себя в проекте с формами и к мессаджбоксу это никакого отношения не имеет.
Post #: 1514
RE: Вопросы по C/C++ (Для новичков) - 2010-04-25 09:21:18.176666   
Lost_boy

Сообщений: 327
Оценки: 0
Присоединился: 2009-03-25 11:07:27.910000
Ты делаешь проект С++/СLR я так понял..
MessageBox::Show("kuku");
и все заработает, почитай описание этой функции, там можно еще добавить в нее парочку параметров.
А вообще про книжки тебе верно сказали)
Post #: 1515
RE: Вопросы по C/C++ (Для новичков) - 2010-04-25 14:15:45.080000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Как в MinGW вставить SEH обработчик на определенную часть кода?


Post #: 1516
RE: Вопросы по C/C++ (Для новичков) - 2010-04-25 15:23:28.420000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
try catch ?
Post #: 1517
RE: Вопросы по C/C++ (Для новичков) - 2010-04-26 22:16:20.756666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1518
RE: Вопросы по C/C++ (Для новичков) - 2010-04-26 22:59:53.423333   
lexa107

Сообщений: 5
Оценки: 0
Присоединился: 2010-02-20 22:14:03.803333
в дефайнах не надо в конце ; ставить
Post #: 1519
RE: Вопросы по C/C++ (Для новичков) - 2010-04-27 00:27:45.856666   
a13xb

Сообщений: 17
Оценки: 0
Присоединился: 2010-03-12 06:22:14.200000
и там по идее лучше enum использовать http://www.cprogramming.com/tutorial/enum.html
Post #: 1520
Страниц:  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
Все форумы >> [Компилируемые языки] >> RE: Вопросы по C/C++ (Для новичков)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.