Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Передать массив в конструктор функции Сишной DLL. (http://www.flasher.ru/forum/showthread.php?t=130363)

nOobCrafter 24.09.2009 17:14

Передать массив в конструктор функции Сишной DLL.
 
День добрый. Продолжаю мучать Сишные дллки, возник вопрос, как можно и можно ли передать в конструктор функции массив?..
Код AS3:

var id = DLL_485.addParameter("unsigned char", "[8]");

Так не работает?.. есть какие то нюансы или как верно?.
На Си это так:
Код AS1/AS2:

unsigned char id[8];
 ReadIDaiu(id);


alexcon314 25.09.2009 08:56

Цинк понимает только элементарные типы данных. Массив к ним не относится.
Можно сложные типы сериализовать в простые, скажем, массив в строку. А в длл десериализовать. Но для этого надо писать длл самому. Да, и передать ссылку не выйдет.
ЗЫ.
unsigned char id[8] - объявление массива беззнаковых чаров из восьми элементов.
DLL.addParameter("unsigned char",<максимум здесь может быть код символа или целое число 0-255>); но никак не массив.
ЗЫЫ. Как с регистрацией? :)

nOobCrafter 25.09.2009 12:59

спс, по тем аккам еще раз проверил - 0, через знакомую зарегился по gmail)
То есть если мне надо забрать из дллки массив то надо в той же дллки реализовать кучу функции которые бы возвращали определенный элемент массива?..
мне так же сказали что строка в длл это сложный тип данных и с ним могут быть косяки..это так или можно обойти?..

alexcon314 25.09.2009 14:50

Строка - это массив чаров. Если вернуть из длл строку, то да, получится, что вы вернули массив. Если из цинка передали строку - получится, что из цинка передали массив. В этом смысле массив можно передать и в длл и обратно). Только следует иметь в виду, что строка "0123" - это не есть массив [0x00,0x01,0x02], это массив [0x30,0x31,0x32,0x33].
Массив чисел [0,1,2,3] передать как есть не получится, просто потому, что нет символов, чей код 0x00, 0x01 и т.п., так же как и для чисел типа 56'000'000 нет сопоставимых символов в кодовых таблицах.
Можно передать строковое представление массива "0,1,2,3", а в длл, зная, что это все-таки сериализованный числовой массив, распарсить строку именно в числовой массив [0x00,0x01,0x02].
ЗЫ.
Цитата:

...что строка .. это сложный тип данных и с ним могут быть косяки...
В смысле с ним сложно работать? Я бы так не сказал. В С++ есть специальные библиотечные классы для удобной и безопасной работы со строками, скажем, std::string. Имея опыт, можно работать и напрямую.
ЗЫЫ. Если не секрет, поделитесь, над чем трудитесь. Ситуация может прояснится.
ЗЫЫ. Понятия "конструктор функции" нет. Правильно "передать массив в функцию".

nOobCrafter 25.09.2009 16:23

Цитата:

Если не секрет, поделитесь, над чем трудитесь. Ситуация может прояснится.
да из флеша надо периодически дергать длл, та инициализирует определенный COM-port смотрит что там, и по хорошему должна возвращать результат. Но работает хитро. Если исопльзовать со стороны Си то проблем нету, а с флешем уже есть проблемы:
Код AS1/AS2:

unsigned char id[8];
 ReadIDaiu(id);

в длл, делаем массив, и передаем его в функцию, там он обрабатывается и функцией возращается результат обработки (удалось прочесть что то или нет 1 \ 0)
Сам массив используется дальше в работе. Я думал написать еще одной дллку-обертку, которая бы после получения результат возвращала бы мне массив или хотя бы строку (теперь понимаю что разницы особой нету):
Код AS1/AS2:

function readCardID():String                                // в итоге надо что бы возвращало строку с ключом или строку с ошибкой.
{
        unsigned char id[8];
        var result:int = 485.ReadIDaiu(id);
        if (!result)                                                        // запустили функцию из 485.dll если вернет 0, то все ок и едем дальше
        {
                for (int j=0; j<7; j++)
                {
                  printf ("%2.2x ", id[j]);                // складываем в массив?
                }
                return id.toString;                                        // переводлим массив в строку и возвращаем последнюю
        } else {
                return 'Error: ' + result;
        }
}

Вот примерно в такое реализации (это я накидал примерный вид))
Походу остается вариант что я предложил в предыдущем своем посте, написать 6 функций которые бы возвращали мне елементы массива (массив вроде бы на 8 символов, но задействовано 6, почему не знаю) Может можно в асю стукнуться?.

alexcon314 25.09.2009 16:42

Во флэше, видимо так должно быть:
Код:

function readCardID():String{
  var result:String = DLL485.call("string","ReadID");
  return result;
}

В длл типа такого :
Код:

extern "C" __dllspec(dllexport) char* ReadID() /*оберточная функция для сишной ReadIDaui(id)*/
{
unsigned char id[8];
int result = ReadIDaui(id);// эта функция в длл у вас уже есть, как я понял? или ее надо импортировать.
if(!result)
{
// формируем строку из массива  и возвращаем ее return'ом
}else
{
// формируем строку с собщекнием об ошибке и возвращаем ее return'ом
}
}

Формировать строку из массива можно пробежавшись в цикле по массиву. На каждой итерации конвертировать элемент в строку, строку конкатенировать (прибавлять в конец) к строке-будущему ответу. см _itoa_s() и strcat_s()

Так цинк вроде с ком-портом работать может сам?

Добавлено через 41 минуту
Вот пример конвертации массива в строку:
Код:

....
// типа у нас есть заполненный массив из одно- двух- или трехзначных чисел
int id[8] = {255,2,333,4,52,6,7,8};
char* stringFROMarray = getStringFromArray(id);
printf(stringFROMarray);
....

char* getStringFromArray(int* id)
{
        // резервируем память под строку
        // 8 по три байта + 8 запятых плюс 0 в кнце = всего 33 байта.
        char* buf = (char*)calloc(sizeof(char),8*3+8+1);
        // буфер под конвертацию одного элемента массива
        char ibuf[4];
        for(int i=0; i<8;i++)
        {
                _itoa_s(id[i],ibuf,4,10);
                strcat_s(buf,33,ibuf);
                strcat_s(buf,33,",");
        }
        return buf;
}


nOobCrafter 25.09.2009 17:57

Цитата:

Так цинк вроде с ком-портом работать может сам?
да цинк то может, но тут уже есть готовый алгоритм который опробован на деле, вообщем сводится к тому что не надо изобретать велосипед.
Спс скоро попробую предложенный вариант.


Часовой пояс GMT +4, время: 09:13.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.