Хрестоматия по программированию на Си в Unix


Мобильность и машинная зависимость программ. Проблемы с русскими буквами.


Мобильность и машинная зависимость программ. Проблемы с русскими буквами.

Программа считается мобильной, если она без каких-либо изменений ее исходного текста (либо после настройки некоторых констант при помощи #define и #ifdef) транслируется и работает на разных типах машин (с разной разрядностью, системой команд, архитектурой, периферией) под управлением операционных систем одного семейства. Заметим, что мобильными могут быть только исходные тексты программ, объектные модули для разных процессоров, естественно, несовместимы!

Напишите программу, печатающую размер типов данных char, short, int, long, float, double, (char *) в байтах. Используйте для этого встроенную операцию sizeof.

Составьте мобильную программу, выясняющую значения следующих величин для любой машины, на которой работает программа:

  1. Наибольшее допустимое знаковое целое.
  2. Наибольшее беззнаковое целое.
  3. Наибольшее по абсолютной величине отрицательное целое.
  4. Точность значения |x|, отличающегося от 0, где x - вещественное число.
  5. Наименьшее значение e, такое что машина различает числа 1 и 1+e (для вещественных чисел).

Составьте мобильную программу, выясняющую длину машинного слова ЭВМ (число битов в переменной типа int). Указание: для этого можно использовать битовые сдвиги.

Надо ли писать в своих программах определения

#define EOF (-1) #define NULL ((char *) 0) /* или ((void *)0) */

Ответ: НЕТ. Во-первых, эти константы уже определены в include-файле, подключаемом по директиве

#include <stdio.h>

поэтому правильнее написать именно эту директиву. Во-вторых, это было бы просто неправильно: конкретные значения этих констант на данной машине (в данной реализации системы) могут быть другими! Чтобы придерживаться тех соглашений, которых придерживаются все стандартные функции данной реализации, вы ДОЛЖНЫ брать эти константы из <stdio.h>.

По той же причине следует писать

#include <fcntl.h>

int fd = open( имяФайла, O_RDONLY); /* O_WRONLY, O_RDWR */ вместо int fd = open( имяФайла, 0); /* 1, 2 */




- Начало -    - Вперед -



Книжный магазин