Форум программистов, компьютерный форум, киберфорум C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/103: Рейтинг темы: голосов - 103, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 52
1

Ошибка C2371 переопределение; различные базовые типы

13.02.2017, 15:53. Показов 19442. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день
Подскажите, пожалуйста, почему выдает ошибку C2371 переопределение; различные базовые типы. Что это за ошибка я знаю, но что именно ее вызывает в данном случае и как исправить, если честно, не понимаю. Начинает появляться, когда из функции aboutH() снова вызвать fMenu(), без данного возврата нет и ошибки

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
void fMenu()
{
    int aM;
    int bM;
 
    printf("\nMenu. \n ================================ \n 1. A short list of storage devices \n 2. Get more information about the storage devices \n 3. Extracting external storage devices \n 4. Return to menu \n 5. Exit\n\n");
    scanf_s("%d", &aM);
    //printf("%d", a);
    switch (aM) 
    {
    case 1:
            fDiski();
            fMenu();
            break;
    case 2:
        printf("\n 1. Hard disks \n 2. Flash memory \n 3. Drives \n 4. Return to menu\n\n");
        
        scanf_s("%d", &bM);
        switch (bM) {
        case 1:
            aboutH();
            break;
        case 2:
        //  aboutF();
            break;
        case 3:
        //  aboutD();
            break;
        case 4:
            fMenu();
            break;
        }
        break;
    case 3:
        break;
    case 4:
        break;
    case 5:
        break;
    default:
        printf("Incorrect value. Repeat selection.");
        fMenu();
        break;
    }
}
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
void aboutH() {
    printf("Information on hard disks");
    int j;
    _int64 FreeBytesAvailable;
    _int64 TotalNumberOfBytes;
    _int64 TotalNumberOfFreeBytes;
    LPCWSTR disk = L"I:\";
    LPCWSTR diski[26] = { L"A:\",L"B:\",L"C:\",L"D:\",L"E:\",L"F:\",L"G:\",L"H:\",L"I:\",L"J:\",L"K:\",L"L:\",L"M:\",L"N:\"
        ,L"O:\",L"P:\",L"Q:\",L"R:\",L"S:\",L"T:\",L"U:\",L"V:\",L"W:\",L"X:\",L"Y:\",L"Z:\" };
    for (j = 0; j<26; j++)
    {
        TotalNumberOfBytes = NULL;
        TotalNumberOfFreeBytes = NULL;
        FreeBytesAvailable = NULL;
        GetDiskFreeSpaceEx(diski[j],
            (PULARGE_INTEGER)&FreeBytesAvailable,
            (PULARGE_INTEGER)&TotalNumberOfBytes,
            (PULARGE_INTEGER)&TotalNumberOfFreeBytes);
        if (GetDriveType(diski[j]) == DRIVE_FIXED)
        {
            if (TotalNumberOfBytes != 0) {
                printf("%s: ", diski[j]);
 
                
                printf("Total Memory %lf Gb, ", (long double)TotalNumberOfBytes / 1024 / 1024 / 1024);
                printf("Free %lf Gb\n", (long double)TotalNumberOfFreeBytes / 1024 / 1024 / 1024);
            }
            else {
                printf("%s: ", diski[j]);
 
            
 
                printf("inactive disk\n");
            }
        }
        else
        {
            continue;
        }
    }
    _getch();
    fMenu();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2017, 15:53
Ответы с готовыми решениями:

Ошибка "различные базовые типы" при переопределении класса
Здравствуйте, возникает ошибка при компиляции ...

Ошибка C2371 int32_t: переопределение, различные базовые типы
Разбираюсь в чужем проекте. Проект работал в Qt и возможно на Linux. Хочу запустить его в VS2015....

Ошибка C2371 int32_t: переопределение; различные базовые типы
Здравствуйте. Я перешёл на MVS 2015 и при открытии проекта у меня выдаёт следующие ошибки: Скрин...

Базовые типы данных
в пачке N листов бумаги размера А4 плотностью Р гр. на квадратный см. Найти вес пачки бумаги с...

10
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2017, 16:33 2
вам даже подсветка синтаксиса указывает на ошибку
0
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 52
13.02.2017, 17:11  [ТС] 3
retmas, т.е. вот этот массив вынести в главную процедуру?
C++Выделить код
1
2
LPCWSTR diski[26] = { L"A:",L"B:",L"C:",L"D:",L"E:",L"F:",L"G:",L"H:",L"I:",L"J:",L"K:",L"L:",L"M:",L"N:"
        ,L"O:",L"P:",L"Q:",L"R:",L"S:",L"T:",L"U:",L"V:",L"W:",L"X:",L"Y:",L"Z:" };
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2017, 17:38 4
Teemona, т.е. правильно записывать строки
C++Выделить код
1
LPCWSTR disk = L"I:\\"; // двойной \
0
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 52
13.02.2017, 17:49  [ТС] 5
retmas, прошу прощения, при вставке в сообщение здесь уже произошла автозамена, не доглядела. На скриншоте то, как оно в коде написано. Вроде совпадает с указанной вами ошибкой.
Еще какие-то предположения о ошибке изначальной есть?
Миниатюры
Ошибка C2371 переопределение; различные базовые типы  
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2017, 18:18 6
у вас как определены функции? примерно так?:
C++Выделить код
1
2
3
4
5
6
7
8
9
void aboutH()
{
...
}
 
void fMenu()
{
...
}
если так( и в таком порядке), добавьте объявление fMenu перед aboutH
C++Выделить код
1
2
3
4
5
6
7
8
9
10
void fMenu();
void aboutH()
{
...
}
 
void fMenu()
{
...
}
(вы бы хоть указали на место, куда компиль ругается, строку, название функции. ищи за вас, гадай...)
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 52
13.02.2017, 18:25  [ТС] 7
retmas, да в том и дело, что ругается он на саму функцию fMenu, без указания строки. Да и от порядка не зависит. Ибо при перемешивании он начинает ругаться и на все другие функции в добавок к ошибке про fMenu, а т.к. построены они по одному принципу, значит косяк в тех кусках кода, которые показала.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2017, 18:40 8
Цитата Сообщение от Teemona Посмотреть сообщение
без указания строки
ерунда. учитесь понимать вывод компилятора. он вам должен указать не только место, где произошло по его мнению переименование (т.е. на саму функцию, как вы говорите), но и место где по его мнению она была определена/объявлена в первый раз.
Цитата Сообщение от Teemona Посмотреть сообщение
Да и от порядка не зависит. Ибо при перемешивании он начинает ругаться и на все другие функции
я вам нигде не говорил менять местами функции. их просто нужно объявить до использования.
еще раз посмотрите на мой предыдущий пост и увидите объявление функции до использования, причем в этом случае определение возможно после использования.
вот вам пример, похожий на то, что у вас как мне думается(ибо я не видел всего кода)
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
void foo
{
...
    bar(); // объявление! не вызов!
...
}
 
void bar() // переопределение функции bar !!
{
...
    foo(); // ок. вызов объявленной и определенной ранее функции
...
}
а вот как должно быть
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void bar(); // объявление
void foo
{
...
    bar(); // ок. вызов объявленной ранее функции
...
}
 
void bar() // ок. определение объявленной ранее функции
{
...
    foo(); // ок. вызов объявленной и определенной ранее функции
...
}
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 52
13.02.2017, 18:54  [ТС] 9
retmas, спасибо. Действительно, если вначале поставить пустое объявление функции, все заработало. А можно еще как-то объяснить или хотя бы назвать, чтобы понять, что гуглить, чтобы осознать?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2017, 19:00 10
Цитата Сообщение от Teemona Посмотреть сообщение
пустое объявление функции... что гуглить, чтобы осознать?
смотрю я на слово пустое, смотрю, значит...
вобщем, для начала изучите/погуглите терминологию. в частности: что такое объявление и определение, с чем их едят и чем они отличаются)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
14.02.2017, 15:42 11
Лучший ответ Сообщение было отмечено Teemona как решение

Решение

Цитата Сообщение от retmas Посмотреть сообщение
C++Выделить код
1
void foo() {
Цитата Сообщение от retmas Посмотреть сообщение
bar(); // объявление! не вызов!
Вызов, но идентификатор неизвестен компилятору. Объявление было бы таким:
C++Выделить код
1
void bar();
Добавлено через 3 минуты
Цитата Сообщение от Teemona Посмотреть сообщение
А можно еще как-то объяснить или хотя бы назвать, чтобы понять, что гуглить, чтобы осознать?
https://prog-cpp.ru/cpp-function/
http://cppstudio.com/post/5291/
1
14.02.2017, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2017, 15:42
Помогаю со студенческими работами здесь

Переменные и базовые типы данных
Сложите два вещественных числа типа float с десятью знаками после десятичной точки. Совсем новичок...

Частичные объявления не должны определять различные базовые классы
public abstract class ELEMENT : UserControl { public int info; public void...

Контрольная-базовые типы данных в борланд СИ+++
приведите последовательность действий для задания имени файла программы,набора операторов программмы

ПЕРЕМЕННЫЕ И БАЗОВЫЕ ТИПЫ ДАННЫХ ЯЗЫКА ПРОГРАММИРОВАНИЯ С
Задание 1 1. Выполните ввод данных (включая числовые) с помощью функции scanf_s(). В частности,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru