<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/genshiken/">
    <title>genshiken @ ウィキ</title>
    <link>http://w.atwiki.jp/genshiken/</link>
    <atom:link href="https://w.atwiki.jp/genshiken/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>genshiken @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2008-06-16T23:12:41+09:00</dc:date>
    <utime>1213625561</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/34.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/32.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/33.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/31.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/30.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/29.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/28.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/11.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/34.html">
    <title>080616</title>
    <link>https://w.atwiki.jp/genshiken/pages/34.html</link>
    <description>
      *080616
前回の課題がほったらかし状態ですが、とりあえず課題だけ進めます。

**キーボードイベント
前回のプログラムに、アルファベットや記号のキーが押された際「何が押されたか」を適当なファイル（例えばkey.txtなど）に出力する処理を付け加えてください。
キーボードイベントを扱う際の[[構造体]]に関しては下のURLを参考にしてください。
http://www.tacoworks.jp/software/SDLdoc-jp/html/sdlkeyboardevent.html

**提出
期日は取り合えず設けません。    </description>
    <dc:date>2008-06-16T23:12:41+09:00</dc:date>
    <utime>1213625561</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/genshiken/pages/2.html</link>
    <description>
      **メニュー
-[[トップページ]]
-[[かいてるひと]]
-[[もくひょう]]

**はじめるまえに
-[[プログラミングとは]]
-[[プログラミングを始める前に]]

**C言語
-[[こんにちは世界（言葉じゃないよ）]]
-[[基本文法]]
-[[組み込み型]]
-[[変数]]
-[[演算子]]
-[[真と偽]]
-[[配列]]
-[[ポインタ]]
-[[分岐]]
-[[ループ]]
-[[構造体]]

**課題
-[[071210]]
-[[071217]]
-[[080121]]
-[[080128]]
-[[080218]]
-[[080303]]
-[[080317]]
-[[080325]]
-[[080422]]
-[[080504]]
-[[080521]]
-[[080616]]    </description>
    <dc:date>2008-06-16T23:02:29+09:00</dc:date>
    <utime>1213624949</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/genshiken/pages/1.html</link>
    <description>
      *某県立大学げなんとか研究同好会 ゲーム班うぃき
おれさま　おまえ　まるかじり

*TODO
-AVGのシステムを作る（期限不明）
-キャラクタ着せ替えシステムを作る（期限8月）

*連絡
一応次の課題はとっくに用意できてるんですが、誰もSDLのコンパイル通ってないみたいなので困ったなー。
通った人は電波とかで連絡ください。がんばれ！    </description>
    <dc:date>2008-06-04T00:18:23+09:00</dc:date>
    <utime>1212506303</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/32.html">
    <title>080504</title>
    <link>https://w.atwiki.jp/genshiken/pages/32.html</link>
    <description>
      *080504
パソコン死んだり事故ったりサーバー代払えてなかったり毎日が充実しすぎてて大変！

**testspriteをコンパイルする
ダウンロードしたSDLのファイル群の中に、testというディレクトリが存在すると思います。
その中にはSDLのテスト用のコードが入っています。
今回はそのなかの「testsprite.c」をコンパイルしてみましょう。
普通に、
 $ gcc testsprite.c -o testsprite.exe
などとしてもたくさんエラーがでて悲しい気持ちになると思います。
gccに適切なオプションをつけてコンパイルしてみて下さい。

という課題にしようと思ったんですが、多分誰もできないと思うので「sdl-config」について説明しておきます。
実は前回のインストールで、sdl-configとかいうコマンドが使えるようになっていると思います。
 $ sdl-config
 Usage: sdl-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags]
 [--libs] [--static-libs]
これは、コンパイラに適切なオプションを指定するためのコマンドです。
とりあえず sdl-config --cflags --libs を実行してみましょう。
 $ sdl-config --cflags --libs
 -I/usr/local/include/SDL -Dmain=SDL_main
 -L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows
何かそれっぽいものが出力されました。早速試してみます。
 $ gcc testsprite.c -o testsprite.exe -I/usr/local/include/SDL -Dmain=SDL_main -
 L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows
 /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lmingw32
 collect2: ld returned 1 exit status
はい、ローダがこけました！なんでだ！正直意味が分からないのですが何故かmingw32が存在しないらしいので、適当に外します。
 $ gcc testsprite.c -o testsprite.exe -I/usr/local/include/SDL -Dmain=SDL_main -
 L/usr/local/lib -lSDLmain -lSDL -mwindows
 /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):: undefined reference to `_WinMain@16&#039;
 collect2: ld returned 1 exit status
はい、ローダがこけました！なんでだ！多分mingw32のオプション外した関係でWinMain周りがおかしいんだと思います正直よくわかりません。
仕方がないので-Dmain=SDL_mainを外します。理由はあまり説明したくありません。黒魔術です。
 $ gcc testsprite.c -o testsprite.exe -I/usr/local/include/SDL -L/usr/local/lib -lSDLmain -lSDL -mwindows
通ったー！
みんなの環境ではもっとスムーズに通ってくれるといいなと思いました。

出来た人は実行結果がどんなだったか niha28@gmail.com まで。

追記：
どうしても駄目な人は以下のサンプルコードを。
 #include &lt;SDL/SDL.h&gt;
 
 int main(){
 	SDL_Init(SDL_INIT_VIDEO);
 	SDL_Quit();
 	return 0;
 }    </description>
    <dc:date>2008-05-26T01:38:28+09:00</dc:date>
    <utime>1211733508</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/33.html">
    <title>080521</title>
    <link>https://w.atwiki.jp/genshiken/pages/33.html</link>
    <description>
      *080521
前回の課題に対するメールがなくてドキドキですがちゃきちゃきとまいります。

**ウィンドウの表示と終了イベントの対応
とりあえずウィンドウを表示するプログラムを書いて下さい。
また、ウィンドウを閉じるよう操作された時に（閉じるボタンのクリック等）ちゃんとプログラムが終了するようにして下さい。
ちゃんと書かないとプログラムが終了しません。ウィンドウ一つ閉じるのもただではないということです。

**参考
適当に検索すればある程度は情報が出てくると思いますが、下が一番確実です。
http://www.tacoworks.jp/software/SDLdoc-jp/html/index.html

**提出
来週の水曜までに。    </description>
    <dc:date>2008-05-21T23:41:45+09:00</dc:date>
    <utime>1211380905</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/31.html">
    <title>080422</title>
    <link>https://w.atwiki.jp/genshiken/pages/31.html</link>
    <description>
      *080422
復活ー。

**SDLを使えるようにする
SDL（Simple DirectMedia Layer）はゲームなどに使われるクロスプラットフォームなライブラリです。
Windows上で動くゲームを開発する場合はDirectXを使うのが基本ですが、とりあえずはこちらを使いたいと思います。
ということで、今回は自分の開発環境でSDLを使えるようにしましょう。もしかすると普段の課題より時間がかかるかもしれません。

**解説
更新遅れ気味ですみません。
今回はとりあえず「Windows + Cygwin gcc」という環境の場合を説明します。他の環境でのインストールは各自頑張って下さい。
現在うちにSDLがインストールされてないWindowsがなかったので実は全然ちゃんと試せてないのがやばいですね！
無理やりもう一つCygwin入れてできないかなーと思ったらPATHの関係で狂ってCygwin死にました。
直すのが大変でした。

とりあえず、SDLのWebサイトでファイルをダウンロードしましょう。現在はこれ。
http://www.libsdl.org/release/SDL-devel-1.2.13-mingw32.tar.gz
落としたファイルをCygwin以下の適当なディレクトリに解凍しましょう。
うちの場合、Cygwinが「C:\cygwin」に、Cygwin内のホームディレクトリが「C:\cygwin\home\niha」なので、
「C:\cygwin\home\niha\SDL」にファイルを移して解凍し、最終的に「C:\cygwin\home\niha\SDL\SDL-1.2.13」にディレクトリができました。
解凍したらCygwinを起動して、ディレクトリを移動します。
移動した後、makeコマンドを実行しましょう。
 $ make
 Type &quot;make native&quot; to install to /usr
 Type &quot;make cross&quot; to install to /usr/local/cross-tools/i386-mingw32
何か言われます。深く考えずにmake nativeを実行しなおしましょう。make crossはクロスコンパイル用です。クロスコンパイルが何とかは気にしないでいいです。
以上。

ぐぐって色々調べると、./configureすればいいよとかいう解説ページがちらほらありますが、
今は./configureがなくてmake nativeで一発ぽいです。ほんとか？そうなのか？    </description>
    <dc:date>2008-05-05T00:47:40+09:00</dc:date>
    <utime>1209916060</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/30.html">
    <title>080325</title>
    <link>https://w.atwiki.jp/genshiken/pages/30.html</link>
    <description>
      *080325
いつも更新が火曜ですみません。開き直って日付を火曜にしました。
バイトが金曜から月曜まであるから…

**データ構造の特徴を知る
データ構造の特徴を勉強してください。
-配列
-連結リスト
-ハッシュテーブル
それぞれどういった用途で用いられるかを調べて提出してください。
どういった処理に強いか、どういった処理に弱いか等もあるといいです。

**解説
解説長いです。重要なことなので頑張って読んでね。
データ構造には得意な処理と苦手な処理というものがあります。
例えば配列に要素を挿入する場合を考えてみましょう。
もし配列の任意の位置に値を挿入したい場合、コードは下のようになります。
 int *array; /* ある程度のメモリを確保した配列（を指す[[ポインタ]]） */
 int length; /* 配列の長さ */
 int n; /* 入れたい位置 */
 for (int i = length - 1; i &gt;= n ; i--){
   array[i+1] = array[i];
 }
 array[n] = value;
要素の入れ替えが何度も発生します。コピーにコストのかかる値が配列に入っていた場合、これは問題になります。そうでなくとも配列の長さが大きければ、当然問題になります。
一方、連結リストの場合は挿入位置の一つ前の要素がさしているポインタをいじるだけですみます。
 List *head; /* リストの先頭要素を指すポインタ */
 List *list = head;
 List *elem; /* リストの要素のポインタ */
 elem = (List*)malloc(sizeof(List));
 int n; /* 入れたい位置 */
 for (int i = 0; i &lt; n - 1; i--){
   list = list-&gt;next;
 }
 elem-&gt;next = list-&gt;next;
 list-&gt;next = elem;
ちなみにこのコードは色々嘘で、例えば先頭に挿入できません。困りましたね！知りません！
ハッシュテーブルには順番というものが存在しないので比較はできません。
このように、データ構造に対する操作にはある程度のコストがかかるわけですが、どの程度のコストがかかるのかを表す記法が存在します。それがO-記法です。
例えばN個の要素を持つ配列からある値を探す処理は、値を一つずつ見ていく必要があるため、大体N回の操作が必要になります。
これをO-記法で表すと「O(N)」となります。アルゴリズムの計算量がO(N)とあった場合、そのアルゴリズムは要素数に比例する計算量を持つという意味になります。（あんまり正確な言い方じゃないですがわかりやすさを優先します）
一方、N個の要素を持つ「ソート済み」の配列からある値を探す場合、二分探査と呼ばれるアルゴリズムが使えます。これは任意の位置（大抵真ん中）より大きいか小さいかを調べ、分かった範囲でまた同じ操作を繰り返し要素を探索するアルゴリズムです。
詳細は省きますが、この場合大体logN回の操作が必要になります。（何故そうなるのか自分で考えてみましょう。ちなみにlogの底は2です。）
これをO-記法で表すと「O(logN)」になります。大体分かってもらえたでしょうか。
そんなわけでこの記法を用いて各データ構造に対する操作にかかるコストを並べてみました。
***配列
-要素を追加 O(N)
-要素のアクセス O(1)
-要素の探索 O(N)
***リスト
-要素を追加　O(1)
-要素のアクセス O(N)
-要素の探索 O(N)
***ハッシュテーブル
-要素を追加 O(1)
-要素のアクセス O(1)
並べてみたけどあんまり何も分かりませんね！
データ構造の特性を理解して、目的にあったデータ構造とアルゴリズムを選びましょう、という話でした。    </description>
    <dc:date>2008-04-01T02:37:26+09:00</dc:date>
    <utime>1206985046</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/29.html">
    <title>080317</title>
    <link>https://w.atwiki.jp/genshiken/pages/29.html</link>
    <description>
      *080317
すみません先週分忘れてました。回答書こうと思ったらページがなかった！

**動的にメモリを確保して開放する
動的にメモリを確保して開放するコードを書いてください。どのようなものでも結構です。
malloc, free を使いましょう。
静的に確保されるメモリ領域との比較も分かる人は書いてください。

**解説
mallocを呼び出すと、ヒープと呼ばれるメモリ領域を動的に（プログラムの実行時に）確保します。
動的に確保したメモリの扱いは非常に難しいうえに、扱いをあやまった際のバグは、難解なものになりがちです。
例えば再現性が悪く、毎回違うタイミングでプログラムが落ちるなどといったことが起きます。
動的に確保したメモリの扱いには慎重になりましょう。
全然書くことがない。

***tatikoma
問題はないけれど、mallocに対する引数が結局128文字分決め打ちになってるので動的に確保する意味がなくなってる。

***take
stdlib.hはincludeしましょう。    </description>
    <dc:date>2008-03-25T02:48:27+09:00</dc:date>
    <utime>1206380907</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/28.html">
    <title>080303</title>
    <link>https://w.atwiki.jp/genshiken/pages/28.html</link>
    <description>
      *080303
前回はちょっと難しかったので今回は簡単…とは限らない。
[[ポインタ]]の中でも一番厄介な関数ポインタを使ってみましょう。
まともにゲームプログラミングするなら知っておいて損はない、というかタスクシステムとかで普通に使います。

**関数ポインタをとる関数
int を取り int を返す関数のポインタを取り、その関数に0〜9までの整数を適用した結果を出力する関数を書いてください。
よくわからなかったら使用例と出力例を見てください。

**使用例
int add(int i){ return i + 1; }
int square(int i){ return i * i; }
apply_0to9(&amp;add);
apply_0to9(&amp;square);

**出力例
1 2 3 4 5 6 7 8 9 10
0 1 4 9 16 25 36 49 64 81

**解答例
 #include &lt;stdio.h&gt;
 int add(int i){ return i+1; }
 int square(int i){ return i*i; }
 void apply_0to9(int (*fp)(int)){
  int n;
  for(n=0; n&lt;10; n++){
   printf(&quot;%d&quot;, fp(n));
   printf((n==9) ? &quot;\n&quot; : &quot; &quot;);
  }
 }
 int main(){
  apply_0to9(&amp;add);
  apply_0to9(&amp;square);
  return 0;
 }

**解説
与未さんから完璧な解答が何故かきたので一部いじって解答例に載せました。前から思ってましたが普通にC言語結構理解してますよね与未さん…
さて今回は、関数ポインタを引数にとる関数を書く、ということを兎に角やってもらいたかったため、内容は非常にシンプルです。
つまり「int (*fp)(int)」が全てです。
関数ポインタというものを理解していれば、すぐに書けたと思います。
関数というのは、実のところ「実行コードのアドレスを指すポインタ」に過ぎません（ほんとか？）そのためポインタ値としてそのまま取り扱う事ができるわけですね。

**関数ポインタの利点
関数ポインタを使うことで、「処理」を変数として扱う事ができます。
これの利点は、標準のqsortなどを見てもらえば分かると思います。値の比較の方法を渡してもらうことで、どんな値でもソーティングすることができるわけです。
他にも利点はあります。ゲームプログラミングでは、例えばアクションゲームを作っているとしましょう。プレイ中は↑の入力があったらキャラクタをジャンプさせ、ポーズ中はメニューの移動をさせたい。すると、入力がある度にポーズ中かどうかをチェックしないといけない。これは非常に面倒ですし無駄です。勿論入力を処理する部分をプレイ中とポーズ中とで分ける、という解決もありますし、プレイ中とポーズ中では処理が全く違うので普通はそうすべきだと思ったりもしますが…
関数ポインタを使うと以下のように書くことができます。
 void jump(); /* ジャンプする */
 void select_up(); /* 一つ上を選択 */
 void (*keydown_up)(); /* 矢印上が押されたときに実行されるべき関数へのポインタ */
 void main_frame(){
   ...
   switch(keydown){
     ...
     case KEY_UP:
       keydown_up();
       break;
     ...
   }
   ...
 }
このようにしておけば、プレイ中にポーズされた時、逆にポーズが解除された時にkeydown_up変数を書き換えるだけですみます。
ゲームプログラミングでは、他にもタスクシステムという重要な仕組みの実装に関数ポインタを使います。興味のある人は適当にぐぐったりしてみてください。タスクシステムの解説はまたそのうち。

**めんどくさいのでここで返事するぜー
ぐだぐだと。
 #include&lt;stdio.h&gt;
 int number(int num1,int num2);
 int main()
 {
  int (*gate)(int num1,int num2);
  int i,j;
  gate = number;
  printf(&quot;これはそれっぽいリストを書くプログラムです\n&quot;);
  for(i=0;i&lt;10;i++)
  {
   for(j=0;j&lt;10;j++)
   {
    printf(&quot;%2d &quot;,(*gate)(i,j));
   }
   printf(&quot;\n&quot;);
  }
  return 0;
 }
 int number(int num1,int num2)
 {
  int answer;
  answer = num1 * num2;
  return answer;
 }
 よくはわかりませんがこんな感じでよろしかったのでしょうか？
 後、今回変になった所がありまして
 上記の”リスト”を”表”にすると
  
 warrning : unkonwn escape sequense: &#039;\202&#039;
  
 というのが出まして、このまま実行しますと
  
 ”これはそれっぽい浮　曹ュプログラムです”
  
 となってしまったのですが、そういう仕様なのでしょうか？
そういう仕様です。
まずソースコードに日本語を使うべきではありません。何故かというと、処理系は文字列を1byteずつ見ているからです。そのためにエスケープシーケンスなどが文字に含まれていた場合に問題が起こります。
どういうことかというと、日本語などのいわゆる2byte文字は、その名のとおり2byte以上の値を使って表現されています。それをプログラム側がちゃんとルールに従って理解し、表示した結果日本語などが一文字表示されるわけです。
詳しくは適当にぐぐるとこういうページが出るのでこちらに。
http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section01/gcc_sjis.html
あと課題の内容をちゃんと理解できてないですね。mainにそういう処理を書くのではなくて、そういった処理をする関数を書いてほしい、という課題です。    </description>
    <dc:date>2008-03-11T02:33:22+09:00</dc:date>
    <utime>1205170402</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/11.html">
    <title>かいてるひと</title>
    <link>https://w.atwiki.jp/genshiken/pages/11.html</link>
    <description>
      **かいてるひと
エターナルフォース二回生 niha    </description>
    <dc:date>2008-03-04T20:24:14+09:00</dc:date>
    <utime>1204629854</utime>
  </item>
  </rdf:RDF>
