Здравствуйте, Vamp, Вы писали:
D>>Спасибо! Становится немного понятнее и уже интереснее.)) V>Ок. Тебе понятнее. V>Тогда вот тебе вопрос для размышления.
V>
V>howthisworks.exe > file
V>
V>Эта команда запустит howthisworks.exe и, в случае использования print, вместо консоли сохранит текст в файл file. V>Вопрос: V>1. При использовании WriteConsoleA это поведение сохранится? V>2. Объясни, почему.
Понятия не имею. Но предполагаю, что pintf, будучи более сложной функцией, может "адаптироваться" и выводить текст не только в файл, но и ещё куда-нибуть, в зависимости от того, чего нужно пользователю. В отличии от WriteConsoleA, которая всегда выполняет одно и то же действие.
Здравствуйте, Deeman! На мой взгляд, Вы немножко не туда зашли. Если вы только начинаете программировать, и пишите программы на уровне Hello, world, то по своему опыту могу Вам посоветовать не лезть покаместь в реализации стандартных функций, а для начала научитесь нормально ими пользоваться. И читать Рихтера Вам пока еще очень рано, так что не забивайте себе етим голову. Избыток информации — ето так же плохо, как и ее недостаток.
Итак, что я могу Вам посоветовать:
1. Разберитесь, что нужно для минимально работающей программы.
2. Постепенно разберайтесь со всеми констукциями языка, изучите цыклы, указатели, функции и т.д. Советую Подбельского почитать Язык Си++, Дейтел — Как программировать на Си++ и выполнять ВСЕ упражнения, без практики никуда!
3. После всего етого уже можно начинать читать Рихтера.
Что еще могу добавить, так ето то, что неважно на каком языке ты будешь программировать — изучение нового языка, после того как ты знаешь хорошо один из них и принцыпы действия ето одна неделя — не больше, самое главное библиотека под етот язык! Так что не углубляйся чрезмерно в ети тонкости, смотри на картину в целом, а не на конкретные пиксели!
Здравствуйте, Deeman, Вы писали:
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе. Поэтому на чистом Си, без использования библиотек, сделать этого нельзя.
В самих же библиотеках для переговоров с операционной системой используется либо ассемблер, либо нестандартные расширения Си (например, позволяющие воткнуть пару ассемблерных команд в середину сишной функции).
Здравствуйте, Deeman, Вы писали:
D>AlexGin, Вы писали:
AG>>мы имеем черный ящик
D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
желание похвальное ... но меня например мотивирует только неизвестность .
ну а если по делу — стоит посмотреть чтонибудь типа ассембелер под виндовс подсистемы ввода вывода ,
ну или как советовали — под отладчиком пройтись ... но эт тоже надо немного асм знать
все правильно — не слушай их
— только поняв как это работает — поймешь , что эти знания на фиг не нужны .... но и карман не тянут
... и иногда даже и пригождаются
... когда то давно я тоже стремился проследить выполнение программы от кода до пробегания электрона по ноге процессора
Здравствуйте, Pzz, Вы писали:
Pzz>Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе.
Как это? А как же мне обращаться к dll-кам? Неужто в С++ нет для этого встроенных средств?
Здравствуйте, yozhik89, Вы писали:
Y>Здравствуйте, Deeman! На мой взгляд, Вы немножко не туда зашли. Если вы только начинаете программировать, и пишите программы на уровне Hello, world, то по своему опыту могу Вам посоветовать не лезть покаместь в реализации стандартных функций, а для начала научитесь нормально ими пользоваться.
Дык я как раз и хотел представить картину в целом. Мне было известно, что операционная система управляет "железом", операциями ввода-вывода. Мне так же было известно, что написание любой программы всегда частично является системным программированием, так как в любом случае программе приходится общаться с операционной системой (получать данные с внешнего мира и выводить туда результаты программа без ОС не способна (я знаю, что это очень спорное заявляение)). И из этого выходит, что любой язык должен иметь в себе конструкции для взаимодействия с исполняющей средой, то есть ОС. Пока LuciferSaratov не показал мне пример использования этих конструкций, я не знал, что стандартные библиотечные функции являются "надстройкой" к элементарным функциям обращения к внешнему миру.
Здравствуйте, Deeman, Вы писали:
Pzz>>Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе.
D>Как это? А как же мне обращаться к dll-кам? Неужто в С++ нет для этого встроенных средств?
1) И как же в C++ называются встроенные средства для обращения к dll-кам? 2) Какое отношение обращение к dll-кам имеет к решению задачи "сказать что-либо операционной системе"?
Здравствуйте, Pzz, Вы писали:
Pzz>1) И как же в C++ называются встроенные средства для обращения к dll-кам? 2) Какое отношение обращение к dll-кам имеет к решению задачи "сказать что-либо операционной системе"?
...при компиляции приведенного выше кода MYLIBAPI за счет заголовочного файла MyLib.h будет определен как _declspec (dllimport). Встречая такой модификатор перед именем переменной, функции или С++-класса, компилятор понимает, что данный идентификатор импортируется из какого-то DLL-модуля
2) Опять же, прибегну к цитате.))
Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).
...при компиляции приведенного выше кода MYLIBAPI за счет заголовочного файла MyLib.h будет определен как _declspec (dllimport). Встречая такой модификатор перед именем переменной, функции или С++-класса, компилятор понимает, что данный идентификатор импортируется из какого-то DLL-модуля
Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.
D>
D>Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).
А DLL пишут боги на волшебных божественных языках программирования?
Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой
Здравствуйте, Pzz, Вы писали:
Pzz>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек.
В рамках защищенного режима — никак) любое действие рано или поздно приведет к системному вызову(внешняя библиотека).
Здравствуйте, Pzz, Вы писали:
Pzz>Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.
Вы придираетесь.))
D>>
D>>Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).
Pzz>А DLL пишут боги на волшебных божественных языках программирования?
Ну, мне казалось, что фундаментальные объекты операционной системы пишут на ассемблере, нет?
Pzz>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой
Под библиотеками топикстартер имел в виду заголовочные файлы .h, включаемые в код директивой #include.
Здравствуйте, Deeman, Вы писали:
Pzz>>Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.
D>Вы придираетесь.))
Отнюдь.
Pzz>>А DLL пишут боги на волшебных божественных языках программирования?
D>Ну, мне казалось, что фундаментальные объекты операционной системы пишут на ассемблере, нет?
Нет. Почти все пишут на Си/С++. Но при этом если надо из user space позвать ядро, используют переходнички, написанные на ассемблере или с использованием нестандартных расширений Си.
Pzz>>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой
D>Под библиотеками топикстартер имел в виду заголовочные файлы .h, включаемые в код директивой #include.
Здравствуйте, Deeman, Вы писали:
D>Друзья, тыкните новичка носом в ключевые слова для поиска! D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания: D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр). D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Решения этой задачи не существует.
Вообще на голом C или C++ нет способа вывести строчку "Hello, World!" на экран.
Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.
GC>Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.
Не обязательно. В незащищенных режимах вполне можно вывести строку, непосредственно обращаясь к видеопамяти. Для этого не нужен ассемблер.
Здравствуйте, Vamp, Вы писали:
GC>>Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера. V>Не обязательно. В незащищенных режимах вполне можно вывести строку, непосредственно обращаясь к видеопамяти. Для этого не нужен ассемблер.
Но это решение не будет работать на всех платформах, там где видеопамять начинается с другого адреса например.
Вы привели только частное решение.
GC>Но это решение не будет работать на всех платформах, там где видеопамять начинается с другого адреса например.
Я просто опровергнул квантор всеобщности ("любое решение").