Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Perl
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2011, 02:51   #1
DarkPerl
 
Регистрация: 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 ???
DarkPerl вне форума Ответить с цитированием
Старый 25.08.2011, 02:56   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Но получается, как я понимаю, повторное подключение OpenGL библиотеки!!!
ну и что?
каждый файл подключает то что ему нужно.

кстати, вы разделом ошиблись, серверные скрипты тут точно не причем.(как и WEB)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 03:06   #3
DarkPerl
 
Регистрация: 24.08.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну и что?
каждый файл подключает то что ему нужно.

кстати, вы разделом ошиблись, серверные скрипты тут точно не причем.(как и WEB)
Ну как это что...производительность падает, так ведь?!

А на счет раздела, вы правы, но я не нашел лучше раздел. И кроме того, мой вопрос можно и перефразировать, обощить так сказать. То есть как избавиться от повторного подключения одного и того же кода? Компилим один раз и все
DarkPerl вне форума Ответить с цитированием
Старый 25.08.2011, 08:11   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Ну как это что...производительность падает, так ведь?!
1)падение незаметно.
2)такого требование языка(каждый модуль отдельно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 12:31   #5
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
Но получается, как я понимаю, повторное подключение OpenGL библиотеки!!!
Я ведь уже подключил её в main.pl
Нет , повторного подключения в том смысле что вы имеете в виду не происходит.
И производительность от этого не страдает.
Важно понимать что use имеет область видимости максимум файла.
Но в то же время библиотека OpenGL после первого use уже "подключена". И если вы явно укажете вместо
Код:
sub draw_point()
{
glColor3f(1.0, 0.0, 0.0);
glPointSize(5.0);
glBegin(GL_POINTS);
glVertex3f(0.0, 0.0, 0.0);
glEnd();
}
это
Код:
sub draw_point()
{
OpenGL::glColor3f(1.0, 0.0, 0.0);
OpenGL::glPointSize(5.0);
OpenGL::glBegin(GL_POINTS);
OpenGL::glVertex3f(0.0, 0.0, 0.0);
OpenGL::glEnd();
}
, то все будет работать.
Но так делать не рекомендуются.
ssdm вне форума Ответить с цитированием
Старый 25.08.2011, 12:37   #6
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
И кроме того, мой вопрос можно и перефразировать, обощить так сказать. То есть как избавиться от повторного подключения одного и того же кода? Компилим один раз и все
Прочтите 18 Главу "Компиляция" книги "Программирование на Perl" Ларри Уола. Там найдете ответы на многие вопросы как устроен компилятор и интепритатор Perl.
ssdm вне форума Ответить с цитированием
Старый 25.08.2011, 18:09   #7
DarkPerl
 
Регистрация: 24.08.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ssdm Посмотреть сообщение
Прочтите 18 Главу "Компиляция" книги "Программирование на Perl" Ларри Уола. Там найдете ответы на многие вопросы как устроен компилятор и интепритатор Perl.
Большое спасибо всем, потопал я читать

P.S.

Но всё же, должен же быть способ не писать строчки дважды...эм...что то вроде наследования от того, что перечислено в главном файле (main.pl). Запихнуть все в массив какой - нибудь @ISA что ли что бы не писать ручками заного... Буду думать я над это проблемой, хотя...как там про велосипед говориться...
DarkPerl вне форума Ответить с цитированием
Старый 25.08.2011, 18:32   #8
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
Но всё же, должен же быть способ не писать строчки дважды...эм...что то вроде наследования от того, что перечислено в главном файле (main.pl). Запихнуть все в массив какой - нибудь @ISA что ли что бы не писать ручками заного... Буду думать я над это проблемой, хотя...как там про велосипед говориться...
Вы что то серьезно запутались. Ваши модули( они же классы ) , не должны зависть от скрипта в котором вы их используете. А ваш модуль point получается зависит от скрипта main.pl(так как вы не хотите в point.pm писать use OpenGL). Как вывод по сути ваш класс сам по себе не рабочий.
Идеальный вариант в вашем случае( если вы действительно решили во вред самому себе минимизировать использование use) все функции по работе с OpenGL вынести в отдельный класс. А в файле main.pl вызывать нужные методы класса, не использую методы OpenGL напрямую из main.pl.
ssdm вне форума Ответить с цитированием
Старый 25.08.2011, 22:52   #9
DarkPerl
 
Регистрация: 24.08.2011
Сообщений: 7
По умолчанию

Да, я малёк запутался! Вы правы!
До этого я не имел дело с ооп в Perl ... там всё довольно обстрактно на мой взгляд, в отличае от С++, например.

Хочу сделать что то вроде главного файла main.pl к которому подключаю различне модули в которых описываются различные примитивы, скажем, точки, прямые и тд. и тп. Ну и вызывать их по необходимости...

В итоге, сами по себе модули и не должны быть рабочими, в них как в функциях должны быть самые необходимые вещи.

ssdm, а вы, как я понимаю, предлагаете переписать либу OpenGL в ооп варианте? Или я опять что то не так понимаю...
DarkPerl вне форума Ответить с цитированием
Старый 25.08.2011, 23:09   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в отличае от С++
в С++ правильно делать так же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PERL lowkee Фриланс 1 12.11.2010 01:02
Perl isus Perl 3 06.05.2010 10:24