Page 1 of 2

Вопрос о C

Posted: Fri Jun 25, 2010 1:30 pm
by dragonfly
Здравствуйте. Я тут новичок, решил посмотреть в каком состоянии ваша ОС. Впечатления в целом положительные. Интересно, можно ли туда перенести программы на C?

viewtopic.php?f=9&t=480
http://diamond.kolibrios.org/

Смотрел по ссылкам выше. То, что там предлагают использовать (menuetlibc) содержит неправильный Makefile (я пробовал BSD make и GNU make - результат 1 - Line 4: missing dependency operator). Собрать не получается. Есть ли пофиксенная версия?

И ещё, если я сам пофиксю, и скомпилирую какую-нибудь прогу с помощью gcc и этой библиотеки, то как сделать его исполняемым в KolibriOS? В плане, понимает ли она ELF формат?

Re: Вопрос о C

Posted: Fri Jun 25, 2010 1:52 pm
by diamond
Всё там собирается GNU-тым make. Если дефолтный make - BSDшный, позаботьтесь о замене команды make на путь к правильному бинарнику везде. Переменная окружения MENUETDEV установлена?
Колибри не понимает ELF-формат, одной из целей системы сборки в menuetlibc является сборка бинарников в нужном формате.

Re: Вопрос о C

Posted: Fri Jun 25, 2010 2:10 pm
by dragonfly
diamond wrote:Переменная окружения MENUETDEV установлена?
да
diamond wrote:Всё там собирается GNU-тым make. Если дефолтный make - BSDшный, позаботьтесь о замене команды make на путь к правильному бинарнику везде.
Достаточно использовать gmake
diamond wrote:Колибри не понимает ELF-формат, одной из целей системы сборки в menuetlibc является сборка бинарников в нужном формате.
Ясно, спасибо.
diamond wrote:Всё там собирается GNU-тым make.
Таки нет) Ну ладно, я вручную соберу)

Re: Вопрос о C

Posted: Fri Jun 25, 2010 2:40 pm
by diamond
Достаточно использовать gmake
Вы Makefile глазами смотрели? Что он внутри себя make (а вовсе не gmake) вызывает для вложенных папок, видели?

Re: Вопрос о C

Posted: Sat Sep 28, 2013 10:37 pm
by punk_joker
Какую библиотеку лучше использовать? Menuetlibc или newlib?

Re: Вопрос о C

Posted: Sat Sep 28, 2013 11:29 pm
by Serge
punk_joker
В новой newlib нативная поддержка PE DLL с автоматической линковкой.
Но привязка жесткая к mingw32.

Re: Вопрос о C

Posted: Fri Feb 27, 2015 6:36 pm
by Leency
Описание к сисфункции:

Code: Select all

Структура блока данных входа каталога (БДВК):
  * +0: dword: атрибуты файла:
    * бит 0 (маска 1): файл только для чтения
    * бит 1 (маска 2): файл является скрытым
    * бит 2 (маска 4): файл является системным
    * бит 3 (маска 8): это не файл, а метка тома
      (на заданном разделе встречается не более одного раза и
      только в корневой папке)
    * бит 4 (маска 0x10): это папка
    * бит 5 (маска 0x20): файл не архивировался - многие программы
      архивации имеют опцию, по которой архивируются только файлы
      с установленным этим битом, после чего этот бит сбрасывается -
      это может быть полезно для автоматического создания
      backup-архивов, ибо при записи бит обычно устанавливается
      (не в Kolibri, правда)
раньше я использовал dword и проверял его биты, сейчас я решил разложить его на биты в самой структре;

Code: Select all

dword readonly:1, hidden:1, system:1, volume_label:1, isfolder:1, notarchived:1;
Почему-то не работает, что я делаю не так?

Re: Вопрос о C

Posted: Fri Feb 27, 2015 7:59 pm
by z525
Leency wrote:

Code: Select all

dword readonly:1, hidden:1, system:1, volume_label:1, isfolder:1, notarchived:1;
Почему-то не работает, что я делаю не так?
Может в этом дело:
"Битовые поля имеют тип unsigned int, так как имеют длину один бит. Если длина поля больше одного бита, то поле может иметь и знаковый целый тип.

http://learnc.info/c/unions_and_bitfields.html"

Re: Вопрос о C

Posted: Fri Feb 27, 2015 8:27 pm
by Leency
Не, я перечитал документацию к С-- и нашёл проблему!!! Спасибо Диме за наводку!
Дело в выравнивании http://c--sphinx.narod.ru/c--doc.htm#8.1.8
Правильно так:

Code: Select all

dword	readonly:1, hidden:1, system:1, volume_label:1, isfolder:1, notarchived:1, :0;

Re: Вопрос о C

Posted: Tue Mar 03, 2015 2:13 am
by pascualle
чисто мое имхо, но я бы не использовал битовые поля в этой ситуации.
не сказал бы что я крутой спец, но толку тут я особо не вижу:
- более чем уверен что в памяти оно все-равно будет храниться как dword
- если не будет храниться как dword, процессор потратит больше времени на переваривание битового поля, если оно не кратно размеру слова + выравнивание
- переносимость в платформах битовых полей всегда хуже
- [х] да и не нравится оно мне, как-то оно не по сишному выглядит

Re: Вопрос о C

Posted: Wed Apr 29, 2015 9:52 am
by MorningStar
Я правильно понял, относительные пути к файлам в newlib не поддерживаются? Есть какой-нить костыль для обхода?
Ну, или, есть ли какой-нибудь способ узнать путь к программе, которая запущена? getwd не работает. Пишет undefined reference to getwd.

menuet-libc умеет то, что я хочу?

Заранее спасибо.

Re: Вопрос о C

Posted: Wed Apr 29, 2015 11:21 am
by Serge
Относительные пути поддерживаются. Проблема в том, что не все файловые менеджеры меняют текущий каталог при перемещении по дереву каталогов. Shell меняет.
Каталог из которого запущена программа определяется традиционно через argv[0]
Текущий рабочий каталог

Code: Select all

char *getcwd(char *buf, size_t size)
{
    int bsize;
    __asm__ __volatile__(
    "int $0x40"
    :"=a"(bsize)
    :"a"(30),"b"(2),"c"(buf), "d"(size)
    :"memory");

    return buf;
}; 

Re: Вопрос о C

Posted: Thu Sep 03, 2015 8:39 pm
by punk_joker
Что лучше использовать для портирования новых программ на С? Menuetlibc или Newlib? И можно ли обойтись вообще без них? Хотелось бы просто собрать avra под Колибри, но требование обязательного наличия newlib как то смущает.

Re: Вопрос о C

Posted: Thu Sep 03, 2015 8:53 pm
by Serge
Что такое avra ?

Re: Вопрос о C

Posted: Thu Sep 03, 2015 9:03 pm
by Heavyiron