Страницы

25 янв. 2013 г.

Особенности гнуплота под Windows

Если под линуксом гнуплот работает без нареканий и сюрпризов, то под Windows могут возникнуть странности. Далее я поведаю обо всех найденных особенностях Windows-версии этой программы. Их не много, так что пост получился коротким.


Что мы тут установили?

В папке binary присутствуют несколько исполнимых файлов: gnuplot.exe, wguplot.exe, pgnuplot.exe. Первый предназначен для работы из консоли Windows:

Второй — эмулятор консоли в более привлекательном виде — по сути то же самое, но не отпугивает чернотой:

Третий нужен для работы с каналами (pipeline).

Для "ручной работы" рекомендуется использовать wgnuplot. Там есть кнопочки и работает drag&drop.

В папке demo лежат скрипты примеров. Запустите wguplot.exe и откройте любой файл с расширением .dem. Кстати, где эти же скрипты находятся в линуксовой версии, я не знаю.

Разумеется, не стоит забывать про папку docs. Хотя мой внутрениий голос подсказывает, что вы туда не полезете.

Что нужно сделать после установки?

Можете почитать README-Windows.txt. От себя скажу, что настраивать ничего не надо. Можно назначить wgnuplot программой по умолчанию для файлов с расширением .gp, .gpl, .plt. Двойной клик по такому файлу запустит построение графика. Если картинка появляется на мгновение и тут же гаснет, добавьте в конец скрипта паузу: pause -1 "hit enter to exit". Должен быть способ получше, но мне лень экспериментировать. Я пересел на линукс, там все хорошо.

Хак для C/C++ программистов

Если вы не собираетесь запускать гнуплот из си-программ, то дальше можно не читать.
Мы будем использовать старые добрые каналы (pipes) — характерная черта ОС Unix. Windows их поддерживает, но, боюсь, никто ими не пользуется. А жаль, ибо штука удобная.

#include <stdio.h> #include <stdlib.h> int main() { FILE *gpipe = popen("pgnuplot -persist","w"); if(!gpipe) return -1; fprintf(gpipe, "set terminal win\n"); fprintf(gpipe, "plot x*x\n"); fprintf(gpipe, "pause -1 \"hit enter to exit\"\n"); fprintf(gpipe, "exit\n"); pclose(gpipe); return 0; }

Функция popen() волшебным образом запускает гнуплот и теперь мы печатаем в него, как в обычный файл. Попробуйте скомпилировать эту программу. Возможно придется извратиться, заменив функцию popen() на _popen(), зависит от компилятора. Несмотря на правильный код, нас ждет облом — Windows попросту не знает, где находится pgnuplot.exe, когда мы просим его открыть. Чтобы получить возможность запуска гнуплота через канал, я нашел три способа:

  1. Поселить exe-шник разрабатываемой программы вместе с содержимым папки binary в комунальную квартиру одну папку. Этот вариант выглядит наиболее убого (мало кому понравится таскать 20–30 лишних файлов вместо двух-трех), но зато всё будет работать на машинах, где гнуплот не установлен (получаем такую portable-версию).
  2. Прописать полный путь к гнуплоту, не забывая, что обратный слеш экранируется. Например команда
    FILE *gpipe = popen("gplt\\pgnuplot -persist","w");
    заставляет ОС искать гнуплот в папке gplt в папке с проектом. Получаем ту же portable-версию, но без помойки. Не сложно догадаться как работает строка
    FILE *gpipe = popen("C:\\Program\ files\\gnuplot\\binary\\pgnuplot -persist","w");
  3. Самый правильный способ — добавить директорию гнуплота в переменную PATH. Вот как это сделать. Сразу может не заработать, перезагружаемся.

Остается один неприятный косяк — размер окна определяется автоматически (видимо в процентах от разрешения экрана) и задать в коде его нельзя. Т. е. если вы хотите получить окно квадратной формы, придется каждый раз изменять его размер вручную. В линуксе можно задать размер окна, а в винде нет.

Комментариев нет:

Отправить комментарий