Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryС помощью компилятора и получил ассемблерный листинг, а не дизассемблировал. Поставил точки останова, и получил это как раз дизассемблировал с помощью компилятора - это с ключиком /FA (для MSVC) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 08:44 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Дмитрий, вы меня убедили. Пока сильно углубляться не буду. Почитаю тот код что вы мне дали. Ответьте только кто-нибудь хотя бы на этот вопрос, почему всё-таки код ниже отработал нормально ? Ведь правильно getc(stdin). Код: plaintext 1. 2. 3. 4. 5. 6. Изопропил, нет, этого я не знал, вы правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 08:53 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryОтветьте только кто-нибудь хотя бы на этот вопрос, почему всё-таки код ниже отработал нормально ? Ведь правильно getc(stdin). Не увидел ничего работающего. Твой код компилируется, но работает некорректно. Посмотри что в переменной a Код: plaintext 1. 2. 3. 4. 5. 6. Я сразу получаю -1, если написать getc(stdin) то ждет ввода и в a вижу код символа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 09:08 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Не работает. извините, я ошибся ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 09:14 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
И ещё, если это так важно, то почему бы это не сделать третьим параметром точки входа, fe Код: plaintext 1. В реализации printf используются функции из семейства putc/getc ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 09:25 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВ реализации printf используются функции из семейства putc/getc ? Не в ту сторону копаешь. Си это язык со своим синтаксисом, функциями и т.д., но откомпилированная программа запускается и работает в какой-то ОС (например виндовс), и весь ввод-вывод осуществляет ОС, она непосредственно взаимодействует с устройствами (клавиатура, видеоадаптер и т.д.), а программам доставляет все в унифицированном виде, для того она и нужна чтобы ты писал printf(), а не самодельный драйвер под каждый тип видеоадаптера. Но т.к. в каждой ОС это реализовано по своему, то в итоге твоя программа использует API (application programming interface) этой ОС. Ссылка выше которую я давал это WinAPI для работы с консолью (черное окошко в котором ты свою программу видишь), можешь использовать WinAPI, но в другой ОС (например линукс) этот код не скомпилируется, т.к. там свое API. А printf() будет работать везде. Вобщем printf() это функция которая формирует строку для вывода, а затем вызывает функции WinAPI чтобы эту строку вывести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 09:58 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИ ещё, если это так важно, то почему бы это не сделать третьим параметром точки входа, fe Код: plaintext 1. В реализации printf используются функции из семейства putc/getc ? Несмотря на концептуальность, функции ввода-вывода должны иметь оптимизацию для блочных операций. Тоесть запись на диск блока в 512 байт обычно не заменяют на 512 вызовов функции записи 1 байта. Это было-бы глупо. Скорее всего там стоит блочная функция записи строки на устройство STDOUT. Что конкретно - зависит от реализации стандартной библиотеки stdio. А она зависит от ОС и компиллятора. Но помимо этого функция printf еще и делает много операций по приведению формата. Это делает ее в десятки раз сложнее чем к примеру puts(const char *str). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 12:32 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Дмитрий, понял, сейчас этот хаос несколько упорядочился. Спасибо. mayton, спасибо. Ладно, видимо тут действительно не всё так просто. Прекращаю разбор putchar/getchar. Пока что прекращаю. PS Всё равно мне эти функции не нравятся. Небезопасные, как мне кажется, непонятно как реализованы, и не самые красивые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 15:46 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. 1. Классический код Код: plaintext 1. 2. 3. 4. 5. Запустили программу. Написали строку, нажимаем Enter, ниже происходит вывод строки напечатанной выше. Хотя по-идее, я напечатал один символ, поместил его в stdin, далее считал его getchar(), и через putchar() сразу должен вывести на stdout. В моём случае, происходит ожидание, и только потом будет вывод всех введённых символов в строке. Что я упускаю ? 2. Пользуетесь ли вы в своей работе/жизни этими функциями явно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 08:53 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercury2. Пользуетесь ли вы в своей работе/жизни этими функциями явно? Не нужны они вообще. Консольные приложения это обычно "роботы", т.е. программы не требующие какого-либо ввода данных с клавиатуры. Они просто запускаются и пишут на экран что делают. Приложения для пользователя пишутся с использованием GUI, т.е. формы, окна, поля ввода и т.д., а там всё совсем по другому пишется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 09:23 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercury1. Классический код Код: plaintext 1. 2. 3. 4. 5. Запустили программу. Написали строку, нажимаем Enter, ниже происходит вывод строки напечатанной выше. Хотя по-идее, я напечатал один символ, поместил его в stdin, далее считал его getchar(), и через putchar() сразу должен вывести на stdout. В моём случае, происходит ожидание, и только потом будет вывод всех введённых символов в строке. Что я упускаю ? Установи Линукс, именно для того, чтобы побаловаться с этими функциями. В *nix получишь именно то поведение, которое ожидаешь: ввод-вывод по одному символу сразу. Тут сказывается различное поведение разных ОС. Винда буферизирует ввод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 09:34 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Для меня нет программы красивее консольной C: Прикладные конечно используют GUI. Значит буферизация ? Хорошо, спасибо ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 12:08 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Сегодня экспериментировал. Подскажите пожалуйста Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Почему-то в консоль не переставая печатаются неотображаемые символы. Странно. В файле как английские так и русские буквы. 1. Прочитал про функции указывающие на конец файла. Можно ли конец файла проверять аналогично указателям ? Код: plaintext 1. 2. 3. 4. Я уже попробовал, нельзя. Жаль. Хотя что такое файл, как мне казалось. Просто кусок нулей и единиц, заканчивающийся признаком конца, и имеющий имя начала. Видимо ошибаюсь . Может всё-таки можно, и я просто не знаю. 2. Почему ничего не выводится в консоль ? 3.1 Можно ли так проверять получил ли я ненулевой указатель на память ? 3.2 Я получаю реальный адрес файла , по которому я не могу обратиться через указатель ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 09:12 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
getc, getwc : Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 09:27 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. Ты сначала разберись и сделай чтоб заработало, а потом вопросы задавай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 09:28 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
авторМожет всё-таки можно, и я просто не знаю. 2. Почему ничего не выводится в консоль ? Очень хочется ответить как Капитан Очевидность. Напиши printf("Hello World") и убедись что твоя консоль в порядке. Прочие ошибки - твои собственные. 3.1 Можно ли так проверять получил ли я ненулевой указатель на память ? Для работы с файлами существует файловое API. fopen, fread/fwrite, fclose, open, read/write, close и надо использовать его. Каждая операция возвращает код ошибки. Если fopen возвращает null то нужно его обязательно проверить. Если не будешь проверять коды ошибок то будешь зачмырен своими коллегами по работе и рано или поздно будешь больно бит. Если ты пишешь софт только под Windows то лучше использовать Windows-specific file API. Оно предоставляет больше возможностей по контролю ситуации именно в Windows файловой системе. 3.2 Я получаю реальный адрес файла , по которому я не могу обратиться через указатель ? Вобщем нельзя но почитай здесь. Это альтернативное API. http://ru.wikipedia.org/wiki/Отображение_файла_в_память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 10:04 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы. Dima_TТы сначала разберись и сделай чтоб заработало, а потом вопросы задавай. Хорошо, сначала разберусь, вы правы. К сожалению сегодня нужно заниматься одной ерундой ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 06:50 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
maytonОчень хочется ответить как Капитан Очевидность. Напиши printf("Hello World") и убедись что твоя консоль в порядке. мне было понятно что консоль в порядке, и проблема в моём коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 06:59 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x7.21.5.3 The fopen function Synopsis #include <stdio.h> FILE *fopen(const char * restrict filename, const char * restrict mode); Всё-таки сначала надо разобраться нормально с типами данных, и с тем что значит restrict, прежде чем с fopen работать. Распечатал все типы данных, и информацию по restrict из стандарта. Буду читать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 02:28 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Только не подсказывайте, сам хочу попробовать понять ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 02:28 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. С restrict полностью не разобрался, но я его добью. Зато решил уже попробовать FOPEN в действие, мне она нужна. Я хочу запускать программы и записывать результат их выполнения в другие файлы, уже мало консоли(одного файла привязанного к консоли). Ещё хочу попытаться пройтись по всем файлам на машине и поискать какой-нибудь текст например, просто интересно. А restrict постараюсь на выходных добить. Посмотрите? какой чудесный код ниже, я перенаправляю поток из одного файла в другой C: У меня только один вопрос. Как этот код написать ещё красивее. Оформить его правильно, скажем так. Или уже всё нормально. #include <stdio.h> Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А вот тут странно, я ожидал увидеть в обоих файлах "TEST", в первом эти символы были, но было ещё куча Н, а во втором были только Н, на 4 килобайта. Странно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. мне кажется это связано с работой printf. Сейчас проверю. Да, из-за этой функции. putc тоже плохо пошёл, эти Н везде. Значит эти функции всё-таки похожи по своей природе, как и предполагалось. А если попробовать привести их к void, как я часто видел, но так и не понял зачем. Тоже не помогло. Дальше читать ? Что-то упустил ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 04:43 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Ещё решил потренироваться, и написал простую программу для подсчёта пробелов, табуляции, предложений, и др. Скажите пожалуйста, правильно я её решил сточки зрения декомпозиции задачи ? Можно ли как-нибудь хранить функции в структурах ? по идее функция это константный указатель на константу, потому вроде-бы можно. Однако правильно ли это ? Делаете ли вы так ? Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 08:07 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryУ меня только один вопрос. Как этот код написать ещё красивее. Оформить его правильно, скажем так. Или уже всё нормально. Файлы после завершения работы с ними надо закрывать, см. fclose. Волшебные цифры в коде не нужны, есть константа EOF. SashaMercuryМожно ли как-нибудь хранить функции в структурах ? Можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 09:48 |
|
||
|
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗдравствуйте. Не нашёл в интернете информацию по этим функциям. Я понял что getchar слушает пользователя. Это ерунда. 1. Они(гэтчар, путчар) работают со стандартными потоками ? 2. Эти потоки имеют дексрипторы 0 и 1 и их зовут stdin и stdout ? 3. Эти потоки используют все выполняющиеся процессы ? (наверное нет, но тогда ответы на два первых вопроса тоже нет) 4. Как происходит получение символа функцией int getchar () ? Эта функция не принимает ничего, значит она(getchar) возможно обёртка для другой функции, которая принимает указатель на какой-то общий буфер для потока программы. И этот указатель по видимому двигается. Значит буфер этот реализован, вероятно, как LIFO. Это только мои догадки. Чтобы бы не подумали что я не думаю, а сразу спрашиваю вас Если нужно знать что делает, достаточно почитать стандарт C99. Если нужно знать как делает, то лезем в исходники. Например в GNU/Linux, смотрим glibc тут Если вкратце, то стандартные функции ввода/вывода реализуют стандарт в поведении, и сам ввод/вывод производят записью/чтением в файл устройства в /dev, которое назначено устройством ввода/вывода в параметрах ядра. Можно изменить при загрузке, прописав параметр console в grub.cfg, например так kernel /vmlinuz-XXX ro root=/dev/sdaY console=tty0 console=ttyS0,9600n8 Тогда стандартные IO функции из glibc будут писать весь IO через устройство /dev/tty0. Это устройство будет открываться как файл для каждого создаваемого процесса, и его дескриптор, который отобразиться в папке /proc/PID/fd, служит смещением в массиве структур file_operations, указатель на который имеется в структуре процесса, называемой task_struct в ядре, и обозначает все открытые процессом файлы. Стандартные IO функции в glibc производят обычные read/write с этим дескриптором, в read/write, передаётся управление калбекам, прописанным в соотвествующей дескриптору file_operations ( тут прототип) которая предоставляется драйвером того устройства, которая прописана в параметре console. Таким образом весь ввод/вывод проходит через реализованные в этом драйвере функции ввода/вывода, и которые делать могут далее что угодно, например писать в framebuffer видюхи, что /dev/tty0 и делает. Для стадарных из libc функций есть, прописанное стандартом, поведение и рекомендации к реализации, по которому, в частности, stdout и stdin в реализации представляют собой кольцевые буферы в юзерспайсе, из которого делается read/write в дескрипторы файла из /dev, прописанного в console. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 14:20 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38634111&tid=2019376]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 303ms |
| total: | 484ms |

| 0 / 0 |
