hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
fromHSP - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

まずは

HSPの便利さにやられた人も多々いるかと思いますが、やはりCが読めれば知識が深まります。
HSPにはHSPなりの不便さもあります。しかし、それをカバーできる言語です。
ここでは、HSPが常識になっている人へ文化の違いへのショックが少しでも和らぐようにするための心療施設です。

Windowsアプリ と コンソールアプリ

  • Windowsアプリとは 皆さん普段使っているアプリ、HSPで作ったソフト(hsp3cl除く)、などがこれです。
  • コンソールアプリとは これはまず、スタートメニューからアクセサリ->コマンドプロンプト(win95/98ではMS-DOSプロンプト)と開いてみましょう。
    黒い画面が表示されたとおもいます。コンソールアプリとはこの中で動くものだと思ってください。
    HSPでは目にすることはありませんが、Cでは標準がコンソールアプリなのです。WindowsAPIやライブラリを使う以外HSPのような実行画面にすることはできません。

インタプリタ型 と コンパイラ型

HSPでは、スクリプトを書けばすぐ実行できます。これがインタプリタです。
Cでは、ビルド(HSPで言うと実行ファイル自動作成)をして、exe ファイルを作らないと実行できません。

変数は?

HSPでは「代入した時」が変数の宣言になります。Cではどうでしょう?

Everything is expanded.Everything is shortened.
  1
  2
  3
 
 
 
        char   s[64] = "";      /* 文字列       (変数の宣言) */
        int    b     = 0;       /* 符号付の整数 (〃        ) */
        double c     = 0.0;     /* 浮動小数点   (〃        ) */

こんな感じです。HSPでかくと?

Everything is expanded.Everything is shortened.
  1
  2
  3
 
 
 
        a = ""
        b = 0
        c = 0.0

です。簡単なので大丈夫ですね? 上は宣言・定義だけ・下は代入だけ、チョット違うかも。

また、多くの他の言語では大文字・小文字が区別されます。

命令をするには対応した#includeを

例えば、printf 関数を使いたいときは:

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
 
-
|
|
!
#include <stdio.h>
 
int main(void)
{
        printf("表示");
        return 0;
}

というようにHSPにもある#include命令があります。これはprintf関数が stdio.h というファイルで宣言されているから必要です。

関数がメインなんです

Cでは、main()関数から全ては始まります(何;
ただし、Windowsアプリでは WinMain? 関数から始まります。
ってことで関数で構成されているようなものです。HSPにも関数がありますし、作れます。
まずは、HSPでお試しあれ。

HSPの関数には必ず戻り値がありますが、Cはない(void)場合があります。
まぁ命令と一緒ですね。

定義と宣言が別なんです

「こういう関数がありますよー。知ってますかー?」っていうのが関数の宣言で、
「この関数の中身はこうなってますよー。」っていうのが関数の定義です。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
 
 
 
 
 
-
|
!
//extern	// あっても無くてもOK
int half(int val);    // 宣言
 
// 定義
int half(int val)
{
    return val / 2;    // 引数の数値の半分を返します。なんだこの関数。
}

Cでは、多くの場合、分割コンパイルという方法が取られています。
"*.c" のソース・ファイルで定義して、"*.h" のヘッダ・ファイルで宣言します。
関数を呼び出す側のファイルには、宣言だけ書いておけば、関数が使えます。(則ち、.h ヘッダファイルを #include すればOK。)

ちなみに、「//」の後は、行末まで無視されます(C99規格)。

実行の動きがわからない時は?

デバッガを使いましょう。1つずつ実行していけば、意外とすぐに動きがつかめます。

Cでなにもない画面(Windowsアプリ)

いきなり気を失われたら困りますが。。。これで、ウィンドウが作れます。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
!
|
!
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
 
 
 
-
-
|
|
-
|
|
|
|
-
|
|
!
|
|
|
!
|
|
|
|
|
!
|
|
!
#include <windows.h>
 
// 関数プロトタイプ宣言
extern LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
extern BOOL RegisterWindowClass(LPTSTR psClassName);
 
//------------------------------------------------
// エントリー関数
// ここから実行が始まります。
//------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    
    // ウィンドウクラスを登録する
    if ( !RegisterWindowClass( TEXT("WndCls") ) ) return 0;
    
    // ウィンドウを作成する
    hwnd = CreateWindow(
            TEXT("WndCls"),                // ウィンドウクラス名
            TEXT("Sample Window"),        // タイトルバーの文字列
            WS_OVERLAPPEDWINDOW &~ ( WS_THICKFRAME | WS_MAXIMIZEBOX ),
            CW_USEDEFAULT, CW_USEDEFAULT,
            210, 230,
            NULL, NULL, hInstance, NULL
    );
    if ( hwnd == NULL ) return 0;
    
    // ウィンドウを表示する
    ShowWindow(hwnd, SW_SHOWDEFAULT);
    UpdateWindow(hwnd);
    
    // メッセージ待ち (定型)
    while ( GetMessage(&msg, NULL, 0, 0) ) {
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}
 
//------------------------------------------------
// ウィンドウクラスを登録する
// @ ウィンドウの規格、型版を Windows に教えます。
// @ だいたいいつもこんな感じ。
//------------------------------------------------
BOOL RegisterWindowClass(LPTSTR psClassName)
{
    WNDCLASS winc;
    
    winc.style         = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc   = WndProc;
    winc.cbClsExtra    = 0;
    winc.cbWndExtra    = 0;
    winc.hInstance     = GetModuleHandle( NULL );
    winc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    winc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winc.lpszMenuName  = NULL;
    winc.lpszClassName = psClassName;
    
    return RegisterClass(&winc);
}
 
//------------------------------------------------
// ウィンドウプロシージャ
// @ ウィンドウに対して「なんか起こった」ときに呼び出されます。
//------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch ( msg ) {
        // ウィンドウに描画が求められたとき
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint( hwnd, &ps );
            
            // ここでウィンドウになんか描きます
            {
                // circle 命令みたいなもので楕円を描く
                Ellipse( hdc, 50, 50, 150, 150 );
            }
            
            EndPaint( hwnd, &ps );
            return 0;
        }
        
        // ウィンドウが破壊されるとき
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    
    return DefWindowProc(hwnd, msg, wp, lp);
}

な、長い……ですが、だいたいいつも同じです。
コピペ、コピペ (爆)。

コメント
  • ちょっと書いてみました。間違ってたら指摘、直し、お願いします。 -- Charlotte 2006-01-18 (水) 19:10:39
  • 僕はいまだにWinMain?の中の書き方が理解出来ないんです。(T_T) -- hiroki? 2006-01-19 (木) 09:53:10
  • たしかに。。メッセージの処理とかはつかみにくい;; -- Charlotte 2006-01-20 (金) 00:45:13
  • 処理系についても、書いた方がいいかも。VC++とか。 -- くに 2006-01-29 (日) 02:02:31
  • コンパイラ型・インタプリタ型の違いは実行ファイルを生成できるか否か、ではないと思うのですが自分の思ってる説明があっているのかどうか分からないのでコメントアウトしてます。 -- kz3 2006-01-29 (日) 13:36:01
  • 実行ファイルと書いたほうがわかりやすいかな?と思ったのですが。objファイルのほうがいいでしょうか?あと、書いてるときも気になったのですが。HSPもコンパイルしてます。。よね? -- Charlotte 2006-02-03 (金) 02:19:44
  • HSPのコンパイルというのはCなどのソース->(アセンブラ)->機械語というコンパイルとは違い、ソース->中間言語(これの具体的な内容は分からない・・・)へと変換し、この中間言語を読取、解釈して実行するのがHSPインタプリタ、単体で実行されるか(つまり自分自身が実行する)自分を実行してくれる別のプログラム(これがインタプリタ)があるかないか、ではないでしょうか?
    実行ファイルを作れないソース解析実行言語・・・(vbsやjs?)はスクリプト言語と呼ばれたりもしますね。この辺りの呼び名の違いは微妙である文書によると「言語を作った人がそれをどう呼ぶか」だそうで^^;おにたまさんはHSPを「インタプリタ言語」と呼んでいるのでインタプリタ言語でいいのでしょう(--; -- kz3 2006-02-03 (金) 02:31:29
    • 一応、 HSP はインタプリタ言語とされていますが正確には「中間言語型のスクリプト言語」であるといえると思います。 HSP では EXE にしても内部的には(EXE 内に埋め込まれた中間言語ファイルを)インタプリタ(HSP ランタイム)によりパースして動作していますのでコンパイラではありません。 HSP におけるコンパイルというのは中間言語ファイル(obj や AX ファイル)を作成することですね。 -- Irisawa 2007-01-24 (水) 10:44:24

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2009-07-31 (金) 18:48:50 (1590d)