2011年6月20日 星期一

[問題]成員函數的指標傳入全域函數

有一個我想得到的值
這個值從一個全域函數產生
我只能傳函數指標進全域函數,才能得到這個值

當我想要要物件化時,我遇到了麻煩

======================================================
//GlobalFunc( bool(*)(int*) ); //這是別人寫好的,我不能改變
/**A.hpp*/
class A
{
    friend GlobalFunc( bool(*)(int*) );
    public:
        A();
        bool foo( int* someingYouWant )
        {
            a = someingYouWant;
            return ( a == NULL );
        }
        int * a;
}

======================================================
/**A.cpp*/
A::A()
{
    a = NULL;
    GlobalFunc( &foo );
    //GlobalFunc( *foo );
    //GlobalFunc( foo );
}
======================================================
error:
ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.



苦思許久,想到了下面這個方法

======================================================
//GlobalFunc( bool(*)(int*) ); //這是別人寫好的,我不能改變
/**A.hpp*/
class A
{
    public:
        A();
        int * a;
}
======================================================
/**A.cpp*/
namespace
{
    int * a_ = NULL;
    bool foo( int* someingYouWant )
    {
        a_ = someingYouWant;
        return ( a_ == NULL );
    }
}
A::A()
{
    a = NULL;
    GlobalFunc( &foo );
    //GlobalFunc( *foo );
    //GlobalFunc( foo );
    a = a_;
}
======================================================

但這方法讓我感覺不像物件導向

是否有其他方法解決這個問題?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我又想到了一種變形

======================================================
//GlobalFunc( bool(*)(int*) ); //這是別人寫好的,我不能改變
/**A.hpp*/
class A
{
    public:
        A();
        int * a;
        static bool foo( int* someingYouWant )
        {
            a_ = someingYouWant;
            return ( a_ == NULL );
        }
    private:
        static int * a_;
}
======================================================
/**A.cpp*/
A::A()
{
    a = NULL;
    GlobalFunc( &foo );
    //GlobalFunc( *foo );
    //GlobalFunc( foo );
    a = a_;
}
======================================================

這樣比較像物件導向:D

有沒有更好的方法呢?

2011年6月18日 星期六

Hide console window 隱藏控制台視窗

隱藏console視窗

會閃一下,沒辦法一開始就隱藏


#include <windows.h>
void HideWindow(void)
{
    const int BUFSIZE = 1024;
    HWND m_hWnd;
    char *pszTitle;
    pszTitle = (char*)calloc( BUFSIZE, sizeof(char) );

    GetConsoleTitle( pszTitle, BUFSIZE );
    m_hWnd = FindWindow( "ConsoleWindowClass", pszTitle );
    ShowWindow( m_hWnd, SW_HIDE );
}

int main()
{
    HideWindow();
   
    /* Someing you want to do */
   
    return 0;
}

Visual C++ MFC視窗模式下呼叫gnuplot

研究這的目的,是要在Visual C++視窗模式下呼叫gnuplot

也順便解決了呼叫新版gnuplot會出現的問題:
Timeout: gnuplot is not ready


原本只會用C的popen()來呼叫gnuplot,或用Visual C++的_popen()。
這種方法在console(控制台,黑黑的視窗)模式下是可行的。
但在VC++的視窗模式下,是無法使用_popen()的。

因為popen()是Unix系統的pipe function,Windows系統雖有模擬,但使用上有些限制( ex. 視窗程式不能用 )

在Windows下建pipe

在Windows下建pipe

compiler是mingw32-gcc,可用popen。

compiler是VC++,console(控制台,黑黑的視窗)模式下,要用_popen。
但視窗模式下無效,也不會顯示錯誤訊息。

因為popen是Unix的東西,Windows雖有模擬,但使用上有些限制( ex. 視窗程式不能用 )。


Windows有提供它的 Pipe Functions:

Pipe Functions
http://msdn.microsoft.com/en-us/library/aa365781%28v=VS.85%29.aspx


上網一查,發現有人跟我遇到一樣的問題,而且他跟我的目的一樣,都是要呼叫gnuplot

以下只摘錄回答
===================================================================
http://www.programmer-club.com.tw/ShowSameTitleN/c/36114.html
作者 : sunny_gong(simula)
如果是使用 VC++ 的 runtime library,可以參考說明文件。C runtime library中與作業系統有關的function call,在console模式下應該都沒啥問題,但是在視窗模式中可能就有相容性的問題。其原因就是Windows並不是Unix-like系統,而C runtime library的作業系統服務呼叫就是Unix的系統呼叫,Windows是另外設計出子系統來模擬這些Unix系統呼叫的,例如console子系統與POSIX子系統。所以在Windows上面使用C runtime library的作業系統服務呼叫,都得閱讀一下說明文件,看看有沒什麼差異或限制,或者乾脆用Windows本身的系統呼叫。我只知道個大概,Inside Windows NT之類的書籍有更詳細的說明。

[MSDN Library\Run-Time Library Reference\_popen]
if used in a Windows program, the _popen function returns an invalid file pointer that causes the program to stop responding indefinitely. _popen works properly in a console application. To create a Windows application that redirects input and output, see Creating a Child Process with Redirected Input and Output in the Platform SDK.

Windows NT保護子系統:
http://lee-1.com/hlchou/WindowsNTSubSystem.htm
=========================================================================

Self Deleting Executables

Self Deleting Executables
http://www.catch22.net/tuts/selfdel

2011年6月17日 星期五

Gnuplot 常用指令整理

(自行搜尋)(版本較舊)
GNUPLOT使用手冊.pdf

官網的說明文件:
http://www.gnuplot.info/documentation.html

官網的範例:
http://www.gnuplot.info/demo/
==========================================================
####################################
#資料 數據 繪圖 Plotting Data File
####################################

plot "C:\\filedir\\data.txt" using 1:3 with lines #從絕對路徑讀取data做圖

plot "C:/filedir/data.txt" using 1:3 with lines #從絕對路徑讀取data做圖

#using 1:3 #用data中的第 1 column 當x座標,第 3 column 當y座標
#台灣 column:行 row:列
#中國與台灣相反

#若data.txt與wgnuplot.exe同一資料夾
plot "data.txt" using 1:3 with lines #從相對路徑讀取data做圖

##################
#繪圖方式 Plotting Style
##################

#with lines #用連線做圖
#with points #點(自動選擇: 十字點 X點 米點...種類繁多)
#with dots #細點
#with linespoints #同時具備lines points


##################
#數學繪圖
##################

plot sin(x) with lines, cos(x) with dots #同時畫兩種曲線,須用逗號分隔

plot sin(x) with lines title "我是sin(x)", cos(x) with points title "我是cos(x)"
#plot f(x) title "在圖例顯示的說明" #若沒設定title,預設為函數名稱或data檔名或data絕對路徑

plot 1 with lines notitle #不將函數名稱 1 顯示在圖例上,可當輔助線 #此範例會畫出y=1的直線

plot 2,1 #同時畫出y=2,y=1

==========================================================
##################
#繪圖方式
##################
set sample 500 #每條線用500點表示

==========================================================
################################
#座標軸格式 Axis
################################

set xrange [0:60] #x軸範圍[最小值,最大值]
set yrange [0:60] #y軸範圍[最小值,最大值]

set yrange [0:*] #自動設定上限
set yrange [*:*] #自動設定上下限

set xtics 10 #設定x軸刻度增加量(刻度間距)
(un)set xtics #(不)要畫 x 軸上的刻度
(un)set ytics #(不)要畫 y 軸上的刻度

set logscale y 10 #設定y軸為對數刻度(底數為10)
unset logscale x #取消設定x軸為對數刻度
unset logscale xy #取消設定x軸與y軸為對數刻度

set xtics rotate by -45 #X軸數字轉45degree

==============================================

(un)set grid #(不)要在背景上畫方格紙(也就是網格)
(un)set border #(不)要畫外框

===========================================================
################################
#圖例
################################

(un)set key #(不)要顯示圖例 (因為一張圖上可以有好幾個函數)
set key outside #把圖例放在圖表外

set keytitle "我是圖例標題" #顯示圖例標題
unset keytitle #不顯示圖例標題

===========================
################################
#標題 Title
################################
set title "Wave" #圖表標題
set xlabel "time(s)" #X軸標題
set ylabel "Electric Field" #Y軸標題

unset title #不顯示圖表標題
unset xlabel #不顯示X軸標題
unset ylabel #不顯示Y軸標題

=============================================================

set terminal svg size 700,400\
                 font "Arial,8"\
                 linewidth 0.5
set output 'filename.svg'
plot "Wave.binary" with lines

set output
set terminal windows

===================================================
plot sin(x) with filledcurve x1 linecolor rgb "forest-green" title "圖例顯示的說明"


plot sin(x) style fill transparent solid 0.5 noborder with filledcurve x1 linecolor rgb "forest-green" title "圖例顯示的說明"
style fill transparent solid 0.5 noborder

===================================================
plot f(x) with filledcurve x1 #向下填滿
plot f(x) with filledcurve x2 #向上填滿
plot f(x) with filledcurve y1=0 #向y=0填滿

================================================
================================================
Excel 圖表精靈
座標軸格式
    數值X軸刻度
        自動設定
        刻度
        最小值
        最大值
        刻度間距
        數值Y軸交叉於
        對數刻度
        數值次序反轉
        數值Y軸置於最大值
===============================================

2011年6月4日 星期六

貓跳台

貓跳台
osborn&momoyen 的相簿 > 《MOMOCAT》2010貓咪嘗鮮
http://photo.xuite.net/momocatdiy/3091631

有宣告解構式但未定義

如果你有宣告解構是但未定義的話

正常情況下,編譯器應顯示:
c++ -Wall -c main.cpp
c++ -Wall -c Base.cpp
c++ -Wall -c Derived.cpp
g++ -Wall main.o Base.o Derived.o -o a.out
main.o(.text+0x93): In function `main':
: undefined reference to `Derived::~Derived()'
Derived.o(.text+0x39): In function `Derived::Derived(std::string const&)':
: undefined reference to `vtable for Derived'
Derived.o(.text+0x69): In function `Derived::Derived(std::string const&)':
: undefined reference to `vtable for Derived'
*** Error code 1

但我遇到的狀況是:
c++  -c Student.cpp
c++  -c StudentOfEnglish.cpp
g++  main.o Student.o StudentOfEnglish.o -o a.out
StudentOfEnglish.o(.text+0x57): In function `StudentOfEnglish::StudentOfEnglish(std::string const&, std::string const&, std::string const&, std::vector<double, std::allocator<double> > const&)':
: undefined reference to `vtable for StudentOfEnglish'
StudentOfEnglish.o(.text+0xb7): In function `StudentOfEnglish::StudentOfEnglish(std::string const&, std::string const&, std::string const&, std::vector<double, std::allocator<double> > const&)':
: undefined reference to `vtable for StudentOfEnglish'
*** Error code 1


害我一直找建構式哪裡錯。