21.09.2014, 17:33 | |
Ответы с готовыми решениями:
73
Вывести самые распространенные женские и мужские имена Вывести самые распространенные мужские и женские имена Ошибки после компиляции на Visual Express 2012.Ошибки в теме Распространенные ошибки |
24.09.2014, 12:43 | 21 | ||||||||||
Неверный аргумент тригонометрических функций.
Очень часто бывают ошибки вроде таких:
3
|
24.09.2014, 12:43 | 22 | ||||||||||
Неверный вызов конструктора базового класса из конструктора производного.
Встречаются подобные варианты:
6
|
24.09.2014, 12:43 | 23 | |||||
Сравнение знаковой переменной с беззнаковой.
x приводится к беззнаковому, отчего возрастает до UINT_MAX - 4 (UINT_MAX равно (unsigned int)-1 ).Решение - не сравнивать такие типы, заранее приводить к одному.
0
|
Модератор
13702 / 10905 / 6472
Регистрация: 18.12.2011
Сообщений: 29,112
|
||||||
24.09.2014, 12:58 [ТС] | 24 | |||||
Вызов виртуальной функции из конструктора
1
|
Модератор
|
||||||||||||||||||||||||||
24.09.2014, 16:59 | 25 | |||||||||||||||||||||||||
Забытое выделение тела цикла for, while и операторов if else
В циклах часто используют запись тела цикла без фигурных скобок, при условии, что в качестве тела цикла используется один оператор:
Аналогичная ошибка присутствует и в таком примере (Evg):
Скобки устраняют эту ошибку:
1
|
24.09.2014, 20:31 | 26 | ||||||||||||||||||||
Определение размера массива, переданного в качестве аргумента функции.
( (предложил ISergey):
(автор Ilot https://www.cyberforum.ru/post6650671.html):
0
|
Неэпический
|
||||||
26.09.2014, 22:19 | 27 | |||||
Неверный порядок при инициализации
В данном случае, сначала будет инициализирована переменная x, а только потом переменная y.
9
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||||||||||||||||
29.09.2014, 21:27 | 28 | |||||||||||||||
Работа с локальной копией объекта, вместо работы с самим объектом
(который еще не инициализирован). При выделении памяти, ее адрес помещается в эту копию, т.е. значение переменной Ptr не изменится. В результате, после возврата из функции, адрес потеряется и, соответственно, потеряется выделенная память. __________________________________ Варианты решения проблемы: 1. Передавать в функцию адрес указателя
10
|
Модератор
13702 / 10905 / 6472
Регистрация: 18.12.2011
Сообщений: 29,112
|
||||||
04.10.2014, 13:25 [ТС] | 29 | |||||
Нарушение правила ТРЕХ.
Правило трёх (также известное как «Закон Большой Тройки» или «Большая Тройка») — правило, гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода: 1. Деструктор 2. Конструктор копирования 3. Оператор присваивания Эти три метода являются особыми членами-функциями. Они автоматически создаются компилятором в случае отсутствия их явного объявления. Если один из них должен быть определен программистом, то это означает, что версия, сгенерированная компилятором, не удовлетворит потребности класса и для двух других. Пример:
Не забывайте и о том, что и конструктор по умолчанию тоже в этом случае не создается. Правда, при необходимости его вызова компилятор выдаст предупреждающее сообщение: error C2512: A: нет подходящего конструктора по умолчанию
9
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||||||||||||||||
04.10.2014, 14:16 | 30 | |||||||||||||||
Интерпретация одиночного char символа как символьной строки
Начинающие программисты иногда воспринимают отдельный тестовый символ как строку из одного значения. char c; - отдельный символ, занимающий 1 байт в памяти. char str[256] - строка символов длиной не более 255, которая всегда должна заканчиваться признаком окончания строки - числом ноль. Из-за этого различия вполне реально столкнутся с проблемой преобразования при работе со строками. Простейший пример
т.к. написавший подразумевает символ строки как строку в 1 символ., но в этом-то и ошибка. ______________________ Для подобного преобразования строки нужно выполнить явное присвоение нужного символа и добавление терминального нуля:
Вариант решения - создать массив в 2 символа. Принудительно забить сам символ и признак окончания в этот массив, после чего использовать этот массив вместо изначального символа.
0
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||||||
06.10.2014, 16:38 | 31 | ||||||||||
Отсутствие виртуального деструктора в базовом классе.
Класс по умолчанию генерирует деструктор, но при этом он не является виртуальным. Отличие виртуального деструктора в том, что он предполагает освобождение ресурсов не только базового класса, но и всех производных. Ниже пример, явно демонстрирующий проблему:
Для исправления ошибки в примере выше достаточно сделать деструктор класса A виртуальным, строку 7 поменять на
1. При наличии хотя бы одного виртуального метода объявлять виртуальным и деструктор. 2. Также его надо явно объявлять виртуальным, если класс предполагается в будущем сделать базовым. Майерс советует делать виртуальным деструктор всегда, кроме тех случаев, когда есть веские причины этого не делать. В некоторых компиляторах (mingw) существует флаг -Weffc++, который выдаёт предупреждение по данной ошибке. P.S. в "правиле трёх" надо бы также описать данный случай как исключение из правил т.к. при необходимости явного объявления виртуального деструктора это вовсе не значит, что нужно описывать конструктор копий или оператор присваивания. ЕМНИМ, в оригинале говорится, что если в классе идёт работа с памятью, то необходимо явно объявить три вещи...
4
|
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
|
||||||
31.10.2014, 23:02 | 32 | |||||
Порядок вычисления аргументов при вызове функции.
Недавно ловил ошибку в собственном коде.
Хотя, если бы там действительно был ноль на момент завершения работы, программа выдавала бы неверное значение nkeyshash(...) P.S. Кстати, результат не зависел от ключей оптимизации. Т.о. имейте ввиду, что нельзя рассчитывать на то, что вычисление значений аргументов в списке параметров функции выполняется слева-направо.
1
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
31.10.2014, 23:45 | 33 | |||||
Сегодня наткнулся на подобное (код понятное дело упрощён и добавлены действия, эмулирующие работу):
Добавлено через 52 секунды Это в продолжение к проблеме XZentus, просто код, на мой взгляд, более реален.
0
|
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
|
||||||
01.11.2014, 08:51 | 34 | |||||
Неуточняемое поведение.
Кликните здесь для просмотра всего текста
6.5.2.2 Function calls
Constraints 1 The expression that denotes the called function 92) shall have type pointer to function returning void or returning a complete object type other than an array type. 2 If the expression that denotes the called function has a type that includes a prototype, the number of arguments shall agree with the number of parameters. Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter. Semantics 3 A postfix expression followed by parentheses () containing a possibly empty, comma- separated list of expressions is a function call. The postfix expression denotes the called function. The list of expressions specifies the arguments to the function. 4 An argument may be an expression of any complete object type. In preparing for the call to a function, the arguments are evaluated, and each parameter is assigned the value of the corresponding argument. 93) 5 If the expression that denotes the called function has type pointer to function returning an object type, the function call expression has the same type as that object type, and has the value determined as specified in 6.8.6.4. Otherwise, the function call has type void. 6 If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. If the number of arguments does not equal the number of parameters, the behavior is undefined. If the function is defined with a type that includes a prototype, and either the prototype ends with an ellipsis (, ...) or the types of the arguments after promotion are not compatible with the types of the parameters, the behavior is undefined. If the function is defined with a type that does not include a prototype, and the types of the arguments after promotion are not compatible with those of the parameters after promotion, the behavior is undefined, except for the following cases: — one promoted type is a signed integer type, the other promoted type is the corresponding unsigned integer type, and the value is representable in both types; — both types are pointers to qualified or unqualified versions of a character type or void. 7 If the expression that denotes the called function has a type that does include a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type. The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments. 8 No other conversions are performed implicitly; in particular, the number and types of arguments are not compared with those of the parameters in a function definition that does not include a function prototype declarator. 9 If the function is defined with a type that is not compatible with the type (of the expression) pointed to by the expression that denotes the called function, the behavior is undefined. 10 There is a sequence point after the evaluations of the function designator and the actual arguments but before the actual call. Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function. 94) 11 Recursive function calls shall be permitted, both directly and indirectly through any chain of other functions. 12 EXAMPLE In the function call
the function pointed to by pf[f1()] is called.
0
|
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
01.11.2014, 10:37 | 35 |
Sequence points :-( Во времена C++14...
Тут уже не просто аргументы вычисляются "in any order", а вообще "Value computations and side effects associated with different argument expressions are unsequenced". C++14 1.9, абзац 10
15 Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. [ Note: In an expression that is evaluated more than once during the execution of a program, unsequenced and indeterminately sequenced evaluations of its subexpressions need not be performed consistently in different evaluations. —end note ] The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
[ Example: void f(int, int); void g(int i, int* v) { i = v[i++]; // the behavior is undefined i = 7, i++, i++; // i becomes 9 i = i++ + 1; // the behavior is undefined i = i + 1; // the value of i is incremented f(i = -1, i = -1); // the behavior is undefined } —end example ] When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function. [ Note: Value computations and side effects associated with different argument expressions are unsequenced. —end note ] Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function.9 Several contexts in C++ cause evaluation of a function call, even though no corresponding function call syntax appears in the translation unit. [ Example: Evaluation of a new expression invokes one or more allocation and constructor functions; see 5.3.4. For another example, invocation of a conversion function (12.3.2) can arise in contexts in which no function call syntax appears. —end example ] The sequencing constraints on the execution of the called function (as described above) are features of the function calls as evaluated, whatever the syntax of the expression that calls the function might be. 9) In other words, function executions do not interleave with each other.
0
|
Модератор
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,696
|
|||||||||||||||||||||
09.12.2014, 11:18 | 36 | ||||||||||||||||||||
Использование комментариев в #define
Комментарии в #define
Потому что предкомпилятор видя VAR подставляет все что за ней, и вот такое выражение:
Во втором случае:
2
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
09.12.2014, 11:33 | 37 |
Ну, а проверить хотя бы? Комменты в препроцессор не попадают, на то они и комменты.
http://ideone.com/cKjv9L Добавлено через 34 секунды Хотелось бы узнать: где?
1
|
Модератор
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,696
|
||||||
09.12.2014, 11:49 | 38 | |||||
разумеется пример утрированный, чтобы показать проблему
в таком примере отработает и то и другое Keil библитеки STM, макросы вложенные один в другой и все вместе в третий в четвертый решил прокомментировать (//) и поперли ошибки но вот тебе пример, тоже утрированный, никто в здравом уме такое писать не будет многострочный макрос
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
09.12.2014, 12:20 | 39 | |||||
Значит, такой пример не состоятельный. И нужен другой для подтверждения проблемы.
Максос по своей природе должен быть однострочным, для этого и добавляют "\" в конце каждой псевдостроки, когда он слишком длинный и хочется тем не менее избежать горизонтальной прокрутки. А учитывая то, что комментарий в виде двойных прямых слешей комментирует всё оставшееся до конца строки, то и располагать его надо в конце макроса, т.е. в твоем случае за пятеркой:
1
|
09.12.2014, 12:23 | 40 |
Что в каком порядке делается. Комментарии заменяются на пробелы до того, как выполняется запоминание макросов
Код
ISO/IEC 9899:1999 (E) 5.1.1.2 Translation phases ... 2. Each instance of a backslash character (\) immediately followed by a new-line character is deleted, splicing physical source lines to form logical source lines. Only the last backslash on any physical source line shall be eligible for being part of such a splice. A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character before any such splicing takes place. 3. The source file is decomposed into preprocessing tokens 6) and sequences of white-space characters (including comments). A source file shall not end in a partial preprocessing token or in a partial comment. Each comment is replaced by one space character. New-line characters are retained. Whether each nonempty sequence of white-space characters other than new-line is retained or replaced by one space character is implementation-defined. 4. Preprocessing directives are executed, macro invocations are expanded, and _Pragma unary operator expressions are executed. If a character sequence that matches the syntax of a universal character name is produced by token concatenation (6.10.3.3), the behavior is undefined. A #include preprocessing directive causes the named header or source file to be processed from phase 1 through phase 4, recursively. All preprocessing directives are then deleted.
4
|
09.12.2014, 12:23 | |
09.12.2014, 12:23 | |
Помогаю со студенческими работами здесь
40
безопасность и распространенные ошибки безопасность и распространенные ошибки Распространенные ошибки SEO и ASP.NET 2.0 Самые распространенные строки Самые распространённые фамилии Распространённые схемы мошейничества с вайбером Самые распространенные мужское и женское имена Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |