Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 4
1

Ошибка компиляции в MinGW

13.10.2014, 10:46. Показов 1468. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Попробовал скомпилировать учебный пример из одного учебника в MinGW, но произошла ошибка:

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
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <cstring>
using namespace std;
void eatspace(char* str);
double expr(char* str);
double term(char* str, int& index);
double number(char* str, int& index);
char* extract(char* str, int& index);
const int MAX = 80;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    char buffer[MAX] = {0};
    cout << "Добро пожаловать в дружественный калькулятор!" << endl
         << "Введите выражение или пустую строку для завершения:" << endl;
    for(;;)
    {
        cin.getline(buffer, sizeof buffer);
        eatspace(buffer);
        if(!buffer[0])
            return 0;
        cout << "\t=" << expr(buffer) << endl << endl;
    }
}
 
void eatspace(char* str)
{
    int i = 0;
    int j = 0;
    while((*(str + i) = *(str + j++)) != '\0')
        if(*(str + i) != ' ')
            i++;
    return;
}
double expr(char* str)
{
    double value = 0.0;
    int index = 0;
    value = term(str, index);
    for(;;)
    {
        switch(*(str + index++))
        {
            case '\0':
                return value;
            case '+':
                value += term(str, index);
                break;
            case '-':
                value -= term(str, index);
                break;
            default:
                cout << endl << "Ошибка!" << endl;
                exit(1);
        }
    }
}
double term(char* str, int& index)
{
    double value = 0.0;
    value = number(str, index);
    while((*(str + index) == '*') || (*(str + index) == '/'))
    {
        if(*(str + index) == '*')
            value *= number(str, ++index);
        if(*(str + index) == '/')
            value /= number(str, ++index);
    }
    return value;
}
double number(char* str, int& index)
{
    double value = 0.0;
    if(*(str + index) == '(')
    {
        char* psubstr = 0;
        psubstr = extract(str, ++index);
        value = expr(psubstr);
        delete[]psubstr;
        return value;
    }
    while(isdigit(*(str + index)))
        value = 10 * value + (*(str + index++) - 48);
    if(*(str + index) != '.')
        return value;
    double factor = 1.0;
    while(isdigit(*(str + (++index))))
    {
        factor *= 0.1;
        value = value + (*(str + index) - 48) * factor;
    }
    return value;
}
char* extract(char* str, int& index)
{
    char buffer[MAX];
    char* pstr = 0;
    int numL = 0;
    int bufindex = index;
    do
    {
        buffer[index - bufindex] = *(str + index);
        switch(buffer[index - bufindex])
        {
            case ')':
                if(numL == 0)
                {
                    buffer[index - bufindex] = '\0';
                    ++index;
                    pstr = new char[index - bufindex];
                    if(!pstr)
                    {
                        cout << "Выделение памяти не удалось, программа прервана";
                        exit(1);
                    }
                    strcpy_s(pstr, index - bufindex, buffer);
                    return pstr;
                }
                else
                    numL--;
                break;
            case '(':
                numL++;
                break;
        }
    } while(*(str + index++) != '\0');
    cout << "Выход за пределы выражеия, возможно плохой ввод." << endl;
    exit(1);
    return pstr;
}
Объясните пожалуйста поподробнее в чём ошибка?
Миниатюры
Ошибка компиляции в MinGW  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2014, 10:46
Ответы с готовыми решениями:

MinGw. ошибка компиляции
Привет. есть модуль и прога на с++. В VS всё работает нормально, а при компиляции Mingw вылетают...

ошибка компиляции в MinGW
Здравствуйте, не могу скомпилировать код в MinGW, #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

Логи компиляции MinGW
Как мне получить логи компиляции в мою программу.... Т.е моя консольная программа запускает...

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать?
Просто решил поиграться с CodeLite.

6
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
13.10.2014, 11:11 2
Sulfuras368, а сам не догадываешься, что у тебя strcpy_s вместо strcpy?
Или ты вообще не знаешь, что такое strcpy???
0
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 4
13.10.2014, 11:18  [ТС] 3
На VC++ пример компилируется без проблем, но в MinGW с ошибкой.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
13.10.2014, 11:20 4
Sulfuras368, strcpy_s - это функция мелкомягких, т.к. они считают strcpy небезопасной.
1
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 4
13.10.2014, 11:23  [ТС] 5
тоесть функция strcpy_s не входит в стандарт, и следовательно её нет в STL на MinGW?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
13.10.2014, 11:35 6
Лучший ответ Сообщение было отмечено Sulfuras368 как решение

Решение

STL это библиотека шаблонов.
strcpy - функция из стандартной библиотеки C
strcpy_s - функция из библиотеки C от Microsoft.

Добавлено через 2 минуты
Для mingw, вроде, есть опция для включения поддержки безопасных функций CRT. Смотрите в документации.
1
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 4
13.10.2014, 12:08  [ТС] 7
Kerry_Jr, Toshkarik спасибо за пояснения)
0
13.10.2014, 12:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2014, 12:08
Помогаю со студенческими работами здесь

Ошибка при установке mingw
Подскажите что делать. Не могу установить Mingw. Качаю х64. Такая ошибка

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и...

Ошибка при сборке библиотеки MinGW
Добрый день, уважаемые форумчани. Пытаюсь создать проект по этой инструкции....

Ошибка с подключением библиотек iostream.h в MinGW
Помогите разобраться. Не получается подключить библиотеки iostream.h. В среде MinGW 2.1 #include...


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

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