форум DProgramming.ru
10 Сентября 2010, 11:59:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: 1 ... 13 14 [15] 16
  Печать  
Автор Тема: Вопросы по языку D  (Прочитано 17988 раз)
SnakE
знаток
Энтузиаст

Сообщений: 127



Email
« Ответ #210 : 11 Января 2010, 20:12:38 »

Еще такой вопрос. как из tupleof класса узнать его размер. (сколько памяти под него выделено). Узнать надо в момент компиляции.

__traits(classInstanceSize, MyClass)


Код:
int field_1;
int field_2;
long field_3;
int field_4;
его размер 28 байт

vptr, monitor, field_1, field_2: 16 байт. Удовлетворяет выравниванию для long, поэтому field_3 идет вплотную: 24 байта, к немо вплотную field_4: 28

Код:
int field_1;
int field_2;
int field_3;
long field_4;
его размер 32 байтa.

vptr, monitor, field_1, field_2, field_3: 20 байт. У field_4 выравнивание 8 байт, поэтому оно начинается с ближайшего смещения кратного 8: 24+8 = 32

Вообще-то в классах компилятор имеет право переставлять поля, так что странно это.
Записан
Biga
Участник

Сообщений: 3


Email
« Ответ #211 : 11 Января 2010, 21:42:26 »

typeid(MyClass).init.length ?
Записан
Wazar
Энтузиаст

Сообщений: 109


Email
« Ответ #212 : 11 Января 2010, 22:54:08 »

Цитировать
typeid(MyClass).init.length ?

init нельзя определить на этапе компиляции.
К слову не понимаю почему.

В итоге получилась конструкция вида:
Код:
struct StaticClass(T: Object)
{
  private byte[ClassSize!(T)] data;
  private T _instance;
 
  void Construct(V...)(V arg)
  {
    assert(data.length == T.classinfo.init.length ,"Sizes no equal.");
    this.data[0 .. $] = T.classinfo.init[0 .. $];
    this._instance = cast(T)cast(void*)&data;
    this._instance._ctor(arg);
  }
 
  T instance()
  {
    return _instance;
  }
}

private template ClassSize(T: Object)
{
  static if(is(T SUPER == super))
  {
    static if(is(SUPER[0]: Object))
    {
      const ClassSize = CalculateClassSize!(ClassSize!(SUPER[0]), typeof(T.tupleof), SUPER[1 .. $]);
    }
    else
    {
      const ClassSize = CalculateClassSize!(8, typeof(T.tupleof), SUPER[0 .. $]);
    }
  }
  else
  {
    const ClassSize = CalculateClassSize!(8, typeof(T.tupleof));
  }
}

private template CalculateClassSize(size_t size, T...)
{
  static if(T.length == 1)
  {
    const CalculateClassSize = AddWithRound!(size, (T[0]).sizeof);
  }
  else static if(T.length == 0)
  {
    const CalculateClassSize = size;
  }
  else
  {
    const CalculateClassSize = CalculateClassSize!(AddWithRound!(size, (T[0]).sizeof), T[1 .. $]);
  }
}

private template Round(size_t what, size_t as)
{
  static if(what % as)
    const Round = what - what % as + as;
  else
    const Round = what;
}

private template AddWithRound(size_t lvl, size_t rvl)
{
  const AddWithRound = Round!(lvl, rvl) + rvl;
}

И вопрос: будет ли StaticClass!(MyClass) корректно выделять класс в сегменте данных?
Записан
Biga
Участник

Сообщений: 3


Email
« Ответ #213 : 12 Января 2010, 10:52:03 »

А, вон уже выше написали про __traits(classInstanceSize, MyClass).
Записан
Wazar
Энтузиаст

Сообщений: 109


Email
« Ответ #214 : 12 Января 2010, 12:28:19 »

__traits(classInstanceSize, MyClass) только в D2.
В D2 вообще весело. Можно добавить
alias _instance this;
И получится что этой структурой можно будет пользоваться как нормальным объектом, а не через instance.


И еще? А можно в D2 превращать immutable данные в не immutable и наоборот без копирования?
« Последнее редактирование: 12 Января 2010, 12:34:06 от Wazar » Записан
povod
Участник

Сообщений: 2


« Ответ #215 : 01 Апреля 2010, 13:15:50 »

Здравствуйте. начинаю знакомство с языком.

запускаю пример (windows, dmd1) http://www.dsource.org/projects/tango/wiki/ChapterChildProcesses

вместо русских слов - знак вопроса.
Как быть?
Записан
digited
Энтузиаст

Сообщений: 531

3D

digited@jabber.ru
« Ответ #216 : 01 Апреля 2010, 15:25:58 »

Русские буквы в виндовую консоль выводятся через какое-то конвертирование, тут дело не в языке программирования. Что-то типа CharToOEM погуглите.
Записан

0 errors, 0 warnings, 0 survivors
povod
Участник

Сообщений: 2


« Ответ #217 : 01 Апреля 2010, 17:41:01 »

на сколько я понял, в строке
Stdout.stream.copy(p.stdout);
происходит перенаправление вывода.

в каком месте здесь вставлять конвертирование?!
спасибо
Записан
digited
Энтузиаст

Сообщений: 531

3D

digited@jabber.ru
« Ответ #218 : 01 Апреля 2010, 18:32:36 »

Нене, конвертировать надо сами строки, которые подаются в Stdout/Cout, те коды букв:
Код:
// phobos: prints russian characters string to console. Pretty cool hack
puts( Win32OS.U16toU8( "Старт программы..."w ).ptr );

Код:
//===============================================================
                /// static member function to transform wchar with utf16 symbols to utf8 that can be printed
                /// to console( via putc() ). Windows-dependent.
                //===============================================================
                static char[] U16toU8( wchar[] line )
                {
                        static char[] ch;
                        ch = new char[ line.length ];
                        CharToOemW( line.ptr, ch.ptr );
                        return ch.dup;
                }

CharToOemW - WinAPI'шный: http://dsource.org/projects/tango/browser/trunk/tango/sys/win32/UserGdi.d#L573

Не нашел сразбегу это в фобосовских хедерах, но всегда можно объявить экстерном (стырить танговское объявление, проще всего) и прилинковать нужную виндовую либу, если потребуется при линковке. Код примера будет выглядеть примерно так:
Код:
Stdout.formatln("{} '{}' (pid {}) {}: {}", U16toU8("Процесс"), p.programName, p.pid, U16toU8("завершен"), result.toString);
« Последнее редактирование: 01 Апреля 2010, 18:41:41 от digited » Записан

0 errors, 0 warnings, 0 survivors
Crypto Antropos
Участник

Сообщений: 11


Ничто на Земле не сможет разлучить их...


Email
« Ответ #219 : 08 Июля 2010, 18:00:53 »

Люди добрые, ответьте если не сложно на вопрос  Плачущий

>> int main(char[][] args)

Каким образом узнать число аргументов??? В си за это отвечала переменная argc. Спасибо Улыбающийся
Записан
netrino
Участник

Сообщений: 4


« Ответ #220 : 08 Июля 2010, 18:25:21 »

Люди добрые, ответьте если не сложно на вопрос  Плачущий

>> int main(char[][] args)

Каким образом узнать число аргументов??? В си за это отвечала переменная argc. Спасибо Улыбающийся

А в D каждый массив несёт информацию о своей длине Улыбающийся
Код:
args.length
или можно в foreach все опции обработать
Код:
foreach (arg; args[1 .. $]) { // нулевой пропускаем(название программы)
...
Записан
Crypto Antropos
Участник

Сообщений: 11


Ничто на Земле не сможет разлучить их...


Email
« Ответ #221 : 09 Июля 2010, 09:22:38 »

Спасиб  Подмигивающий Только интересно, в Ди массивы организованы как объекты получается, если у них есть свойста? Тогда как создать обычный С-массив?  Строит глазки
Записан
SnakE
знаток
Энтузиаст

Сообщений: 127



Email
« Ответ #222 : 09 Июля 2010, 17:01:49 »

В D есть массивы и срезы ("slice").

Массив -- это массив, имеет тип T[N], напр. int[15]. Его длина известна статически на этапе компиляции.

Срез -- это структура из двух полей: адреса и длины. По сути, это ссылка на часть какого-то массива. Имеет тип T[], напр. int[].
Записан
Crypto Antropos
Участник

Сообщений: 11


Ничто на Земле не сможет разлучить их...


Email
« Ответ #223 : 10 Июля 2010, 10:08:09 »

Ах вон оно что  Смеющийся Ясно, спасиб)
Люди, а Ди RTL C не входит как я понимаю? Ну, например, хотел функцию strcpy найти, не получилось  Строит глазки А судя по описанию phobos что-то не нашел ничего похожего  Показает язык
Записан
netrino
Участник

Сообщений: 4


« Ответ #224 : 12 Июля 2010, 02:57:42 »

Ах вон оно что  Смеющийся Ясно, спасиб)
Люди, а Ди RTL C не входит как я понимаю? Ну, например, хотел функцию strcpy найти, не получилось  Строит глазки А судя по описанию phobos что-то не нашел ничего похожего  Показает язык

Входит )
import core.stdc.string; или import std.c.string;
Но зачем это Вам? ) Дишные строки куда удобнее в использовании Улыбающийся
Записан
Страниц: 1 ... 13 14 [15] 16
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!