Второй шаг в программировании на С (недоумение прямо какое-то...)

Модератор: Модераторы разделов

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

Uncle_Theodore писал(а):
08.11.2007 23:19
Вы уже перестали пить коньяк по утрам? :) Да или нет?


У меня после завтра ДР, выпейте за моё здоровье :)

Debris, ну вот, началось... Вы похоже не коньяк пили :(
promov, вам же уже объясняли, буфер тут не причём. В файлах нет EOF, и на клавиатуре нет кнопки EOF, и в windows тоже нет символа EOF. EOF значит: файл кончился, читать больше нечего! Вот вам друг по телефону книжку читает, страница 1, страница 2, страница 794, всё, книгу прочли... А ты его спрашиваешь:
- А какой номер у страницы на которой написано "всё, книгу прочли"?
- Нет такой, страницы, 794я - последняя.
- Нет, какой номер где написано:"всё, книгу прочлиНет такой, страницы, 794я - последняя."?
- Ты что, тормоз!? Ну нет!!!
- Ладно, я понял, 795я!
- Да нет там 795й, ********************************!!!!!!!!!!!!!!!!!!!!!!!!!

;)

PS: В юмор?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Это я могу понять. Но сразу другой вопрос: где находится то значение, которое считывается функцией getchar () последним? Ну где-то же оно должно быть? Ещё раз: getchar () считывает значения из буфера. Ну хорошо, вот этот момент: в буфере нет EOF. Откуда же getchar () его считывает?

...Мне это ещё и потому важно, что возможно, я неправильно представляю себе буфер. Вот проверка моего представления буфера.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
30.12.2007 18:18
Ну хорошо, вот этот момент: в буфере нет EOF. Откуда же getchar () его считывает?
ни откуда:

Код: Выделить всё

int getchar()
{
if(_буфер_пуст_) return EOF;
char c = _чтение_очередного_символа_();
return c;
}
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

getchar() читает, читает, читает, читает и вдруг хлоп! а читать то нечего? что делать бедному getchar()? Он подумал подумал, дай ка я верну EOF раз символ не могу.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

Debris, Гениально! так оно и есть. Можете посмотреть исходники вашей getchar() от МС(или вы уже глянули?). Это правда макрос, но не суть ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

drBatty, главное чтоб promov это понял
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

drBatty писал(а):
30.12.2007 18:24

Debris писал(а):
30.12.2007 18:26
Cпасибо. Это, всё, конечно, для меня внове, но понять можно. А ещё и эта цитата ввела в заблуждение

Red User писал(а):
22.10.2007 23:52
http://www.intuit.ru/department/se/pposix/9/

EOF

При каноническом режиме ввода при получении этого символа все буферизованные байты передаются процессу, а сам символ EOF отбрасывается. Таким образом, если буферизованных байт нет, т. е. EOF встретился в начале строки, в процесс будет передано нуль байт, что и является стандартным обозначением конца файла.


Правильно то было написать не так, как здесь, а "при получении этого символа сам символ EOF отбрасывается, а все буферизованные байты передаются процессу." Вот в таком порядке. Тогда, может и разговор по-другому пошёл бы.

Но! С программой всё же непонятно. Почему же после первого то <ctrl+d> программа не завершает работу? Действительно, поток символов считан и возвращён функцией getchar (), значение EOF возвращено (не считано!) и присвоено переменной с... Всё, условие

Код: Выделить всё

(c!= EOF)
не соблюдено, дОлжно из цикла выйти. Но этого не происходит! Почему, друзья? После второго <ctrl+d> только выходит из цикла.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

Код: Выделить всё

D:\Games\Musor\Project\!MS VS Projects\void\debug>void.exe
^D^D^D^D
♦♦♦♦
sdgdfgdfgd^D^D
sdgdfgdfgd♦♦
ddfgdfgdfgd^D^D
ddfgdfgdfgd♦♦
^C
D:\Games\Musor\Project\!MS VS Projects\void\debug>

У меня в оффтопе сочетание клавиш Ctrl+D вообще воспринимается как символ => Ctrl+D != EOF
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Второй шаг в программировании на С

Сообщение nesk »

в windows конец файла - это ctrl+z
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Да Бог с ними, с комбинациями клавиш- раз стандартов нет. Я приглашаю поразмышлять над вопросом: почему программа не выходит из цикла после <ctrl+d>?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov, тут всё просто. Дело в том, что getchar() работает не с клавиатурой, а с потоком, а поток в Linux'е - файл. Всё работает нормально если ввод не буферизированный(не канонический). Клавиатура либо посылает 1 смвол(если он нажат), либо тормозит, либо посылает 0 символов в случае ctrl+D, это воспринимается как файл длинны 0(первое же чтение -> EOF). Если консоль каноническая всё работает по другому:
вы ввели abc<ctrl+D>, поток стал как файл размером в 3 байта,но так как вы запросили 1 байт, getchar вернёт этот байт, а работа программы продолжится до следующего getchar. Что бы ввести EOF вам необходимо чтоб в буфере ничего не было, тогда getchar получит файл длинны 0, и вернёт EOF. Фся это фигня происходит от того, что каноническая консоль это не файл. Это что-то вроде ICQ, где вы набираете текст, а потом отправляете его специальной кнопкой или ctrl+enter. Просто это исторически так сложилось. Раньше терминалы так и работали. Это сейчас передомной 2 компа, а лет 20 назад 15 человек сидели за одним компьютером, артефакт остался с того времени.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

drBatty писал(а):
30.12.2007 19:30
Что бы ввести EOF вам необходимо чтоб в буфере ничего не было, тогда getchar получит файл длинны 0, и вернёт EOF.
То есть необходимо, чтобы в буфере ничего не было. Перед первым нажатием <ctrl+d> буфер не пуст, а перед вторым- пуст. Ну вот, надеюсь понял суть. А остальное не понял- да сейчас и не нужно. Не выяснять же, чем ICQ отличается от файла...
Cпасибо!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
30.12.2007 19:42
Не выяснять же, чем ICQ отличается от файла...
раньше с компом общались как по ICQ, а сейчас - напрямую. А вот getchar() всегда работала с файлами.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Ага, а вот эта прогамма почему работает c одним нажатием <ctrl+d>?

#include <stdio.h>
int main () {
long nc;
nc= 0;
while (getchar ()!= EOF) {
++nc;
}
printf ("%ld\n", nc);
return 0;
}


Я усматриваю в этом противоречие выводам, к которым мы пришли ранее. Действительно, getchar () считывает все символы, подсчитывает их и считывает EOF, которого быть не должно, т. к. буфер не пуст!

Я не понимаю ничего. Обе программы запускаются по запуску <стrl+d>. В первом случае, getchar () перебирает буфер символ за символом, пока они не заканчиваются и не натыкается на EOF. Ждёт дальнейших команд. Во втором случае , перебрав весь буфер символ за символом, не натыкается на EOF, но ведёт себя по другому- возвращает EOF в качестве своего значения и заканчивает работу. Как так?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
30.12.2007 20:56
Ага, а вот эта прогамма почему работает c одним нажатием <ctrl+d>?

Это ещё почему? С двумя, если буфер не пуст, и с одним, если пуст.
Во всяком случае у меня. Я не вижу разницы.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

Здесь похоже из за того что getchar() в while() буфер каждый раз сбрасывается
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

drBatty писал(а):
30.12.2007 21:13
Это ещё почему? С двумя, если буфер не пуст, и с одним, если пуст.
Во всяком случае у меня. Я не вижу разницы.
Прошу прощения у всех, кого отвлёк. Я уже заучился. Действительно, с двумя работает, если буфер не пуст и с одним, если буфер пуст.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

да ничего не сбрасывается, по ctrl+d отправляется строка, разница с enter только если строка пустая, по ctrl+d отправляется 0 байт, по enter символ
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

Код: Выделить всё

int main ()
{
    char buf[256];
    int l = fread(buf, 1, 255, stdin);
    if(l < 0)
        buf[0] = 0;
    else
        buf[l] = 0;
    printf("%d \"%s\"\n", l, buf);
    return 0;
}
promov, это вам для исследований ;)

PS: проверка лишняя, если верить моему man'у. Однако на всякий случай ввёл.

PPS: 0 послеслеша как всегда побился :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Что-то не то. Мне моя машина выдаёт, что неправильно такие символы \ присваивать. Когда я эти символы заменяю на какие-нибудь другие, компилятор ошибок не находит. Или Вы это умышленно?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
30.12.2007 21:51
Что-то не то.

попробуй так. форум откусил нули
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Шпунтик
Сообщения: 230
ОС: MSDOS 3.3

Re: Второй шаг в программировании на С

Сообщение Шпунтик »

drBatty писал(а):
30.12.2007 18:10
В файлах нет EOF, и на клавиатуре нет кнопки EOF, и в windows тоже нет символа EOF. EOF значит: файл кончился, читать больше нечего!

drBatty писал(а):
30.12.2007 18:24
promov писал(а):
30.12.2007 18:18
Ну хорошо, вот этот момент: в буфере нет EOF. Откуда же getchar () его считывает?

ни откуда:


Этот странный мистер EOF. Звать его никак, родом он ниоткуда, и вообще его нет.
Откуда же тогда упоминание его в миллионах книг по программированию, в огромном множестве программ?
Каким образом заканчивается цикл? По смыслу, цикл заканчивается в тот момент, когда getchar обнаруживает EOF. Но если EOF ниоткуда не берётся и вообще его нет, то getchar никогда его не найдёт, и цикл будет длится до скончания времён!!! Хорошо если getchar читает файл, там хоть можно конец файла определить по его длине. А если с клавиатуры? Где у клавиатуры конец?

Чудны дела твои, господи! А ещё говорят, что программисты мыслят логически. По мне, так это не логика а мистика.
Путь линуксоида очень напоминает путь воина, главными особенностями которого являются ответственность и самодисциплина. Но и награды этого пути достойны: это свобода и мастерство.
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

Шпунтик, читайте выше, getchar() не обнаруживает EOF а возвращает его, когда ему нечего брать из буфера! В stdio.h где то в глубинах закопан макрос вида

Код: Выделить всё

#define (-1) EOF
то есть функция возвращает никакой не EOF а обычную -1.

Отсюда вывод: EOF - просто код возврата функции, числовая константа.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Второй шаг в программировании на С

Сообщение Folderx »

promov

То есть необходимо, чтобы в буфере ничего не было. Перед первым нажатием <ctrl+d> буфер не пуст, а перед вторым- пуст. Ну вот, надеюсь понял суть.


Прошу прощения у всех, кого отвлёк. Я уже заучился. Действительно, с двумя работает, если буфер не пуст и с одним, если буфер пуст.


Какой буфер ? В теме Моя концепция буферизации ты написал

Модель буфера в моём понимании.

Набор того, что сейчас уместно назвать байтом, есть буфер. То есть куча байтов, выстроенных в ряд, примернотак:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000


Вот это "что сейчас уместно назвать байтом, есть буфер" ты откуда узнал ?

На чём основывается твоё понимание ?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

Debris писал(а):
31.12.2007 00:19
В stdio.h где то в глубинах закопан макрос вида
Так уж и в глубинах :)
109 строка у меня:

Код: Выделить всё

/* End of file character.
   Some things throughout the library rely on this being -1.  */
#ifndef EOF
# define EOF (-1)
#endif


Шпунтик писал(а):
30.12.2007 21:58
Хорошо если getchar читает файл, там хоть можно конец файла определить по его длине. А если с клавиатуры? Где у клавиатуры конец?

Чудны дела твои, господи! А ещё говорят, что программисты мыслят логически. По мне, так это не логика а мистика.
Да причём тут мистика?! В том то и дело, что getchar() работает с файлом, а каноническая консоль - не файл. И консоль - не клавиатура. Раньше, давно, был терминал(монитор с клавой но (почти)без мозгов), соединённый с компьютером. Консоль Linux'а от туда, она эмулирует терминал.

А вообще, буфер есть и у потока, и у консоли и даже у самой клавиатуры. Т.ч. пишем какой буфер имеется ввиду.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Folderx писал(а):
31.12.2007 01:04


drBatty писал(а):
31.12.2007 09:45
А вообще, буфер есть и у потока, и у консоли и даже у самой клавиатуры. Т.ч. пишем какой буфер имеется ввиду.
Я уже устал разговаривать по этому поводу. Авторы, из которых я почерпнул свои знания о буфере, не пишут, буфер чего они имеют ввиду. Но сдаётся мне, он какой-то один. В теме о буферизации Моя концепция буферизации есть сообщения номер 20, 26, и 30. Там цитаты из книг. Ну, вот собственно, говоря и всё. БОльше мне никто никакой информации о буфере не предоставил. Зато предоставили задачки типа "очисти буфер". Дабы просто не перепиывать листинги с учебников, а осмысленно решать эти задачки, пришлось самому представлять и моделировать буфер (там сообщение номер один)

...Кстати, в той теме точно также меня спрашивали, какой буфер я имею ввиду и я отвечал точно также, что откуда мне знать, какой. Какой авторы имеют ввиду, такой и я

Folderx писал(а):
31.12.2007 01:04
Вот это "что сейчас уместно назвать байтом, есть буфер" ты откуда узнал ?
На чём основывается твоё понимание ?
Перед этим всем нужно добавить "набор того".
Кроме цитат, о которых я говорил выше, ещё и глава "представление данных в памяти компьютера" сыграла свою роль. Там написано, что все цифры в двоичной системе счисления представлены, а каждому символу своя цифра соответсвует. А что такое нули и единицы я понятия не имею и псал уже об этом.

Если не так что, то ппоправили бы лучше. В той теме Моя концепция буферизации парень один реально помог сказав, что буфер заполняется с нулевого элемент, т. е. что буфер- массив элементов типа char. (см. там сообщение номер 52 и 58). И вообще лучше буфер обсуждать в той теме, а не в этой.
...Во, кстати, да. Массив элементов типа char. Вот, похоже я не ошибся, изобразив буфер так (Моя концепция буферизации сообщение номер один)
...Эх, хоть бы брошюрку кто какую подсказал... Cамо-то програмирование я не по брошюрке собираюсь изучать- вон у меня 3 книги толстенных. Чисто какой-то минимум технический, что ли чтобы знать...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
31.12.2007 10:35
Чисто какой-то минимум технический, что ли чтобы знать...
ну вот вам минимум:
буфер в сишных потоках(структура FILE) реализован таким примерно образом:

Код: Выделить всё

#define BUF_SIZE 100

int x_errno = 0;

struct X_FILE
{
    char buf[BUF_SIZE];//буфер
    int buf_pos;//текущий байт
    int buf_len;//число байтов в буфере
    FILE *fs;
};

int x_fgetc(X_FILE *f)
{
    if(f->buf_pos == f->buf_len)
    {//в буфере все байты прочитаны, надо загрузить новые
        int l = BUF_SIZE;//число байт для загрузки
        f->buf_pos = 0;
        if(f->buf_len)
        {//если буфер не пуст, мы затрём все байты, кроме последнего
            f->buf[0] = f->buf[f->buf_len - 1];//посл. байт нам пригодится,
             //если мы захотим вернуться на байт назад с помощью x_ungetc()
            l--;//читаем на 1байт меньше
            f->buf_pos = 1;
        }
        l = fread(f->buf + f->buf_pos, 1, l, f->fs);//чтение в буфер
        f->buf_len = l + f->buf_pos;//число прочитаных байт
    }
    if(f->buf_pos == f->buf_len)    return EOF;//читать нечего
    return f->buf[f->buf_pos++];//возврат текущего байта
}
Для чего это надо? во первых, что бы можно было в любой момент прочитать прошлый байт(ы), а во вторых, для увеличения быстродействия(предположим, что создатели стандартной библиотеки не знают о буферизации :) ) Этот вариант обычно читает не по одному байту, а по 99 сразу, хотя отдаёт по одному. Всё понятно?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

drBatty писал(а):
31.12.2007 14:24
Всё понятно?
Благодарю Вас. Был бы рад Вам сказать, что Ваши труды достигли цели, но не получается. Я просто темы ещё эти не прошёл. Вот этого знака я не знаю "->", указателей я тоже, можно сказать не знаю (не могу понять в чём прикол-то? Если можно просто имя переменной испоьзовать? Но если польза от них всё же есть, я со временем её пойму.). Это вот слово тоже зарезервированное FILE- Из какой оно темы? Наверное, про файлы- их я тоже ещё не проходил. А разобрался я более или менее с циклами, массивами, структурами, рекурсией (соответственно с написанием собственных функций). Сейчас вот на указателях застопорился.

...Что же делать, если так дела обстоят? Знай я синтаксис... Но Ваши труды всё равно даром не пройдут, не сегодня, так завтра, не завтра, так послезавтра всё равно я надлежащий синтаксис пройду и тогда смогу осилить написанную программу. C Новым Годом!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
31.12.2007 14:54
...Что же делать, если так дела обстоят? Знай я синтаксис...
Кто-ж мешает его изучить? :rtfm: Здесь как раз очень простой случай, вместо того, чтобы дать функции 112и байтовую копию, я просто показал, где лежит структура. Это называется указателем. Если это не просто указатель, а указатель на структуру, то доступ к её полям записывается так указатель_на_структуру->поле. А поля обычных структур доступны через точку.

promov писал(а):
31.12.2007 14:54
FILE

Это не из файлов, это из потоков. Определено в <stdio.h>
getchar() это обычно fgetc(stdin), а stdin это стандартный поток ввода, и имеет тип (FILE*)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
elf74
Сообщения: 482
Статус: Линуксоид-Самовар :)
ОС: Mandriva Power Pack 2008.0 LCE

Re: Второй шаг в программировании на С

Сообщение elf74 »

Вот этого знака я не знаю "->"

Этот знак как раз близок к теме указателей и структурных типов данных.
Запись

Код: Выделить всё

f->buf_pos

заменяет собой запись

Код: Выделить всё

(*f).buf_pos

То есть представляет собой указатель на поле структуры.
Спасибо сказали: