Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
#1

Поменять стандарт ISO C99 на ISO C90 - C++

23.05.2015, 21:40. Просмотров 613. Ответов 18
Метки нет (Все метки)

На домашнем компьютере (mac) компилирую программы в терминале через gcc, стандарт языка там ISO C99, однако в универе на компах ISO C90, поэтому многие программы, работающие дома, не работают в универе, причем ошибки могут быть как несущественные (не пропускает int i = 0 как и серьезные (например исключение в операции с плавающей точкой). Вопрос: как поменять на своем компе стандарт на 90-й? хочется отлаживать программы дома. В гугле никакой информации почти не нашел, только на иностранных сайтах кто-то говорил после gcc писать -std=c90, но это не помогло. буду признателен за помощь.

P.S. мб можно как-то в xcode поменять стандарт и там кодить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 03:28     Поменять стандарт ISO C99 на ISO C90 #2
Цитата Сообщение от ZimOne Посмотреть сообщение
писать -std=c90, но это не помогло
То, что не помогло - не особо верится, если честно. Что-то не так сделал - вероятнее.
Можно еще ключик -ansi попробовать.
Вообще, документация вот: https://gcc.gnu.org/onlinedocs/gcc/C...t-Options.html
Пробуй.
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 12:43  [ТС]     Поменять стандарт ISO C99 на ISO C90 #3
Цитата Сообщение от DrOffset Посмотреть сообщение
То, что не помогло - не особо верится,
Когда использую -ansi пишет clang: warning: argument unused during compilation: '-ansi=c90'

Когда использую -std=c90 или -std=c89, компилирует нормально, хотя должен ругаться на int i = 0; и тд

Добавлено через 9 минут
А, нужно просто -ansi. Но так тоже все компилируется

Добавлено через 3 минуты
вместо gcc попробовал gnu - нет результата

Добавлено через 1 минуту
Может это проблема конкретно Мака?
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 13:02     Поменять стандарт ISO C99 на ISO C90 #4
Цитата Сообщение от ZimOne Посмотреть сообщение
Может это проблема конкретно Мака?
Bash
1
gcc -v
что выдает?

Добавлено через 1 минуту
Цитата Сообщение от ZimOne Посмотреть сообщение
хотя должен ругаться на int i = 0;
Попробуй так:
Ставь -std=c89 и еще ключ -pedantic
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 13:10  [ТС]     Поменять стандарт ISO C99 на ISO C90 #5
Цитата Сообщение от DrOffset Посмотреть сообщение
что выдает?
Выдает Last login: Sun May 24 12:42:48 on ttys000
Mini-Aleksej:~ aleksejkockarev$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
Mini-Aleksej:~ aleksejkockarev$

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Попробуй так:
Ставь -std=c89 и еще ключ -pedantic
Попробовал - он начал ругаться на комменты в стиле cpp, и на mixes code and declaration, все правильно, но программа все равно скомпилировалась, через ./a.out запускаю, она работает правильно, хотя на компе в универе после ввода исходных данных она падает и выдает Исключение в операции с плавающей точкой
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 13:12     Поменять стандарт ISO C99 на ISO C90 #6
Цитата Сообщение от ZimOne Посмотреть сообщение
хотя на компе в универе после ввода исходных данных она падает и выдает Исключение в операции с плавающей точкой
Тут уже не стандарт виноват. Показывай код.

Добавлено через 1 минуту
Цитата Сообщение от ZimOne Посмотреть сообщение
но программа все равно скомпилировалась
Если warning`ов недостаточно, то поменяй ключ -pedantic на -pedantic-errors
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 13:19  [ТС]     Поменять стандарт ISO C99 на ISO C90 #7
Цитата Сообщение от DrOffset Посмотреть сообщение
Показывай код.
main4-1.c
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
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include "int4-1.h"
 
#define eps 1e-6
#define d 1e-4
 
 
int main(void)
{
    double x;
    fprintf(stdout, "Type alpha: ");
    if (fscanf(stdin, "%lf", &alpha) != 1) { fprintf(stdout, "er"); return -1; }
    if ((alpha >= 1) || (alpha <= 0))
    {
        fprintf(stdout, "No solution if alpha is out of (0,1)\n");
        return -1;
    }
    fprintf(stdout, "Type N: ");
    if (fscanf(stdin, "%d", &n) != 1) { return -1; fprintf(stdout, "er"); } 
    x = root_search(f, g, -100, 100, d2f);
    fprintf(stdout, "Solution: x = %lf f(x) = %lf\n", x, f(g,x));
    return 0;
}
int4-1.c
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
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include "int4-1.h"
 
#define eps 1e-6
#define d 1e-4
 
 
double g(double t)
// Кочкарев А.В.
// Подыинтегральная функция.
// Вход: аргумент t
// Выход: значение подинтегральной функции при данном аргументе
{
  return exp(-0.5*t*t);
}
 
 
double f(double(*g)(double t), double x)
// Кочкарев А.В.
// Функция, зависящая от x и alpha.
// Вход: аргумент x и подинтегральная функция g
// Выход: значение функции при данном x и alpha
{
  return integral(g,eps,x)-alpha*sqrt(2*M_PI)+sqrt(0.5*M_PI);
}
 
 
double integral(double (*f)(double), double a, double b)
// Кочкарев А.В.
// Функция подсчета приближенного значения интеграла на данном отрезке методом трапеций
// Вход: функция f, которую интегрируем, концы отрезка a и b
// Выход: приближенное значение интеграла на данном отрезке
{
    double h,l,s,s1,m;
    int i;
    s=0;
    h=(b-a)/n; printf("%lf",h);
    l=fabs(b-a);
    m=l/n;
    for (i=1;i<n;i++)
      s=s+f(a+i*m);
    s1=((f(a)+f(b))/2.);
    s=s+s1;
    s=s*h;
    fprintf(stdout, "%lf", s);
    return s;
}
 
 
double d2f(double t)
// Кочкарев А.В.
// Второй дифференциал подинтегральной функции
// Вход: аргумент t
// Выход: значение второго дифференциала при данном аргументе
{
    return -exp(-0.5*t*t)*t;
}
 
 
double root_search(double(*f)(double(*g)(double t),double x), double(*g)(double t), double a, double b, double (*d2f)(double x))
// Кочкарев А.В.
// Функция нахождения корня уравнения на заданно отрезке методом Ньютона (касательных)
// Вход: Функция f, корень которой ищем, ее производная g, концы отрезка a и b, ее вторая производная d2f
// Выход: корень уравнения f на данном отрезке
{
    double x0, xn;
    int kol;
    kol = 1;
    if (fabs(f(g,a)) < eps)
        return a;
    if (fabs(f(g,b)) < eps)
        return b;
    if (f(g,a)*d2f(a)>0)
        x0 = a;
    else
        x0 = b;
    xn = x0-f(g,x0)/g(x0);
    if((xn < a) || (xn > b))
        xn = (a + b)/2;
    if(fabs(f(g,xn)) < eps)
        return xn;
    while(fabs(x0-xn) > eps)
    {
        if(kol > 100)
            return -1;
        x0 = xn;
        xn = x0-f(g,x0)/g(x0);
        if((xn < a) || (xn > b))
            xn = (a + b)/2;
        if(fabs(f(g,xn)) < eps)
            return xn;
    fprintf(stdout, "%d\n", kol);
        ++kol;
    }
    return xn;
}
int4-1.h

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
double g(double t);
// Кочкарев А.В.
// Подыинтегральная функция.
// Вход: аргумент t
// Выход: значение подинтегральной функции при данном аргументе
 
double f(double(*g)(double t), double x);
// Кочкарев А.В.
// Функция, зависящая от x и alpha.
// Вход: аргумент x и подинтегральная функция g
// Выход: значение функции при данном x и alpha
 
 
double integral(double (*f)(double), double a, double b);
// Кочкарев А.В.
// Функция подсчета приближенного значения интеграла на данном отрезке методом трапеций
// Вход: функция f, которую интегрируем, концы отрезка a и b
// Выход: приближенное значение интеграла на данном отрезке
 
double d2f(double t);
// Кочкарев А.В.
// Второй дифференциал подинтегральной функции
// Вход: аргумент t
// Выход: значение второго дифференциала при данном аргументе
 
double root_search(double(*f)(double(*g)(double t),double x), double(*g)(double t), double a, double b, double (*d2f)(double x));
// Кочкарев А.В.
// Функция нахождения корня уравнения на заданно отрезке методом Ньютона (касательных)
// Вход: Функция f, корень которой ищем, ее производная g, концы отрезка a и b, ее вторая производная d2f
// Выход: корень уравнения f на данном отрезке
 
int n;
// Кочкарев А.В.
// Глобальная переменная n - количество трапеций при подсчете интеграла
 
double alpha;
// Кочкарев А.В.
// Глобальная переменная alpha - параметр уравнения
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 13:21  [ТС]     Поменять стандарт ISO C99 на ISO C90 #8
Программа считает такой интеграл: Название: Снимок экрана 2015-05-24 в 13.20.28.png
Просмотров: 20

Размер: 6.6 Кб
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 13:26  [ТС]     Поменять стандарт ISO C99 на ISO C90 #9
Суть заключается в том что основное что мы используем - это интегрирование методом трапеций и нахождения корня методом Ньютона - касательных

Добавлено через 4 минуты
По идее ведь исключение в операции с плавающей точкой возникает из-за деления на ноль, и странно что мак это пропускает
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 13:26     Поменять стандарт ISO C99 на ISO C90 #10
ZimOne, входные данные, на которых проявляется проблема в универе?
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 13:29  [ТС]     Поменять стандарт ISO C99 на ISO C90 #11
Цитата Сообщение от DrOffset Посмотреть сообщение
входные данные
Абсолютно любые, но надо заметить что альфа должна быть в интервале (!) от 0 до 1, количество трапеций тоже можно любое ввести, программа падает всегда
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 13:45     Поменять стандарт ISO C99 на ISO C90 #12
Цитата Сообщение от ZimOne Посмотреть сообщение
Абсолютно любые, но надо заметить что альфа должна быть в интервале (!) от 0 до 1, количество трапеций тоже можно любое ввести, программа падает всегда
Это я уже сам понял.
У меня проблема тоже не воспроизводится.
Еще вопрос - какой компилятор стоит в универе?
По поводу причин ошибки пока сложно сказать наверняка (вероятно ошибка точности в плавающей точке и чуть разная реализация на разных компиляторах играет роль). Надо внимательно изучить код.
Из того, что сразу бросилось в глаза: глобальные переменные в h-файле. Надо переделать так:
В int4-1.h:
C
1
2
3
4
5
extern int n;
// Глобальная переменная n - количество трапеций при подсчете интеграла
 
extern double alpha;
// Глобальная переменная alpha - параметр уравнения
В int4-1.c (после include):
C
1
2
int n;
double alpha;
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 14:11  [ТС]     Поменять стандарт ISO C99 на ISO C90 #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Еще вопрос - какой компилятор стоит в универе?
ОС - fedora, компилятор gcc

Добавлено через 47 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Надо переделать так
Нужно добавить туда и туда? или достаточно один вариант использовать?
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 14:22     Поменять стандарт ISO C99 на ISO C90 #14
Цитата Сообщение от ZimOne Посмотреть сообщение
Нужно добавить туда и туда? или достаточно один вариант использовать?
Это и есть один вариант. Исправление касается двух файлов. В h-нике добавляешь exetrn. В с-шнике - сами переменные.
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 14:25  [ТС]     Поменять стандарт ISO C99 на ISO C90 #15
Цитата Сообщение от DrOffset Посмотреть сообщение
Это и есть один вариант.
Спасибо, исправил
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 14:26     Поменять стандарт ISO C99 на ISO C90 #16
Цитата Сообщение от ZimOne Посмотреть сообщение
ОС - fedora, компилятор gcc
Если скажешь побольше инфы (вывод uname -a и gcc -v) о машине в универе, то будет совсем замечательно.
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 14:28  [ТС]     Поменять стандарт ISO C99 на ISO C90 #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Если скажешь побольше инфы
Сейчас к сожалению не могу проверить - универ закрыт
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
24.05.2015, 14:30     Поменять стандарт ISO C99 на ISO C90 #18
Цитата Сообщение от ZimOne Посмотреть сообщение
Сейчас к сожалению не могу проверить - универ закрыт
Понимаю. Я могу проверить на любой версии, но так как времени проверять на всех у меня нет, то просто напиши инфу, как узнаешь. Посмотрю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2015, 14:32     Поменять стандарт ISO C99 на ISO C90
Еще ссылки по теме:

C++ ISO C++ forbids declaration of with no type
C++ Ошибка ISO C++ forbids comparison between pointer and integer
C++ Как программно распаковать ISO (образ диска)?
C++ ISO C++ forbids declaration of 'c' with no type
C++ Монтирование файла образа .iso C++

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

Или воспользуйтесь поиском по форуму:
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
24.05.2015, 14:32  [ТС]     Поменять стандарт ISO C99 на ISO C90 #19
Цитата Сообщение от DrOffset Посмотреть сообщение
Посмотрю.
хорошо, спасибо
Yandex
Объявления
24.05.2015, 14:32     Поменять стандарт ISO C99 на ISO C90
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru