|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
25.08.2011, 02:51 | #1 |
Регистрация: 24.08.2011
Сообщений: 7
|
Perl + OpenGL
Доброго времени суток!
Сегодня решил заняться программированием на языке Perl, используя библиотеку OpenGL :D Возникли вопросы: Есть два файла: 1 - main.pl 2 - point.pm В первом файле (main.pl) подключаю второй файл (point.pm) как модуль, например. Пока обойдёмся без ООП, ограничимся модульным вариантом, чтобы каши так сказать не было :D Код файла main.pl: #!/usr/bin/perl use strict; use warnings; use lib 'D:/work/perl/project/modules'; # Путь к папке с модулями use OpenGL qw/:all/; use point; # файл с описанием функции рисования точки my $title = 'Заголовок окна'; my $winw_pos = 0; my $winh_pos = 0; # Позиция окна my $win_w = 640; my $win_h = 480; # Размеры окна # Код для рисования сцены sub draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1.0, 1.0, 1.0, 0.0); draw_point; # Функция для рисования точки. (описана в файле point.pm) glutSwapBuffers(); } # Инициализация sub main() { glutInit(); glutDisplayFunc(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowPosition("$winw_pos", "$winh_pos"); glutInitWindowSize("$win_w", "$win_h"); glutCreateWindow("$title"); glutDisplayFunc(\&draw); glutMainLoop(); } main; Код файла point.pm: package point; use Exporter; @ISA = qw(Exporter); @EXPORT = qw(&draw_point); sub test() { print "Все ок!\n"; } # функция рисования точки sub draw_point() { glColor3f(1.0, 0.0, 0.0); glPointSize(5.0); glBegin(GL_POINTS); glVertex3f(0.0, 0.0, 0.0); glEnd(); } return 1; При запуске файла main.pl получаем ошибку: Undefined subroutine &point::glColor3f called at D:/work/perl/project/modules/point.pm line 18. Другими словами, он не находит определение фунции glColor3f в модуле point.pm... И так, в чем собственно вопрос... Если подключить библиотеку OpenGL в файле point.pm то всё работает! Но получается, как я понимаю, повторное подключение OpenGL библиотеки!!! Я ведь уже подключил её в main.pl Подскажите, знающие люди, как обойти данное недоразумение??? Или же я чего то не понимаю!? То есть, как один раз подключить библиотеку в главном файле *.pl и не подключать её повторно в модулях *.pm ??? |
25.08.2011, 02:56 | #2 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
каждый файл подключает то что ему нужно. кстати, вы разделом ошиблись, серверные скрипты тут точно не причем.(как и WEB) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
25.08.2011, 03:06 | #3 | |
Регистрация: 24.08.2011
Сообщений: 7
|
Цитата:
А на счет раздела, вы правы, но я не нашел лучше раздел. И кроме того, мой вопрос можно и перефразировать, обощить так сказать. То есть как избавиться от повторного подключения одного и того же кода? Компилим один раз и все |
|
25.08.2011, 08:11 | #4 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
2)такого требование языка(каждый модуль отдельно) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
25.08.2011, 12:31 | #5 | |
Форумчанин
Регистрация: 20.05.2009
Сообщений: 506
|
Цитата:
И производительность от этого не страдает. Важно понимать что use имеет область видимости максимум файла. Но в то же время библиотека OpenGL после первого use уже "подключена". И если вы явно укажете вместо Код:
Код:
Но так делать не рекомендуются. |
|
25.08.2011, 12:37 | #6 | |
Форумчанин
Регистрация: 20.05.2009
Сообщений: 506
|
Цитата:
|
|
25.08.2011, 18:09 | #7 | |
Регистрация: 24.08.2011
Сообщений: 7
|
Цитата:
P.S. Но всё же, должен же быть способ не писать строчки дважды...эм...что то вроде наследования от того, что перечислено в главном файле (main.pl). Запихнуть все в массив какой - нибудь @ISA что ли что бы не писать ручками заного... Буду думать я над это проблемой, хотя...как там про велосипед говориться... |
|
25.08.2011, 18:32 | #8 | |
Форумчанин
Регистрация: 20.05.2009
Сообщений: 506
|
Цитата:
Идеальный вариант в вашем случае( если вы действительно решили во вред самому себе минимизировать использование use) все функции по работе с OpenGL вынести в отдельный класс. А в файле main.pl вызывать нужные методы класса, не использую методы OpenGL напрямую из main.pl. |
|
25.08.2011, 22:52 | #9 |
Регистрация: 24.08.2011
Сообщений: 7
|
Да, я малёк запутался! Вы правы!
До этого я не имел дело с ооп в Perl ... там всё довольно обстрактно на мой взгляд, в отличае от С++, например. Хочу сделать что то вроде главного файла main.pl к которому подключаю различне модули в которых описываются различные примитивы, скажем, точки, прямые и тд. и тп. Ну и вызывать их по необходимости... В итоге, сами по себе модули и не должны быть рабочими, в них как в функциях должны быть самые необходимые вещи. ssdm, а вы, как я понимаю, предлагаете переписать либу OpenGL в ооп варианте? Или я опять что то не так понимаю... |
25.08.2011, 23:09 | #10 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PERL | lowkee | Фриланс | 1 | 12.11.2010 01:02 |
Perl | isus | Perl | 3 | 06.05.2010 10:24 |