Error c3861 printf identifier not found

I am using visual studio 2008 and i've read the other responses to no avail. Here's my code:
  • Remove From My Forums
  • Question

  • I am using visual studio 2008 and i’ve read the other responses to no avail. Here’s my code:

    #include <stdio.h>

    int main(void)

    {

    int counter;

    int gallons;

    int miles;

    int totalGallons;

    int totalMiles;

    int avgGallons;

    int avgMiles;

    float average;

    totalGallons = 0;

    totalMiles = 0;

    counter = 1;

    printf («Enter the gallons used (-1 to end): «);

    scanf («%d», &gallons);

    while (gallons != -1) {

    printf («n Enter the miles driven: «);

    scanf («%d», &miles);

    printf («n The miles/gallon for this tank is %.2 fn», miles/gallons);

    counter++;

    totalGallons = totalGallons + gallons;

    totalMiles = totalMiles + miles;

    avgGallons = totalGallons/counter;

    avgMiles = totalMiles/counter;

    printf («Enter the gallons used (-1 to end): «);

    }

    printf («The overall average miles/gallon was %.2fn», avgMiles/avgGallons);

    return 0;

    }

    Nothing seems to work.  Please help.

Answers

  • Hi,

    According to your description, I think you have an issue about your codes. Could you tell me the meaning of “Nothing seems to work”. Does it mean your
    code cannot work correctly?

    Visual C++ can compile C code directly, and I have built your code successfully on my side. Here is my project and file. Can you rebuild on your Visual Studio? If
    not , it may a configuration issue. You can reinstall your Visual Studio.

    http://cid-ae2442667686801e.office.live.com/self.aspx/.Documents/T1.rar

    In additional, I have some suggestion about your codes:

    1, There is a blank between your %.2 and f,  so it cannot print the result which you want.

    2, According to your codes, I think you may want to input -1 to end input or exit your application, so I have change some places in your codes and add some notes.

    I hope my suggestion can help you to solve your issue. If you have any other issues, please feel free and post to the MSDN forum.

    Best Regards.

    Rob


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • Marked as answer by

      Wednesday, March 30, 2011 8:12 AM

  • i faced the same problem before, i think it is because you use wrong project type

    here, try this

    *btw i am using VC++ 2010 express, the might be bit a different in the interface

    1) create a new project, select win32 console application

    2) in the solution explorer, right click the source file folder and add a new item (C++ file)

    3) paste your code and compile, it should be able to run 

    • Marked as answer by
      Rob Pan
      Wednesday, March 30, 2011 8:13 AM

Содержание

  1. Ошибка компилятора C3861
  2. Remarks
  3. Примеры
  4. Неопределенный идентификатор
  5. Идентификатор не в области
  6. Требуется квалификация пространства имен
  7. Устаревшая функция, вызываемая
  8. ADL и дружественные функции
  9. Русские Блоги
  10. Mr.J — Ошибка компиляции языка C C3861
  11. идентификатор: Идентификатор не найден
  12. замечание
  13. примеров
  14. Неопределенный идентификатор
  15. Идентификатор вне области видимости
  16. Требуемая квалификация пространства имен
  17. Устаревший вызов функции
  18. ADL и функции друзей
  19. Интеллектуальная рекомендация
  20. Реализация оценки приложения iOS
  21. JS функциональное программирование (е)
  22. PWN_JarvisOJ_Level1
  23. Установка и развертывание Kubernetes
  24. На стороне многопроцессорного сервера — (2) *
  25. error c3861 идентификатор не найден
  26. Примечания Remarks
  27. Примеры Examples
  28. Неопределенный идентификатор Undefined identifier
  29. Идентификатор не находится в области Identifier not in scope
  30. Требуется квалификации пространства имен Namespace qualification required
  31. Устаревшие функции с именем Obsolete function called
  32. ADL и дружественные функции ADL and friend functions
  33. Решение
  34. Другие решения
  35. 2 ответа 2
  36. error c3861 идентификатор не найден
  37. Примечания Remarks
  38. Примеры Examples
  39. Неопределенный идентификатор Undefined identifier
  40. Идентификатор не находится в области Identifier not in scope
  41. Требуется квалификации пространства имен Namespace qualification required
  42. Устаревшие функции с именем Obsolete function called
  43. ADL и дружественные функции ADL and friend functions
  44. Решение
  45. Другие решения
  46. 2 ответа 2

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

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

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

Изменения для удаления устаревших функций из библиотеки среды выполнения C в Visual Studio 2015 могут вызвать C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасными альтернативами, если таковые есть. Дополнительные сведения см. в разделе «Устаревшие функции».

Если ошибка C3861 появляется после миграции проекта из более старых версий компилятора, могут возникнуть проблемы, связанные с поддерживаемыми версиями Windows. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Если макросы WINVER _WIN32_WINNT назначены одной из этих версий Windows, необходимо изменить макросы. Дополнительные сведения см. в разделе «Изменение WINVER и _WIN32_WINNT «.

Примеры

Неопределенный идентификатор

В следующем примере возникает ошибка C3861, так как идентификатор не определен.

Идентификатор не в области

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

Исходный файл C3861_a1.cpp :

Исходный файл C3861_a2.cpp :

Требуется квалификация пространства имен

Для классов исключений в стандартной библиотеке C++ требуется std пространство имен.

Устаревшая функция, вызываемая

Устаревшие функции удалены из библиотеки CRT.

ADL и дружественные функции

Следующий пример приводит к возникновению ошибки C3767, так как компилятор не может использовать поиск, зависящий от FriendFunc аргументов:

Чтобы устранить ошибку, объявите друга в области класса и определите его в области пространства имен:

Источник

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

Mr.J — Ошибка компиляции языка C C3861

идентификатор: Идентификатор не найден

Даже с независимыми поисками, связанными с переменными, компилятор не может разрешить ссылки на идентификаторы.

замечание

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

Изменения для удаления устаревших функций из библиотеки времени выполнения C в Visual Studio 2015 могут вызвать C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасными альтернативными методами, если таковые имеются. Для получения дополнительной информации, пожалуйста, обратитесь кУстаревшая функция。

Если проект отображает ошибку компилятора C3861 из старой версии после миграции, это может вызвать проблемы, связанные с поддерживаемыми версиями Windows. Visual C ++ больше не поддерживает Windows 95, Windows 98, Windows ME, Windows NT или Windows 2000. Если выWINVERили_WIN32_WINNTМакросы назначены одной из этих версий Windows, вы должны изменить макросы. Для получения дополнительной информации, пожалуйста, обратитесь кИзменить WINVER и _WIN32_WINNT。

примеров

Неопределенный идентификатор

В следующем примере создается C3861, поскольку идентификатор не определен.

Идентификатор вне области видимости

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

Требуемая квалификация пространства имен

Классы исключений в стандартной библиотеке C ++ std Пространство имен.

Устаревший вызов функции

Устаревшие функции были удалены из библиотеки CRT.

ADL и функции друзей

В следующем примере создается C3767, поскольку аргумент, который не может использовать компилятор, зависит от поиска FriendFunc :

Чтобы исправить эту ошибку, объявите область действия класса Friend и определите ее в области пространства имен:

Для проблемы, с которой я столкнулся, сначала была определена функция, а затем использована . (Первая)

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

Реализация оценки приложения iOS

Есть два способа получить оценку приложения: перейти в App Store для оценки и оценка в приложении. 1. Перейдите в App Store, чтобы оценить ps: appid можно запросить в iTunes Connect 2. Встроенная оцен.

JS функциональное программирование (е)

Давайте рассмотрим простой пример, чтобы проиллюстрировать, как используется Reduce. Первый параметр Reduce — это то, что мы принимаем массив arrayOfNums, а второй параметр — функцию. Эта функция прин.

PWN_JarvisOJ_Level1

Nc первый Затем мы смотрим на декомпиляцию ida Перед «Hello, World! N» есть уязвимая_функция, проверьте эту функцию после ввода Видно, что только что появившийся странный адрес является пе.

Установка и развертывание Kubernetes

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

На стороне многопроцессорного сервера — (2) *

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

Источник

error c3861 идентификатор не найден

«идентификатор«: идентификатор не найден ‘identifier‘: identifier not found

Компилятору не удалось разрешить ссылку на идентификатор даже при поиске с зависимостью от аргументов. The compiler was not able to resolve a reference to an identifier, even using argument-dependent lookup.

Чтобы устранить эту ошибку, сравните использование идентификатор на написание и регистр объявления идентификатора. To fix this error, compare use of identifier to the identifier declaration for case and spelling. Убедитесь, что операторов разрешения области и пространство имен директив using используются правильно. Verify that scope resolution operators and namespace using directives are used correctly. Если идентификатор объявлен в файле заголовка, убедитесь, что заголовок включен до ссылки на идентификатор. If the identifier is declared in a header file, verify that the header is included before the identifier is referenced. Если идентификатор должен быть видимый извне, убедитесь, что он объявлен в все файлы исходного кода, который его использует. If the identifier is meant to be externally visible, make sure that it is declared in any source file that uses it. Также проверьте, что идентификатор объявления или определения не исключен с директивы условной компиляции. Also check that the identifier declaration or definition is not excluded by conditional compilation directives.

Изменения, чтобы удалить устаревшие функции из библиотеки времени выполнения C в Visual Studio 2015 может привести к C3861. Changes to remove obsolete functions from the C Runtime Library in Visual Studio 2015 can cause C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасных альтернатив, если таковые имеются. To resolve this error, remove references to these functions or replace them with their secure alternatives, if any. Дополнительные сведения см. в разделе устаревшие функции. For more information, see Obsolete Functions.

При появлении ошибки C3861 после миграции проекта из более старой версии компилятора, возможно, возникли проблемы, связанные с поддерживаемыми версиями Windows. If error C3861 appears after project migration from older versions of the compiler, you may have issues related to supported Windows versions. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Visual C++ no longer supports targeting Windows 95, Windows 98, Windows ME, Windows NT or Windows 2000. Если ваши макросы WINVER или _WIN32_WINNT предназначены для одной из этих версий Windows, необходимо изменить такие макросы. If your WINVER or _WIN32_WINNT macros are assigned to one of these versions of Windows, you must modify the macros. Дополнительные сведения см. в разделе изменение WINVER и _WIN32_WINNT. For more information, see Modifying WINVER and _WIN32_WINNT.

Примеры Examples

Неопределенный идентификатор Undefined identifier

Следующий пример приводит к возникновению ошибки C3861, так как идентификатор не определен. The following sample generates C3861 because the identifier is not defined.

Идентификатор не находится в области Identifier not in scope

Следующий пример приводит к возникновению ошибки C3861, так как идентификатор отображается в области видимости файла его определения, только в том случае, если она не объявлена в других исходных файлах, которые ее используют. The following sample generates C3861 because an identifier is only visible in the file scope of its definition, unless it is declared in other source files that use it.

Требуется квалификации пространства имен Namespace qualification required

Классы исключений в стандартной библиотеке C++ требует std пространства имен. Exception classes in the C++ Standard Library require the std namespace.

Устаревшие функции с именем Obsolete function called

Устаревшие функции были удалены из библиотеки CRT. Obsolete functions have been removed from the CRT library.

ADL и дружественные функции ADL and friend functions

В следующем примере возникает C3767, так как компилятор не может использовать поиск по аргументам для FriendFunc : The following sample generates C3767 because the compiler cannot use argument dependent lookup for FriendFunc :

Чтобы устранить эту ошибку, объявите friend в области видимости класса и определите его в области видимости пространства имен: To fix the error, declare the friend in class scope and define it in namespace scope:

У меня есть файл «HSlider.h», он использует «Draw.h», где я определил свои функции для их использования.
Но компилятор говорит, что я не определил их (идентификатор не найден). Я искал на форумах похожую ошибку, но это не помогло.

Я работаю в VS 2015 Communty.

ПРИМЕР ОШИБКИ:
Ошибка C3861 DrawGUIBox: идентификатор не найден
Try2 c: users lel Documents visual studio 2015 projects try2 try2 hslider.h 50
,

HSlider.h

Draw.h

Решение

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

Чтобы это исправить, сделайте следующее.

Откройте файл Help.sln с помощью notepad ++, и вы увидите строку

Это означает, что должен быть подпроект под названием Try2, но он не существует. В вашем архиве субпроект фактически называется «Помощь». Итак, измените строку на:

После этого просмотрите папки x64 в своем решении и удалите все оставшиеся файлы, относящиеся к Try2.

ИЛИ, создайте новое пустое решение и скопируйте исходные файлы .cpp и .h (только) по одному в новое решение.

(Существует также отдельная проблема, когда отсутствует файл Offsets.h, но я не могу с этим помочь.)

Другие решения

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

Использую библиотеку math.h и в ней для нахождения кубического корня есть функция cbrt(); Только вот при компиляции Visual Studio говорит: error C3861: cbrt: идентификатор не найден.

Как решать проблему?

2 ответа 2

Правильно он споткнулся. Потому что эта функция находиться в другом заголовчном файле — amp_math.h (пруф).

Не знаю, с чем связано отсутствие этой функции, но попробуйте вот так:

Вообще cbrt есть в С99 и в C++TR1, который, кажется, как раз вошел в C++11. Ну а упрекнуть vc++ в хорошей поддержке этого стандарта до сих пор довольно трудно

Источник

error c3861 идентификатор не найден

«идентификатор«: идентификатор не найден ‘identifier‘: identifier not found

Компилятору не удалось разрешить ссылку на идентификатор даже при поиске с зависимостью от аргументов. The compiler was not able to resolve a reference to an identifier, even using argument-dependent lookup.

Чтобы устранить эту ошибку, сравните использование идентификатор на написание и регистр объявления идентификатора. To fix this error, compare use of identifier to the identifier declaration for case and spelling. Убедитесь, что операторов разрешения области и пространство имен директив using используются правильно. Verify that scope resolution operators and namespace using directives are used correctly. Если идентификатор объявлен в файле заголовка, убедитесь, что заголовок включен до ссылки на идентификатор. If the identifier is declared in a header file, verify that the header is included before the identifier is referenced. Если идентификатор должен быть видимый извне, убедитесь, что он объявлен в все файлы исходного кода, который его использует. If the identifier is meant to be externally visible, make sure that it is declared in any source file that uses it. Также проверьте, что идентификатор объявления или определения не исключен с директивы условной компиляции. Also check that the identifier declaration or definition is not excluded by conditional compilation directives.

Изменения, чтобы удалить устаревшие функции из библиотеки времени выполнения C в Visual Studio 2015 может привести к C3861. Changes to remove obsolete functions from the C Runtime Library in Visual Studio 2015 can cause C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасных альтернатив, если таковые имеются. To resolve this error, remove references to these functions or replace them with their secure alternatives, if any. Дополнительные сведения см. в разделе устаревшие функции. For more information, see Obsolete Functions.

При появлении ошибки C3861 после миграции проекта из более старой версии компилятора, возможно, возникли проблемы, связанные с поддерживаемыми версиями Windows. If error C3861 appears after project migration from older versions of the compiler, you may have issues related to supported Windows versions. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Visual C++ no longer supports targeting Windows 95, Windows 98, Windows ME, Windows NT or Windows 2000. Если ваши макросы WINVER или _WIN32_WINNT предназначены для одной из этих версий Windows, необходимо изменить такие макросы. If your WINVER or _WIN32_WINNT macros are assigned to one of these versions of Windows, you must modify the macros. Дополнительные сведения см. в разделе изменение WINVER и _WIN32_WINNT. For more information, see Modifying WINVER and _WIN32_WINNT.

Примеры Examples

Неопределенный идентификатор Undefined identifier

Следующий пример приводит к возникновению ошибки C3861, так как идентификатор не определен. The following sample generates C3861 because the identifier is not defined.

Идентификатор не находится в области Identifier not in scope

Следующий пример приводит к возникновению ошибки C3861, так как идентификатор отображается в области видимости файла его определения, только в том случае, если она не объявлена в других исходных файлах, которые ее используют. The following sample generates C3861 because an identifier is only visible in the file scope of its definition, unless it is declared in other source files that use it.

Требуется квалификации пространства имен Namespace qualification required

Классы исключений в стандартной библиотеке C++ требует std пространства имен. Exception classes in the C++ Standard Library require the std namespace.

Устаревшие функции с именем Obsolete function called

Устаревшие функции были удалены из библиотеки CRT. Obsolete functions have been removed from the CRT library.

ADL и дружественные функции ADL and friend functions

В следующем примере возникает C3767, так как компилятор не может использовать поиск по аргументам для FriendFunc : The following sample generates C3767 because the compiler cannot use argument dependent lookup for FriendFunc :

Чтобы устранить эту ошибку, объявите friend в области видимости класса и определите его в области видимости пространства имен: To fix the error, declare the friend in class scope and define it in namespace scope:

У меня есть файл «HSlider.h», он использует «Draw.h», где я определил свои функции для их использования.
Но компилятор говорит, что я не определил их (идентификатор не найден). Я искал на форумах похожую ошибку, но это не помогло.

Я работаю в VS 2015 Communty.

ПРИМЕР ОШИБКИ:
Ошибка C3861 DrawGUIBox: идентификатор не найден
Try2 c: users lel Documents visual studio 2015 projects try2 try2 hslider.h 50
,

HSlider.h

Draw.h

Решение

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

Чтобы это исправить, сделайте следующее.

Откройте файл Help.sln с помощью notepad ++, и вы увидите строку

Это означает, что должен быть подпроект под названием Try2, но он не существует. В вашем архиве субпроект фактически называется «Помощь». Итак, измените строку на:

После этого просмотрите папки x64 в своем решении и удалите все оставшиеся файлы, относящиеся к Try2.

ИЛИ, создайте новое пустое решение и скопируйте исходные файлы .cpp и .h (только) по одному в новое решение.

(Существует также отдельная проблема, когда отсутствует файл Offsets.h, но я не могу с этим помочь.)

Другие решения

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

Использую библиотеку math.h и в ней для нахождения кубического корня есть функция cbrt(); Только вот при компиляции Visual Studio говорит: error C3861: cbrt: идентификатор не найден.

Как решать проблему?

2 ответа 2

Правильно он споткнулся. Потому что эта функция находиться в другом заголовчном файле — amp_math.h (пруф).

Не знаю, с чем связано отсутствие этой функции, но попробуйте вот так:

Вообще cbrt есть в С99 и в C++TR1, который, кажется, как раз вошел в C++11. Ну а упрекнуть vc++ в хорошей поддержке этого стандарта до сих пор довольно трудно

Источник

lethe1337

2 / 2 / 0

Регистрация: 22.07.2020

Сообщений: 175

1

18.05.2022, 22:12. Показов 989. Ответов 4

Метки си++ (Все метки)


В общем у меня есть задание: перенести программу с Си на С++. С плюсами знаком +- 2 часа, вот что слепил

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#include <atomic>
#include <stdio.h>
using namespace std;
 
class ClassList
{public:
    typedef struct Node
    {
        int key;
        struct Node* next;
        struct Node* prev;
    } Node;
 
    // вспомогательная сущность, хранящая указатель на начало списка и его размер
    typedef struct
    {
        size_t size;
        Node* head;
        Node* tail;
    } List;
 
    // получение адреса элемента по его порядковому номеру (счет от 1 )
    Node* Get_node(const List list, const int number)
    {
        int i;
        Node* scan = list.head;
 
        for (i = 1; i < number; i++)
            scan = scan->next;
 
        return scan;
    }
    Node* Create_node(const int key)
    {
        Node* new_node = (Node*)malloc(sizeof(Node));
        if (new_node)
        {
            new_node->key = key;
            new_node->next = NULL;
            return new_node;
            free(new_node);
        }
    }
    // вставка элемента в начало списка
    List Insert(List list, const int key)
    {
        Node* add = Create_node(key);
        if (list.head != NULL)
            add->next = list.head;
        list.head = add;
        list.size++;
 
        return list;
    }
 
    // вывод списка на экран
    void Print(const List list)
    {
        Node* scan = list.head;
        printf("List items: ");
        while (scan)
        {
            printf("%d -> %p ", scan->key, scan->next);
            scan = scan->next;
        }
    }
 
    // удаление элемента из начала ЛОС
    List Pop_front(List list)
    {
        Node* del = list.head;
        list.head = del->next;
        free(del);
        list.size--;
 
        return list;
    }
 
   
 
    // обмен местами двух элементов ЛОС
    void Swap(List list, Node* const before1, Node* const before2)
    {
        Node* self1, * self2, * tmp;
        // before1 = Get_node(list, N1-1);
        // before2 = Get_node(list, N2-1);
        self1 = before1->next;
        self2 = before2->next;
        tmp = before1->next;
        before1->next = before2->next;
 
        before2->next = tmp;
        tmp = self1->next;
        self1->next = self2->next;
        self2->next = tmp;
 
    }
 
    List Append(List list, const int num)
    {
        Node* const add_node = Create_node(num);
        list.size++;
 
        // если список пуст
        if (!list.head)
        {
            list.head = list.tail = add_node;
            return list;
        }
 
        list.tail->next = add_node;
        list.tail = add_node;
 
        return list;
    }
 
    int Get_Value(List list, int N)
    {
        Node* tmp = Get_node(list, N);
        return tmp->key;
    }
 
    void Inverse_sublist(const List list, const int K, const int N)
    {
        int i, j;
        Node* left = Get_node(list, K - 1);
        Node* right;
 
        for (i = 0; i < N / 2; i++)
        {
            right = left;
            for (j = 0; j < (N - 2 * i); j++)
                right = right->next;
 
            Swap(list, left, right);
            left = left->next;
        }
    }
};
 
//--------------------------------------------------------------
 
int main(int argc, char* argv[])
{
    logo();
    printf("В списке целых ненулевых элементов инвертировать K элементов начиная с Nn");
    srand((unsigned int)time(NULL));
    int i, tmpRand;
    int tmpHand[100]{};
    ClassList::Node* node_a = nullptr;
    ClassList::Node* node_b = nullptr;
 
    FILE* config;
    char Conf_Name[50] = "testo.cfg", buffer[100];
    int sposob = 0, elementov = 0, K = 0, N = 0;
if ((config = fopen(Conf_Name, "r")) == NULL) {
        puts("Config file error!!!");
        puts("Press Enter!!!");
        getchar(); exit(0);
    }
 
    fgets(buffer, 80, config);
    if (!strstr(buffer, "#!MYCONFIG")) {
        puts("Config file error!!!");
        puts("Press Enter!!!");
        getchar(); fclose(config);
        exit(0);
    }
 
    while (1)
    {
        fgets(buffer, 80, config);
        if (feof(config))break;
        if (buffer[0] == '#')continue;
        if (buffer[0] == '!') { puts(buffer); continue; }
        if (strstr(buffer, "sposob=")) {
            sposob = atoi(buffer + strlen("sposob="));
            continue;
        }
        if (strstr(buffer, "elementov=")) {
            elementov = atoi(buffer + strlen("elementov="));
            continue;
        }
        if (strstr(buffer, "K=")) {
            K = atoi(buffer + strlen("K="));
            continue;
        }
        if (strstr(buffer, "N=")) {
            N = atoi(buffer + strlen("N="));
            continue;
        }
 
    }
    puts("=============Result of parsing config file ========");
    printf("sposob = %dn", sposob);
    printf("elementov = %dn", elementov);
    printf("K = %dn", K);
    printf("N = %dn", N);
    puts("Press Enter!!!");
    getchar(); fclose(config);
 
 
    if (elementov > 20)
    {
        printf("Слишком много элементов в списке! Выход...n");
        return 1;
    }
    if (sposob != 1 && sposob != 2)
    {
        printf("Некорректный способ заполнения спискаn");
        return 1;
    }
    if (K + N > elementov)
    {
        printf("Некорректные данные в конфигурационном файле (N + K > элементовn)");
        return 1;
    }
    if (N > elementov)
    {
        printf("Некорректные данные: количество инвертируемых элементов больше чем элементов в спискеn");
        return 1;
    }
 
 
    // "объект" ЛОС с инициализацией
    ClassList::List list{};
    list.head = list.tail = NULL;
    list.size = 0;
 
    if (sposob == 2)
    {
        size_t t;
        for (i = 0; i < elementov; i++)
        {
            tmpRand = rand() % 100;
            list = Insert(list, tmpRand);
        }
        Print(list);
        Inverse_sublist(list, N, K);
        printf("nn");
        Print(list);
    }
    if (sposob == 1)
    {
        size_t t;
        for (int i = elementov; i > 0; i--)
        {
            printf("Введите элемент списка: n");
            scanf("%d", &tmpHand[i]);
            list = Append(list, tmpHand[i]);
        }
        Print(list);
        Inverse_sublist(list, N, K);
        printf("nn");
        Print(list);
    }
}

При компиляции выдает следующие ошибки:

Код

1>List.cpp
1>C:UsersFinsourcereposListListList.cpp(105,20): error C3861: Insert: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(107,9): error C3861: Print: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(108,9): error C3861: Inverse_sublist: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(110,9): error C3861: Print: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(119,20): error C3861: Append: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(121,9): error C3861: Print: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(122,9): error C3861: Inverse_sublist: идентификатор не найден
1>C:UsersFinsourcereposListListList.cpp(124,9): error C3861: Print: идентификатор не найден

Помогите исправить =)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



zss

Модератор

Эксперт С++

12641 / 10135 / 6102

Регистрация: 18.12.2011

Сообщений: 27,170

19.05.2022, 09:07

2

Лучший ответ Сообщение было отмечено lethe1337 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <ctime>
//#include <stdio.h>
using namespace std;
struct Node
{
    int key;
    struct Node* next;
    struct Node* prev;
};
struct List
{
    size_t size;
    Node* head;
    Node* tail;
};
 
 
// получение адреса элемента по его порядковому номеру (счет от 1 )
Node* Get_node(const List& list, int number)
{
    int i;
    Node* scan = list.head;
 
    for (i = 1; i < number; i++)
        scan = scan->next;
 
    return scan;
}
Node* Create_node(int key)
{
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->key = key;
    new_node->next = NULL;
    return new_node;
    //free(new_node);  ?????????????
}
// вставка элемента в начало списка
List Insert(List list, const int key)
{
    Node* add = Create_node(key);
    if (list.head != NULL)
        add->next = list.head;
    list.head = add;
    list.size++;
 
    return list;
}
 
// вывод списка на экран
void Print(const List list)
{
    Node* scan = list.head;
    printf("List items: ");
    while (scan)
    {
        printf("%d -> %p ", scan->key, scan->next);
        scan = scan->next;
    }
}
 
// удаление элемента из начала ЛОС
List Pop_front(List list)
{
    Node* del = list.head;
    list.head = del->next;
    free(del);
    list.size--;
 
    return list;
}
 
 
 
// обмен местами двух элементов ЛОС
void Swap(List list, Node* const before1, Node* const before2)
{
    Node* self1, * self2, * tmp;
    // before1 = Get_node(list, N1-1);
    // before2 = Get_node(list, N2-1);
    self1 = before1->next;
    self2 = before2->next;
    tmp = before1->next;
    before1->next = before2->next;
 
    before2->next = tmp;
    tmp = self1->next;
    self1->next = self2->next;
    self2->next = tmp;
 
}
 
List Append(List list, const int num)
{
    Node* const add_node = Create_node(num);
    list.size++;
 
    // если список пуст
    if (!list.head)
    {
        list.head = list.tail = add_node;
        return list;
    }
 
    list.tail->next = add_node;
    list.tail = add_node;
 
    return list;
}
 
int Get_Value(List list, int N)
{
    Node* tmp = Get_node(list, N);
    return tmp->key;
}
 
void Inverse_sublist(const List list, const int K, const int N)
{
    int i, j;
    Node* left = Get_node(list, K - 1);
    Node* right;
 
    for (i = 0; i < N / 2; i++)
    {
        right = left;
        for (j = 0; j < (N - 2 * i); j++)
            right = right->next;
 
        Swap(list, left, right);
        left = left->next;
    }
}
 
//--------------------------------------------------------------
 
int main(int argc, char* argv[])
{
    //logo();
    printf("В списке целых ненулевых элементов инвертировать K элементов начиная с Nn");
    srand((unsigned int)time(NULL));
    int i, tmpRand;
    int tmpHand[100]={};
    //ClassList::Node* node_a = 0;
    //ClassList::Node* node_b = 0;
 
    FILE* config;
    char Conf_Name[50] = "testo.cfg", buffer[100];
    int sposob = 0, elementov = 0, K = 0, N = 0;
    if ((config = fopen(Conf_Name, "r")) == NULL) {
        puts("Config file error!!!");
        puts("Press Enter!!!");
        getchar(); exit(0);
    }
 
    fgets(buffer, 80, config);
    if (!strstr(buffer, "#!MYCONFIG")) {
        puts("Config file error!!!");
        puts("Press Enter!!!");
        getchar(); fclose(config);
        exit(0);
    }
 
    while (true)
    {
        fgets(buffer, 80, config);
        if (feof(config))break;
        if (buffer[0] == '#')continue;
        if (buffer[0] == '!') { puts(buffer); continue; }
        if (strstr(buffer, "sposob=")) {
            sposob = atoi(buffer + strlen("sposob="));
            continue;
        }
        if (strstr(buffer, "elementov=")) {
            elementov = atoi(buffer + strlen("elementov="));
            continue;
        }
        if (strstr(buffer, "K=")) {
            K = atoi(buffer + strlen("K="));
            continue;
        }
        if (strstr(buffer, "N=")) {
            N = atoi(buffer + strlen("N="));
            continue;
        }
 
    }
    puts("=============Result of parsing config file ========");
    printf("sposob = %dn", sposob);
    printf("elementov = %dn", elementov);
    printf("K = %dn", K);
    printf("N = %dn", N);
    puts("Press Enter!!!");
    getchar(); fclose(config);
 
 
    if (elementov > 20)
    {
        printf("Слишком много элементов в списке! Выход...n");
        return 1;
    }
    if (sposob != 1 && sposob != 2)
    {
        printf("Некорректный способ заполнения спискаn");
        return 1;
    }
    if (K + N > elementov)
    {
        printf("Некорректные данные в конфигурационном файле (N + K > элементовn)");
        return 1;
    }
    if (N > elementov)
    {
        printf("Некорректные данные: количество инвертируемых элементов больше чем элементов в спискеn");
        return 1;
    }
 
 
    // "объект" ЛОС с инициализацией
    List list;
    list.head = list.tail = NULL;
    list.size = 0;
 
    if (sposob == 2)
    {
        for (i = 0; i < elementov; i++)
        {
            tmpRand = rand() % 100;
            list=Insert(list,tmpRand);
        }
        Print(list);
        Inverse_sublist(list, N, K);
        printf("nn");
        Print(list);
    }
    if (sposob == 1)
    {
        for (int i = elementov; i > 0; i--)
        {
            printf("Введите элемент списка: n");
            scanf("%d", &tmpHand[i]);
            list = Append(list, tmpHand[i]);
        }
        Print(list);
        Inverse_sublist(list, N, K);
        printf("nn");
        Print(list);
    }
}



1



2 / 2 / 0

Регистрация: 22.07.2020

Сообщений: 175

19.05.2022, 11:10

 [ТС]

3

zss, Вылезло это

Код

1>List.obj : error LNK2005: "struct List __cdecl Append(struct List,int)" (?Append@@YA?AUList@@U1@H@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "struct Node * __cdecl Create_node(int)" (?Create_node@@YAPEAUNode@@H@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "int __cdecl Get_Value(struct List,int)" (?Get_Value@@YAHUList@@H@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "struct Node * __cdecl Get_node(struct List const &,int)" (?Get_node@@YAPEAUNode@@AEBUList@@H@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "struct List __cdecl Insert(struct List,int)" (?Insert@@YA?AUList@@U1@H@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "void __cdecl Inverse_sublist(struct List,int,int)" (?Inverse_sublist@@YAXUList@@HH@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "struct List __cdecl Pop_front(struct List)" (?Pop_front@@YA?AUList@@U1@@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "void __cdecl Print(struct List)" (?Print@@YAXUList@@@Z) уже определен в Class.obj
1>List.obj : error LNK2005: "void __cdecl Swap(struct List,struct Node * const,struct Node * const)" (?Swap@@YAXUList@@QEAUNode@@1@Z) уже определен в Class.obj
1>C:UsersFinsourcereposListx64DebugList.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>Сборка проекта "List.vcxproj" завершена с ошибкой.
========== Сборка: успешно: 0, сбой: 1, в актуальном состоянии: 0, пропущено: 0==========

Добавлено через 4 минуты
Моя ошибка, у меня в папке с этим проектом был Class.cpp, в котором были написаны эти функции. Все работает!



0



lethe1337

2 / 2 / 0

Регистрация: 22.07.2020

Сообщений: 175

19.05.2022, 21:14

 [ТС]

4

zss, А можете объяснить, пожалуйста, в чем была ошибка?

Добавлено через 24 минуты
Оказалось, что это нужно реализовать через классы.
Header.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Funcs
{
    friend class Class;
 
public:
    struct Node* next;
    struct List;
    Node* Get_node(const List& list, int number);
    Node* Create_node(int key);
    // вставка элемента в начало списка
    List Insert(List list, const int key);
    // вывод списка на экран
    void Print(const List list);
    // удаление элемента из начала ЛОС
    List Pop_front(List list);
    // обмен местами двух элементов ЛОС
    void Swap(List list, Node* const before1, Node* const before2);
    List Append(List list, const int num);
    int Get_Value(List list, int N);
    void Inverse_sublist(const List list, const int K, const int N);
  
};

Header.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "Header.h"
#include <atomic>
#include<stdio.h>
 
using namespace std;
 
class Class
{
    friend class Funcs;
 
public:
    struct Node
    {
        int key;
        struct Node* next;
        struct Node* prev;
    };
    struct List
    {
        size_t size;
        Node* head;
        Node* tail;
    };
    // получение адреса элемента по его порядковому номеру (счет от 1 )
    Node* Get_node(const List& list, int number)
    {
        int i;
        Node* scan = list.head;
 
        for (i = 1; i < number; i++)
            scan = scan->next;
 
        return scan;
    }
 
    Node* Create_node(int key)
    {
        Node* new_node = (Node*)malloc(sizeof(Node));
        new_node->key = key;
        new_node->next = NULL;
        return new_node;
        //free(new_node);  ?????????????
    }
    // вставка элемента в начало списка
    List Insert(List list, const int key)
    {
        Node* add = Create_node(key);
        if (list.head != NULL)
            add->next = list.head;
        list.head = add;
        list.size++;
 
        return list;
    }
 
    // вывод списка на экран
    void Print(const List list)
    {
        Node* scan = list.head;
        printf("List items: ");
        while (scan)
        {
            printf("%d -> %p ", scan->key, scan->next);
            scan = scan->next;
        }
    }
 
    // удаление элемента из начала ЛОС
    List Pop_front(List list)
    {
        Node* del = list.head;
        list.head = del->next;
        free(del);
        list.size--;
 
        return list;
    }
 
 
 
    // обмен местами двух элементов ЛОС
    void Swap(List list, Node* const before1, Node* const before2)
    {
        Node* self1, * self2, * tmp;
        // before1 = Get_node(list, N1-1);
        // before2 = Get_node(list, N2-1);
        self1 = before1->next;
        self2 = before2->next;
        tmp = before1->next;
        before1->next = before2->next;
 
        before2->next = tmp;
        tmp = self1->next;
        self1->next = self2->next;
        self2->next = tmp;
 
    }
 
    List Append(List list, const int num)
    {
        Node* const add_node = Create_node(num);
        list.size++;
 
        // если список пуст
        if (!list.head)
        {
            list.head = list.tail = add_node;
            return list;
        }
 
        list.tail->next = add_node;
        list.tail = add_node;
 
        return list;
    }
 
    int Get_Value(List list, int N)
    {
        Node* tmp = Get_node(list, N);
        return tmp->key;
    }
 
    void Inverse_sublist(const List list, const int K, const int N)
    {
        int i, j;
        Node* left = Get_node(list, K - 1);
        Node* right;
 
        for (i = 0; i < N / 2; i++)
        {
            right = left;
            for (j = 0; j < (N - 2 * i); j++)
                right = right->next;
 
            Swap(list, left, right);
            left = left->next;
        }
    }
};

в List.cpp код тот же, что и после main(), но при компиляции вылазят те же ошибки, что и в прошлый раз: идентификатор не найден. Как это можно исправить?



0



zss

Модератор

Эксперт С++

12641 / 10135 / 6102

Регистрация: 18.12.2011

Сообщений: 27,170

20.05.2022, 06:17

5

Лучший ответ Сообщение было отмечено lethe1337 как решение

Решение

Цитата
Сообщение от lethe1337
Посмотреть сообщение

нужно реализовать через классы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <ctime>
//#include <stdio.h>
using namespace std;
struct Node
{
    int key;
    struct Node* next;
    struct Node* prev;
};
struct List
{
private:
    size_t size;
    Node* head;
    Node* tail;
public:
    List()
    {   
        head = tail = NULL;
        size = 0;
    }
// !!!! правило трех:
    ~List()
    {
        // Допишите удаление всего списка
    }
    List(const List& b)
    {
        // допишите копирование списка b в список *this
    }
    List& operator=(const List& b)
    {
        if(this!=&b)
        {
            // допишите копирование списка b в список *this
        }
        return *this;
    }
 
    Node* Get_node(int number);
    Node* Create_node(int key);
    void Insert(const int key);
    void Print();
    void Pop_front();
    void Swap(Node* const before1, Node* const before2);
    void Append(const int num);
    int Get_Value(int N);
    void Inverse_sublist(const int K, const int N);
};
 
 
// получение адреса элемента по его порядковому номеру (счет от 1 )
Node* List::Get_node(int number)
{
    int i;
    Node* scan = this->head;
 
    for (i = 1; i < number; i++)
        scan = scan->next;
 
    return scan;
}
Node* List::Create_node(int key)
{
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->key = key;
    new_node->next = NULL;
    return new_node;
}
// вставка элемента в начало списка
void List::Insert(const int key)
{
    Node* add = Create_node(key);
    if (this->head != NULL)
        add->next = this->head;
    this->head = add;
    this->size++;
}
 
// вывод списка на экран
void List::Print()
{
    Node* scan = this->head;
    printf("List items: ");
    while (scan)
    {
        printf("%d -> %p ", scan->key, scan->next);
        scan = scan->next;
    }
}
 
// удаление элемента из начала ЛОС
void List::Pop_front()
{
    Node* del = this->head;
    this->head = del->next;
    free(del);
    this->size--;
}
 
 
 
// обмен местами двух элементов ЛОС
void List::Swap(Node* const before1, Node* const before2)
{
    Node* self1, * self2, * tmp;
    // before1 = Get_node(list, N1-1);
    // before2 = Get_node(list, N2-1);
    self1 = before1->next;
    self2 = before2->next;
    tmp = before1->next;
    before1->next = before2->next;
 
    before2->next = tmp;
    tmp = self1->next;
    self1->next = self2->next;
    self2->next = tmp;
 
}
 
void List::Append(const int num)
{
    Node* const add_node = Create_node(num);
    this->size++;
 
    // если список пуст
    if (!this->head)
    {
        this->head = this->tail = add_node;
    }
 
    this->tail->next = add_node;
    this->tail = add_node;
}
 
int List::Get_Value(int N)
{
    Node* tmp = Get_node(N);
    return tmp->key;
}
 
void List::Inverse_sublist(const int K, const int N)
{
    int i, j;
    Node* left = Get_node(K - 1);
    Node* right;
 
    for (i = 0; i < N / 2; i++)
    {
        right = left;
        for (j = 0; j < (N - 2 * i); j++)
            right = right->next;
 
        Swap(left, right);
        left = left->next;
    }
}
 
//--------------------------------------------------------------
 
int main(int argc, char* argv[])
{
    //logo();
    printf("В списке целых ненулевых элементов инвертировать K элементов начиная с Nn");
    srand((unsigned int)time(NULL));
    int i, tmpRand;
    int tmpHand[100]={};
    //ClassList::Node* node_a = 0;
    //ClassList::Node* node_b = 0;
 
    FILE* config;
    char Conf_Name[50] = "testo.cfg", buffer[100];
    int sposob = 0, elementov = 0, K = 0, N = 0;
    if ((config = fopen(Conf_Name, "r")) == NULL) {
        puts("Config file error!!!");
        puts("Press Enter!!!");
        getchar(); exit(0);
    }
 
    fgets(buffer, 80, config);
    if (!strstr(buffer, "#!MYCONFIG")) {
        puts("Config file error!!!");
        puts("Press Enter!!!");
        getchar(); fclose(config);
        exit(0);
    }
 
    while (true)
    {
        fgets(buffer, 80, config);
        if (feof(config))break;
        if (buffer[0] == '#')continue;
        if (buffer[0] == '!') { puts(buffer); continue; }
        if (strstr(buffer, "sposob=")) {
            sposob = atoi(buffer + strlen("sposob="));
            continue;
        }
        if (strstr(buffer, "elementov=")) {
            elementov = atoi(buffer + strlen("elementov="));
            continue;
        }
        if (strstr(buffer, "K=")) {
            K = atoi(buffer + strlen("K="));
            continue;
        }
        if (strstr(buffer, "N=")) {
            N = atoi(buffer + strlen("N="));
            continue;
        }
 
    }
    puts("=============Result of parsing config file ========");
    printf("sposob = %dn", sposob);
    printf("elementov = %dn", elementov);
    printf("K = %dn", K);
    printf("N = %dn", N);
    puts("Press Enter!!!");
    getchar(); fclose(config);
 
 
    if (elementov > 20)
    {
        printf("Слишком много элементов в списке! Выход...n");
        return 1;
    }
    if (sposob != 1 && sposob != 2)
    {
        printf("Некорректный способ заполнения спискаn");
        return 1;
    }
    if (K + N > elementov)
    {
        printf("Некорректные данные в конфигурационном файле (N + K > элементовn)");
        return 1;
    }
    if (N > elementov)
    {
        printf("Некорректные данные: количество инвертируемых элементов больше чем элементов в спискеn");
        return 1;
    }
 
 
    // "объект" ЛОС с инициализацией
    List list;
    //list.head = list.tail = NULL;
    //list.size = 0;
 
    if (sposob == 2)
    {
        for (i = 0; i < elementov; i++)
        {
            tmpRand = rand() % 100;
            list.Insert(tmpRand);
        }
        list.Print();
        list.Inverse_sublist(N, K);
        printf("nn");
        list.Print();
    }
    if (sposob == 1)
    {
        for (int i = elementov; i > 0; i--)
        {
            printf("Введите элемент списка: n");
            scanf("%d", &tmpHand[i]);
            list.Append(tmpHand[i]);
        }
        list.Print();
        list.Inverse_sublist(N, K);
        printf("nn");
        list.Print();
    }
}

Я не проверял правильность методов.
Только перенес Ваш код в класс.
Обратите внимание на ненаписанные методы относящиеся к
ПРАВИЛУ ТРЕХ.
Если их не реализуете, то будут ошибки исполнения.



1



Sla


А книгу купил?


Записан

Мы все учились понемногу… Чему-нибудь и как-нибудь.

Душа в рай

Гость


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


Записан
Вад

Команда клуба

ru
Offline Offline
Пол: Мужской


Душа в рай, Страуструп новичку тяжеловат, пожалуй, будет. Хотя я затруднюсь что-то посоветовать взамен — мне в своё время некому было посоветовать, и я изучал этот язык по смеси Страуструпа, «Бархатного пути» и ещё чего-то. Некоторые вещи потом пришлось переучивать Улыбаюсь

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


Записан
Finch

Спокойный
Администратор

il
Offline Offline
Пол: Мужской

Пролетал мимо


Книга Бьерн Страуструп , конечно классика, но не для начинаюших. Она хороша как справочник, но не для обучения. Посмотри темы по форуму, много раз уже поднималась тема учебников для изучения С++. Вот хотя бы тут https://forum.shelek.ru/index.php/topic,10315.0.html есть ссылки на многие учебные материалы.
В Visual Studio 2006 я честно говоря не видел. В 2005 студии создаеш пустой С++ консольный проек. Пишеш такой код:

#include <stdio.h>

void main()
{
   printf(«Hello Wordn»);
}

Запускаеш на компиляцию и выполнение.


Записан

Не будите спашяго дракона.
             Джаффар (Коша)

Душа в рай

Гость


Под фразой «ничего» подразумевается что я с програмированием в принципе не знаком(ну правда бэйсик изучали одножды,но я ничего от туда не помню) тоесть мне надо начинать с самых озов и с самого начала.Правильно было подмечено то что Страуструп хорош как справочник и именно по этому я и зарегестрировался на этом сайте,чтобы преобрести базовые знания и хоть немного разобраться в терминологии книги.По поводу компиляции и запуска,какие клавиши запускают эти процессы?


Записан
Душа в рай

Гость


И ещё на визуал 2006 я просто в нете наткнулся на рекламу и по запарке записал его так у меня 2005.И спосибо что начали мне помагать. Да-да Да-да Да-да


Записан
Душа в рай

Гость


Знаешь Finch создал проект-CRL Console Application,ввёлданную тобой программу ответ был такой
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «stdafx.h»‘ to your source?
Я так понял что вместо «stdio.f» надо ввести «stdafx.h» опять проверил ответ такой
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «stdafx.h»‘ to your source?
что неправильно я сделал?


Записан
Душа в рай

Гость


теперь с stdafx.h выдаёт такое
error C3861: ‘printf’: identifier not found
в справочнике эта программа вот как записана
#include <iostream>

int main()
{
    std::cout<<«H…W…n»;
}
прокоментируйте


Записан
Sands

Помогающий

ua
Offline Offline


Душа в рай, Если посмотреть внимательно, то Finch в своем примере подключает <stdio.h> а ты пытался поключить «stdio.f». Так вот в библиотеке <stdio.h> и находится функция «printf».
Тот пример который ты нашол использует другой метод вывода — потоки ввода/вывода — ето тоже можно использовать, ето уже лично дело каждого. Так что можеш попробовать и то и то Ага


Записан
Вад

Команда клуба

ru
Offline Offline
Пол: Мужской


Душа в рай, коль уж начинать с азов, думаю, тебе полезно будет почитать вот эту темку: https://forum.shelek.ru/index.php/topic,13271.0.html
И по ссылкам оттуда тоже можно походить. Ведь, наверное, после успешного запуска Hello World у тебя встанет вопрос: а что дальше? Улыбаюсь И чтобы на него ответить, я думаю, надо знать в том числе, во-первых, почему ты хочешь научиться программировать, во-вторых, насколько ты умеешь ставить задачи, которые можно было бы запрограммировать, ну и в-третьих, собственно, какие задачи ты собираешься решать посредством языка.


Записан
Душа в рай

Гость


знаешь Sands я мог ошибиться когда посал именно сюда,а так визуал предлагает заменть stdio.h на stdafx.h.Первый случай показан на прикреплённом ресунке,во втором ответ такой
: error C3861: ‘printf’: identifier not found
так что я думаю что у меня может что то с визуалом Здесь была моя ладья...
А Ваду респект за ссылку Класс! думаю чуть позже она мне точно пригодиться.

Dimka

Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской


Не нужен тебе stdafx.h. Простой способ: при создании проекта поставить галочку Empty Project. Сейчас на имеющемся проекте либо отключить эту навязчивую гадость (тут со мной некоторые поспорить захотят Улыбаюсь — не надо, была уже тема) в свойствах проекта, либо в самом деле включить stdafx.h в программу, а stdio.h в stdafx.h.


Записан

Программировать — значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)

Душа в рай

Гость


а где её отключают,я в английйском не очень.Можно и просто по подробней описать как до этих свойств проекта добраться.И вообще довайте пройдём всё с самого что ни есть нуля(т.к. япроект создавал полагаясь на своё крайне скудное знание английского).Давайте зделаем так,напишите поэтапно как создавать этот пустой консольный С++ проект(или какой другой предложите),как что надо или ненадо отключать или включать в общем что и как по подробней.Потом я введу предложеный Finchем текст и выдам что получилось.
Вы уж не бросайте меня!!! 

« Последнее редактирование: 23-04-2008 11:12 от Душа в рай »
Записан
Душа в рай

Гость


консольный файл CLR Console Application
#include «stdafx.h»

using namespace System;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L»Hello World»);
    return 0;
}
такой текст пишет.прокомент…
прга работает


Записан
Джон

просто
Администратор

de
Offline Offline
Пол: Мужской


Всё приехали. Душа в рай, ты вобще-то понимаешь что ты делаешь? Или просто тычешь куда-нить — авось получится. Ты сначала определись с платформой, то что привёл это тн .NET платформа — почитай на досуге.

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

А уж потом только переходить к языку. Иначе у тебя даже не дрова наломанные получатся, а щепки наструганные. Ага «Это этот, как его… Волюнтаризм!» (c)

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


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
«Just because the language allows you to do something does not mean that it’s the correct thing to do.» Trey Nash
«Physics is like sex: sure, it may give some practical results, but that’s not why we do it.» Richard P. Feynman
«All science is either physics or stamp collecting.» Ernest Rutherford
«Wer will, findet Wege, wer nicht will, findet Gründe.»

Душа в рай

Гость


Джон-ты прав и ежли так киньте какую нить ссылку по этой теме. Отлично


Записан
Джон

просто
Администратор

de
Offline Offline
Пол: Мужской


А в гугле пробовал смотреть? Хотя конечно я порекомендовал бы тебе именно бумажную книгу — как настольный справочник. Но я ессно не знаю твои возможности:

http://www.dialektika.com/books/5-8459-0462-5.html

В принципе для начального знакомства тебе подойдёт любая на эту тему, посмотри, что есть в досягаемой близи.

Кстати как с аглицким? На нём больше инфа можно надыбать — например MSDN Ага:

http://msdn2.microsoft.com/ru-ru/visualc/aa336412.aspx

зы Вот тут посмотри — общая инфа по IDE, только там для продолжения зарегиться надо:
http://www.vbstreets.ru/VBdotNET/Articles/66032.aspx

В электронном виде посмотри на натахауз.


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
«Just because the language allows you to do something does not mean that it’s the correct thing to do.» Trey Nash
«Physics is like sex: sure, it may give some practical results, but that’s not why we do it.» Richard P. Feynman
«All science is either physics or stamp collecting.» Ernest Rutherford
«Wer will, findet Wege, wer nicht will, findet Gründe.»

Джон

просто
Администратор

de
Offline Offline
Пол: Мужской


Хмммм… Её просто гугля одной из первых выдала. Это сайт по бейсику, а не по С++. А зарегится — на форум не заходил? Там регистрация есть.

Но я бы поискал всё-таки по С++. Или лень матушка? Ага


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
«Just because the language allows you to do something does not mean that it’s the correct thing to do.» Trey Nash
«Physics is like sex: sure, it may give some practical results, but that’s not why we do it.» Richard P. Feynman
«All science is either physics or stamp collecting.» Ernest Rutherford
«Wer will, findet Wege, wer nicht will, findet Gründe.»

Душа в рай

Гость


Да нет не лень,просто всё что находил по С++ это справочники типа моего Страуструпа.Там нет ничего по поводу среды и интерфейса.


Записан
Душа в рай

Гость


извините что так долго не было меня,были проблемы с системой. С ума сойти...
Есть вопрос.Что такое «инкапсулирует»,»компиляция»,»разрядная линейная адресация»,»сегментированная модель»,»typedef-имена»,»целочисленные».И ещё (зарание извините за свою беспридельную неграмотность) дайте пошаговую инструкцию как создавать пустой консольный файл (нигде найти не магу ). 


Записан
Вад

Команда клуба

ru
Offline Offline
Пол: Мужской


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

Инструкция: Открываешь VS, File->New…->Project, в диалоге в дереве выбираешь «Visual C++»->»Win32 Console Application», задаёшь директорию и имя, жмёшь ОК, далее в диалоге выбираешь «Application Settings» и там, если нужен пустой проект, ставишь флаг «Empty project». Если не нужна прекомпиляция заголовков, убираешь флаг «precompiled headers». Жмёшь Finish. Собственно, всё.


Записан
Dimka

Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской


Инкапсуляция — упрятывание (в частности, данных) от внешнего доступа.

Тут сразу встаёт вопросы: зачем? и что такое «внешний»? Улыбаюсь Поэтому дополню: инкапсуляция — это инструмент управления сложностью разрабатываемой программы. Когда программа (вне зависимости от языка программирования) разделяется на составные части (функции, структуры, модули, классы, объекты, компоненты и т.д. — в каждом языке своё), эти части стараются сделать максимально независимыми друг от друга (инкапсулированными).


Записан

Программировать — значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)

Душа в рай

Гость


благодарю Вад и ещё тут «ост» Класс!
Диман спс за дополнение!!!

« Последнее редактирование: 30-04-2008 07:52 от Душа в рай »
Записан
Вад

Команда клуба

ru
Offline Offline
Пол: Мужской


dimka, согласен Улыбаюсь Всегда подразумевается, что прячут чьи-то данные от кого-то, чтобы тот не привязывался к деталям внутренней структуры (или просто не лез не в своё дело, чтоб не испортить чего).
Я так понимаю, человеку попадаются незнакомые слова в тексте самоучителя Улыбаюсь Не уверен, как лучше подходить к этим вещам: сначала пропускать такие детали, как та же инкапсуляция, разобравшись сначала с построением алгоритмов, или снимать все вопросы сразу. По крайней мере, сам я учился по этакой спиральной модели, периодически возвращаясь к ранее непонятным принципам. Тяготею в пользу того, что дополнительные проблемы (инкапсуляция, модульность, декомпозиция, …) следует отложить до того момента, когда оно реально понадобится: нужно просто держать в уме, что есть методики проектирования (подкрепляемые средствами языков), которые позволяют преодолеть сложность. А для начала, разобраться, как вообще, выполняя только базовое структурирование, описывать решение задач с помощью языка программирования. Но тут я недостаточно компетентен в роли преподавателя, чтобы советовать такое кому-то Улыбаюсь


Записан
Душа в рай

Гость


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

А теперь тех проблемы где отыскать окно в которое надо вбивать программу.Я прошёл по инструкции Вада проект был создан но окна для текста программы нет. 


Записан
Dimka

Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской


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

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


Записан

Программировать — значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)

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

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

Remarks

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

Изменения для удаления устаревших функций из библиотеки среды выполнения C в Visual Studio 2015 могут вызвать C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасными альтернативами, если таковые есть. Дополнительные сведения см. в разделе «Устаревшие функции».

Если ошибка C3861 появляется после миграции проекта из более старых версий компилятора, могут возникнуть проблемы, связанные с поддерживаемыми версиями Windows. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Если макросы WINVER _WIN32_WINNT назначены одной из этих версий Windows, необходимо изменить макросы. Дополнительные сведения см. в разделе «Изменение WINVER и _WIN32_WINNT «.

Примеры

Неопределенный идентификатор

В следующем примере возникает ошибка C3861, так как идентификатор не определен.

Идентификатор не в области

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

Исходный файл C3861_a1.cpp :

Исходный файл C3861_a2.cpp :

Требуется квалификация пространства имен

Для классов исключений в стандартной библиотеке C++ требуется std пространство имен.

Устаревшая функция, вызываемая

Устаревшие функции удалены из библиотеки CRT.

ADL и дружественные функции

Следующий пример приводит к возникновению ошибки C3767, так как компилятор не может использовать поиск, зависящий от FriendFunc аргументов:

Чтобы устранить ошибку, объявите друга в области класса и определите его в области пространства имен:

Источник

Error c3861 printf идентификатор не найден

Answered by:

Question

I think I already know the answer to this but I’ll ask the question anyway.

When I attempt to compile the following code:

//Print the numbers 1 through 20

for (count = 1; count «%dn» , count);

I get the message: error C3861: ‘printf’: identifier not found

Does this message have to do with the changes made to Visual C++?

Am I missing something obvious?

Answers

Or turn off precompiled headers. The gory details of this problem is that on a /Yu build (that is a build that use a PCH) the compiler ignores anything before the header file that marks the end of the PCH region. We are in the process of adding a warning for this situation — this new warning will show up in the next release of Visual C++.

Источник

ошибка C3861: «система»: идентификатор не найден

Я только начал новый win32 консольное приложение в VS 2010 и установить Additional options собственность на precompiled header в предстоящем мастере.

На основе один из моих предыдущих вопросов Я решил использовать следующий основной прототип:

Я также изменил Character Set свойство проекта к Use Multi-Byte Character Set ,

Но следующий код:

Будет выдавать эти две ошибки:

У меня был такой же опыт, и ошибок не было!
Кто-нибудь может подсказать мне, что не так?

Решение

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

В случае с system функция, это определено в stdlib.h заголовочный файл

Итак, в начало вашего файла кода (или в вашем предварительно скомпилированном заголовочном файле) добавьте строку

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

Помимо этого я сильно рекомендую против используя либо многобайтовый набор символов (все новые приложения Windows должны поддерживать Unicode), либо system функция, особенно system(«pause») ,

Источник

Идентификатор ошибки С++ не найден для функции?

это мои первые шаги в C++, и я пытаюсь запустить функцию, которую мне нужно использовать

но я получаю эту ошибку:

Код серьезности Описание Ошибка подавления строки файла проекта C3861 «findAndRotateBlankNumbers»: идентификатор не найден ConsoleApplication2 c:userssourcereposconsoleapplication2consoleapplication2consoleapplication2.cpp 29

//ConsoleApplication2.cpp: определяет точку входа для консольного приложения. //

Я изменил порядок кода так, как вы сказали:

но теперь я получаю другие ошибки:

Код степени серьезности Описание Состояние подавления строки файла проекта C4703 потенциально неинициализированная переменная локального указателя «первая» используется ConsoleApplication2 c:userssourcereposconsoleapplication2consoleapplication2consoleapplication2.cpp 52

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

    переместите функцию findAndRotateBlankNumbers выше main добавьте объявление функции вверху и оставьте определение там, где оно: void findAndRotateBlankNumbers(char* ptr);

Что касается вашей второй ошибки:

Компилятор жалуется, что вы first объявляете переменную, не присваивая ей значение при инициализации. Вы должны дать ему разумное значение по умолчанию, например char* first = nullptr;

То же самое с char* last = nullptr;

Если ваш компилятор не поддерживает nullptr , вместо этого используйте NULL ;

Источник

ошибка C3861: «система»: идентификатор не найден

Я только начал новый win32 консольное приложение в VS 2010 и установить Additional options собственность на precompiled header в предстоящем мастере.

На основе один из моих предыдущих вопросов Я решил использовать следующий основной прототип:

Я также изменил Character Set свойство проекта к Use Multi-Byte Character Set ,

Но следующий код:

Будет выдавать эти две ошибки:

У меня был такой же опыт, и ошибок не было!
Кто-нибудь может подсказать мне, что не так?

Решение

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

В случае с system функция, это определено в stdlib.h заголовочный файл

Итак, в начало вашего файла кода (или в вашем предварительно скомпилированном заголовочном файле) добавьте строку

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

Помимо этого я сильно рекомендую против используя либо многобайтовый набор символов (все новые приложения Windows должны поддерживать Unicode), либо system функция, особенно system(«pause») ,

Источник


implicit declaration of function- предупреждение или ошибка?

От:

Fedorchenko Aleksey

Украина

 
Дата:  22.03.04 09:45
Оценка:

Все время работал с MS VC++ (сначала 6, сейчас .NET 2003), но решил попробовать и gcc (MinGW 3.1).
Так вот встретил в последнем неприятную для себя особенность: gcc лишь предупреждает о неявном объявлении функции, в то время как MS VC++ выдает ошибку об этом.

Для примера код:

int main()
{
    printf("Bug or feature?");
    return 0;
}

При компиляции даст следующие результаты…
MinGW 3.1:

main.c: In function `main’:
main.c:3: warning: implicit declaration of function `printf’
Linking…

CTest.exe — 0 error(s), 1 warning(s)

.NET 2003:

d:ProgsMyOwnCPPtestmain.cpp(3) : error C3861: ‘printf’: identifier not found, even with argument-dependent lookup

Build log was saved at «file://d:ProgsMyOwnCpptestDebugBuildLog.htm»
test — 1 error(s), 0 warning(s)

Т.е. MinGW 3.1 знает о том, что эта функция есть где-то в crt и после этого предупреждения без явного включения <stdio.h> вызывает ее нормально!

Прав ли в данном случае MinGW 3.1?


Re: implicit declaration of function- предупреждение или оши

От:

PK Sly

http://www.vocord.ru/
Дата:  22.03.04 09:58
Оценка:

Ошибка.
По стандарту С++, такая программа не должна компилироваться.
Решение проблемы — включить заголовок с описанием функции

#include <stdio.h>

VAX/VMS rulez!


Re[2]: implicit declaration of function- предупреждение или

От:

Fedorchenko Aleksey

Украина

 
Дата:  22.03.04 10:02
Оценка:

Здравствуйте, PK Sly, Вы писали:

PS>По стандарту С++, такая программа не должна компилироваться.

Можно привести выдержку из стандарта с указанием главы?

PS>Решение проблемы — включить заголовок с описанием функции

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


Re: implicit declaration of function- предупреждение или оши

От:

achp

 
Дата:  22.03.04 10:06
Оценка:

Здравствуйте, Fedorchenko Aleksey, Вы писали:

FA>Прав ли в данном случае MinGW 3.1?

В языке Си (до стандарта’1999) допускается неявное объявление функции при первом использовании.

Не обявленная явно функция считается объявленной так:

int f();

Соответственно, в языке Си (до стандарта’1999) приведенная программа корректна.

Да здравствует ИМХО!


Re[2]: implicit declaration of function- предупреждение или

От:

Fedorchenko Aleksey

Украина

 
Дата:  22.03.04 10:23
Оценка:

Здравствуйте, achp, Вы писали:

A>В языке Си (до стандарта’1999) допускается неявное объявление функции при первом использовании.

А в действующем стандарте C уже отменена что ли такая возможность?


Re[3]: implicit declaration of function- предупреждение или

От:

achp

 
Дата:  22.03.04 10:31
Оценка:

Здравствуйте, Fedorchenko Aleksey, Вы писали:

A>>В языке Си (до стандарта’1999) допускается неявное объявление функции при первом использовании.


FA>А в действующем стандарте C уже отменена что ли такая возможность?

Увы, не помню точно. Но вроде бы отменили, вместе с правилом неявного int.

Да здравствует ИМХО!


Re[2]: implicit declaration of function- предупреждение или

От:

Vamp

Россия

 
Дата:  22.03.04 10:39
Оценка:

A>Соответственно, в языке Си (до стандарта’1999) приведенная программа корректна.
Не нахожу, что функция вызов фукнкции printf(«afff») подходит под сигнатуру int printf();

Да здравствует мыло душистое и веревка пушистая.


Re[3]: implicit declaration of function- предупреждение или

От:

achp

 
Дата:  22.03.04 10:43
Оценка:

Здравствуйте, Vamp, Вы писали:

V>Не нахожу, что функция вызов фукнкции printf(«afff») подходит под сигнатуру int printf();

Почему же? Вполне подходит.

В Си следующие два объявления имеют различный смысл:

int f();     /* Аргументы могут быть какими угодно */
int g(void); /* Аргументов быть не должно */

Да здравствует ИМХО!


Re[4]: implicit declaration of function- предупреждение или

От:

Vamp

Россия

 
Дата:  22.03.04 10:45
Оценка:

Да, что-то такое смутно припоминается… Неправ я, похоже…

Да здравствует мыло душистое и веревка пушистая.


Re[4]: implicit declaration of function- предупреждение или

От:

Lorenzo_LAMAS

 
Дата:  22.03.04 10:49
Оценка:

A>В Си следующие два объявления имеют различный смысл:
A>

A>int f();     /* Аргументы могут быть какими угодно */
A>

Вот ведь гадость-то какая!
А как в К&R типы параметров объявлялись (или могли объявляться), видел?

Of course, the code must be complete enough to compile and link.


Re[5]: implicit declaration of function- предупреждение или

От:

achp

 
Дата:  22.03.04 10:53
Оценка:

Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Вот ведь гадость-то какая!

L_L>А как в К&R типы параметров объявлялись (или могли объявляться), видел?

int f(x, y, z)
double x, y;
long z;
{
    /* ... */
}

Да здравствует ИМХО!


Re[3]: implicit declaration of function- предупреждение или

От:

PK Sly

http://www.vocord.ru/
Дата:  22.03.04 10:56
Оценка:

PS>>По стандарту С++, такая программа не должна компилироваться.

FA>Можно привести выдержку из стандарта с указанием главы?

Наверное, можно
Я как раз сейчас читал Мейерса, у него упоминалось, что в С++ запрещено неявное определение функций (в отличии от «чистого» С). Я ему верю, хотя, возможно, он и ошибается

PS>>Решение проблемы — включить заголовок с описанием функции


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

А он и не включал. Он решил, что это — неявное определение функции

VAX/VMS rulez!


Re[6]: implicit declaration of function- предупреждение или

От:

Lorenzo_LAMAS

 
Дата:  22.03.04 11:07
Оценка:

A>

A>int f(x, y, z)
A>double x, y;
A>long z;
A>{
A>    /* ... */
A>}
A>

Вот-вот, об этом я и говорил. Только я ошибся, насчет K&R. Это и в С99 можно.

Of course, the code must be complete enough to compile and link.

От:

PK Sly

http://www.vocord.ru/
Дата:  22.03.04 11:09
Оценка:

A>Почему же? Вполне подходит.

A>В Си следующие два объявления имеют различный смысл:

A>

A>int f();     /* Аргументы могут быть какими угодно */
A>int g(void); /* Аргументов быть не должно */
A>

Первое в «чистом» С до 99 года первое определение вообще не корректно.
Второе — верно.
А сколько угодно каких угодно аргументов делается так:

int f(...);

VAX/VMS rulez!

От:

Lorenzo_LAMAS

 
Дата:  22.03.04 11:23
Оценка:

Чем обоснуешь свое утверждение про «неверно»?

В С89 С99 это верно.

Of course, the code must be complete enough to compile and link.


Re[5]: implicit declaration of function- предупреждение или

От:

jazzer

Россия

Skype: enerjazzer
Дата:  22.03.04 11:35
Оценка:

Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>А как в К&R типы параметров объявлялись (или могли объявляться), видел?

Взгляни на заголовки X Window (или даже просто на маны) — и увидишь кучу такого

Что было в этом во всём этом хорошо — что не нужно было писать одно и то же тыщу раз:
ведь как хорошо было бы вместо

f(const std::map<std::string, MyClass> &x, const std::map<std::string, MyClass> &y, const std::map<std::string, MyClass> &z)

писать

f(const std::map<std::string, MyClass> &x, &y, &z)


Re[6]: implicit declaration of function- предупреждение или

От:

achp

 
Дата:  22.03.04 13:30
Оценка:

Здравствуйте, jazzer, Вы писали:

J>

J>f(const std::map<std::string, MyClass> &x, &y, &z)
J>

Ну, в Си так вточности не писали. Если бы K & R стиль спроецировать на Си++, получилось бы так:

int f(x, y, z)
const std::map<std::string, MyClass> &x, &y, &z;
{
    // ...
}

При этом нужно отметить, что сделать объявление функции без определения с каким бы то ни было указанием списка параметров в Си от К-Р вообще возможности не было.

Да здравствует ИМХО!


Re[7]: implicit declaration of function- предупреждение или

От:

jazzer

Россия

Skype: enerjazzer
Дата:  22.03.04 13:41
Оценка:

Здравствуйте, achp, Вы писали:

A>Ну, в Си так вточности не писали.

Это я знаю

я имею в виду принцип.

мне лично не нравится, что можно написать при объявлении переменных

int i, j, k, l, m;

а аналогичное объявление параметров функции нужно записывать как

f(int i, int j, int k, int l, int m)

а не в сходной форме

f(int i, j, k, l, m)


Re[8]: implicit declaration of function- предупреждение или

От:

Lorenzo_LAMAS

 
Дата:  22.03.04 13:42
Оценка:

Наверное, этому есть какое-то мудрое объяснение.

Of course, the code must be complete enough to compile and link.


Re[8]: implicit declaration of function- предупреждение или

От:

achp

 
Дата:  22.03.04 13:44
Оценка:

Здравствуйте, jazzer, Вы писали:

J>мне лично не нравится, что можно написать при объявлении переменных

J>

J>int i, j, k, l, m;
J>


J>а аналогичное объявление параметров функции нужно записывать как
J>

J>f(int i, int j, int k, int l, int m)
J>

Мне в общем-то без разницы. Я уже стабильно привык писать:

int i;
int j;
int k;

int f(
    int i,
    int j,
    int k);

Да здравствует ИМХО!

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

Понравилась статья? Поделить с друзьями:
  • Error c3861 gets идентификатор не найден
  • Error c3861 getline идентификатор не найден
  • Error c3861 getch идентификатор не найден
  • Error c3861 fact
  • Error c3861 cpuid идентификатор не найден