【アプリ紹介】2D&3Dのグラフ描画iPhoneアプリ「Quick Graph」【雑談】

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たいちう

【アプリ紹介】2D&3Dのグラフ描画iPhoneアプリ「Quick Graph」【雑談】

#1

投稿記事 by たいちう » 15年前

http://www.appbank.net/2010/05/02/iphon ... 117674.php
http://www.hyuki.com/d/201005.html#i20100505175046

結城先生の日記で紹介されていました。
以前Maさんが似たようなプログラムを作っていましたよね。

iPhoneなので私が使うことはないでしょうけど、
いずれWindows向けのフリーソフトでも、
似たようなことができるようになるのでしょう。

高校生にとって与えられた数式を簡単に視覚化できるのは魅力でしょうが、
こればっかり使っていて、実力が付くのかどうかが疑問です。
柔らかい食べ物ばかりだと顎が丈夫にならない、みたいな。

たかぎ

Re:【アプリ紹介】2D&3Dのグラフ描画iPhoneアプリ「Quick Graph」【雑談】

#2

投稿記事 by たかぎ » 15年前

大きな声ではいえませんが、私はAppleは好きですが(普段Macを使っているぐらいなので)キャリアが嫌いなのでiPhoneは意地でも使いません。iPod touchなら使ってもよいのでそちらを検討していたりします。
結構この類のソフトは好きなので(というか数学が好きなので)、機会があれば使ってみたいと思います。

それはそうと...

> 高校生にとって与えられた数式を簡単に視覚化できるのは魅力でしょうが、
> こればっかり使っていて、実力が付くのかどうかが疑問です。
> 柔らかい食べ物ばかりだと顎が丈夫にならない、みたいな。

そうですね。
基礎力を身に付けた上で便利な道具を使うならよいのですが、はなから便利な道具に依存するとまったく潰しが効かなくなります。
今回の件に限らず、

暗算も筆算もまともにできないのに電卓を使わせるとか、
手書きで製図ができないのにCADを使わせるとか、
手縫いもできないのにコンピュータミシンを使わせるとか、
ディレクトリや環境変数などの概念を知らないものに統合開発環境を使わせるとか、

こういった教育をやっていると使えない人間ばかり増えていきます。
ほかには、二次方程式の解や三平方の定理など、証明を教えずに公式だけ丸暗記させるのも似たようなもんです。

Ma

Re:【アプリ紹介】2D&3Dのグラフ描画iPhoneアプリ「Quick Graph」【雑談】

#3

投稿記事 by Ma » 15年前

あれ、名前が出てる。(笑

あのときは、お世話になりました。

> 高校生にとって与えられた数式を簡単に視覚化できるのは魅力でしょうが、
> こればっかり使っていて、実力が付くのかどうかが疑問です。
> 柔らかい食べ物ばかりだと顎が丈夫にならない、みたいな。

それはどうでしょうね。
最初からあまり深く考えるつもりがない人の場合、このような視覚化は理解への手助けになります。
考えることがすきな人は図形イメージへのショートカットができることになりますが、想像力を育てる事ができません。

長所も短所もありますが、個人的には長所のほうが多いのだと思います。


ここから、電卓に限った話になります。

ちなみに、アメリカの学校では中学生から(数学のクラスに)全員電卓を持ち込む事が必要で、
高校になると約一万円する高性能電卓(グラフ機能、プログラム機能、当等)を全員が買わなければなりません。

当然、学校では電卓を使いまくりですが、日本人と比べたら電卓なしでの計算は著しく弱いです。
高校生にもなれば、暗算で掛け算とかもできますが、中学生だと1桁同士の掛け算を暗算できないくらいです。
(数人とかではなくて、数割です。アンケートとったことないので、正確にはわかりませんが。)
ここで考えずに電卓に頼り始めたら、当然本質の理解は得られません。

*「ただし」、逆に電卓を使いこなす力は日本人よりもかなり上手くなる事は言うまでもありません。
当然、手で計算するより電卓を使う事でできることはかなり大きいです。
しかも、実際に数学の知識を生かすときは、電卓を使ってはいけない、あるいはできないという事が少ないですね。
あと、日本の数学の問題は手で解けるように作られていますが、アメリカの問題は電卓がないと解けない問題が多いですね。(より実世界の計算に近いことができるようになる。)

でもおっしゃるとおり、だからといって、本質理解が欠けてしまえば本末転倒です。


で、本題に戻りますが、このような視覚化アプリなら本質を理解するための妨害になることは少ないと思います。
というのは、電卓のように仕事を楽にする計算を肩代わりする、というよりは、楽しむ、わかりやすくする
ということをして、本来の勉強に支障を起こすことはないとおもいます。


とまぁ、あっちいったりこっちいったりで、文がまとまってないですが、基本的にアプリ使え派です。
ですが、本質理解重要派でもあります。 画像

レッドリ

構造体のdouble型メンバをまとめてゼロで初期化するには

#4

投稿記事 by レッドリ » 15年前

こんにちは、私の開発環境はVC++EE2008でWindowsXPです。
struct Player{
        double x;
        double y;
        double angle;
};
Player player;
上の構造体を全てゼロにする場合、
memset(&player,0,sizeof(Player));
とする方法以外でゼロにする方法はありませんか?
http://www.kijineko.co.jp/tech/supersti ... emset.html
によると、浮動小数点はちゃんと0にならないと書かれていたので
memsetとは違うもので初期化したいと思っています。

Player player={0};
とすると、最初の宣言時だけの初期化なので、
ゲームからタイトルに戻るときに挟む全体の初期化で使えないのです。


検索しても、宣言時の初期化しかでてこなくて、大変困っております。
普通に、初期化関数で
player.x=0;
player.y=0;
player.angle=0;
すればいいじゃないかと
思うかもしれませんが、この様なdouble型をメンバに含む構造体が何十個もあるので
コードが長くなってしまうと思いました。

さらに、
struct exam{
int a;
double b;
float c;
};
など、異なる型が混ざっている場合でもしっかりゼロにしたいです。

できれば、みなさんのお力をお貸しいただけないでしょうか?
説明に不足があれば、付けたしますので、どうかよろしくお願いいたします。 画像

たかぎ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#5

投稿記事 by たかぎ » 15年前

C++であれば下記でよいのでは?

player = Player();

参考まで
http://www.kijineko.co.jp/node/681

C99なら次のようにできるのですが、

player = (struct Player){0};

C99に対応していないVisual C++の場合は、各メンバに個別に代入するか、

static const struct Player player_template = {0};

のようなひな形を作っておいて、

player = player_template;

とするしかありません。

たいちう

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#6

投稿記事 by たいちう » 15年前

C++ならば、普通に↓これでよくないですか?
struct Player{
    double x;
    double y;
    double angle;
    Player() {
        clear();
    }
    void clear() {
        x = y = angle = 0;
    }
};

Player player;
player.x = 3;
player.clear();

たかぎ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#7

投稿記事 by たかぎ » 15年前

struct Player{
double x;
double y;
double angle;
Player() {
clear();
}
void clear() {
x = y = angle = 0;
}
};

↑だと、POD型や集成体の利点を捨てることになります。
POD型の場合は、型名()とすればゼロ初期化されますので、やはり、

player = Player();

で十分ではないでしょうか?

レッドリ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#8

投稿記事 by レッドリ » 15年前

お二人方ありがとうございます。

player = Player();

static const struct Player player_template = {0};
player = player_template;
で上手く行きました。

あと、もう1つ質問なのですが、

構造体の配列で
Bullet bullet[BULLET_MAX];
では、
memset(bullet,0,sizeof(Bullet)*BULLET_MAX);
などのように初期化をしていたのですが

これを
bullet[BULLET_MAX]=Bullet();
という風に書き換えてみたところ、ビルドして実行までは上手く行きましたが、
"初回の例外が発生しました: 0xC00000FD: Stack overflow"
というエラーになり、強制終了してしまいました。

static const struct Bullet bullet_template[BULLET_MAX] = {0};
とすると
右オペランドを扱う演算子が見つかりません (または変換できません)。
となります。
構造体の配列の場合は一個一個初期化でしょうか? 画像

たかぎ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#9

投稿記事 by たかぎ » 15年前

> bullet[BULLET_MAX]=Bullet();
> という風に書き換えてみたところ、ビルドして実行までは上手く行きましたが、

これは明らかに間違っています。
bullet[BULLET_MAX]という、配列の範囲外の要素に書き込もうとしているからです。
そうではなく、C++であれば...

std::fill_n(bullet, BULLET_MAX, Bullet());

とすれば、配列の各要素をゼロクリアできます。

レッドリ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#10

投稿記事 by レッドリ » 15年前

>たかぎさん
STL使うんですか~なるほどです。

それと…何度も本当にすみませんが、
最後にもう一つ質問させてください。

構造体の構造体の配列の初期化についてです。
struct Bullet{
        int flag,img,count;
        double x,y,angle,speed,size;
};

struct EnemyShot{
        int flag,kind,count;
        Bullet bullet[BULLET_MAX];
};

EnemyShot enemyshot[ENEMYSHOT_MAX];
という場合は

std::fill_n(enemyshot, ENEMYSHOT_MAX, EnemyShot());
をゲームを始める前の初期化関数内で行うと、ゲーム画面で

ハンドルされていない例外が発生しました

というエラーが出て強制終了してしまいます。

おそらく
Bullet bullet[BULLET_MAX];を初期化してないからかなと思うので
初期化しようと思ったのですが
これは、構造体の構造体という状態なので、
std::fill_n(bullet, BULLET_MAX, Bullet());
とすることはできないみたいです。
struct EnemyShot{
        int flag,kind,count;
        Bullet bullet[BULLET_MAX];
        std::fill_n(bullet, BULLET_MAX, Bullet()); 
};
とすると案の定エラーが出てしまいます。
この場合の初期化法は、存在するでしょうか? 画像

たかぎ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#11

投稿記事 by たかぎ » 15年前

> EnemyShot enemyshot[ENEMYSHOT_MAX];
> という場合は std::fill_n(enemyshot, ENEMYSHOT_MAX, EnemyShot()); をゲームを始める前の初期化関数内で行うと、ゲーム画面で ハンドルされていない例外が発生しました というエラーが出て強制終了してしまいます。

その初期化方法で問題ありません。
どこで例外が発生したのかがわかれば、もう少し気の利いた回答ができるかもしれません。

> おそらく Bullet bullet[BULLET_MAX];を初期化してないからかなと思うので 初期化しようと思ったのですが

そんなことはありません。
EnemyShot()とすることで、入れ子になった配列も構造体も含めた全メンバがゼロクリアされます。
配列の要素数が非常に大きいような場合には、もしかするとスタックが足りなくなっているのかもしれませんが、普通に考えてそんなことはないと思います。

レッドリ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#12

投稿記事 by レッドリ » 15年前

早速の回答ありがとうございます。


>その初期化方法で問題ありません。
そうなんですか、
これでまとめて初期化してくれるんですね。
ありがたいです。

>どこで例外が発生したのかがわかれば、もう少し気の利いた回答ができるかもしれません。

詳細を全然こたえていなくてすみません…。
ここで、エラーが起きます。

title();

init();
↓<-----------------エラー発生
gamemain();

titleで、gamestartを選択するといきなりウィンドウが
シャットアウトします。
void init(){

初期化うんぬん

std::fill_n(bullet, BULLET_MAX, Bullet());
}

init()が過ぎたあとでエラーの矢印がついてました。
//std::fill_n(bullet, BULLET_MAX, Bullet());
としてコメントアウトにし、memsetで初期化をすると、エラーが出なくなったのですが
浮上小数点を含む構造体なので、できればmemsetを避けたいのです。

>配列の要素数が非常に大きいような場合には、もしかするとスタックが足りなくなっているのかもしれませんが、

そういえば、エラーは2種類ありました。

Stack overflow というエラーと

ハンドルされていない例外が発生しました

の2つでした。

因みに配列数は900です。多いでしょうか? 画像

たかぎ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#13

投稿記事 by たかぎ » 15年前

BULLET_MAXはいくらですか?
あと、enemyshotの定義はどこで行っていますか?(自動変数かどうかで状況が変わります)

レッドリ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#14

投稿記事 by レッドリ » 15年前

BULLET_MAXは900です。

enemyshotの定義は、

gloval_extern.h-----------------

#ifndef _Header_
#define _Header_

EnemyShot enemyshot[ENEMYSHOT_MAX];

#endif

--------------------------------

という感じでグローバル変数にしています。
自動変数です。 画像

たかぎ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#15

投稿記事 by たかぎ » 15年前

問題の再現するソースを出してもらった方がよさそうですね。
私の場合、Macなので、DXライブラリの確認は結構手間なのですが、誰か回答してくれるでしょう。

box

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#16

投稿記事 by box » 15年前

> という感じでグローバル変数にしています。
> 自動変数です。

当方のつたない知識では、グローバル(外部)変数かつ自動変数という変数は
あり得ないことになっているのですが…。

自動変数とは、関数(ブロックという方がいいかな?)の内部で定義する変数のうち、
staticでないものを指し、当該の関数(もしくはブロック)に入るときに生まれて、
抜けるときに死ぬ、という変数だと思ってました。

くだんの#ifndef~#endifが、関数(もしくはブロック)の中にあるのですか?

レッドリ

Re:構造体のdouble型メンバをまとめてゼロで初期化するには

#17

投稿記事 by レッドリ » 15年前

無事できました。
原因は配列のout of rangeでした。
ENEMYSHOT_MAXとENEMY_MAXが30と40で
30番目以上のENEMY側が、ENEMYSHOT_MAXの上限を超えた30番目以上のENEMYSHOTを呼び出して
メモリーエラーをしていたみたいです。
お騒がせいたしました。

>グローバル(外部)変数かつ自動変数という変数は
あり得ないことになっているのですが…。

間違えました。自分の中ではstatic付けてないものは全部自動変数と思い込んでいました。
ローカル変数じゃないので自動じゃなかったですね…。

今回は本当に勉強になりました。
みなさん、ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る