<?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/33.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/32.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/27.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/26.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/genshiken/pages/25.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/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/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
 c    </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/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はクロスコンパイル用です。クロスコンパイルが何とかは気にしな    </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;
ちなみにこのコードは色々嘘で、例えば先頭に挿入できません。困りましたね！知りません！
ハッシュテーブルには順番というものが存在しないので比較はできません。
このように、データ構造に対する操作にはある程    </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)」が全てです。
関数ポインタというものを理解していれば、すぐに書けたと思います。
関数というのは、実のところ「実行コードのアドレスを指すポインタ」に過ぎません（ほんとか？）そのためポインタ値としてそのまま取り扱う事ができるわけですね。

**    </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/27.html">
    <title>080218</title>
    <link>https://w.atwiki.jp/genshiken/pages/27.html</link>
    <description>
      *080218
春です。本日は genshiken wiki にごアクセスいただき…

**平均単語長
小数点第一位までの平均単語長を返す関数を書いてください。
例えば以下の文章の場合は、
 this is a pen.
(4 + 2 + 1 + 3) / 4 で 2.5 文字になります。
単語末の「,.」は単語に含まれません。気をつけてください。
（数字や「!?」はとりあえずいいです。）
余裕がある人は標準入力から渡された文章の平均単語長を出力するコードを書いてみてください。

**入力例
 this is a pen.
 sleeping beauty.
 Answer to Life, the Universe, and Everything.

**出力例
 2.5
 7.0
 5.1

**提出
niha28(atmark)gmail.com

**ヒント
-文字列処理は文字列処理のための関数を使おう。
-「小数点第一位までの」平均単語長を返す関数、です。わざと意地悪にしてあります。

**解答例
何か曜日感覚が若干ずれてて遅れました。
 #include &lt;string.h&gt;
 #include &lt;stdlib.h&gt;
 
 double average_word_length(char *str){
   int all, words;
   char *ptr, *temp;
   all = words = 0;
   ptr = (char*)malloc(strlen(str) + 1); /* 1 */
   strcpy(ptr, str); /* 2 */
   temp = ptr;
   while (temp = strtok(temp, &quot; ,.&quot;)){ /* 3 */
     all += strlen(temp);
     words++;
     temp = NULL;
   }
   free(ptr); /* 4 */
   return (all * 10 / words) / 10.0;　/* 5 */
 }

**解説
今回は色々と出題に失敗しました。皆力技で実装しようとしてしまっていて、意図としては str    </description>
    <dc:date>2008-03-04T20:23:10+09:00</dc:date>
    <utime>1204629790</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/26.html">
    <title>真と偽</title>
    <link>https://w.atwiki.jp/genshiken/pages/26.html</link>
    <description>
      *真と偽
**真偽値
ある事柄が正しいか（真か）どうかを表す値として、真偽値というものがあります。
C言語においては、真偽値は整数値として表されます。
0以外のすべての値は真、0は偽として扱われます。

後でかく？    </description>
    <dc:date>2008-02-14T00:53:49+09:00</dc:date>
    <utime>1202918029</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/genshiken/pages/25.html">
    <title>ポインタ</title>
    <link>https://w.atwiki.jp/genshiken/pages/25.html</link>
    <description>
      *ポインタ
**ポインタとは
ポインタとは、値のアドレスを保持するための変数です。

**ポインタの宣言
ポインタ型を表すには、「*」を使います（*はクリーネスターとかいうこともあります）。
 int * ptr_int; /* ptr_int は int 型の値へのアドレスを保持するポインタ */
 int ** ptr_ptr_int; /* ptr_ptr_int は int 型のポインタのポインタ */

**値とアドレス
すべての値にはアドレスが存在します。勿論ポインタにも存在します。
アドレスとはその値の存在する場所を表す整数値です。
アドレスを取り出すにはアドレス[[演算子]]「&amp;」を使います。
 int num = 0;
 int *ptr = &amp;num;
アドレスのさしている値を取り出す時は、間接演算子「*」を使います。
 *ptr = 1; /* num には 1 が代入される。ptr 自体は変化しない */

**関数ポインタ
関数のアドレスを保持するポインタを、関数ポインタと呼ぶ。
これにより、関数の実体を持ち運ぶことはできないが、それを擬似的に再現することができる。
（実体を持ち運ぶ必要性はほとんどの場合ないのでこれで充分）
int 型の引数を取り、int 型を返す関数のポインタは以下のように宣言される。
 int (*func_ptr)(int);
以下のように使用する。
 int add_one(int n){ return n + 1; }
 int (*func_ptr)(int);
 func_ptr = &amp;add_one;
 int i = (*func_ptr)(1); /* i には 2 が代入される */
関数のアドレスは、アドレス演算子を使わなくても得る事ができる。
また、関数ポインタ越しに関数を呼ぶこともできるため、上のコードは以下のように書き換えることができる。
 func_ptr = add_one;
 int i = func_ptr(1);
初心者は分からなくてもいいです。
ゲームプログラミングにおいては、タスクシステムなどで使用することはあるものの、なければならないということはないです。    </description>
    <dc:date>2008-02-14T00:49:08+09:00</dc:date>
    <utime>1202917748</utime>
  </item>
  </rdf:RDF>
