カテゴリー別アーカイブ: プログラム

Xcodeでflexつかうとエラーになる時のメモ

半日潰したのでメモ。

● 出てたのは

2つ。
Xcode付属のflex,bisonで下記。

  • (1) flex ver 2.5.: C++11仕様でコンパイルでワーニング
  • (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない

(1)(2)ともにXcode付属のflex/bisonが古いぜ。

● 結論

(1)(2)ともに,flex&bisonをverUpしたがXcodeがそれをガン無視。
 ↓
Scanner.cpp, Parser.hpp, Parser.cppを予めコマンドラインで生成して,Xcodeのプロジェクトに追加することに。
 ↓
今度は,Xcodeの環境で読み込む「#include 」が古いファイルを参照するので,/Application/Xcode.app/〜以下のFlexLexer.hをXcodeに内緒で差し替える
 ↓
ビルド成功(ちょっぴりwarningまだ出るけどね)

ここまで半日格闘。

● (1)flex 2.5.x だと c++11 コンパイルでワーニング

flex 2.5.xは,変数宣言だかにregisterキーワードが使われる。
registerはc++11でdeprecatedに。だから Xcode でコンパイル時にワーニングだらけになる。

こちとら趣味だしワーニングなんで放っとこうかと思ったが,何しろ多量だし気味が悪い。

● 調べると

flex 2.6.xは,registerキーワード吐かなくなったらしい。おお。
早速brewでインストール。

$ brew install flex
$ brew link flex --force

これでScanner.lをコンパイルする。

$ flex -o Scanner.cpp Scanner.l

中身からキレイにregisterが消えた。

● このファイルをXcode

に追加すると,register絡みのワーニングは消えた。

● が

今度はエラーが大量に出るように。

Xcode曰く
Too many errors emitted, stopping now

て。ええ!?

● みると Semantic Issue だそうで

「Member reference type ‘std::istream *’ (aka ‘basic_istream *’) is a pointer; did you mean to use ‘->’?」

みると確かに「yyin」がポインターとして宣言されて,「.」演算子が付されてる。
「yyin.rdbuf(std::cin.rdbuf())」みたくなってて妙だ。
「yyin->rdbuf(std::cin.rdbuf())」では,ってコンパイラが言うのも確かに。

しっかしsemanticエラーたって,flexが吐いたコードだしなあ。
webによっては「もう,自分で.を->に編集しちゃおうか」的な話もあり。

● だが救世主はやはり

webの中に。

● stack overflowというサイト

国内に情報が少ない場合に大体googleでヒットするstack overflowだ。

もう。stack overflowyahoo知恵袋に世界の大半は記録されてるんじゃないか。

上記リンク先のAlex H.さん(stack overflowの方ね)曰く

you might be able to just use a newer “FlexLexer.h” (for example the one from here: https://github.com/westes/flex/blob/master/src/FlexLexer.h)
(新しいほうの”FlexLexer.h”が使える。(例えばこことか))

FlexLexer.hが古いんで,新しいやつダウンロードして使えば?という。

理由はAlex H.さんの予想だと

I believe the issue is an out of sync “FlexLexer.h”. Flex 2.6.0 changed the storage definition of yyin storage for C++ scanners for both the header and the generated source. However I suppose the mac port package is including an out-of-date FlexLexer.h, even though flex itself has been updated. This leads to the mismatch you are seeing as compilation errors.

ということのよう。って英語だらけ。だいたい

  • flex 2.6.0で,yyinの定義が変更になってる
  • flex自体は更新されても,古いまんまの”FlexLexer.h”が読み込まれてるんじゃないか

ということか。

● そこで

仰せの通りここへ行って,FlexLexer.hをダウンロード。
いや実際にはここでcloneをダウンロード。
どこに入れればいいかというと

~$ find /Applications/Xcode.app/ -name "FlexLexer.h"
/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/FlexLexer.h

発見。

これで(1)が解決。
Xcodeにはコマンドラインで作ったScanner.h

$ flex -o Scanner.cpp Scanner.l

を後から読み込ませれば世はすべて事もなし。

● (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない

$ brew install bison
$ brew link bison --force

そして

$ bison -o Parser.cpp Parser.y

を後からXcodeに読み込ませる。

● なんとかおしまい

上記でビルド成功(ちょっぴりwarningまだ出るけどね)。

次は

● 今まで作ってた

SDL2.0のプログラムとマージしてみる。

コログ

最近のこと。

これは生きたログだから,最近のことをかき殴ろうというわけだ。

● プログラム紀

始まる。
久しぶりに,プログラムを趣味でカタカタやる。

もっぱら

● flex & bison in C++

というやつだ。
flexとbisonを使って,簡単すぎるインタプリタぐらいまでは作れそうな感じに。

bison -> flex へのヘッダファイル提供。
実際には,bisonで言語ルールまで書いて%tokenや%typeで宣言した部分を,
後に flex で#includeして使うということのよう。

これには,

● これに

めっぽうお世話になりました。
動物の柄のこの本,学生時代から憧れの象徴。

実際には,2年前ぐらいか。秋ぐらいから寝床で読んでは
単語がわからずiphoneとかで調べる。

  • precedence:優先順位(計算機演算ではpriorityて言わないのかな)
  • arbitrary:任意の
  • adequate:十分な
  • punctuation:句読点(句読法か)
  • glue to:接着する
  • simultaneously:同時に
  • albeit:〜であるが。
    (p12. “This is a hack, albeit a very useful one, since most of the time it does the right thing.”)

いくつかは入試レベルな気もし。
albeitって,そういう意味で使うんだ。など。

● 下記は,去年の夏に書いてボツにしたブログから

−−−−−−
● 学生のとき(1994〜2000年ぐらい)

大学の授業でBNF記法というのを学んだわけだが、まあ

→ 学べてなかった

単位はもらえたんだっけ。という。
bisonでは、言語仕様をBNF風に書かねばならなかったはず。

● 戸塚時代(2002年〜2007年ぐらい)

よーしいっちょう、flexでも勉強して、新種のプログラミング言語でも発明してやりますかぁ〜
と意気込み、再三挫折。

ギリflexまでは分かる。
けどbisonで何度やってもどうやっても僕の書いたBNFの言語仕様が

● ambiguous grammar

ていうエラーになる。
訳すと「曖昧な文法」。何が曖昧じゃい。曖昧な日本の私のプログラム言語の仕様。

僕にはもう、bisonを使う才能とか、生きている価値とか、死なない権利とか、笑う勇気とか、

● 何にもないに違いない

と咆哮したり呻いたりして畳の目に逆らって爪を立てたり、足の裏で敷居をゴシゴシしたりしては、とにかく、諦めていた訳だ。
−−−−−−

● という

存外に元気な感じでやってたわけだ。
やがて分かりかける。

● 飯も自炊し

再び去年の盆に書いてボツにしたブログから引用する。

−−−−−−
● で

何に感動したかというと、この『flex&bison』の「計算式を入力すると、加減乗除を優先順位を守って計算する」という
サンプルプログラムをつくる中での p.14 だ。

またしばらくすると、仕事で頭が一杯になって、何を理解したのか忘れると思うので、備忘録として残す。

Ambiguous Grammars: Not Quite
The reader may be wondering at this point whether the grammar in Example 1-5 is needlessly complicated. Why not just write this?
(読者はExample 1-5が不必要に複雑だと思っているかも知れない。こう書いてはだめかと。)

exp: exp ADD exp
   | exp SUB exp
   | exp MUL exp
   | exp DIV exp
   | ABS exp
   | NUMBER

そうそう、まさにそう。↑みたく書いちゃなんでダメなんだって十年来わからなかった。
この辺、わくわくしながら読んだ。

ちなみに「Example 1-5」というのは、bisonへ渡す言語仕様を書いたもので p.11 にはこうある。

Bison’s Rule Input Language
Bison rules are basically BNF, with the punctuation simplified a little to make them easier to type. Example 1-5 shows the bison code, including the BNF, for the first version of our calculator.
(bisonに渡すコードは基本的にBNFだが、容易に書けるよう記法を少し簡単にしている。Example 1-5 に計算機の一番最初のバージョンのためのbison用のコード(BNFを含む)を示す。)
Example 1-5 Simple calculator fb1-5.y

 <前略>

calclist: /* nothing */
  | calclist exp EOL { printf("= %d\n", $1); }
  ;

exp: factor
  | exp ADD factor { && = $1 + $3; }
  | exp SUB factor { && = $1 - $3; }
  ;

factor: term
  | factor MUL term { $$ = $1 * $3; }
  | factor DIV term { $$ = $1 / $3; }
  ;

term: NUMBER
  | ABS term { $$ = $2 >= 0? $2 : -$2; }
 ;

<後略>

そうコレなのだ。僕が戸塚時代にメロメロになったやつ。
よく入門書なんかに書いてあるやつだ。

何でこんなに分けて、わざわざ複雑に書かねばならんのだと。謎だった。

p.14でLevine先生が言う「The reader wondering at the point」こそ僕だ。

そしたらそのp.14にはこう続く。

There are two answers: precedence and ambiguity. The separate symbols for term, factor, and exp tell bison to handle ABS, then MUL and DIV, and then ADD and SUB.
(答えは2つある。優先順位と曖昧さだ。termとfactorとexpを分けて書くことで、bisonにまずABSを、その次にMULとDIVを、そしてその次にADDとSUBを処理するよう指示している。)

興奮して音読していた。
そういうことだったんだ。今までこの世のどこにもなかった答えが初めて身に染み入る。ッアー!
−−−−−−

● 何やら

感動している。
スピッツのメドレーをyoutubeで流しながら,暑い日,来る日も来る日も

● 新築の

家の中で猫と僕だけ住んでる状況。
その中で,ずっとプログラム三昧。何度かラム肉食って赤ワイン飲みまくって吐く。

● 分かったことは

C++でflex, bisonを利用することは可能ということと,
ヘッダファイルで

#undef YY_DECL
#define YY_DECL \
yy::Parser::token_type \
Scanner::scan(yy::Parser::semantic_type* yylval, \
			  yy::Parser::location_type* yylloc, \
			  ParseDriver& driver)

とかやったり,かなりトリッキーだということと。

Parser.y内で,


%{
#include "ParseDriver.hpp"

//yylex()のオーバーロード
yy::Parser::token_type
yylex(
yy::Parser::semantic_type* yylval,
yy::Parser::location_type* yylloc,
ParseDriver& driver) {
	return driver.scanner->scan(yylval, yylloc, driver);
}

// parser's error routine <- it's need to be implemented by us
void
yy::Parser::error(
const yy::Parser::location_type& l,
const std::string& m) {
	driver.error(l, m);
}
%}

なんていう,なかなか香ばしいことを書く必要。

● なんか

もともと flex, bison が広域変数使いまくったり,
#ifndefや#defineつかって,凄いことになってたりする中,

● flex, bison in C++も

C++のクラスを使う上で,かなり凄いことになってる。ということのよう。
勉強したのは下記。

  • Blog Alpha Networkingめっちゃお世話になりました。GW前〜GW中@ハトヤ。ずっと解読してました。言ったら実際に手で打って写してました。
  • bison-test@GitHub日本人の方のソース。めっっっっっちゃ分かりやすかったっす。ありがたい。
  • flatB-Compiler-and-Interpreter@GitHubAST(Abstract Syntax Tree:抽象構文木)をC++で作ろうという場合の,B-flatというC言語ぽい言語の,(1)文法チェック(2)インタプリタ(3)コンパイラの例示。すげえ。
  • 10.1.4 C++ Parser InterfaceGNUか何かの,てほどき。bison側の。
  • Generating C++ scannersGNUか何か。flex側の。

やっと,コンパイルフリーなBison/Flexのtinyセットを作成できた。
コレを元に,ASTつくって逐次実行するサンプルができたら,

● やっと

1年以上ぶりにyoutubeのサイトを更新できそうだ。
今日はプログラム紀について。

● 次回は音楽編

そんで次は,最近の人生観について。
順次追記していく。

flex&bisonの勉強

をしてる。

IMG_9153

これ。
今わかった所までの覚え書き。

● 近況

 youtubeへは下記をアップロード。

 ゲームのメインループをクラスに切り出してみたという話。

● で、いよいよ次は

 スクリプトの解析をする処理。アドベンチャーゲームだから。
 シナリオを書いたテキストファイルを読み込んで、ゲームを動かしてみたい。

 で現状下記がボツに。

  1. logo.gif lua :スクリプト言語。いろいろ目処立たず。
  2. kirikiri_inside_small吉里吉里:windows版のよう。なのと、すごい存在感。手を出すとここまで撮った動画が無為になるため見て見ぬふり。

 というわけで自分でつくることにした。

● スクリプトファイルを

 単語単位に分けるのがflex

fade 0           画面の輝度を0に
load "awesome.jpg"    背景画像をロード
fade 0 to 100 in 500   画面の輝度を0から100%まで500ミリ秒で

wait            ユーザ入力を待つ

 こういうのを。

fade
0
load
awesome.jpg
fade
0
to
100
in
500
wait

 こういう風に直してくれるのがflex
 ありがとうflex

● これやるためのflexコードが

 こんな感じ。

%{
#include "myparser.tab.h"
%}

%%

<INITIAL>"fade"		{ return FADE; }
<INITIAL>"load"		{ return LOAD; }
<INITIAL>"to"			{ return TO; }
<INITIAL>"in"			{ return IN; }
<INITIAL>"wait"		{ return WAIT; }
<INITIAL>[0-9]+		{ yylval.integer_value = atoi(yytext); return INT_VALUE; }
<INITIAL>[ \t]		{ }
<INITIAL>"\""			{ yylval.string_literal[0] = '\0'; BEGIN _LITERAL; }
<_LITERAL>"\""		{ BEGIN INITIAL; return STR_LITERAL; }
<_LITERAL>.			{ strcat(yylval.string_literal, yytext); }

%%

 flexにお願いするとこれを元に、C言語のコードを生成してくれる。
 そのC言語のコードの冒頭あたりに

#include "myparser.tab.h"

 が挿入される。

 また、

<INITIAL>"fade"		{ return FADE; }

 と書いておくと、
 入力されたファイルの中に「fade」という単語が見つかったら、「return FADE;」を実行するようなC言語のコードが生成される感じだ。

 このときFADEは記号定数だが、宣言部分を生成してくれるのはbison

● bisonの方のコードが

 これで

%{
#include "stdio.h"
extern int yylex();
extern int yyerror(char *);
%}

%union {
	int integer_value;
	char string_literal[2048];
}

%token FADE LOAD TO IN WAIT
%token <integer_value> INT_VALUE
%token <string_literal> STR_LITERAL

%%

program			: /* empty or.. */
				| program command
				;

command			: FADE INT_VALUE { printf("fade to %d\n", $2); }
				| LOAD STR_LITERAL { printf("load the file named: '%s'\n", $2); }
				| FADE INT_VALUE TO INT_VALUE IN INT_VALUE { printf("fade from %d to %d in %d milli second\n", $2, $4, $6); }
				| WAIT { printf("ordered to wait.\n"); }
				;

 これの

%token FADE LOAD TO IN WAIT

 ここで指定したやつが”myparser.tab.h”に

#define FADE 258
#define LOAD 259
#define TO 260
#define IN 261
#define WAIT 262
 :

 みたく展開される。これをさっきflexのほうで

#include "myparser.tab.h"

 として読み込んでいる。
 だからflexが読み込むファイルの中に

<INITIAL>"fade"		{ return FADE; }

 とあっても、FADEがdefineされているので通る。

● あとは

mylange.c

#include <stdio.h>
#include "myparser.tab.h"

int yyerror(char *s) {
	printf("yyerror(): %s", s);
	return -1;
}

int yywrap(void) {
	return 1;
}

extern int yyparse(void);

int main() {
	yyparse();
	return 0;
}

 これでmain()からyyparse()を呼び出す。
 yyparse()が、bisonが生成したコード(構文解析器)の処理呼び出しになっている。
 yyparse()の中では、flexが生成したコード(字句解析器)の処理(単語単位で取り出す処理)を使うという寸法。

 yyerror()とyywrap()はこんな感じで定義しておくらしい(いい加減)。

● 実行結果

 こんな感じ。

$ ./mylang < sample.txt
fade to 0
load the file named: 'awesome.jpg'
fade from 0 to 100 in 500 milli second
ordered to wait.
$

 なんか元のスクリプトと同じような出力にしてしまった・・。
 けど正真正銘、字句解析器→構文解析器を通した結果出力。

● はじめ

 特に理解がいかなかったのがflex生成コードと、
 bisonが生成したコードの結びつき具合。

● 現在は

 flexとbisonが出してくれたCコードを、
 ゲームメインのC++から呼び出すときの齟齬が出ないか恐る恐るリンク中。

xcodeでsdlのヘッダに出てくる謎のワーニングを回避するメモ

 というわけで、今までつくりためたsdl関係のC++クラスを使って、

wwwthumbnail.php

 アクションゲームを作りたくなってきている。(画面は2008年に作りかけてたときのやつ)
 んだが。

● ふと気づくと

 sdl2.0のヘッダファイルをインクルードすると

● ワーニングが

スクリーンショット 2017-06-02 13.49.17

 表示されるようになってた。
 息子が横で見てて、

ー何それー?ねえ、全部消してね、全部ちゃんと消して〜

 と言う。
 んん。まあ、動くからいいじゃん、とも思いつつ気になるので調べてみた。

● どうも

 よく見ると

スクリーンショット 2017-06-02 13.49.28

 「Documentation Issue」とのことで、なんでも

– ‘\return’ command used in a comment that is attached to a function returning void

 だそう。意訳すると

ー戻り値の型がvoidの関数に付随するコメント内で、戻り値があるかのようにreturnコマンドについて書かてるからおかしいよ。

● 見ると

 SDL_assert.hとか、ヘッダファイル内を指してるぽい。

 で、見てみると

スクリーンショット 2017-06-02 13.50.16

 コメントがワーニング・・だと。

● んなアホなと。

● 思いつつ

 どうも

● コメント内に関数とかそういうのの

 仕様を記述しておくものらしい。

 ツールを通して、自動で仕様書?みたいな「ドキュメント」を作るような支援機能用なのか、
 後からそこを追いかけて、IDEのエディタがカーソル付近に情報を表示してくれるのか。

● これは

 絶対、オフにするオプションがあるハズ、と思ってネットを当たってみたが
 日本語のページを探し当てられず、
 出てくるのは

ー Hi im having a big trouble in ほにゃらかほにゃらか

 みたいな英文ばかり。

 なので、メモしとく。

● 下記

スクリーンショット 2017-06-02 13.50.40

 だ。
 これをNoに設定すればワーニングは消える。

 じゃ次は、いま上げてるyoutubeのプログラム動画の次のテーマを
 アクションゲームづくりにできそうかどうか実験してみる。

SDL2 C++/フレームレートの調整

というのをyoutubeにアップロードしてみた。

収録は6月。
いまは10月。

この間,まったく余裕なく。

最後は原因不明の高熱が1.5週間続くという。

● 寄る年波

昔からこの時期(秋口ぐらい)に,37.2度ぐらいが出続けるというのはあったが,
先週の金曜日未明は40.1度。

6月末からまともな2連休がなかった。身体がもうだめっすーと言ってたのか,何だったのか。
さすがに塾の仕事をずっと続けてくのに自信を失いかける。
が,まあやるしかないか。

● というわけで

6月撮影のファイルを見てたら,下記3つがあって,これって前回アップロードした第7回の前,
第6回の後に入るべきだったきがしてきた。
というか,べきだった。

・キー入力で終了する
・文字列を表示する
・画面のフェード処理を実験する

● なので

第6.5回としてアップロードせざるを得ず。

した。
これから出かける。

macでSDL2.0とC++でゲーム画面を表示

するところまでいった。

スクリーンショット 2016-05-09 22.12.14

※フリー背景素材:きまぐれアフターさん
ありがとうございます!!

第3回:画像を表示する

いやー面白いけど色々考えねばで、通勤の行き来が楽しい。

● といいつつ

動画だけは撮り溜めてる。
あと6回ぐらい先で、luaを使うかも知れず。

● lua

スクリプトとしてのluaという言語はすごいぽい。

>>lua
 ホームページ。英語でよくわからん。

>>lua @wiki
 そろそろ寄付すべきか。
 なるほど。lua=月の意ね。

(ゲームメインC/C++)←→(lua state)←→(luaソースコード(スクリプト))

● わかりやすいページで

勉強。

ゲームつくろー(Lua組み込み編)

すごい勉強になる。
というか、デザインパターン習得編とか、すごい気になる。

しかも管理人の方が同い年らしいという。

・・・。
とりあえずmacで動作確認はできた。
第10回目かそこらで、アドベンチャーゲームのそもそものスクリプトはluaで実装してみようかとか。

SDL2とC++でゲームを作る、という動画を

撮ってみた。
SDL2というライブラリを使って、C++でゲームをつくれないかなあという。

まだ途中。

第1回:

第2回:

毎週末にアップしてったらいいなあ。
キー入力とテキスト表示、それからフェード(イン/アウト)の掛け方まで調査済み。

今日から仕事だー。

SDL2.0でつくった昔のWinプログラムをMacで動かしてみた

明けてた。
気が付くと1月8日。

● 冬期講習の

あとの1日休みがあったので,昔Windows上で作りかけてたゲームをMacでコンパイルしなおしてみた。

そしたら動いた。

● 画像と音楽とかのライブラリに

SDL2.0というのを使わせて頂いてた。
SDL2.0は,WindowsやMacやlinuxまでサポートするライブラリ群。

画像処理と,音関係と,フォントとかを,どのwindowsだろうがmacだろうがlinuxだろうが共通の関数で呼び出せる。
日本語リファレンスもある。

ありがたいです。

当時は将来macを買うとは思ってもいなかったが,

● 試しにmacの開発環境のxcodeで

OnaPuMacSrc01

ビルドし直すと,そのまま動いた。

そのままと言いつつも,ヘッダファイルのパスが違ったのでそれだけ全ファイル手直し・・・。
ただ,ステージ表示がなんか,画面消去されずに出てくる・・。

macにSDL2.0入れてxcodeで動かすまでのメモ

引き続き秋休みだ。
mac os x をyosemiteにした。

yosemited

で、SDL2.0をmacに入れたときのメモを残す。

—–
2016.05.18追記 その後
macでSDLでC++で何か実装中・・・

とりあえずこの辺まで
第1回:

第2回:

第3回:画像を表示する

第4回:クラス化(SDLEnv)

第5回:デストラクタの動作

—–

● SDLのダウンロード

SDLのダウンロードページで下記からダウンロード。
DLsdl2.0mac

あとはこちらのページ(SDL2.0のインストール for Mac)を参考にインストール。

ターミナルで実際やったこと:


$ ./configure
$ make
$ sudo make install


こうすると、下記にヘッダファイルとライブラリ(libSDL2.a)が入るみたい。

ヘッダファイル:/usr/local/include
ライブラリ:/usr/local/lib

● xcodeでプロジェクトの作成を

選んで、「Command Line Tool」を選択。
choosingCmdLnToolForSDLPrj

● 次に設定

「Build Settings」の「Search Paths」で下記:
settingPathsOnBuildSettingsTab

Header Search Paths:/usr/local/include
Library Search Paths:/usr/local/lib

Header Search Pathが正しければ、コード内で「#include」と打つと
SDL.hが候補で出てくる。

● ライブラリを無理やり追加

「Build Phases」の「Link Binary With Libraries (n Item)」で下記:
dragAndDroplibSDL2.a

Link Binary With Libraries:libSDL2.a

なんかうまく出来なかったので、Finderから無理やりドラッグアンドドロップ。
ファイル追加のダイアログから「/usr/local〜」へ行けなかった・・・。うーん。

まあドラッグアンドドロップで済んだからよしとして次へ。

● コードを書く

メニューの「ファイル」「新規追加」でmain.cppというのを作って、
サンプルコードを書く。

codingSDL2

サンプルコードは相変わらず、Lazy fooさんのページから借用。

動かすとこんな感じのウインドウが表示(色のRGB値は少し変えた)。

SDLsampleWnd

子供の世話しながらで半日ぐらいかかってしまった。

cocoa何とかで始めれば iOS用のがSDL+C++のみで作れたりしないのかなあとか。

そしたら勉強し始めてるObjective-Cとか無しで、
今までだけの知識だけで、息子に算数アプリ作ってあげられないかしらとか夢想。

彼が小学生になるまえに、足して10になる組み合わせが暗記できるアプリがつくりたい所。。

SDL 2.0を使ってみる

というわけで2014年だ。
色々慌ただしいことになりそうな予感もありつつ、人の不安の9割は実際には起きないという話を信じたりもし。

xodeblocks

● Code::Blocksという

フリーのIDE環境をインストールして遊ぶ。
目的は、

● SDL 2.0 という

ゲーム開発用の汎用ライブラリ(?)で遊ぶため。
目的は、

● nanicom という

ゲーム開発用のライブラリをつくろうという。
目的は・・・

まあいいか。

● 一応

  • Code::Blocks ・・・フリーのIDEで、Win, Linux, Mac OSなどで動くそう
  • SDL 2.0 ・・・フリーの画像・音楽・キーやJoypadやマウスなどの入力などのライブラリで、Win, Linux, Mac OS, iOS, Androidなで動くそう
  • nanicom(仮称) ・・・ゲーム用のVM。できたらいいなあ。時間のない世代が日曜プログラムでゲーム作ってネットで流して、時間のない世代が通勤電車なんかで遊べる世界が理想郷なのだ

その道すがら、あえて情報の少ないSDLに。
英語のページばっかだ。
やはりDxLibにすれば良かった。

まあCode::Blocksである必然性はあまりない・・かな。

で、

● Code::Blocks で SDL 2.0 のんを

ビルドするまでのメモ。
4時間ぐらい格闘した。

  1. Visual Studio Express(今回は2010)をインストール
  2. Code::Blocksをインストール
  3. SDL 2.0をインストール

という手順。
VSをインストールしたらそれで開発すればいいんだが。
いつかはMacやLinuxで。
だってSDLだから。

● SDLのダウンロード

上記のため、Visual Studio前提のSDLをダウンロード。

DownloadingSDL

この中の、includeとlibに用があるわけだ。
違うバージョンだとリンク時にSDL_Init()が未解決になったり、実行時エラーになったりする。

(ということはやったわけだ)

ダウンロードしたら適当なところに解凍しとく。

● チュートリアルを参照

Lazy Fooさんという人のページが非常にわかりやすい。
SDL 2.0のチュートリアルを載っけてくれてるページだ。他にあまり見つけられなかった。

iPhoneにURLを転送してこっそり見てたら、寝た子が起きた。

寝かしつけてからデスクトップで見る。

ここ(http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/codeblocks/index.php
のCode::Blocks版のセッティングはVCでなくmingwというのを使う場合。
Code::Blocksを使う場合を想定してるわけで、VCではない。当然だ。

なので、ProjectのPropatiesの設定以降を、下記のようにする。

<Search Directories>

Compiler:CB-PP-Compiler

Linker:CB-PP-Linker

 

Link Libraries:CB-PP-LinkerSettings
これでは見えないか。
CB-PP-LinkerSettings-01 CB-PP-LinkerSettings-02

32ビットの方のライブラリをリンクする設定にしたつもり。x86のほうが32ビット・・・のはず・・。
もう一方はなんか「64」て書いてあるし。

● あとは、

Lazy Fooさんのチュートリアルのサンプルプログラムをそのまま
「Project」→「Add files…」から追加し、ビルドする。

● はずが

Lazy Fooさんのサンプルのままだと動かなかった。
エントリープリントが必要です、みたいな就活っぽいことを言うのだ。

Visual C++のリンカがそう言うからにはWinMain()がないってことかな、ということで、

● 下記のように変更。

  1. windows.hをインクルード
    CB-SDL-TTR-AddWinHeader
  2. main()を消して、WinMain()に替えるCB-SDL-TTR-AddWinMain

これでめでたくビルドが通って、何やら意図通りのウインドウが表示された。
まあ、これでコードの汎用性とか、いきなり妙になるわけだが。

ここ以外が大丈夫なら大丈夫かな。
まずは備忘録。

次にSDLにまともに触れるのはいつになるやら。
生徒の入試が終わってからかなあ。。