Возможный узнать размеры типов данных (интервал, плавание, дважды, …) в системе, не пишущий программу C?

Автор Aspell здесь.

Как я сказал в более раннем ответе, Вы не можете только объединить словари с различных языков и ожидать, что это будет работать. Необходимо создать новый язык, который сочетает функции этих двух языков оригиналов.

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

  1. Установите aspell-en и aspell-de пакет словаря

  2. Перейдите к пустому каталогу для содержания всего в чистоте. Также для предотвращения любых проблем набора символов изменяют локаль на "C" путем установки LC_ALL=C.

  3. Выведите английские и немецкие словари в списки слов плана

    aspell dump master en > en.txt
    aspell dump master de > de.txt
    
  4. Объедините en.dat и de.dat, в котором можно обычно находить usr/lib/aspell.

    Английский словарь использует подобный звуку поиск, но это не будет с немецким словарем (вследствие того, что это английское конкретный, и более разрешенный к ввозу, это является несовместимым со сжатием Аффикса), таким образом, мы отключим его. Английский словарь не использует сжатие аффикса, но немецкий словарь делает так, мы будем просто использовать файл аффикса для немецкого словаря. (Это избежит необходимости разворачивать немецкий словарь и таким образом увеличение его размер).

    Мы назовем язык что и требовалось доказать, 'q', так как очень немного языков запускаются с q, 'e' для английского и 'g' для немецкого языка. (Имя языка должно обычно быть 2 - 3 буквами, но aspell действительно не заботится, таким образом, en-de или некоторое другое имя могли бы работать, но 2 или 3 названия буквы, как гарантируют, будут работать),

    Файл назовут qed.dat и содержите следующее:

    name qed
    charset iso8859-1
    special ' -*-
    soundslike      none
    affix           qed
    affix-compress  true
    
  5. Копия de_affix.dat в текущий каталог и переименовывают его qed_affix.dat.

  6. Создайте объединенный словарь:

    cat en.txt de.txt | aspell create master -l ./qed ./qed.rws
    
  7. Создайте файл qed.multi:

    add qed.rws
    
  8. Протестируйте словарь при помощи -d ./qed. ./ необходим, чтобы вынудить aspell искать текущий каталог.

  9. Установка qed.dat qed.rws qed.multi и qed_affix.dat где-нибудь, где aspell найдет его. См. руководство для получения информации о том, как aspell ищет файлы данных языка и словарь.

  10. Готово. Все должно работать теперь. Более комплексное решение включит некоторую форму подобного звуку поиска по лучшему качеству предложения. Но это требует специального ухода при использовании со сжатием аффикса (см. руководство Aspell для деталей). Как альтернатива может быть расширен немецкий словарь, и английский подобный звуку поиск может использоваться, но это не могло бы работать так хорошо над немецкими словами.

Случай расчесывания английского и немецкого языка был легок, потому что они оба используют тот же набор символов (iso-8859-1) и потому что только один язык использовал сжатие Аффикса. Объединение других языков возьмет больше работы, но это возможно, после того как Вы знаете то, что Вы делаете. Я разъяснил шаги здесь подробно для давания читателям некоторое представление того, как Aspell работает так, подобная вещь может использоваться для других комбинаций языка.

Если оба сжатия аффикса использования языков, или файлы аффикса должны будут быть объединены, таким образом, не будет никаких конфликтующих флагов, или один из словарей должен будет быть расширен.

Если эти два языка используют другой 8-разрядный набор символов, чем совместимый набор символов, который может поддерживать оба языка, мы должны использоваться. Если стандартный не существует, чем может быть создан новый. Для предотвращения беспорядка, списки слов должны быть преобразованы в utf-8, и Aspell должен быть проинструктирован для ожидания всего ввода и вывода в utf-8 вместо набора символов, который используется внутренне, который по историческим причинам является значением по умолчанию.

19
15.02.2014, 00:41
7 ответов

Если Вы знаете определение типа данных, Вы хотите Вас, может использовать getconf узнать эти значения в большинстве систем Unix.

$ getconf CHAR_BIT
8

Список переменных определяется в странице справочника man limits.h а также здесь, man sysconf, в дополнение к тому, чтобы быть на диске. Можно использовать locate limits.h для нахождения его он часто здесь: /usr/include/linux/limits.h.

18
27.01.2020, 19:44
  • 1
    С протестом, что это применяется только к официальному компилятору C платформы. Могут быть альтернативные компиляторы или альтернативные конфигурации (обычно через параметры командной строки) официального компилятора, того вывода к различным размерам. –  Gilles 'SO- stop being evil' 14.02.2014, 19:26
  • 2
    @Gilles - Вы когда-либо видели способ на самом деле перечислить эти переменные? Я смотрел и не могу ни за что в жизни найти инструмент, который может сделать это. Кажется, что было бы. Также у меня создалась впечатление та передача этих значений getconf был самый безопасный путь, пока Вы говорите, я поражаю официальный компилятор в поле. –  slm♦ 14.02.2014, 19:52
  • 3
    Надежный путь — и способ, которым используют люди, когда они заботятся, который является в общем и целом, когда они хотят скомпилировать программу C — состоит в том, чтобы скомпилировать маленькую программу C. Посмотрите, как autoconf работает. getconf не так безопасно, если Вы не называете компилятор C как c89 или c99 с (почти) никакой опцией. –  Gilles 'SO- stop being evil' 14.02.2014, 21:17

Да. Вы могли просканировать /usr/include/<arch>/limits.h

Например, на моем NetBSD amd64, /usr/include/amd64/limits.h показал бы:

#define CHAR_BIT        8               /* number of bits in a char */

#define SCHAR_MAX       0x7f            /* max value for a signed char */
#define SCHAR_MIN       (-0x7f-1)       /* min value for a signed char */

#define UCHAR_MAX       0xff            /* max value for an unsigned char */
#define CHAR_MAX        0x7f            /* max value for a char */
#define CHAR_MIN        (-0x7f-1)       /* min value for a char */

#define USHRT_MAX       0xffff          /* max value for an unsigned short */
#define SHRT_MAX        0x7fff          /* max value for a short */
#define SHRT_MIN        (-0x7fff-1)     /* min value for a short */

#define UINT_MAX        0xffffffffU     /* max value for an unsigned int */
#define INT_MAX         0x7fffffff      /* max value for an int */
#define INT_MIN         (-0x7fffffff-1) /* min value for an int */

#define ULONG_MAX       0xffffffffffffffffUL    /* max value for an unsigned long */
#define LONG_MAX        0x7fffffffffffffffL     /* max value for a long */
#define LONG_MIN        (-0x7fffffffffffffffL-1)        /* min value for a long */
8
27.01.2020, 19:44
  • 1
    Это часто работает, но иногда различные компиляторы или параметры компилятора приведут к различным размерам. –  Gilles 'SO- stop being evil' 14.02.2014, 19:27

Отчасти.

С gcc, по крайней мере, это работает:

$ cpp -dD /dev/null | grep __SIZEOF_LONG__

Так или иначе, почему Вы не хотите писать программу C, чтобы сделать это? Вы могли отправить крошечную программу C в свой компилятор от оболочки что-то вроде этого:

binary=$(mktemp)
cat <<\EOF | cc -o $binary -x c -
#include <stdio.h>
int main() {
    printf("int=%lu bytes\n", sizeof(int));
    printf("long=%lu bytes\n", sizeof(long));
}
EOF
$binary
rm $binary

-x c говорит компилятору, что язык C, и - средства считаны из стандартного входа.

В моей системе, вышеупомянутой печати:

int=4 bytes
long=8 bytes

Протестированный в gcc и лязге.

11
27.01.2020, 19:44

Нет... возможно выполнить двоичные файлы с различными идеями размеров основных типов, особенно на архитектуре на 64 бита. Недавние ядра Linux на x86_64 могут выполнить собственные двоичные файлы на 32 бита, и существует x32 ABI с типами на 32 бита.

Размеры типа данных частично, что использует компилятор. Но явно выгодно (1) использовать типы, которые машина поддерживает эффективно и (2) использовать типы последовательно от библиотек низкого уровня до пользовательских приложений. Необходимость обработать несколько вариантов является просто путаницей.

6
27.01.2020, 19:44

Если Вам установили жемчуг, можно получить это от жемчуга-V:

intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
8
27.01.2020, 19:44

Размеры типов данных являются свойством компилятора (или ABI), не системы. У Вас может быть несколько компиляторов с помощью различных размеров для типов данных в той же системе.

6
27.01.2020, 19:44

Попробуйте это, чтобы проанализировать и вывести строки, содержащие строки, относящиеся к типам данных:

{ shopt -s globstar; for i in /usr/include/**/*.h; do grep -HE '\b(([UL])|(UL)|())LONG|\bFLOAT|\bDOUBLE|\bINT' $i; done; }

Это, конечно, улавливает определения в /usr/include/limits.h , так что вы получите этот плюс больше, иногда со значениями, но в основном ссылаясь на то, что установлено в limits.h , которое вы можете легко просмотреть с помощью команд getconf -a и ulimit -a .

0
27.01.2020, 19:44

Теги

Похожие вопросы