Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.
-- Положим, stringLength1: aString ^ self ffiCall: #( int strlen (String aString) ) module: LibC OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так: stringLength2: aString ^ self ffiCall: #( int strlen (char * aString) ) module: LibC и вызвать так: testStringLength2: aString " self testStringLength2: 'anana' " | p v | p := FFIExternalArray externalNewType: 'char' size: aString size + 1. aString doWithIndex: [ :char :i | p at: i put: char ]. p at: aString size + 1 put: (Character value: 0). v := self stringLength2: p. p free. ^ v. Вызываю - Could not coerce arguments. Мне это странно. А что, если попробовать так: stringLength3: aString ^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC testStringLength3: aString " self testStringLength3: 'anana' " | p v | p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1. aString doWithIndex: [ :char :i | p at: i put: char asInteger ]. p at: aString size + 1 put: ("Character value:" 0). v := self stringLength3: p. p free. ^ v. Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Пишите в майлинг лис фары. У меня с этим опыта не много. А с английский текстом работает? (с русским текстом aString is WideString, а с английским - ByteString) 28 октября 2016 г., 13:22 пользователь Victor Metelitsa <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Я ж говорю - с кириллицей даже и не рискую, это будет дополнительный уровень сложности.
-- Кстати, а где новые VM берут? Надеюсь, их не надо компилить самостоятельно? On Friday, October 28, 2016 at 4:41:24 PM UTC+5, Denis Kudriashov wrote:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Я обычно беру отсюда http://files.pharo.org. Но travis билдит все и выкладывает на bintray (ссылку не помню) 28 октября 2016 г., 13:51 пользователь Victor Metelitsa <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
http://files.pharo.org/platform/Pharo5.0-win.zip ?
-- Там имидж обновляют время от времени, а VM остаётся майской. Вроде бы дошло, как можно работать. stringLength5: aString ^ self ffiCall: #(#int #strlen #(#FFIExternalArray #aString)) module: LibC и после этого и ... FFIExternalArray externalNewType: 'char' size: ... годится, и .. FFIExternalArray externalNewType: 'uint8' size: ... тоже. On Friday, October 28, 2016 at 5:01:20 PM UTC+5, Denis Kudriashov wrote:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Даже не знаю. Вообще прилез не обновляется. Это пришлось только сделать для мака из-за не совместимости с новой Sierr-ой.
-- Я беру виртуалку отсюда http://files.pharo.org/vm/pharo-spur32/ , а имидж отсюда http://files.pharo.org/image/60/. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
6 -я версия довольно стабильная. 28 октября 2016 г., 16:18 пользователь Denis Kudriashov <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by vvm13xyz xyz
2016-10-28 13:22 GMT+02:00 Victor Metelitsa <[hidden email]>:
насколько я помню для инстанций FFIExternalArray нужно использовать адрес. По крайней мере так было изначально в NativeBoost. v := self stringLength2: p address. ^^^^^^
Best regards,
Igor Stasenko. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Hello Игорь. Возвращайся в фару :) 28 октября 2016 г., 20:35 пользователь Igor Stasenko <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by Igor Stasenko
Я ожидал, что внутренняя логика UFFI сама догадается, что если в описании функции есть "char *", а я вызываю с параметром, который был выделен как p:= FFIExternalArray externalNewType: 'char' size: aString size + 1, то надо подставить адрес (а если вместо 'char' использую что-то несовместимое, то только тогда будет несоответствие/невозможность преобразования). Но она не догадывается. А как, спрашивается, подставить адрес? Вместо p использовать p handle? Как-то подозрительно, хотя попробовать и можно.
-- Кроме того, удивительна разница в обработке "char *" и "uint8 *". В качестве "документации" я использую https://ci.inria.fr/pharo-contribution/view/Books/job/PharoBookWorkInProgress/lastSuccessfulBuild/artifact/book-result/UnifiedFFI/UnifiedFFI.pdf , оттуда взята идея с FFIExternalArray, экземпляр данного класса присваивается полю "char *" структуры, и это UFFI отлично понимает. Вы, конечно, можете ссылаться на то, что имеются ещё и тесты, но когда я вижу, что параметру "char *" передаётся "somestring asByteArray with: 0", это понимания не прибавляет. Что, если с C-стороны в этот массив что-то попытаются записать? Это учтено или считается, что с той стороны ничего такого не будет, и как тогда быть, если мне это надо (я читаю строки и т.п. из базы данных)? Короче, что-то непонятное происходит под ковром, и надо лезть под ковёр. Похоже, с учётом этого Цынкомовское и VAST'овское попроще будет. On Friday, October 28, 2016 at 11:35:42 PM UTC+5, Igor Stasenko wrote:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by vvm13xyz xyz
Ещё какие ужасы:
-- rc = SQLGetDescRec(hIRD, i, colname, sizeof(colname), &namelen, &type, &subtype, &width, &precision, &scale, &nullable); Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить. Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа { val ...; nullind ...; } и затем вызывают функцию с ,,, ¶m.val, ..., ¶m,nullind Если само определение структуры в UFFI ещё более-менее, то получение эквивалента ¶m.nullind и т.п. ещё "предстоит открыть". -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Умоляю вас, пишите в Pharo-dev mailing list. Это реально важно, сообщить сообществу о ваших проблемах с системой, со стороны ваших задач и требований. Pharo - это open source, если вы не расскажите о своих проблемах и идеях, ничего не измениться, и Pharo не станет лучше. И тоже самое с документацией. Вы видите, что можно улучшить. Сообщите об этом (не нам, а сообществу Pharo). Кроме того, думаю, здесь нет людей с опытом UFFI 29 октября 2016 г., 10:05 пользователь Victor Metelitsa <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Вы зачем-то принимаете это близко к сердцу. А я просто занимаюсь "что вижу, о том пою". В англоязычном мэйллисте с диким трафиком и с моим плохим английским это делать неудобно, не говоря о том, что я уже как-то пробовал спросить про проблему с ODBC несколько лет назад и никакой реакции не получил.
-- И, в принципе, я надеюсь постепенно разобраться со всем сам. По-видимому, то, что я уже знаю, достаточно для того, чтобы построить интерфейс к СУБД. Коннектиться к базу я уже научился, остальное, как я ожидаю, чисто ручная работа. Разве что будет "не изящненько" (см. соотв. анекдот). -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by vvm13xyz xyz
2016-10-29 10:05 GMT+02:00 Victor Metelitsa <[hidden email]>:
для return-value параметров вовсе не обязательно использовать FFIExternalArray .. это как использовать микроскоп для забивания гвоздей. опять-же это я про то что было в NB, а во что сейчас оно превратилось в UFFI я имею слабое представление. смотрите FFIExternalValue
Best regards,
Igor Stasenko. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by Denis Kudriashov
2016-10-28 20:39 GMT+02:00 Denis Kudriashov <[hidden email]>:
может быть когда нибудь.. у меня пока период отдыха от всего этого
Best regards,
Igor Stasenko. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by Igor Stasenko
Лучше так, чем совсем никак.
-- А есть там удобная работа с неизвестной на этапе компиляции структурой? Т.е., я только во время выполнения узнаю, что, оказывается, по смещению n лежат четыре uint32, а по смещению m в том же массиве байтов - int64? On Wednesday, November 2, 2016 at 12:54:56 AM UTC+5, Igor Stasenko wrote:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
2016-11-01 22:37 GMT+01:00 Victor Metelitsa <[hidden email]>:
В смаллтолке нет "этапа компиляции" там всегда ран-тайм. Поэтому не вижу никаких преград динамически генерировать структуры с заданными типами и смещениями. На самом деле так оно и работает изначально. Единственно, что юзер интерфейс для сишных структур заточен под статичные структуры. Но ничего не мешает подпилить ее под динамичные -с помощью субклассинга существующего класса или переребрасывания нужных кусков кода в свой новый класс который будет заниматься тем что вам нужно. Смотрите код, изучайте как это сделано.
Best regards,
Igor Stasenko. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Для меня оно логически поделено - генерация классов и байткода, с одной стороны, и исполнение байткода, с другой. Конечно, править байткод прямо во время его выполнения - это круто, но я бы предпочёл, как минимум, чтобы происходящее было бы лучше документировано. Ну... по крайней мере, уже после обнаружения FFIExternalArray мне стало понятно, что с какой-то обёрткой над DB2 CLI и Oracle OCI я справиться должен....
-- On Wednesday, November 2, 2016 at 5:14:00 PM UTC+5, Igor Stasenko wrote:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
2016-11-02 15:19 GMT+01:00 Victor Metelitsa <[hidden email]>:
Ну ты спросил, я ответил. Какой вопрос - такой и ответ. "А можно сначала стулья, а потом деньги?" - можна, но деньги вперед :) Ну и вообще по таким вопросам лучше общаться в группе фаро..
Best regards,
Igor Stasenko. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Free forum by Nabble | Edit this page |