SnakE
знаток
Энтузиаст
Сообщений: 127
|
 |
« Ответ #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
|
 |
« Ответ #211 : 11 Января 2010, 21:42:26 » |
|
typeid(MyClass).init.length ?
|
|
|
|
|
Записан
|
|
|
|
Wazar
Энтузиаст
Сообщений: 109
|
 |
« Ответ #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
|
 |
« Ответ #213 : 12 Января 2010, 10:52:03 » |
|
А, вон уже выше написали про __traits(classInstanceSize, MyClass).
|
|
|
|
|
Записан
|
|
|
|
Wazar
Энтузиаст
Сообщений: 109
|
 |
« Ответ #214 : 12 Января 2010, 12:28:19 » |
|
__traits(classInstanceSize, MyClass) только в D2. В D2 вообще весело. Можно добавить alias _instance this; И получится что этой структурой можно будет пользоваться как нормальным объектом, а не через instance.
И еще? А можно в D2 превращать immutable данные в не immutable и наоборот без копирования?
|
|
|
|
« Последнее редактирование: 12 Января 2010, 12:34:06 от Wazar »
|
Записан
|
|
|
|
|
|
digited
Энтузиаст
Сообщений: 531
3D
|
 |
« Ответ #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
|
 |
« Ответ #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
Ничто на Земле не сможет разлучить их...
|
 |
« Ответ #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
Ничто на Земле не сможет разлучить их...
|
 |
« Ответ #221 : 09 Июля 2010, 09:22:38 » |
|
Спасиб  Только интересно, в Ди массивы организованы как объекты получается, если у них есть свойста? Тогда как создать обычный С-массив? 
|
|
|
|
|
Записан
|
|
|
|
SnakE
знаток
Энтузиаст
Сообщений: 127
|
 |
« Ответ #222 : 09 Июля 2010, 17:01:49 » |
|
В D есть массивы и срезы ("slice").
Массив -- это массив, имеет тип T[N], напр. int[15]. Его длина известна статически на этапе компиляции.
Срез -- это структура из двух полей: адреса и длины. По сути, это ссылка на часть какого-то массива. Имеет тип T[], напр. int[].
|
|
|
|
|
Записан
|
|
|
|
Crypto Antropos
Участник
Сообщений: 11
Ничто на Земле не сможет разлучить их...
|
 |
« Ответ #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; Но зачем это Вам? ) Дишные строки куда удобнее в использовании 
|
|
|
|
|
Записан
|
|
|
|
|