Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗаймусь наконец алгоритмами Анатолий и Дмитрия C: Раз уж изучать собрался, то замени в моем коде perebor(int N) Код: plaintext 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. Небольшие косметические изменения, для улучшения читабильности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 07:47 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Дмитрий ваш код я уже изучил, и уже использовал вашу идею в оптимизированном алгоритме :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 07:51 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercuryDima T, мне показалось, что это выражение будет истинным, когда cur не будет принадлежать массиву buf. все верно, именно это и проверяется SashaMercuryПотому я и спросил, законно ли сравнивать указатели принадлежащие разным кускам памяти Нельзя сравнивать указатели на элементы разных массивов. В данном случае массив один, т.е. один кусок памяти. В принципе можно это Код: plaintext 1. 2. 3. заменить на Код: plaintext 1. 2. 3. perebor(int N) целиком Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 08:03 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Dima_TНельзя сравнивать указатели на элементы разных массивов. В данном случае массив один, т.е. один кусок памяти. но если cur будет меньше начала массива buf, то cur не будет принадлежать этому массиву, значит сравниваются начало массива, и элемент не принадлежащий ему. Разве не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 08:11 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
А вот конечный вариант, с использованием идеи Дмитрия по окончанию всех вариантов(только модифицированная идея, выделил желтым), и предложения Анатолия использовать fputs вместо printf. Осталось избавить от аллоцирования, нужно делать так, чтобы стартовая строка появлялась с использованием макроса, если это возможно. Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 08:17 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Dima T В принципе можно это Код: plaintext 1. 2. 3. заменить на Код: plaintext 1. 2. 3. вот, в первом участке кода, вы сравниваете адреса памяти не из одного буфера (если подразумевается истина), а второй участок кода полностью мне нравится. Я знаю что могу указывать на участок памяти(1 адрес) сразу после массива, но про то я могу указывать на участок памяти до массива, не слышал, потому и спросил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 08:22 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercuryDima_TНельзя сравнивать указатели на элементы разных массивов. В данном случае массив один, т.е. один кусок памяти. но если cur будет меньше начала массива buf, то cur не будет принадлежать этому массиву, значит сравниваются начало массива, и элемент не принадлежащий ему. Разве не так ? У тебя путаница в голове: cur это не элемент массива, а указатель на элемент массива (адрес в памяти), т.е. сравниваются адрес записанный в cur и адрес начала массива. Обращение к памяти по этим адресам не происходит. cur это переменная хранящая адрес в памяти, который (по условиям алгоритма) должен указывать на элемент массива (проверяется что он не указывает). При этом cur может указывать за пределы массива - это не криминал, криминал прочитать/записать по адресу за пределами массива, т.е. нельзя использовать *cur когда cur указывает за пределы массива, но при этом можно использовать содержимое переменной cur. Понятно или с картинками объяснить? Это надо четко понимать при работе с указателями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 08:43 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryпропущено... но если cur будет меньше начала массива buf, то cur не будет принадлежать этому массиву, значит сравниваются начало массива, и элемент не принадлежащий ему. Разве не так ? У тебя путаница в голове: cur это не элемент массива, а указатель на элемент массива (адрес в памяти), т.е. сравниваются адрес записанный в cur и адрес начала массива. Обращение к памяти по этим адресам не происходит. cur это переменная хранящая адрес в памяти, который (по условиям алгоритма) должен указывать на элемент массива (проверяется что он не указывает). При этом cur может указывать за пределы массива - это не криминал, криминал прочитать/записать по адресу за пределами массива, т.е. нельзя использовать *cur когда cur указывает за пределы массива, но при этом можно использовать содержимое переменной cur. Понятно или с картинками объяснить? Это надо четко понимать при работе с указателями. Такой участок кода имеет место быть ? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 08:52 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Dima_TПонятно или с картинками объяснить? Это надо четко понимать при работе с указателями. Дмитрий, я всё это прекрасно понимаю, Сообщество, и вы в том числе этому меня научили :) K&R p.104Если P и Q указывают на элементы одного и того же массива, то такие отношения, как <, >= и т.д., работают надлежащим образом. Например, P < Q истинно, если P указывает на более ранний элемент массива, чем Q. Отношения == и != тоже работают. Любой указатель можно осмысленным образом сравнить на равенство или неравенство с NULL. Но ни за что нельзя ручаться, если вы используете сравнения при работе с указателями, указывающими на разные массивы. Если вам повезет, то на всех машинах вы получите очевидную бессмыслицу. Если же нет, то ваша программа будет правильно работать на одной машине и давать непостижимые результаты на другой. Diomidis Spinellis Code Reading: The Open Source PerspectiveNote that, although it is illegal to access elements outside those prescribed by an array's limits, ANSI C and C++ allow the calculation of the address of the element immediately after the array's end. Calculating the address of any other element outside the array limits is illegal and can lead to undefined behavior in some architectures even if no actual access takes place. The address of the element beyond the end is used as an indicator for marking the end of the range and iterating through it. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 09:04 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercuryТакой участок кода имеет место быть ? Код: plaintext 1. 2. Теоретически да, но практически это потенциальная трудноотлавливаемая ошибка, если далее ошибочно будет использовано *temp и по этому адресу окажется реальная память. При инициализации лучше использовать NULL, чтобы при ошибочном обращении гарантированно была ошибка обращения к несуществующей памяти. Код: plaintext 1. Если много вычесть, могут проблемы возникнуть. Запусти Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 09:30 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Мне кажется, что вы говорите следующее. Пусть x имеет тим size_t, тогда для следующего участка кода Код: plaintext 1. 2. 3. 4. строчки 1 и 2 будут корректны если x будет в диапазоне от 1 до 5, а если x>1000 то строчки 1 и 2 некорректны и мы можем наблюдать undefined behaviour. Я вам говорю, что в любом случае мы наблюдаем undefined behaviour, и привожу ссылки на K&R и Спинеллиса. Не говорю, что вы не правы, но пока я с вами не согласен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 10:21 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Ого сколько тут читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 12:35 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercuryОсталось избавить от аллоцирования Надо понимать, где остановиться оптимизируя код. Данная оптимизация не даст никакого прироста скорости, потому что на 100 млрд итераций несколько аллокаций никак не повлияют, а код наверняка будет хуже читаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 12:41 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. 2. Я-бы так никогда не делал. Это за пределами аллоцированной памяти. Разные среды ведут себя по разному в таком кейсе при попытке чтения/записи по указателю temp. В хорошем варианте мы получит немедленный лопух с сообщением типа Segfault или "Программа выполнила недопустимую...". В плохом варианте мы будем очень долго и глючно работать пока разработчика не накажут коллеги за лень и глупость или проклянёт заказчик, или будет пробита карма, или всемогущий покарает болезнями и смертью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 12:43 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Вот ключевая мысль твоей цитаты: SashaMercuryK&R p.104... Но ни за что нельзя ручаться, если вы используете сравнения при работе с указателями, указывающими на разные массивы. ... Она про другое. В данном случае проверка выхода за пределы массива. И это не означает что там другой массив (там неизвестно что), это просто выход за пределы, не более того. SashaMercuryМне кажется, что вы говорите следующее. Пусть x имеет тим size_t, тогда для следующего участка кода Код: plaintext 1. 2. 3. 4. строчки 1 и 2 будут корректны если x будет в диапазоне от 1 до 5, а если x>1000 то строчки 1 и 2 некорректны и мы можем наблюдать undefined behaviour. В данном случае (если x любое число) для 100% уверенности можно проверять обе границы, т.е. temp за пределами массива buf[10] проверяется так Код: plaintext 1. адрес buf гарантированно больше 0, т.к. по адресу 0 (он же NULL) нет реальной памяти, сделано специально чтобы инициализировать указатели "в никуда" значением NULL, для виндовса это адреса 0 - 65535 (для линукса 0-16777215 если не путаю), т.е. в твоем примере можно получить неопределенность при x>65535 (это минимум, реально еще больше). т.е. при x < 65535 можно упростить проверку до if(temp < buf) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 13:32 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
maytonSashaMercury Код: plaintext 1. 2. Я-бы так никогда не делал. это родилось для обобщения правомерности применения конструкции Код: plaintext 1. читай сначала :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 13:40 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Dima Tmaytonпропущено... Я-бы так никогда не делал. это родилось для обобщения правомерности применения конструкции Код: plaintext 1. читай сначала :) Это неважно. Про связь массивов и указателей все знают. Значит делать можно сравнения в диапазоне аллоцированной памяти элементов массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 14:47 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
mayton, я рад что вы меня поняли. У нас есть участок кода: Код: plaintext 1. 2. 3. Дмитрий, я вас правильно понимаю, вы говорите, buf можно сравнить с a1, но если сравнивать с a2, мы имеем undefined behaviour ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:26 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
maytonЭто неважно. Про связь массивов и указателей все знают. Значит делать можно сравнения в диапазоне аллоцированной памяти элементов массива. см. выше, речь о такой конструкции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. после break следующая } закрывает область видимости cur, т.е. обращение к *cur невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:28 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercuryОсталось избавить от аллоцирования Надо понимать, где остановиться оптимизируя код. Данная оптимизация не даст никакого прироста скорости, потому что на 100 млрд итераций несколько аллокаций никак не повлияют, а код наверняка будет хуже читаться. Догадался ) Последний код в моем последнем сообщении с кодом. Вы можете проверить его на скорость пожалуйста ? код Код: plaintext 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. PS По вашему алгоритму у меня остались вопросы, но я ещё подумаю. Кстати, а как вам идея "выключать" программу через определенное время, или когда файл будет определенного размера ? Мы исключили бы постоянную проверку, и проверяли бы размер файла, каждые 5 минут например(это сгодится при размере пароля более 10 символов, например) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:33 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
речь идёт о такой конструкции . SashaMercuryDima T Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. такая операция законна ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:36 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
Вообщем ладно, не хватало чтобы мы ещё тут поругались. Я подумаю, над вашими идеями, возможно я их просто не понимаю . Ваша идея хорошая, и мне понятна, я её использовал в конечной версии программы. Спасибо C: и спасибо за код, мне было интересно его читать(я даже пил компот, и разбирал его) :) PS Код Анатолия ещё не разобрал, как писал раньше, потому отпишу позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:42 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SSВаша идея хорошая идея, как понять, что дальше не нужно двигать стрелку, она очевидно лучше и быстрее(в общем случае) постоянного сравнения через strcmp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:44 |
|
||
|
Тяпничный pwdgen
|
|||
|---|---|---|---|
|
#18+
SashaMercurymayton, я рад что вы меня поняли. У нас есть участок кода: Код: plaintext 1. 2. 3. Дмитрий, я вас правильно понимаю, вы говорите, buf можно сравнить с a1, но если сравнивать с a2, мы имеем undefined behaviour ? Неправильно. Это проверка на выход за пределы массива. Полная проверка выглядит так Код: plaintext 1. но если заранее известно что шаги короткие, то можно упростить сравнение до Код: plaintext 1. При большом смещении упрощать нельзя, т.к. указатель это не что иное как адрес с типом беззнаковое целое, т.е. твое вычитание вызывает переполнение, равносильно такому Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 15:44 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38807824&tid=2019107]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 187ms |

| 0 / 0 |
