Вопросы по учебнику С... (Плавно из одного вопроса получилось несколько)
Модератор: Модераторы разделов
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Вопросы по учебнику С...
вот и я говорю о принципиальной возможности.
машина Тьюринга - функционально полна. а brainfuck?
машина Тьюринга - функционально полна. а brainfuck?
слава роботам!
-
aLexx programmer
- Сообщения: 985
- Статус: Турук-Макто
- ОС: Gentoo -> Ubuntu
Re: Вопросы по учебнику С...
(elide @ Jun 11 2006, в 11:06) писал(а):машина Тьюринга - функционально полна. а brainfuck?
А brainfuck функционально является программистским приколом, не более того
-
Boron
- Сообщения: 197
Re: Вопросы по учебнику С...
to Boron:
Тот кусочек кода, что я написал, не "правильное" оформление а один из стилей оформления (Да и то я его немного под себя подогнал smile.gif ). Так что лучше всего найти документ именно по стилям и определится с тем какой Вам больше нравится и удобно читается.
Извиняюсь - из-за экзаменов не до форума было. Ок, я посмотрю
-
ety
- Сообщения: 358
- ОС: Linux
Re: Вопросы по учебнику С...
в принципе ты все правильно показал, ибо это практически оффициальный стиль используемый на никсах последнии несколько десятков лет, есть правда еще стиль M$, но я согласен с /usr/src/linux/Documentation/CodingStyle, его придумали явно больные на голову.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-
PbIXapYx20under20nix
- Сообщения: 7
- ОС: some *NIX --force
Re: Вопросы по учебнику С...
Можно хоть на машине Тьюринга написать рендеринг.
Кто такое сделает и мне покажет, лично вышлю за свой счёт 20 литров самарского пива с "Дна"(Оффмагаз при местном пивзаводе).
В любую точку России.
-
Denjs
- Сообщения: 1685
- ОС: SuSe 10.2
Re: Вопросы по учебнику С...
Высылайте спецификации оборудования, среды (аппаратно-программной) на котором вы собираетесь гонять вашу машину тьюнинга )
ну и там ТЗ (по госту), П2, П4. (все по ГОСТу)
сделаем все в лучшем виде
И предоплату - у нас как раз нет проекта
ну и там ТЗ (по госту), П2, П4. (все по ГОСТу)
сделаем все в лучшем виде
И предоплату - у нас как раз нет проекта
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Вопросы по учебнику С...
Ваша главная проблема - учебник по С, откуда вы взяли этот пример. Строго говоря, в данном коде допущены 2 взаимосвязанные ошибки: не указан тип возвращаемого функцией main() значения, а также отсутствует инструкция return в конце main().
Нужно писать так:
Код: Выделить всё
int main()
{
...
return 0;
}И тот факт, что авторы многих книг по С используют в своих примерах конструкции наподобие приведённой вами, лишь идёт в минус таким авторам.
P.S. К сожалению, компилятор промолчит, если вы используете флаги по умолчанию. Необходимо настроить компилятор на строгое соответствие ISO С, тогда он не должен пропускать таких ошибок.
-
Олег777
- Сообщения: 238
- Статус: зануда
- ОС: Чё?
Re: Вопросы по учебнику С...
Чтоб не открывать новых тем, без толку. Хочется сказать, примеры в книгах часто содержат кучу ошибок, учитывая что книги попадаются довольно древние и варезные.
Вот пример, тоже тут терзаю Кернигана, пример из книги
Я конечно, кой что подправил, но компилятор, разве что, слюной не брызжет, хотя программулька работает
Вот пример, тоже тут терзаю Кернигана, пример из книги
Код:
/*
* kern5.c
*
* Copyright 2008 saturn 721 <saturn@zenwalk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <stdio.h>
#define MAXLINE 1000 /* MAXIMUM INPUT
LINE SIZE */
int main(int argc, char** argv)
{
int len; /* CURRENT LINE LENGTH */
int max; /* MAXIMUM LENGTH SEEN SO FAR */
char line[MAXLINE]; /* CURRENT INPUT LINE */
char save[MAXLINE]; /* LONGEST LINE, SAVED */
max = 0;
while ((len = getlines(line, MAXLINE)) > 0)
if (len > max)
{
max = len;
copys(line, save);
}
if (max > 0) /* THERE WAS A LINE */
printf("%s", save);
return 0;
}
getlines(s,lim) /* GET LINE INTO S,RETURN LENGTH */
int lim;
char s[];
{
int c, i;
for(i=0; i < lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return(i);
}
copys(s1, s2) /* COPY S1 TO S2;
ASSUME S2 BIG ENOUGH */
char s1[], s2[];
{
int i;
i = 0;
while ((s2[i] = s1[i]) != '\0')
++i;
}
Я конечно, кой что подправил, но компилятор, разве что, слюной не брызжет, хотя программулька работает
kern5.c: В функции ‘main’
kern5.c:34: предупреждение: implicit declaration of function ‘getlines’
kern5.c:38: предупреждение: implicit declaration of function ‘copys’
kern5.c: На верхнем уровне:
kern5.c:46: предупреждение: по умолчанию возвращаемый тип функции - ‘int’
kern5.c:62: предупреждение: по умолчанию возвращаемый тип функции - ‘int’
kern5.c: В функции ‘copys’
kern5.c:68: предупреждение: control reaches end of non-void function
Спички - детям!
-
astronom
- Сообщения: 151
- ОС: Debian
Re: Вопросы по учебнику С...
Ошибки в примерах - весьма продуктивный метод обучения. (конечно, если предварительно указать, что такие ошибки могут быть в примере) 
Параллельные извилины не пересекаются ...
-
кодировщик
- Сообщения: 974
- Статус: зарёган в пятницу 13
- ОС: Linux
Re: Вопросы по учебнику С...
а вот я сегодня встретил такое
может кто-то объяснит что это за написание?!
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>может кто-то объяснит что это за написание?!
-
Женя Подсыпальников
- Сообщения: 482
Re: Вопросы по учебнику С...
Не понятно, как в книге...
Тут - чья-то обработка 2008 года
По-моему, в книге - main была-таки замыкающей...
кодировщик писал(а): ↑15.12.2008 14:24а вот я сегодня встретил такое
Код: Выделить всё
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h>
может кто-то объяснит что это за написание?!
Это - какой-то редактор знаки меньше-больше так понял...
Пойдём на рыбалку !
-
Олег777
- Сообщения: 238
- Статус: зануда
- ОС: Чё?
Re: Вопросы по учебнику С...
Ага, main в конец и int перед copys и getlines и return 0; в copys
Спички - детям!
-
кодировщик
- Сообщения: 974
- Статус: зарёган в пятницу 13
- ОС: Linux
Re: Вопросы по учебнику С...
Женя Подсыпальников писал(а): ↑15.12.2008 14:27кодировщик писал(а): ↑15.12.2008 14:24а вот я сегодня встретил такое
Код: Выделить всё
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h>
может кто-то объяснит что это за написание?!
Это - какой-то редактор знаки меньше-больше так понял...
Так не понятно, по ходу оно так и должно быть, но компилятор на это матюкается
Код: Выделить всё
1.c:17:10: error: #include expects "FILENAME" or <FILENAME>
1.c:18:10: error: #include expects "FILENAME" or <FILENAME>
1.c:19:10: error: #include expects "FILENAME" or <FILENAME>
1.c:20:10: error: #include expects "FILENAME" or <FILENAME>-
Женя Подсыпальников
- Сообщения: 482
Re: Вопросы по учебнику С...
По передку copys - void , наверна, хватит...
Можно попробывать подправить на #include <stdio.h>, и.т.д. ...
Пойдём на рыбалку !
-
Denjs
- Сообщения: 1685
- ОС: SuSe 10.2
Re: Вопросы по учебнику С...
PbIXapYx20under20nix писал(а): ↑15.12.2008 02:13Можно хоть на машине Тьюринга написать рендеринг.
Кто такое сделает и мне покажет, лично вышлю за свой счёт 20 литров самарского пива с "Дна"(Оффмагаз при местном пивзаводе).
В любую точку России.
Надо как минимум определиться с организацией видео-памяти) и алгоритмами рендеринга.
Задача кажется нерешаемой потому что слишком сложна - для начала надо создать структуры для работы со сложными структурами (массивы например) и другие примитивные операции а потом их объединять в алгоритм рендеринга... аналогичная задача - имхо - это написать рендер на ассемблере.
Возможно я конечно что-то путаю, но теоретическая возможность никак не отрицается - хотя бы потому что обычные микросхемы начинаются обычной логики и/или/нет.
Простой процессор в некотором смысле - это машина Тьюринга и есть, только с очень сложным числом состояний. У оного тоже есть набор состояний - регстры, алфавит - ассемблер, записанный в ленту (правда конечную) - память, по которой процессор и ползает.
Соответственно, если отталкиваться от машины Тьюринга, сначала решается задача разработки простого ассемблера и "процессора" - т.е. алфавита и набора состояний для машины Тьюринга.
Фактически, подозреваю, на этом этапе придется создать макро-графический язык, собирающий "в одно" наборы состояний которые реализуют некую базовую макрофункциональность (группы узлов графа по функциональному назначению) ... т.е. в один блок например объединяются состояния реализующие одну ассемблерную инструкцию. причем как я понимаю, число состояний машины как я понимаю, растет пропорционально размеру алфавита... (Оценочно, инструкция перехода "JMP N" - переход вперед на N шагов где n 8-и битное число ячеек, потребует примерно 256-1024 состояния и/или правил переходов... - пропорционально размеру (квадрату размера?) алфавита, если не придумать какой трюк... например позволить машине оставлять ячейку без перезаписи содержимого и просто перемещаться... )
потом из этих макро-графических блоков строится единый граф, и загружается в машину Тьюринга, должны получить виртуальный аналог процессора)
Это ключевое) возможно я не слишком погрузился в тему, но пока я не вижу чего-то принципиально невозможного.
В принципе, для начала наверное, достаточно перехода, сравнения, условного перехода и базовых математических операций.
В результате мы получим что-то отдаленно напоминающее примерно шестнадцатую часть от процессора Z80 (или i8080) (оценочно).
Далее - дело техники. пишется простой компилятор ассемблера, потомна нем пишется компилятор простого языка высокого уровня, на нем реализуются работа со сложными структурами и т.д. - примерно все так, как бы вы работали создавая "блок для аппаратного рендеринга из транзисторов"
Полагаю, мы сойдемся в том, какой объем работы надо проделать что бы показать рендеринг )))
т.е. "мы можем, но за предоплату")
___________________
UPD: ещё похоже, что у просто может не хватить вычислительной мощности машины или размера памяти для обработки графа состояний. но за ваши деньги мы купим соответсвующее оборудование)
-
astronom
- Сообщения: 151
- ОС: Debian
Re: Вопросы по учебнику С...
кодировщик писал(а): ↑15.12.2008 14:40Так не понятно, по ходу оно так и должно быть, но компилятор на это матюкается
матюкается? И правильно делает. Может быть
либо
Код: Выделить всё
#include <имя_файла>, либо
Код: Выделить всё
#include "имя_файла"В данном случае, первый вариант.
Параллельные извилины не пересекаются ...
-
MiK13
- Сообщения: 1307
- ОС: Linux Debian
Re: Вопросы по учебнику С...
кодировщик писал(а): ↑15.12.2008 14:24а вот я сегодня встретил такое
Код: Выделить всё
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h>
может кто-то объяснит что это за написание?!
Здесь всё правильно написано. Именно так и надо писать, если надо, чтобы этот текст корректно отобразился в каком-нибудь html-браузере. Т.е. в html знак < открывает тэг, а знак > его закрывает. Поэтому, чтобы эти знаки корректно отобразились в html странице используется для них (и для кучи других) подобная кодировка (для > не обязательно)
Почему так получилось -- видимо пример был в каком-то html файле и кто-то взял и решил прямым копипастом перенести его в програииу. Причём не из изображения на экране браузера, а прямо из исходного файла.
-
кодировщик
- Сообщения: 974
- Статус: зарёган в пятницу 13
- ОС: Linux
Re: Вопросы по учебнику С...
MiK13 писал(а): ↑15.12.2008 20:51кодировщик писал(а): ↑15.12.2008 14:24а вот я сегодня встретил такое
Код: Выделить всё
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h>
может кто-то объяснит что это за написание?!
Здесь всё правильно написано. Именно так и надо писать, если надо, чтобы этот текст корректно отобразился в каком-нибудь html-браузере. Т.е. в html знак < открывает тэг, а знак > его закрывает. Поэтому, чтобы эти знаки корректно отобразились в html странице используется для них (и для кучи других) подобная кодировка (для > не обязательно)
Почему так получилось -- видимо пример был в каком-то html файле и кто-то взял и решил прямым копипастом перенести его в програииу. Причём не из изображения на экране браузера, а прямо из исходного файла.
Да спасибо. я уже потом разобрался.Действительно тупо скопипастили.
-
PbIXapYx20under20nix
- Сообщения: 7
- ОС: some *NIX --force
Re: Вопросы по учебнику С...
Denjs писал(а): ↑15.12.2008 16:40PbIXapYx20under20nix писал(а): ↑15.12.2008 02:13Можно хоть на машине Тьюринга написать рендеринг.
Кто такое сделает и мне покажет, лично вышлю за свой счёт 20 литров самарского пива с "Дна"(Оффмагаз при местном пивзаводе).
В любую точку России.
UPD: ещё похоже, что у просто может не хватить вычислительной мощности машины или размера памяти для обработки графа состояний. но за ваши деньги мы купим соответсвующее оборудование)
Вот про граф состояний.. Трашно представить сколько там будет узлов, точнее даже путей обхода. Да и если он будет равновесный(? может не правильно выразился,под пивом) Короче если там ещё и будет учтён пропускная способность на рёбрах то структура при 1024 элементах займёт 1024^2, это как понял основная структура обхода состояний, то есть будет использоваться для обработки матриц, следовательно должно храниться в оперативке, на равне с массивами..
Могу предложить графическую станцию K-19\K-16 без тесла модуля у качестве полигона для обкатки, но по удалёнке и на время разработки
Но мне кажется к этой проге нужно будет ещё делать интерфейс распределённого вычисления (типа Grid) и плодить его. Что бы через неделю его забанили по маркой мегазлостный DDoser.
А вообще мои цели использования этой проги свелись бы к разогреву жратвы на серваке. (запустил, понизил охлаждения и подгрел на нём кофе/чай/закуску)
-
Denjs
- Сообщения: 1685
- ОС: SuSe 10.2
Re: Вопросы по учебнику С...
Если в лоб - то да, так)
если подумать - то там правила или фактически многократно повторяются (например вводим новое состояние типа 8-и битный регистр - бац - и всех правил становится раз в 256 больше. но по сути одинаковых ))) ) или они будут генерироваться по заранее известному закону... - в общем их можно динамически генерировать по мере необходимости для заданной области графа.
Хотя я подозреваю вторую ленту машины Тьюринга и т.д. можно использовать что бы не плодить черезмерно граф состояний.
Только примеров нигде нету с несколькими лентами и так что бы между лентами можно было вести обмен данными))).
если подумать - то там правила или фактически многократно повторяются (например вводим новое состояние типа 8-и битный регистр - бац - и всех правил становится раз в 256 больше. но по сути одинаковых ))) ) или они будут генерироваться по заранее известному закону... - в общем их можно динамически генерировать по мере необходимости для заданной области графа.
Хотя я подозреваю вторую ленту машины Тьюринга и т.д. можно использовать что бы не плодить черезмерно граф состояний.
Только примеров нигде нету с несколькими лентами и так что бы между лентами можно было вести обмен данными))).
-
grouzen
- Сообщения: 120
- ОС: LFS, slackware
Re: Вопросы по учебнику С...
deninok писал(а): ↑15.12.2008 09:50
Ваша главная проблема - учебник по С, откуда вы взяли этот пример. Строго говоря, в данном коде допущены 2 взаимосвязанные ошибки: не указан тип возвращаемого функцией main() значения, а также отсутствует инструкция return в конце main().
Нужно писать так:
Код: Выделить всё
int main() { ... return 0; }
И тот факт, что авторы многих книг по С используют в своих примерах конструкции наподобие приведённой вами, лишь идёт в минус таким авторам.
P.S. К сожалению, компилятор промолчит, если вы используете флаги по умолчанию. Необходимо настроить компилятор на строгое соответствие ISO С, тогда он не должен пропускать таких ошибок.
Смешно конечно, но это K&R ... т.е. стандарт устарел и примеры из их книги желательно подгонять под с99
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
Re: Вопросы по учебнику С...
Ну если мы говорим о "строгом" соответствии стандарты, то тогда уж так:
Код: Выделить всё
int main(void)
{
...
return 0;
}Ибо это Си, а не С++
А вообще, сие гласит стандарт:
5.1.2.2.1 Program startup
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent; or in some other implementation-defined manner.
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Вопросы по учебнику С...
Ну да, я понимаю вас. Конечно же, во времена написания K&R стандартом и не пахло, а я, разумеется, имею в виду именно стандартный С, существующий уже почти 10 лет.
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Вопросы по учебнику С...
AestheteAnimus писал(а): ↑17.12.2008 19:18А вообще, сие гласит стандарт:
5.1.2.2.1 Program startup
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent; or in some other implementation-defined manner.
Ну, если уж быть совсем педантичным, то необходимо вспомнить, что в стандарте (по крайней мере, в С++-стандарте) сказано, что если в конце фукции main() не будет инструкции return, то эффект будет таким же, как если бы там была инструкция return 0.
Правда от компилятора к компилятору это не всегда одинаково срабатывает. Если опустить инструкцию return 0 в конце main(), то некоторые компиляторы свободно это пропускают, другие выдают ошибку.
Я считаю, что писать return 0 в конце main() необходимо всегда, потому что это логично: зачем указывать тип возвращаемого функцией значения, если в конце её тела явно ничего не возвращается?
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
Re: Вопросы по учебнику С...
Стандарт существует уже почти 20 лет
deninok писал(а): ↑18.12.2008 09:14Правда от компилятора к компилятору это не всегда одинаково срабатывает. Если опустить инструкцию return 0 в конце main(), то некоторые компиляторы свободно это пропускают, другие выдают ошибку.
Я считаю, что писать return 0 в конце main() необходимо всегда, потому что это логично: зачем указывать тип возвращаемого функцией значения, если в конце её тела явно ничего не возвращается?
Хм... у меня ни разу не было ошибки при этом, только варнинги. А вообще согласен, return стоит написать хотябы для наглядности
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Вопросы по учебнику С...
Да, прошу прощения. Я имел в виду С99, хотя был ведь и С89...
AestheteAnimus писал(а): ↑18.12.2008 15:08deninok писал(а): ↑18.12.2008 09:14Правда от компилятора к компилятору это не всегда одинаково срабатывает. Если опустить инструкцию return 0 в конце main(), то некоторые компиляторы свободно это пропускают, другие выдают ошибку.
Я считаю, что писать return 0 в конце main() необходимо всегда, потому что это логично: зачем указывать тип возвращаемого функцией значения, если в конце её тела явно ничего не возвращается?
Хм... у меня ни разу не было ошибки при этом, только варнинги. А вообще согласен, return стоит написать хотябы для наглядности
Я проверял на разных версиях компилятора GCC. Иногда ошибки были, но чаще предупреждения.
-
astronom
- Сообщения: 151
- ОС: Debian
Re: Вопросы по учебнику С...
Интересно, но. даже во втором издании (переводном, вышедшем в этом году) это не исправлено, даже комментария редактора нет.
С другой стороны, можно дочитать до раздела 1.7 "Функции", в котором объясняется роль return и после которого этот оператор встречается во всех листингах.
Параллельные извилины не пересекаются ...
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: Вопросы по учебнику С...
("deninok") писал(а):Я проверял на разных версиях компилятора GCC. Иногда ошибки были, но чаще предупреждения.
потому что это не ошибки, когда void'овую пишешь ты же не ставишь return а что так ? потому что знаешь что там скобка делает return
в int'овой то же самое, и если там не ставится return 0 то это значит только что там принимается return любое_число
откуда возникла связь между стандартом C++ и стандартом C ?
можешь объяснить как какой-нибудь новый стандарт С++ отменяет принятый документально стандарт C ?
с чего вдруг стандарты C++ становятся стандартами C ?
почему в C++ главная функция программы называется так же как в C ?
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Вопросы по учебнику С...
(Folderx) писал(а):откуда возникла связь между стандартом C++ и стандартом C ?
Оттуда же, откуда взялась связь между С++ и С: историческая данность.
(Folderx) писал(а):можешь объяснить как какой-нибудь новый стандарт С++ отменяет принятый документально стандарт C ?
Не совсем понял вопроса... Есть ряд положений в стандарте С++, не соответствующие стандарту С, и наоборот. Ведь на данный момент С и С++ - два разных языка.
(Folderx) писал(а):с чего вдруг стандарты C++ становятся стандартами C ?
Ещё более странный вопрос. Могу лишь сказать, что некоторые положения из стандарта С++ были добавлены в последний стандарт С (С99). Например, поддержка комментариев //.
(Folderx) писал(а):почему в C++ главная функция программы называется так же как в C ?
Опять-таки историческая данность.