| 02.10.2014, 12:49 | |
|
Ответы с готовыми решениями:
72
безопасность и распространенные ошибки Распространенные ошибки SEO и ASP.NET 2.0 |
|
|
|
| 05.03.2015, 17:41 | |
|
HighPredator, пожалуй я соглашусь с тобой. Мы живём в мире процессоров, где адрес представляет собой целое число. Но в разные времена делались потуги создать защищённый процессор, в котором адрес представлял собой некоторую конструкцию, содержащую в себе базовый адрес блока, его размер, возможно, какую-то информацию о типе (с таким адресом аппаратура не даст, например, вылезти за границу массива). Так вот если в точке вызова printf/scanf подсунуть адрес, который имеет тип char(*)[], а потом пытаться трактовать его как char* (без каких-либо дополнительных операций приведения типа), то вполне возможно, что для такого процессора сие действо вызовет слом при исполнении. Так что тут и вправду получается UB, который для "нормальных" процессоров ничем плохим не грозит
1
|
|
|
|
|
| 24.03.2015, 15:57 | |
|
Проблемы под windows при работе с файлами, описанными в виде полных путей
Код типа: C FILE *fp; fp = fopen ("C:\a.txt", "w"); if (fp == NULL) { printf ("Error\n"); exit(1); } Проблема в том, что в символьных и строковых литералах (буква в одинарных кавычках или текст в двойных кавычках) языков Си и Си++ символ обратного слэша является управляющим символом, а потому компилятор работает с ним не как с самостоятельным символом, а как с началом последовательности символов. Наиболее частыми такими последовательностями являются "\n" (перевод строки) и "\t" (табуляция), с которыми начинающие, как правило, сталкиваются уже с первых дней. Конкретно в данном примере у символа обратного слэша точно такая же трактовка, а потому последовательность символов "\a" распозналась как один управляющий символ, в итоге это привело к тому, что путь до файла в коде программы оказался вовсе не таким, каким ожидал программист. Чтобы в символьном и строковом литерале записать символ обратного слэша, надо его продублировать, т.е. написать "\\". Таким образом наша программа должна выглядеть как C fp = fopen ("C:\\a.txt", "w");
0
|
|
|
|
||||||||||||||||||||||||||
| 26.03.2015, 16:16 | ||||||||||||||||||||||||||
|
Не по теме: я лично больше парился вот с этим: "Удвоение" последней строки файла Возьмём небольшую программу, построчно читающую текстовый файл:
string 1 string 2 "Удивительным образом" наша программа "удвоит" string 2, которая будет напечатана дважды. Проблема в том, что после чтения string 2 конец файла ещё не достигнут, а ввод-вывод через stdio буферизован... последний шаг цикла прочитает пустую строку, а в буфере всё ещё будет string 2, которая и выведется повторно вместо пустой строки. Проверьте сами - если удалить из файла данных пустую строку в конце - string 1 string 2 - никакого "удвоения" не будет. Встречается вот такое решение -
С программкой из этого примера связана ещё одна типовая проблема - прочитанные из файла строки при выводе почему-то содержат лишние пустые строки между строками данных. Файл данных: string 1 string 2 Вывод: string 1 string 2 Для продолжения нажмите любую клавишу . . . Всё объясняется просто - fgets читает строку файла вместе с символом перевода строки (точней, под Windows - с парой символов \r\n, интерпретируемых как один), а puts добавляет к выводимой строке ещё один перевод строки. Так что выводите другим методом или удаляйте из прочитанной fgets'ом строки последний символ:
0
|
||||||||||||||||||||||||||
|
|
|
| 08.12.2015, 16:45 | |
|
Использование адресной арифметики вместо va_arg при работе с функцией с переменным числом параметров
В интернете видел много разных "обучающих" статей о том, как извлекать аргументы в функции с переменным числом аргументов. Они сводятся примерно к следующему (пример взят из одной из статей): C++ #include <stdio.h> /* Вычисление среднего арифметического аргументов (количество) */ double f(int n, ...) /* количество элементов */ { int *p = &n; p++; /* установка 'целого' на double */ double *pp = (double *)p; /* преобразование типа указателя */ double sum = 0, count = n; for (;n--;pp++) /* правильное увеличение на 8 */ sum+=(*pp); return (sum/count); } int main(void) { double s = f (4, 1.0, 2.0, 3.0, 4.0); printf ("%e\n", s); } Что такое программные соглашения можно почитать тут Демонстрация того, к чему приводит неправильно написанный код есть тут Правильно написанный код для данного примера должен выглядеть примерно так: C #include <stdio.h> #include <stdarg.h> /* Вычисление среднего арифметического аргументов (количество) */ double f (int n, ...) { va_list va; double sum = 0, count = n; va_start (va, n); for (;n--;) sum += va_arg (va, double); va_end (va); return (sum/count); } int main(void) { double s = f (4, 1.0, 2.0, 3.0, 4.0); printf ("%e\n", s); }
1
|
|
|
0 / 0 / 0
Регистрация: 27.07.2016
Сообщений: 1
|
||||||
| 27.07.2016, 19:49 | ||||||
|
Ошибки в сравнении (использование = вместо ==, очень частотная вещь среди пересевших на си с паскалеподобных языков)
0
|
||||||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||
| 27.07.2016, 22:03 | ||
|
1
|
||
|
|
||
| 28.07.2016, 09:44 | ||
|
В любом случае этот пункт уже есть - "Ошибки в логических выражениях". Правда ссылка ведёт на параллельную тему в разделе C++
0
|
||
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
| 28.07.2016, 12:50 | |
|
0
|
|
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|||||||
| 28.07.2016, 13:08 | |||||||
0
|
|||||||
|
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 43
|
|||||||
| 02.08.2016, 17:30 | |||||||
0
|
|||||||
|
|
|
| 02.08.2016, 20:30 | |
|
А какой у тебя компилятор? Наверняка не все компиляторы этого придерживаются
Добавлено через 31 минуту На крайний случай всегда можно написать явное сравнение (лично на мой взгляд такой код почти всегда более читаемый). Т.е. вместо C if ((x = y)) C if ((x = y) != 0)
1
|
|
|
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 43
|
|
| 03.08.2016, 03:27 | |
|
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||||||
| 25.01.2017, 18:09 | |||||||||||
|
Попытка компилировать программу, написанную на С, с помощью компилятора С++
Пожалуй, одна из самых частых ошибок. Чаще всего, напарываются на попытку привести тип void *, возвращаемый функцией malloc/calloc, к типу, на который указывает указатель, принимающий результат.
А в С++ введён запрет на неявное приведение из void *, то есть для С++ надо явно кастануть результат к (int *). По историческим причинам (до первого стандарта ANSI/ISO malloc возвращал char * и была ошибка приведения, но потом придумали void *), в некоторой литературе приводятся примеры с явным приведением типа указателя, но вызваны они бездумным копированием старого кода. Решение: Для Windows необходимо переименовать расширение файла на .c Для Linux использовать компилятор gcc вместо g++. Для clang указывать во флаге компиляции правильный стандарт языка (например -std=c99 вместо -std=c++98).
2
|
|||||||||||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||
| 26.01.2017, 19:38 | ||||
|
Квалификатор const в С и С++ работает по разному. В последнем, он при возможности создаёт константу времени компиляции. Но в С этого не происходит. Чем это грозит? Когда используется запись вида const int N = 30; в С++ создаётся константа времени компиляции, в С лишь переменная с запретом на изменение значения (read-only). И дальнейшее объявление видаint arr[N]; для С внезапно даст VLA (variable-length array) массив. Но это лишь при условии, что стандарт поддерживает данную опцию (C89 не поддерживает, С99 поддерживает, С11 optional). Также, VLA есть в gnu расширении. Плохо это по двум причинам:1. Для VLA массивов память выделяется через alloca, то есть из стека системы, а это лучше не делать, учитывая, что размер массива может быть и достаточно большим, а проверить выделилась ли память с помощью alloca нельзя (в отличие от malloc). Примечание: реализация VLA может отличаться, стандарт не накладывает ограничений на этот счёт. Однако, GCC использует именно описанный способ. 2. Сам того не подозревая, автор вносит зависимость на стандарт/расширение. А учитывая, что VS до сих пор не научилась работать с VLA, при переносе кода и честной компиляции сишным компилятором, могут вывалиться ошибки. Решение: Прежде всего, стоит использовать сишный компилятор для языка С, а плюсовый для С++. О том, как это сделать: В данном случае, стоило бы написать #define N 30
0
|
||||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,300
|
||
| 26.01.2017, 21:34 | ||
|
Для MSVC это: расширение имени файла или явное указание языка при помощи параметров компилятора /TC для C и /TP для C++.Для GCC и Clang это: расширение имени файла или явное указание языка при помощи параметров компилятора -x c для C и -x c++ для C++. При этом расширение файла для умолчательного определения языка используют только gcc и clang, а g++ и clang++ по умолчанию рассматривают все файлы как С++, независимо от расширения.
1
|
||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,300
|
|||||||||||
| 16.02.2017, 05:10 | |||||||||||
|
Частые множественные вызовы
srand(time(NULL))Если код программы содержит множественные попытки "перезапустить" генератор псевдослучайных чисел, используя в качестве seed-значения текущее значение времени, полученное через вызов time(NULL)
srand будут следовать друг за другом очень быстро. Так быстро, что time(NULL) будет возвращать одно и то же значение времени. Это приведет к тому, что генератор псевдослучайных чисел будет постоянно перезапускаться с указанием одного и того же seed-значения. В результате последующие вызовы rand() будут порождать одну и ту же псевдослучайную последовательность. Например, вот такой код, будучи запущенным на выполнение, вероятнее всего выведет одну и ту же псевдослучайную последовательность два раза
srand значение времени time(NULL) успевает измениться, что создает иллюзию того, что все работает "как задумано". Но стоит запустить программу в свободное выполнение, как проблема проявляется во всей красе.Если вам нужен вызов srand(time(NULL)); в вашей программе, то в большинстве случаев его достаточно сделать всего один-единственный раз на старте программы.
4
|
|||||||||||
|
1 / 1 / 0
Регистрация: 04.01.2018
Сообщений: 13
|
|||||||||||
| 03.03.2018, 00:02 | |||||||||||
|
Если нужно "перезапустить" генератор псевдослучайных чисел, используйте в качестве seed значения со второго раза значения функции rand(). Воображение - наше всё.
0
|
|||||||||||
|
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,331
|
|
| 20.05.2018, 12:56 | |
|
0
|
|
| 20.05.2018, 12:56 | |
|
Помогаю со студенческими работами здесь
60
Самые распространенные строки Самые распространённые фамилии Вывести самые распространенные женские и мужские имена
Вирус блокирует выход на сайт вк и другие распространенные сайты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|