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

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

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

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

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

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

ORIGINAL: Sunzer

По линку не увидел ничего по теме, английским владею на уровне перевода со словарем


в стандартной библиотеке C нет функции, которая сама бы выбрала seed для инициализации генератора - есть только srand, seed для которого ты должен выбрать вручную (например, текущее время + pid). стандартная библиотека не предоставляет интерфейса получения текущего seed'а, но схоронить его для отслеживания - дело трёх строчек:

unsigned int seed = 0; void setSeed(unsigned int s) { &nbsp;&nbsp;&nbsp; srand(s); &nbsp;&nbsp;&nbsp; seed = s; }
Post #: 1682
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 19:39:52.020000   
Sunzer

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

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

ORIGINAL: Sunzer

Я инициализирую в начале программы. А получить надо в середине.


и что? нахрен тебе этот непереносимый костыль?
Post #: 1684
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 19:44:34.326666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
unsigned int seed = 0; void setSeed(unsigned int s) { &nbsp;&nbsp; &nbsp;srand(s); &nbsp;&nbsp; &nbsp;seed = s; } int main(void) { &nbsp;&nbsp; &nbsp;int RandSeed; &nbsp;&nbsp; &nbsp;setSeed(0x29A); &nbsp;&nbsp; &nbsp;RandSeed = seed; &nbsp;&nbsp; &nbsp;printf("ff = %x", RandSeed); &nbsp;&nbsp; &nbsp;return 0; }
Post #: 1685
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 19:45:47.183333   
Sunzer

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

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

ORIGINAL: Sunzer

Твой способ не катит.


да ну? может ещё и скажешь, почему он не катит?
Post #: 1687
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 19:54:25.443333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1688
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:07:27.610000   
Denaturat

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

ORIGINAL: Sunzer

Потому что мне нужно получить сам счетчик а не первоначальное число которое его инициализирует.
После куча rand() он меняется. И он уже не равен первоночальному. Ты походу не понял чего я хотел.


seed не меняется. ни в C, ни в Delphi. вот тебе вариант реализации rand/srand:

unsigned long next = 1; int rand (void) { next = next * 1103515245L + 12345L; return (unsigned int)((next &gt;&gt; 16) &amp; 0x7fff); } void srand (unsigned int seed) { next = seed; }
Post #: 1689
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:10:35.406666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1690
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:14:12.466666   
Denaturat

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

ORIGINAL: Sunzer

Он так же не меняется как и в твоем примере переменная next :)


до тебя не доходит, что seed и переменная next - это разные вещи? зерно, которым инициализируется генератор и текущее сотояние генератора, однозначно определяемое по seed и позиции в последовательности
Post #: 1691
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:18:08.910000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1692
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:34:58.460000   
Denaturat

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

ORIGINAL: Sunzer

Разве они равны после rand(); ?


давай по порядку. ты инициализируешь генератор зерном seed, которое ты знаешь, и которое однозначно определяет генерируемую последовательность. внутреннее устройство генератора - implementation-defined, оно может быть практически произвольным (например, переменных next может быть две). оценить текущее сотояние ты можешь по выхлопу rand. в принципе, имея исходники libc ты можешь вытянуть значение любых внутренних переменных rand (через extern, если они не static,- или подправив код)

однако главный вопрос вот в чём: что именно кроме seed и выхлопа rand тебе нужно, и зачем?
Post #: 1693
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:46:25.096666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1694
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:52:37.446666   
Denaturat

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

ORIGINAL: Sunzer

Так вот по адресу 404008h находится переменная RandSeed. В Delphi можно получить к ней доступ.


стандарт C не определяет реализации функции rand. понимаешь?

quote:

ORIGINAL: Sunzer

к счетчику нет доступа просто так.


я там выше написал - реализация может быть произвольной, счётчиков может быть два (три, много); к какому из них ты хочешь получить доступ?

quote:

ORIGINAL: Sunzer

А есть ли более простой способ?


понимаешь, я не могу запретить тебе маяться хернёй - это твоё полное право. но мне всё же хотелось бы услышать ответ на вопрос "зачем тебе это нужно?". возможно, тогда и решение найдётся
Post #: 1695
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 20:56:19.256666   
Sunzer

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

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

ORIGINAL: Sunzer

Я задал понятный попрос, и кроме как тонны умных слов ничего толкового не узнал.
Какая разница зачем. Нужно и все.


ты задал на редкость идиотский вопрос, что-то вроде "из револьвера какой марки лучше всего отстреливать себе яйца?"; если ты не хочешь отвечать на мой вопрос - что ж, мне больше нечего добавить. удачи

quote:

ORIGINAL: Sunzer

Несколько счетчиков? Нука дайте мне бинарик с такой реализацией.


unsigned long next1 = 1; unsigned long next2 = 1; int rand(void) { &nbsp;&nbsp;&nbsp; next1 = next2 * 1103515245L + 12345L; &nbsp;&nbsp;&nbsp; next2 = next1 * 1056372849L + 54321L; &nbsp;&nbsp;&nbsp; return (unsigned int)(((next1 &amp; next2) &gt;&gt; 16) &amp; 0x7fff); } void srand(unsigned int seed) { &nbsp;&nbsp;&nbsp; next1 = seed; &nbsp;&nbsp;&nbsp; next2 = seed; }
скомпилируешь сам
Post #: 1697
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 21:29:49.166666   
iidsp

Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
подскажите, откуда берутся nop, если, как вы видите, я их ни где не писал, а только jz CostOvr0



компилятор tasm, модель памяти для .386 с сегментацией по 64 Кбайта
Post #: 1698
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 21:49:57.790000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1699
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 21:52:05.963333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

подскажите, откуда берутся nop

74 7F 90 90
Post #: 1700
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 22:07:01.390000   
iidsp

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

74 7F 90 90

уточнил вопрос…
Post #: 1701
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 22:09:09.980000   
Denaturat

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

ORIGINAL: Sunzer

2Denaturat

Смотри. Есть чистый проект:

main()
{
srand(1);
}

Куда это команда запишет единицу?


стандарт этого не определяет. тебе известна только семантика данной операции и её интерфейс; как именно она будет реализована - оставлено на усмотрение авторов конкретной libc
Post #: 1702
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 22:14:35.080000   
Sunzer

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

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
дабы не быть голословным: смотри ISO/IEC 9899:1999, пункт 7.20.2

на функцию srand наложены следующие условия: при одном и том же seed последовательности, генерируемые rand должны совпадать; по умолчанию seed принимается равным 1; srand должен быть реализован без вызовов других библиотечных функций. никаких ограничений на реализацию не накладывается, потому и однозначного интерфейса доступа к интересующей тебя переменной быть не может
Post #: 1704
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 22:19:36.056666   
Denaturat

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

ORIGINAL: Sunzer

Ок. Хорошо спасибо. Получается только нестандартно оттуда вытащить значение можно.
Либо реализовать свой псевдогенератор случайных чисел.


да. ты можешь либо сделать непереносимый костыль (вроде того, который у тебя там выше нарисован), который будет привязан к конкретной реализации libc; либо написать собственный генератор. второй вариант предпочтительней, потому как переносимые реализации вполне возможны
Post #: 1705
RE: Вопросы по C/C++ (Для новичков) - 2010-05-26 22:24:54.130000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
del
Post #: 1706
RE: Вопросы по C/C++ (Для новичков) - 2010-05-27 01:44:46.176666   
rgo

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

ORIGINAL: Sunzer
Ок. Хорошо спасибо. Получается только нестандартно оттуда вытащить значение можно.

Я как-то писал бота для игры, который играл в однорукого бандита. Бинарник бандита менять я не хотел, запускать его под отладкой – тоже: это было бы тупым и неинтересным читерством. Поэтому я просто перехватывал вывод программы, разбирал его, и по результатам отправлял ему на вход фейковые нажатия клавиш клавиатуры. Алгоритм однорукого бандита у меня был на руках, я знал все вызовы rand которые он выполняет на каждом цикле. И я пытался вычислить текущее значение rand, чтобы угадывать моменты, когда надо идти ва-банк. Кончилась эта бодяга ничем. Когда же я полез разбираться, – что за фигня? – я выяснил что в glibc реализация rand – это не простой линейно-конгруэнтный генератор, а нечто более жестокое. Я не вдавался в подробности, название алгоритма не помню, но там вместо 32-бит переменной next, было, по-моему, порядка тысячи бит состояния. Сколько точно, не помню, но по-любому гораздо больше того, что я мог бы надеятся выяснить перебором.
Это я просто в качестве примера, подтверждающего мнение денатурата:
quote:

ты можешь либо сделать непереносимый костыль (вроде того, который у тебя там выше нарисован), который будет привязан к конкретной реализации libc
Post #: 1707
RE: Вопросы по C/C++ (Для новичков) - 2010-05-27 01:50:52.516666   
Pashkela

Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
ми уже давно писал - Denaturat и _Saz_ в модеры компилируемых языков, достойные парни
Post #: 1708
RE: Вопросы по C/C++ (Для новичков) - 2010-05-27 08:13:29.876666   
TimSkywalker

Сообщений: 7
Оценки: 0
Присоединился: 2010-03-21 06:08:04.610000
Тут вопрос  по сокетам точнее по Winsock, у меня в программе-сервере функция
bind&nbsp; работает нормально только когда в структуре sockaddr_in поле sin_addr.s_addr имеет значение INADDR_ANY(или 0)
то есть сервер принимает подключения на все IP адреса с указанного в sin_port порта,
а когда указываешь конкретный один IP и порт, то все bind не пашет(возвращает ненулевое значение) в чем может быть прблема или так и должно быть?
Post #: 1709
RE: Вопросы по C/C++ (Для новичков) - 2010-05-27 23:50:31.646666   
Denaturat

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

ORIGINAL: Pashkela

Denaturat…в модеры


уж увольте, видел я такое счастье в гробу в белых тапках
Post #: 1710
RE: Вопросы по C/C++ (Для новичков) - 2010-05-30 18:08:08.510000   
m_Sam

Сообщений: 15
Оценки: 0
Присоединился: 2010-05-13 12:11:24.050000
#include "stdafx.h" #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { HWND hWnd; char str[100] = ""; hWnd = GetDesktopWindow(); hWnd = GetWindow(hWnd, GW_CHILD ); while(hWnd != 0 ){ hWnd = GetWindow(hWnd, GW_HWNDNEXT); GetWindowText(hWnd, (LPWSTR)str, 100); if(strlen(str)&gt;0) cout&lt;&lt; str &lt;&lt; endl; } return 0; }

Гдето както записывается лишнее и потом при выходе из программы разрушается стек.
Если же создать буфер на больше чем 195 байтов
char str[196] = ""; тогда ошибку не выдаёт.

Немогу понять в чём ошибка…
Подскажите !
Post #: 1711
RE: Вопросы по C/C++ (Для новичков) - 2010-05-30 23:45:11.083333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
char замени на wchar_t
strlen замени на wcslen
count замени на wcout

И читай про юникод. Какого х ты делаешь приведение типа: (LPWSTR)str. Что за г**но-стайл делать сишное приведение типов во всех местах, где компилер показывает ошибки, вместо того, чтобы подумать, почему возникла ошибка.
Post #: 1712
RE: Вопросы по C/C++ (Для новичков) - 2010-05-31 14:16:53.186666   
m_Sam

Сообщений: 15
Оценки: 0
Присоединился: 2010-05-13 12:11:24.050000

quote:

ORIGINAL: _SaZ_

char замени на wchar_t
strlen замени на wcslen
count замени на wcout

И читай про юникод. Какого х ты делаешь приведение типа: (LPWSTR)str. Что за г**но-стайл делать сишное приведение типов во всех местах, где компилер показывает ошибки, вместо того, чтобы подумать, почему возникла ошибка.


Вчера вечером только докумекал что надо wchar_t использовать, остальное так сказать вытекающее,
а вот насчёт cout думал что используется wout, а не wcout О_о и был неправ)

Надо почитать. Ахах) Нормальный г**но-стайл, или есле выразиться длиннее - опасный стиль под названием "посмотрим что будет" xDD

Спасибо за хороший ответ![sm=bs.gif]

Post #: 1713
RE: Вопросы по C/C++ (Для новичков) - 2010-05-31 14:37:00.540000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
зы, выделяешь 100 байт (чаров) - а функции говоришь, что выделил 100 * sizeof(wchar_t) = 100 * 2 = 200. Выводы сами напрашиваются )
Post #: 1714
RE: Вопросы по C/C++ (Для новичков) - 2010-05-31 21:00:20.440000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);

printf("hello)\n");
SetConsoleTextAttribute(console, 0x09);

printf("hello\n");
getchar();
return 0;

А под unix подобными системами как организовать цветной вывод printf?
Post #: 1715
RE: Вопросы по C/C++ (Для новичков) - 2010-05-31 22:25:31.556666   
Denaturat

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

ORIGINAL: Sunzer

А под unix подобными системами как организовать цветной вывод printf?


зависит от оболочки. для bash как-то так (bash color escape sequences):

http://tuxtraining.com/2009/08/30/bash-color-escape-codes
http://www.daniweb.com/forums/thread33099.html
Post #: 1716
RE: Вопросы по C/C++ (Для новичков) - 2010-06-01 06:47:10.726666   
rgo

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

ORIGINAL: Sunzer
А под unix подобными системами как организовать цветной вывод printf?

esc-последовательности. Они более-менее одинаковы на разных терминалах. Можно использовать termcap, чтобы выяснять точно какие последовательности чего делают – но я не разу не пробовал, даже не представляю насколько это может быть сложно. Наконец, есть ncurses, который берёт на себя всё общение с termcap.
Но если нужен просто терминал, с одним дополнением – цветным выводом, – то пожалуй ничего лучше esc-последовательностей нету.
quote:

ORIGINAL: Sunzer
зависит от оболочки. для bash как-то так (bash color escape sequences):

От языка программирования там ничего не зависит. Вот терминал может влиять. gnome-terminal может использовать другие esc-последовательности, по сравнению с ядерной консолью, но все стараются выдерживать совместимость с ansi терминалом, и основные последовательности у всех одинаковые. В частности последовательности установки цвета.

То есть puts ("\e[00;31mhello") сработает не хуже чем echo -e '\e[00;31mhello'.
Post #: 1717
RE: Вопросы по C/C++ (Для новичков) - 2010-06-01 09:33:21.220000   
Denaturat

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

ORIGINAL: rgo

От языка программирования там ничего не зависит. Вот терминал может влиять.


факт, неправильно написал
Post #: 1718
RE: Вопросы по C/C++ (Для новичков) - 2010-06-06 14:49:27.926666   
Merovingian

Сообщений: 59
Оценки: 0
Присоединился: 2008-12-29 13:55:36.936666
Ребят, подскажите пожалуйста, как получше реализовать посимвольный ввод строки с динамически выделяющейся памятью для неё?
Длинна строки заранее неизвестна.
Нужен цикл с getchar'ом, вероятно, + посимвольное выделение памяти realloc'ом.
кому не сложно. кто знает..
Post #: 1719
RE: Вопросы по C/C++ (Для новичков) - 2010-06-06 15:05:15.096666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Читай ручками в цикле через getchar() - каждый раз перевыделяя память… Но это паранойя, оно того не стоит.
Post #: 1720
Страниц:  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

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