Консультация № 192299
02.01.2018, 17:59
0.00 руб.
02.01.2018, 18:00
0 18 1
Здравствуйте! Прошу помощи в следующем вопросе:
Пытаюсь скомпилировать интерпретатор когда-то безумно популярного языка программирования Фокал, но столкнулся с ошибкой, которую не знаю как исправить.
В архиве, в файле proto.h, содержаться прототипы функций Фокала и вот на строчке:

Код:
int getline ARG((char *cp, FILE *fp))


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

Всех с прошедшим недавно Новым годом!

Архив: focal.zip (15.9 кб)

Обсуждение

давно
Посетитель
7438
7205
03.01.2018, 14:41
общий
Адресаты:
Я бы все фокальные функции переименовал, например, добавив спереди f_
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
03.01.2018, 18:24
общий
03.01.2018, 18:24
Адресаты:
Я тоже об этом думал... Вот только возникает один вопрос - у людей ведь раньше этот код работал, а сейчас почему не работает?
Одну "историческую" ошибку я там исправил - заменил "gets" на "fgets". Но там причина понятна. А вот с такими ни разу не сталкивался.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
03.01.2018, 18:34
общий
Адресаты:
а сейчас почему не работает?
Может, в том Си, на котором раньше компилировался Фокал, не было функции getline() ?
Если дело только в этой функции, то переименовать ее и дело с концом
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
03.01.2018, 18:47
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Может, в том Си, на котором раньше компилировался Фокал, не было функции getline() ?

Хорошая шутка, новогодняя...
А такое вообще может быть, чтобы в stdio.h добавляли новые функции окромя тех, что были на заре превращения homo sapiens в homo claves torcularis?
Цитата: Лысков Игорь Витальевич
Если дело только в этой функции, то переименовать ее и дело с концом

Ну, если никто не знает, как решаются подобные коллизии в Си - так и сделаю...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
03.01.2018, 19:19
общий
03.01.2018, 19:27
Адресаты:
Зря смеетесь...
Скачал Си "Aztec C86" для ДОСа. Там и близко нет getline

Тут предлагают самим написать функцию getline()

И вообще, стандарт Си менялся довольно много раз...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
03.01.2018, 19:31
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
И вообще, стандарт Си менялся довольно много раз...

А я думал, что только Фортран осмеливается ломать фундаментальные устои...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
03.01.2018, 19:35
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Скачал Си "Aztec C86" для ДОСа. Там и близко нет getline

Это разработка 1995 года. Или, по крайней мере, её последний раз изменяли в 1995 году.
Хорошо, Вы открыли мне глаза. Я подумаю, как самописную функцию поменять на стандартную. Тем более, что они должны делать одно и тоже.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
03.01.2018, 19:38
общий
Адресаты:
Хотя, вот интересно, там же в файле proto.h есть объявление функции main(), но на неё компилятор почему то не ругается...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
03.01.2018, 19:50
общий
Адресаты:
Так main() ни в одной h-ке никогда не описывалась. Как бы, подразумевалась.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
03.01.2018, 20:07
общий
Адресаты:
А Вы не подскажете, что означает такое описание функции:
Код:
int getline(cp, fp)
register char *cp;
register FILE *fp;
{
register c;

Я раньше подобного никогда не встречал...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
03.01.2018, 20:18
общий
03.01.2018, 20:19
Адресаты:
Я тоже не встречал.
Полагаю, тип параметров задан вне имен самих параметров, а register - предписание хранить указанные переменные в регистрах, а не в памяти. И передавать параметры не в стеке, а в регистрах.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
03.01.2018, 20:38
общий
03.01.2018, 20:48
Адресаты:
Ну вот, что-то получилось.

Теперь осталось разобраться с фокальим языком.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
04.01.2018, 11:19
общий
Адресаты:

А чего вдруг потянуло на Фокал?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
312929
1973
04.01.2018, 11:31
общий
Адресаты:
Ну, если никто не знает, как решаются подобные коллизии в Си - так и сделаю...

А если пространство имён использовать?
давно
Мастер-Эксперт
425
4118
04.01.2018, 13:29
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
А чего вдруг потянуло на Фокал?

Исключительно проказливости ради...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
04.01.2018, 13:30
общий
Адресаты:
Цитата: Коцюрбенко Алексей Владимирович
А если пространство имён использовать?

Я таким даже в с++ не пользовался. Поди ужасы какие-нибудь...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
17042
808
06.01.2018, 18:05
общий
Адресаты:
Оформите ответ?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Посетитель
7438
7205
08.01.2018, 11:17
общий
это ответ
Здравствуйте, Вадим Исаев ака sir Henry!
В результате обсуждения в мини-форуме пришли к выводу, что функция getline() была не всегда, а появилась в результате очередного изменения стандарта Си.
Поэтому программа, написанная для более раннего компилятора Си, не может использовать функцию из нового стандарта Си.
Выход предложен самим автором вопроса: использовать стандартную функцию getline() вместо рукописной.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа