Size: a a a

2018 November 23

ZK

Zhenya Katataev in ru.nim.talks
Так же можешь в итератор обернуть https://nim-lang.org/docs/tut1.html#iterators
источник

T

Tverd in ru.nim.talks
В итератор это понятно, тут важнее получить элементы массива
источник

T

Tverd in ru.nim.talks
Yuriy Glukhov
Посмотри UncheckedArray[T]
Смотрел на UncheckedArray - щас покажу что выходит
источник

T

Tverd in ru.nim.talks
делаю вот что:
var domains = cast[UncheckedArray[virDomainPtr]](domainsPtr)

и получаю
Error: expression cannot be cast to UncheckedArray[libvirt.virDomainPtr]
источник

YG

Yuriy Glukhov in ru.nim.talks
Ptr uncheckedarray...
источник

YG

Yuriy Glukhov in ru.nim.talks
Потом индексируй полученное значение, как обычный массив
источник

T

Tverd in ru.nim.talks
Спасибо, но тут либо проблемы в самом либвирте, либо хз, c2nim не так мне все перевел
var domain = domains[0]
echo virDomainIsActive(domain)

SIGSEGV: Illegal storage access. (Attempt to read from nil?)
источник

YG

Yuriy Glukhov in ru.nim.talks
Я так понимаю, что это нул-терминейтед массив? Возможно он просто пустой?
источник

T

Tverd in ru.nim.talks
не должен... конечно если не выйдет ничего, придется сначала С прогу написать, что бы уж точно быть увереным
источник

T

Tverd in ru.nim.talks
сам массив - массив указателей. Ну и как подобает в С, если выйти за границу - будет плохо )
источник

T

Tverd in ru.nim.talks
кол-во элементов возвращает сама функция
var dn = conn.virConnectListAllDomains(addr(domainsPtr), flags)
источник

T

Tverd in ru.nim.talks
в dn находится 7, то есть у нас 7 элементов в массиве
источник

YG

Yuriy Glukhov in ru.nim.talks
Кстати, не касти в анчекдаррай, обьявляй как анчекдаррай, и касти где нужно, в вызове
источник

YG

Yuriy Glukhov in ru.nim.talks
* я бы сделал так :)
источник

T

Tverd in ru.nim.talks
пробовал и так, может где не так написал, щас перепишу покажу
источник

T

Tverd in ru.nim.talks
var domainsPtr: UncheckedArray[virDomainPtr]

var dn = conn.virConnectListAllDomains(addr(cast[ptr virDomainPtr](domainsPtr)), flags)

но так не работает. Не компилится
источник

YG

Yuriy Glukhov in ru.nim.talks
Ptr в объявлении. Аддр в вызове
источник

T

Tverd in ru.nim.talks
хорошо, как тогда мне привести тип если вызываемая функция такая:
proc virConnectListAllDomains*(conn: virConnectPtr, domains: ptr ptr virDomainPtr, flags: cuint): cint {.libvirt.}

и в C она выглядит так:
int virConnectListAllDomains (virConnectPtr conn, virDomainPtr **domains,                                                  unsigned int flags);
источник

YG

Yuriy Glukhov in ru.nim.talks
Это потом. Прога заработала?
источник

T

Tverd in ru.nim.talks
нет, что-то не хватает...
источник