2016-06-13 4 views
2

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

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

Как можно выполнить функцию печати как putchar() или cout на C или C++?

Мой код:

#define TRUE  1 
#define FALSE  0 

typedef int INT_32; 
typedef unsigned int size_t; 

struct block { 
    INT_32 v; 
    size_t x; 
}; 

void f1(struct block *s); 
int f2(void *addr); 

int main(void) 
{ 
    struct block blk; 
    f1(&blk); 
    //print blk members 

    int res = f2(&blk); 
    // print res 

    return 0; 
} 

void f1(struct block *s) 
{ 
    s->v = -1; 
    s->x = 1 
} 

int f2(void *addr) 
{ 
    if (addr) { 
     return TRUE; 
    } 
    else { 
     return FALSE; 
    } 
} 
+4

C и C++ разные языки. Выбери один. И не задавайте булевские константы или типы homebrew, если они уже есть стандартные. – Olaf

+0

Зависит от системы. Какая система? –

+0

@ Cheersandhth.-Alf, windows или Linux .. –

ответ

8

Ну, самое основное один я могу придумать, для систем POSIX, является:

void putchar(int ch) 
{ 
    const unsigned char character = (unsigned char) ch; 
    write(STDOUT_FILENO, &character, 1); 
} 

Это просто просит write() системный вызов, чтобы сделать запись, до stdout. В системах, отличных от POSIX, вам придется использовать что-то еще.

Ошибки игнорируются, поскольку прототип putchar() не содержит возвращаемого значения.

Обратите внимание, что это предполагает, что у вас нет «правильных» буферизованных высокоуровневых функций ввода-вывода, поскольку он в основном реализует функцию, принадлежащую этой группе, но очень просто и без буферизации. See the manual page Подробнее об этом.

int -форматный символ сбрасывается до символа без знака в соответствии со спецификацией для putchar(). Я удалил побитовое - и у меня было там, так как он жестко кодирует 8-битные байты, что является уродливым и бессмысленным. Это должно быть хорошо и содержать правильные биты.

Вам понадобятся системные вызовы, в C нет никакой «родной» печати.

+0

Не могли бы вы объяснить использование 'ch & 0xff' –

+0

Будет ли это зависящим от системы? будет ли он работать с ОС Unix? –

+0

@GauravSehgal Я добавил текст и упростил код. – unwind

2

I/O обязательно зависит от платформы - потому что ввод-вывод может выполняться на любом устройстве из контекста устройства диспетчера окон в UART; поэтому он абстрагируется стандартной библиотекой.

Однако это не единственный уровень абстракции; в ОС, таких как Linux или Windows, например, stdout-карты в файловый дескриптор, который ссылается на драйвер устройства (с некоторыми слоями, возможно, опущен) - задействовано несколько уровней программного обеспечения. Если вывод выводится на экран, он становится еще более сложным с тех пор, скорее всего, будут задействованы диспетчер окон и графический процессор.

Вы можете, конечно, пропустить слой stdio и получить доступ к базовому OS API, BIOS или драйверу устройства, например, но в системе, которая работает с полной современной ОС Прямой вывод на какое-то устройство вывода - это не то, что вы бы сделали (потому что, помимо прочего, другие приложения могут использовать этот ресурс, например).

В встроенной системе без металлического элемента без ОС или с ядром, которое не поддерживает I/O, с другой стороны; вы можете делать то, что вам нравится; но в этом случае ответ действительно специфичен для платформы и будет зависеть от устройства, которое вы выберете для вывода; это может быть дисплей или может быть, например, последовательным портом, но он полностью специфичен для аппаратного обеспечения.

0

Вы можете определить макрос для печати символов:

#define my_putchar(x) write(0, &(x), 1) 
/*     write    - write to a file descriptor 
          0   - standard output file descriptor 
           &(x)  - pointer to the specified character 
            1 - number of characters to be printed 
*/ 

Для справки:

unsigned int write(int fd, const void *buf, unsigned int count); 
Смежные вопросы