
Dmitry
09.04.2016
16:52:46
там тебе только ddbc нужен
а все, понял — да вне тела меодов так нельзя
спасибо)
@chebotarevp а можно как-то сделать так, чтобы экземпляр класса не надо было в конструктор передавать, а он был всегда доступен?

Google

Dmitry
09.04.2016
17:07:53
Ну вот как я до main его объявил
MyClass mc;
void main()
{
mc = new MyClass();
B дальше чтобы я мог сделать:
class testClass
{
void foo ()
{
mc.say();
не передавая все это в конструктор класса

Pavel
09.04.2016
17:12:42
Передавать объекты в другие объекты - это хорошая практика, называется dependency inversion
Но если хочешь можешь закостылить, например сделать класс со статическими свойствами, и туда в эти свойства все сохранять, а потом из любого места программы обращаться к этим свойствам

Dmitry
09.04.2016
17:14:23
а как это сделать не мог бы показать?
или там просто ключевое слово static нужно?
Тут по инверсии зависимостей только тонко намекающие демотиваторы возникают...
http://lh3.ggpht.com/-0j4EeQ7SvCU/VCOszb8-0VI/AAAAAAAAMKo/NpTyokx2SDg/clip_image001_thumb%25255B1%25255D.jpg?imgmax=800

Pavel
09.04.2016
17:17:26
Да это все херня )
Ты сам только что изобрел принцип инверсии зависимости и успешно используешь его. Но почему то хочешь от него уйти.
Да, когда больше надо чуть писать, но зато такой класс и тестировать удобнее и вообще он гибче.
https://dlang.org/spec/attribute.html#static вот статические свойства думаю создаются так же как и методы

Dmitry
09.04.2016
17:23:46
Так, тоесть до main объявить класс. Потом создать класс и в нем все методы как static пометить?

Google

Dmitry
09.04.2016
17:25:38
афигеть заработало!
минусы какие у такого подхода?
А могу я вот так сделать?
class DBConnect
{
Statement stmt;
Config config;
static this(Config config)
{
// тут код инициализации
}
нужно ли мне Statement stmt; как то помечать, что они статические тоже?

Pavel
09.04.2016
17:40:20
минусы какие у такого подхода?
Ты везде будешь использовать этот класс, и когда твой код разрастется, рефакторинг окажется адом. Все будет зависеть от твоего глобального класса.
Со временем он превратится в помойку в которой будут лежать десятки или даже сотни статических методов и свойств.
И новые люди, пришедшие в проект, не в силах будут разобраться что для чего предназначено.
В итоге при малейшем изменении разработчики будут кричать "НЕ ТРОГАЙ ВДРУГ ЧТО ОТВАЛИТСЯ!!!1", и убегать за дозой транквилизаторов.

Dmitry
09.04.2016
17:42:16
Тоесть главная задача — просто не делать его большим? т.е. если делать глобальным, то пихать туда самый минимум?

Pavel
09.04.2016
17:42:29
Ну да
Но такое уж свойство разработки - если где-то сделал криво, то со временем это место разрастется и начнет доставлять боль.

Dmitry
09.04.2016
17:43:03
понял, спасибо
А в том фрагменте кода выше я правильно пытаюсь static this сделать?

Pavel
09.04.2016
17:49:31
Для меня загадка как оно должно работать) Конструктор не может быть статическим
Вот инициализация модуля static this это еще ладно.

Dmitry
09.04.2016
17:50:26
так, все я уже оценил гемор статических классов)
сложно понять dbname это экземпляр какого класса)

Pavel
09.04.2016
17:50:28
Поэтому такое у тебя компилироваться не должно, либо оно работает как то по соглашению в d, надо гуглить

Dmitry
09.04.2016
17:51:40
хех, такое вот работает https://ideone.com/qowBjg

Pavel
09.04.2016
17:53:55
mc тогда вообще можешь убрать везде, оно не нужно

Dmitry
09.04.2016
18:00:32
С ПГ не было времени посмотреть кстати?

Pavel
09.04.2016
19:03:41
Не, еще не смотрел

Google

Alex
10.04.2016
06:52:54
https://ideone.com/ts5qMb
а точка что значит?
это то же что и ::mc.say()
в с++

Dmitry
10.04.2016
10:03:26
Я Си вообще не знаю...
шоткарт для указания на глобальный объект?

Alex
10.04.2016
10:28:49
да


Dmitry
10.04.2016
10:50:00
Подскажите, не могу разобраться.
Вот есть http://dlang.org/phobos/std_experimental_logger.html
Как я понял можно как-то указывать уровень логгирования. Т.е. в самом конструкторе указать, что логгировать к примеру только Критикал, а потом если надо поменять переменную и логгировать еще и Ворнинги. Вопрос в том как это сделать
Так, предположим у меня в main объявлена часть которая должна быть видна в файле в котором собраны функции без классов. Есть ли варианты кроме как import App.d делать, чтобы из этого файла была видна данная переменная?
Ну мне чисто с точки зрения красоты.
http://vistanews.ru/computers/software/53659
Есть тут кто живой? Я тут все еще с ПГ мучаюсь.
Как мне с помощью этого драйвера ubyte [] получить?
https://github.com/pszturmaj/ddb/commits/master
Пробовал вот так:
http://www.everfall.com/paste/id.php?vcp80n6wdhot
ошибка: source\app.d(28,13): Error: cannot implicitly convert expression (( VariantN!20u __tmpfordtor3893 = row.opIndex(1u);
Так. Следующий код собрался и запускается:
try {
auto result = cmd.executeQuery;
foreach (row; result)
{
writeln(row[0]);
x = row[1].get!(ubyte[]);
}
}
catch (ServerErrorException e) {
// Probably table does not exist - ignore
}
Тоkько получаю ошибку:
\exception.d(679): Memory allocation failed
Размерность x:
ubyte [] x;


Evil
12.04.2016
16:08:17
мда

Alex
12.04.2016
16:11:44
шок

Dmitry
12.04.2016
17:28:56
Короче ад. Протрахался всю неделю. Только сегодня один из драйверов заработал

Pavel
12.04.2016
20:34:13

Google

Dmitry
13.04.2016
07:06:50
Ну в С++ на это бы месяц ушел)
Подскажите, как передать структуру в функцию:
MyData [] mydata;
MyData md;
fbconnet(md);
...
void fbconnet(MyData md)
{
он не может понять тип которой мы туда передаем

Max
13.04.2016
10:34:02
Во первых, добавь к типу в функции звездочку а в вызове &, иначе ты вхолостую копируешь структуру. Во вторых, что именно он не понимает? Может ты массив пытаешься передать?

Dmitry
13.04.2016
10:34:38
http://dpaste.dzfl.pl/a968efd60f53

Max
13.04.2016
10:37:57
У тебя структура вне видимости функции, лол
http://dpaste.dzfl.pl/ee893077f283

Dmitry
13.04.2016
10:39:02
о пасибо
а кроме как до main ее объявлять есть еще варианты?

Max
13.04.2016
10:47:19
Как угодно, хоть после вфункции, компилятор не однопроходный, главное чтобы в зоне видимости для функции была структура

Dmitry
13.04.2016
11:14:28
А не подскажешь, что ему вот тут не нравится с типами данных. Что во что он хочет чтобы я перевел:
Error: incompatible types for (("UPDATE USERS SET USERBLOB =") ~ (cast(const(byte)[])md.userblob)): 'const(char)[]' and 'const(byte)[]'

Вячеслав
13.04.2016
12:21:26
Подозреваю ты сравниваешь const char и const byte а оно хочет чтобы ты сравнивал один тип
Я правильно понимаю, что ты юзерблоб в байтовый массив кастуешь? А потом сравниваешь с массивом символов

Dmitry
13.04.2016
12:24:13
как я понимаю оно склеивать не может стринг с ubyte

Вячеслав
13.04.2016
12:24:19
Или приравниваешь
Ага
Ты строку свою к байтовому массиву приведи

Dmitry
13.04.2016
12:25:24
но это не помогло. У меня в итоге новая проблема. Мне же в FireBird данные нужно вставлять — а единственный драйверн который у меня заработал, это драйвер от Адама, который не умет prepare statment делать т.е. хз как данные теперь в БД пихать
и хз что теперь делать даже

Вячеслав
13.04.2016
12:26:55
А ручками ее подготовить никак?))

Google

Dmitry
13.04.2016
12:27:12
а как?
Вот есть запрос.
db.query("UPDATE USERS SET USERBLOB =" ~ cast(string)md.userblob ~ " WHERE ID=1");
Как я понимаю данные подцепить к нему можно какие-то только через prepared string

Вячеслав
13.04.2016
12:28:31
У тебя юзерблоб что содержит?)

Dmitry
13.04.2016
12:28:45
byte []
cast(string) тут лишнее ^

Max
13.04.2016
12:31:03
Судя по прошлой ошибке ты наоборот блоб пытаешься в ubyte конвертировать. Попробуй как обычный массив символов всё сложить

Вячеслав
13.04.2016
12:32:10
Тебе нужно в стринг превратить байтовый массив) Вот и гугли как это сделать в Д) тебе тот prepare string.
Ну и Макс возможно правильно говорит и у тебя блоб не байтовый массив

Dmitry
13.04.2016
12:32:40
Max, нет у меня как раз блоб в байтовый массив читается вот его тип http://www.everfall.com/paste/id.php?46y5rd9zxeb0
Весяслав, ты предлагаешь прям в sql запрос засунуть userblob = 10101010110... where ID=1 ?

Вячеслав
13.04.2016
12:33:52
Да блин
Тебе нужно в стринг превратить байтовый массив) Вот и гугли как это сделать в Д) тебе тот prepare string.
Внимательно читай

Dmitry
13.04.2016
12:35:11
зачем стринг то? Мне же byte [] надо под видом string в БД передать

Вячеслав
13.04.2016
12:36:43
Эм. Тебе нужно сделать "= 1110110"?

Dmitry
13.04.2016
12:38:03
ну вот смотри. Как я понимаю prepared string это штука которая позволяет ВНЕ текстового компонента передать какие-то данные.
Драйвер prepared string не умеет. Отсюда я предполагаю, что может бинарную строку кастануть в байтовое представление и прям так попробовать вставить

Pavel
13.04.2016
12:42:10
Или в хексовое представление

Вячеслав
13.04.2016
12:42:19
Кхм. У тебя там работает .to!string например? Попробуй замутить такое с бинарной строкой. Или cast(char[]) тоже должно сработать.
Не понимаю проблемы запихнуть цифры в строку...