Почему при компиляции выдает ошибку

From Wikipedia, the free encyclopedia

Compilation error refers to a state when a compiler fails to compile a piece of computer program source code, either due to errors in the code, or, more unusually, due to errors in the compiler itself. A compilation error message often helps programmers debugging the source code. Although the definitions of compilation and interpretation can be vague, generally compilation errors only refer to static compilation and not dynamic compilation. However, dynamic compilation can still technically have compilation errors,[citation needed] although many programmers and sources may identify them as run-time errors. Most just-in-time compilers, such as the Javascript V8 engine, ambiguously refer to compilation errors as syntax errors since they check for them at run time.[1][2]

Examples[edit]

Common C++ compilation errors[edit]

  • Undeclared identifier, e.g.:

doy.cpp: In function `int main()':
doy.cpp:25: `DayOfYear' undeclared (first use this function)
[3]

This means that the variable «DayOfYear» is trying to be used before being declared.

  • Common function undeclared, e.g.:

xyz.cpp: In function `int main()': xyz.cpp:6: `cout' undeclared (first use this function)[3]

This means that the programmer most likely forgot to include iostream.

  • Parse error, e.g.:

somefile.cpp:24: parse error before `something'[4]

This could mean that a semi-colon is missing at the end of the previous statement.

Internal Compiler Errors[edit]

An internal compiler error (commonly abbreviated as ICE) is an error that occurs not due to erroneous source code, but rather due to a bug in the compiler itself. They can sometimes be worked around by making small, insignificant changes to the source code around the line indicated by the error (if such a line is indicated at all),[5][better source needed] but sometimes larger changes must be made, such as refactoring the code, to avoid certain constructs. Using a different compiler or different version of the compiler may solve the issue and be an acceptable solution in some cases. When an internal compiler error is reached many compilers do not output a standard error, but instead output a shortened version, with additional files attached, which are only provided for internal compiler errors. This is in order to insure that the program doesn’t crash when logging the error, which would make solving the error nigh impossible. The additional files attached for internal compiler errors usually have special formats that they save as, such as .dump for Java. These formats are generally more difficult to analyze than regular files, but can still have very helpful information for solving the bug causing the crash.[6]

Example of an internal compiler error:

somefile.c:1001: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugs.gentoo.org/> for instructions.

References[edit]

  1. ^ «Errors | Node.js v7.9.0 Documentation». nodejs.org. Retrieved 2017-04-14.
  2. ^ «SyntaxError». Mozilla Developer Network. Retrieved 2017-04-14.
  3. ^ a b «Common C++ Compiler and Linker Errors». Archived from the original on 2008-02-16. Retrieved 2008-02-12.
  4. ^ «Compiler, Linker and Run-Time Errors».
  5. ^ Cunningham, Ward (2010-03-18). «Compiler Bug». WikiWikiWeb. Retrieved 2017-04-14.
  6. ^ జగదేశ్. «Analyzing a JVM Crash». Retrieved 2017-04-15.

Это ваша первая программа на C (или C++) — она не такая уж большая, и вы собираетесь скомпилировать ее. Вы нажимаете на compile (или вводите команду компиляции) и ждете. Ваш компилятор выдает пятьдесят строк текста. Вы выбираете слова warning и error. Задумываетесь, значит ли это, что все в порядке. Вы ищите полученный исполняемый файл. Ничего. Черт возьми, думаете вы, я должен выяснить, что все это значит …

Типы ошибок компиляции

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

  • предупреждения компилятора;
  • ошибки компилятора;
  • ошибки компоновщика.

Хоть вы и не хотите игнорировать их, предупреждения компилятора не являются чем-то достаточно серьезным, чтобы не скомпилировать вашу программу. Прочитайте следующую статью, которая расскажет вам, почему стоит дружить с компилятором и его предупреждениями. Как правило, предупреждения компилятора — это признак того, что что-то может пойти не так во время выполнения. Как компилятор узнает об этом? Вы, должно быть делали типичные ошибки, о которых компилятор знает. Типичный пример — использование оператора присваивания = вместо оператора равенства == внутри выражения. Ваш компилятор также может предупредить вас об использовании переменных, которые не были инициализированы и других подобных ошибках. Как правило, вы можете установить уровень предупреждений вашего компилятора — я устанавливаю его на самый высокий уровень, так что предупреждения компилятора не превращаются в ошибки в выполняемой программе (“ошибки выполнения”).

Тем не менее, предупреждения компилятора не должны останавливать работу вашей программы (если только вы не укажете компилятору рассматривать предупреждения как ошибки), так что они, вероятно, не так серьезны как ошибки.

Ошибки — это условия, которые препятствуют завершению компиляции ваших файлов.

Ошибки компилятора ограничены отдельными файлами исходного кода и являются результатом “синтаксических ошибок”. На самом деле, это означает, что вы сделали что-то, что компилятор не может понять. Например, выражение for(;) синтаксически не правильно, потому что цикл всегда должен иметь три части. Хотя компилятор ожидал точку с запятой, он мог также ожидать условное выражение, поэтому сообщение об ошибке, которое вы получите может быть что-то вроде:

line 13, unexpected parenthesis ‘)’

Заметьте, что ошибки компилятора всегда будут включать номер строки, в которой была обнаружена ошибка.

Даже если вы прошли процесс компиляции успешно, вы можете столкнуться с ошибками компоновщика. Ошибки компоновщика, в отличие от ошибок компилятора, не имеют ничего общего с неправильным синтаксисом. Вместо этого, ошибки компоновщика — это, как правило, проблемы с поиском определения функций, структур, классов или глобальных переменных, которые были объявлены, но не определены, в файле исходного кода. Как правило, эти ошибки будут иметь вид:

could not find definition for X

Как правило, процесс компиляции начинается с серии ошибок компиляции и предупреждений и, исправив их, вы столкнетесь с ошибками компоновщика. В свою очередь, я бы сначала исправлял ошибки компиляции, а затем ошибки компоновщика.

Ошибки компилятора — с чего начать?

Если вы столкнулись с перечнем пятидесяти или шестидесяти ошибок и предупреждений, то будет сложно определить с чего начать. Самое лучшее место, тем не менее, в начале списка. В самом деле, вы почти никогда не начинаете исправлять ошибки от конца файла до его начала по одной простой причине: вы не знаете ошибки ли они на самом деле!

Одна ошибка в верхней части вашей программы может вызвать целый ряд других ошибок компилятора, потому что эти строки могут рассчитывать на что-то в начале программы, что компилятор не смог понять. Например, если вы объявляете переменную с неправильным синтаксисом, компилятор сообщит о синтаксических ошибках, и что он не может найти объявление для переменной. Точка с запятой, поставленные не в том месте, могут привести к огромному количеству ошибок. Это происходит, потому что синтаксис C и C++ синтаксис позволяет объявить тип сразу же после его определения:

struct 
{
   int x;
   int y;
} myStruct;

код создаст переменную, MyStruct, с местом для хранения структуры, содержащей два целых числа. К сожалению, это означает, что если вы опустите точку с запятой, компилятор будет интерпретировать это так, как будто следующая вещь в программе будет структурой (или возвращает структуру).

Что-то вроде этого:

struct MyStructType
{
   int x;
   int y;
}

int foo()
{}

может привести к огромному количеству ошибок, возможно, включая сообщения:

extraneous ‘int’ ignored

Все это из-за одного символа! Лучше всего начать с самого верха.

 Анализ сообщения об ошибке

Большинство сообщений от компилятора будет состоять как минимум из четырех вещей:

  1. тип сообщения — предупреждение или ошибка;
  2. исходный файл, в котором появилась ошибка;
  3. строка ошибки;
  4. краткое описание того, что работает неправильно.

Вывод g++ для указанной выше программы может выглядеть следующим образом (ваши результаты могут отличаться, если вы используете другой компилятор):

foo.cc:7: error: semicolon missing after struct declaration

foo.cc это имя файла. 7 — номер строки, и ясно, что это ошибка. Короткое сообщение здесь весьма полезно, поскольку оно показывает именно то, что не правильно. Заметим, однако, что сообщение имеет смысл только в контексте программы. Оно не сообщает, в какой структуре не хватает запятой.

Более непонятным является другое сообщение об ошибке из той же попытки компиляции:

extraneous ‘int’ ignored

Программист должен выяснить, почему это произошло. Обратите внимание еще раз, что эта ошибка была вызвана проблемой в начале программы, не в строке 8, а раньше, когда в структуре не хватает точки с запятой. К счастью, понятно, что определение функции для foo было в порядке, это говорит нам о том, что ошибка должна быть где-то в другом месте программы. На самом деле, она должна быть в программе раньше — вы не будете получать сообщение об ошибке, которое указывает на синтаксическую ошибку до строки, на которой ошибка на самом деле произошла.

Это руководящий принцип вычисления ошибок компилятора: если сомневаетесь, посмотрите в программе раньше. Так как синтаксические ошибки могут позже иметь серьезные последствия, вполне возможно, что компилятор указывал номер строки, в которой на самом деле не было синтаксической ошибки!

Будет гораздо хуже, если компилятор не будет сообщать вам, что произошло ранее в программе. Даже первая ошибка компилятора, которую вы получите, может быть связана с несколькими строками  до указанного предупреждения.

Обработка непонятных или странных сообщений

Есть несколько особенно сложных типов ошибок компилятора. Первый — это необъявленная переменная, которую, как вам кажется, вы объявили. Часто, вы можете указать, где именно переменная была объявлена! Проблема в том, что часто переменная просто написана с ошибкой. К сожалению, это довольно трудно увидеть, так как обычно мы читаем то, что ожидаем, а не то, что есть на самом деле. Кроме того, есть и другие причины, почему это может быть проблемой — например, проблемы с видимостью!

Чтобы разобраться в возможных проблемах, я делаю так: в строке, где находится якобы необъявленная переменная, надо выполнить поиск текстовым редактором слова под курсором (в качестве альтернативы можно скопировать имя переменной и выполнить поиск), и если я записал его неправильно, оно не найдется. Также не надо вводить имя переменной вручную, так как вы случайно можете ввести его правильно.

Второе непонятное сообщение:

unexpected end of file

Что происходит? Почему конец файла будет «неожиданным» ? Ну, здесь главное думать как компилятор; если конец файла является неожиданным, то он,  должно быть, чего-то ждет. Что бы это могло быть? Ответ, как правило, «завершение». Например, закрывающие фигурные скобки или закрывающие кавычки. Хороший текстовый редактор, который выполняет подсветку синтаксиса и автоматический отступ, должен помочь исправить некоторые из этих ошибок, что позволяет легче обнаружить проблемы при написании кода.

В конечном счете, если сообщение непонятное, то подходите к проблеме, думая, как компилятор пытается интерпретировать файл. Это может быть трудно, когда вы только начинаете, но если вы обращаете внимание на сообщения и попробуете понять, что они могли бы означать, вы быстро привыкнете к общим закономерностям.

Наконец, если ничего не работает, вы всегда можете просто переписать несколько строк кода, чтобы убрать любые скрытые синтаксические ошибки, которые вы могли не увидеть. Это может быть опасно, так как вы можете переписать не ту секцию, но это может помочь.

Ошибки компоновщика

После того как вы окончательно исправили все ошибки синтаксиса, вздремнули, перекусили пару раз и морально подготовили себя к правильной компиляции программы, вы все равно можете столкнуться с ошибками компоновщика. Их часто довольно сложно исправить, потому что они не обязательно являются результатом того, что написано в вашей программе. Я вкратце опишу типичные видов ошибок компоновщика, которые можно ожидать, и некоторые пути их решения.

У вас могут возникнуть проблемы с тем, как вы настроили свой компилятор. Например, даже если включить нужные заголовочные файлы для всех ваших функций, вы все равно должны предоставить вашему компоновщику правильный путь в библиотеку, которая имеет фактическую реализацию. В противном случае, вы получите сообщение об ошибке:

undefined function

Обратите внимание на поддержку этих функций компилятором (это может произойти, если вы включите собственное объявление функции, чтобы обойти ошибку во время компиляции). Если ваш компилятор поддерживает эту функцию, то для решения проблемы обычно требуются конкретные настройки компилятора. Вам следует сообщить компилятору, где искать библиотеки и убедиться, что библиотеки были установлены правильно.

Ошибки компоновщика могут произойти в функциях, которые вы объявили и определили, если вы не включили все необходимые объектные файлы в процесс связывания. Например, если вы пишете определение класса в myClass.cpp, а ваша основная функция в myMain.cpp, компилятор создаст два объектных файла, myClass.o и myMain.o, а компоновщику будут нужны оба из них для завершения создания новой программы. Если оставить myClass.o, то у него не будет определения класса, даже если вы правильно включите myClass.h!

Иногда появляются незначительные ошибки, когда компоновщик сообщает о более чем одном определении для класса, функции или переменной. Эта проблема может появиться по нескольким причинам: во-первых, у объекта может быть два определения — например, две глобальные переменные объявлены как внешние переменные, чтобы быть доступными за пределами файла исходного кода. Это относится как к функциям, так и к переменным, и это, на самом деле, нередко случается. С другой стороны, иногда это проблема с директивами компоновщика; несколько раз я видел, как люди включают несколько копий одного и того же объектного файла в процесс связывания. И бинго, у вас есть несколько определений. Типичным проявлением этой проблемы является то, что у целого ряда функций есть несколько определений.

Последний странный тип ошибки компоновщика — сообщение

undefined reference to main

Данная ошибка компоновщика отличается от других тем, что она может не иметь ничего общего с объектом, включая файлы или правильные пути к вашей библиотеке. Напротив, это означает, что компоновщик пытался создать исполняемый файл и не смог понять, где расположена функция main(). Это может случиться, если вы забыли включить основную функцию, или, если вы попытаетесь скомпилировать код, который никогда не был отдельным исполняемым файлом (например, если вы попытались скомпилировать библиотеку).

Добавлено 27 марта 2021 в 12:55

В этом разделе мы рассмотрим некоторые из распространенных проблем, с которыми, похоже, начинающие программисты сталкиваются с довольно высокой вероятностью. Это не исчерпывающий список проблем компиляции или запуска программ, а скорее прагматичный список решений самых основных проблем. Если у вас есть предложения по другим вопросам, которые могут быть добавлены в этот список, опубликуйте их в разделе комментариев ниже.

Общие проблемы во время выполнения

Вопрос: При выполнении программы окно консоли мигает, а затем сразу закрывается.


Сначала добавьте или убедитесь, что следующие строки находятся в верхней части вашей программы (пользователи Visual Studio должны убедиться, что эти строки появляются после #include "pch.h" или #include "stdafx.h", если таковые существуют):

#include <iostream>
#include <limits>

Во-вторых, добавьте следующий код в конец функции main() (прямо перед оператором return):

// сбрасываем все флаги ошибок
std::cin.clear();
// игнорируем любые символы во входном буфере, пока не найдем новую строку
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
// получаем от пользователя еще один символ
std::cin.get();

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

Другие решения, такие как обычно предлагаемое system("pause"), могут работать только в определенных операционных системах, и их следует избегать.

Более старые версии Visual Studio могут не приостанавливаться, когда программа запускается в режиме Начать с отладкой (Start With Debugging) (F5). Попробуйте запустить в режиме Начать без отладки (Start Without Debugging) (Ctrl + F5).

Вопрос: Я запустил свою программу, получил окно, но ничего не выводится.


Выполнение может блокировать ваш антивирус. Попробуйте временно отключить его и посмотрите, не в этом ли проблема.

Вопрос: Моя программа компилируется, но работает некорректно. Что не так?


Отладьте ее! Советы по диагностике и отладке программ приведены далее в главе 3.

Общие проблемы времени компиляции

Вопрос: Когда я компилирую свою программу, я получаю ошибку о неразрешенном внешнем символе _main или _WinMain@16


Это означает, что ваш компилятор не может найти вашу функцию main(). А все программы должны включать в себя эту функцию.

Есть несколько вещей, которые нужно проверить:

  1. Содержит ли ваш код функцию с именем main?
  2. Правильно ли написано имя main?
  3. Когда вы компилируете свою программу, видите ли вы, что файл, содержащий функцию main(), компилируется? Если нет, либо переместите функцию main() в другой файл, либо добавьте этот файл в свой проект (для получения дополнительной информации о том, как это сделать, смотрите урок «2.7 – Программы с несколькими файлами кода»).
  4. Вы точно создали консольный проект? Попробуйте создать новый консольный проект.

Вопрос: Я пытаюсь использовать функциональность C++11/14/17/XX, но она не работает.


Если у вас старый компилятор, он может не поддерживать эти более свежие дополнения к языку. В этом случае обновите свой компилятор.

В случае с современными IDE/компиляторами ваш компилятор может по умолчанию использовать более старый стандарт языка. Мы рассмотрим, как изменить стандарт языка в уроке «0.12 – Настройка компилятора: выбор стандарта языка».

Вопрос: При попытке использовать cin, cout или endl компилятор говорит, что cin, cout или endl являются «необъявленными идентификаторами».


Во-первых, убедитесь, что вы включили следующую строку в верхней части файла:

#include <iostream>

Во-вторых, убедитесь, что каждое использование cin, cout и endl имеет префикс «std::«. Например:

std::cout << "Hello world!" << std::endl;

Если это не решит вашу проблему, возможно, ваш компилятор устарел или установка повреждена. Попробуйте переустановить и/или обновить компилятор до последней версии.

Вопрос: При попытке использовать endl для завершения напечатанной строки компилятор говорит, что end1 является «необъявленным идентификатором».


Убедитесь, что вы не перепутали букву l (нижний регистр L) в endl с цифрой 1. endl – это все буквы. Убедитесь, что ваш редактор использует шрифт, который проясняет разницу между строчной буквой L, заглавной i и цифрой 1. Кроме того, во многих шрифтах, не предназначенных для программирования, можно легко перепутать заглавную букву o и цифру ноль.

Проблемы с Visual Studio

Вопрос: При компиляции с помощью Microsoft Visual C++ вы получаете фатальную ошибку C1010 с сообщением типа «c:vcprojectstest.cpp(263) :fatal error C1010: unexpected end of file while looking for precompiled header directive» (неожиданный конец файла при поиске директивы предварительно скомпилированного заголовка).


Эта ошибка возникает, когда компилятор Microsoft Visual C++ настроен на использование предварительно скомпилированных заголовков, но один (или несколько) ваших файлов кода C++ не включает #include "stdafx.h" или #include "pch.h" в качестве первой строки кода файла.

Предлагаемое нами решение – отключить предварительно скомпилированные заголовки, как это сделано в уроке «0.7 – Компиляция вашей первой программы».

Если вы хотите, чтобы предварительно скомпилированные заголовки были включены, чтобы решить эту проблему, просто найдите файл(ы), вызывающий ошибку (в приведенной выше ошибке виновником является test.cpp), и добавьте следующую строку в самом верху файла):

#include "pch.h"

В более старых версиях Visual Studio используется stdafx.h вместо pch.h, поэтому, если pch.h не решает проблему, попробуйте stdafx.h.

Обратите внимание, что для программ с несколькими файлами каждый файл кода C++ должен начинаться с этой строки.

Кроме того, вы можете отключить предварительно скомпилированные заголовки.

Вопрос: Visual Studio выдает следующую ошибку: «1MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function «int __cdecl invoke_main(void)» (?invoke_main@@YAHXZ)» (неразрешенный внешний символ _WinMain@16).


Скорее всего, вы создали не консольное приложение, а графическое приложение Windows. Создайте заново свой проект и убедитесь, что вы создали его как консольный проект Windows (или Win32).

Вопрос: Когда я компилирую свою программу, я получаю предупреждение «Cannot find or open the PDB file» (не могу найти или открыть файл PDB).


Это предупреждение, а не ошибка, поэтому оно не должно повлиять на вашу программу. Однако она раздражает. Чтобы исправить это, перейдите в меню Debug (Отладка) → Options and Settings (Параметры) → Symbols (Символы) и установите флажок Microsoft Symbol Server (Сервер символов Microsoft).

Прочее

Вопрос: У меня есть еще одна проблема, которую я не могу понять. Как я могу быстро получить ответ?


По мере обучения у вас, несомненно, будут возникать вопросы или неожиданные проблемы. Что делать дальше, зависит от вашей проблемы. Но в целом есть несколько вещей, которые вы можете попробовать.

Сначала спросите Google. Найдите хороший способ сформулировать свой вопрос и выполните поиск в Google. Если вы получили сообщение об ошибке, вставьте точное сообщение в Google, используя кавычки. Скорее всего, кто-то уже задавал тот же вопрос, и вы найдете ответ.

Если это не поможет, спросите на сайте вопросов и ответов. Существуют веб-сайты, предназначенные для вопросов и ответов о программировании, например, Stack Overflow. Попробуйте разместить там свой вопрос. Не забудьте подробно описать, в чем заключается ваша проблема, и включить всю необходимую информацию, например, какую ОС и какую IDE вы используете.

Теги

C++ / CppFAQLearnCppДля начинающихОбучениеПрограммирование

  • D.1.Сообщения об ошибках компилятора.
    • D.1.1. Сообщения о фатальных ошибках.
    • D.1.2. Сообщения об ошибках компилятора.
    • D.1.3. Предупреждающие сообщения.
    • D.1.4. Ограничения компилятора.
  • D.2.Сообщения об ошибках в командной строке.
    • D.2.1. Неисправимые ошибки командной строки.
    • D.2.2. Сообщения об ошибках командной строки.
    • D.2.3. Предупреждающие сообщения командной строки.
      • D.3. Сообщения об ошибках периода выполнения.
    • D.3.1. Исключительные ситуации операций с плавающей точкой.
    • D.3.1. Сообщения об ошибках периода выполнения.
    • D.3.3. Ограничения периода выполнения.
  • D.4. Сообщения об ошибках компановщика.
  • D.5.Сообщения об ошибках утилиты LIB.
  • D.6. Сообщения об ошибках утилиты MAKE.

В данном Приложении приводится список сообщений об ошибках, на которые вы можете натолкнуться в процессе разработки программ, и, кроме того, дает краткое описание действий, которые вам следует предпринять для исправления ошибок. Следующий список покащывает вам, где искать ошибочные сообщения различных компонентов компилятора Microsoft Quick-C:

Компонент                         Раздел

Компилятор Microsoft Quick-C      Раздел D.1, "Сообщения об ошибках
                                  компилятора.
Командная строка, используемая    Раздел D.2, "Сообщение об ошибках
для вызова компилятора Quick-C    командной строки".
Библиотеки исполняющей системы    Раздел D.3, "Сообщения об ошибках
Microsoft C и другие ситуации     периода выполнения".
периода выполнения.
Оверлейный компановщик Microsoft, Раздел D.4, "Сообщения об ошибках
утилита LINK.                     компановщика".
Диспетчер библиотек фирмы         Раздел D.5, "Сообщения об ошибках
Microsoft-утилита LIB             утилиты LIB".
Утилита поддержки разработки      Раздел D.6, "Сообщения об ошибках
программ MAKE                     утилиты MAKE".

Обратите внимание, что все ошибочные сообщения компилятора, командной строки, периода выполнения приведены в данном приложении в алфавитном порядке.

В Разделе D.1.4 вы найдете информацию об ограничениях компилятора, а в Разделе D.3.3-ограничения периода выполнения.

D.1.Сообщения об ошибках компилятора.

Сообщения об ошибках, Полученные при сбоях СИ-компилятора, делятся на три категории:

1.Сообщения о фатальных ошибках.

2.Сообщения об ошибках компиляции.

3.Предупреждающие сообщения.

Сообщения каждой категории даны ниже в пронумерованном порядке, с кратким объяснением каждой ошибки. Чтобы найти требуемое сообщение, сначала определите категорию сообщения, затем найдите соответствующий номер ошибки. Каждое сообщение, сгенерированное в среде Quick-C, появляется в окне ошибок; курсор устанавливается на строке, вызвавшей ошибку (подробности в Разделе 7.3.4). Каждое сообщение об ошибке, сгенерированное во время компиляции с помощью команды QCL, содержит имя файла и номер строки, вызвавшей ошибку.

Сообщения о фатальных ошибках.

Сообщение о фатальной ошибке обозначает некоторую проблему, которая запрещает компилятору дальнейшее выполнение. Данный тип сообщения имеет следующий формат:

имя файла(строка): fatal error C1xxx: текст сообщения После того, как компилятор высветит сообщение о фатальной ошибке, он завершит выполнения без создания объектного файла и какой-либо проверки на последующие ошибки.

Сообщения об ошибках компилятора.

Сообщения об ошибках компилятора индицируют реальные программные ошибки. Данные сообщения выводятся в следующем формате:

имя файла(строка):error C2xxx:текст сообщения

Компилятор в данном случае не создает объектный файл для исходного файла, в котором компилятор обнаружил ошибки. Если компилятор встречает такие ошибки, он делает попытку их исправить. Если это возможно, он продолжает обработку исходного файла и выдает ошибочные сообщения. Если ошибок слишком много или они слишком серьезны, компилятор прекращает работу.

Предупреждающие сообщения.

Предупреждающие сообщения носят только информативный характер; они не прерывают процесс компиляции или компановки. Данные сообщения появляются в следующем формате:

имя файла(строка): warning C4xxx: текст сообщения

Вы можете использовать опцию /W для управления уровнем сообщений, генерируемых компилятором. Данная опция описана в Разделе 9.3.1.

D.1.1. Сообщения о фатальных ошибках.

Следующие сообщения идентифицируют фатальные ошибки. Компилятор не может исправить фатальную ошибку; он прекращает работу после распечатки сообщения об ошибке.

Номер   Сообщение о фатальной ошибке
C1000 "Неизвестная фатальная ошибка, Свяжитесь с Техническим сервисом
фирмы Microsoft".
Компилятор обнаружил неизвестную ошибку. Пожалуйста, сообщите
фирме Microsoft Corporation условия возникновения данной ошиб-
ки посредством специальной формы "Product Assistan Request",
на обложке данного руководства.
C1001 "Внутренняя ошибка компилятора, свяжитесь с Техническим серви-
сом фирмы Microsoft".
Компилятор обнаружил внутреннее несоответствие. Пожалуйста, со-
общите условия возникновения данной ошибке с помощью бланка
"Product Assistance Request" на обложке данного руководства.
Пожалуйста, включите в ваше сообщение имя файла и номер стро-
ки, вызвавшей ошибку; обратите внимание, что "имя файла" отно-
носится к внутреннему файлу компилятора, а не к вашему исход-
ному файлу.
C1002 "Выход за пределы динамической области".
Компилятор вышел за пределы динамическогй области памяти. Дан-
ная ситуация обычно означает, что ваша программа имеет слишком
много символических имен и/или комплексных выражений. Чтобы из-
бавиться от данной проблемы, разделите файл на несколько мень-
ших исходных файлов, либо разбейте выражения на меньшие подвы-
ражения.
C1003 "Счетчик ошибок превысил n; компиляция остановлена".
Ошибок в программе слишком много, либо они слишком серьезны,
чтобы возможно было восстановление, компилятор должен прервать
выполнение.
C1004 "Неожиданный конец файла (EOF).
Данное сообщение появляется, если у вас не достаточно памяти на
стандартном дисковом устройстве, чтобы компилятор создал требу-
емые временные файлы. Требуемое пространство примерно в 2 раза
больше размера исходного файла. Данное сообщение может быть
также сгенерировано, если комментарий не имеет закрывающего
ограничителя (*/), либо если директиве #if не хватает закры-
вающей директивы #endif.
C1005 "Строка слишком велика для буфера".
Строка в промежуточном файле компилятора переполняет буфер.
C1006 "Ошибка записи в промежуточный файл компилятора".
Компилятор не может создать промежуточные файлы, используемые
в процессе компиляции. К данной ошибке обычно приводят следую-
щие ситуации:
1.Слишком мало файлов в строке
files = number
файла CONFIG.SYS (компилятор требует чтобы число number было
не меньше 15).
2.Не хватает памяти на устройстве, содержащем промежуточные
файлы компилятора.
C1007 "Нераспознанный флаг 'string' в 'option'"
string-в опции командной строки option не является корректной
опцией.
C1009 "Ограничения компилятора, возможно рекурсивно определенное мак-
роопределение".
Расширение макрокоманды превышает размеры доступной памяти.
Проверьте, не было ли рекурсивно-определенных макрокоманд, либо
не слишком велик расширяемый текст.
C1010 "Ограничения компилятора: макро-расширение слишком большое".
Расширение макрокоманды превышает доступную память.
C1012 "Неверное вложение скобок-пропущенный 'character' (символ)".
Несоответствие скобок в директиве препроцессора; 'character'-
-это либо левая, либо правая скобка.
C1013 "Невозможно открыть исходный файл 'filename'".
Данный файл 'filename' либо не существует, либо не может быть
открыт, либо не найден. Удостоверьтесь, что параметры установ-
ки среды корректны, и что для файла задано корректное имя марш-
рута.
C1014 "Слишком много включаемых файлов".
Вложение директив #include превышает 10-уровневый предел.
C1015 "Невозможно открыть включаемый файл 'filename'".
Данный файл либо не существует, либо не может быть открыт, либо
не найден. Удостоверьтесь, что параметры неазначений среды за-
даны корректно, и что вы определили корректное имя маршрута для
данного файла.
C1016 "Директиве #if [n]def требуется идертификатор".
С директивами #ifdef и #ifndef вы обязательно должны употреб-
лять идентификатор.
C1017 "Неверное выражение целой константы".
Выражение в директиве #if должно вычисляться в константу.
C1018 "Неожиданная директива '#elif'".
Появление директивы #elif разрешено только внутри директив #if,
#ifdef, или #ifdef.
C1019 "Неожиданная директива '#else'".
Появление директивы #else возможно только внутри директив #if,
#ifdef, или #ifndef.
C1020 "Неожиданная директива '#endif'"
Директива #endif появилась без соответствующей директивы #if,
#ifdif, или #ifndef.
C1021 "Неверная команда препроцессора 'string'"
Символы, следующие за знаком (#) формируют неверную директиву
препроцессора.
C1022 "Ожидается директива '#endif'".
Директива #if, #ifdef или #ifndef не заканчивается директивой
#endif.
C1026 "Переполнение стэка, пожалуйста, упростите вашу программу."
Ваша программа не может быть далее обработана, поскольку па-
мять, требуемая для "разбора" программы переполняет стэк ком-
пилятора.
Чтобы разрешить данную проблему, упростите вашу программу.
C1027 "Ограничения компилятора: вложение структур/смесей".
Определения структур и смесей вложены более 10 раз.
C1028 "Сегмент segment занимает более 64К"
В данном сегменте размещены более 64 "дальних" данных. Один мо-
дуль может иметь не более 64К "дальних" данных.
Чтобы разрешить данную проблему, либо разбейте объяснения на
отдельные модули, сократите общий объем используемых данных,
либо откомпилируйте вашу программу с помощью Оптимизирующего
компилятора Microsoft-C.
C1032 "Невозможно открыть файл, содержащий объектный листинг
'filename'".
Имеет силу одно из следующих утверждений, касающихся имени фай-
ла или имени маршрута:
1.Данное имя не верно.
2.Файл с данным именем не может быть открыт из-за нехватки
памяти.
3.Уже существует файл с данным именем и атрибутом "только-чте-
ние".
C1033 "Невозможно открыть выходной файл на языке ассемблер
'filename'".
Одно из условий, рассмотренных в описании ошибки с кодом C1032,
привело к невозможности открыть данный файл.
C1034 "Невозможно открыть исходный файл 'filename'".
Одно из условий, рассмотренных в описании ошибки с кодом C1032,
привело к невозможности открыть данный файл.
C1035 "Выражение является слишком сложным, пожалуйста упростите".
Компилятор не смог сгенерировать код для сложного выражения.
Чтобы разрешить данную проблему, разбейте выражение на более
простые подвыражения и повторите компиляцию.
C1036 "Невозможно открыть файл, содержащий исходный листинг
'filename'".
Одно из условий, рассмотренных в описании ошибки с кодом C1032,
привело к невозможности открыть данный файл.
C1037 "Невозможно открыть объектный файл 'filename'".
Одно из условий, рассмотренных в описании ошибки с кодом C1032,
привело к невозможности открыть данный файл.
C1039 "Невосстанавливаемое переполнение динамической области в треть-
ем проходе компилятора":
В третьем оптимизирующем проходе компилятор переполнил динами-
ческую область и прекратил работу.
Попытайтесь повторить компиляцию с включенной опцией Optimiza-
tions (в среде программирования Quick-C), либо с опцией /Od (в
командной строке QCL), либо попытайтесь отделить функцию, со-
держащую строку, вызвавшую ошибку.
C1040 "Неожиданный EOF в исходном файле 'filename'".
В процессе создания листинга исходного файла, либо исходного/
объектного файла компилятор обнаружил неожиданный конец файла.
Данная ошибка произошла, вероятно, если исходный файл был отре-
дактирован в процессе компиляции.
C1041 "Невозможно открыть промежуточный файл компилятора-больше нет".
Компилятор не может создать промежуточный файл, используемый в
процессе компиляции, поскольку больше нет логических номеров
файлов.
Данная ошибка может быть исправлена путем изменения строки
files=number в файле CONFIG.SYS, чтобы задать большее число од-
новременно открытых файлов (рекомендуется назначить число 20).
C1042 "Невозможно открыть промежуточный файл компилятора-нет такого
файла или каталога".
Компилятор не может создать промежуточные файлы, используемые в
процессе компиляции, поскольку в переменной операционный среды
TMP задан неправильный каталог, или маршрут.
C1043 "Невозможно открыть промежуточный файл компилятора".
Компилятор не может создать промежуточные файлы, используемые в
процессе компиляции. Точная причина неизвестна.
C1044 "Нехватка дисковой памяти для промежуточного файла компилятора"
Из-за недостатка памяти компилятор не может создать промежуточ-
ный файл, используемый в процессе компиляции. Для исправления
данной ситуации освободите место на диске и повторите компиля-
цию.
C1045 "Переполнение при операции с плавающей точкой".
Компилятор получил ошибку при присваивании арифметических конс-
тант элементам с плавающей точкой, как в следующем примере:
float fp val = 1.0e100;
В данном примере константа двойной точности 1.0е100 превышает
максимально-допустимое значение для данных с плавющей точкой.
C1047 "Слишком много появлений опции 'string'".
Данная опция упоминается слишком много раз. Строка 'string' со-
держит опцию, вызвавшую ошибку.
C1048 "Неизвестная опция 'character' в 'optionstring'".
Символ является некорректной буквой для опции 'optionstring'.
C1049 "Неверный числовой аргумент 'string'".
Вместо string ожидался числовой аргумент.
C1050 "Сегмент кода 'segmentname' слишком большой".
В процессе компиляции сегмент кода вырос за пределы 36 байтов
от 64К.
В данном случае используется 36-байтовый заполнитель, поскольку
сбой на некоторых платах микропроцессоров 80286 могут вызвать
непредсказуемое поведение программ, если среди прочих условий
размер кодового сегмента находится в пределах 36 байтов от 64К.
C1052 "Слишком много директив #if/#ifdef's".
В программе превышено максимальное число уровней вложения ди-
#if/#ifdef.
C1053 "Размещение данных DGROUP превышает 64К".
В стандартном сегменте данных были размещены более 64К перемен-
ных.
Для программ компактной, средней и большой модели памяти выпол-
няйте компиляцию с помощью команды QCL, используя опцию
/GT для размещения элементов данных в отдельных сегментах.
C1054 "Ограничения компилятора: слишком глубокая вложенность инициа-
заторов".
Были превышены ограничения компилятора на вложенность инициали-
заторов. Предел - от 10 до 15 уровней, в зависимости от комби-
нации инициализируемых типов.
Чтобы решить данную проблему, для сокращения уровней вложен-
ности упростите тип инициализируемых данных, либо после опи-
санияия присваивайте первоначальное значение в отдельных опе-
раторах.
C1056 "Ограничения компилятора: переполнение в процессе макро-расши-
рения".
Компилятор переполнил внутренний буфер при расширения
макрокоманды.
C1057 "Неожиданный EOF в макро-расширении; (пропущено ')'?)".
Компилятор обнаружил конец исходного файла в процессе сборки
аргументов макро-вызова. Обычно, это является результатом опу-
щенной  закрывающей правой скобки) в макро-вызове, как и в сле-
дующем примере:
#define print(a) printf(string is(,#a))
main()
{
print(the quick brown fox;
}
C1059 "Превышены пределы "ближней" динамической области".
При размещении элементов данных в "ближней" динамической обла-
сти (стандартный сегмент данных), компилятор вышел за допусти-
мые пределы.
C1060 "Превышены пределы "дальней" динамической области".
При размещении элементов данных в "дальней" динамической облас-
ти компилятор вышел за допустимые пределы памяти. Обычно дан-
ная ошибка происходит во встроенных в память программах, по
причине того, что таблица имен содержит слишком много имен.
Чтобы исправить данную ситуацию, попробуйте выполнить компиля-
цию с выключенной опцией Debug, либо попытайтесь подключить
меньше включаемых файлов. Если такой способ не спасает ситу-
ацию, выполните компиляцию программы посредством команды QCL.
C1061 "Ограничения компилятора: слишком глубокое вложение блоков".
Вложенность блоков в данной прогамме превышает возможности ком-
пилятора. Для исправления данной ситуации перепишите программу
так, чтобы вложенность блоков была меньшей.
C1063 "Ограничения компилятора-переполнение стека компилятора".
Ваша программа слишком сложна, поскольку привела к переполнению
стека. Упростите вашу программу и повторите компиляцию.

D.1.2. Сообщения об ошибках компилятора.

Сообщения, перечисленные ниже, означают, что ваша программа имеет ошибки. Когда компилятор встречает одну из ошибок, перечисленных в данном разделе, программа продолжает рассматриваться (если возможно), причем продолжают выводиться оставшиеся сообщения об ошибках. Однако, объектный файл не строится.

Номер         Сообщения об ошибках компилятора
C2000 "Нераспознанная ошибка. Обратитесь в Технический сервис фирмы
Microsoft".
Компилятор не может определить тип обнаруженной ошибки. Пожа-
луйста, сообщите условие возникновения данной ошибки в фирму
Microsoft, воспользовавшись специальным бланком "Product Assis-
tance Reguest", находящимся на обложке данного руководства.
C2001 "В константе обнаружен символ перехода на новую строку
(newline)".
Символ перехода на новую строку в символьной или строковой
константе употребляется не в корректной форме управляющей
последовательности (/n).
C2002 "Фактические параметры макрокоманды превышают допустимые пре-
делы памяти".
Аргументы макро-препроцессора превышабт 256 байтов.
C2003 "Требуется идентификатор".
Идентификатор для проверки условия в #if не найден.
C2004 "Требуется идентификатор".
Директива #if вызвала синтаксическую ошибку.
C2005 "В директиве #line требуется номер строки".
В директиве #line не хватает заданного номера строки.
C2006 "Директиве #include требуется имя файла".
В директиве #include не хватает спецификации имени файла.
C2007 "Синтаксическая ошибка директивы #define".
В директиве #define была обнаружена синтаксическая ошибка.
C2008 "'character': невозможен в макроопределении".
Данный символ был использован в макроопределении некорректно.
C2009 "Повторное использование формального параметра 'identifier'
макроопределения".
Данный идентификатор был дважды использован в списке формальных
параметров макроопределения.
C2010 "'character': невозможен в формальном списке".
Данный символ был некорректно использован в списке формальных
параметров макроопределения.
C2011 "'identifier': определения слишком велико".
Данное макроопределение превышает 256 байтов.
C2012 "Пропущено имя, следующее за '<'".
В директиве #include не хватает требуемой спецификации имени
файла.
C2013 "Не хватает знака '>'".
В директиве #include пропущена закрывающая угловая скобка (>)
C2014 "Команда препроцессора должна начинаться с первого значащего
(не пробельного) символа".
В директиве препроцессора на той же самой строке появились не
пробельные символы перед знаком #.
C2015 "Слишком много символов в константе".
Символьная константа содержит более одного символа, либо была
использована управляющая последовательность.
C2016 "Отсутствует закрывающая одинарная кавычка".
Символьная константа не была заключена в одинарные кавычки.
C2017 "Некорректная  управляющая последовательность".
Символ или символы, следующие за знаком () не имеют корректной
формы для управляющей последовательности.
C2018 "Неизвестный символ 'Oxcharacter'".
Данное шестнадцатеричное число не соответствует символу.
C2019 "Требуется команда препроцессора, обнаружен символ 'character'"
Данный символ следует за знаком (#), но не является первой бук-
вой директивы препроцессора.
C2020 "Неверное восьмеричное число 'character'".
Данный символ не является корректной восьмеричной цифрой.
C2021 "Число 'number'слишком велико для символа".
Число 'number' слишком велико, чтобы представлять символ.
C2023 "Деление на нуль".
Второй операнд операции деления (/) при вычислении дает нуль.
что может привести к непредсказуемым результатам.
C2024 "По модулю 0".
Второй операнд в остатке операции (%) при вычислении дает нуль,
что может привести к непредсказуемым результатам.
C2025 "'identifier': переопределение типа enum/struct/union".
Данный идентификатор уже был использован в перечислении, струк-
туре или тэге смеси.
C2026 "'identifier': переопределение числа перечисления ".
Данный идентификатор уже был использован в константе перечисле-
ния, либо в том же самом типе перечисления, либо в другом типе
перечисления в том же самом виде.
C2028 "Член структуры/смеси должен находиться внутри структуры/смеси"
Члены структуры или смеси должны быть описаны внутри структу-
ры или смеси. Данная ошибка может быть вызвана описанием пе-
речисления, содержащим описание члена структуры, как в следу-
ющем примере:
enum a {
january,
february,
int march; /* описание структуры :
** некорректно
*/
};
C2029 "'identifier': битовые поля разрешены только в структурах".
Только структуры могут содержать битовые поля.
C2030 "'identifier': переопределение члена структуры/смеси".
Данный идентификатор был более одного раза использован в качес-
тве члена одной и той же структуры/смеси.
C2031 "'identifier': функция не может быть членом структуры или сме-
си".
Данная функция была описана в качестве члена структуры или
смеси. Для исправления данной ошибки воспользуйтесь указателем
на функцию.
C2032 "'identifier': базовый тип с ключевыми словами near/far/huge не
разрешен".
Данный член структуры или смеси был описан с ключевыми слова-
ми far и near.
C2033 "'identifier': к битовым полям нельзя применять оператор кос-
венного обращения (*)".
Данное битовое поле было описано как указатель (*), что не
разрешено.
C2034 "'identifier': битовое поле слишком мало для данного количества
разрядов".
Количество разрядов, заданное в описаний битового поля превы-
ша%т количест-о разрядов в данеод базовом т(пе.
C2040 "'.'требует имя структуры или смеси".
Выражение перед оператором выбора структуры или смеси (.) явля-
ется указателем на структуру или смесь, а не структурой или
смесью, как требуется.
C2041 "Ключевое слово 'enum' некорректно".
В описании структуры или смеси появилось ключевое слово
'enum', либо определение типа 'enum' было сформировано некор-
ректно.
C2042 "ключевые слова signed/unsigned является взаимо-исключающими".
Оба ключевых слова signed и unsigned были одновременно исполь-
зованы в одном описании, как в следующем примере:
unsigned signed int i;
C2043 "Некорректный оператор break".
Оператор break разрешен только внутри операторов do, for, while
или switch.
C2044 "Некорректный оператор continue".
Оператор continue разрешен только внутри операторо do, for, или
while.
C2045 "'identifier': повторное определение метки".
Данная метка появилась перед более, чем одним оператором в од-
ной и той же функции.
C2046 "Некорректное ключевое слово case".
Ключевое слово case может находиться только внутри оператора
switch.
C2047 "Некорректное ключевое слово default".
Ключевое слово default может находиться только внутри оператора
switch.
C2048 "Более одного default".
Оператор switch содержит более одной метки default.
C2050 "Не целое выражение switch".
Выражение switch не является целым.
C2051 "Выражение case не константное".
Выражения case должны быть целыми константами.
C2052 "Выражение case не является целым".
Выражения case должны быть целыми константами.
C2054 "Значение case 'number' уже было использовано".
Данное значение case уже было использовано в операторе switch.
C2054 "Требуется знак '(' после идентификатора 'identifier'".
По контексту требуются скобки после функции 'identifier'.
C2055 "Требуется список формальных параметров, а не тип list".
В определении функции вместо списка формальных параметров поя-
вился тип аргумента list.
C2056 "Некорректное выражение".
Из-за предыдущей ошибки выражение является некорректным (Пре-
дыдущая ошибка могла не вызвать ошибочного сообщения).
C2057 "Требуется константное выражение".
По контексту требуется константное выражение.
C2058 "Константное выражение не является целым".
По контексту требуется целое константное выражение.
C2059 "Синтаксическая ошибка: 'token'".
Данная лексема вызвала синтаксическую ошибку.
C2060 "Синтаксическая ошибка: EOF".
Был обнаружен неожиданный конец файла, что вызвало синтак-
сическую ошибку. Данная ошибка может быть вызвана опущенной зак
рывающей скобкой '}' в конце вашей программы.
C2061 "Синтаксическая ошибка: идентификатор 'identifier'".
Данный идентификатор вызвал синтаксическую ошибку.
C2062 "Тип 'type' не требуется".
Данный тип был некорректно употреблен.
C2063 "'identifier': не является функцией".
Данный идентификатор не объявлен как функция, но сделана попы-
тка использовать его в качестве функции.
C2064 "Данный терм не вычисляется в функцию".
Сделана попытка вызова функции с помощью выражения, которое при
вычислении не дает указатель функции.
C2065 "'identifier': не определен".
Данный идентификатор не определен.
C2066 "Преобразование к функции некорректно".
Объект был преобразован к типу функции.
C2067 "Преобразование к типу массива некорректно".
Объект был преобразован к типу массива.
C2068 "Некорректное приведение типов".
Тип, используемый в приведении типов, не является корректным.
C2069 "Приведение типа void к типу, не являющемуся void".
Тип void был приведен к другому типу.
C2070 "Некорректный операнд sizeof".
Операнд выражения sizeof не является идентификатором, либо наи-
менованием типа.
C2071 "'class': неверный класс памяти".
Данный класс памяти не может быть использован в таком контекс-
те.
C2072 "'identifier': инициализация функции".
Была сделана попытка инициализации функции.
C2073 "'identifier': невозможно инициализировать массив в функции".
Была сделана попытка проинициализировать данный массив внутри
функции. Массив можно поринициализировать только на внешнем
уровне.
C2074 "В функции запрещено инициализировать структуру или смесь".
Была сделана попытка проинициализировать данную структуру или
смесь внутри функции. Структуры и функции могут быть проинициа-
лизированы только на внешнем уровне.
C2075 "'identifier': инициализация массива требует только фигурных
скобок".
При инициализации массива были пропущены фигурные скобки {}.
C2076 "'identifier': инициализация структуры или смеси требует только
фигурных скобок".
При инициализации структуры или смеси были пропущены фигурные
скобки {}.
C2077 "Нецелый инициализатор поля 'identifier'".
Была сделана попытка инициализации члена структуры-битового по-
ля нецелым значением.
C2078 "Слишком много инициализаторов".
Количество инициализаторов превышает количество инициализируе-
мых объектов.
C2079 "'identifier'-неопределенная структура или смесь".
Данный идентификатор был описан, как структура или смесь, тип
которой не определен.
C2082 "Повторное определение формального параметра 'identifier'".
Формальный параметр функции был повторно описан в теле функции.
C2083 "Массив 'identifier' уже имеет размер".
Размерность для данного массива уже была описана.
C2084 "Функция 'identifier' уже имеет тело".
Данная функция уже была определена.
C2085 "'identifier': не в списке формальных параметров".
Данный параметр был объявлен в определении функции для несущес-
твующего формального параметра.
C2086 "'identifier': переопределение".
Данный идентификатор был определен более одного раза.
C2087 "'identifier': пропущенный описатель".
В определении массива с несколькими описателями было опущено
значение описателя для размерности, отличной от первой, как в
следующем примере:
int func(a)
char a[10][]; /* некорректно */
{
.
.
.
}
int func(a)
char a[][5]; /* корректно */
{
.
.
.
}
C2088 "Использование неопределенного идентификатора 'identifier' пе-
речисления/структуры/смеси".
Данный идентификатор обращается к структуре или смеси, тип ко-
торой не определен.
C2089 "typedef определяет функцию near/far".
Использование ключевых слов near или far в объявлении typedef
не согласуется с использованием ключевых слов  near или far для
объявленного элемента, как в следующем примере.
typedef int far FARFUNC();
FARFUNC near *fp;
C2090 "Функция возвращает массив".
Функция не может возвращать массив (она может возвращать только
указатель на массив).
C2091 "Функция возвращает функцию".
Функция не может возвращать функцию (она может возвращать толь-
ко указатель на функцию).
C2092 "Элемент массива не может быть функцией".
Массивы функций не разрешаются; однако, можно использовать мас-
сивы указателй на функции.
C2093 "Невозможно инициализировать статические данные или структуры
адресами автоматических переменных".
C2098 "Не-адресное выражение".
Была сделана попытка инициализации элемента данных, не являю-
щегося адресным выражением.
C2099 "Неконстантное смещение".
Инициализатор использовал неконстантное смещение.
C2100 "Некорректное использование оператора (*)".
Оператор (*) был применен к неуказателю.
C2101 "'&' в константе".
Оператор (&) не имеет адресного значения в качестве операнда.
C2102 "'&' требуется адресное значение".
Оператор адресации (&) должен применяться к адресному значению.
C2103 "'&' в регистровой переменной".
Была сделана попытка взять адрес регистровой переменной.
C2104 "'&' в битовом поле".
Была сделана попытка взять адрес битового поля.
C2105 "'operator' требует адресного значения".
Данный оператор не имеет адресного операнда.
C2106 "'operator': левый операнд должен быть адресным".
Левый операнд данного оператора не является адресным.
C2107 "Некорректный индекс, косвенное наименование (*) не разрешено".
Описатель был применен к выражению, которое не вычисляется в
указатель.
C2108 "Не-целый индекс".
В качестве описателя массива было использовано не-целое выраже-
ние.
C2109 "Описатель в не-массиве".
Описатель был использован в переменной, которая не является
массивом.
C2110 "'+': 2 указателя".
Была сделана попытка сложить один указатель с другим.
C2111 "Указатель + не-целое значение".
Была сделана попытка сложить не-целое значение с указателем.
C2112 "Некорректное вычитание указателей".
Была сделана попытка вычесть указатели, не указывающие на один
и тот же тип.
C2113"'-': правый операнд-указатель".
Правый операнд в операции вычитания (-) является указателем, а
левый операнд-нет.
C2114 "'operator': указатель слева; требуется целое справа".
Левый операнд в данном операторе является указателем; правый
операнд должен быть целым значением.
C2115 "'identifier': несовместимые типы".
Выражение содержит несовместимые типы.
C2116 "'operator': неправильный левый (или правый) операнд".
Заданный операнд данного оператора не соответствует данному
оператору.
C2117 "'operator': Некорректно для структуры или смеси".
Значение структуры и смеси не разрешено с данным оператором.
C2118 "Отрицательный описатель".
Значение, определяющее размер массива, -отрицательно.
C2119 "'typedefs' оба определяют косвенное наименование (*)".
Были использованы одновременно два типа typedef для объявления
элемента данных и оба типа typedef имеют косвенное наимено-
вание. Например, объявление p в следующем примере-некорректно:
typedef int *P INT;
typedef short *P SHORT;
/* данное объявление некорректно */
P SHORT P INT P;
C2120 "'void'-некорректно со всеми типами".
Тип void был использован в объявлении с другим типом.
C2121 "typedef определяет другое перечисление".
Была попытка использовать тип, объявленный в операторе typedef
для задания, как типа перечисления, так и другого типа.
C2122 "typedef определяет другую структуру".
Была сделана попытка использовать тип, объявленный в операторе
typedef, для задания как типа структуры, так и другого типа.
C2123 "typedef определяет другую смесь".
Была сделана попытка использовать тип, объявленный в операторе
typedef, для задания как типа смеси, так и другого типа.
C2125 "'idetifier': память, занятая данными, превышает 64К":
Данный элемент данных превышает предельный размер 64К.
C2126 "'identifier': данные типа automatic превышают размер 32К".
Память, занятая локальными переменными функции, превышает зада-
нный предел.
C2127 "Память, занятая параметрами, превышает 32К".
Память, требуемая для парметров функции превышает предел 32К.
C2129 "Статическая функция 'identifier' не найдена".
Была сделана ссылка на статическую функцию, которая никогда не
была определена.
C2130 "#line требуется строка, содержащая имя файла".
В директиве #line было опущено имя файла.
C2131 "Атрибуты near/far/huge заданы более одного раза".
Ключевые слова near и far были применены к элементу данных бо-
лее одного раза, как в следующем примере:
typedef int near NINT;
NINT far a; /* некорректно */
C2132 "Синтаксическая ошибка: неожиданный идентификатор".
Идентификатор появлился в синтаксически некорректном формате.
C2133 "Массив 'identifier': неизвестный размер"
Была сделана попытка описать массив с неназначенным размером,
как в следующем примере:
int mat add(array1)
int array1[]; /* корректно */
{
int array2[]; /* некорректно */
.
.
.
}
C2134 "'identifier': структура или смесь слишком велики".
Размер структуры или смеси превышает предел, установленный ком-
пилятором (232 байтов).
C2135 "Пропущен знак ')' в макро-расширении".
В обращении к макрокоманде с аргументами была опущена закрыва-
ющая скобка.
C2137 "Пустая символьная константа".
Была использована некорректная пустая символьная константа
(' ').
C2138 "Несоответствие закрывающей границы комментария '/*'".
Компилятор обнаружил открывающий ограничитель комментария (/*)
без соответствующего закрывающего ограничителя (*/).
Данная ошибка может возникнуть из-за попытки использования не-
корректных вложенных коментариев.
C2139 "Тип, за которым следует 'type', некорректен".
Некорректная комбинация типов, как в следующем примере:
long char a;
C2140 "Тип аргумента не может быть функцией, возвращающей ...".
Функция была объявлена, как формальный параметр другой функ-
ции, как в следующем примере:
int funcl (a)
int a(); /* некорректно */
C2141 "Для константы перечисления значение превышает допустимые пре-
делы".
Константа перечисления имеет значение, превышающее допустимые
пределы для типа int.
C2142 "Для многоточия требуется три точки".
Компилятор обнаружил лексему, содержащую две точки (..) и пред-
C2143 "Синтаксическая ошибка: недостает лексемы 'token1' перед лексе-
мой 'token2'".
Компилятор ожидает появления перед token2-token1. Данное сооб-
щение может появиться, если пропущена требуемая закрывающая фи-
гурная скобка (}), правая скобка ()) либо точка с запятой (;).
C2144 "Синтаксическая ошибка: недостает лексемы 'token' перед типом
'type'".
Компилятор требует наличия данной лексемы перед данным типом.
Данное сообщение может появиться пре пропущенной закрывающей
фигурной скобке (}), правой скобке ()), или точке с запятой
(;).
C2145 "Синтаксическая ошибка: перед идентификатором не хватает лексе-
мы 'token'".
Компилятор требует наличия перед идентификатором данной лексе-
мы. Данное сообщение может появиться при пропущенной точке с
запятой (;) в последнем объявлении блока.
C2146 "Синтаксическая ошибка: перед идентификатором 'identifier' не
хватает лексемы 'token'".
Компилятор требует наличия данной лексемы перед данным иденти-
фикатором.
C2147 "Массив: неизвестный размер".
Сделана попытка увеличить индекс, либо указатель на массив, ба-
зовый тип которого еще не объявлен.
C2148 "Слишком большой массив".
Массив превышает максимально-допустимый размер (232 байта).
C2149 "'identifier': данное битовое поле не может иметь нулевую шири-
ну".
Битовое поле с данным именем имеет нулевую ширину. Нулевой раз-
мер разрешается иметь только неименованным битовым полям.
C2150"'identifier': битовое поле должно иметь тип int, signed int или
unsigned int.
Стандарт ANSI C требует, чтобы битовые поля имели типы int,
signed int или unsigned int. Данное сообщение может появиться
только при компиляции с опцией /Za.
C2151 "Задано более одного атрибута cdecl/fortran/pascal".
Было задано более одного ключевого слова, определяющего согла-
щения о вызове функций.
C2152 "'identifier': указатели на функции с различными атрибутами".
Была сделана попытка присвоить указатель на функцию, объявлен-
ную с одними соглашениями о связях (cdecl, fortran или pascal)-
-указателю на функцию, объявленную с другими соглашениями о
связях.
C2153 "Шестнадцатеричные константы должны иметь по крайней мере одну
шестнадцатеричную цифру".
Ox или OX-являются некорректными шестнадцатеричными константа-
ми. За "x" или "X" должна следовать хотя бы одна шестнадца-
теричная цифра.
C2154 "'name': не относится к сегменту".
Имя функции name было первым идентификатором, заданным в аргу-
ментном списке прагмы alloc_text, и уже определено как какое-
-либо имя, отличное от имени сегмента.
C2155 "Имя 'name': уже имеется в сегменте".
Имя функции name появляется более, чем в одной прагме alloc_
text.
C2156 "Прагма должна быть на внешнем уровне".
Некоторые прагмы должны быть определены на глобальном уровне,
вне тела функции, а одна из таких прагм оказалась внутри фун-
кции.
C2157 "'name': перед использованием в списке прагмы данное имя долж-
но быть описано".
Данное имя функции из списка функций прагмы alloc_text не было
описано перед включением в список.
C2158 "'name': является функцией".
Имя name было задано в списке переменных прагмы same_seg, но
ранее было объявлено, как функция.
C2159 "Определено  более одного класса памяти".
В описании было задано более одного класса памяти, как в сле-
дующем примере:
extern static int i;
C2160 "## не может встретиться в начале макро-определения".
Макро-определение начинается с оператора подстановки лексем,
как в следующем примере:
#define mac(a,b) ##a...
C2161 "## не может находиться в конце макро-определения".
Макро-определение заканчивается оператором подстановки лексем
(##).
C2162 "Требуется формальный параметр макрокоманды".
Лексема, следующая за оператором (#), не является именем фор-
мального параметра, как в следующем примере:
#Define print(a) printf(#b)
C2163"'string': отсутствует, как intrinsic".
Функция, определенная в списке функций для прагмы intrinsic или
function, не является одной из имеющихся в форме intrinsic фун-
кций.
C2165 "'keyword': невозможно изменить указатели на данные".
Были некорректно использованы ключевые слова fortran, pascal
или cdecl для модификации указателя на данные, как в следующем
примере:
char pascal *p;
C2166 "Значение определяет объект, относящийся к классу памяти
'const'".
Была сделана попытка присвоить значение элементу данных, объяв-
ленному с классом памяти const.
C2167 "'name': слишком много фактических параметров для intrinsic.
Ссылка на имя intrinsic function содержит слишком много факти-
ческих параметров.
C2168 "'name': слишком мало фактических параметров для intrinsic".
Ссылка на имя содержит слишком мало фактических параметров.
C2169 "'name': является intrinsic оно не может быть определено ".
Была сделана попытка задать определение для функции, уже описа-
нной, как intrinsic.
C2171 "'operator': неверный операнд".
Данный унарный оператор был использован с операндом некоррект-
ного типа, как в следующем примере:
int (*fp)();
double d, d1;
.
.
.
fp++;
d=~d1
C2172 "'function': фактически не указатель, параметр номер'number'.
Была сделана попытка передать аргумент, не являющийся указате-
лем, функции, требующей указатель. Данный номер указывает, ка-
кой аргумент ошибочен.
C2173 "'function': фактически не указатель, параметр 'number': спи-
сок параметров 'number'".
Была сделана попытка передать аргумент, не являющийся указате-
лем, функции, требующей указатель. Данная ошибка может произой-
ти в вызовах, возвращающих указатель на функцию. Первый номер
указывает, какой аргумент вызвал ошибку; второй номер показы-
вает, какой список аргументов содержит неверный аргумент.
C2174 "'function': фактически имеет тип void: параметр 'number', спи-
сок параметров 'number'".
Была сделана попытка передать аргумент типа void функции. Фор-
мальные параметры и аргументы функции не могут иметь тип void;
однако, они могут иметь тип void* (указатель на void). Данная
ошибка происходит в вызовах, возвращающих указатель на функцию.
Первый номер показывает, какой аргумент вызвал ошибку; второй
номер показывает, какой список аргументов содержит неправильный
аргумент.
C2175 "'function': неразрешенная внешняя ссылка".
Данная функция неопределена в исходном файле, либо встроена в
среду программирования QUICK-C, либо находится в библиотеке
QUICK, если она загружена.
Данная ошибка возникает только в одно-модульных, встроенных в
среду Quick-C программах. Чтобы разрешить данную проблему, либо
определите функцию в исходном файле, либо загрузите библиотеку
QUICK,содержащую данную функцию, либо (если функция содержится
в стандартной библиотеке СИ-функций), создайте для программы
программный список.
C2177 "Константа слишком велика".
Информация была потеряна, поскольку константа слишком велика,
чтобы заменить тип, которому она присваевается. (1)

D.1.3. Предупреждающие сообщения.

Сообщения, перечисленные в данном разделе, вскрывают некоторые возможные проблемы, но не мешают компиляции и компановке. Номер в скобках в конце сообщения об ошибке означает минимальный уровень предупреждения, установленный для данного сообщения.

Номер  Предупреждающее сообщение
C4000 "Нераспознанное предупреждение, свяжитесь с техническим сер-
висом фирмы Microsoft".
Компилятор обнаружил неизвестную ошибку. Пожалуйста, сообщите
условия возникновения данной ошибке фирме Microsoft Corpora-
tion, воспользовавшись бланком "Product Assistant Request",
находящимся в конце данного руководства.
C4001 "Макрокоманда 'identifier'требует параметров".
Данный идентификатор был определен, как макрокоманда, имеющая
один или более аргументов, но используется в программе без ар-
гументов. (1).
C4002 "Слишком много фактических параметров для макрокоманды 'identi-
fier'".
Число фактических аргументов, употребляемых с данным идентифи-
катором, больше, чем число формальных параметров, заданных в
макроопределении данного идентификатора. (1).
C4003 "Не достаточно фактических параметров для макрокоманды
'identifier'".
Число фактических аргументов, употребляемых с данным идентифи-
катором, меньше, чем число формальных параметров, заданных в
макроопределении данного идентификатора. (1).
C4004 "Не хватает закрывающей скобки после 'defined'".
После фразы #if defined пропущена закрывающая скобка. (1).
C4005 "'identifier': повторное определение".
Данный идентификатор был повторно определен. (1).
C4006 "Директиве #indef требуется идентификатор".
В директиве #indef задан идентификатор, определение которого
отсутствет. (1).
C4009 "Строка слишком велика, хвостовые символы отсекаются".
Размер строки превышает предел, установленный компилятором.
Для исправления данной ситуации разбейте строку на две или бо-
лее подстроки. (1).
C4011 "Идентификатор усечен до 'identifier'".
Принимаются только первые 31 символ идентификатора. (1).
C4014 "'identifier': битовое поле должно иметь тип unsigned.
Данное битовое поле не было описано с типом unsigned. Битовые
поля должны быть описаны, как целые без знака. Компилятор со-
ответственно конвертирует данное битовое поле. (1).
C4014 "'identifier': битовое поле должно иметь целый тип".
Данное битовое поле было описано, не как целое. Битовые поля
должны быть описаны, как целые без знака. Было применено пре-
образование. (1).
C4016 "'identifier': нет типа, возвращаемого функцией".
Данная функция еще не была описана либо определена, поэтому
тип возвращаемого значения неизвестен.
Подразумевается стандартный тип (int). (2).
C4017 "Приведение целого выражения к 'дальнему' указателю".
Дальние указатели содержат полные адреса сегментов. На процес-
соре 8086/8088 приведение целого (int) значения к "дальнему"
указателю может создать адрес с бессмысленным значением сегмен-
та. (1).
C4020 "Слишком много фактических параметров".
Число аргументов, определенных в вызове функции, больше числа
формальных аргументов, заданных в списке аргументов определения
функции. (1).
C4021 "Слишком мало фактических параметров".
Число аргументов, заданных в вызове функции, меньше числа фор-
мальных параметров, определенных в списке аргументов определе-
ния функции. (1).
C4022 "Несоответствие указателей: параметр n".
Тип указателя данного параметра отличен от типа указателя, за-
данного в списке аргументов определения функции. (1).
C4024 "Различные типы: параметр n".
Тип данного параметра функции не согласуется с типом, заданным
в списке аргументов определения функции. (1).
C4025 "Описание функции задает переменный список аргументов".
Список типов аргументов определения функции заканчивается запя-
той, за которой следует многоточие, что  означает, что функция
может принимать переменное число аргументов, но для функции не
были описаны формальные параметры. (1).
C4026 "Функция была описана со списком формальных параметров".
Функция была описана, как принимающая аргументы, но в определе-
нии функции не задано формальных параметров. (1).
C4027 "Функция была описана без списка формальных параметров".
Функция была описана, как не принимающая аргументов (список
типов аргументов состоит из слова void), но в определении функ-
ции заданы формальные параметры, либо в вызове функции заданы
фактические параметры. (1).
C4028 "Отличается описание параметра n".
Тип данного параметра не согласуется с соответствующим типом в
списке типов аргументов, либо с соответствующим формальным па-
раметром. (1).
C4029 "Описание списка параметров отлично от определения":
Список типов аргументов, заданный в описании функции, не со-
гласуется с типами формальных параметров, заданных в опреде-
лении функции. (1).
C4030 "Первый список параметров длиннее второго".
Функция была описана более одного раза, причем с различными
списками типов аргументов. (1).
C4031 "Второй список параметров длиннее, чем первый".
Функция была описана более одного раза, причем с различными
списками типов аргументов. (1).
C4032 "Неименованная структура/смесь в качестве параметра".
Тип структуры или смеси был передан как неименованный аргумент,
то есть описание формального параметра не может использовать
имя и должно описать тип. (1).
C4033 "Функция должна возвращать значение".
Если функция не описана, как void, она должна возвращать зна-
чение. (2).
C4034 "Оператор sizeof возвратил 0".
Оператор sizeof был применен к операнду, причем в результате
был получен 0. (1).
C4035 "'identifier': нет возвращаемого значения".
Функция описана, как возвращающая значение, но не делает
этого. (2).
C4036 "Не ожидаемый список формальных параметров".
Список формальных параметров был задан в описании функции.
Список формальных параметров игнорируется. (1).
C4037 "'identifier': формальные параметры игнорируются".
В описании функции не найдено перед описанием формальных
параметров ни класса памяти, ни наименование типа, как в сле-
дующем примере:
int * f(a,b,c);
Формальные параметры игнорируются. (1).
C4038 "'identifier':формальный параметр имеет некорректный класс па-
мяти".
Данный формальный параметр был описан с классом памяти, от-
личным от auto или register. (1).
C4039 "'identifier': функция используется в качестве аргумента"
Формальный параметр функции был описан, как функция, что не-
корректно.Формальный параметр будет преобразован в указатель
функции (1).
C4040 "Ключевое слово near/far/ в идентификаторе 'identifier' игнори-
руется".
Ключевые слова near или far не оказывают никакого действия на
данный идентификатор и потому игнорируются.(1).
C4041 "Формальный параметр 'identifier' переопределен".
Данный формальный параметр был в теле функции определен повтор-
но, сделав соответствующий фактический параметр для функции не-
доступным. (1).
C4042 "'identifier' имеет не корректный класс памяти".
Заданный класс памяти не может быть использован в данном конте-
ксте (например, параметрам функции не может быть присвоен класс
extern). Для данного контекста использован вместо некорректного
стандартный класс памяти. (1).
C4043 "'identifier': тип void изменен на int".
Элемент данных, отличный от функции, был описан с типом void.
(1).
C4045 "'identifier': массив переполнен".
Для данного массива было задано слишком много инициализаторов.
Лишние инициализаторы будут игнорированы. (1).
C4046 "Знак '&' в функции/массиве игнорируется".
Была сделана попытка применить оператор адресации (&) к иден-
тификатору, обозначающему функцию или массив. (1).
C4047 "'operator': различные уровни косвенного наименования".
Данную ситуацию иллюстрирует следующий пример:
char **p;
char *q;
.
.
.
p=q;
C4048 "Массив описан с помощью различных описателей".
Массив был описан дважды с различными размерами. Используется
большой размер. (1).
C4049"'operator': косвенное наименование применяется к различным ти-
пам".
Оператор косвенного наименования (*) был использован в выраже-
нии для доступа к значениям различных типов. (1).
C4051 "Преобразование данных".
В выражении два элемента данных имеют различные типы, что при-
ведет к преобразованию данных к одному типу. (2).
C4052 "Различные типы enum".
В выражении были использованы два различных типа enum. (1).
C4053 "По крайней мере один операнд void"
Выражение с типом void было использовано в качестве операнда.
(1).
C4056 "Переполнение в константной арифметике".
Результат операции превышает 0x7FFFFFFF. (1).
C4057 "Переполнение при перемножении констант".
Результат операции превышает 0x7FFFFFFF. (1).
C4058 "Взят адрес переменной фрейма, DS!=SS".
Программа была скомпилирована со стандартным сегментом данных
(DS), не равным стэковому сегменту (SS), программа пытается об-
ратиться к переменной фрейма посредством ближнего указателя.(1)
C4059 "В результате преобразования адрес сегмента потерян".
Преобразование "дальнего" указателя (полного адреса сегмента) к
"ближнему" указателю (смещение) привело к потере адреса сегмен-
та. (1).
C4060 "Преобразование 'длинного' адреса в 'короткий' адрес".
Преобразование длинного адреса (32-разрядного указателя) в ко-
роткий адрес (16-разрядного указателя) привело к потере адреса
сегмента. (1).
C4061 "long/short несоответствие в аргументе: применено преобразо-
вание".
Базовые типы действительных и формальных параметров функции
различны. Фактический параметр преобразовывается к типу фор-
мального параметра. (1)
C4063 "'identifier': функция слишком велика для шага оптимизации".
Данная функция не была оптимизирована, поскольку для этого
недостаточно памяти. Чтобы исправить данную ситуацию, сократи-
те размер функции путем разделения ее на две или более меньших
функций. (0).
C4066 "Таблица локальных имен переполнена-некоторые локальные имена
могут быть пропущены в списке".
Генератор листинга вышел за пределы динамической области, отве-
денной под локальные переменные, поэтому исходный листинг может
не включать в себя полную таблицу имен для всех локальных пере-
менных
C4067 "За директивой 'directive' следуют непонятные символы-требует-
ся символ перехода на следующю строку".
За директивой препроцессора следуют лишние символы, как в
следующем примере:
#endif NO_EXT_KEYS
Это принимается в некоторых версиях компилятора Microsoft C,
исключая версию 1.0 Microsoft Quick C. (1).
C4068 "Неизвестная прагма".
Компилятор не смог распознать прагму и игнорировал ее. (1).
C4069 "Преобразование ближнего указателя к длинному целому".
Ближний указатель был преобразован к длинному целому, что за-
полнило старшие разряды текущим значением сегмента данных, не
равным нулю. (1).
C4071 "'identifier': прототип функции не задан".
Данная функция была вызвана компилятором перед тем, как компи-
лятор обработал соответствующий прототип функции. (3).
C4072 "Недостаточно памяти для обработки отладочной информации".
Вы скомпилировали программу с опцией /Zi, но для создания со-
ответствующей отладочной информации недостаточно памяти. (1).
C4073 "Вложенность слишком глубока, дальнейшая вложенность во время
отладки игнорируется".
Описания появились на уровне вложенности, большем 13. В ре-
зультате, все описания будут восприниматься как бы на одном
уровне. (1).
C4074 "Было использовано нестандартное расширение-'extension'".
Было использовано данное нестандартное расширение в то время,
как опция Language Extension в диалоговой рамке Compile была
выключена, либо опция /Ze не действовала. Данные расширения да-
ны в Разделе 8.1.4.6. "Использование расширений языка СИ фирмы
Microsoft: Опция Language Extension". (если включена опция /Za,
данная ситуация дает ошибку). (3).
C4075 "Размер выражения в операторе switch или константа в операторе
case имеют слишком большой размер-преобразуются к типу int".
Значение, появляющееся в операторах switch или case, больше ти-
па int. Компилятор преобразует данное некорректное значение в
тип int. (1).
C4076 "'type': может быть использовано только с целыми типами".
Модификатор типа signed или unsigned был применен к не целому
типу, как в следующем примере:
unsigned double b;
C4077 "Неизвестная опция прагмы check_stack".
Со старой формой прагмы check_stack была задана неизвестная
опция, как в следующем примере:
#pragma check_stack yes
В старой форме прагмы check_stack аргумент прагмы должен быть
пустым + или -.
C4079 "Неожиданный символ 'character'".
В аргументном списке прагмы был найден неожиданный разделитель
'character'".
C4080 "Пропущено имя сегмента".
В первом аргументе аргументного списка прагмы alloc_text про-
пущено имя сегмента. Это случается, если первая лексема в ар-
гументном списке не является идентификатором.
C4082 "Требуется идентификатор".
В списке аргументов прагмы пропущен идентификатор.
C4083 "Пропущено'('".
В аргументном списке прагмы пропущена открывающая левая скобка,
как в следующем примере:
#pragma check_pointer on)
C4084 "Требуется ключевое слово pragma".
Лексема, следующая за ключевым словом pragma, не является иден-
тификатором, как в следующем примере:
#pragma (on)
C4085 "Требуется [on/off]
Для новой формы прагмы check_stack был задан некорректный аргу-
мент, как в следующем примере:
#pragma check_stack (yes)
C4087 "'name': описана с пустым списком параметров".
Данная функция была описана, как не принимающая параметров, в
то время как вызов функции определяет фактические параметры,
как в следующем примере:
int fl(void);
.
.
.
fl(10);
C4090 "Различные атрибуты 'const'".
Указатель на элемент данных, описанный, как const, был пере-
дан функции, соответствующий формальный параметр которой явля-
ется указателем на элемент данных, не являющийся const. Это
значит, что данный элемент данных может быть незаметно изме-
нен, как в следующем примере:
const char *p = "ascde";
int str(char *s);
.
.
.
str(p);
C4091 "Не описано никаких имен".
Компилятор обнаружил пустое описание, как в следующем примере
(2):
int;
C4092 "Описание перечисления/структуры/смеси не имеет имени".
Компилятор обнаружил пустое описание, использующее не имеющую
соответствующего тэга структуру, смесь или перечисление, как в
следующем примере:
struct {
.
.
.
};
C4093 "Некорректный символ перехода на новую строку в символьной кон-
танте в не действующем коде".
Константное выражение в директиве препроцессора #if, #ifdef или
#ifndef вычисляется в 0, что делает соответствующий код неактив
ным, причем символ перехода на новую строку появляется в данном
не активном коде между соответствующими одиночными или двойными
кавычками.
C4095 "Слишком много аргументов для прагмы".
В прагме, имеющей только один аргумент, появляется более одного
аргумента.
C4096 "Элемент типа huge трактуется, как far".
Поскольку компилятор Microsoft Quick-C не поддерживает ключевое
слово huge, элемент данных трактуется, как описанный с ключе-
вым словом far. Если элемент данных или функция должны все же
иметь тип huge, перекомпилируйте программу с помощью Оптимизиру
ющего компилятора Microsoft C.
C4097 "В строке встретился символ 'hex-character', не относящийся к
коду ASCII".
Данный не ASCII-символ был использован в данной символьной
строке.

D.1.4. Ограничения компилятора.

Для работы с компилятором Microsoft Quick-C вам нужно иметь достаточное количество памяти для обработки временных файлов, используемых для обработки. Требуется память приблизительно в два раза большая, чем размер исходного файла.

В таблице D.1 приводятся ограничения,накладываемые СИ-компиля- тором. Если ваша программа превышает один из заданных пределов, вас информирует об этом сообщение об ошибке.

                                                 Таблица D.1.
Ограничения СИ-компилятора.
Элемент программы      Описание                  Ограничения
Строковые литералы     Максимальная длина строки, 512 байтов
включающая нулевое оконча-
ние ().
Константы              Максимальный размер констан-
ты зависит от ее типа; смот-
рите "Справочное руководство
по языку СИ".
Идентификаторы         Максимальная длина идентифи- 31 байт (дополни-
катора                       тельные символы
не воспринимают-
ся).
Описания               Максимальный уровень вло-    10 уровней
женности для определений
структуры или смеси.
Директивы препроцес-   Максимальный размер макро-   512 байтов.
сора                   определения.
Максимальное количество      8 аргументов
фактических параметров в
макроопределении.
Максимальная длина реально-   256 байтов
го аргумента препроцессора.
Максимальный уровень вложен-  32 уровня
ности директив #if, #ifdef,
#ifndef.
Максимальный уровень вложен-  10 уровней
ности для подключаемых фай-
лов.

Компилятор не устанавливает явные ограничения на число и сложность описаний, определений и операторов в отдельных функциях или в программе. Если компилятор встречает функцию или программу слишком большую или слишком сложную для обработки, он выводит сообщение об ошибке.

D.2.Сообщения об ошибках в командной строке.

Сообщения, указывающие на ошибки в командной строке, используемой для вызова компилятора, имеют один из следующих форматов:

command line fatal error D1xxx: messagetext          Fatal error
(Фатальная ошибка командной строки D1xxx: текст сообщения Фатальная
ошибка)
command line error D2xxx: messagetext                 Error
(Ошибка командной строки D2xxx: текст сообщения       Ошибка)
command line warning D4xxx: messagetext               Warning
(Предупреждение командной строки D4xxx: текст сообщения
Предупреждение).

Если возможно, компилятор продолжает работу, распечатывая предупреждающее сообщение. В некоторых случаях ошибки командной строки являются неисправимыми и компилятор прекращает работу. Сообщения, приведенные в разделах D.2.1-D.2.3 описывают ошибки командной строки.

D.2.1. Неисправимые ошибки командной строки.

Следующие сообщения описывают фатальные ошибки. Драйвер компилятора не может восстановить работу после фатальной ошибки; он прекращает работу после распечатки сообщения.

Номер   Сообщение о фатальной ошибке в командной строке
D1000 Неизвестная фтатальная ошибка командной строки. Свяжитесь с тех
нической службой фирмы Microsoft. Компилятор обнаружил нераспоз
нанную неисправимую ошибку.
Пожалуйста, сообщите условия возникновения данной ошибки в фир-
му Microsoft Corporation с помощью формы Product Assistance
Request, находящейся в конце данного руководства.
D1001 "Невозможно выполнить 'filename'".
Компилятор не может найти данный файл в текущем рабочем катало-
ге, либо в других каталогах, определяемых посредством перемен-
ной PATH.
D1002 "Слишком много открытых файлов, невозможно переадресовать
'filename'".
Больше нет файлов, чтобы переадресовать вывод опции /P в файл.
Попробуйте изменить ваш файл CONFIG.SYS и увеличьте значение
num в строке files=num (если num меньше 20).

D.2.2. Сообщения об ошибках командной строки.

Как только драйвер компилятора встречает одну из ошибок, перечисленных в данном разделе, он (если возможно) продолжает компиляцию программы и выводит дополнительные сообщения об ошибках. Однако, объектный файл не строится.

Номер   Сообщение об ошибках командной строки
D2000 "Нераспознанная ошибка командной строки, обратитесь в техничес-
кий сервис фирмы Microsoft".
Компилятор обнаружил неизвестную ошибку. Пожалуйста, сообщите
условия возникновения данной ошибки фирме Microsoft Corporati-
on, используя бланк "Product assistance Request", находяцийся в
конце данного руководства.
D2001 "Слишком много имен определены с -D".
Слишком много символических констант были определены с помощью
опции /D командной строки.
Обычный предел определений на командной строке 16; если вы ис-
пользуете опции /U или /u-предел увеличивается до 20.
D2002 "Предварительно определенная модель была отменена".
Были определены две различные модели памяти; используется мо-
дель, заданная на командной строке позже.
D2003 "Пропущено имя исходного файла".
Вы не задали имя компилируемого исходного файла.
D2007 "Неверно задана опция, следует заменить 'string1' на
'string2'".
Данная опция была задана более одного раза с конфликтующими ар-
гументами string1 и string2.
D2008 "Слишком много флажков опции 'string'".
С заданной опцией было определено слишком много букв (например,
с опцией /O).
D2009 "Неизвестный символ опции 'option string'".
Одна из букв данной опции нераспознана.
D2010 "Неизвестная опция плавающей точки".
Данная опция плавающей точки ( опция /FP) не является коррект-
ной.
D2011 "Разрешена только одна опция плавающей точки".
На командной строке вы задали более одной опции плавающей точ-
ки (/FP).
D2012 "На командной строке слишком много опций компановщика".
Вы сделали попытку задать на командной строке более 128 отдель-
ных опций и объектных файлов для компановщика.
D2015 "Ассемблерные файлы не обрабатываются".
Вы задали на командной строке имя файла с расширением .ASM.
Поскольку компилятор не может автоматически вызывать Макроас-
семблер (MASM), он не может ассемлировать данные файлы.
D2018 "Невозможно открыть файл компановщика cmd".
Файл соответствий, передающий компановщику имена объектных фай-
лов и опции, не может быть открыт.
Данная ошибка может произойти, если какой-либо файл с атрибутом
"только-чтение" имеет то же самое имя, что файл соответствий
компановщика.
D2019 "Невозможно перезаписать исходный файл 'name'".
Вы задали исходный файл в качестве выводного. Компилятор не
позволяет исходному файлу быть перезаписанным одним из выход-
ных файлов компилятора.
D2020 "Опция -Gc требует возможности разрешения расширенных ключевых
слов (-Ze)".
Опция /Gc и опция /Za были заданы на одной командной строке.
Опция /Gc требует возможности задания расширенного ключевого
слова cdecl, если осуществляется доступ к библиотечным функ-
циям.
D2021 "Неверный числовой аргумент 'string'".
Нечисловая строка была задана за опцией, требующей  числового
аргумента.
D2022 "Невозможно открыть файл помощи cl.hlp".
Была задана опция /HELP, но файл содержащий вспомогательные
сообщения не был найден в текущем каталоге, либо в каталогах,
заданных с помощью переменной PATH.

D.2.3. Предупреждающие сообщения командной строки.

Сообщения, перечисленные в данном разделе, описывают возможные проблемы, но не прерывают компиляцию и компановку.

Номер   Предупреждающие сообщения
D4000 "Неизвестное предупреждение командной строки, свяжитесь с тех-
нической службой фирмы Microsoft".
Компилятором была обнаружена неизвестная ситуация.
Пожалуйста, сообщите условия возникновения данной ситуации фир-
ме Microsoft Corporation, используя бланк "Product Assistance
Request", находящийся в конце данного руководства.
D4002 "Неизвестная опция 'string' игнорируется".
Одна из опций, заданных на командной строке, была  нераспоз-
нана и потому проигнорирована.
D4003 "Для генерации кода выбран 80186/286, а не 8086".
Были заданы обе опции: /G0 и /G2; преимущество дано опции /G2.
D4004 "Оптимизация по времени, а не по размеру".
Данное сообщение подтвердило использование для оптимизации оп-
ции /Ot.
D4005 "Невозможно выполнить 'filename'; пожалуйста, вставьте дискету
и нажмите любой ключ".
Команда QCL не может найти заданный выполняемый файл по задан-
ному маршруту.
D4006 "Разрешена только одна из опций -P/-E/-EP, выбрана -P".
Было задано более одной выводной опции препроцессора.
D4007 "Опция -C игнорируется (нужно задать также -P или -E, либо
-EP)".
Опция /C должна использоваться вместе с одной из выводных
опций препроцессора (/E, /EP, /P).
D4009 "Порог только для данных far/huge, игнорируется".
Опция /Gt была использована в модели памяти, имеющей ближние
указатели на данные. Она может применяться только для ком-
пактной и большой моделей.
D4010 "Опция -Gp не применяется, игнорируется".
Версия операционной системы DOS Microsoft C не поддерживает
профайлинг.
D4013 "Комбинированный листинг имеет преимущество над объектным
листингом"
Если опция /Fc задана вместе с одной из опций /Fl или /Fa, соз-
дается комбинированный листинг (/Fc).
D4014 "Неверное значение number для строки 'string'. Используете ста-
ндартное значение number".
В контексте, требующем определенное числовое значение, было за-
дано некорректное значение.
D4017 "Конфликтующие опции проверки стэка-проверка стека отменяется".
Вы задали на командной строке CL обе опции /Ge и /Gs. Опция Gs
имеет преимущество, поэтому в данной программе стэковый конт-
роль отменяется.

D.3. Сообщения об ошибках периода выполнения.

Ошибки периода выполнения подразделяются на четыре категории: 1.Исключительные ситуации при выполнении операций с плавающей точкой математическим сопроцессором 8087/80287 или эмулятором. Данные ситуации описаны в Разделе D.3.1.

2. Сообщения об ошибках, сгенерированные библиотекой периода выполнения, информирующие вас о серьезных ошибках. Данные сообщения перечислены и описаны в Разделе D.3.2.

3. Сообщения об ошибках, сгенерированные во время обращения к процедурам обработки ошибок библиотеки периода выполнения — abort, assert, perror-как только программа вызовет процедуру. Данная процедура направляет сообщения в стандартный вывод. Описание данных процедур и соответствующих сообщений об ошибках смотрите в документе: «Справочное руководство по библиотеке процедур Microsoft-C».

4. Сообщения об ошибках, сгенерированные вызовами математических процедур из библиотеки СИ периода выполнения. В случае ошибки математические процедуры возвращают ошибочное значение, а некоторые выводят сообщение на стандартной вывод. Описание математических процедур и соответствующие сообщения об ошибках смотрите в документе «Справочное руководство по библиотеке проц Microsoft-C».

D.3.1. Исключительные ситуации операций с плавающей точкой.

Сообщения об ошибках, перечисленные ниже, генерируются математическим сопроцессором 8087/80287. Описание сбоев оборудования смотрите в документации по процессорам семейства Intel. Данные ошибки могут быть также выявлены эмулятором операций с плавающей точкой, встроенным в стандартную библиотеку Quick-C.

С помощью назначений управляющего слова сопроцессора 8087/80287, следующие исключительные ситуации маскируются и потому не происходят Исключительная Стандартное маскирующее действие

ситуация

Слишком малое число    Ситуация маскируется
Потеря значимости      Результат приводится к нулю
Потеря точности        Ситуация маскируется

Информацию о том, как изменить управляющее слово операций с плавающей точкой, смотрите в справочных страницах, посвященных _control87, в документе «Справочное руководство по библиотеке процедур Microsoft C».

Кроме того, следующие ошибки не возникают в коде, сгенерированном с помощью компилятора Microsoft Quick-C или полученном посредством стандартной СИ-библиотеки:

      Квадратный корень
Выход за нижнюю границу стэка
Неэмулируется

Исключительные ситуации при операциях с плавающей точкой имеют следующий формат:

      run-time error M61nn: MATH
- floating-point error: messagetext

Номер Исключительные ситуации при операциях с плавающей точкой

М6101 "Неверно".
Произошла некорректная операция. Обычно это происходит при дей-
ствиях с с неопределенностями.
Данная ошибка приводит к останову программы с кодом завершения
129.
Номер   Исключительные ситуации при операциях с плавающей точкой
М6102 "Слишком малое число".
Было сгенерировано слишком малое число с плавающей точкой, даль
нейшее его использование приведет к потере значимости. Такие
ситуации обычно маскируются, они отлавливаются и обрабатывают-
ся. Программа заканчивается с кодом завершения 130.
М6103 "Деление на нуль".
Была сделана попытка деления на нуль. Программа заканчивается
с кодом 131.
М6104 "Переполнение".
При выполнении операции с плавающей точкой произошло переполне-
ние. Программа заканчивается с кодом 132.
М6105 "Потеря значимости".
Во времы операции с плавающей точкой произошла потеря значимос-
ти. Такие ситуации обычно маскируются; слишком малое значение
заменяется нулем. Программа заканчивается с кодом завершения
133.
М6106 "Потеря точности".
Во время операции с плавающей точкой произошла потеря точности.
Данная ситуация обычно проходит незамеченной, поскольку почти
все операции с плавающей точкой могут привести к потере точнос-
ти. Программа заканчивается с кодом 134.
М6107 "Невозможна эмуляция"
Была сделана попытка выполнить инструкцию сопроцессора 8087/
/80287, являющуюся некорректной и не поддерживаемую эмулятором.
Программа завершается с кодом 135.
М6108 "Квадратный корень".
Операнд операции извлечения квадратного корня отрицателен. Про-
грамма завершается с кодом 136. (обратите внимание, функция
sqrt из библиотеки процедур языка СИ проверяет аргумент перед
выполнением и возвращает ошибку, если аргумент отрицателен;
описание функции sqrt смотрите в документе: "Справочное руко-
водствопо библиотеке процедур Microsoft-C":
М6110 "Переполнение стэка".
Выражение с плавающей точкой привело к переполнению стэка на
сопроцессоре 8087/80287 или эмуляторе. (ситуации переполнения
стэка отлавливаются до предела 7 уровней в дополнение к восьми
уровням, обычно поддерживаемым сопроцессором 8087/80287). Прог-
рамма завершается с кодом 138.
М6111 "Выход за нижнюю границу стэка".
Выполнение операции с плавающей точкой на сопроцессоре
8087/80287 или эмуляторе вызвало выход за нижнюю границу
стэка. Программа завершается с кодом 139.
М6112 "Явно сгенерирована ошибка".
Сигнал, означающий ошибку при выполнении операции с плавающей
точкой, был послан с помощью вызова raise (SIGFPE). Программа
завершается с кодом 140.

D.3.1. Сообщения об ошибках периода выполнения.

Следующие сообщения описывают ошибки, сгенерированные в процессе выполнения программы. Номера ошибок периода выполнения лежит в пределах от R6000 до R6999.

Сообщения об ошибках периода выполнения имеют следующую основную форму:

    run-time error R6nnn
- messagetext
(ошибка периода выполнения R6nnn)
(- текст сообщения)

Номер Сообщение об ошибке периода выполнения

R6000 "Переполнение стэка".
Ваша программа переполнила пространство, отведенное под стэк.
Это может произойти, если ваша программа использует большое
количество локальных данных или является рекурсивной. Программа
завершается с кодом 255.
Чтобы исправить данную ситуацию, перекомпилируйте программу с
помощью команды QCL с опцией /F и перекомпануйте программу, ис-
пользуя опцию компановщика /STACK для размещения большого стэка
R6001 "Присваивание нулевого указателя".
В процессе выполнения программы было изменено содержимое сег-
мента NULL. Сегмент NULL-это специальное место, расположенное
по младшим адресам памяти, которое обычно не используется. Ес-
ли содержимое сегмента NULL изменилось в процессе выполнения
программы, это означает, что программа была записана на эту об-
ласть, обычно, из-за примененного по небрежности нулевого ука-
зателя. Заметим, что ваша программа может содержать нулевые
указатели, но данное сообщение не будет генерироваться; данное
сообщение появляется только в случае обращения к области памяти
с помощью нулевого указателя
Данная ошибка не будет вызывать останов программы; за сообщени-
ем об ошибке следует нормальное завершение программы. Ошибка
возвращает ненулевой код завершения. Данное сообщение отражает
возможность серьезных ошибок в программе. Хотя программа, в ко-
торой возникла такая ошибка, может работать правильно, она ве-
роятно дает ошибки в будущем, и может дать сбой при работе в
другой операционной среде.
R6002 "Библиотека процедур операций с плавающей точкой не загружена".
Ваша программа требует библиотеку с плавающей точкой, но данная
библиотека не загружена. Программа завершается по ошибке с ко-
дом 255. Такая ошибка может произойти в следующих двух ситуа-
циях:
1.Программа была скомпилирована или скомпанована с такой опци-
ей, как /FPi87, требующей сопроцессор 8087 или 80287, но прог-
рамма выполняется на машине, не имеющей такого. Для исправления
ошибки либо перекомпилируйте программу с опцией /FPi, либо ус-
тановите сопроцессор. (В разделе 9.3.5 данного руководства вы
найдете более подробную информацию о данных опциях и билиоте-
ках.
2.Строка формата для одной из процедур семейства printf или
scanf содержит спецификацию для формата с плавающей точкой, в
то время, как значений или переменных с плавающей точкой в про-
грамме нет. Компилятор Quick-C делает попытку минимизировать
размер программы посредством загрузки библиотеки поддержки пла-
вающей точки только в случае крайней необходимости. Поскольку в
форматных строках не обнаружено спецификаций плавающей точки,
необходимые процедуры для работы с плавающей точкой не были за-
гружены. Для исправления данной ошибки используйте какой-либо
аргумент с плавающей точкой для соответствия заданной специфи-
кации формата. Это приведет к тому, что библиотека поддержки
плавающей точки будет загружена.
R6003 "Целое, деленное на нуль".
Была сделана попытка разделить целое число на нуль, что дало
неопределенный результат. Программа завершается с кодом 255.
R6004 "Требуется версия DOS 2.0 или выше".
Компилятор Quick-C не может работать на версиях операционной
системы DOS младше 2.0.
R6005 "Не хватает памяти для exec".
Ошибки с R6005 по R6007 происходят при сбое в процедурах, вызы-
ваемых одной из библиотечных, когда операционная система DOS не
может вернуть управление в родительский процесс. Данная ошибка
показывает, что для загрузки вызываемой программы не хватает
памяти.
R6006 "Неверный формат для exec".
Файл, выполняемый одной из функций exec, не имеет формата, тре-
буемого для выполняемого файла.
R6007 "Некорректная среда для exec".
Во время вызова одной из функций exec, операционная система DOS
обнаружила некорректность среды для детского процесса.
R6008 "Не хватает памяти для аргументов".
R6009 "Не хватает памяти для программной среды".
Ошибки R6008 и R6009 могут произойти при старте программы, если
для загрузки программы хватает памяти, но недостаточно места
для вектора argv, либо вектора envp, либо для обоих. Чтобы
избежать данной проблемы перепишите процедуры _setargv или
_setenvp
R6012 "Некорректное обращение к ближнему указателю".
В программе был использован нулевой ближний указатель.
Данная ошибка может произойти только при включенном контроле на
указатели (то есть, если программа была скомпилирована с опцией
Pointer Check в диалоговой рамке Compile, опцией /Zr на команд-
ной строке, либо при действующей прагме pointer_check).
R6015 "Неожидаемое прерывание".
Программа не может выполняться, поскольку она содержит неожида-
емые прерывания.
Когда прерывания создаются в программе из программного списка,
работающей в программной среде, Quick-C автоматически создает
объектные файлы и передает компановщику. Объектные файлы, пере-
данные компановщику, содержат прерывания , требуемые для про-
граммной среды Quick-C. Однако, вы не сможете запускать програ-
мму, полученную из данных объектных файлов, вне программной
среды Quick-C.

D.3.3. Ограничения периода выполнения.

В таблице D.2 приведены ограничения, накладываемые на программы в период выполнения. Если ваша программа нарушает одно из данных ограничений, система выдает соответствующее сообщение об ошибке.

                                                 Таблица D.2.
Программные ограничения периода выполнения.
Элемент данных   Описание                            Ограничения
Файлы            Максимальный размер файла           232-1 байт
(4 гигабайта)
Максимальное число одновременно от-  20
крытых файлов (потоков).
Командная строка Максимальное количество символов     128
(включая имя программы).
Таблица операци- Максимальный размер.                  32К
онной среды.

Примечание:

Пять стандартных потоков открываются автоматически (stdin, stdout, stderr, stdaux, stdprn), оставляя еще 15 потоков для нужд программы.


D.4. Сообщения об ошибках компановщика.

Данный раздел описывает сообщения об ошибках, генерируемые компановщиком LINK (Оверлейный компановщик фирмы Microsoft). При возникновении фатальной ошибки компановщик прерывает выполнение. Сообщения о фатальных ошибках имеют следующий формат:

место возникновения: fatal error L1xxx: текст сообщения Нефатальные ошибки выявляют проблемы в выполняемом файле. Компановщик LINK строит выполняемый файл. Нефатальные ошибки имеют следующий формат:

место возникновения: error L2xxx: текст сообщения

Предупреждения также обозначают возможные проблемы в выполняемом файле. Компановщик LINK строит выполняемый файл. Предупреждения имеют следующий формат:

место возникновения: warning L4xxx: текст сообщения

В данных сообщениях-место возникновения-это входной файл, в котором обнаружена ошибка, либо программа LINK, если входного файла нет. Если входной файл-это файл .OBJ или .LIB и известно имя модуля, имя модуля заключается в скобки, как показано в следующем примере:

SLIBC.LIB( file)
MAIN.OBJ(main.c)
TEXT.OBJ

Ошибки компановщика могут возникнуть, как при неявном его вызове с помощью команды QCL, так и при явном вызове с помощью команды LINK. Они могут также произойти и при компиляции программы, имеющей программный список, либо когда вы создаете на диске выполняемый файл в среде Quick-C. Если ошибка компановщика возникает в программной среде Quick-C, Quick-C высвечивает сообщение:

Error during link phase
No .EXE file produced
(Ошибка в процессе компановки
Выполняемого файла не создается).

Для просмотра ошибок компановщика нажмите ENTER, либо отметьте «мышью» командную кнопку OK. Ошибки последнего прохода компановщика хранятся в файле с именем LINK.ERR. В следующем списке приведены ошибки, возникающие во время компановки объектных файлов с помощью Microsoft Overlay Linker, LINK.

Номер    Сообщение об ошибке компановщика
L1001 "'option': имя опции неясно".
После индикатора опции (/) не появилось уникального имени оп-
ции. Например, команда
Link /N main;
сгенерирует ошибку, поскольку программа LINK не может опреде-
лить, какая из опций, начинающихся на букву "N" имеется в виду.
L1002 "'option': нераспознанное имя опции".
За индикатором опции (/) появился нераспознанный символ, как в
следующем примере:
LINK /ABCDEF main;
L1004 "'option': неверное числовое значение".
Для одной из опций было задано некорректное числовое значение.
Например, для опции, требующей числовое значение, задана сим-
вольная строка.
L1006 "'option': размер стэка превышает 65535 байтов".
Размер, определенный для стэка, превышает 65535 байтов.
l1007 "'option': номер прерывания превышает 255".
В качестве значения опции /OVERLAYINTERRUPT задано число, более
255.
l1008 "'option': слишком большое предельное число сегментов".
Было установлено предельное число сегментов, большее 3072 ( с
помощью опции /SEGMENTS).
L1009 "'option': CPARMAXALLOC: некорректное значение".
Число, определенное в опции /CPARMAXALLOC не лежит в пределах
1-65535.
L1020 "Не заданы объектные модули".
Для компановщика не заданы имена объектных файлов.
L1021 "Файлы соответствий вкладывать невозможно".
Один файл соответствий оказался внутри другого файла соответст-
вий.
L1022 "Файл соответствий слишком длинный".
Строка в файле соответствий длиннее 127 символов.
L1023 "Выполнение прекращено пользователем".
Вы нажали CONTROL+C.
L1024 "Вложение правых скобок".
В командной строке содержимое оверлея было написано некоррекн-
но.
L1025 "Вложение левых скобок".
В командной строке содержимое оверлея было написано некоррекн-
но.
L1026 "Несоответствие правых скобок".
В командной строке в спецификации содержимого оверлея пропуще-
на правая скобка.
L1027 "Несоответствие левых скобок".
В командной строке в спецификации содержимого оверлея пропуще-
на левая скобка.
L1043 "Таблица распределения памяти переполнена".
В программе задано более 32768 длинных вызовов, длинных перехо-
дов, либо других длинных указателей.
Попытайтесь заменить длинные ссылки короткими, если возможно, и
перестроить объектный модуль
L1045 "Слишком много записей TYPDEF.
Объектный модуль содержит более 255 записей TYPDEF. Данные за-
писи описывают общие переменные. Такая ошибка может возникнуть
только в программах, созданных компилятором Microsoft Quick-C
или другими компиляторами, поддерживающими общие переменные.
(TYPDEF-это термин операционной системы DOS. Он разъясняется в
документе "Справочное руководство программиста по операционной
системе MS-DOS фирмы Microsoft" или других справочных книг по
DOS.)
L1046 "Слишком много внешних имен в одном модуле".
В объектном модуле определено более 1023 внешних имен. Разбейте
модуль на меньшие части.
L1047 "Слишком много имен групп, сегментов, классов в одном модуле".
Программа содержит слишком много имен групп, сегментов, клас-
сов. Сократите число групп, сегментов или классов и перестройте
объектный файл.
L1048 "Слишком много сегментов в одном модуле".
Объектный модуль имеет более 255 сегментов. Расщепите модуль
или объедините сегменты.
L1049 "Слишком много сегментов".
Программа имеет более, чем максимально разрешенное число сег-
ментов. (опция /SEGMENTS определяет максимально разрешенное
число; стандартно 128).
Повторите компановку с опцией /SEGMENTS с соответствующим чис-
лом сегментов.
L1050 "Слишком много групп в одном модуле".
Программа LINK обнаружила более 21 определения групп (GRPDEF) в
одном модуле.
Сократите число определений групп или расщепите модуль. (Опре-
деления групп разъясняются в документе "Справочное руководство
программиста по MS-DOS" и в других справочных книгах по DOS.
L1051 "Слишком много групп".
В программе определено более 20 групп, не считая DGROUP.
Сократите количество групп.
L1052 "Слишком много библиотек".
Была сделана попытка скомпановать более 32 библиотек.
Объедините библиотеки, либо используйте модули, требующие мень-
шего количества библиотек.
L1053 "Переполнение таблицы имен".
Компановщик не имеет достаточно места для размещения таблицы
имен программы (таких, как глобальные, внешние, имена сегмен-
тов, групп, классов, файлов).
Объедините модули или сегменты и перестройте объектные файлы.
Исключите столько глобальных имен, сколько возможно.
L1054 "Требуемое количество сегментов слишком велико".
Компановщик не имеет достаточно памяти для размещения таблицы,
описывающей количество требуемых сегментов (стандартное число
128 или значение, определенное в опции /SEGMENTS). Повторите
компановку снова, используя опцию /SEGMENTS для задания меньше-
го количества сегментов (например, 64, если ранее было исполь-
зовано стандартное значение), либо освободите некоторое коли-
чество памяти путем удаления резидентных программ или паралле-
льных задач.
L1056 "Слишком много оверлеев".
В программе определно более 63 оверлеев.
L1057 "Запись данных слишком велика".
Запись LIDATA (в объектном модуле) содержит более 1024 байтов
данных. Это ошибка транслятора. (LIDATA-это термин операционной
системы DOS, его объяснение можно найти в документе "Справочное
руководство программиста по MS-DOS фирмы Microsoft" или в дру-
гих справочных книгах по DOS.
Обратите внимание, какой транслятор (компилятор или ассемблер)
построил некорректный объектный модуль и при каких обстоятель-
ствах. Пожалуйста, сообщите о данной ошибке, используя форму
Product Assistance Request, находящуюся в конце данного руко-
водства.
L1070 "'name': размер сегмента превышает 64К".
Заданный сегмент содержит более 64К кода или данных.
Повторите компиляцию и компановку в большой модели памяти.
L1071 "Сегмент _TEXT больше 65520 байтов".
Данная ошибка вероятнее всего может случиться только в СИ-прог-
раммах малой модели памяти, однако она может произойти и, если
любая программа с сегментом, названным _TEXT, компануется пос-
редством команды LINK с опцией /DOSSEG. Программы на языке СИ
малой модели памяти должны резервировать адреса кода 0 и 1; для
целей выравнивания этот предел увеличивается до 16.
L1072 "Общая область больше 65536 байтов".
Программа имеет более 64 общих переменных. Данная ошибка не мо-
жет возникнуть в объектных файлах, сгенерированных с помощью
Макроассемблера MASM (Microsoft Macro Assembler). Она возникает
только в программах, полученных с помощью компилятороа, поддер-
живающих общие переменные.
L1080 "Невозможно открыть файл-листинг".
Диск или корневой каталог переполнены. Удалите или переместите
файлы, чтобы освободить место.
L1081 "Переполнение при записи выполняемого файла".
Диск, на который записывается выполняемый файл .EXE, переполнен
Освободите место на диске и повторите компановку.
L1083 "Невозможно открыть выполняемый файл".
Диск или корневой каталог переполнены. Удалите или переместите
файлы, чтобы освободить место.
L1084 "Невозможно создать временный файл".
Диск или корневой каталог переполнены. Освободите место на
диске и повторите компановку.
L1085 "Невозможно открыть временный файл".
Диск или корневой каталог переполнены. Удалите или переместите
файлы, чтобы освободить место.
L1086 "Не хватает временного файла".
Заметьте обстоятельства возникновения данной ситуации и свяжи-
тесь с фирмой Microsoft Corporation, воспользовавшись формой
"Product Assitance Request", находящейся в конце данного руко-
водства.
L1087 "Неожиданный конец временного файла".
Диск с временным выходным файлом компановщика удален.
L1088 "Переполнение при записи файла-листинга".
При записи на диск файла-листинга диск переполнился. Освободите
место на диске и повторите компановку.
L1089 "'filename': невозможно открыть файл соответствий".
Программа LINK не может найти заданный файл соответствий. Обыч-
но, это опечатка при задании имени файла.
L1090 "Повторно открыть файл-листинг невозможно"
По запросу оригинальный диск не был заменен. Повторите компа-
новку.
L1091 "Неожиданный конец файла в библиотеке".
Диск, содержащий библиотеку, был вероятно, удален. Установите
диск, содержащий библиотеку и повторите компановку.
L1093 "'filename':объектный файл не найден".
Компановщик не может найти заданного объектного файла. Задайте
правильное имя объектного файла и повторите компановку.
L1101 "Некорректный объектный модуль".
Один из объектных модулей является некорректным. Если данная
ошибка произошла после перекомпиляции, пожалуйста, свяжитесь с
фирмой Microsoft Corporation, воспользовавшись формой "Product
Assitance Request", приложенной в конце данного руководства.
L1102 "Неожиданный конец файла".
Для библиотеки был обнаружен некорректный формат.
L1103 "Попытка обращения к данным, лежащим за границами сегмента".
Заданная запись в объектном модуле продолжена за границы сег-
мента. Это ошибка транслятора. Заметьте, какой транслятор (ком-
пилятор или ассемблер) создал некорректный объектный модуль, и
обстоятельства, в которых он был создан. Пожалуйста, сообщите
о данной ситуации в фирму Microsoft Corporation, воспользовав-
шись формой "Product Assistance Request", находящейся в конце
данного руководства.
L1104 "'filename': некорректная библиотека".
Заданный файл не является корректным библиотечным файлом. Дан-
ная ошибка прекращает работу программы LINK.
L1113 "Неразрешенная COMDEF; системная ошибка".
Заметьте обстоятельства возникновения данного сбоя и свяжитесь
с фирмой Microsoft Corporation, воспользовавшись формой Product
Assistance Request, находящейся в конце данного руководства.
L1114 "Файл не подходит для /EXEPACK; повторите компановку без опции
/EXEPACK".
В компануемой программе размер упакованного загружаемого обра-
за плюс заголовок больше, чем неупакованный загружаемый образ.
Повторите компановку с помощью опции /EXEPACK.
L2001 "Запись fixup без данных".
Запись FIXUPP не имеет непосредственно предшествующей записи
данных. Вероятно, это ошибка компилятора. (Подробности о
FIXUPP смотрите в документе "Справочное руководство программис-
та по MS-DOS фирмы Microsoft").
L2002 "Переполнение записи fixup при "ближнем" вызове 'number'
frame seg 'segname'
target seg 'segname'
target offset 'number'"
Данную ошибку могут вызвать следующие условия:
-Программа компилируется в малой модели памяти с опцией /NT.
-Группа больше 64К.
-Программа содержит междусегментные короткие переходы или меж-
дусегментные короткие вызовы.
-Имя элемента данных в программе не соответствует процедуре из
библиотеки процедур, подключенной к компановке.
-Объявление EXTRN в исходном файле на яхыке ассемблер появилось
в теле сегмента, как в следующем примере:
code    SEGMENT public 'CODE'
EXTRN   main:far
start   PROC    far
call    main
ret
start   ENDP
code    ENDS
Предпочтительна следующая конструкция:
EXTRN   main:far
code    SEGMENT public 'CODE'
start   PROC    far
call    main
start   ENDP
code    ENDS
Перепишите исходный файл и перестройте объектный файл. (Подроб-
ную информация о frame segment и target segment вы найдете в
документе "Справочное руководство программиста по MS-DOS фирмы
Microsoft".)
L2003 "Дальний вызов на данные собственного сегмента".
Дальние вызовы на данные собственного сегмента не разрешаются.
L2005 "Тип fixup не поддерживается".
Оказалось, что тип fixup не поддерживается компановщиком фирмы
Microsoft. Вероятно, это ошибка компилятора. Обратите внимание
на обстоятельства данной ошибки и сообщите их в фирму Microsoft
Corporation, воспользовавшись формой "Product Assistance
Request", находящейся в конце данного руководства.
L2012 "'name': несоответствие размера элемента массива".
"Дальний" общий массив был описан с двумя или более различны-
ми размерами элементов массива (например, первый раз массив был
описан, как массив символов, а второй раз, как массив дейст-
вительных чисел).
L2013 "Запись LIDATA слишком велика".
Запись LIDATA в объектном модуле имеет размер более 512 байтов,
максимально разрешенного размера. Это ошибка компилятора. По-
жалуйста, сообщите об условиях возникновения данной ошибки в
фирму Microsoft, воспользовавшись формой "Product Assistance
Request" в конце данного руководства.
L2024 "'name': имя уже определено".
Одно из специальных оверлейных имен, требуемое для поддержки
оверлеев, было определено в объектном файле.
L2025 "'name': имя определено более одного раза".
Удалите из объектного файла лишние определения имен.
L2029 "Неразрешенные внешние ссылки".
В одном или более модулей одно или более имен описаны, как
внешние, но они не были определены, как публичные ни в одном из
модулей или библиотек. После сообщения появляется список нераз-
решенных внешних ссылок, как показано в следующем примере:
EXIT in file(s):
MAIN.OBJ (main.for)
OPEN in file(s):
MAIN.OBJ (main.for)
Имя, которое идет перед 'in file(s)'-это неразрешенное внешнее
имя. На следующей строке-список объектных модулей, имеющих ссы-
лки на данное имя. Это сообщение и список записываются также в
файл карты распределения памяти, если он существует.
L2041 "Стэк плюс данные превышает 64К".
Общий размер стэкового сегмента программы плюс DGROUP превышает
64К; в результате, программа загружается неверно.
L2043 "Стартовый адрес__ aulstart не найден".
Если вы строите библиотеку Quick с использованием опции /Q,
компановщик требует имя __aulstart, определенное, как стар-
товый адрес.
L4003 "Неразрешенный вызов: смещение offset".
Данная ошибка может быть вызвана компиляцией программы в малой
модели памяти с опцией /NT.
L4012 "Опция /HIGH отменяет /EXEPACK".
Опции /HIGH и /EXEPACK не могут быть использованы одновременно.
L4015 "Опция /CODEVIEW отменяет /DSALLOCATE".
Опции /CODEVIEW и /DSALLOCATE не могут быть использованы одно-
временно.
L4016 "Опция /CODEVIEW отменяет /EXEPACK".
Опции /CODEVIEW и /EXEPACK не могут быть использованы одно-
временно.
L4020 "'name': размер сегмента кода превышает 65500".
Сегмент кода размером 65501-65536 байтов в длину может на про-
цессоре Intel 80286 быть обработан некорректно.
L4021 "Нет стэкового сегмента".
Программа не имеет стэкового сегмента, определенного с типом
STACK. Данное сообщение не возникнет при обработке модулей,
скомпилированных с помощью компилятора Microsoft Quick-C, но не
с помощью Макроассемблера.
Обычно, каждая программа должна иметь стэковый сегмент с типом
объединения STACK. Если у вас есть особые причины не определять
стэк или определить его без типа объединения STACK, вы можете
проигнорировать данное сообщение. Данное сообщение может быть
получено и при компановке с помощью LINK версий 2.40 и младше,
поскольку данные компановщики просматривают библиотеки только
один раз.
L4031 "'name': сегмент описан более, чем в одной группе".
Сегмент был описан, как член двух различных групп. Исправьте
исходный файл и перестройте объектные файлы.
L4034 "Более 239 оверлейных сегментов; лишние помещены в корень".
В оверлеях не может быть объявлено более 239 кодовых сегментов.
Все сегменты свыше данного предела помещаются в корень.
L4045 "Имя выходного файла 'name'".
Компановщик высветил в запросе "Run file" стандартное выходное
имя файла, но поскольку была использована опция /Q, имя выход-
ного файла было изменено.
L4050 "Слишком много глобальных имен".
Для получения отсортированного списка глобальных имен в файле
распределения памяти была использована опция /MAP, но задано
для сортировки слишком много имен (более 2048 имен по умолча-
нию). Повторите компановку с опцией /MAP:number. Компановщик
выдает неотсортированный список глобальных имен.
L4051 "'filename': невозможно найти библиотеку".
Компановщик не может найти заданный файл. Введите новое имя,
новую спецификацию маршрута, или и то, и другое.
L4053 "VM.TMP: некорректное имя файла; игнорируется".
Имя VM.TMP появилось, как объектное имя файла. Переименуйте
файл и повторите компановку.
L4054 "'filename': невозможно найти файл".
Компановщик не может найти заданный файл. Введите новое имя
файла, новую спецификацию маршрута, либо и то, и другое.

D.5.Сообщения об ошибках утилиты LIB.

Сообщения об ошибках, сгенерированные администратором библиотек, программой LIB, имеет один из следующих форматов:

    {filename|LIB}: fatal error U1xxx: текст сообщения
{filename|LIB}: error U2xxx: текст сообщения
{filename|LIB}: warning U4xxx: текст сообщения

Сообщение начинается именем входного файла (filename), если он существует, либо именем утилиты. Если возможно, программа LIB распечатывает предупреждение и продолжает работу. В некоторых случаях ошибки неисправимы и утилита LIB прекращает работу. Утилита LIB может высветить следующие сообщения:

Номер    Сообщения об ошибках утилиты LIB
U1150 "Размер страницы слишком мал".
Размер страницы входной библиотеки слишком мал, что означает
некорректный входной файл .LIB.
U1151 "Синтаксическая ошибка: неверная спецификация файла".
Командный оператор, такой как знак минус(-) был задан без соот-
ветствующего имени модуля.
U1152 "Синтаксическая ошибка: наименование опции опущено".
Знак опции слэш (/) был задан без следующей за ним опции.
U1153 "Синтаксическая ошибка: значение опции пропущено".
Опция /PAGESIZE была задана без соответствующего значения.
U1154 "Неизвестная опция".
Была задана неизвествная опция. В данный момент программа LIB
распознает только опции /PAGESIZE.
U1155 "Синтаксическая ошибка: некорректный ввод".
Данная команда не следует правильному синтаксису утилиты LIB,
описанному в Главе 10, "Создание библиотек Quick и автономных
библиотек".
U1156 "Синтаксическая ошибка".
Данная команда не следует правильному синтаксису утилиты LIB,
описанному в Главе 10, "Создание библиотек Quick и автономных
библиотек".
U1157 "Пропущена запятая или символ перехода на новую строку".
В командной строке ожидалась запятая или возврат каретки, кото-
рые не появились. Это может означать нечаянно поставленную
запятую, как в следующей строке:
LIB math.lib, -mod1+mod2;
Эта строка должна иметь следующий вид:
LIB math.lib -mod1+mod2;
U1158 "Пропущен возврат каретки".
Либо ответ на запрос "Output library", либо последняя строка в
файле соответствий, используемого для запуска программы LIB, не
заканчивается возвратом каретки.
U1161 "Невозможно переименовать старую библиотеку".
Программа LIB не может переименовать старую библиотеку с рас-
ширением .BAK, поскольку версия .BAK уже существует с защитой
"только-чтение". Измените защиту старой версии .BAK.
U1162 "Невозможно повторно открыть библиотеку".
Старая библиотека не может быть повторно открыта после того,
как она была переименована с расширением .BAK.
U1163 "Ошибка при записи файла перекрестных ссылок".
Диск или корневая директория переполнены. Удалите или переком-
пилируйте файлы, чтобы освободить место.
U1170 "Слишком много имен".
В библиотечном файле появилось более 4609 имен.
U1171 "Не хватает памяти".
Программе LIB не хватает памяти для работы. Удалите параллель-
ные и резидентные программы и повторите попытку, либо увеличьте
память.
U1172 "Не хватает виртуальной памяти".
Заметьте обстоятельства данного сбоя и уведомите фирму
Microsoft Corporation, воспользовавшись формой "Product
Assistance Request", находящейся в конце данного руководства.
U1173 "Системный сбой".
Обратите внимание на обстоятельства данного сбоя и уведомите
фирму Microsoft Corporation, воспользовавшись формой "Product
Assistance Request", находящейся в конце данного руководства.
U1174 "mark: не размещено".
Заметьте обстоятельства данного сбоя и уведомите фирму
Microsoft Corporation, воспользовавшись формой "Product
Assistance Request", находящейся в конце данного руководства.
U1175 "free: не размещено".
Заметьте обстоятельства данного сбоя и известите фирму
Microsoft Corporation, воспользовавшись формой "Product
Assistance Request", находящейся в конце данного руководства.
U1180 "Запись извлекаемого файла потерпела неудачу".
Диск или корневой каталог переполнены. Удалите или перемес-
тите файлы, чтобы освободить место.
U1181 "Запись в библиотечный файл потерпела неудачу".
Диск или корневой каталог переполнены. Удалите или перемес-
тите файлы, чтобы освободить место.
U1182 "'filename': невозможно создать извлекаемый файл".
Диск или корневой каталог переполнены, либо заданный извлекае-
мый файл уже существует с защитой "только-чтение".
Освободите место на диске, либо измените вид защиты файла.
U1183 "Невозможно открыть файл соответствий".
Данный файл соответствий не найден.
U1184 "Неожиданный конец файла при вводе команды".
В ответе на запрос был обнаружен символ конца файла.
U1185 "Невозможно создать новую библиотеку".
Диск или корневой каталог переполнены, либо библиотечный файл
уже существует с защитой "только-чтение". Освободите место на
диске или измените атрибуты защиты библиотечного файла.
U1186 "Ошибка при записи новой библиотеки".
Диск или корневой каталог переполнены. Удалите или переместите
файлы для освобождения места.
U1187 "Невозможно открыть VM.TMP".
Диск или корневой каталог переполнены.
U1188 "Невозможно записать в VM".
Отметьте обстоятельства возникновения данного сбоя и сообщите
в фирму Microsoft Corporation, воспользовавшись бланком
"Product Assistance Request", находящейся в конце данного руко-
водства.
U1189 "Невозможно прочесть из VM".
Обратите внимание на обстоятельства возникновения данной ошибки
и сообщите в фирму Microsoft Corporation, воспользовавшись
бланком "Product Assistance Request", находящейся в конце
данного руководства.
U1190 "Прервано пользователем".
Вы прервали работу программы LIB до завершения работы.
U1200 "'name': некорректный заголовок библиотеки".
Входной библиотечный файл имеет неправильный формат. Он либо не
является библиотечным файлом, либо разрушен.
U1203 "'name': некорректный объектный модуль по ближнему адресу".
Модуль, заданный по имени 'name', является некорректным объект-
ным модулем.
U2152 "'filename': невозможно создать листинг".
Диск или каталог переполнены, либо файл перекрестных ссылок
уже существует с защитой "только-чтение".
Освободите место на диске, либо измените атрибуты файла.
U2155 "'modulename': модуль не найден в библиотеке; игнорируется".
Заданный модуль не найден во входной библиотеке
U2157 "'filename': невозможно получить доступ к файлу".
Программа LIB не могла открыть заданный файл.
U2158 "'libraryname': неверный заголовок библиотеки; файл игнориру-
ется".
Входная библиотека имеет некорректный формат.
U2159 "'filename': неверный формат 'hexnumber'; файл игнорируется".
Опознавательный байт слова 'hexnumber' данного файла не имеет
одного из следующих распознаваемых типов:
библиотека Microsoft, библиотека Intel, объектный файл Micro-
soft, архив XENIX.
U4150 "'modulname': переопределение модуля игнорируется".
Модуль был определен для добавления в библиотеку, но модуль с
тем де именем уже есть в библиотеке. Либо, модуль с одним и тем
же именем помещен в библиотеку дважды.
U4151 "'symbol (modulename): переопределение имени игнорируется".
Заданное имя определено более, чем в одном модуле.
U4153 "'number': размер страницы слишком мал; игнорируется".
Значение, определенное в опции /PAGESIZE меньше 16.
U4156 "'libraryname': спецификация выходной библиотеки игнорируется".
В дополнение к новому библиотечному имена была задана выходная
библиотека.
Например, задав:
LIB new.lib+one.obj, new.lst,new.lib
где new.lib еще не существует-вы получите ошибку.

D.6. Сообщения об ошибках утилиты MAKE.

Ошибки, высвечиваемые в процессе работы утилиты поддержки программ Microsoft (MAKE) имеют один из следующих форматов:

    {filename|MAKE}: fatal error U1xxx: текст сообщения
{filename|MAKE}: warning U4xxx: текст сообщения

Сообщения начинаются с имени входного файла (filename), если он существует, либо с имени утилиты. Если возможно, утилита MAKE печатает предупреждение и продолжает работу. В некоторых случаях ошибки являются неисправимыми и утилита MAKE прекращает работу. Сообщения, генерируемые утилитой MAKE, перечислены в данном разделе.

Номер  Сообщения об ошибках утилиты MAKE
U1001 "Макроопределение больше, чем number".
Было определено макро, имеющее значение строки, длинее установ-
ленного числа, разрешающего максимальную длину. Попытайтесь пе-
реписать файл описанний утилиты MAKE и расщепить макро на два
меньших.
U1002 "Бесконечно рекурсивное макро".
Был определен циклический вызов макрокоманд, как в следующем
примере:
A=$(B)
B=$(C)
C=$(A)
U1003 "Выход за пределы памяти".
Во время обработки файла описаний утилита MAKE вышла за пределы
памяти. Попытайтесь сократить размер файла описаний утилиты
MAKE путем его реорганизации или расщепления на меньшие.
U1004 "Синтаксическая ошибка: пропущено имя макрокоманды".
Файл описаний утилиты MAKE содержит макроопределение без левой
части (то есть строки, начинающейся с =).
U1005 "Синтаксическая ошибка: пропущено двоеточие".
В строке, которая должна содержать выходной файл/входной файл,
не хватает двоеточия, разделяющего выходной файл и входной
файл. Утилита MAKE требует любую строку, за которой следует
пустая строка, чтобы считать ее строкой выходного/входного фай-
ла.
U1006 "'targetname': макрорасширение больше числа 'number'".
Макрорасширение плюс длина любой строки, с которой оно может
быть объединено, длинее установленного числа. Попытайтесь пере-
записать файл описаний утилиты MAKE, расшепив макро на два ме-
ньших.
U1007 "Много источников".
Правило вывода были определено более одного раза.
U1008 "'name': невозможно найти файл или каталог".
Заданные файл или каталог не могут быть найдены.
U1009 "'command': список аргументов слишком длинный".
Командная строка в файле описаний утилиты MAKE длиннее 128 бай-
тов, что максимально разрешено в DOS. Перепишите команды, чтобы
сделать список аргументов короче.
U1010 "'filename': отказ доступа".
Файл, определенный, как 'filename'-имеет атрибут "только-чте-
ние.
U1011 "'filename': не хватает памяти".
Для выполнения программы утилите MAKE не хватает памяти.
U1012 "'filename': неизвестная ошибка".
Заметьте обстоятельства возникновения данной ошибки и сообщите
о них фирме Microsoft Corporation, воспользовавшись бланком
"Product Assistance Request", данным в конце данного руко-
водства.
U1013"'command': ошибка errcode".
Одна из программ или команд, вызванная в файле описаний утилиты
MAKE, завершилась с ненулевым кодом завершения.
U1015 "'file': целевой файл не существует".
Обычно, это не означает ошибку. Данное сообщение предупреждает
пользователя о том, что целевой файл не существует. Утилита
MAKE выполняет любые команды, заданные в блоке описаний, поско-
льку в большинстве случаев выходной файл создается последней
командой файла описаний утилиты MAKE.
U4000 "'filename': не существует".
Обычно, это сообщение не свидетельствует об ошибке. Оно пре-
дупреждает пользователя о том, что указанный файл не существует
MAKE выполняет все команды, заданные в блоке, так как в боль-
шистве случаев отсутствующий файл будет создан последующими
командами файла MAKE.
U4001 "Зависимый файл 'filename' не существует; целевой файл 'filena
me' не строится".
Утилита MAKE не может продолжать, поскольку требуемый входной
файл не существует. Удостоверьтесь, что все имена файлов при-
сутствуют и что все они корректно описываются в файле описаний
утилиты MAKE.
U4013 "'command': ошибка errcode (игнорируется)".
Одна из программ или команд, вызванных в файле описаний утилиты
MAKE, возвратила ненулевой код ошибки, в то время, как утилита
MAKE работала с опцией /I. Ошибки игнорируются и утилита про-
должает работу.
U4014 "Синтаксис: make options [name-value...] file options=[/n]
[/d][/i][/s][/x file]
Утилита MAKE была неправильно вызвана. Стартуйте утилиту зано-
во, воспользовавшись синтаксисом, представленным в сообщении:
make опции[имя-значение...] file опции=[/n][/d][/i][/s]
[/x file].

Одна из самых неприятных ошибок — это ошибка компиляции для платы Аrduino Nano, с которой вам придется столкнуться не раз.

Содержание

  • Синтаксические ошибки
  • Ошибки компиляции плат Arduino uno
  • Ошибка exit status 1 при компиляции для плат uno, mega и nano
  • Ошибки библиотек
  • Ошибки компилятора Ардуино
  • Основные ошибки
    • Ошибка: «avrdude: stk500_recv(): programmer is not responding»
    • Ошибка: «a function-definition is not allowed here before ‘{‘ token»
    • Ошибка: «No such file or directory  /  exit status 1»
    • Ошибка: «expected initializer before ‘}’ token  /  expected ‘;’ before ‘}’ token»
    • Ошибка: «… was not declared in this scope»

Синтаксические ошибки

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

Сразу же при покупке они получают готовый набор библиотек на С99 и возможность, по необходимости, подтянуть необходимые модули в опен-соурс источниках.

Но и здесь не избежать множества проблем, с которыми знаком каждый программист, и одна из самых неприятных – ошибка компиляции для платы Аrduino nano, с которой вам придется столкнуться не раз. Что же эта строчка означает, какие у неё причины появления, и главное – как быстро решить данную проблему?

Для начала стоит немного окунуться в теорию, чтобы вы понимали причину возникновения данной строчки с текстом и не грешили лишний раз, что Ардуино уно не видит компьютер.

Как несложно догадаться, компиляция – приведение кода на языке Си к виду машинного (двоичного) и преобразование множественных функций в простые операции, чтобы те смогли выполняться через встроенные операнды процессора. Выглядит всё достаточно просто, но сам процесс компиляции происходит значительно сложнее, и поэтому ошибка во время проведения оной может возникать по десяткам причин.

Все мы уже привыкли к тому, что код никогда не запускается с первого раза, и при попытке запустить его в интерпретаторе вылезает десяток ошибок, которые приходится оперативно править. Компилятор действует схожим образом, за исключением того, что причины ошибок указываются далеко не всегда. Именно поэтому рекомендуется протестировать код сначала в среде разработки, и лишь затем уже приступать к его компиляции в исполняемые файлы под Ардуино.

Мы узнали, к чему приводит данный процесс, давайте разберёмся, как он происходит:

  1. Первое, что делает компилятор – подгружает все инклуднутые файлы, а также меняет объявленные дефайны на значения, которое для них указано. Это необходимо затем, чтобы не нужно было по нескольку раз проходиться синтаксическим парсером в пределах одного кода. Также, в зависимости от среды, компилятор может подставлять функции на место их объявления или делать это уже после прохода синтаксическим парсером. В случае с С99, используется второй вариант реализации, но это и не столь важно.
  2. Далее он проверяет первичный синтаксис. Этот процесс проводится в изначальном компилируемом файле, и своеобразный парсер ищет, были ли описаны приведенные функции ранее, подключены ли необходимые библиотеки и прочее. Также проверяется правильность приведения типов данных к определенным значениям. Не стоит забывать, что в С99 используется строгая явная типизация, и вы не можете засунуть в строку, объявленную integer, какие-то буквенные значения. Если такое замечается, сразу вылетает ошибка.
  3. В зависимости от среды разработки, иногда предоставляется возможность последний раз протестировать код, который сейчас будет компилироваться, с запуском интерпретатора соответственно.
  4. Последним идет стек из различных действий приведения функций, базовых операнд и прочего к двоичному коду, что может занять какое-то время. Также вся структура файлов переносится в исполняемые exe-шники, а затем происходит завершение компиляции.

Как можно увидеть, процесс не так прост, как его рисуют, и на любом этапе может возникнуть какая-то ошибка, которая приведет к остановке компиляции. Проблема в том, что, в отличие от первых трех этапов, баги на последнем – зачастую неявные, но всё ещё не связанные с алгоритмом и логикой программы. Соответственно, их исправление и зачистка занимают значительно больше времени.

А вот синтаксические ошибки – самая частая причина, почему на exit status 1 происходит ошибка компиляции для платы Аrduino nano. Зачастую процесс дебагинга в этом случае предельно простой.

Вам высвечивают ошибку и строчку, а также подсказку от оператора EXCEPTION, что конкретно не понравилось парсеру. Будь то запятая или не закрытые скобки функции, проблема загрузки в плату Аrduino возникнет в любом случае.

Решение предельно простое и логичное – найти и исправить непонравившийся машине синтаксис. Зачастую такие сообщения вылезают пачками, как на этапе тестирования, так и компилирования, поэтому вы можете таким образом «застопорить» разработку не один раз.

Не стоит этого страшиться – этот процесс вполне нормален. Все претензии выводятся на английском, например, часто можно увидеть такое: was not declared in this scope. Что это за ошибка arduino – на самом деле ответ уже скрыт в сообщении. Функция или переменная просто не были задекларированы в области видимости.

Ошибки компиляции плат Arduino uno

Другая частая оплошность пользователя, которая порождает вопросы вроде, что делать, если Аrduino не видит порт, заключается в том, что вы попросту забываете настроить среду разработки. IDE Ардуино создана под все виды плат, но, как мы указывали, на каждом контроллере помещается лишь ограниченное количество библиотек, и их наполнение может быть различным.

Соответственно, если в меню среды вы выбрали компиляцию не под тот МК, то вполне вероятно, что вызываемая вами функция или метод просто не будет найдена в постоянной памяти, вернув ошибку. Стандартно, в настройках указана плата Ардуино уно, поэтому не забывайте её менять. И обратная ситуация может стать причиной, по которой возникает проблема загрузки в плату на Аrduino uno.

Ошибка exit status 1 при компиляции для плат uno, mega и nano

И самое частое сообщение, для пользователей уно, которое выскакивает в среде разработки – exit 1. И оно же самое дискомфортное для отладки приложения, ведь тут необходимо учесть чуть ли не ядро системы, чтобы понять, где же кроется злополучный баг.

В документации указано, что это сообщение указывает на то, что не запускается ide Аrduino в нужной конфигурации, но на деле есть ещё десяток случаев, при которых вы увидите данное сообщение. Однако, действительно, не забывайте проверять разрядность системы, IDE и просматривать, какие библиотеки вам доступны для обращения на текущий момент.

Ошибки библиотек

Если произошла ошибка при компиляции скетча Ардуино, но не выводилось ни одно из вышеописанных сообщений, то можете смело искать баг в библиотеках МК. Это наиболее неприятное занятие для большинства программистов, ведь приходится лазить в чужом коде, но без этого никак.

Ведь банально причина может быть в устаревшем синтаксисе скачанного плагина и, чтобы он заработал, необходимо переписать его практически с нуля. Это единственный выход из сложившейся ситуации. Но бывают и более банальные ситуации, когда вы подключили библиотеку, функции из которой затем ни разу не вызвали, или просто перепутали название.

Ошибки компилятора Ардуино

Ранее упоминался финальный стек действий, при прогонке кода через компилятор, и в этот момент могут произойти наиболее страшные ошибки – баги самого IDE. Здесь конкретного решения быть не может. Вам никто не запрещает залезть в ядро системы и проверить там всё самостоятельно, но куда эффективнее будет откатиться до предыдущей версии программы или, наоборот, обновиться.

Основные ошибки

Ошибка: «avrdude: stk500_recv(): programmer is not responding»

Смотрим какая у нас плата? Какой порт используем? Сообщаем ардуино о правильной плате и порте. Возможно, что используете Nano, а указана Mega. Возможно, что указали неверный порт. Всё это приводит к сообщению: «programmer is not responding».

Решение:

В Arduino IDE в меню «Сервис» выбираем плату. В меню «Сервис → Последовательный порт» выбираем порт.

Ошибка: «a function-definition is not allowed here before ‘{‘ token»

Забыли в коде программы (скетча) закрыть фигурную скобку }.

Решение:

Обычно в Ардуино IDE строка с ошибкой подсвечивается.

Ошибка: «No such file or directory  /  exit status 1»

Подключаемая библиотека отсутствует в папке libraries.

Решение:

Скачать нужную библиотеку и скопировать её в папку программы — как пример — C:Program FilesArduinolibraries. В случае наличия библиотеки — заменить файлы в папке.

Ошибка: «expected initializer before ‘}’ token  /  expected ‘;’ before ‘}’ token»

Забыли открыть фигурную скобку {, если видим «initializer before». Ошибка «expected ‘;’ before ‘}’ token» — забыли поставить точку с запятой в конце командной строки.

Решение:

Обычно в Ардуино IDE строка с ошибкой подсвечивается.

Ошибка: «… was not declared in this scope»

Arduino IDE видит в коде выражения или символы, которые не являются служебными или не были объявлены переменными.

Решение:

Проверить код на использование неизвестных выражений или лишних символов.

17 июля 2018 в 13:23
| Обновлено 7 ноября 2020 в 01:20 (редакция)
Опубликовано:

Статьи, Arduino

Error is an illegal operation performed by the user which results in the abnormal working of the program. Programming errors often remain undetected until the program is compiled or executed. Some of the errors inhibit the program from getting compiled or executed. Thus errors should be removed before compiling and executing. 

The most common errors can be broadly classified as follows:

1. Run Time Error: 

Run Time errors occur or we can say, are detected during the execution of the program. Sometimes these are discovered when the user enters an invalid data or data which is not relevant. Runtime errors occur when a program does not contain any syntax errors but asks the computer to do something that the computer is unable to reliably do. During compilation, the compiler has no technique to detect these kinds of errors. It is the JVM (Java Virtual Machine) that detects it while the program is running. To handle the error during the run time we can put our error code inside the try block and catch the error inside the catch block. 

For example: if the user inputs a data of string format when the computer is expecting an integer, there will be a runtime error. Example 1: Runtime Error caused by dividing by zero 

class DivByZero {

    public static void main(String args[])

    {

        int var1 = 15;

        int var2 = 5;

        int var3 = 0;

        int ans1 = var1 / var2;

        int ans2 = var1 / var3;

        System.out.println(

            "Division of va1"

            + " by var2 is: "

            + ans1);

        System.out.println(

            "Division of va1"

            + " by var3 is: "

            + ans2);

    }

}

Runtime Error in java code:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivByZero.main(File.java:14)

Example 2: Runtime Error caused by Assigning/Retrieving Value from an array using an index which is greater than the size of the array 

Java

class RTErrorDemo {

    public static void main(String args[])

    {

        int arr[] = new int[5];

        arr[9] = 250;

        System.out.println("Value assigned! ");

    }

}

RunTime Error in java code:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at RTErrorDemo.main(File.java:10)

2. Compile Time Error: 

Compile Time Errors are those errors which prevent the code from running because of an incorrect syntax such as a missing semicolon at the end of a statement or a missing bracket, class not found, etc. These errors are detected by the java compiler and an error message is displayed on the screen while compiling. Compile Time Errors are sometimes also referred to as Syntax errors. These kind of errors are easy to spot and rectify because the java compiler finds them for you. The compiler will tell you which piece of code in the program got in trouble and its best guess as to what you did wrong. Usually, the compiler indicates the exact line where the error is, or sometimes the line just before it, however, if the problem is with incorrectly nested braces, the actual error may be at the beginning of the block. In effect, syntax errors represent grammatical errors in the use of the programming language. 

Example 1: Misspelled variable name or method names 

Java

class MisspelledVar {

    public static void main(String args[])

    {

        int a = 40, b = 60;

        int Sum = a + b;

        System.out.println(

            "Sum of variables is "

            + sum);

    }

}

Compilation Error in java code:

prog.java:14: error: cannot find symbol
            + sum);
              ^
  symbol:   variable sum
  location: class MisspelledVar
1 error

Example 2: Missing semicolons 

Java

class PrintingSentence {

    public static void main(String args[])

    {

        String s = "GeeksforGeeks";

        System.out.println("Welcome to " + s)

    }

}

Compilation Error in java code:

prog.java:8: error: ';' expected
        System.out.println("Welcome to " + s)
                                             ^
1 error

Example: Missing parenthesis, square brackets, or curly braces 

Java

class MissingParenthesis {

    public static void main(String args[])

    {

        System.out.println("Printing 1 to 5 n");

        int i;

        for (i = 1; i <= 5; i++ {

            System.out.println(i + "n");

        }

    }

}

Compilation Error in java code:

prog.java:10: error: ')' expected
        for (i = 1; i <= 5; i++ {
                               ^
1 error

Example: Incorrect format of selection statements or loops 

Java

class IncorrectLoop {

    public static void main(String args[])

    {

        System.out.println("Multiplication Table of 7");

        int a = 7, ans;

        int i;

        for (i = 1, i <= 10; i++) {

            ans = a * i;

            System.out.println(ans + "n");

        }

    }

}

Compilation Error in java code:

prog.java:12: error: not a statement
        for (i = 1, i <= 10; i++) {
                      ^
prog.java:12: error: ';' expected
        for (i = 1, i <= 10; i++) {
                                ^
2 errors

Logical Error: A logic error is when your program compiles and executes, but does the wrong thing or returns an incorrect result or no output when it should be returning an output. These errors are detected neither by the compiler nor by JVM. The Java system has no idea what your program is supposed to do, so it provides no additional information to help you find the error. Logical errors are also called Semantic Errors. These errors are caused due to an incorrect idea or concept used by a programmer while coding. Syntax errors are grammatical errors whereas, logical errors are errors arising out of an incorrect meaning. For example, if a programmer accidentally adds two variables when he or she meant to divide them, the program will give no error and will execute successfully but with an incorrect result. 

Example: Accidentally using an incorrect operator on the variables to perform an operation (Using ‘/’ operator to get the modulus instead using ‘%’) 

Java

public class LErrorDemo {

    public static void main(String[] args)

    {

        int num = 789;

        int reversednum = 0;

        int remainder;

        while (num != 0) {

            remainder = num / 10;

            reversednum

                = reversednum * 10

                  + remainder;

            num /= 10;

        }

        System.out.println("Reversed number is "

                           + reversednum);

    }

}

Output:

Reversed number is 7870

Example: Displaying the wrong message 

Java

class IncorrectMessage {

    public static void main(String args[])

    {

        int a = 2, b = 8, c = 6;

        System.out.println(

            "Finding the largest number n");

        if (a > b && a > c)

            System.out.println(

                a + " is the largest Number");

        else if (b > a && b > c)

            System.out.println(

                b + " is the smallest Number");

        else

            System.out.println(

                c + " is the largest Number");

    }

}

Output:

Finding the largest number 

8 is the smallest Number

Syntax Error:

Syntax and Logical errors are faced by Programmers.

Spelling or grammatical mistakes are syntax errors, for example, using an uninitialized variable, using an undefined variable, etc., missing a semicolon, etc.

int x, y;
x = 10 // missing semicolon (;)
z = x + y; // z is undefined, y in uninitialized.

Syntax errors can be removed with the help of the compiler.

Last Updated :
08 Jun, 2022

Like Article

Save Article

Error is an illegal operation performed by the user which results in the abnormal working of the program. Programming errors often remain undetected until the program is compiled or executed. Some of the errors inhibit the program from getting compiled or executed. Thus errors should be removed before compiling and executing. 

The most common errors can be broadly classified as follows:

1. Run Time Error: 

Run Time errors occur or we can say, are detected during the execution of the program. Sometimes these are discovered when the user enters an invalid data or data which is not relevant. Runtime errors occur when a program does not contain any syntax errors but asks the computer to do something that the computer is unable to reliably do. During compilation, the compiler has no technique to detect these kinds of errors. It is the JVM (Java Virtual Machine) that detects it while the program is running. To handle the error during the run time we can put our error code inside the try block and catch the error inside the catch block. 

For example: if the user inputs a data of string format when the computer is expecting an integer, there will be a runtime error. Example 1: Runtime Error caused by dividing by zero 

class DivByZero {

    public static void main(String args[])

    {

        int var1 = 15;

        int var2 = 5;

        int var3 = 0;

        int ans1 = var1 / var2;

        int ans2 = var1 / var3;

        System.out.println(

            "Division of va1"

            + " by var2 is: "

            + ans1);

        System.out.println(

            "Division of va1"

            + " by var3 is: "

            + ans2);

    }

}

Runtime Error in java code:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivByZero.main(File.java:14)

Example 2: Runtime Error caused by Assigning/Retrieving Value from an array using an index which is greater than the size of the array 

Java

class RTErrorDemo {

    public static void main(String args[])

    {

        int arr[] = new int[5];

        arr[9] = 250;

        System.out.println("Value assigned! ");

    }

}

RunTime Error in java code:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at RTErrorDemo.main(File.java:10)

2. Compile Time Error: 

Compile Time Errors are those errors which prevent the code from running because of an incorrect syntax such as a missing semicolon at the end of a statement or a missing bracket, class not found, etc. These errors are detected by the java compiler and an error message is displayed on the screen while compiling. Compile Time Errors are sometimes also referred to as Syntax errors. These kind of errors are easy to spot and rectify because the java compiler finds them for you. The compiler will tell you which piece of code in the program got in trouble and its best guess as to what you did wrong. Usually, the compiler indicates the exact line where the error is, or sometimes the line just before it, however, if the problem is with incorrectly nested braces, the actual error may be at the beginning of the block. In effect, syntax errors represent grammatical errors in the use of the programming language. 

Example 1: Misspelled variable name or method names 

Java

class MisspelledVar {

    public static void main(String args[])

    {

        int a = 40, b = 60;

        int Sum = a + b;

        System.out.println(

            "Sum of variables is "

            + sum);

    }

}

Compilation Error in java code:

prog.java:14: error: cannot find symbol
            + sum);
              ^
  symbol:   variable sum
  location: class MisspelledVar
1 error

Example 2: Missing semicolons 

Java

class PrintingSentence {

    public static void main(String args[])

    {

        String s = "GeeksforGeeks";

        System.out.println("Welcome to " + s)

    }

}

Compilation Error in java code:

prog.java:8: error: ';' expected
        System.out.println("Welcome to " + s)
                                             ^
1 error

Example: Missing parenthesis, square brackets, or curly braces 

Java

class MissingParenthesis {

    public static void main(String args[])

    {

        System.out.println("Printing 1 to 5 n");

        int i;

        for (i = 1; i <= 5; i++ {

            System.out.println(i + "n");

        }

    }

}

Compilation Error in java code:

prog.java:10: error: ')' expected
        for (i = 1; i <= 5; i++ {
                               ^
1 error

Example: Incorrect format of selection statements or loops 

Java

class IncorrectLoop {

    public static void main(String args[])

    {

        System.out.println("Multiplication Table of 7");

        int a = 7, ans;

        int i;

        for (i = 1, i <= 10; i++) {

            ans = a * i;

            System.out.println(ans + "n");

        }

    }

}

Compilation Error in java code:

prog.java:12: error: not a statement
        for (i = 1, i <= 10; i++) {
                      ^
prog.java:12: error: ';' expected
        for (i = 1, i <= 10; i++) {
                                ^
2 errors

Logical Error: A logic error is when your program compiles and executes, but does the wrong thing or returns an incorrect result or no output when it should be returning an output. These errors are detected neither by the compiler nor by JVM. The Java system has no idea what your program is supposed to do, so it provides no additional information to help you find the error. Logical errors are also called Semantic Errors. These errors are caused due to an incorrect idea or concept used by a programmer while coding. Syntax errors are grammatical errors whereas, logical errors are errors arising out of an incorrect meaning. For example, if a programmer accidentally adds two variables when he or she meant to divide them, the program will give no error and will execute successfully but with an incorrect result. 

Example: Accidentally using an incorrect operator on the variables to perform an operation (Using ‘/’ operator to get the modulus instead using ‘%’) 

Java

public class LErrorDemo {

    public static void main(String[] args)

    {

        int num = 789;

        int reversednum = 0;

        int remainder;

        while (num != 0) {

            remainder = num / 10;

            reversednum

                = reversednum * 10

                  + remainder;

            num /= 10;

        }

        System.out.println("Reversed number is "

                           + reversednum);

    }

}

Output:

Reversed number is 7870

Example: Displaying the wrong message 

Java

class IncorrectMessage {

    public static void main(String args[])

    {

        int a = 2, b = 8, c = 6;

        System.out.println(

            "Finding the largest number n");

        if (a > b && a > c)

            System.out.println(

                a + " is the largest Number");

        else if (b > a && b > c)

            System.out.println(

                b + " is the smallest Number");

        else

            System.out.println(

                c + " is the largest Number");

    }

}

Output:

Finding the largest number 

8 is the smallest Number

Syntax Error:

Syntax and Logical errors are faced by Programmers.

Spelling or grammatical mistakes are syntax errors, for example, using an uninitialized variable, using an undefined variable, etc., missing a semicolon, etc.

int x, y;
x = 10 // missing semicolon (;)
z = x + y; // z is undefined, y in uninitialized.

Syntax errors can be removed with the help of the compiler.

Error is an illegal operation performed by the user which results in the abnormal working of the program. Programming errors often remain undetected until the program is compiled or executed. Some of the errors inhibit the program from getting compiled or executed. Thus errors should be removed before compiling and executing. 

The most common errors can be broadly classified as follows:

1. Run Time Error: 

Run Time errors occur or we can say, are detected during the execution of the program. Sometimes these are discovered when the user enters an invalid data or data which is not relevant. Runtime errors occur when a program does not contain any syntax errors but asks the computer to do something that the computer is unable to reliably do. During compilation, the compiler has no technique to detect these kinds of errors. It is the JVM (Java Virtual Machine) that detects it while the program is running. To handle the error during the run time we can put our error code inside the try block and catch the error inside the catch block. 

For example: if the user inputs a data of string format when the computer is expecting an integer, there will be a runtime error. Example 1: Runtime Error caused by dividing by zero 

Java

class DivByZero {

    public static void main(String args[])

    {

        int var1 = 15;

        int var2 = 5;

        int var3 = 0;

        int ans1 = var1 / var2;

        int ans2 = var1 / var3;

        System.out.println(

            "Division of va1"

            + " by var2 is: "

            + ans1);

        System.out.println(

            "Division of va1"

            + " by var3 is: "

            + ans2);

    }

}

Runtime Error in java code:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivByZero.main(File.java:14)

Example 2: Runtime Error caused by Assigning/Retrieving Value from an array using an index which is greater than the size of the array 

Java

class RTErrorDemo {

    public static void main(String args[])

    {

        int arr[] = new int[5];

        arr[9] = 250;

        System.out.println("Value assigned! ");

    }

}

RunTime Error in java code:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at RTErrorDemo.main(File.java:10)

2. Compile Time Error: 

Compile Time Errors are those errors which prevent the code from running because of an incorrect syntax such as a missing semicolon at the end of a statement or a missing bracket, class not found, etc. These errors are detected by the java compiler and an error message is displayed on the screen while compiling. Compile Time Errors are sometimes also referred to as Syntax errors. These kind of errors are easy to spot and rectify because the java compiler finds them for you. The compiler will tell you which piece of code in the program got in trouble and its best guess as to what you did wrong. Usually, the compiler indicates the exact line where the error is, or sometimes the line just before it, however, if the problem is with incorrectly nested braces, the actual error may be at the beginning of the block. In effect, syntax errors represent grammatical errors in the use of the programming language. 

Example 1: Misspelled variable name or method names 

Java

class MisspelledVar {

    public static void main(String args[])

    {

        int a = 40, b = 60;

        int Sum = a + b;

        System.out.println(

            "Sum of variables is "

            + sum);

    }

}

Compilation Error in java code:

prog.java:14: error: cannot find symbol
            + sum);
              ^
  symbol:   variable sum
  location: class MisspelledVar
1 error

Example 2: Missing semicolons 

Java

class PrintingSentence {

    public static void main(String args[])

    {

        String s = "GeeksforGeeks";

        System.out.println("Welcome to " + s)

    }

}

Compilation Error in java code:

prog.java:8: error: ';' expected
        System.out.println("Welcome to " + s)
                                             ^
1 error

Example: Missing parenthesis, square brackets, or curly braces 

Java

class MissingParenthesis {

    public static void main(String args[])

    {

        System.out.println("Printing 1 to 5 n");

        int i;

        for (i = 1; i <= 5; i++ {

            System.out.println(i + "n");

        }

    }

}

Compilation Error in java code:

prog.java:10: error: ')' expected
        for (i = 1; i <= 5; i++ {
                               ^
1 error

Example: Incorrect format of selection statements or loops 

Java

class IncorrectLoop {

    public static void main(String args[])

    {

        System.out.println("Multiplication Table of 7");

        int a = 7, ans;

        int i;

        for (i = 1, i <= 10; i++) {

            ans = a * i;

            System.out.println(ans + "n");

        }

    }

}

Compilation Error in java code:

prog.java:12: error: not a statement
        for (i = 1, i <= 10; i++) {
                      ^
prog.java:12: error: ';' expected
        for (i = 1, i <= 10; i++) {
                                ^
2 errors

Logical Error: A logic error is when your program compiles and executes, but does the wrong thing or returns an incorrect result or no output when it should be returning an output. These errors are detected neither by the compiler nor by JVM. The Java system has no idea what your program is supposed to do, so it provides no additional information to help you find the error. Logical errors are also called Semantic Errors. These errors are caused due to an incorrect idea or concept used by a programmer while coding. Syntax errors are grammatical errors whereas, logical errors are errors arising out of an incorrect meaning. For example, if a programmer accidentally adds two variables when he or she meant to divide them, the program will give no error and will execute successfully but with an incorrect result. 

Example: Accidentally using an incorrect operator on the variables to perform an operation (Using ‘/’ operator to get the modulus instead using ‘%’) 

Java

public class LErrorDemo {

    public static void main(String[] args)

    {

        int num = 789;

        int reversednum = 0;

        int remainder;

        while (num != 0) {

            remainder = num / 10;

            reversednum

                = reversednum * 10

                  + remainder;

            num /= 10;

        }

        System.out.println("Reversed number is "

                           + reversednum);

    }

}

Output:

Reversed number is 7870

Example: Displaying the wrong message 

Java

class IncorrectMessage {

    public static void main(String args[])

    {

        int a = 2, b = 8, c = 6;

        System.out.println(

            "Finding the largest number n");

        if (a > b && a > c)

            System.out.println(

                a + " is the largest Number");

        else if (b > a && b > c)

            System.out.println(

                b + " is the smallest Number");

        else

            System.out.println(

                c + " is the largest Number");

    }

}

Output:

Finding the largest number 

8 is the smallest Number

Syntax Error:

Syntax and Logical errors are faced by Programmers.

Spelling or grammatical mistakes are syntax errors, for example, using an uninitialized variable, using an undefined variable, etc., missing a semicolon, etc.

int x, y;
x = 10 // missing semicolon (;)
z = x + y; // z is undefined, y in uninitialized.

Syntax errors can be removed with the help of the compiler.

Содержание

  1. Создание, компиляция и выполнения Java программ
  2. Типичные ошибки компиляции и запуска Java программ
  3. Особенности компиляции и запуска Java программ в Windows
  4. Русские Блоги
  5. 20 распространенных ошибок Java и как их избежать
  6. Ошибка компилятора
  7. 1. “… Expected”
  8. 2. “Unclosed String Literal”
  9. 3. “Illegal Start of an Expression”
  10. 4. “Cannot Find Symbol”
  11. 5. “Public Class XXX Should Be in File”
  12. 6. “Incompatible Types”
  13. 7. “Invalid Method Declaration; Return Type Required”
  14. 8. “Method in Class Cannot Be Applied to Given Types”
  15. 9. “Missing Return Statement”
  16. 10. “Possible Loss of Precision”
  17. 11. “Reached End of File While Parsing”
  18. 12. “Unreachable Statement”
  19. 13. “Variable Might Not Have Been Initialized”
  20. 14. “Operator … Cannot be Applied to ”
  21. 15. “Inconvertible Types”
  22. 16. “Missing Return Value”
  23. 17. “Cannot Return a Value From Method Whose Result Type Is Void”
  24. 18. “Non-Static Variable … Cannot Be Referenced From a Static Context”
  25. 19. “Non-Static Method … Cannot Be Referenced From a Static Context”
  26. 20. “(array) Not Initialized”
  27. Продолжение следует
  28. Интеллектуальная рекомендация
  29. IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS
  30. Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis
  31. 1086 Не скажу (15 баллов)
  32. Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных
  33. PureMVC Learning (Tucao) Примечания

Создание, компиляция и выполнения Java программ

Ключевой момент: вы сохраняете исходный код Java программы в файл с расширением .java и компилируете его в файл с расширением .class. Файл .class выполняется виртуальной машиной Java.

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

Для создания и редактирования исходного кода Java вы можете использовать любой текстовый редактор или IDE. Этот раздел демонстрирует, как создавать, компилировать и запускать программы Java из командной строки. В разделе «Компиляция и запуск Java программ в NetBeans» показано, как это делать в IDE на примере NetBeans.

Можно вообще обойтись без IDE, а писать исходный код в любом текстовом редакторе (например, в Notepad), а компилировать в командной строке.

Внимание: файл с исходным кодом должен иметь расширение .java и иметь в точности такое же имя, как и имя публичного (public) класса. Например, файл с исходным кодом:

должен называться Welcome.java, поскольку имя public класса – Welcome.

Компилятор Java преобразовывает файл с исходным кодом Java в файл с байткодом Java. Следующая команда компилирует Welcome.java:

Если нет синтаксических ошибок, компилятор генерирует файл байкода с расширением .class. Следовательно, приведённая выше команда генерирует файл с названием Welcome.class.

Чтобы иметь возможность компилировать и запускать программы, вы должны установить JDK. Как это сделать описано в инструкциях:

Язык Java – это высокоуровневый язык программирования, но байткод Java – это низкоуровневый язык. Байткод похож на машинные инструкции, но нейтрален к архитектуре (не зависит от архитектуры) и может запускаться на любой платформе, которая имеет виртуальную машину Java – Java Virtual Machine (JVM). В отличие от физической машины, виртуальная машина – это программа, которая интерпретирует байткод Java. Это одно из главных преимуществ Java: байткод Java может работать на различных аппаратных платформах и операционных системах. Исходный код Java компилируется в байткод Java, а байткод Java интерпретируется виртуальной машиной Java. Ваш код Java может использовать код библиотеки Java. JVM выполняет ваш код вместе с кодом из библиотеки.

Выполнить Java программу – это значит запустить байткод программы. Вы можете выполнить байткод на любой платформе с JVM, которая является интерпретатором. Она (виртуальная машина Java) переводит отдельные инструкции байткода в целевой машинный языковой код. Это делается последовательно – одна инструкция за раз, а не вся программ за один присест. Каждый шаг немедленно выполняется, сразу после перевода.

Следующая команда выполняет байткод для программы, которая приведена выше:

На скриншоте ниже показан процесс компиляции и запуска:

Внимание: не используйте расширение .class в команде, когда запускаете программу. Используйте ИмяКласса для запуска программы. Если вы в командной строке используете ИмяКласса.class, то система будет пытаться работать с файлом ИмяКласса.class.class.

Справка: когда выполняется Java программа, JVM начинает с загрузки байткода класса в память, используя программу под названием загрузчик классов (class loader). Если ваша программа использует другие классы, загрузчик классов динамически подгружает их перед тем, как они понадобятся. После загрузки класса, JVM использует программу под названием контролёр байткода (bytecode verifier) для проверки правильности байткода и проверки, что байткод не нарушает ограничений безопасности Java. Java обеспечивает строгую защиту, чтобы убедиться, что файлы классов Java не подделаны и не вредят вашему компьютеру.

Педагогическое примечание: ваш инструктор может требовать от вас использовать пакеты для организации программ. Например, все программы из этой части можно поместить в пакет chapter2. Подробности о пакетах и пространствах имён будут рассмотрены далее. Также посмотрите раздел «Почему NetBeans всегда использует package».

Типичные ошибки компиляции и запуска Java программ

Команда javac не найдена

Если при запуске javac, т.е. при попытке компиляции Java программы вы получаете ошибку:

Это означает, что JDK не установлен. Либо установлен, но не настроены переменные окружения. Способы исправления очевидны:

  • установить JDK
  • настроить переменные окружения

Если JDK установлен, то можно обойтись без добавления переменной окружения. Для этого используйте абсолютный путь до исполнимого файла javac:

Ошибка Class names are only accepted if annotation processing is explicitly requested

Если попытаться скомпилировать программу следующим образом:

то возникнет ошибка:

Причина ошибки в том – что вы забыли указать расширение файла .java.

Ошибка записи (error while writing)

Компиляция заканчивается ошибкой:

Причина ошибки в том, что у компилятора (javac) недостаточно прав на запись в тот каталог, куда он пытается сохранить новый файл .class. Чтобы ошибка исчезла: предоставьте компилятору дополнительные права (запустите от имени администратора), либо сохраняйте в папку, на которую у текущего пользователя имеются права записи.

Ошибка «class is public, should be declared in a file named»

который заканчивается примерной такой ошибкой

означает, что вы неправильно назвали класс в исходном коде программы. Имя класса должно совпадать с именем файла. В данном случае файл называется Welcome.java, а класс внутри программы назван Welcomee

Error: Could not find or load main class

Если попытаться запустить программу следующим образом:

то возникнет ошибка

Причина её в том, что не нужно было добавлять к названию файла расширение .class. Виртуальная машина автоматически добавляет расширение и в приведённом примере она ищет файл Welcome.class.class

Ошибка Error: Could not find or load main class при запуске Java программы по абсолютному пути

Эта ошибка возможно при запуске Java программы по абсолютному пути:

Ошибка возникает как в Windows, так и в Linux:

Если в терминале вы находитесь в той же директории, что и файл, который вы запускаете, то не нужно указывать абсолютный путь. Например, нужно запускать так:

Если же вы находитесь в другой директории, то нужно использовать опцию -cp, после которой указать путь до каталога, где размещена запускаемая программа. А далее указать запускаемый файл без расширения .class:

Как видно из скриншота, командная строка находится в папке C:WINDOWSsystem32. Файл, который нам нужно запустить, находится в папке C: (корень диска). Мы указываем после ключа -cp папку C:, а затем пишем имя файла программы без расширения – Welcome.

Аналогично нужно поступать в Linux. Пример команды:

Ошибка Main method not found in class

Если при запуске вы столкнулись с ошибкой:

Это означает, что вы не указали метод main, либо написали слово неправильно (например, Main вместо main).

Особенности компиляции и запуска Java программ в Windows

Команда «javac» не является внутренней или внешней командой, исполняемой программой или пакетным файлом

Эта ошибка рассмотрена чуть выше. Для установки и настройки переменных окружения в Windows обратитесь к инструкции «Установка Java (JDK) в Windows».

Проблема с кодировкой в Java программах в командной строке Windows

Если вы написали программу, которая выводит кириллицу в консоль:

А в качестве результата получили крякозяблы:

Значит кодировка, в которой выводит строки ваша программа, отличается от кодировки командной строки Windows.

Имеется несколько способов исправить эту проблему. Кстати, если для запуска консольных программ Java вы используете NetBeans, то он выводит строки в правильной кодировке. В Linux эта проблема также отсутствует. Если вам нужно поменять кодировку на время, то вы можете выполнить следующие команды:

Для того, чтобы смена кодировки командной строки Windows не сбрасывалась после закрытия и открытия командной строки, можно внести изменения в реестр Windows. Для этого нажмите Win+x, выберите «Выполнить», в открывшееся окно введите regedit. В открывшейся программе (редактор реестра Windows) перейдите к [HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorAutorun] и измените (или добавьте) значение на @chcp 65001>nul

Источник

Русские Блоги

20 распространенных ошибок Java и как их избежать

оригинал:50 Common Java Errors and How to Avoid Them (Part 1)
Автор:Angela Stringfellow
перевод: Гусь напуган

Примечание переводчика: в этой статье представлены 20 распространенных ошибок компилятора Java. Каждая ошибка включает фрагменты кода, описания проблем и предоставляет ссылки по теме, которые помогут вам быстро понять и решить эти проблемы. Ниже приводится перевод.

При разработке программного обеспечения Java вы можете столкнуться со многими типами ошибок, но большинства из них можно избежать. Мы тщательно отобрали 20 наиболее распространенных ошибок программного обеспечения Java, включая примеры кода и руководства, которые помогут вам решить некоторые распространенные проблемы с кодированием.

Чтобы получить дополнительные советы и рекомендации по написанию программ на Java, вы можете загрузить наш «Comprehensive Java Developer’s Guide«Эта книга содержит все, что вам нужно, от всевозможных инструментов до лучших веб-сайтов и блогов, каналов YouTube, влиятельных лиц в Twitter, групп в LinkedIn, подкастов, мероприятий, которые необходимо посетить, и многого другого.

Если вы используете .NET, прочтите нашРуководство по 50 наиболее распространенным программным ошибкам .NETЧтобы избежать этих ошибок. Но если ваша текущая проблема связана с Java, прочтите следующую статью, чтобы понять наиболее распространенные проблемы и способы их решения.

Ошибка компилятора

Сообщения об ошибках компилятора создаются, когда компилятор выполняет код Java. Важно, что компилятор может выдавать несколько сообщений об ошибках для одной ошибки. Так что исправьте ошибку и перекомпилируйте, что может решить многие проблемы.

1. “… Expected”

Эта ошибка возникает, когда в коде чего-то не хватает. Обычно это происходит из-за отсутствия точки с запятой или закрывающей скобки.

Обычно это сообщение об ошибке не указывает точное местонахождение проблемы. Чтобы найти проблему, вам необходимо:

  • Убедитесь, что все открывающие скобки имеют соответствующие закрывающие скобки.
  • Посмотрите на код перед строкой, обозначенной ошибкой. Эта ошибка обычно обнаруживается компилятором в более позднем коде.
  • Иногда некоторые символы (например, открывающая скобка) не должны быть первыми в коде Java.

2. “Unclosed String Literal”

Если в конце строки отсутствует кавычка, создается сообщение об ошибке «Незамкнутый строковый литерал», и это сообщение отображается в строке, где произошла ошибка.

Обычно эта ошибка возникает в следующих ситуациях:

  • Строка не заканчивается кавычками. Это легко изменить, просто заключите строку в указанные кавычки.
  • Строка превышает одну строку. Длинную строку можно разделить на несколько коротких строк и соединить знаком плюс («+»).
  • Кавычки, являющиеся частью строки, не экранируются обратной косой чертой («»).

3. “Illegal Start of an Expression”

Есть много причин для ошибки «Незаконное начало выражения». Это стало одним из наименее полезных сообщений об ошибках. Некоторые разработчики думают, что это вызвано плохим запахом кода.

Обычно выражение создается для генерации нового значения или присвоения значений другим переменным. Компилятор ожидает найти выражение, но посколькуГрамматика не оправдывает ожиданийВыражение не найдено. Эту ошибку можно найти в следующем коде.

4. “Cannot Find Symbol”

Это очень распространенная проблема, потому что все идентификаторы в Java должны быть объявлены до их использования. Эта ошибка возникает из-за того, что компилятор не понимает значения идентификатора при компиляции кода.

Сообщение об ошибке «Не удается найти символ» может иметь множество причин:

  • Написание объявления идентификатора может не соответствовать написанию, используемому в коде.
  • Переменная никогда не объявлялась.
  • Переменная не объявлена ​​в той же области видимости.
  • Никакие классы не импортируются.

5. “Public Class XXX Should Be in File”

Если класс XXX и имя файла программы Java не совпадают, будет сгенерировано сообщение об ошибке «Открытый класс XXX должен быть в файле». Только когда имя класса и имя файла Java совпадают, код может быть скомпилирован.

Чтобы решить эту проблему, вы можете:

  • Назовите класс и файл с тем же именем.
  • Убедитесь, что два имени всегда совпадают.

6. “Incompatible Types”

«Несовместимые типы» — это логические ошибки, которые возникают, когда операторы присваивания пытаются сопоставить типы переменных и выражений. Обычно эта ошибка возникает при присвоении строки целому числу и наоборот. Это не синтаксическая ошибка Java.

Когда компилятор выдает сообщение «несовместимые типы», решить эту проблему действительно непросто:

  • Используйте функции преобразования типов.
  • Разработчикам может потребоваться изменить исходные функции кода.

7. “Invalid Method Declaration; Return Type Required”

Это сообщение об ошибке означает, что тип возвращаемого значения метода не объявлен явно в объявлении метода.

Есть несколько ситуаций, которые вызывают ошибку «недопустимое объявление метода; требуется тип возвращаемого значения»:

  • Забыл объявить тип.
  • Если метод не имеет возвращаемого значения, вам необходимо указать «void» в качестве возвращаемого типа в объявлении метода.
  • Конструктору не нужно объявлять тип. Однако, если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без указанного типа.

8. “Method in Class Cannot Be Applied to Given Types”

Это сообщение об ошибке более полезно, оно означает, что метод был вызван с неправильными параметрами.

При вызове метода вы должны передать те параметры, которые определены в его объявлении. Пожалуйста, проверьте объявление метода и вызов метода, чтобы убедиться, что они совпадают.

9. “Missing Return Statement”

Когда в методе отсутствует оператор возврата, выдается сообщение об ошибке «Отсутствует оператор возврата». Метод с возвращаемым значением (тип, не являющийся недействительным) должен иметь оператор, который возвращает значение, чтобы значение можно было вызвать вне метода.

Есть несколько причин, по которым компилятор выдает сообщение «отсутствует оператор возврата»:

  • Оператор возврата был опущен по ошибке.
  • Метод не возвращает никакого значения, но тип не объявлен как недействительный в объявлении метода.

10. “Possible Loss of Precision”

Когда информация, присвоенная переменной, превышает верхний предел, который может нести переменная, выдается ошибка «Возможная потеря точности». Как только это произойдет, часть информации будет отброшена. Если это не проблема, переменную следует явно объявить в коде как новый тип.

Ошибка «возможная потеря точности» обычно возникает в следующих ситуациях:

  • Попробуйте присвоить переменной целочисленного типа действительное число.
  • Попробуйте присвоить данные типа double переменной целочисленного типа.

Основные типы данных в JavaОбъясняет характеристики различных типов данных.

11. “Reached End of File While Parsing”

Это сообщение об ошибке обычно появляется, когда в программе отсутствует закрывающая фигурная скобка («>»). Иногда эту ошибку можно быстро исправить, добавив закрывающую скобку в конце кода.

Приведенный выше код приведет к следующей ошибке:

Инструменты кодирования и правильные отступы кода могут упростить поиск этих несоответствующих фигурных скобок.

12. “Unreachable Statement”

Когда оператор появляется в месте, где он не может быть выполнен, выдается ошибка «Недоступный оператор». Обычно это делается после оператора break или return.

Обычно эту ошибку можно исправить, просто переместив оператор return. Прочтите эту статью:Как исправить ошибку «Недостижимый отчет»。

13. “Variable Might Not Have Been Initialized”

Если локальная переменная, объявленная в методе, не инициализирована, возникнет такая ошибка. Такая ошибка возникает, если вы включаете переменную без начального значения в оператор if.

14. “Operator … Cannot be Applied to ”

Эта проблема возникает, когда оператор действует с типом, который не входит в область его определения.

Эта ошибка часто возникает, когда код Java пытается использовать строковые типы в вычислениях (вычитание, умножение, сравнение размеров и т. Д.). Чтобы решить эту проблему, вам необходимо преобразовать строку в целое число или число с плавающей запятой.

15. “Inconvertible Types”

Когда код Java пытается выполнить недопустимое преобразование, возникает ошибка «Неконвертируемые типы».

Например, логические типы нельзя преобразовать в целые числа.

16. “Missing Return Value”

Если оператор возврата содержит неверный тип, вы получите сообщение «Отсутствует возвращаемое значение». Например, посмотрите на следующий код:

Возвращается следующая ошибка:

Обычно эта ошибка возникает из-за того, что оператор return ничего не возвращает.

17. “Cannot Return a Value From Method Whose Result Type Is Void”

Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, например, в следующем коде:

Обычно эту проблему может решить изменение типа возвращаемого значения метода, чтобы он соответствовал типу в операторе возврата. Например, следующий void можно изменить на int:

18. “Non-Static Variable … Cannot Be Referenced From a Static Context”

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

Чтобы устранить ошибку «Нестатическая переменная… На нее нельзя ссылаться из статического контекста», можно сделать две вещи:

  • Вы можете объявить переменные статическими.
  • Вы можете создавать экземпляры нестатических объектов в статических методах.

19. “Non-Static Method … Cannot Be Referenced From a Static Context”

Эта проблема возникает, когда код Java пытается вызвать нестатический метод в статическом классе. Например, такой код:

Вызовет эту ошибку:

Чтобы вызвать нестатический метод в статическом методе, необходимо объявить экземпляр класса вызываемого нестатического метода.

20. “(array) Not Initialized”

Если массив был объявлен, но не инициализирован, вы получите сообщение об ошибке типа «(массив) не инициализирован». Длина массива фиксирована, поэтому каждый массив необходимо инициализировать требуемой длиной.

Следующий код правильный:

это тоже нормально:

Продолжение следует

Сегодня мы обсуждали ошибки компилятора, в следующий раз мы обсудим различные исключения времени выполнения, которые могут возникнуть. Как и структура этой статьи, в следующий раз она будет содержать фрагменты кода, пояснения и ссылки по теме, которые помогут вам исправить код как можно скорее.

Интеллектуальная рекомендация

IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS

Используйте iview, чтобы сделать небольшой инструмент. Чтобы не затронуть другие платформы, загрузите JS и CSS CDN на локальные ссылки. В результате значок шрифта не может быть загружен. Просмо.

Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis

1 Обзор Серверная программа, которая обычно запускалась раньше, открылась сегодня, и неожиданно появилась эта ошибка. Интуитивно понятно, что не хватает связанных с Spring пакетов, но после удаления п.

1086 Не скажу (15 баллов)

При выполнении домашнего задания друг, сидящий рядом с ним, спросил вас: «Сколько будет пять умножить на семь?» Вы должны вежливо улыбнуться и сказать ему: «Пятьдесят три». Это.

Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных

В конкурсе Algorith Algorith Algorith Algorith Algorith 2019 года используется многофункциональная уборка номера ускорения. Будет использовать панды. Но сама панда, кажется, не имеет механизма для мно.

PureMVC Learning (Tucao) Примечания

Справочная статья:Введение подробного PrueMVC Использованная литература:Дело UnityPureMvc Основная цель этой статьи состоит в том, чтобы организовать соответствующие ресурсы о PureMVC. Что касается Pu.

Источник

оригинал:50 Common Java Errors and How to Avoid Them (Part 1)
Автор:Angela Stringfellow
перевод: Гусь напуган

Примечание переводчика: в этой статье представлены 20 распространенных ошибок компилятора Java. Каждая ошибка включает фрагменты кода, описания проблем и предоставляет ссылки по теме, которые помогут вам быстро понять и решить эти проблемы. Ниже приводится перевод.

При разработке программного обеспечения Java вы можете столкнуться со многими типами ошибок, но большинства из них можно избежать. Мы тщательно отобрали 20 наиболее распространенных ошибок программного обеспечения Java, включая примеры кода и руководства, которые помогут вам решить некоторые распространенные проблемы с кодированием.

Чтобы получить дополнительные советы и рекомендации по написанию программ на Java, вы можете загрузить наш «Comprehensive Java Developer’s Guide«Эта книга содержит все, что вам нужно, от всевозможных инструментов до лучших веб-сайтов и блогов, каналов YouTube, влиятельных лиц в Twitter, групп в LinkedIn, подкастов, мероприятий, которые необходимо посетить, и многого другого.

Если вы используете .NET, прочтите нашРуководство по 50 наиболее распространенным программным ошибкам .NETЧтобы избежать этих ошибок. Но если ваша текущая проблема связана с Java, прочтите следующую статью, чтобы понять наиболее распространенные проблемы и способы их решения.

Ошибка компилятора

Сообщения об ошибках компилятора создаются, когда компилятор выполняет код Java. Важно, что компилятор может выдавать несколько сообщений об ошибках для одной ошибки. Так что исправьте ошибку и перекомпилируйте, что может решить многие проблемы.

1. “… Expected”

Эта ошибка возникает, когда в коде чего-то не хватает. Обычно это происходит из-за отсутствия точки с запятой или закрывающей скобки.

private static double volume(String solidom, double alturam, double areaBasem, double raiom) {
double vol;
    if (solidom.equalsIgnoreCase("esfera"){
        vol=(4.0/3)*Math.pi*Math.pow(raiom,3);
    }
    else {
        if (solidom.equalsIgnoreCase("cilindro") {
            vol=Math.pi*Math.pow(raiom,2)*alturam;
        }
        else {
            vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam;
        }
    }
    return vol;
}

Обычно это сообщение об ошибке не указывает точное местонахождение проблемы. Чтобы найти проблему, вам необходимо:

  • Убедитесь, что все открывающие скобки имеют соответствующие закрывающие скобки.
  • Посмотрите на код перед строкой, обозначенной ошибкой. Эта ошибка обычно обнаруживается компилятором в более позднем коде.
  • Иногда некоторые символы (например, открывающая скобка) не должны быть первыми в коде Java.

Примеры:Ошибка из-за отсутствия скобок。

2. “Unclosed String Literal”

Если в конце строки отсутствует кавычка, создается сообщение об ошибке «Незамкнутый строковый литерал», и это сообщение отображается в строке, где произошла ошибка.

 public abstract class NFLPlayersReference {
    private static Runningback[] nflplayersreference;
    private static Quarterback[] players;
    private static WideReceiver[] nflplayers;
    public static void main(String args[]){
    Runningback r = new Runningback("Thomlinsion");
    Quarterback q = new Quarterback("Tom Brady");
    WideReceiver w = new WideReceiver("Steve Smith");
    NFLPlayersReference[] NFLPlayersReference;
        Run();// {
        NFLPlayersReference = new NFLPlayersReference [3];
        nflplayersreference[0] = r;
        players[1] = q;
        nflplayers[2] = w;
            for ( int i = 0; i < nflplayersreference.length; i++ ) {
            System.out.println("My name is " + " nflplayersreference[i].getName());
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            System.out.println("NFL offensive threats have great running abilities!");
        }
    }
    private static void Run() {
        System.out.println("Not yet implemented");
    }     
}

Обычно эта ошибка возникает в следующих ситуациях:

  • Строка не заканчивается кавычками. Это легко изменить, просто заключите строку в указанные кавычки.
  • Строка превышает одну строку. Длинную строку можно разделить на несколько коротких строк и соединить знаком плюс («+»).
  • Кавычки, являющиеся частью строки, не экранируются обратной косой чертой («»).

Прочтите эту статью:Сообщение об ошибке незакрытой строки。

3. “Illegal Start of an Expression”

Есть много причин для ошибки «Незаконное начало выражения». Это стало одним из наименее полезных сообщений об ошибках. Некоторые разработчики думают, что это вызвано плохим запахом кода.

Обычно выражение создается для генерации нового значения или присвоения значений другим переменным. Компилятор ожидает найти выражение, но посколькуГрамматика не оправдывает ожиданийВыражение не найдено. Эту ошибку можно найти в следующем коде.

} // добавляем сюда
       public void newShape(String shape) {
        switch (shape) {
            case "Line":
                Shape line = new Line(startX, startY, endX, endY);
            shapes.add(line);
            break;
                case "Oval":
            Shape oval = new Oval(startX, startY, endX, endY);
            shapes.add(oval);
            break;
            case "Rectangle":
            Shape rectangle = new Rectangle(startX, startY, endX, endY);
            shapes.add(rectangle);
            break;
            default:
            System.out.println("ERROR. Check logic.");
        }
        }
    } // удаляем отсюда
    }

Прочтите эту статью:Как устранить ошибки «неправильное начало выражения»。

4. “Cannot Find Symbol”

Это очень распространенная проблема, потому что все идентификаторы в Java должны быть объявлены до их использования. Эта ошибка возникает из-за того, что компилятор не понимает значения идентификатора при компиляции кода.

cannot-find-symbol-error-screenshot-11495

Сообщение об ошибке «Не удается найти символ» может иметь множество причин:

  • Написание объявления идентификатора может не соответствовать написанию, используемому в коде.
  • Переменная никогда не объявлялась.
  • Переменная не объявлена ​​в той же области видимости.
  • Никакие классы не импортируются.

Прочтите эту статью:Обсуждение ошибки «не удается найти символ»。

5. “Public Class XXX Should Be in File”

Если класс XXX и имя файла программы Java не совпадают, будет сгенерировано сообщение об ошибке «Открытый класс XXX должен быть в файле». Только когда имя класса и имя файла Java совпадают, код может быть скомпилирован.

package javaapplication3;  
  public class Robot {  
        int xlocation;  
        int ylocation;  
        String name;  
        static int ccount = 0;  
        public Robot(int xxlocation, int yylocation, String nname) {  
            xlocation = xxlocation;  
            ylocation = yylocation;  
            name = nname;  
            ccount++;         
        } 
  }
  public class JavaApplication1 { 
    public static void main(String[] args) {  
        robot firstRobot = new Robot(34,51,"yossi");  
        System.out.println("numebr of robots is now " + Robot.ccount);  
    }
  }

Чтобы решить эту проблему, вы можете:

  • Назовите класс и файл с тем же именем.
  • Убедитесь, что два имени всегда совпадают.

Прочтите эту статью:Примеры ошибки «Открытый класс XXX должен быть в файле»。

6. “Incompatible Types”

«Несовместимые типы» — это логические ошибки, которые возникают, когда операторы присваивания пытаются сопоставить типы переменных и выражений. Обычно эта ошибка возникает при присвоении строки целому числу и наоборот. Это не синтаксическая ошибка Java.

test.java:78: error: incompatible types
return stringBuilder.toString();
                             ^
required: int
found:    String
1 error

Когда компилятор выдает сообщение «несовместимые типы», решить эту проблему действительно непросто:

  • Используйте функции преобразования типов.
  • Разработчикам может потребоваться изменить исходные функции кода.

Взгляните на этот пример:Присвоение строки целому числу приведет к ошибке «несовместимые типы».。

7. “Invalid Method Declaration; Return Type Required”

Это сообщение об ошибке означает, что тип возвращаемого значения метода не объявлен явно в объявлении метода.

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

Есть несколько ситуаций, которые вызывают ошибку «недопустимое объявление метода; требуется тип возвращаемого значения»:

  • Забыл объявить тип.
  • Если метод не имеет возвращаемого значения, вам необходимо указать «void» в качестве возвращаемого типа в объявлении метода.
  • Конструктору не нужно объявлять тип. Однако, если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без указанного типа.

Взгляните на этот пример:Проблема именования конструктора вызывает проблему «недопустимое объявление метода; требуется тип возвращаемого значения».。

8. “Method in Class Cannot Be Applied to Given Types”

Это сообщение об ошибке более полезно, оно означает, что метод был вызван с неправильными параметрами.

RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;
generateNumbers();

required: int[]

found:generateNumbers();

reason: actual and formal argument lists differ in length

При вызове метода вы должны передать те параметры, которые определены в его объявлении. Пожалуйста, проверьте объявление метода и вызов метода, чтобы убедиться, что они совпадают.

Это обсуждение иллюстрируетОшибки Java, вызванные несовместимостью объявлений методов и параметров в вызовах методов。

9. “Missing Return Statement”

Когда в методе отсутствует оператор возврата, выдается сообщение об ошибке «Отсутствует оператор возврата». Метод с возвращаемым значением (тип, не являющийся недействительным) должен иметь оператор, который возвращает значение, чтобы значение можно было вызвать вне метода.

public String[] OpenFile() throws IOException {
    Map<String, Double> map = new HashMap();
    FileReader fr = new FileReader("money.txt");
    BufferedReader br = new BufferedReader(fr);
    try{
        while (br.ready()){
            String str = br.readLine();
            String[] list = str.split(" ");
            System.out.println(list);               
        }
    }   catch (IOException e){
        System.err.println("Error - IOException!");
    }
}

Есть несколько причин, по которым компилятор выдает сообщение «отсутствует оператор возврата»:

  • Оператор возврата был опущен по ошибке.
  • Метод не возвращает никакого значения, но тип не объявлен как недействительный в объявлении метода.

пожалуйста, проверьтеКак устранить ошибку «отсутствует отчет о возврате»Это пример.

10. “Possible Loss of Precision”

Когда информация, присвоенная переменной, превышает верхний предел, который может нести переменная, выдается ошибка «Возможная потеря точности». Как только это произойдет, часть информации будет отброшена. Если это не проблема, переменную следует явно объявить в коде как новый тип.

possible-loss-of-precision-error-11501

Ошибка «возможная потеря точности» обычно возникает в следующих ситуациях:

  • Попробуйте присвоить переменной целочисленного типа действительное число.
  • Попробуйте присвоить данные типа double переменной целочисленного типа.

Основные типы данных в JavaОбъясняет характеристики различных типов данных.

11. “Reached End of File While Parsing”

Это сообщение об ошибке обычно появляется, когда в программе отсутствует закрывающая фигурная скобка («}»). Иногда эту ошибку можно быстро исправить, добавив закрывающую скобку в конце кода.

public class mod_MyMod extends BaseMod
public String Version()
{
     return "1.2_02";
}
public void AddRecipes(CraftingManager recipes)
{
   recipes.addRecipe(new ItemStack(Item.diamond), new Object[] {
      "#", Character.valueOf('#'), Block.dirt
   });
}

Приведенный выше код приведет к следующей ошибке:

java:11: reached end of file while parsing }

Инструменты кодирования и правильные отступы кода могут упростить поиск этих несоответствующих фигурных скобок.

Прочтите эту статью:Отсутствие фигурных скобок вызовет сообщение об ошибке «достигнут конец файла при синтаксическом анализе».。

12. “Unreachable Statement”

Когда оператор появляется в месте, где он не может быть выполнен, выдается ошибка «Недоступный оператор». Обычно это делается после оператора break или return.

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
  ...
else
  ... // dead code

Обычно эту ошибку можно исправить, просто переместив оператор return. Прочтите эту статью:Как исправить ошибку «Недостижимый отчет»。

13. “Variable Might Not Have Been Initialized”

Если локальная переменная, объявленная в методе, не инициализирована, возникнет такая ошибка. Такая ошибка возникает, если вы включаете переменную без начального значения в оператор if.

int x;
if (condition) {
    x = 5;
}
System.out.println(x); // x не может быть инициализирован

Прочтите эту статью:Как избежать появления ошибки «Возможно, переменная не была инициализирована»。

14. “Operator … Cannot be Applied to ”

Эта проблема возникает, когда оператор действует с типом, который не входит в область его определения.

operator < cannot be applied to java.lang.Object,java.lang.Object

Эта ошибка часто возникает, когда код Java пытается использовать строковые типы в вычислениях (вычитание, умножение, сравнение размеров и т. Д.). Чтобы решить эту проблему, вам необходимо преобразовать строку в целое число или число с плавающей запятой.

Прочтите эту статью:Почему нечисловые типы вызывают ошибки программного обеспечения Java。

15. “Inconvertible Types”

Когда код Java пытается выполнить недопустимое преобразование, возникает ошибка «Неконвертируемые типы».

TypeInvocationConversionTest.java:12: inconvertible types
found   : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.Class<?>>
    lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
                                                     ^

Например, логические типы нельзя преобразовать в целые числа.

Прочтите эту статью:Как преобразовывать неконвертируемые типы в программном обеспечении Java。

16. “Missing Return Value”

Если оператор возврата содержит неверный тип, вы получите сообщение «Отсутствует возвращаемое значение». Например, посмотрите на следующий код:

public class SavingsAcc2 {
    private double balance;
    private double interest;
    public SavingsAcc2() {
        balance = 0.0;
        interest = 6.17;
    }
    public SavingsAcc2(double initBalance, double interested) {
        balance = initBalance;
        interest = interested;
    }
    public SavingsAcc2 deposit(double amount) {
        balance = balance + amount;
        return;
    }
    public SavingsAcc2 withdraw(double amount) {
        balance = balance - amount;
        return;
    }
    public SavingsAcc2 addInterest(double interest) {
        balance = balance * (interest / 100) + balance;
        return;
    }
    public double getBalance() {
        return balance;
    }
}

Возвращается следующая ошибка:

SavingsAcc2.java:29: missing return value 
return; 
^ 
SavingsAcc2.java:35: missing return value 
return; 
^ 
SavingsAcc2.java:41: missing return value 
return; 
^ 
3 errors

Обычно эта ошибка возникает из-за того, что оператор return ничего не возвращает.

Прочтите эту статью:Как избежать ошибки «Отсутствует возвращаемое значение»。

17. “Cannot Return a Value From Method Whose Result Type Is Void”

Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, например, в следующем коде:

public static void move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
    if (userMove == -1)
    {
        break;
    }

Обычно эту проблему может решить изменение типа возвращаемого значения метода, чтобы он соответствовал типу в операторе возврата. Например, следующий void можно изменить на int:

public static int move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}

Прочтите эту статью:Как исправить ошибку «Невозможно вернуть значение из метода, тип результата которого недействителен»。

18. “Non-Static Variable … Cannot Be Referenced From a Static Context”

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

public class StaticTest {
    private int count=0;
    public static void main(String args[]) throws IOException {
        count++; //compiler error: non-static variable count cannot be referenced from a static context
    }
}

Чтобы устранить ошибку «Нестатическая переменная… На нее нельзя ссылаться из статического контекста», можно сделать две вещи:

  • Вы можете объявить переменные статическими.
  • Вы можете создавать экземпляры нестатических объектов в статических методах.

Пожалуйста, прочтите это руководство:Разница между статическими и нестатическими переменными。

19. “Non-Static Method … Cannot Be Referenced From a Static Context”

Эта проблема возникает, когда код Java пытается вызвать нестатический метод в статическом классе. Например, такой код:

class Sample
{
   private int age;
   public void setAge(int a)
   {
      age=a;
   }
   public int getAge()
   {
      return age;
   }
   public static void main(String args[])
   {
       System.out.println("Age is:"+ getAge());
   }
}

Вызовет эту ошибку:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Cannot make a static reference to the non-static method getAge() from the type Sample

Чтобы вызвать нестатический метод в статическом методе, необходимо объявить экземпляр класса вызываемого нестатического метода.

Прочтите эту статью:Разница между нестатическими и статическими методами。

20. “(array) Not Initialized”

Если массив был объявлен, но не инициализирован, вы получите сообщение об ошибке типа «(массив) не инициализирован». Длина массива фиксирована, поэтому каждый массив необходимо инициализировать требуемой длиной.

Следующий код правильный:

AClass[] array = {object1, object2}

это тоже нормально:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

Но это не так:

AClass[] array;
...
array = {object1, object2};

Прочтите эту статью:О том, как инициализировать массив в Java。

Продолжение следует

Сегодня мы обсуждали ошибки компилятора, в следующий раз мы обсудим различные исключения времени выполнения, которые могут возникнуть. Как и структура этой статьи, в следующий раз она будет содержать фрагменты кода, пояснения и ссылки по теме, которые помогут вам исправить код как можно скорее.

Чтобы разобраться, в чем разница между ошибками времени компиляции и ошибками времени выполнения в Java, разберемся в сути каждого вида.

Ошибки времени компиляции

Это синтаксические ошибки в коде, которые препятствуют его компиляции.

Пример

public class Test{
   public static void main(String args[]){
      System.out.println("Hello")
   }
}

Итог

C:Sample>Javac Test.java
Test.java:3: error: ';' expected
   System.out.println("Hello")

Ошибки времени выполнения

Исключение (или исключительное событие) – это проблема, возникающая во время выполнения программы. Когда возникает исключение, нормальный поток программы прерывается, и программа / приложение прерывается ненормально, что не рекомендуется, поэтому эти исключения должны быть обработаны.

Пример

import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {
   public static void main(String args[]) {
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file);
   }
}

Итог

C:>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception
FileNotFoundException; must be caught or declared to be thrown
   FileReader fr = new FileReader(file);
                   ^
1 error

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы рассмотрим, что такое ошибки компиляции, а затем конкретно объясним, что такое ошибка «не может найти символ» и как она вызвана.

2. Ошибки времени компиляции

Во время компиляции компилятор анализирует и проверяет код на многие вещи; типы ссылок, слепки типов и объявления методов, чтобы назвать несколько. Эта часть процесса компиляции важна, так как на этом этапе мы получим ошибку компиляции.

В основном существует три типа ошибок времени компиляции:

  • У нас могут быть синтаксисные . Одна из наиболее распространенных ошибок, которые может сделать любой программист, это забыть поставить заоколонку в конце заявления; некоторые другие забывают импорт, несоответствие скобки, или опуская заявление о возвращении
  • Далее, есть ошибки проверки типов. Это процесс проверки безопасности типов в нашем коде. С помощью этой проверки мы убеждаемся, что у нас есть последовательные типы выражений. Например, если мы определяем переменную типа int , мы никогда не должны назначать двойной или Струнные значение для него
  • Между тем, существует вероятность того, что компилятор . Это очень редко, но это может произойти. В этом случае хорошо знать, что наш код не может быть проблемой, но что это скорее внешняя проблема

3. Ошибка “не может найти символ”

Ошибка “не может найти символ” возникает в основном, когда мы пытаемся использовать переменную, которая не определена или объявлена в нашей программе.

Когда наш код компилирует, компилятор должен проверить все идентификаторы, которые у нас есть. Ошибка “не может найти символ” означает, что мы ссылаясь на то, что компилятор не знает о .

3.1. Что может вызвать ошибку «не может найти символ»?

Действительно, есть только одна причина: Компилятор не смог найти определение переменной, на которую мы пытаемся ссылаться.

Но, Есть много причин, почему это происходит. Чтобы помочь нам понять, почему, давайте напомним себе, из чего состоит Java-код.

Наш исходный код Java состоит из:

  • Ключевые слова: правда, ложь, класс, в то время как
  • Буквально: цифры и текст
  • Операторы и другие не-альфа-токены: -,/,
  • Идентификаторы: основные , Читатель , Я , toString и так далее.
  • Комментарии и белое пространство

4. Опечатка

Наиболее распространенные вопросы связаны с орфографией. Если мы вспомним, что все идентификаторы Java чувствительны к случаям, мы можем видеть, что:

  • Струнныйбиулдер
  • строкаСтроитель
  • String_Builder

все это будет по-разному способы неправильно ссылаться на Стрингбилдер класс.

5. Сфера применения экземпляра

Эта ошибка также может быть вызвана при использовании чего-то, что было объявлено вне сферы действия класса.

Допустим, у нас есть Статья класс, который вызывает generateId метод:

public class Article {
    private int length;
    private long id;

    public Article(int length) {
        this.length = length;
        this.id = generateId();
    }
}

Но, мы объявляем generateId метод в отдельном классе:

public class IdGenerator {
    public long generateId() {
        Random random = new Random();
        return random.nextInt();
    }
}

С помощью этой настройки компилятор даст ошибку “не может найти символ” для generateId на линии 7 Статья обрезок. Причина в том, что синтаксис строки 7 подразумевает, что generateId метод объявляется в Статья .

Как и во всех зрелых языках, существует несколько способов решения этой проблемы. Но, один из способов было бы построить ИдГенератор в Статья класса, а затем вызвать метод:

public class Article {
    private int length;
    private long id;

    public Article(int length) {
        this.length = length;
        this.id = new IdGenerator().generateId();
    }
}

6. Неопределенные переменные

Иногда мы забываем объявить переменную. Как мы видим из фрагмента ниже, мы пытаемся манипулировать переменной мы не объявили, в данном случае, текстовые :

public class Article {
    private int length;

    // ...

    public void setText(String newText) {
        this.text = newText; // text variable was never defined
    }
}

Мы решаем эту проблему, объявляя переменную текстовые типа Струнные :

public class Article {
    private int length;
    private String text;
    // ...

    public void setText(String newText) {
        this.text = newText;
    }
}

7. Переменный охват

Когда переменная декларация выходит из сферы действия в момент, когда мы пытались использовать ее, это вызовет ошибку во время компиляции. Обычно это происходит, когда мы работаем с петлями.

Переменные внутри цикла недоступны за пределами цикла:

public boolean findLetterB(String text) {
    for (int i=0; i < text.length(); i++) {
        Character character = text.charAt(i);
        if (String.valueOf(character).equals("b")) {
            return true;
        }
        return false;
    }

    if (character == "a") {  // <-- error!
        ...
    }
}

если заявление должно идти внутри для петли если нам нужно изучить символы больше:

public boolean findLetterB(String text) {
    for (int i = 0; i < text.length(); i++) {
        Character character = text.charAt(i);
        if (String.valueOf(character).equals("b")) {
            return true;
        } else if (String.valueOf(character).equals("a")) {
            ...
        }
        return false;
    }
}

8. Недействительное использование методов или полей

Ошибка “не может найти символ” также произойдет, если мы используем поле в качестве метода или наоборот:

public class Article {
    private int length;
    private long id;
    private List texts;

    public Article(int length) {
        this.length = length;
    }
    // getters and setters
}

Теперь, если мы попытаемся сослаться на тексты поле, как если бы это был метод:

Article article = new Article(300);
List texts = article.texts();

то мы увидим ошибку.

Это потому, что компилятор ищет метод под названием тексты , которого нет.

Вообще-то, есть getter метод, который мы можем использовать вместо этого:

Article article = new Article(300);
List texts = article.getTexts();

Ошибка работы на массиве, а не элемент массива также является проблемой:

for (String text : texts) {
    String firstLetter = texts.charAt(0); // it should be text.charAt(0)
}

И так забывает новые ключевое слово, как в:

String s = String(); // should be 'new String()'

9. Импорт пакетов и классов

Другая проблема заключается в том, чтобы забыть импортировать класс или пакет. Например, с помощью Список объект без импорта java.util.List :

// missing import statement: 
// import java.util.List

public class Article {
    private int length;
    private long id;
    private List texts;  <-- error!
    public Article(int length) {
        this.length = length;
    }
}

Этот код не будет компилироваться, так как программа не знает, что Список ош

10. Неправильный импорт

Импорт неправильного типа, из-за завершения IDE или автоматической коррекции также является общей проблемой.

Подумайте о ситуации, когда мы хотим использовать даты в Java. Много раз мы могли бы импортировать неправильный Дата класс, который не предоставляет методы и функции, как другие классы даты, которые нам могут понадобиться:

Date date = new Date();
int year, month, day;

Чтобы получить год, месяц или день для java.util.Date , мы также должны импортировать Календарь класса и извлечь информацию оттуда.

Просто ссылаясь на getDate () из java.util.Date не будет работать:

...
date.getDay();
date.getMonth();
date.getYear();

Вместо этого мы используем Календарь объект:

...
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
year = cal.get(Calendar.YEAR);
month = cal.get(Calendar.MONTH);
day = cal.get(Calendar.DAY_OF_MONTH);

Однако, если мы импортировали Местное класса, нам не нужен дополнительный код, который предоставляет нам информацию, в которой мы нуждаемся:

...
LocalDate localDate=date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
year = localDate.getYear();
month = localDate.getMonthValue();
day = localDate.getDayOfMonth();

11. Заключение

Компиляторы работают над фиксированным набором правил, которые являются специфическими для языка. Если код не придерживается этих правил, компилятор не может выполнить процесс преобразования, что приводит к ошибке компиляции. Когда мы сталкиваемся с ошибкой компиляции “Не может найти символ”, ключ должен определить причину.

Из сообщения об ошибке мы можем найти строку кода, где происходит ошибка, а какой элемент неправильный. Зная наиболее распространенные проблемы, вызывающие эту ошибку, сделает ее решение очень легко и быстро.

Содержание

  • 1 Общий принцип
  • 2 Ввод и вывод данных
  • 3 Тестирование решений
    • 3.1 CE — Ошибка компиляции (Compilation Error)
    • 3.2 TLE — Нарушен предел времени (Time Limit Exceeded)
    • 3.3 ILE — Нарушен предел ожидания (Idleness Limit Exceeded)
    • 3.4 MLE — Нарушен предел памяти (Memory Limit Exceeded)
    • 3.5 RTE — Ошибка во время выполнения (Run-time Error)
    • 3.6 PE — Ошибка представления (Presentation Error)
    • 3.7 WA — Неправильный ответ (Wrong Answer)
    • 3.8 OK — Принято (Accepted)
    • 3.9 CF — Ошибка тестирования (Check Failed)
    • 3.10 SV — Нарушение безопасности (Security Violation)
  • 4 Особенности языков программирования
    • 4.1 Выбор языка программирования
  • 5 Конфигурация тестирующего сервера
  • 6 Языки программирования

Общий принцип

В систему посылаются только файлы с исходным кодом, а сама посылаемая программа должна состоять только из одного файла: *.dpr, *.cpp, *.java, *.pas и т. д. Нельзя отправить в систему скомпилированный exe-файл, файл проекта Visual Studio и т. п.

В решениях запрещается:

  • осуществлять доступ к сети;
  • выполнять любые операции ввода/вывода, кроме открывания, закрывания, чтения и записи стандартных потоков stdin, stdout, stderr и файлов с именами, явно прописанными в условии задачи;
  • сознательно «ломать» тестирующую систему;
  • выполнять другие программы и порождать новые процессы;
  • изменять права доступа к файловой системе;
  • работать с поддиректориями;
  • создавать и манипулировать ресурсами GUI (окна, диалоговые сообщения и т. д.);
  • работать со внешними устройствами (звук, принтер и т. д.);
  • выполнять прочие действия, призванные нарушить ход учебного процесса.

Решения выполняются в специальном окружении, обеспечивающем безопасный запуск, и попытка выполнить какие-либо из указанных действий закончится, скорее всего, получением вердикта «Ошибка во время выполнения».

Ввод и вывод данных

Во всех задачах необходимо считывать входные данные из текстового файла и выводить результат в текстовый файл. Имена файлов указаны в условии задачи. Предполагается, что файлы располагаются в текущем каталоге программы, поэтому в решениях можно и нужно использовать только их имена без абсолютных путей в файловой системе тестирующего сервера.

Можно считать, что изначально при запуске решения выходной файл будет отсутствовать, и решение должно его создать и записать туда ответ.

Внимательно проверяйте имена файлов в решениях на соответствие условию задачи.

Если в коде решения имена файлов указаны неверно, это может приводить к непредсказуемым последствиям. Так, если имя выходного файла указано неверно и требуемый по условию файл не создаётся, система, скорее всего, выдаст вердикт «Ошибка представления».
В случае, когда в решении на Java перепутано имя входного файла и делается попытка открыть несуществующий файл, выбрасывается исключение. Если автор решения не перехватывает его, программа завершается с вердиктом «Ошибка во время выполнения». Если же исключение обрабатывается, то вполне возможны и другие вердикты в зависимости от того, отработает ли программа и что окажется в выходном файле. Если в решении на C++ неправильно указан входной файл и ошибки специально не обрабатываются, чтение из файла может приводить к чтению произвольных данных («мусора»). Если в программе вместо чтения из файла делается попытка считать данные со стандартного ввода (stdin, который обычно связан с клавиатурой консоли), программа заблокируется («повиснет») в ожидании ввода и будет завершена с вердиктом «Превышен предел времени».

Решение может выводить произвольные данные «в консоль», то есть в стандартные потоки stdout, stderr, которые обычно связаны с консольным окном (например для отладки). Это не запрещается и не влияет на результат. Проверяется только содержимое выходного файла. Следует помнить, что на вывод тратится дополнительное время, поэтому большой объём отладочной информации может критически замедлить вашу программу. Вывод в stderr медленнее, чем в stdout, поскольку не буферизируется.

Тестирование решений

Каждое отправленное решение проходит на сервере проверку на нескольких тестах. Задача считается решённой только в случае прохождения всех тестов. Решение запускается на всех тестах, которые есть по задаче, и процесс тестирования не прерывается на первом непройденном тесте, как это делается в соревнованиях типа ACM.

Тестирование осуществляется автоматически, поэтому решения должны строго следовать формату входных и выходных данных, который описан в условии. В случае неясности можно задавать вопросы преподавателям. Если не сказано явно, все входные данные можно считать корректными и удовлетворяющими ограничениям из условия. Например, если сказано, что на входе целое число от 1 до 100 включительно, то можно считать, что это так и есть, и проверять неравенства и выводить ошибку в случае, если это не так, в коде решения нет необходимости.

Тесты по каждой задаче не упорядочены по сложности, по размеру входных данных, по какому-то иному критерию, а следуют в исторически сложившемся порядке их добавления в систему.

Не гарантируется, что первый тест в системе будет совпадать с тестом из условия (зачастую это не так).

Результатом проверки является итоговое сообщение системы и, возможно, в скобках номер первого теста, вызвавшего ошибку (если таковая имела место). Например, вердикт «Неправильный ответ (43)» означает, что решение успешно скомпилировалось и прошло без ошибок первые 42 теста по задаче, но на тесте под номером 43 выдало неверный ответ.

Далее опишем все допустимые сообщения тестирующей системы и укажем возможные причины их появления.

CE — Ошибка компиляции (Compilation Error)

Не удалось скомпилировать решение и получить исполняемый файл для запуска. Решение в таком случае, очевидно, не может быть проверено ни на одном тесте.

Посмотреть вывод компилятора и понять, почему код не удаётся скомпилировать, можно путём нажатия на иконку Compileerror.png в таблице с вашими решениями. Наиболее частые причины ошибки компиляции: выбран неверный компилятор (для другого языка программирования или же несовместимая версия, например Java v7 вместо Java v8), отправляется не тот файл (файл проекта IDE вместо файла с исходным кодом).

Время работы компилятора ограничено 30 секундами. Если он не успел отработать по каким-либо причинам, также будет выставлен вердикт «Ошибка компиляции».

TLE — Нарушен предел времени (Time Limit Exceeded)

Для каждого теста установлено своё ограничение по времени (Time Limit) в секундах. Для разных тестов по одной задаче ограничение по времени может быть разным.

Тестирующая система учитывает так называемое процессорное время (CPU Time) выполнения процесса в операционной системе. Нет смысла делать решение задачи многопоточным, потому что распараллеливание хоть и позволяет сократить реальное время работы (Wall Time), но не уменьшает процессорное время.

Процесс-решение запускается на тесте, и если процесс не успевает завершиться в течение отведённого времени, он принудительно завершается и выставляется вердикт «Нарушен предел времени». В качестве времени работы решения на тесте указывается то время, которое процесс фактически проработал до того, как был приостановлен. Нет возможности узнать, сколько бы программа проработала, если бы не была снята по времени. Если при ограничении по времени на тест в 1 секунду вы видите, что решение получает вердикт «Нарушен предел времени» и работает 1015 мс, то нельзя это понимать как «решение чуть-чуть не успевает, надо ускорить его на 15 мс». Если решение останавливается по времени, то вывод программы никак не проверяется на предмет его правильности.

Возможные причины появления ошибки «Нарушен предел времени»:

  • неэффективный алгоритм (например, в решении реализован алгоритм с временной сложностью Ω(n2), хотя задача предполагает решение за O(n log n));
  • недостаточно эффективная программная реализация (идея и алгоритм правильные, но код написан не очень хорошо: например, ввод данных из файла осуществляется медленно, чрезмерно часто выделяется и освобождается память);
  • попытка чтения данных с консоли (std::cin, scanf(), getchar() в C++, System.in в Java), тогда как нужно читать входные данные из файла (в этом случае программа блокируется в ожидании ввода и зависает, не расходуя при этом CPU Time, поэтому такой случай тестирующая система обрабатывает отдельно);
  • ошибка в программе (например, программа входит в бесконечный цикл).

Не рекомендуется «пропихивать» медленное решение, отправляя его многократно, пока система не «согласится» его принять. Решение в любой момент может быть перетестировано и, соответственно, может перестать быть принятым из-за нарушения предела времени.

ILE — Нарушен предел ожидания (Idleness Limit Exceeded)

Программа зависла в ожидании, не потребляя при этом ресурсы процессора.

Такое может быть, например, если согласно условию чтение входных данных осуществляется из файла, а решение выполняет ввод с консоли. В этом случае процесс решения заблокируется в ожидании нажатия клавиш на клавиатуре. Через некоторое время система тестирования принудительно завершит этот процесс и выставит вердикт ILE.

MLE — Нарушен предел памяти (Memory Limit Exceeded)

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

Ограничение по памяти есть не для всех задач. Гарантируется, что для всех тестов в рамках одной задачи ограничение по памяти одинаково.

Как и в случае нарушения ограничения по времени, программа при нарушении ограничения по памяти аварийно завершается тестирующей системой, её вывод не проверяется на правильность. Точно так же не следует воспринимать размер памяти, использованной до момента аварийного завершения, как объём, которого решению хватило бы для успешной работы. Более точно, вердикт MLE, полученный с использованием 257 МБ памяти, говорит о том, что приложение успело использовать 257 МБ памяти и было принудительно остановлено, но ничего не говорит о том, сколько памяти использовало бы приложение, не будучи принудительно остановленным.

В некоторых случаях при разовом выделении чрезмерно большого блока в памяти, этот запрос может быть не выполнен операционной системой, что в результате может привести к ошибке во время выполнения или (значительно реже) другому результату неопределённого поведения в случае с языком C++.

RTE — Ошибка во время выполнения (Run-time Error)

В операционной системе есть такое понятие, как код завершения процесса (Exit Code). Этот подход используется как в Windows, так и в ОС семейства UNIX. Это целое число, которое остаётся после прекращения выполнения программы. Общепринятое соглашение гласит, что нулевой код завершения свидетельствует о нормальном завершении процесса без ошибок, любой другой — об ошибке. Тестирующая система проверяет код завершения вашего решения, и если он не равен нулю, выставляет вердикт «Ошибка во время выполнения». При этом никак не проверяется то, что решение успело вывести в выходной файл.

Укажем типичные причины ошибок во время выполнения.

  • Использована директива package в коде программы на Java.
    В результате программа на Java находится не в пакете по умолчанию. Компилятор Java сгенерировал класс в некотором пакете (ошибки компиляции нет), а при запуске виртуальная машина Java не смогла найти этот класс, потому что искала в пакете по умолчанию (возникло исключение ClassNotFoundException с сообщением Could not find or load main class).
  • Выход за границы допустимой области памяти в программе на C++.
    Выход за границы массива, разыменование неправильного указателя, обращение к нулевому указателю.
  • Переполнение системного стека.
    Эта причина является частой в случае рекурсии. Вообще, системный стек используется для размещения параметров функций, локальных переменных. Его размер, как правило, невелик и по умолчанию равен 1 МБ. При вызове функции стековая структура позволяет естественным образом сохранить текущие состояния всех локальных переменных и вернуться к ним, когда вызов завершится и управление вернётся в исходную точку. Если в алгоритме используется глубокая рекурсия, то размера стека может не хватить для хранения контекстов всех вызовов. Решений этой проблемы два:

    1. переписать алгоритм нерекурсивно (например с использованием своего стека, а не системного);
    2. увеличить размер системного стека, что делается по-разному для разных языков программирования (см. примеры для C++ (Visual Studio) и Java).
  • Ошибка ввода-вывода (попытка открыть несуществующий входной файл).
    Нужно проверить правильность имени входного файла.
  • Программа целенаправленно была завершена с ненулевым кодом выхода.
    В программе на C++ это может быть, если функция main() в C++ вернула ненулевой код (return (non-zero) в функции main()). Рекомендуется завершать функцию main() оператором return 0 (в старых компиляторах C++ это обязательно, современные компиляторы же подразумевают возврат нулевого кода автоматически). Также программу на C++ с произвольным кодом завершает вызов exit().
    В программе на Java можно завершить процесс с произвольным кодом с помощью System.exit().
  • Необработанное исключение.
    Причин возникновения исключений может быть масса. Например, если в Java функции Integer.parseInt() / Double.parseDouble() была передана строка, содержащая пробельные символы (ASCII-коды 9, 10, 13, 32), выбрасывается исключение NumberFormatException.
  • Целочисленное деление на ноль.
    При выполнении деления нужно всегда думать, а не может ли делитель оказаться равным нулю. В то же время стоит отметить, что вещественное деление на ноль (в типах с плавающей точкой double, float) по умолчанию не приводит к завершению программы, а даёт специальные значения +Inf, -Inf или NaN.

PE — Ошибка представления (Presentation Error)

Наиболее частая причина возникновения этой ошибки — не найден выходной файл. Возможно, вы забыли создать выходной файл и выводите ответ в консоль (он в таком случае игнорируется). Проверьте имена входного и выходного файла в вашей программе на соответствие условию задачи. Исторически сложилось, что в разных задачах входной и выходной файл именуются по разным правилам: input.txt и output.txt, in.txt и out.txt, input.in и output.out (обратите внимание, что нет расширения txt), [задача].in и [задача].out

Для некоторых задач программа проверки (checker) дополнительно удостоверяется, что ваш вывод соответствует определённому формату, и выдаёт ошибку представления в случае, если это не так. Например, если в задаче нужно вывести число, а вы выводите строку. Или если в задаче нужно вывести сначала число k, затем k чисел, а ваше решение выводит число k и далее (k + 1) чисел (то есть решение выводит в файл лишние данные).

Также имейте в виду, что отлавливание исключений и других ошибок не должно быть самоцелью. Если исключение не обрабатывается каким-либо образом, обычно нет смысла его ловить по следующей причине. Аварийное завершение работы программы в результате ошибки во время выполнения приводит к вердикту «Ошибка во время выполнения», только если соответствующее исключение было «проброшено» наружу, а не «заглушено» на каком-то этапе. Если исключение отлавливается, но никак не обрабатывается, то в результате возникновения соответствующей ошибки следует ожидать вердикт «Ошибка представления» или же «Неправильный ответ» (реже).

WA — Неправильный ответ (Wrong Answer)

Для многих задач ответ однозначен, и проверяется просто побайтовое совпадение вашего выходного файла и сохранённого правильного ответа. Такая проверка требует строгого соблюдения формата файла, не допускает незначащих пробелов и пустых строк. Например, если правильный ответ имеет вид (пробелы обозначены символом ␣)

5
1␣2␣3␣4␣5

и решение вывело

5
1␣2␣3␣4␣5␣

(лишний пробел в конце второй строки), то будет получен вердикт «Неправильный ответ». Для некоторых задач написаны проверяющие программы (checker), которые к таким различиям лояльны и засчитывают ответы с лишними пробелами как правильные. Всегда точно следуйте формату файла и не выводите лишних пробелов, и проблем не будет.

После последней строки файла можно выводить или не выводить перевод строки — не важно. Есть две точки зрения в зависимости от того, с какой стороны смотреть на символ перевода строки:

  1. каждая строка завершается переводом строки, поэтому n в конце файла нужен;
  2. перевод строки является разделителем между соседними строками, поэтому n в конце файла не нужен.

Первая точка зрения является общепринятой. Так, компилятор gcc, система контроля версий git и многие другие программы выдают предупреждение no newline at the end of file, если в самом конце файла нет символов новой строки. Обсуждение вопроса можно почитать на stackoverflow.

Поэтому рекомендуется придерживаться первого подхода и завершать все строки переводами строк.

Другие очевидные причины получения неправильного ответа:

  • неверный алгоритм;
  • ошибка в программе.

Бывает такое, что решение от запуска к запуску даёт разные ответы, или же правильно работает на одном компьютере и неправильно на другом. Такие случаи, как правило, связаны с ошибками в решениях.

OK — Принято (Accepted)

Программа работает правильно и прошла все тесты с соблюдением всех ограничений.

Если решение принято системой, это ещё не означает, что в его основе лежит правильный алгоритм. В любой момент могут появиться новые наборы входных данных, на которых будут заново протестированы все решения по задаче. Если ваше решение на самом деле не полностью верно и прошло только из-за недостаточно сильного набора тестов, оно может в будущем потерять статус «Принято».

CF — Ошибка тестирования (Check Failed)

Если указан номер теста, то программа успешно завершается на предложенном тесте (укладывается в отведённые время и память и не совершает ошибок во время выполнения), но результат не удаётся проверить из-за ошибок в программе проверки. Вашей ошибки в этом случае, возможно, никакой нет и после исправления программы проверки будет получен вердикт OK. Не исключены ещё два варианта: WA, PE.

Имейте в виду, что если ошибка тестирования возникает на первом же тесте, то на остальных Ваше решение не запускается вовсе. Соответственно, в этом случае после устранения ошибок программы проверки вердикты TLE, MLE, RTE также могут возникнуть в любом тесте, кроме первого.

Если же номер теста, на котором возникает ошибка тестирования, не указан, значит, программа проверки не была скомпилирована, а Ваше решение не запускалось вовсе. В этом случае правильным может быть любой вердикт, отличный от CF.

Если у Вас возникла ошибка тестирования, мы, скорее всего, это заметим достаточно быстро. Тем не менее, имеет смысл задать вопрос через пункт «Сообщения» в меню курса. Не забывайте выбрать задачу, которой касается этот вопрос.

SV — Нарушение безопасности (Security Violation)

Ошибка означает, что программа попыталась выполнить запрещённые действия.

К их числу относится попытка создания новых процессов. Вашим решениям запрещено запускать на выполнение другие программы. Например, в коде

порождается новый процесс командной оболочки cmd.exe и в нём выполняется команда pause. Пожалуйста, не пишите так, для достижения аналогичного эффекта можно использовать другие приёмы.

Особенности языков программирования

У каждого конкретного языка программирования есть свои особенности, о которых полезно знать. Далее рассмотрены отдельные особенности написания решений на разных языках программирования:

  • C++;
  • Java;
  • C#;
  • Python.

Выбор языка программирования

Разные задачи можно решать на разных языках. Часто для конкретной задачи тот или иной язык оказывается предпочтительным. Например, если в задаче требуются тяжёлые вычисления, то её может быть проще сдать на C++, чем на Java, за счёт более быстрой работы программы на C++ (для кода на Java могут потребоваться более изощрённые оптимизации, чтобы он прошёл по времени). С другой стороны, если задача требует проведения вычислений с большими целыми числами, выходящими за пределы диапазона 64-битных переменных, то есть «длинной арифметики», то решение существенно проще написать на Java, воспользовавшись готовым качественно написанным классом BigInteger для операций с числами произвольной длины.

Конфигурация тестирующего сервера

Сервер, на котором осуществляется запуск решений, является виртуальной машиной, выполняющейся внутри Microsoft Hyper-V Server 2012 R2. Виртуальный компьютер работает под управлением Windows 7 Professional x64, оснащён процессором Intel® Core™ i3-4130 (Haswell, кэш 3 МБ, 3,40 ГГц, доступно только одно ядро) и 4 ГБ оперативной памяти. Для хранения входных и выходных файлов используется RAM-диск, чтобы обеспечить максимальную производительность ввода-вывода.

Языки программирования

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

Размер системного стека явно не задаётся (используется размер по умолчанию). При компиляции кода на C++ включен режим оптимизации O2.

Возникает ошибка при создании:

(9:9)illegal start of expression.

В чем моя ошибка?

Имеется код:

package com.company;
import java.util.Scanner;

 public class Main {

public static void main(String[] args) {
    // write your code here
    Scanner scc = new Scanner(System.in);
    public static void main(String[] args) {
        int firstNum = whatnumber();
        int secodNum = whatnumber();
        char znak = Goperation();
        int resault = resaultX();
        System.out.print(resault);


    }
    public static int whatnumber() {
        System.out.print("Введите число: ");
        int num;
        num = scc.nextInt();
    }
    public static void Goperation() {
        System.out.print("Введите знак: ");
        char znakL;
        znakL = scc.hasNext();
    }
    public static void resaultX(int firstNum, int secondNum, char operation){
        int resault;
        switch (operation) {
            case "+":
                resault = firstNum + secondNum;
                break;
            case "-":
                resault = firstNum - secondNum;
                break;
            case "/":
                resault = firstNum / secondNum;
                break;
            case "*":
                resault = firstNum * secondNum;
                break;
        }
    }
}

Roman C's user avatar

Roman C

8,5614 золотых знака16 серебряных знаков26 бронзовых знаков

задан 28 июн 2018 в 9:32

Шурок Петров's user avatar

5

  1. Как и сказали main внутри main — нельзя писать метод внутри метода
  2. Не понятно вообще это вам нужно(вторая строка с main) — просто удалите
  3. Даже учитывая что вы неправильно написали второй раз main — тут вы еще не закрыли скобку, всегда открывающиеся скобки нужно закрывать.
  4. В методе Goperation()scc.hasNext() — возращает boolean — правда/ не правда, т.е. вы не записываете чар, а проверяете наличие.
    «Существует и метод hasNext(), проверяющий остались ли в потоке ввода какие-то символы.»
    http://kostin.ws/java/java-input-stream.html

    1. Если вы используете char — то нужно указывать '', вместо "" — они используются для String.

ответ дан 28 июн 2018 в 10:12

sank's user avatar

sanksank

3772 серебряных знака17 бронзовых знаков

   package My.Package;
import java.util.Scanner;

public class Main {

    Scanner scc = new Scanner(System.in);
    public static void main(String[] args) {
        int firstNum = whatnumber();
        int secodNum = whatnumber();
        String znak = Goperation();
        int resault = resaultX(firstNum,secodNum,znak);
        System.out.print(resault);


    }
    public static int whatnumber() {
        Scanner scc = new Scanner(System.in);
        System.out.print("Введите число: ");
        int num;
        num = scc.nextInt();
        return  num;
    }
    public static String Goperation() {
        Scanner scc = new Scanner(System.in);
        System.out.print("Введите знак: ");
        String znakL;
        znakL = scc.nextLine();
        return  znakL;
    }
    public static int resaultX(int firstNum, int secondNum, String operation){
        int resault;
        switch (operation) {
            case "+":
                resault = firstNum + secondNum;
                break;
            case "-":
                resault = firstNum - secondNum;
                break;
            case "/":
                resault = firstNum / secondNum;
                break;
            case "*":
                resault = firstNum * secondNum;
                break;
            default: resault = 0;
        }
        return resault;
    }
}

ответ дан 28 июн 2018 в 10:20

Dima Morgunov's user avatar

(9:9)illegal start of expression. — говорит что это ошибка компиляции. Структура программы на Java имеет определённый синтаксис. Этот синтаксис определяет правила использования элементов языка в вашей программе.

Java это очень сложный язык. Конечно читать сразу JLS будет сложно, поэтому новичкам рекомендуют начинить с пониманием базовых концепций. Потом уже переходить к кодированию.

Suvitruf - Andrei Apanasik's user avatar

ответ дан 28 июн 2018 в 10:44

Roman C's user avatar

Roman CRoman C

8,5614 золотых знака16 серебряных знаков26 бронзовых знаков

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы рассмотрим, что такое ошибки компиляции, а затем конкретно объясним, что такое ошибка «не может найти символ» и как она вызвана.

2. Ошибки времени компиляции

Во время компиляции компилятор анализирует и проверяет код на многие вещи; типы ссылок, слепки типов и объявления методов, чтобы назвать несколько. Эта часть процесса компиляции важна, так как на этом этапе мы получим ошибку компиляции.

В основном существует три типа ошибок времени компиляции:

  • У нас могут быть синтаксисные . Одна из наиболее распространенных ошибок, которые может сделать любой программист, это забыть поставить заоколонку в конце заявления; некоторые другие забывают импорт, несоответствие скобки, или опуская заявление о возвращении
  • Далее, есть ошибки проверки типов. Это процесс проверки безопасности типов в нашем коде. С помощью этой проверки мы убеждаемся, что у нас есть последовательные типы выражений. Например, если мы определяем переменную типа int , мы никогда не должны назначать двойной или Струнные значение для него
  • Между тем, существует вероятность того, что компилятор . Это очень редко, но это может произойти. В этом случае хорошо знать, что наш код не может быть проблемой, но что это скорее внешняя проблема

3. Ошибка “не может найти символ”

Ошибка “не может найти символ” возникает в основном, когда мы пытаемся использовать переменную, которая не определена или объявлена в нашей программе.

Когда наш код компилирует, компилятор должен проверить все идентификаторы, которые у нас есть. Ошибка “не может найти символ” означает, что мы ссылаясь на то, что компилятор не знает о .

3.1. Что может вызвать ошибку «не может найти символ»?

Действительно, есть только одна причина: Компилятор не смог найти определение переменной, на которую мы пытаемся ссылаться.

Но, Есть много причин, почему это происходит. Чтобы помочь нам понять, почему, давайте напомним себе, из чего состоит Java-код.

Наш исходный код Java состоит из:

  • Ключевые слова: правда, ложь, класс, в то время как
  • Буквально: цифры и текст
  • Операторы и другие не-альфа-токены: -,/,
  • Идентификаторы: основные , Читатель , Я , toString и так далее.
  • Комментарии и белое пространство

4. Опечатка

Наиболее распространенные вопросы связаны с орфографией. Если мы вспомним, что все идентификаторы Java чувствительны к случаям, мы можем видеть, что:

  • Струнныйбиулдер
  • строкаСтроитель
  • String_Builder

все это будет по-разному способы неправильно ссылаться на Стрингбилдер класс.

5. Сфера применения экземпляра

Эта ошибка также может быть вызвана при использовании чего-то, что было объявлено вне сферы действия класса.

Допустим, у нас есть Статья класс, который вызывает generateId метод:

public class Article {
    private int length;
    private long id;

    public Article(int length) {
        this.length = length;
        this.id = generateId();
    }
}

Но, мы объявляем generateId метод в отдельном классе:

public class IdGenerator {
    public long generateId() {
        Random random = new Random();
        return random.nextInt();
    }
}

С помощью этой настройки компилятор даст ошибку “не может найти символ” для generateId на линии 7 Статья обрезок. Причина в том, что синтаксис строки 7 подразумевает, что generateId метод объявляется в Статья .

Как и во всех зрелых языках, существует несколько способов решения этой проблемы. Но, один из способов было бы построить ИдГенератор в Статья класса, а затем вызвать метод:

public class Article {
    private int length;
    private long id;

    public Article(int length) {
        this.length = length;
        this.id = new IdGenerator().generateId();
    }
}

6. Неопределенные переменные

Иногда мы забываем объявить переменную. Как мы видим из фрагмента ниже, мы пытаемся манипулировать переменной мы не объявили, в данном случае, текстовые :

public class Article {
    private int length;

    // ...

    public void setText(String newText) {
        this.text = newText; // text variable was never defined
    }
}

Мы решаем эту проблему, объявляя переменную текстовые типа Струнные :

public class Article {
    private int length;
    private String text;
    // ...

    public void setText(String newText) {
        this.text = newText;
    }
}

7. Переменный охват

Когда переменная декларация выходит из сферы действия в момент, когда мы пытались использовать ее, это вызовет ошибку во время компиляции. Обычно это происходит, когда мы работаем с петлями.

Переменные внутри цикла недоступны за пределами цикла:

public boolean findLetterB(String text) {
    for (int i=0; i < text.length(); i++) {
        Character character = text.charAt(i);
        if (String.valueOf(character).equals("b")) {
            return true;
        }
        return false;
    }

    if (character == "a") {  // <-- error!
        ...
    }
}

если заявление должно идти внутри для петли если нам нужно изучить символы больше:

public boolean findLetterB(String text) {
    for (int i = 0; i < text.length(); i++) {
        Character character = text.charAt(i);
        if (String.valueOf(character).equals("b")) {
            return true;
        } else if (String.valueOf(character).equals("a")) {
            ...
        }
        return false;
    }
}

8. Недействительное использование методов или полей

Ошибка “не может найти символ” также произойдет, если мы используем поле в качестве метода или наоборот:

public class Article {
    private int length;
    private long id;
    private List texts;

    public Article(int length) {
        this.length = length;
    }
    // getters and setters
}

Теперь, если мы попытаемся сослаться на тексты поле, как если бы это был метод:

Article article = new Article(300);
List texts = article.texts();

то мы увидим ошибку.

Это потому, что компилятор ищет метод под названием тексты , которого нет.

Вообще-то, есть getter метод, который мы можем использовать вместо этого:

Article article = new Article(300);
List texts = article.getTexts();

Ошибка работы на массиве, а не элемент массива также является проблемой:

for (String text : texts) {
    String firstLetter = texts.charAt(0); // it should be text.charAt(0)
}

И так забывает новые ключевое слово, как в:

String s = String(); // should be 'new String()'

9. Импорт пакетов и классов

Другая проблема заключается в том, чтобы забыть импортировать класс или пакет. Например, с помощью Список объект без импорта java.util.List :

// missing import statement: 
// import java.util.List

public class Article {
    private int length;
    private long id;
    private List texts;  <-- error!
    public Article(int length) {
        this.length = length;
    }
}

Этот код не будет компилироваться, так как программа не знает, что Список ош

10. Неправильный импорт

Импорт неправильного типа, из-за завершения IDE или автоматической коррекции также является общей проблемой.

Подумайте о ситуации, когда мы хотим использовать даты в Java. Много раз мы могли бы импортировать неправильный Дата класс, который не предоставляет методы и функции, как другие классы даты, которые нам могут понадобиться:

Date date = new Date();
int year, month, day;

Чтобы получить год, месяц или день для java.util.Date , мы также должны импортировать Календарь класса и извлечь информацию оттуда.

Просто ссылаясь на getDate () из java.util.Date не будет работать:

...
date.getDay();
date.getMonth();
date.getYear();

Вместо этого мы используем Календарь объект:

...
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
year = cal.get(Calendar.YEAR);
month = cal.get(Calendar.MONTH);
day = cal.get(Calendar.DAY_OF_MONTH);

Однако, если мы импортировали Местное класса, нам не нужен дополнительный код, который предоставляет нам информацию, в которой мы нуждаемся:

...
LocalDate localDate=date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
year = localDate.getYear();
month = localDate.getMonthValue();
day = localDate.getDayOfMonth();

11. Заключение

Компиляторы работают над фиксированным набором правил, которые являются специфическими для языка. Если код не придерживается этих правил, компилятор не может выполнить процесс преобразования, что приводит к ошибке компиляции. Когда мы сталкиваемся с ошибкой компиляции “Не может найти символ”, ключ должен определить причину.

Из сообщения об ошибке мы можем найти строку кода, где происходит ошибка, а какой элемент неправильный. Зная наиболее распространенные проблемы, вызывающие эту ошибку, сделает ее решение очень легко и быстро.

оригинал:50 Common Java Errors and How to Avoid Them (Part 1)
Автор:Angela Stringfellow
перевод: Гусь напуган

Примечание переводчика: в этой статье представлены 20 распространенных ошибок компилятора Java. Каждая ошибка включает фрагменты кода, описания проблем и предоставляет ссылки по теме, которые помогут вам быстро понять и решить эти проблемы. Ниже приводится перевод.

При разработке программного обеспечения Java вы можете столкнуться со многими типами ошибок, но большинства из них можно избежать. Мы тщательно отобрали 20 наиболее распространенных ошибок программного обеспечения Java, включая примеры кода и руководства, которые помогут вам решить некоторые распространенные проблемы с кодированием.

Чтобы получить дополнительные советы и рекомендации по написанию программ на Java, вы можете загрузить наш «Comprehensive Java Developer’s Guide«Эта книга содержит все, что вам нужно, от всевозможных инструментов до лучших веб-сайтов и блогов, каналов YouTube, влиятельных лиц в Twitter, групп в LinkedIn, подкастов, мероприятий, которые необходимо посетить, и многого другого.

Если вы используете .NET, прочтите нашРуководство по 50 наиболее распространенным программным ошибкам .NETЧтобы избежать этих ошибок. Но если ваша текущая проблема связана с Java, прочтите следующую статью, чтобы понять наиболее распространенные проблемы и способы их решения.

Ошибка компилятора

Сообщения об ошибках компилятора создаются, когда компилятор выполняет код Java. Важно, что компилятор может выдавать несколько сообщений об ошибках для одной ошибки. Так что исправьте ошибку и перекомпилируйте, что может решить многие проблемы.

1. “… Expected”

Эта ошибка возникает, когда в коде чего-то не хватает. Обычно это происходит из-за отсутствия точки с запятой или закрывающей скобки.

private static double volume(String solidom, double alturam, double areaBasem, double raiom) {
double vol;
    if (solidom.equalsIgnoreCase("esfera"){
        vol=(4.0/3)*Math.pi*Math.pow(raiom,3);
    }
    else {
        if (solidom.equalsIgnoreCase("cilindro") {
            vol=Math.pi*Math.pow(raiom,2)*alturam;
        }
        else {
            vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam;
        }
    }
    return vol;
}

Обычно это сообщение об ошибке не указывает точное местонахождение проблемы. Чтобы найти проблему, вам необходимо:

  • Убедитесь, что все открывающие скобки имеют соответствующие закрывающие скобки.
  • Посмотрите на код перед строкой, обозначенной ошибкой. Эта ошибка обычно обнаруживается компилятором в более позднем коде.
  • Иногда некоторые символы (например, открывающая скобка) не должны быть первыми в коде Java.

Примеры:Ошибка из-за отсутствия скобок。

2. “Unclosed String Literal”

Если в конце строки отсутствует кавычка, создается сообщение об ошибке «Незамкнутый строковый литерал», и это сообщение отображается в строке, где произошла ошибка.

 public abstract class NFLPlayersReference {
    private static Runningback[] nflplayersreference;
    private static Quarterback[] players;
    private static WideReceiver[] nflplayers;
    public static void main(String args[]){
    Runningback r = new Runningback("Thomlinsion");
    Quarterback q = new Quarterback("Tom Brady");
    WideReceiver w = new WideReceiver("Steve Smith");
    NFLPlayersReference[] NFLPlayersReference;
        Run();// {
        NFLPlayersReference = new NFLPlayersReference [3];
        nflplayersreference[0] = r;
        players[1] = q;
        nflplayers[2] = w;
            for ( int i = 0; i < nflplayersreference.length; i++ ) {
            System.out.println("My name is " + " nflplayersreference[i].getName());
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            System.out.println("NFL offensive threats have great running abilities!");
        }
    }
    private static void Run() {
        System.out.println("Not yet implemented");
    }     
}

Обычно эта ошибка возникает в следующих ситуациях:

  • Строка не заканчивается кавычками. Это легко изменить, просто заключите строку в указанные кавычки.
  • Строка превышает одну строку. Длинную строку можно разделить на несколько коротких строк и соединить знаком плюс («+»).
  • Кавычки, являющиеся частью строки, не экранируются обратной косой чертой («»).

Прочтите эту статью:Сообщение об ошибке незакрытой строки。

3. “Illegal Start of an Expression”

Есть много причин для ошибки «Незаконное начало выражения». Это стало одним из наименее полезных сообщений об ошибках. Некоторые разработчики думают, что это вызвано плохим запахом кода.

Обычно выражение создается для генерации нового значения или присвоения значений другим переменным. Компилятор ожидает найти выражение, но посколькуГрамматика не оправдывает ожиданийВыражение не найдено. Эту ошибку можно найти в следующем коде.

} // добавляем сюда
       public void newShape(String shape) {
        switch (shape) {
            case "Line":
                Shape line = new Line(startX, startY, endX, endY);
            shapes.add(line);
            break;
                case "Oval":
            Shape oval = new Oval(startX, startY, endX, endY);
            shapes.add(oval);
            break;
            case "Rectangle":
            Shape rectangle = new Rectangle(startX, startY, endX, endY);
            shapes.add(rectangle);
            break;
            default:
            System.out.println("ERROR. Check logic.");
        }
        }
    } // удаляем отсюда
    }

Прочтите эту статью:Как устранить ошибки «неправильное начало выражения»。

4. “Cannot Find Symbol”

Это очень распространенная проблема, потому что все идентификаторы в Java должны быть объявлены до их использования. Эта ошибка возникает из-за того, что компилятор не понимает значения идентификатора при компиляции кода.

cannot-find-symbol-error-screenshot-11495

Сообщение об ошибке «Не удается найти символ» может иметь множество причин:

  • Написание объявления идентификатора может не соответствовать написанию, используемому в коде.
  • Переменная никогда не объявлялась.
  • Переменная не объявлена ​​в той же области видимости.
  • Никакие классы не импортируются.

Прочтите эту статью:Обсуждение ошибки «не удается найти символ»。

5. “Public Class XXX Should Be in File”

Если класс XXX и имя файла программы Java не совпадают, будет сгенерировано сообщение об ошибке «Открытый класс XXX должен быть в файле». Только когда имя класса и имя файла Java совпадают, код может быть скомпилирован.

package javaapplication3;  
  public class Robot {  
        int xlocation;  
        int ylocation;  
        String name;  
        static int ccount = 0;  
        public Robot(int xxlocation, int yylocation, String nname) {  
            xlocation = xxlocation;  
            ylocation = yylocation;  
            name = nname;  
            ccount++;         
        } 
  }
  public class JavaApplication1 { 
    public static void main(String[] args) {  
        robot firstRobot = new Robot(34,51,"yossi");  
        System.out.println("numebr of robots is now " + Robot.ccount);  
    }
  }

Чтобы решить эту проблему, вы можете:

  • Назовите класс и файл с тем же именем.
  • Убедитесь, что два имени всегда совпадают.

Прочтите эту статью:Примеры ошибки «Открытый класс XXX должен быть в файле»。

6. “Incompatible Types”

«Несовместимые типы» — это логические ошибки, которые возникают, когда операторы присваивания пытаются сопоставить типы переменных и выражений. Обычно эта ошибка возникает при присвоении строки целому числу и наоборот. Это не синтаксическая ошибка Java.

test.java:78: error: incompatible types
return stringBuilder.toString();
                             ^
required: int
found:    String
1 error

Когда компилятор выдает сообщение «несовместимые типы», решить эту проблему действительно непросто:

  • Используйте функции преобразования типов.
  • Разработчикам может потребоваться изменить исходные функции кода.

Взгляните на этот пример:Присвоение строки целому числу приведет к ошибке «несовместимые типы».。

7. “Invalid Method Declaration; Return Type Required”

Это сообщение об ошибке означает, что тип возвращаемого значения метода не объявлен явно в объявлении метода.

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

Есть несколько ситуаций, которые вызывают ошибку «недопустимое объявление метода; требуется тип возвращаемого значения»:

  • Забыл объявить тип.
  • Если метод не имеет возвращаемого значения, вам необходимо указать «void» в качестве возвращаемого типа в объявлении метода.
  • Конструктору не нужно объявлять тип. Однако, если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без указанного типа.

Взгляните на этот пример:Проблема именования конструктора вызывает проблему «недопустимое объявление метода; требуется тип возвращаемого значения».。

8. “Method in Class Cannot Be Applied to Given Types”

Это сообщение об ошибке более полезно, оно означает, что метод был вызван с неправильными параметрами.

RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;
generateNumbers();

required: int[]

found:generateNumbers();

reason: actual and formal argument lists differ in length

При вызове метода вы должны передать те параметры, которые определены в его объявлении. Пожалуйста, проверьте объявление метода и вызов метода, чтобы убедиться, что они совпадают.

Это обсуждение иллюстрируетОшибки Java, вызванные несовместимостью объявлений методов и параметров в вызовах методов。

9. “Missing Return Statement”

Когда в методе отсутствует оператор возврата, выдается сообщение об ошибке «Отсутствует оператор возврата». Метод с возвращаемым значением (тип, не являющийся недействительным) должен иметь оператор, который возвращает значение, чтобы значение можно было вызвать вне метода.

public String[] OpenFile() throws IOException {
    Map<String, Double> map = new HashMap();
    FileReader fr = new FileReader("money.txt");
    BufferedReader br = new BufferedReader(fr);
    try{
        while (br.ready()){
            String str = br.readLine();
            String[] list = str.split(" ");
            System.out.println(list);               
        }
    }   catch (IOException e){
        System.err.println("Error - IOException!");
    }
}

Есть несколько причин, по которым компилятор выдает сообщение «отсутствует оператор возврата»:

  • Оператор возврата был опущен по ошибке.
  • Метод не возвращает никакого значения, но тип не объявлен как недействительный в объявлении метода.

пожалуйста, проверьтеКак устранить ошибку «отсутствует отчет о возврате»Это пример.

10. “Possible Loss of Precision”

Когда информация, присвоенная переменной, превышает верхний предел, который может нести переменная, выдается ошибка «Возможная потеря точности». Как только это произойдет, часть информации будет отброшена. Если это не проблема, переменную следует явно объявить в коде как новый тип.

possible-loss-of-precision-error-11501

Ошибка «возможная потеря точности» обычно возникает в следующих ситуациях:

  • Попробуйте присвоить переменной целочисленного типа действительное число.
  • Попробуйте присвоить данные типа double переменной целочисленного типа.

Основные типы данных в JavaОбъясняет характеристики различных типов данных.

11. “Reached End of File While Parsing”

Это сообщение об ошибке обычно появляется, когда в программе отсутствует закрывающая фигурная скобка («}»). Иногда эту ошибку можно быстро исправить, добавив закрывающую скобку в конце кода.

public class mod_MyMod extends BaseMod
public String Version()
{
     return "1.2_02";
}
public void AddRecipes(CraftingManager recipes)
{
   recipes.addRecipe(new ItemStack(Item.diamond), new Object[] {
      "#", Character.valueOf('#'), Block.dirt
   });
}

Приведенный выше код приведет к следующей ошибке:

java:11: reached end of file while parsing }

Инструменты кодирования и правильные отступы кода могут упростить поиск этих несоответствующих фигурных скобок.

Прочтите эту статью:Отсутствие фигурных скобок вызовет сообщение об ошибке «достигнут конец файла при синтаксическом анализе».。

12. “Unreachable Statement”

Когда оператор появляется в месте, где он не может быть выполнен, выдается ошибка «Недоступный оператор». Обычно это делается после оператора break или return.

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
  ...
else
  ... // dead code

Обычно эту ошибку можно исправить, просто переместив оператор return. Прочтите эту статью:Как исправить ошибку «Недостижимый отчет»。

13. “Variable Might Not Have Been Initialized”

Если локальная переменная, объявленная в методе, не инициализирована, возникнет такая ошибка. Такая ошибка возникает, если вы включаете переменную без начального значения в оператор if.

int x;
if (condition) {
    x = 5;
}
System.out.println(x); // x не может быть инициализирован

Прочтите эту статью:Как избежать появления ошибки «Возможно, переменная не была инициализирована»。

14. “Operator … Cannot be Applied to ”

Эта проблема возникает, когда оператор действует с типом, который не входит в область его определения.

operator < cannot be applied to java.lang.Object,java.lang.Object

Эта ошибка часто возникает, когда код Java пытается использовать строковые типы в вычислениях (вычитание, умножение, сравнение размеров и т. Д.). Чтобы решить эту проблему, вам необходимо преобразовать строку в целое число или число с плавающей запятой.

Прочтите эту статью:Почему нечисловые типы вызывают ошибки программного обеспечения Java。

15. “Inconvertible Types”

Когда код Java пытается выполнить недопустимое преобразование, возникает ошибка «Неконвертируемые типы».

TypeInvocationConversionTest.java:12: inconvertible types
found   : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.Class<?>>
    lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
                                                     ^

Например, логические типы нельзя преобразовать в целые числа.

Прочтите эту статью:Как преобразовывать неконвертируемые типы в программном обеспечении Java。

16. “Missing Return Value”

Если оператор возврата содержит неверный тип, вы получите сообщение «Отсутствует возвращаемое значение». Например, посмотрите на следующий код:

public class SavingsAcc2 {
    private double balance;
    private double interest;
    public SavingsAcc2() {
        balance = 0.0;
        interest = 6.17;
    }
    public SavingsAcc2(double initBalance, double interested) {
        balance = initBalance;
        interest = interested;
    }
    public SavingsAcc2 deposit(double amount) {
        balance = balance + amount;
        return;
    }
    public SavingsAcc2 withdraw(double amount) {
        balance = balance - amount;
        return;
    }
    public SavingsAcc2 addInterest(double interest) {
        balance = balance * (interest / 100) + balance;
        return;
    }
    public double getBalance() {
        return balance;
    }
}

Возвращается следующая ошибка:

SavingsAcc2.java:29: missing return value 
return; 
^ 
SavingsAcc2.java:35: missing return value 
return; 
^ 
SavingsAcc2.java:41: missing return value 
return; 
^ 
3 errors

Обычно эта ошибка возникает из-за того, что оператор return ничего не возвращает.

Прочтите эту статью:Как избежать ошибки «Отсутствует возвращаемое значение»。

17. “Cannot Return a Value From Method Whose Result Type Is Void”

Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, например, в следующем коде:

public static void move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
    if (userMove == -1)
    {
        break;
    }

Обычно эту проблему может решить изменение типа возвращаемого значения метода, чтобы он соответствовал типу в операторе возврата. Например, следующий void можно изменить на int:

public static int move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}

Прочтите эту статью:Как исправить ошибку «Невозможно вернуть значение из метода, тип результата которого недействителен»。

18. “Non-Static Variable … Cannot Be Referenced From a Static Context”

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

public class StaticTest {
    private int count=0;
    public static void main(String args[]) throws IOException {
        count++; //compiler error: non-static variable count cannot be referenced from a static context
    }
}

Чтобы устранить ошибку «Нестатическая переменная… На нее нельзя ссылаться из статического контекста», можно сделать две вещи:

  • Вы можете объявить переменные статическими.
  • Вы можете создавать экземпляры нестатических объектов в статических методах.

Пожалуйста, прочтите это руководство:Разница между статическими и нестатическими переменными。

19. “Non-Static Method … Cannot Be Referenced From a Static Context”

Эта проблема возникает, когда код Java пытается вызвать нестатический метод в статическом классе. Например, такой код:

class Sample
{
   private int age;
   public void setAge(int a)
   {
      age=a;
   }
   public int getAge()
   {
      return age;
   }
   public static void main(String args[])
   {
       System.out.println("Age is:"+ getAge());
   }
}

Вызовет эту ошибку:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Cannot make a static reference to the non-static method getAge() from the type Sample

Чтобы вызвать нестатический метод в статическом методе, необходимо объявить экземпляр класса вызываемого нестатического метода.

Прочтите эту статью:Разница между нестатическими и статическими методами。

20. “(array) Not Initialized”

Если массив был объявлен, но не инициализирован, вы получите сообщение об ошибке типа «(массив) не инициализирован». Длина массива фиксирована, поэтому каждый массив необходимо инициализировать требуемой длиной.

Следующий код правильный:

AClass[] array = {object1, object2}

это тоже нормально:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

Но это не так:

AClass[] array;
...
array = {object1, object2};

Прочтите эту статью:О том, как инициализировать массив в Java。

Продолжение следует

Сегодня мы обсуждали ошибки компилятора, в следующий раз мы обсудим различные исключения времени выполнения, которые могут возникнуть. Как и структура этой статьи, в следующий раз она будет содержать фрагменты кода, пояснения и ссылки по теме, которые помогут вам исправить код как можно скорее.

  • Почему при запуске фортнайт выдает ошибку ls 0018
  • Почему при запуске фортнайт выдает ошибку easyanticheat
  • Почему при оформлении осаго выдает техническую ошибку
  • Почему при отправлении смс пишет ошибка отправки
  • Почему при отправке сообщения пишет ошибка отправки