タグ

ポインタに関するtyosuke2011のブックマーク (22)

  • ゲームプログラミングでのオブジェクト管理いろいろ

    始めに ゲームプログラミングは一般的に結構難しいと言われているようです。 見た感じはこういう風になってるんだなぁと理解しても、実際に自分で作ってみると メニュー画面を作るのにも手間取ってしまったりします。 そんな中、ゲームプログラミングについて今までさまざまな手法が考案され、使用されてきました。 自分の勉強の意味も込め、さまざまな(ごく一部ですが)手法について検討し、まとめたいと思います。 (C++を大体知ってる前提でものすごい勢いで説明していきます、分からない人はすみません。) (あと今回はシューティングゲームで使えそうなものについて説明します) 敵などの情報を配列に詰め込む ゲームにはさまざまなオブジェクトが存在します。具体的に言うと、自分や敵や、場合によっては駒とか。 そういうものは結局、キャラクターの情報を含む実体を作った後、配列に入れて一元管理します、単純には。

  • ポインタについて | C言語入門~bituse~

    今回は難しいとよく言われているポインタについて説明します。 そんなに難しくないので頑張ってついてきてください。 文字列の回で、少しポインタについて触れましたが、 ポインタと言うのは、変数のアドレス(場所)を持つ変数のことです。 例えば、 char test; と変数を宣言したとしましょう? こう宣言するとまずメモリ上にこの変数の領域が確保されます。 そのメモリが確保された場所を示す変数がポインタというわけです。 変数のアドレス場所を表すには、 変数名の頭に&をつけるだけです。 testという変数であれば、&testでその変数のアドレスを表すことが出来ます。 scanf等の色々な関数で、このアドレスを渡すことによって処理が行われます。 また、ポインタ型というのもあります。 この型は、変数のアドレスを保存しとくための型です。 宣言方法はこうです。 char* test; char *test;

  • C 言語にポインタがある理由は省メモリ化・高速化・開発作業の省力化です - 偏見プログラマの語り!

    前回の記事『プログラム初心者にC言語のポインタを不意ながら教える羽目になったなら、こう教えると良いよ』でポインタの教え方を書きました。ソレに対して「そもそもどうしてポインタっていう仕組みがあるの?」という質問をもらったので、つらつらと書こうと思います。稿は「ポインタがある理由の教え方」ではなく「ポインタがある理由」です。分かっている人には相当に退屈な文章ですのでそういう人は読まずにお帰りください。 で、えーと、結論だけ先に言うと省メモリ化のため、次に速度アップのため、そして生産性アップのためです。 1. メモリは有限である。 マシンに搭載されているメモリには限りがあります。メモリ空間は広大ですが、無限ではないのです。 好き放題にどんどんメモリを使ってデータを格納するわけにはいかないというわけです。しかしプログラムは計算のためにメモリ空間を占有します。仮に↓こんな感じに、わずかな有限メモ

    tyosuke2011
    tyosuke2011 2016/06/20
    ポインタに何を入れるかによる
  • 描画領域のサイズ

    クライアントエリアのサイズを得る より柔軟な文字列表現をしたい場合、TextOut()関数では不十分な面があります この関数は、たとえクライアントエリアの幅が文字列より小さくなっても 文字列は改行されることなく、クライアントエリアから途切れてしまいます //ウィンドウの外に描画されることはありません そこで、クライアントエリアのサイズを知る必要があります 現在のクライアントエリアのサイズを得るには GetClientRect() 関数を使います BOOL GetClientRect(HWND hWnd , LPRECT lpRect); hWnd は、ウィンドウのハンドルを指定し lpRect は、サイズを格納する RECT 構造体へのポインタです 左上の座標 top と left は必ず0になります これと、フォントメトリックスを計算し ウィンドウサイズによって動的な改行を表現することが

  • 麻雀C言語プログラム集

    リンクフリーです 全てのケースを考慮したものではありません デバッグはしていますがバグが残っている可能性があります ここのプログラムはあくまで一例であり、効率的とは限りません 当HPのプログラムを用いて生じたいかなる損害にも責任を負いかねます 無断使用、改造自由(ライセンスフリー)ですが麻雀プログラムは"仕様"に依存するのでそのまま使用する事は難しいでしょう。あくまで参考程度にする事をお勧めします MENU MJAIクライアント MJAIクライアントとはmjai上で動くAIです。参考 「mjai-occam0.524」(天鳳R1800 特上条件到達) ↑のソースコード ・XCode8.2で開発しています ・実行ファイルの下に opponenthoraestimator/exeと同じ階層に置くファイル 以下のファイルを配置する必要があります ・mjaigame/MJAIGame.xcode

  • Ken Kobayashi cpp20

    C++によるプログラミング入門20 ポインタ こんにちは。今回はいよいよポインタです。初心者の方は「何がいよいよだよ」と思ったことでしょう。どうもすみません。これにはいわく因縁があるのです。なんちゃって。 多くの人がC++のもとになったCという言語を勉強したのですが、同時に大量の挫折者もだしたようです。その挫折理由のナンバーワンがこのポインタだったと言われています。そいうお話があったのです。少しおどかしてしまいましたが、安心してください。当はそんなに難しいものではありません。 前に変数とは一般に整数などをいれておく「いれもの」だという話をしましたが、いれものに入れられた情報は、メモリ上のどこかに置かれるはずです。メモリが実際にどのように作られているかは、特別な人以外知らないわけですが、イメージだけは持っていましょう。それは、情報をいれておく箱の列のようなものです。そして、メモリの個々の箱

  • [迷信] とりあえず memset で初期化 | 株式会社きじねこ

    よく見かけるコードですが、上のコードは、必ずしも期待した結果になるとは限りません。なぜなら、double 型やポインタ型は、これらを構成する全ビットが 0 になったとしても、オブジェクトの値が 0 になるかどうかは分からないからです。 確かに、ほとんどの処理系では上記のコードでも問題なく、そして期待通りに動作します。しかし、それはあくまでも"たまたま"動いているに過ぎません。そうした不安定な要素をなくすために行った初期化が、かえってコードを怪しくしてしまっているのです。 単に、集成体の全要素をゼロクリアしたいだけであれば、 とすれば十分です。こう書くと、おそらく次のような反論が返ってくることでしょう。「その方法では、構造体の詰め物がゼロクリアされない」と。しかし、構造体の詰め物にアクセスして、言語仕様上保証される結果を期待することには無理があります。 構造体の詰め物をゼロクリアしたい理由は

  • ポインタ虎の巻

    ポインタ虎の巻 初級篇~ポインタはなぜ難しいか? C言語を学ぶ上で、ほとんどの人が引っかかり、往々にCの勉強を放棄するきっかけとなるのがポインタである。しかし、ポインタはC言語という特定のプログラム言語だけではなく、コンピュータというものを理解する上で、必要不可欠な重要な機能である。C言語参考書では、ポインタを解説する上で「箱」のモデルを使って解説することが多いが、この虎の巻では、より突っ込んだ具体的な動作を解説することでポインタというものの質を解明して見ようと思う。参考書ではC言語の抽象レベルの上で解説がされるのが通例だが、虎の巻では単純化されたアセンブリ命令を使って具体的に解説する。 初級篇目次 変数とは何か? 疑似アセンブリの定義 文字列の処理 アドレスの取得 ポインタの型 関数呼び出しの手法 構造体とポインタ リスト構造 NEW 二進木 NEW 中級篇~ポインタの高度な技 ポイン

  • c,c++におけるポインタについて - Set::prototype

    まだ加筆予定 目標は char (*p)[5]を完全に理解するぐらいまでにはポインタを理解すること。 ポインタと配列の違いは一言でいうならば、書き換えができるか否かである。 ポインタと配列の混乱の元 1:配列名aを読み込む場合、aは&a[0]と解釈される。 2:ポインタbの参照先が配列の場合、でアクセスできる。(もちろん書き込み、読み込み両方の意味で) 3:文字を''で囲めばchar型になるし、""で囲めば、char* 型になる. (ただし、char型配列を""で初期化(代入ではない)するときは""で囲まれた文字列をいったん別のところにコピーしてから配列に 入れなおしている。) ようするにchar型,char*型のときポインタと配列の規則がかなりややこしい。 4:プロトタイプ宣言では、引数にchar sと配列型を指定したとしても、ポインタとして扱う。 int a[5] = {0,1,2,3

    c,c++におけるポインタについて - Set::prototype
  • C++マニアック,ポインタ,pointer の使い方(クラスメンバへのポインタ)

    ポインタの使い方 ここでは C 言語と C++ 以外の言語ではあまり見かけないポインタについて解説します。 C 言語にはなく、C++ にはある、マニアックなポインタといえば、クラスメンバへのポインタです。クラスメンバへのポインタを知らない人も多いのではないでしょうか。これについては、このページの後半で解説します。前半は、通常のポインタについて解説します。 ポインタは難しいといわれることがありますが、そんなことはありません。C 言語と C++ がアセンブリ言語のように軽快であるのは、ポインタのおかげといっても良いでしょう。ここで、明快に理解してください。 ポインタは、必要なのか、使わない方がよいのか、という議論 組み込み型変数とポインタ 配列の先頭アドレスとポインタの関係 関数へのポインタ ポインタと整数の加減算(ディスプレースメント) ポインタ同士の引き算 クラスメンバへのポインタ <-

  • ロベールのC++教室 - 第28章 たのしいソート5 -

    今回は、前回の qsort を使って構造体配列をソートをしてみます。その時、とっても困ることが起きるのです。 では、今回の要点です。 構造体の配列を直接ソートすると遅い。 要素へのポインタ配列を作り、そのポインタをソートするとよい。 では、いってみましょう。 前回と違い、今回は構造体のソートをします。その構造体は次のようなものにします。 struct SMember // 会員データ { int nID; // ID int nYear; // 誕生年 int nMonth; // 誕生月 int nDay; // 誕生日 }; データは乱数で20個作って、生年月日をもとに昇順でソートしたいと思います。 それでは、早速プログラムを作ってみましょう。 // Sort7.cpp #include <stdio.h> #include <stdlib.h> #define numof(array

  • 配列とポインタの奇妙な関係

    第1項:配列のような使い方 第2項:ポインタ専用の書き方 第3項:古き悪きポインタ演算 第4項:アドレスのことは忘れましょう [1]配列のような使い方 前節では、関数に配列を渡すには配列の先頭要素のアドレスを渡していたと説明しました。 ところで、次のプログラムは、ポインタ型の引数にした前節のプログラムですが、 このプログラムを見て、どこか不自然な部分は見あたらないでしょうか? #include <stdio.h> int getaverage(int *data); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int *da

  • キャスト演算子

    動的キャスト C++では、C言語の型キャストをそのまま使うことができますが それ以外に、C++特有の型キャスト演算子が用意されています その中でも、とくに重要なのが dynamic_cast でしょう この演算子は、C++のポリモーフィッククラスに対応しているもので 実行時型変換を行い、有効であれば型を変換します dynamic_cast < type-id > ( expression ) type-id には、変換する目的の型を指定します 必ずポインタ型か参照でなければいけません expression は、目的の型に変換する式を指定します type-idがポインタ型ならポインタ、参照ならば変数を指定します #include<iostream> using namespace std; class Kitty { public: virtual void func() { cout <<

  • Part4 誰もがつまずくポインタを完璧理解

    C言語のポインタは難しいと言われます。しかし,ポインタについて覚えるべき文法は,それほど多くはありません。Cを勉強してきて,ポインタのところでつまずいたという場合でも「&や*などのポインタに関する文法はわかるのだけれど」という人は多いでしょう。むしろ,ポインタで難しいのは,その考え方にあります。 考え方さえわかってしまえば,ポインタはそれほど難しいものではありません。もしプログラムを読んでいて,ポインタの動作が理解できない場面があったら,そのポインタが「何の機能を実現するために使われているか」を考えてみることが理解につながります。この特集では,考え方に重点を置いてポインタを説明したいと思います。 Cではポインタは必須 読者の中には,JavaやC#,Perlなどのプログラミング言語を使っている人もいるでしょう。これらをはじめとする多くの言語では,ポインタというものは無いか,あったとしても,あ

    Part4 誰もがつまずくポインタを完璧理解
  • 関数ポインタ

    関数のエントリポイント コンパイラは、コンパイル時に各関数のエントリポイントを作成します プログラムの実効時に関数が呼び出されると、実行制御はこのエントリポイントに移行します エントリポイントは、言わば関数のアドレスです アドレスであるということはポインタ変数をもつことができます 関数ポインタは、アドレスを格納する関数と同じ戻り値の型のポインタ変数を用意します 仮引数がある場合は、続けて仮引数も指定します 宣言時には、優先順位の関係から必ずポインタ名に ( ) をつけます 型 (*変数名) (仮引数); 関数のエントリポイントをポインタに格納すれば、このポインタから関数を呼び出せます こうすることで、間接参照で関数を呼び出しすることができるのです #include <stdio.h> void func(void); int main() { void (*po)() = func; po

  • ポインタ

    メモリアドレスの秘密 C言語によるプログラミング技術の中で、もっとも大切なものの一つがポインタです 一度でもC言語に触れたことがある方ならば、ポインタに対して「難しい」というイメージがあるかもしれません 実際、筆者も最初は抵抗がありました しかし、ふたを開ければ大したことはありません 肝心なのはプログラム知識よりも、コンピュータアーキテクチャ(というほど大げさでもないが)の知識です ポインタはメモリと深い関係があります では、題に入ります ポインタとはそもそもなにか、簡単に言うと変数の一種です これまで私たちは変数を扱ってきました。変数で文字列を扱うこともできるようになりました ポインタも変数です。難しいことはありません ポインタも変数なので、よくポインタ変数とも呼びます 問題は格納するものです。ポインタには変数のように定数を直接代入するわけではありません ポインタにはメモリアドレスを代

  • デリゲート

    概要 デリゲート(delegate: 代表、委譲、委託)とは、メソッドを参照するための型です。 C言語やC++言語の勉強をしたことがある人には、 「デリゲートとは関数ポインターや関数オブジェクトをオブジェクト指向に適するように拡張したもの」 と言った方が分かりやすいかもしれません。 デリゲートは用途も関数ポインターとほとんど同じで、 述語やイベントハンドラ(「イベント」で説明)等に利用します。 ただし、C言語の関数ポインターと違い、 インスタンスメソッドを参照したり、 複数のメソッドを同時に参照する事が出来ます。 delegate(委譲)という言葉のニュアンスとしては、 「他のメソッドに処理を丸投げするためのオブジェクト」というような意味です。 イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを指示するためなどに使われます。 ポイント C# では、メソッドも他

    デリゲート
  • ポインタと文字列

    10-3.ポインタと文字列 普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、 文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを直接ポインタに指定することができます。 (1)1つの文字列をポインタで表す (書き方) char *p = "ABC"; char *p; p = "ABC"; まずメモリ上のどこかに文字列 "ABC" がとられ、その先頭番地がポインタに設定される。

  • ファイル入出力 (fgets( )!=NULL)

    第17章 ファイル入出力 ファイル入出力関数はキーボードや画面ではなく、ファイルに対して入出力を行います。ファイルは画面出力とは異なり出力結果の保存が可能ですので、覚えておくと何かと重宝します。 尚、ファイル入出力関数を使用するには、#include <stdio.h> する必要があります。 17-1.ファイル操作手順 ファイル入出力は通常、以下の手順で行います。 ファイルポインタとはFILE型へのポインタです。 FILE型では入出力の現在位置(ファイル位置指示子)、ファイルの終端に達したかの情報(ファイル終了指示子)、エラー情報(エラー指示子)、関連するバッファへのポインタなどのファイルの入出力を行う上での必要不可欠な情報を管理しています。 ですから、ファイル入出力を行う際には必ず、このファイルポインタを fopen()によって取得しなければなりません。 また、入出力操作の完了とともに必

  • 構造体配列のポインタ表現

    15-3.構造体配列のポインタ表現 構造体配列をポインタで扱う手順は、一般の配列をポインタで扱う場合と全く同じです。 ポインタの使用手順を忘れてしまった人は「10-2.配列とポインタ」を確認してください。 ただし、構造体へのポインタを参照するためには、「構造体->メンバ名」のようにアロー演算子(->)を使う点に注意して下さい。 #include <stdio.h> struct seiseki { int no; char name[20]; double heikin; }; int main(void) { int i; struct seiseki seito[20] = { { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, }; ※ 「10-2. 配列とポインタ」で学習したように、ポイン