Forum Webscript.Ru
Программирование => Perl => Тема начата: smoker_cannabis от 25 Марта 2006, 18:16:02
-
в си есть понятие структура типа
struct {
int len;
char *str;
} p;
потом к ней можно обращаться как p.len и т.д.
Вопрос: есть ли какие модули позволяющие реализовать структуры?
-
хешей не хватает? или необходим доступ до c-структур?
-
arto:
хешей не хватает?
дык все дело в том что надо структуру, а не хэш, массив или скаляр.
arto:
или необходим доступ до c-структур?
а что такое возможно? если да - скажите как, или где об этом найти информацию.
-
непонятна сама постановка задачи.
посмотрите в сторону pack/unpack, perlxs и Inline::Struct.
-
arto
Inline::Struct - то что надо, Большое спасибо.
Возникла проблема при использовании:
Скрипт из примера:
#!c:/usr/local/bin/perl -w
use Inline C;
my $o = new Inline::Struct::JA_H("Perl");
print JAxH($o), "\\n";
$o->x("Inline");
print JAxH($o), "\\n";
__END__
__C__
struct JA_H {
char *x;
};
typedef struct JA_H JA_H;
SV *JAxH(JA_H *f) {
return newSVpvf("Just Another %s Hacker", f->x);
}
Но при запуске выдает ошибки:
Warning. No Inline C functions bound to Perl
Check your C function definition(s) for Inline compatibility
"nmake" _¥ ï¥âáï ¢_ãâà¥__¥© ¨«¨ ¢_¥è_¥©
ª®¬__¤®©, ¨á¯®«_塞®© ¯à®£à_¬¬®© ¨«¨ ¯_ª¥â_ë¬ ä_©«®¬.
A problem was encountered while attempting to compile and install your Inline
C code. The command that failed was:
nmake > out.make 2>&1
The build directory was:
C:\\DOCUME~1\\ROOT~1.API\\LOCALS~1\\Temp\\_Inline\\build\\perltemp_pl_0236
To debug the problem, cd to the build directory, and inspect the output files.
INIT failed--call queue aborted
Почему???
Система: MS Windows XP SP2, perl 5.6.1 build 633 by ActiveState
-
Inline::C стоит?
-
arto
Да, я модуль Inline::Struct онлайн ставил, ppm там еще кучу чего накачал и установил, модуль Inline::C точно был !
-
компилятор/nmake есть?
-
В общем где-то в Кэмел-Бук было написано про это...
Короче вместо struct создаёшь отдельный модуль типа my::struct где описываешь конкретные переменные... типа там было написано, что как-то можно при помощи pragma добиться того, что бы поля модуля трогать (добавлять/удалять) низя было... тока править. Получается как структура в Си. + Там же было описано как наследовать всё это дело. Всмысле создавать много структур из одного этого модуля
Но вообще лучше простые хэши и не парься $var->{name} :)
-
"поля модуля трогать (добавлять/удалять) низя было... тока править" -- а по-русски?
-
Ну короче, смутно помню как это было написано, но что-то типа:
$var::field1 = 1
$var::field2 = 2
И т.п. получается... вот эти field нужно описывать в модуле.
Не помню в общем... надо Кэмел-Бук читать опять внимательно :)
-
всем ОГРОМНОЕ спасибо !!!
-
а в чем проблема была и как решилась?
-
хотя по описанию мне очень (что в принципе и надо было) подходит модуль Inline::Struct, но разбираться чтоб он заработал - не было времени,
не стал изобретать велосипед и воспользовался хешами :)
-
"дык все дело в том что надо структуру, а не хэш, массив или скаляр."
-
arto
препод попался, ни си, ни перл не знает :)
проканала ссылка на анонимный хеш
$rec={
NAME=>\'111\',
BOOK=>\'222\',
YEAR=>\'333\',
} ;
а че, немного похожи на структуру :) (фигурными скобками)
-
Я просто заинтересовался этим модулем, в связи с тем что хочу попробовать реализовать работу с RAW сокетами через него. То есть написать код на С по формированию и отправки пакета, а данные для этого пакета передавать в Сишную функцию средствами Perl.