C言語何でも質問掲示板


Total hit  今日  昨日  

必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   D3DCOLOR型で定義した ....   
     ・[57008] シエル 
     ・[57010] 御津凪 
     ・[57011] DVDM 
   教えてください!!   
     ・[56995] シエル 
     ・[56996] 白い時空 
     ・[56997] 黒猫 
   玉が動かない   
     ・[56802] bun 
     ・[56816] めるぽん 
     ・[56885] bun 
     ・[56894] めるぽん 
     ・[56986] bun 
     ・[56987] スキマ妖怪 
     ・[56988] ISLe 
   ターン制について   
     ・[56842] Justy 
     ・[56844] gyt 
     ・[56847] Justy 
     ・[56848] gyt 
     ・[56852] Lbfuvab 
     ・[56854] gyt 
     ・[56898] TKOZ 
     ・[56906] lbfuvab 
     ・[56910] gyt 
     ・[56984] lbfuvab 
     ・[56985] lbfuvab 
   DXライブラリの文字 ....   
     ・[56978] Justy 
     ・[56979] ビッグバンベーダー 
   疑似乱数数列を使って ....   
     ・[56970] ドラ 
     ・[56971] box 
     ・[56972] academic 
     ・[56973] dic 
     ・[56975] 山本 
   無題   
     ・[56943] めるぽん 
     ・[56961] へろり 
   比率を返す関数   
     ・[56947] fatens 
     ・[56960] 錦鯉 
   ダメージ計算について ....   
     ・[56729] パコネコ 
     ・[56730] Dixq (管理人) 
     ・[56732] パコネコ 
     ・[56733] Dixq (管理人) 
     ・[56734] パコネコ 
     ・[56735] Dixq (管理人) 
     ・[56736] パコネコ 
     ・[56738] やっくん 
     ・[56740] Dixq (管理人) 
     ・[56745] softya 
     ・[56747] パコネコ 
     ・[56749] softya 
     ・[56751] パコネコ 
     ・[56772] やっくん 
     ・[56806] へろり 
     ・[56819] やっくん 
     ・[56821] imoinu 
     ・[56825] dic 
     ・[56837] パコネコ 
     ・[56855] ISLe 
     ・[56862] softya 
     ・[56892] kaiten 
     ・[56901] パコネコ 
     ・[56953] Kou 
     ・[56954] パコネコ 
   うまくいきません・・ ....   
     ・[56937] dic 
     ・[56945] gyt 
     ・[56952] dic 
   コンパイルが出来ませ ....   
     ・[56922] ookami 
     ・[56923] pooka 
     ・[56951] nobita 
   処理落ちについて   
     ・[56950] めるぽん 
   イベントログ読み込み   
     ・[56891] へろり 
     ・[56896] YuO 
     ・[56899] mila 
     ・[56916] へろり 
     ・[56949] ikara 
     ・[568901280204020] ikara 
     ・[568901280498855] ikara 
   ウィンドウ移動中に処 ....   
     ・[56942] めるぽん 
   関数呼び出しを簡略化 ....   
     ・[56934] ドラ 
     ・[56935] ISLe 
     ・[56938] dic 
     ・[56939] オーシロ 
   vector<string> ....   
     ・[56925] めるぽん 
     ・[56926] たいちう 
     ・[56933] めるぽん 
     ・[56936] dic 
   画像が読み込めません   
     ・[56928] シエル 
     ・[56929] とかげ 
     ・[56930] softya 
     ・[56932] とかげ 
   C言語の初歩的な質問で ....   
     ・[56914] box 
     ・[56915] しろ 
     ・[56917] へろり 
     ・[56918] しろ 
     ・[56920] へろり 
     ・[56921] しろ 
   背景の透明化   
     ・[56895] 組木紙織 
     ・[56903] atpiza 
     ・[56905] 組木紙織 
     ・[56907] シエル 
     ・[56908] atpiza 
     ・[56909] atpiza 
   全角文字と半角文字の ....   
     ・[56883] へろり 
     ・[56886] ドラ 
     ・[56904] やっくん 
   三角関数をつかって移 ....   
     ・[56841] シエル 
     ・[56845] 白い時空 
     ・[56846] ookami 
     ・[56858] KEN 
     ・[56884] へろり 
     ・[56897] TKOZ 
     ・[56900] TKOZ 
   BitBltは一回だけ?   
     ・[56739] ISLe 
     ・[56768] シエル 
     ・[56805] 爺プログラマー 
     ・[56807] へろり 
     ・[56810] シエル 
     ・[56850] ISLe 
     ・[56889] 爺プログラマー 
   WEBブラウザ   
     ・[56861] たかぎ 
     ・[56864] ☆ 
     ・[56865] softya 
     ・[56866] softya 
     ・[56869] ★ 
     ・[56871] ☆ 
     ・[56881] ☆ 
     ・[56887] へろり 
     ・[56888] ☆ 
   エラーで3週間ぐらい ....   
     ・[56872] めるぽん 
     ・[56873] まさ 
     ・[56874] まさ 
     ・[56875] めるぽん 
     ・[56876] まさ 
     ・[56878] めるぽん 
     ・[56879] まさ 
     ・[56880] めるぽん 
     ・[56882] まさ 
   クラスの効率の良い使 ....   
     ・[56857] ISLe 
     ・[56859] シエル 
     ・[56863] めるぽん 
     ・[56867] シエル 
   回転   
     ・[56822] ookami 
     ・[56843] Justy 
     ・[56856] KEN 
   while中のint   
     ・[56715] だいちゃん 
     ・[56716] たかぎ 
     ・[56717] へろり 
     ・[56718] 深黒 
     ・[56719] ookami 
     ・[56720] へろり 
     ・[56724] ISLe 
     ・[56725] めるぽん 
     ・[56726] ookami 
     ・[56737] ISLe 
     ・[56803] へろり 
     ・[56814] たかぎ 
     ・[56815] ookami 
     ・[56828] ぽこ 
     ・[56831] たかぎ 
     ・[56853] ISLe 
   マウス操作について   
     ・[56748] パコネコ 
     ・[56753] 白い時空 
     ・[56757] シエル 
     ・[56820] gyt 
     ・[56838] パコネコ 
     ・[56840] gyt 
   ファイルを読み込まな ....   
     ・[56826] dic 
     ・[56835] パコネコ 
   C言語のfor文問題   
     ・[56752] パコネコ 
     ・[56754] パコネコ 
     ・[56756] ぽこ 
     ・[56758] パコネコ 
     ・[56759] MAY 
     ・[56761] シエル 
     ・[56762] パコネコ 
     ・[56763] ぽこ 
     ・[56764] パコネコ 
     ・[56765] パコネコ 
     ・[56766] MAY 
     ・[56767] パコネコ 
     ・[56769] MAY 
     ・[56770] KKK 
     ・[56771] シエル 
     ・[56773] MAY 
     ・[56774] パコネコ 
     ・[56775] KKK 
     ・[56776] パコネコ 
     ・[56777] パコネコ 
     ・[56779] KKK 
     ・[56780] MAY 
     ・[56781] パコネコ 
     ・[56782] パコネコ 
     ・[56783] MAY 
     ・[56784] KKK 
     ・[56785] パコネコ 
     ・[56786] パコネコ 
     ・[56787] MAY 
     ・[56788] パコネコ 
     ・[56789] MAY 
     ・[56790] ぽこ 
     ・[56791] パコネコ 
     ・[56792] パコネコ 
     ・[56793] MAY 
     ・[56794] MAY 
     ・[56795] パコネコ 
     ・[56796] パコネコ 
     ・[56797] MAY 
     ・[56798] パコネコ 
     ・[56799] MAY 
     ・[56800] MAY 
     ・[56804] KKK 
     ・[56808] さかまき 
     ・[56834] パコネコ 
   ifの条件を抜けた後   
     ・[56811] へろり 
     ・[56812] シエル 
     ・[56813] さかまき 
     ・[56817] わたつみ 
     ・[56818] さかまき 
     ・[56829] スキマ妖怪 
     ・[56830] わたつみ 
   最小化すると動かない   
     ・[56590] やっくん 
     ・[56657] X 
     ・[56823] ookami 
   文字を表示できません   
     ・[56742] ISLe 
     ・[56743] Dixq (管理人) 
     ・[56755] ぷにょ 
     ・[56760] シエル 
     ・[56778] ぷにょ 
   ボタンについて   
     ・[56712] 山崎 
     ・[56713] シエル 
     ・[56723] いむ 
     ・[56727] dic 
   クォータービューでの ....   
     ・[56399] パコネコ 
     ・[56405] MNS 
     ・[56413] ぽこ 
     ・[56415] パコネコ 
     ・[56444] MNS 
     ・[56463] パコネコ 
     ・[56465] TKOZ 
     ・[56499] TKOZ 
     ・[56507] ぽこ 
     ・[56573] TKOZ 
     ・[56591] MNS 
     ・[56660] TKOZ 
     ・[56661] TKOZ 
     ・[56662] ぽこ 
     ・[56665] ぽこ 
     ・[56667] TKOZ 
     ・[56673] ぽこ 
     ・[56678] TKOZ 
     ・[56679] ぽこ 
     ・[56680] ぽこ 
     ・[56686] 白い時空 
     ・[56706] ぽこ 
     ・[56711] ぽこ 
     ・[56722] TKOZ 
   学校の課題が分かりま ....   
     ・[56624] かむかむ 
     ・[56628] シエル 
     ・[56630] シエル 
     ・[56635] パコネコ 
     ・[56637] へろり 
     ・[56721] バグ 
   コンマ以前の部分を削 ....   
     ・[56708] ドラ 
     ・[56709] フリオ 
     ・[56710] shiro4ao 
   みなさんの力をお貸し ....   
     ・[56684] ぽこ 
     ・[56685] derorian 
     ・[56687] ぽこ 
     ・[56688] derorian 
     ・[56689] ぽこ 
     ・[56690] derorian 
     ・[56692] ぽこ 
     ・[56693] derorian 
     ・[56694] ぽこ 
     ・[56695] derorian 
     ・[56696] derorian 
     ・[56697] ぽこ 
     ・[56698] ぽこ 
     ・[56699] derorian 
     ・[56701] ぽこ 
     ・[56702] derorian 
     ・[56703] ぽこ 
     ・[56704] derorian 
     ・[56705] ぽこ 
   ファイルポインタの正 ....   
     ・[56655] スキマ妖怪 
     ・[56656] ゆーずぃ 
     ・[56659] スキマ妖怪 
     ・[56675] あまち 
     ・[56676] フリオ 
     ・[56700] ゆーずぃ 
   リリースビルドでの垂 ....   
     ・[56642] あ〜る 
     ・[56643] あ〜る 
     ・[56644] あ〜る 
     ・[56691] あ〜る 
   CSVファイルの読み書き ....   
     ・[56670] シエル 
     ・[56671] shiro4ao 
     ・[56674] shiro4ao 
     ・[56677] シエル 
     ・[56681] shiro4ao 
   コンパイルが出来ない   
     ・[56668] box 
     ・[56672] MAY 
   c言語のポインタ   
     ・[56473] たいちう 
     ・[56578] TKOZ 
     ・[56658] TKOZ 
     ・[56664] dic 
   [雑談]13日の金曜日の ....   
     ・[56599] box 
     ・[56600] TKOZ 
     ・[56601] TKOZ 
     ・[56605] box 
     ・[56626] toyo 
     ・[56633] 組木紙織 
     ・[56638] へろり 
     ・[56663] TKOZ 
   許される配列の限度[雑 ....   
     ・[56565] Dixq (管理人) 
     ・[56566] softya 
     ・[56570] へろり 
     ・[56620] ゆーずぃ 
     ・[56631] へろり 
     ・[56639] softya 
     ・[56641] へろり 
     ・[56653] ゆーずぃ 
   デバックなしで開始が ....   
     ・[56648] シエル 
     ・[56649] Mist 
     ・[56652] Dixq (管理人) 
   キャラクターの絵画の ....   
     ・[56650] やっくん 
     ・[56651] へろり 
   途中からの読み込み   
     ・[56561] だいちゃん 
     ・[56568] 秋色 
     ・[56571] softya 
     ・[56592] 秋色 
     ・[56593] dic 
     ・[56594] box 
     ・[56596] 白い時空 
     ・[56603] 秋色 
     ・[56606] みつ 
     ・[56625] 秋色 
     ・[56645] 秋色 

Name: DVDM [URL]  ..熟練のプログラマー(52,460ポイント)   Date: 2010/07/20(火) 18:48   No:57006       
Title: D3DCOLOR型で定義した変数のアルファ値のみを変更するには    
D3DCOLOR(unsigned long) 型で定義した変数のアルファ値のみを変更する方法が解らないです。

<d3d9types.h>に記述されていた D3DCOLOR_ARGB マクロには

#define D3DCOLOR_ARGB(a,r,g,b) \
  ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

このように記述されていて、先頭から8ビット毎に区切られ、ARGB という情報になっているようです。


D3DCOLOR 型の変数を仮に Color とし、
下記のように記述するとアルファ値は変わったのですが、ついでに色も変わってしまいました。
Color = ( (Color&0x0FFF) | (設定したいアルファ値<<24) );

(Color&0x0FFF) これで RGB の情報を抜き出そうとしています。
その抜き出した値とシフトしたアルファ値とを OR 演算すれば
アルファ値が変わるだろうと思ってこのような記述になってます。



どのようにビット演算を行えばアルファ値のみを変更できるのでしょうか。
もし宜しければアドバイスお願い致します。


OS:XP
コンパイラ:Visual C++ 2008 Express Edition(編集箇所)
ライブラリ:DirectX SDK (October 2006) 編集済み


510ポイント を落としてしまった。


Name: シエル  ..プログラマー(29,477ポイント)   Date: 2010/07/20(火) 19:21   No:57008     
Title: Re:D3DCOLOR型で定義した変数のアルファ値のみを変更するには    
私もDirectXを猛勉強中ですので、間違っているかもしれませんが、
D3DCOLOR型の情報は下記のように左からFF二つでアルファ値、以降は二つずつで
赤、緑、青の値を表していると思います。

  A  R  G  B
0xFFFFFFFF

ですので、赤色にアルファ値を足したい場合は、

0x00FF0000 | (設定したいアルファ値<<24)

とすれば、いけるような気がします。

まだ勉強中なので完全に間違っているかもしれませんが、よろしくお願いします。 編集済み


111ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(145,170ポイント)   Date: 2010/07/20(火) 19:44   No:57010     
Title: Re:D3DCOLOR型で定義した変数のアルファ値のみを変更するには    
> Color = ( (Color&0x0FFF) | (設定したいアルファ値<<24) ); 

では下位12ビット分しか保持できていません。
単純なマスク値の間違いです。

D3DCOLOR型は各色の表現範囲は 0 〜 255 (0x00 〜 0xff) なので、0 〜 23 ビットを保持するようにマスクをかける必要があります。

シエルさんの色要素と各ビットとの対応は正しいので正解ですよ。
ただし、色要素の順序が正反対のフォーマット(BGRA)や、アルファ要素のないフォーマット(XRGB)もありますので注意です。


ちなみに関係ない話ですが、
DirectX には float 版の D3DCOLORVALUE型があり、こちらは 0.0f 〜 1.0f の(上限・下限を超えた場合は丸められる)範囲で表現します。
(DX9 ではマテリアルやライトなどの構造体で、DX10以降は全般的に使用されています)

また、 C++ では D3DCOLOR を継承した D3DXCOLOR 構造体があるので、
こちらを使ってみるのもいいかと思います。


324ポイント を手に入れた。

Name: DVDM [URL]  ..熟練のプログラマー(52,766ポイント)   Date: 2010/07/20(火) 20:29   No:57011 解決!     
Title: Re:D3DCOLOR型で定義した変数のアルファ値のみを変更するには    
>>シエルさん
> 0x00FF0000 | (設定したいアルファ値<<24)
> とすれば、いけるような気がします。 

unsigned long がいつの間にか16ビットになっていたようですね;
ありがとうございます!
その方法でばっちり直りました!

シエルさんも DirectX 使いですか〜。
覚えることが沢山あって大変ですがお互い頑張りましょう〜



>>御津凪さん
>下位12ビット分しか保持できていません。
確かに仰るとおりです…。

> D3DCOLORVALUE型・D3DXCOLOR 構造体
以前制作していた STG では D3DXCOLOR 構造体を使用していましたが
D3DCOLOR の方も気になっていたので練習も兼ねて今回のプロジェクトではこちらを選びました。

また、D3DCOLORVALUE 型も気になっていたのですが、
やはり0〜255の方が馴染み深かったので D3DCOLOR の方を選びました。


> 色要素の順序が正反対のフォーマット(BGRA)や、
> アルファ要素のないフォーマット(XRGB)もありますので注意です。 

RGBA や XRGB は聞いたことありますけど BGRA は始めて聞きました。
今の所は ARGB というフォーマットが変わることはないと思うので
こういうのもあるんだなと覚えておきます!


シエルさん・御津凪さん、御回答ありがとうございました!


306ポイント を手に入れた。



Name: 黒猫  ..入門者(3,435ポイント)   Date: 2010/07/20(火) 12:33   No:56994       
Title: 教えてください!!    
こんにちは。
ファイルの中の文字を読み取ってtxtに書き込むものを作ってるのですが、
yesって入力したときだけ書き込んでいきたいのですが、上手くできません。
指摘お願いします。

現在は下記のようにしていますが、yesってしても終わってしまいます。

    printf("ファイル名>>>");
    scanf("%20s", filename);

    if((in = fopen(filename, "r")) == NULL){
        printf("ファイルが開きません\n");
        exit(1);
    }
/*---------書き込みのためにファイルを開ける---------*/
    if((out = fopen("name.txt", "w")) == NULL){
        printf("ファイルが開きません\n");
        exit(1);
    }

    printf("上書きをしますか? yes/no \n");
    scanf("%3s", answer);
/*---------ファイルの読み込みと文字列検索-----------*/
    if(answer == "yes"){
    :
    :
    :
    :
    :
    :
    :
    


308ポイント を手に入れた。


Name: シエル  ..プログラマー(29,366ポイント)   Date: 2010/07/20(火) 12:37   No:56995     
Title: Re:教えてください!!    
strcmp

5ポイント を手に入れた。

Name: 白い時空  ..入門者(3,595ポイント)   Date: 2010/07/20(火) 12:49   No:56996     
Title: Re:教えてください!!    
answer == "yes"
これが駄目です。C言語ではこのような文字列の比較はできません。strcmp関数を使い
strcmp(answer,"yes")==0
と、変更してください。


43ポイント を手に入れた。

Name: 黒猫  ..入門者(3,425ポイント)   Date: 2010/07/20(火) 13:04   No:56997 解決!     
Title: Re:教えてください!!    
ありがとうございます!!

10ポイント を落としてしまった。



Name: bun  ..初心者(5,534ポイント)   Date: 2010/07/16(金) 09:26   No:56801       
Title: 玉が動かない    
http://sasuke.main.jp/javaburokku.html
上記のサイトを参考に、2次元マップを作りブロック崩しを作成したのですが、ブロックを崩す玉が動きません。おそらくスレッドの部分に問題があってアニメーションが出ないのだと思いますが、どこがおかしいかわかりません。どなたかご協力お願いします。
ソースは長いので次の書き込みに続きます。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class TileBasedGame extends Applet implements  Runnable{

  Thread  th;
  //マップの作成
  char map[][];
  int MX = 15, MY = 20;
  String map_str[] = {"VVV               ",//V:ブロック
                      "        VVV       ",
                      "               ",
                      "   VVV            ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "    T           ",//T:玉
                      "    M           ",//M:玉を弾くラケット
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               "}; 
  int  x = 5;//バーの座標
  int  y = 11;
  int  c_r = 0;//残りブロック数のカウント
  int  b_x = 5;//ボールの座標
  int  b_y = 10;
  int  b_xu = 1;//ボールの動き
  int  b_yu = -1;
  int  gam_f = 0;//ゲーム状況フラグ
  boolean  key_m;//右キーが押されたときtrue
  boolean  key_h;//左キーが押されたときtrue
  //ダブルバッファ関連
  Dimension  d;
  int  w,  h;//画面サイズ
  Image  buff;    //  ダブルバッファリング用のバッファ
  Graphics  buff_g;  //  ダブルバッファリング用のグラフィックス
  //画像用
  Image  img1;
  Image  img2;
  Image  img3;
  Image  img4;
  int img3_x, img3_y; 
  int img4_x, img4_y;

  public void init() {
    // 画像の読み込み
    img1 = getImage(getDocumentBase(),"hai.gif");
    img2 = getImage(getDocumentBase(),"buro.gif");
    img3 = getImage(getDocumentBase(),"tama.gif");
    img4 = getImage(getDocumentBase(),"bar.gif");

    th  =  new  Thread(this);//スレッドインスタンス化    
    addKeyListener(
      new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        int dir = -1;
          switch ( key ) {
            case 37: dir = 2; break;// left
            case 39: dir = 0; break;// right
          }
        if ( dir >= 0 ) img4Move(dir);
        repaint();
        }
      }
    );

    //マップの周囲を見えない壁で囲む
    map = new char[MY+2][MX+2];
    for (int x = 0; x <= MX+1; x++) {
      map[0][x] = 'B'; 
      map[MY+1][x] = 'B';
    }
    for (int y = 0; y <= MY+1; y++) {//マップデータの読み込み
      map[y][0] = 'B'; 
      map[y][MX+1] = 'B';
    }  
    for (int y = 1; y <= MY; y++) {
      for (int x = 1; x <= MX; x++) {
        map[y][x] = map_str[y-1].charAt(x-1);
        if ( map[y][x] == 'T' ) {
          img3Set(x, y);
        }
        if ( map[y][x] == 'M' ) {
          img4Set(x, y);
        }
      }
    }  
 }

  


998ポイント を手に入れた。


Name: bun  ..初心者(7,087ポイント)   Date: 2010/07/16(金) 09:28   No:56802     
Title: 続き    
public  void  update(Graphics  g){
    paint(g);
  }
  void  rise(){
    x  =  5;
    y  =  11;
  
    c_r  =  0;
    
    b_x  =  5;
    b_y  =  10;
    
    b_xu  =  1;
    b_yu  =  -1;
    
  }

  public void paint(Graphics g) {//描画
     g.drawImage(img1,0,0,this);
     c_r  =  0;
     for (int y = 1; y <= MY; y++) {
      for (int x = 1; x <= MX; x++) {
       int xx = 40*x+20, yy = 40*y+200;
       switch ( map[y][x] ) {
        case 'V': g.setColor(Color.green);
                    g.fillRect(xx, yy, 10, 5);                   
                    c_r  =  c_r  +  1;
                    break;
        }
      }
    }
     img3Draw(g);
     img4Draw(g);

 if(c_r==0){
      gam_f  =  3;
    }        
    switch(gam_f)
    {
    case  0:     
      break;
    case  1:      
      break;
    case  2:
      buff_g.drawString("GAME  OVER",100,500);
      rise();
      break;
    case  3:
      buff_g.drawString("GAME  CLEAR",100,500);
      rise();
      break;
    }    
    g.drawImage(buff,  0,  0,  this);  
 }

  public  void  run(  ){
    
    while(true){
      

      
      
      switch(gam_f)//ゲーム状況により処理
      {
      case  0:
        
        break;
      case  1:
          //バーの移動
          if(key_m==true  &&  x!=11){
                  x  =  x  +  1;
          }
          
          if(key_h==true  &&  x!=0){
                  x  =  x  -  1;
          }
          
          img3Move();
          break;
      }      
      repaint();//画面更新
      
      try{
        th.sleep(100);//0.01秒止める
      }catch(InterruptedException  e){        
      }
    }
  }
  
  public void img3Set(int x, int y) {
    img3_x = x;
    img3_y = y;
  }

  public void img4Set(int x, int y) {
    img4_x = x;
    img4_y = y;
  }

  public void img3Draw(Graphics g) {
    g.drawImage(img3,40*img3_x+15,40*img3_y+30, this);
  }

  public void img4Draw(Graphics g) {
    g.drawImage(img4,40*img4_x,40*img4_y, this);
  }

  void img3Move(){//ボールを動かす処理、接触判定  

    b_x  =  b_x  +  b_xu;
    b_y  =  b_y  +  b_yu;
    
   //ブロックとの接触判定
    if(map[b_y][b_x]==1){
      map[b_y][b_x]=0;
      if(b_yu==1){
        b_yu  =  -1;
      }else{
        b_yu  =  1;
      }      
    }
    //壁との接触判定
    if(b_xu==-1&&b_x==0){
      b_xu=1;
    }    
    if(b_xu==1&&b_x==14){
      b_xu=-1;
    }    
    if(b_yu==-1&&b_y==0){
      b_yu=1;
    }    
    if(b_yu==1&&b_y==19){
      if((b_x==x&&b_y==y)||(b_x==x+1&&b_y==y) 
                  ||  (b_x==x+2&&b_y==y)  ||  (b_x==x+3&&b_y==y)){
        if(key_m==true&&b_x<=12){
          b_x=b_x+1;
        }        
        if(key_h==true&&b_x>=5){
          b_x  =  b_x-1;
        }        
        b_yu=-1;        
        b_y=b_y-1;        
      }else{
        gam_f=2;
      }
   }
}
  public void img4Move(int dir) {
    int dx = 0, dy = 0;
    switch ( dir ) {
    case 0: dx =  1; break; // right
    case 2: dx = -1; break; // left
    }
    if ( dx == 0 && dy == 0 ) return;
    if ( map[img4_y+dy][img4_x+dx] == 'B' ) return;
    img4_x += dx; img4_y += dy;
  }
  public  void  keyPressed(KeyEvent  e)  {
    if(e.getKeyText(e.getKeyCode())=="Space"){
      gam_f  =  1;
    }
 }
}



1,553ポイント を手に入れた。

Name: めるぽん  ..初心者(5,287ポイント)   Date: 2010/07/16(金) 14:06   No:56816     
Title: Re:続き    
ボールを描画する img3Draw メソッドは img3_x と img3_y を使って描画をしているみたいなのですが、
それらの値を更新する img3Set メソッドが初期化時しか呼ばれていないようです。

b_x や b_y を img3_x と img3_y に反映させないと描画される位置が変わらないんじゃないでしょうか。
もしくは img3_x や img3_y を使わず、img3Draw の中で b_x や b_y を使って描画してもいいと思います。


29ポイント を手に入れた。

Name: bun  ..初心者(7,670ポイント)   Date: 2010/07/17(土) 07:41   No:56885     
Title: Re:続き    
ご回答ありがとうございます。
b_x や b_y を img3_x と img3_y に反映させるのを以下のようにやってみました。
ただ、「img3Set メソッドが初期化時しか呼ばれていないようです。」に関してはどうやったらいいのかわからなかったので、具体的にどのようにしたらよいか説明していただけないでしょうか?

public void img3Set(int x, int y) {
    img3_x = x;
    img3_y = y;

  }

  public void img4Set(int x, int y) {
    img4_x = x;
    img4_y = y;
  }

  public void img3Draw(Graphics g) {    
    g.drawImage(img3,40*img3_x+15,40*img3_y+30, this);
 
}

  public void img4Draw(Graphics g) {
    g.drawImage(img4,40*img4_x,40*img4_y, this);
  }

  void img3Move(){//ボールを動かす処理、接触判定  

    b_x  =  b_x  +  b_xu;
    b_y  =  b_y  +  b_yu;
    
   //ブロックとの接触判定
    if(map[b_y][b_x]==1){
      map[b_y][b_x]=0;
      if(b_yu==1){
        b_yu  =  -1;
      }else{
        b_yu  =  1;
      }      
    }
    //壁との接触判定
    if(b_xu==-1  &&  b_x==0){
      b_xu  =  1;
    }    
    if(b_xu==1  &&  b_x==14){
      b_xu  =  -1;
    }    
    if(b_yu==-1  &&  b_y==0){
      b_yu  =  1;
    }    
    if(b_yu  ==  1  &&  b_y==19){
      if((b_x==x  &&  b_y==y)  ||  (b_x==x+1  &&  b_y==y) 
                  ||  (b_x==x+2  &&  b_y==y)  ||  (b_x==x+3  &&  b_y==y)  ){
        if(key_m==true  &&  b_x<=12){
          b_x  =  b_x+1;
          img3_x = b_x;  
        }        
        if(key_h==true  &&  b_x>=5){
          b_x = b_x-1;
          img3_x = b_x; 
        }        
        b_yu = -1;        
        b_y = b_y - 1;        
        img3_y = b_y;
      }else{
        gam_f  =  2;
      }
   }
}


583ポイント を手に入れた。

Name: めるぽん  ..初心者(6,476ポイント)   Date: 2010/07/17(土) 15:33   No:56894     
Title: Re:続き    
「それらの値を更新する img3Set メソッドが初期化時しか呼ばれていない」というのは、img3_x と img3_y の値が初期化時以外で更新されてないというのを言いたかっただけです。
img3_x と img3_y を更新することで無事ボールは動くようになりましたか?


63ポイント を手に入れた。

Name: bun  ..初心者(7,700ポイント)   Date: 2010/07/20(火) 02:45   No:56986     
Title: Re:続き    
すいません。やっぱり動きません。
どこかで何か抜けているのか、定義の仕方が間違っているのでしょうか?


30ポイント を手に入れた。

Name: スキマ妖怪  ..入門者(2,893ポイント)   Date: 2010/07/20(火) 03:07   No:56987     
Title: Re:続き    
よくは見てないし、関係あるか分からないですが、
Threadクラスって作成しただけでスレッド起動するんですか?


javaは知らなので、間違ってたらすいません;


60ポイント を手に入れた。

Name: ISLe  ..初心者(8,165ポイント)   Date: 2010/07/20(火) 03:18   No:56988     
Title: Re:続き    
> Threadクラスって作成しただけでスレッド起動するんですか?

インスタンス作っただけでは起動しません。
startメソッド呼んでませんね。


24ポイント を手に入れた。



Name: gyt  ..ぴよぴよ(560ポイント)   Date: 2010/07/16(金) 20:02   No:56832       
Title: ターン制について    
オセロや将棋などのボードゲームに使われているターン制をプログラムで書くにはどのように考えればいいのでしょうか?
自分が駒を置く(動かす)と相手の番になるようなプログラムを書きたいです。
が、考え方が分かりません(T.T)

int junban=0;のようにして自分が操作し終わったらjunban=1;のようにし、junbanが1なら相手、0なら自分のような考え方でいいのでしょうか?

もし、もっと楽でスマートな考え方があったら教えてください。
できれば簡単な例なども教えてくださると嬉しいです

ご指南お願いします。


146ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(556,572ポイント)   Date: 2010/07/16(金) 21:54   No:56842     
Title: Re:ターン制について    
>junbanが1なら相手、0なら自分のような考え方でいいのでしょうか? 
 それでいいと思います。
 intじゃなくて enumを使って明示的に誰の手番かを表せば判りやすくてもっといいですね。


63ポイント を落としてしまった。

Name: gyt  ..ぴよぴよ(630ポイント)   Date: 2010/07/16(金) 21:59   No:56844     
Title: Re:ターン制について    

Justyさん、回答ありがとうございます。


そこで質問なのですが、enumを使うとintを使ったときとどう変わるのでしょうか?
いまいちenumについて理解できてないので、教えてくださると助かります。



65ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(556,724ポイント)   Date: 2010/07/16(金) 22:18   No:56847     
Title: Re:ターン制について    
>enumを使うとintを使ったときとどう変わるのでしょうか? 
 よく読み直してみたら、対戦相手も人間で交互に操作するくらいで、特に処理的に分岐することが
ないようであればintのままでもいいのかもしれません。

 ただ自分と相手とで処理を分けなければならないようなケース……例えば相手が CPUだったり、
ネットワーク先の対戦相手だったりしたのなら、

    enum Turn
    {
        Turn_Player,
        Turn_CPU
    };

とかしておいてソースコード上で 
    if(junban == Turn_Player)
とすれば見ただけでプレイヤーの番だと判ります。

    if(junban == 0)
とするよりは判りやすいはずです。

 又、デバッガで変数の値を参照するとき、多くの環境で enumの値はその名前で表示されます。
 Playerと CPUの2つくらいしか無い場合はあまり影響はないかもしれませんが、
種類が増えてきたとき見ただけでそれが何なのかわかるので、デバッグの効率も上がると思います。


398ポイント を手に入れた。

Name: gyt  ..ぴよぴよ(695ポイント)   Date: 2010/07/16(金) 22:27   No:56848 解決!     
Title: Re:ターン制について    

なるほど...
後々のことを考えるとenumを使ったほうが効率が良くなりそうですね。
例まで使っての説明、ありがとうございます。

参考にさせていただきます。


65ポイント を手に入れた。

Name: Lbfuvab  ..初心者(6,711ポイント)   Date: 2010/07/16(金) 22:45   No:56852     
Title: Re:ターン制について    
ここではオセロの話題とし、手を
typedef struct{
    int x,y;
}MOVE;

で表すものとすると

MOVE PlayerTurn(int Color);
MOVE ComTurn(int Color);

MOVE (*Turns[2])(void);

のようにしておくと、プレイヤー同士やCOM同士の実装が楽になるのでお勧めです。

ターンの切り替えは
Turn ^= 1;で良いんじゃないですか(0,1のみなら)


103ポイント を手に入れた。

Name: gyt  ..ぴよぴよ(581ポイント)   Date: 2010/07/16(金) 23:53   No:56854     
Title: Re:ターン制について    
typedef struct{
>     int x,y;
> }MOVE;
> 

> で表すものとすると

> MOVE PlayerTurn(int Color);
> MOVE ComTurn(int Color);

> MOVE (*Turns[2])(void);

> のようにしておくと、プレイヤー同士やCOM同士の実装が楽になるのでお勧めです。

このようにおくと、どのように楽になるのでしょうか?

また
> MOVE PlayerTurn(int Color);
> MOVE ComTurn(int Color);

のint Colorにはどのような意味があるのでしょうか?


> ターンの切り替えは
> Turn ^= 1;で良いんじゃないですか(0,1のみなら)

Turn ^=1;
の ^の意味が分かりません。orz
どのように使われていて、どのような意味を持つのでしょうか?

質問ばかりでスミマセン。
初歩的な質問だったらごめんなさい。





114ポイント を落としてしまった。

Name: TKOZ  ..比類無きプログラマー(73,364ポイント)   Date: 2010/07/17(土) 17:55   No:56898     
Title: Re:ターン制について    
Turn^=1;
の意味は、0と1を繰り返すという事です。
1とのXOR(排他的論理和)ですので、

XORを表を書いて説明すると

XOR
|0 0|→0
|1 0|→1
|0 1|→1
|1 1|→0
となります。

とここで、Turn=Turn XOR 1;として、Turnが初期値0だとすると、
どうなるでしょうか?

0 XOR 1なので、結果は1です。それをまたTurnに代入します。
今度は、1 XOR 1ですね?結果は、0です。それをまたTurnに代入します。
これを繰り返していく訳です。


121ポイント を手に入れた。

Name: lbfuvab  ..プログラマー(26,976ポイント)   Date: 2010/07/17(土) 21:07   No:56906     
Title: Re:ターン制について    
プレイヤー対COMのみの実装ならあまりメリットはないですが、
プレイヤー対プレイヤーやCOM対COMや過去対戦の読み込みを考えると結構メリットがありますよ。


63ポイント を手に入れた。

Name: gyt  ..ぴよぴよ(697ポイント)   Date: 2010/07/17(土) 22:11   No:56910     
Title: Re:ターン制について    

TKOZさん、
Turn^=1; 
の意味を教えていただきありがとうございます。
XORは授業で習ったので、理解しました。

lbfuvadさん、
>プレイヤー対プレイヤーやCOM対 COMや過去対戦の読み込みを考えると結構メリットがありますよ。
どのようなメリットなのでしょうか?
今作っているのはプレイヤー対COMなのですが、完成したら実装を増やすかもしれないので教えてくださると助かります(-人-)

質問ばかりでスミマセン。

皆さん、回答ありがとうございました。


116ポイント を手に入れた。

Name: lbfuvab  ..プログラマー(27,120ポイント)   Date: 2010/07/20(火) 02:00   No:56984     
Title: Re:ターン制について    
おお、続いてた。

私は

typedef MOVE (*ChoiceFunc_t)(int);

int Game(ChoiceFunc_t White,ChoiceFunc_t Black);

みたいなのを実体にしようと考えていました。

ええと、メリットとしては
1.構造が分かりやすくなるのでバグが減る(よりブラックボックス化出来る)
2.ブラックボックス化のメリットとして少ない労力でモード追加ができる

デメリットは
1.基本的に制御をとりっぱなし構造なのでGUIにするならマルチスレッド化がほぼ必須
2.そんなに機能追加しないなら無駄が多い


144ポイント を手に入れた。

Name: lbfuvab  ..プログラマー(27,121ポイント)   Date: 2010/07/20(火) 02:02   No:56985     
Title: Re:ターン制について    
追記です。

GUIなソフトでしっかりしたAIを組み込むならどっちにしてもマルチスレッドになります(一応プロセス間通信もありですが・・・


1ポイント を手に入れた。



Name: ビッグバンベーダー  ..ぴよぴよ(263ポイント)   Date: 2010/07/19(月) 21:57   No:56977       
Title: DXライブラリの文字入力について    
始めましてプログラミング初心者ですが、
c言語の参考書とDXライブラリのサンプルを見ながらゲームを作っている者です。

下のプログラムでつまずいてしまいました。


    char Name[25];//文字配列宣言

    strcpy(Name,"");//文字配列初期化

    int InputHandle;//データハンドル

    // 描画先を裏にする
    SetDrawScreen( DX_SCREEN_BACK ) ;

    // キー入力ハンドルを作る(キャンセルなし全角文字あり数値入力じゃなし)
    InputHandle = MakeKeyInput( 10 , FALSE , FALSE , FALSE );

    //作成したキー入力ハンドルをアクティブにする
    SetActiveKeyInput( InputHandle );

    while( !ProcessMessage() )
    {

        //入力が終了している場合は終了
        if( CheckKeyInput( InputHandle ) != 0 ) break;
    
        // 画面の初期化
        ClearDrawScreen() ;

        //入力途中の文字列を描画
        DrawKeyInputString( 0, 0, InputHandle );

        // 裏画面の内容を表画面に反映させる
        ScreenFlip() ;
    }


        //入力された文字列を所得
        GetKeyInputString( Name , InputHandle );


        if(Name!="")//もし入力してあるなら
        {
            //処理1
        }

        else//入力してないなら(文字を入力せずにEnterを押した場合)
        {
            //処理2
        }


文字を入力せずにEnterを押したとき、処理が処理2にいってほしいのですが、
処理2に行かず処理1にいってしまいます。
            
どうしても、解らないのでどうぞよろしくお願いいたします。


263ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(556,822ポイント)   Date: 2010/07/19(月) 22:25   No:56978     
Title: Re:DXライブラリの文字入力について    
>if(Name!="")//もし入力してあるなら 
 この処理はポインタの比較であって、文字列が空であるかどうかを調べていません。

http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=%EF%BC%A3%E8%A8%80%E8%AA%9E+%E6%96%87%E5%AD%97%E5%88%97+%E6%AF%94%E8%BC%83&num=50


98ポイント を手に入れた。

Name: ビッグバンベーダー  ..ぴよぴよ(291ポイント)   Date: 2010/07/19(月) 22:42   No:56979 解決!     
Title: Re:DXライブラリの文字入力について    
strcmp関数を使ったら無事解決できました。
勉強になりました。
本当に、ありがとうございました。


28ポイント を手に入れた。



Name: 山本  ..ぴよぴよ(42ポイント)   Date: 2010/07/19(月) 18:57   No:56969       
Title: 疑似乱数数列を使って円周率を求める    
正方形の面積を1、扇形の面積をπ/4とし、0以上1未満の疑似乱数数列(実数)のペアを1000組作ることで正方形と扇形の面積比を近似的に求めそこから計算される円周率を表示せよ。
という問題が出されがんばってみたのですが全く分かりません。。。
main関数とは違う部分で円周率を求める部分を作る。double変数、for文、if文を使う。return文の返り値に円周率の近似値を設定する。rand関数を含む割り算を使う。ことは確かなのですが…
どなたか知恵をお借りできませんか?


42ポイント を手に入れた。


Name: ドラ  ..初心者(7,069ポイント)   Date: 2010/07/19(月) 20:23   No:56970     
Title: Re:疑似乱数数列を使って円周率を求める    
「0以上1未満の疑似乱数数列(実数)のペア」というのは、1辺の長さが1の正方形
の中にランダムに打たれた点の事です。
その点の中で扇型の中に入った点が何個あるかカウントできれば、
点の総数と扇型の中に入った点の個数の比率で扇型の体積の近似値は求まります。
これを4倍すれば円周率の近似値も求まりますね。
点が扇型の中に入っているかどうかは円の方程式でも使えばいいでしょう。

後は0以上1未満の実数の疑似乱数の求め方が分かればできるはずです。
まあ、rand()/(RAND_MAX+1.0) ってだけだと思いますが。


242ポイント を手に入れた。

Name: box  ..ハッカー(156,427ポイント)   Date: 2010/07/19(月) 21:07   No:56971     
Title: Re:疑似乱数数列を使って円周率を求める    
> という問題が出されがんばってみたのですが全く分かりません。。。

どこまでがんばったのか、途中経過でよいですからソースコードを見せてください。


30ポイント を手に入れた。

Name: academic  ..ぴよぴよ(17ポイント)   Date: 2010/07/19(月) 21:23   No:56972     
Title: Re:疑似乱数数列を使って円周率を求める    
「モンテカルロ法 c言語」でググると幸せになれますよ。


17ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(87,274ポイント)   Date: 2010/07/19(月) 21:23   No:56973     
Title: Re:疑似乱数数列を使って円周率を求める    
答えが書いてる本もってるwww
ヒントはランダムに点をうつことです


36ポイント を手に入れた。

Name: 山本  ..ぴよぴよ(56ポイント)   Date: 2010/07/19(月) 21:38   No:56975 解決!     
Title: Re:疑似乱数数列を使って円周率を求める    
みなさん
愛してる!


14ポイント を手に入れた。



Name: メモリマネージャー  ..ぴよぴよ(42ポイント)   Date: 2010/07/18(日) 20:27   No:56940       
Title: 無題    
今メモリマネージャーを作っているのですが
最初に大きく作った領域からメモリを割り当てる方法がよく分かりません
よろしかったら教えていただけませんか?


42ポイント を手に入れた。


Name: めるぽん  ..初心者(7,182ポイント)   Date: 2010/07/18(日) 22:18   No:56943     
Title: Re:無題    
どういうメモリマネージャを作ろうとしているのかによると思いますけど、
汎用的(固定サイズではなく、様々な大きさのメモリを確保できる)なものであれば、
フリーリストで繋いでいくのが一般的ですかね。


88ポイント を手に入れた。

Name: へろり  ..プログラマー(26,061ポイント)   Date: 2010/07/19(月) 13:35   No:56961     
Title: Re:無題    
最初に大きく作った領域からというのは、この時点ですでに確保していると解釈出来るのですが。 よく分かりません。

最初に大量に確保しておいて、少しずつ使っていく。 というのであれば。

char *buf = malloc(100000);
int *hoge = (int*)&buf[300];

とかいう風にするのもアリですか。


昔々、マクロ言語のコンパイラを作った時は、構文木用のメモリにこの方法を使いました。
いらなくなったらまとめて一気に解放出来るので楽です。
深い階層で文法エラー等が発生した時に、longjmp() で一気に戻ってくる設計でしたので。


ただし、確保と削除を頻繁に行うのには不向きですね。
内部で断片化しますし、ギャップバッファで実装してもオーバーヘッドが高そうです。


やっぱりリストが一番だと思いますよ。


160ポイント を手に入れた。



Name: 錦鯉  ..ぴよぴよ(484ポイント)   Date: 2010/07/19(月) 00:39   No:56946       
Title: 比率を返す関数    
OpenGLで座標系の変更で使えそうな関数を作っております。
数学が苦手なのでこういった場合どのように計算すればよいのかがわかりません。

//////////////////////////////////////////////////
0  80  160  240  320
-1 -0.5  0   0.5   1
//////////////////////////////////////////////////

int a = PosX(0);  //aは-1
int a = PosX(80) ; //aは-0.5
int a = PosX(160); //aは0
int a = PosX(320); //aは1

float PosX(int num){
    float r = //ここでnumをいじる
    return r
}

申し訳ないのですがアドバイスを頂けないでしょうか?


191ポイント を手に入れた。


Name: fatens  ..上級者(15,883ポイント)   Date: 2010/07/19(月) 00:56   No:56947     
Title: Re:比率を返す関数    
float r = num / 160.0f - 1.0f

でどうでしょうか。


29ポイント を手に入れた。

Name: 錦鯉  ..ぴよぴよ(447ポイント)   Date: 2010/07/19(月) 12:23   No:56960 解決!     
Title: Re:比率を返す関数    
回答ありがとうございます!!
できました!!!
ありがとうございます。


37ポイント を落としてしまった。



Name: パコネコ  ..中級者(14,105ポイント)   Date: 2010/07/15(木) 20:58   No:56728       
Title: ダメージ計算について「雑談可」    
RPGなので使う計算しきってどんなものがあるか教えてもらってもいいですか?
有名なものでも、自分で使ってると言うだけのものでも構いません。
今私が使っているのは「攻撃力ー守備力/2=ダメージ」というものです。

そしてどのような式がどのようなゲームに向いているのでしょうか?
(たとえばじっくり遊ぶゲームとか…身にゲームのように早く進めるゲームとか)
ダメージの式によってはダメージが大きくなったり、小さくなったりなど…
HPを多めに設定したり、少なめにしたりいろいろあると思うのですが…


2倍のポイントを手に入れた! 444ポイント を手に入れた。


Name: パコネコ  ..中級者(14,153ポイント)   Date: 2010/07/15(木) 21:04   No:56729     
Title: Re:ダメージ計算について「雑談可」    
変換間違えてました…
身にゲームではなくミニゲームです。


2倍のポイントを手に入れた! 48ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,233,038ポイント)   Date: 2010/07/15(木) 21:55   No:56730     
Title: Re:ダメージ計算について「雑談可」    
そういうのは先人の知恵を借りるのが一番ですね。

http://www.google.co.jp/search?hl=ja&source=hp&q=RPG+%E8%A8%88%E7%AE%97%E5%BC%8F&aq=f&aqi=g1g-c1&aql=&oq=&gs_rfai=

http://www.google.co.jp/search?hl=ja&q=%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8+%E8%A8%88%E7%AE%97%E5%BC%8F&aq=f&aqi=g2g-cr8&aql=&oq=&gs_rfai=

自分が好きなRPGがあれば、どの計算式はどのように算出されているのか、考察しているサイトを探し、真似してみても良いでしょう。

FFやドラクエ、各種大規模オンラインゲームなど有名なゲームなら大抵ダメージ計算式が考察されています。
FF11なんて専用のそういう本が出ている位・・。

現実味を出したいなら、正規分布を使うのも良いですね。
現実世界で起こる現象は正規分布する可能性が高いです。

こちらのスクリプトが解りやすいです。
http://www.kwansei.ac.jp/hs/z90010/sugakuc/toukei/seiki/seiki.htm


300ポイント を手に入れた。

Name: パコネコ  ..中級者(14,213ポイント)   Date: 2010/07/15(木) 22:04   No:56732     
Title: Re:ダメージ計算について「雑談可」    
難しいですね〜正規分布についてはまた勉強してきます。

皆さんはダメージ重視の式と守備重視の式どっちがいいと思いますか?
もちろんゲームによるでしょうが…どっちのほうが好きかな〜と…



60ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,233,113ポイント)   Date: 2010/07/15(木) 22:13   No:56733     
Title: Re:ダメージ計算について「雑談可」    
いやいや、難しくは無いですよ。
計算式が色々書いてあるので、難しく見えるかもしれませんが。
スクリプトで解りやすく説明してあるの見ました?
式の中のeはexponentialというのですがCで計算出来る関数があるので、ほとんど自分で計算する部分は無いです。
ですので好きな値を見つけてセットしてやればいいだけです。

まぁ正規分布は無理に使う必要無いかもしれませんが・・。

> ダメージ重視の式と守備重視の式どっちがいいと思いますか?

ダメージの計算式がしっかりしているという事は、守備の計算式もしっかりしていることの裏付けだと思いますが、どうでしょう?
それとも武器によってのみダメージが決定していて、装備はほとんど関係ないという状態でしょうか?
やはり両方とも入念に考えた方がいいと思いますが、やはりRPGの装備の醍醐味は武器じゃないですかね。


75ポイント を手に入れた。

Name: パコネコ  ..中級者(14,571ポイント)   Date: 2010/07/15(木) 22:20   No:56734     
Title: Re:ダメージ計算について「雑談可」    
やっぱり武器ですか〜
友達にも武器作ってほしいと言われているのですが…
まだ戦闘プログラムが完成してないんですよね。
友達の中では、武器は疲労がたまるとこわれるらしいです。

今の計算式だと相手の守備の半分の数値攻撃力からひいた数値がダメージになるというものです。
つまり防御2につきダメージが1減る、攻撃が上がればその数値だけ上がるという感じです。
武器の能力値は、攻撃力にそのまま反映されるという予定のようです。


2倍のポイントを手に入れた! 358ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,233,242ポイント)   Date: 2010/07/15(木) 22:38   No:56735     
Title: Re:ダメージ計算について「雑談可」    
しかしその計算式ではいつかダメージが0やマイナスになってしまうのではないでしょうか?
ですので限りなく何かの値に近づいていくような曲線の方程式が必要ではないでしょうか。

一次直線で下限上限を作ると、ある値からステータスが全く意味をなさなくなるような事になってしまうと思いますし。


129ポイント を手に入れた。

Name: パコネコ  ..中級者(14,635ポイント)   Date: 2010/07/15(木) 23:01   No:56736     
Title: Re:ダメージ計算について「雑談可」    
やっぱり、そうおもいますよね。
それで参考のためにみなさんにお聞きできないかと思いまして・・・


2倍のポイントを手に入れた! 64ポイント を手に入れた。

Name: やっくん  ..プログラマー(29,963ポイント)   Date: 2010/07/15(木) 23:23   No:56738     
Title: Re:ダメージ計算について「雑談可」    
私が現在作成中のRPGの戦闘部分ではパコネコさんが最初に示したような式をとりあえず使ってます(^^;

RPG作りながら思ったですが、自キャラ&敵キャラのステータス値、装備の値を設定していくのは大変ですよね。どうやったら、ゲームを"普通"に進行させたら戦闘でギリギリの戦いができるような値の設定をできるんでしょうね。

紙の上でひたすら計算して行くしかないのかな。
戦闘プログラムを組むよりこっちの値の微調整の方が時間掛かりそうな気がする・・・。


225ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,233,450ポイント)   Date: 2010/07/15(木) 23:27   No:56740     
Title: Re:ダメージ計算について「雑談可」    
上でも言った通り、RPGの計算式の分野はこれでもかと先人が考えつくしていると思うので、参考にすると良いと思うのですが、その案はダメですか?

#
私はエアロビートのスコア計算式を考える時DDRのスコア計算式を参考にしましたよ。
紹介動画に一瞬出てくる添付のような計算式です。
こういうものは式にするとややこしく見えますが、ようするに後半になるほどスコアが高くなり、
その度合いは最初のパーフェクト二回が最後のパーフェクト一回に相当する事を意味しています。


208ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(186,097ポイント)   Date: 2010/07/15(木) 23:45   No:56745     
Title: Re:ダメージ計算について「雑談可」    
時間がないのです少しだけ参加。
とりあえず、レベル40ぐらいの時にレベル1の敵を殴ったらとんでもないダメージが表示されるゲームが好きです。レベル差が歴然とダメージ値で分かるゲームってことですね。
それとバランスで気をつけるべきのは最終ボスあたりの戦闘で少しのレベル差で最終ボスが、すげーく強くなったり弱くなったりしない様に近いレベル同士の時はダメージ変化が緩やかで有るべきだと思います。
式を決めたらシミュレーション戦闘させてみることをお勧めします。
自分レベル:敵レベル(最終ボスを40と仮定)
1:1
1:2
1:5
1:20
1:40
10:1
10:20
10:40
20:1
20:20
20:40
35:40
40:40
45:40
50:40
99:40
ぐらいは試したほうが良いですね。
試すとダメージにマイナス値が出たり、想定外に速くボスが死んだり色々起こります。


341ポイント を手に入れた。

Name: パコネコ  ..上級者(15,002ポイント)   Date: 2010/07/16(金) 00:08   No:56747     
Title: Re:ダメージ計算について「雑談可」    
/*
上でも言った通り、RPGの計算式の分野はこれでもかと先人が考えつくしていると思うので、参考にすると良いと思うのですが、その案はダメですか? 
*/
それだと数が多すぎて…お勧めってないかなっと、思いました。
ここの方ならアドバイスいただけますから…

一応シミレーションでバトルできるプログラムは作っておいたんですが…
それでいろいろな式を試したいな〜って思ってます。
ですが、自分はレベルでパラメーター決まるんですが、相手は敵の種類ごとに固定なんですよね〜。
少しはバラツキを持たせようとは思っているんですが…

とりあえずの、パラメーターは決まっていますが今の計算式でバランスをとって決めたパラメーターなので、
計算式はちゃんと決めておきたいです。
決まりさえすれば、適正レベルなど決めれますから…


367ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(186,153ポイント)   Date: 2010/07/16(金) 00:16   No:56749     
Title: Re:ダメージ計算について「雑談可」    
追記。
実はボス毎に違う攻撃式・防御式を使っていることはないしょです(市販のゲームで実際にやった事です)。


56ポイント を手に入れた。

Name: パコネコ  ..上級者(15,071ポイント)   Date: 2010/07/16(金) 00:20   No:56751     
Title: Re:ダメージ計算について「雑談可」    
なんと…まあゲームによっては特殊能力やら特性やらでチートなことするボスっていますよね。
勝てるようにはなってるだろうけど…


51ポイント を手に入れた。

Name: やっくん  ..プログラマー(30,110ポイント)   Date: 2010/07/16(金) 00:59   No:56772     
Title: Re:ダメージ計算について「雑談可」    
キューさんが提示なされたサイトも参考に少し凝った計算式を作って、シミュレーションやってみることにします。式が複雑な程、値の変化が中々難しくなりそうな気もしますが、そこは少し数学の力が必要になりそうですね。

>実はボス毎に違う攻撃式・防御式を使っていることはないしょです
面白い裏話ですね(笑”


147ポイント を手に入れた。

Name: へろり  ..上級者(24,254ポイント)   Date: 2010/07/16(金) 10:29   No:56806     
Title: Re:ダメージ計算について「雑談可」    
被ダメの計算自体はシンプルな物でいいと思いますよ。

基本的に、攻撃力と防御力の差分値がダメージと考えていていいんじゃないでしょうか。

どのみち武器や防具の性能で補正がかかるわけですから。

それよりもキャラクタの成長率や、シナリオ(想定する敵の強さ)に適切な武器・防具性能だと思います。

後はあまりインチキすぎるスキルや魔法を作らないって事ぐらいですか。

ちなみにHPは9999ある物が好きです。



159ポイント を手に入れた。

Name: やっくん  ..プログラマー(30,110ポイント)   Date: 2010/07/16(金) 16:21   No:56819     
Title: Re:ダメージ計算について「雑談可」    
>それよりもキャラクタの成長率や、シナリオ(想定する敵の強さ)に適切な武器・防具性能だと思います。
たしかに、こちら次第でどうにでもなりそうですね。

>ちなみにHPは9999ある物が好きです。 
私もFF10やFF13などのようにダメージが最初は弱く段々ケタが跳ね上がって行く感じだと爽快感を感じます。


Name: imoinu  ..ぴよぴよ(187ポイント)   Date: 2010/07/16(金) 16:42   No:56821     
Title: Re:ダメージ計算について「雑談可」    
こんにちは。
私が、好きなRPGですと、ダメージの計算式は、シリーズ事に多少違いはあるのですが、だいたい共通して、

(攻撃力×技の定数-防御力)×乱数=ダメージ

技の定数は、通常攻撃なら定数2、魔法攻撃なら定数4とか。
乱数は、ダメージの揺らぎを算出するため。

となっているようです。
とりあえず、参考になれば思い、書き込みました。


126ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(86,752ポイント)   Date: 2010/07/16(金) 18:29   No:56825     
Title: Re:ダメージ計算について「雑談可」    
私がハマッたネトゲのダメージ計算方法です
そうとう古いので参考サイトが次々に閉鎖されているので
一部分しか覚えていないです

まず、武器に1D 2D 3D とあり
このDがダイス(サイコロ)をあらわします
1D というのが1つのサイコロを振った目という意味で
2D が2つのサイコロを振った目です
ダイス(サイコロ)とあるので1〜6です
そしてこれにSTR(力)というステータスがあり
13ポイントごとにボーナス+1されます
STR26 で2Dの武器の場合
2x(1〜6)+26/13 で 4〜14の攻撃力になります
欠点なのか長所なのか、最低ダメージが分かるのと、最大ダメージがわかるので
何発でモンスターを倒せるなどと、推測できるゲームでした

これに体力(VIT)や、回避力(DEX)、運(CHR)などが加わり
防御する側も
まず、攻撃がヒットするか
その次に体のどの部分にヒットするか
その部分の防具がダメージをどれだけ軽減するか
どの方向から攻撃されたかなど
さまざまな要素から計算式が成り立っていました

じゃぁ、10D などの強い武器持てばいいじゃんとなるんですが
そのためにはSTR(力)が最低限いくらないと装備できない
などと制限があって、STR(力)を上げないと強い武器が装備できない仕組みで
とても良かったです
(いきなりレア武器を手に入れてもSTR(力)がないと装備できない)

防具も頭、盾、鎧、足、マント(背中)とあり、
ずーっと同じ防具を使い続けると、その防具の耐久度が減っていき
最後には壊れるというものでした
対戦中に、防具を壊して、無防備のところを狙うという戦法などもありました

魔法にも色々計算式があったのですが、長くなるのでここらへんで


684ポイント を手に入れた。

Name: パコネコ  ..上級者(16,620ポイント)   Date: 2010/07/16(金) 20:46   No:56837     
Title: Re:ダメージ計算について「雑談可」    
なかなか、おもしろそうですね。
ネトゲーは、やったことないですがおもしろそうですね。
武器壊れるとかは、自分でプレイするとしたら「いやだな〜」って思いました。

ダメージがさいころの目で決まるというのは小説で読んだことありました。
確かアリアンなんちゃら…全然覚えてないですね。

テーブルトークRPGとかの小説版って、感じだった…


129ポイント を手に入れた。

Name: ISLe  ..初心者(7,154ポイント)   Date: 2010/07/16(金) 23:58   No:56855     
Title: Re:ダメージ計算について「雑談可」    
> テーブルトークRPGとかの小説版って、感じだった…

大きな本屋さんでテーブルトークRPGのルールブックを立ち読みしてみるのもいいかもしれません。


38ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(186,373ポイント)   Date: 2010/07/17(土) 01:00   No:56862     
Title: Re:ダメージ計算について「雑談可」    
>まず、武器に1D 2D 3D とあり 

テーブルトークRPGの計算方法ですね。
古いパソコンゲームですが、ロードス島戦記がその計算方法ですね。
企画のグループSNEの仕様通り作られてました。
http://www.groupsne.co.jp/index.html




2倍のポイントを手に入れた! 220ポイント を手に入れた。

Name: kaiten  ..中級者(10,717ポイント)   Date: 2010/07/17(土) 11:36   No:56892     
Title: Re:ダメージ計算について「雑談可」    
TRPGの計算方法だとスリルは結構あると思いますよ。
可能性はかなり低いですけど物によってはどれだけレベル差がある敵でも倒せることになるんで。
逆にレベル最高で防具も一番いいのつけたのにスライムに一撃で殺される可能性もあるわけですがw


65ポイント を手に入れた。

Name: パコネコ  ..上級者(16,959ポイント)   Date: 2010/07/17(土) 19:54   No:56901     
Title: Re:ダメージ計算について「雑談可」    
でもダメージが基本10ぐらいですよね…職業ごとになんかスキルがあったりした気がする…
また本探して作ってみようかな?

ストーリーにそって同じようなの作るだけなら作れそうな気がします…。

ゲームにしても面白いのかな?
レベル6ぐらいまでだった気がするし…



78ポイント を手に入れた。

Name: Kou  ..中級者(9,488ポイント)   Date: 2010/07/19(月) 05:30   No:56953     
Title: Re:ダメージ計算について「雑談可」    
皆さんの書き込みを拝見していて、TRPGなんて懐かしい単語が出てきたので、嬉しくなって横槍参加です。

ロードスやソードワールドなどのTRPGでは、すべてをサイコロで決めますが、これって意外とサイコロ振るのに力が入って、面白いんですよね。
PC版のソードワールドは、実際に戦闘などの時に画面上でサイコロ振りますしw

ソードワールドはすべて6面体のサイコロですが、ロードスやその他のTRPGでは、確立(クリティカルヒットしたかや、クリティカルディフェンスしたかなど)に100面体サイコロ使ったりします。
計算式自体はよく分かりませんが、TRPGってHPがあまり多くない(PCゲームと比べて)ですが、武器、防具の恩恵と、キャラのレベルで絶妙なバランスを取っていますね。(基本サイコロしだいなのに・・・)
なので、TRPGの計算式って意外と良いのではないでしょうか?

ゲームの好みですが、私は武器が壊れる系より、使い続けることで武器の熟練度が上がり、ダメージが増えるタイプが好きです。(ダガーでグレートソードより大ダメージ!!・・みたいなw)


409ポイント を手に入れた。

Name: パコネコ  ..上級者(17,148ポイント)   Date: 2010/07/19(月) 07:26   No:56954     
Title: Re:ダメージ計算について「雑談可」    
ひゃ、百面体…すごいでかいですね。
32までなら見たことありましたけど…なぜかカードショップで

//絶妙なバランスを取っていますね。(基本サイコロしだいなのに・・・) 
ちょっと調べてみましょうか…検索の「TRPG」で出るといいけど…
どんなものが、あるのか知らないとバランスとるのに時間とられそうですしね。

/*
ゲームの好みですが、私は武器が壊れる系より、使い続けることで武器の熟練度が上がり、ダメージが増えるタイプが好きです。(ダガーでグレートソードより大ダメージ!!・・みたいなw) 
*/
私もそう結う感じのゲームのほうが好きですね。
(プレイするなら)




45ポイント を手に入れた。



Name: gyt  ..かけだし(2,103ポイント)   Date: 2010/07/17(土) 22:45   No:56912       
Title: うまくいきません・・・    
今、プログラミングになれるために○×ゲームを作ろうとしてます。(簡単なプログラムしか組めない素人です)
そこで、前回質問したのですが、上手くターンが交互にいきません。
こっちが○を置くとマス全部に×が出てきてしまいます。
○→×→○→・・・・と上手くいかないんです。
どこかおかしい所があったら教えてください。

また直した方がいいところなども教えてくださると助かります。
↓が書いたソースの一部です。



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    SetGraphMode(600,600,32);
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        
        int line_co,circle_red;
        line_co=GetColor(255,255,255); //ラインの色
        circle_red=GetColor(255,0,0);  //○(×)の色

        
        DrawBox ( 120 , 120 , 480 , 480 , line_co, FALSE);  //外枠
        DrawLine ( 240 , 120 , 240 , 480 , line_co);        //左_縦
        DrawLine ( 360 , 120 , 360 , 480 , line_co);        //右_縦
        DrawLine ( 120 , 240 , 480 , 240 , line_co);        //上_横
        DrawLine ( 120 , 360 , 480 , 360 , line_co);        //下_横

        SetMouseDispFlag( TRUE ) ;  //マウスを表示

        SetFontSize( 100 ) ;  //文字サイズ変更

        
        int MouseX , MouseY ;
        int MouseInput;

        GetMousePoint( &MouseX , &MouseY ) ;  //マウスの位置を入手

        MouseInput = GetMouseInput() ;
        static int flag_maru[8]={0,0,0,0,0,0,0,0},flag_batsu[8]={0,0,0,0,0,0,0,0};  //○or×の表示のためのフラグ
        int junban=0;
        static int r;

                    if(junban==0){
                    if( MouseX<=240&&MouseX>=120&&MouseY<=240&&MouseY>=120&&flag_batsu[0]!=1&&( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
    {
            flag_maru[0]=1;
        
        }
        if(flag_maru[0]==1){
        DrawString( 130 , 130 , "○" , circle_red);
        junban=1;
        r=GetRand(8);
}
        
        else if( MouseX<=360&&MouseX>=240&&MouseY<=240&&MouseY>=120&&flag_batsu[1]!=1&&( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
    {
            flag_maru[1]=1;
            
        }
        if(flag_maru[1]==1){
        DrawString( 250 , 130 , "○" , circle_red);
        junban=1;
        r=GetRand(8);
}
      ・
      ・
      ・
===============省略=================        
      ・
      ・  
      ・        
            
        if(junban==1){
            if(r==0&&flag_maru[0]!=1){
                flag_batsu[0]=1;
            }
        if(flag_batsu[0]==1){
            DrawString( 130 , 130 , "×" , circle_red);
            junban=0;
        }
            else if(r==1&&flag_maru[1]!=1){
                flag_batsu[1]=1;
            }
        if(flag_batsu[1]==1){
            DrawString( 250 , 130 , "×" , circle_red);
            junban=0;
        }
            else if(r==2&&flag_maru[2]!=1){
                flag_batsu[2]=1;
            }
        if(flag_batsu[2]==1){
            DrawString( 370 , 130 , "×" , circle_red);
            junban=0;
        }
      ・
      ・ 
      ・
====================省略==================
            


1,406ポイント を手に入れた。


Name: dic  ..比類無きプログラマー(87,129ポイント)   Date: 2010/07/18(日) 17:58   No:56937     
Title: Re:うまくいきません・・・    
省略されてるので、推測ですが
if文が思ったとおりに動いてないのかもしれません
デバッカで追ってみてください


47ポイント を手に入れた。

Name: gyt  ..かけだし(1,952ポイント)   Date: 2010/07/18(日) 22:45   No:56945     
Title: Re:うまくいきません・・・    

省略してしまいスミマセン…

僕もif文がおかしいと思ってました。
いろいろいじったのですが、解決せず・・・・orz

質問なのですが、デバッカで追うとはどういうことなのでしょうか?
初歩的な質問でスミマセン><
できればやり方を教えてくださると助かります。

自分で調べてみましたが、よく意味が分かりませんでした。(TT;)

よろしくお願いします。


151ポイント を落としてしまった。

Name: dic  ..比類無きプログラマー(87,238ポイント)   Date: 2010/07/19(月) 05:24   No:56952     
Title: Re:うまくいきません・・・    
VisualC++シリーズだとデバックビルド時に
F9でブレークポイントを設定でき
処理が流れてきたらそこのブレークポイントで処理が止まります
このときに変数の値などをチェックし
期待しているとおりに動いているか確認します


60ポイント を手に入れた。



Name: nobita  ..ぴよぴよ(218ポイント)   Date: 2010/07/18(日) 09:57   No:56919       
Title: コンパイルが出来ません    
龍神録プログラミングの館の10番「敵を表示させてみよう」でのload.cpp

------------------------------------------------------------------------------------------------------------
#include "../include/GV.h"

void load(){
        img_board[10] = LoadGraph("../dat/img/board/10.png");
        img_board[11] = LoadGraph("../dat/img/board/11.png");
        img_board[12] = LoadGraph("../dat/img/board/12.png");
        img_board[20] = LoadGraph("../dat/img/board/20.png");
        LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}

LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
------------------------------------------------------------------------------------------------------------

の1つ目の下線部に「"LoadDivGraph"があいまいです」、2つ目に「この宣言にはストレージクラスまたは型指定子がありません」というエラーが表示されます。
コンパイルの時も、

load.cpp(11): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
load.cpp(11): error C2078: 初期化子の数が多すぎます。
load.cpp(11): error C2440: '初期化中' : 'int [9]' から 'int' に変換できません。
          この変換が可能なコンテキストはありません。

と表示され、失敗してしまいます。

使用しているコンパイラはMicrosoft Visual C++ 2010 Express Editionです。

C言語やDxLibの知識もあまりないので、どうしても自分だけでは解決できません。
よろしくお願い致します。


218ポイント を手に入れた。


Name: ookami  ..プログラマー(35,945ポイント)   Date: 2010/07/18(日) 11:31   No:56922     
Title: Re:コンパイルが出来ません    
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ; 
を、
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch ) ; 
か、
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , &img_ch[0] ) ; 
に変えると、どうなりますか?


146ポイント を手に入れた。

Name: pooka [URL]  ..上級者(22,064ポイント)   Date: 2010/07/18(日) 12:08   No:56923     
Title: Re:コンパイルが出来ません    
>LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ; 
がload関数の外に書かれているので、中に書くようにしてください。


void load(){ 
        img_board[10] = LoadGraph("../dat/img/board/10.png"); 
        img_board[11] = LoadGraph("../dat/img/board/11.png"); 
        img_board[12] = LoadGraph("../dat/img/board/12.png"); 
        img_board[20] = LoadGraph("../dat/img/board/20.png"); 
        LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ; 
        LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ; //ここ




2倍のポイントを手に入れた! 262ポイント を手に入れた。

Name: nobita  ..ぴよぴよ(230ポイント)   Date: 2010/07/19(月) 04:50   No:56951 解決!     
Title: Re:コンパイルが出来ません    
解決しました!
ありがとうございました。


12ポイント を手に入れた。



Name: サンタクロース  ..初心者(7,913ポイント)   Date: 2010/07/18(日) 22:23   No:56944       
Title: 処理落ちについて    
こんばんわ。サンタクロースです
インペリシャブルシューティングという本家の弾幕を作っています
断片的で申し訳ないんですけど、if()が2つありますよね
龍神録と同じくtは弾幕が始まってからの時間を表しています。
弾幕が始まってからすぐに行えば処理落ちはしないのですが
今回のように始まってから70秒後くらいにこの動作を持ってくるとFPSが半分くらいになってしまいます
原因がよく分からなかったのでアドバイスをお願いします。

if(4120<=t && t<=4360 && t%2==0){//第三段階 70*60 240cnt
        angle3=PI2/120*t;
        boss_shot.base_angle[1]=3*t+60;
        for(n=0;n<4;n++){
            if((k=search_boss_shot())!=-1){
                    boss_shot.bullet[k].col   = 6;
                    boss_shot.bullet[k].x     = boss.x;
                    boss_shot.bullet[k].y     = boss.y;
                    boss_shot.bullet[k].knd   = 0;
                boss_shot.bullet[k].angle = PI2/4*n+angle3;
                boss_shot.bullet[k].flag  = 1;
                    boss_shot.bullet[k].cnt   = 0;
                    boss_shot.bullet[k].spd   = 1.8;
               boss_shot.bullet[k].state2= 3;
        }     
        }
         }

    
    if(4200<=t && t<=4380 && t%2==0 ){//第四段階 //70*60
    for(n=0;n<4;n++){
        if((k=search_boss_shot())!=-1){
                   boss_shot.bullet[k].col   = 2;
                   boss_shot.bullet[k].x     = boss.x;
                   boss_shot.bullet[k].y     = boss.y;
                   boss_shot.bullet[k].knd   = 0;
               boss_shot.bullet[k].angle = PI2/4*n+angle3;
           boss_shot.bullet[k].flag  = 1;
                   boss_shot.bullet[k].cnt   = 0;
                   boss_shot.bullet[k].spd   = 0.1;
               boss_shot.bullet[k].state2= 4;          
        }
        }
    }
                
        
            
    
    

                


749ポイント を手に入れた。


Name: めるぽん  ..初心者(7,037ポイント)   Date: 2010/07/19(月) 04:42   No:56950     
Title: Re:処理落ちについて    
うーん、この中に問題があるとしたら、search_boss_shot() ぐらいですかねぇ。
時間が経ってから行うから、ボスの弾が後ろの方にあってなかなか見つからずに時間が掛かっているとかそういうのが考えられます。

でも今時のPCなら数万程度の要素を探索したところで大したことはないはずなので、
時間が掛かってるのはこの部分じゃなくてもう少し別の場所にあるんじゃないかなと思います。

どこで時間が掛かってるのか、実際に時間を取って実測してみた方がいいかもしれません。


145ポイント を落としてしまった。



Name: mufg  ..ぴよぴよ(48ポイント)   Date: 2010/07/17(土) 11:08   No:56890       
Title: イベントログ読み込み    
お世話になります。
イベントログの読み込み、表示アプリをつくっていて、2003server、XPなどでは動いていたのですが、
先日2008serverにポーティングしようとおもったら、


RegOpenKeyEx 関数で
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security" 
のレジストリキーをオープンするところで、エラーが帰ってきてしまいました。

2008serverの場合、レジストリの場所がまったく異なるのでしょうか。

ご存知の方おられましたら、ご教示願います。


48ポイント を手に入れた。


Name: へろり  ..プログラマー(25,151ポイント)   Date: 2010/07/17(土) 11:27   No:56891     
Title: Re:イベントログ読み込み    
Windows server 2008 については全く分かりませんが。

"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security"のキーが存在しないのは確かな事なのですか?

一度GetLastError() にお伺いを立てて見ることをお勧めします。


55ポイント を手に入れた。

Name: YuO  ..熟練のプログラマー(46,879ポイント)   Date: 2010/07/17(土) 15:51   No:56896     
Title: Re:イベントログ読み込み    
なぜ,イベントログの読み込みにレジストリが関係するのか解りませんが……。

まずは,
MSDN: Windows Events (Windows)
http://msdn.microsoft.com/en-us/library/aa964766.aspx
の,
MSDN: Event Logging (Windows)
http://msdn.microsoft.com/en-us/library/aa363652.aspx

MSDN: Windows Event Log (Windows)
http://msdn.microsoft.com/en-us/library/aa385780.aspx
にあるAPIを使うという正規の方法で,読み込めないかどうかを確認してはどうでしょうか。


166ポイント を落としてしまった。

Name: mila  ..ぴよぴよ(109ポイント)   Date: 2010/07/17(土) 18:55   No:56899     
Title: Re:イベントログ読み込み    
RegOpenKeyEx関数でエラーが発生したときの詳細な情報はGetLastError関数では得られません。
RegOpenKeyEx関数の戻り値を確認してみてください。


8ポイント を手に入れた。

Name: へろり  ..プログラマー(25,228ポイント)   Date: 2010/07/18(日) 06:53   No:56916     
Title: Re:イベントログ読み込み    
>RegOpenKeyEx関数でエラーが発生したときの詳細な情報はGetLastError関数では得られません。 

MSDNを読み返しました。 失礼いたしました。


77ポイント を手に入れた。

Name: ikara  ..ぴよぴよ(199ポイント)   Date: 2010/07/19(月) 02:08   No:56949     
Title: Re:イベントログ読み込み    
勘違いでしたら申し訳ないのですが、
もしや下記サンプルを参考に作成していますか?

http://nienie.com/~masapico/api_sample_eventlog02_c.html

Win2008ではアプリケーションログ、システムログの取得は可能なのですが、
セキュリティのもののみ、メッセージフォーマットが保存されているdllのパスが
入っているキーがみつからないようですね。

本来ならEventMessageFileというキーに登録されているはずなのですが…。

※XPや2003では下記キーのパスが使用可能のようです。 
   SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security\\Security\\EventMessageFile

何か分かりましたら改めてコメントします。

APIの仕様より、win2008のレジストリキーの仕様を調べたほうがいいかもしれません。


199ポイント を手に入れた。

Name: ikara   Date: 2010/07/27(火) 13:13   No:568901280204020     
Title: Re:イベントログ読み込み    
解決しましたので、詳細です。

まず、イベントログのメッセージフォーマットDLLの場所ですが、
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WINEVT\\Publishers\\"

上記レジストリに存在する{で始まるキーを全てをリストアップします。
各キーの既定キーがEVENTLOGRECORD構造体内のソース名と一致しますので、
それを元に欲しいキーを確定します。

既定キー以外にMessageFileNameというキーがあるのですが、
これの値にメッセージフォーマットDLLへのパスが入っています。

あとはWinXPなどと同様の機構でイベントログのメッセージフォーマットの取得が出来ます。

ただし、vistaやwin2008serverではマイクロソフト特有のバグがあり、
sp1ではセキュリティログのメッセージフォーマット問い合わせが動作しません。

sp2を当てると取得できるようになります。


Name: ikara   Date: 2010/07/30(金) 23:07   No:568901280498855 解決!     
Title: Re:イベントログ読み込み    
解決済みにしておきます。



Name: さぼてんs  ..ぴよぴよ(137ポイント)   Date: 2010/07/18(日) 21:53   No:56941       
Title: ウィンドウ移動中に処理を継続させる    
タイトルの通りなのですが、
普通の人ならウィンドウを移動させながらゲームの入力をするような器用な事はできないと思うので
まあ問題ないかなと思っていたのですが、
今オンライン対戦のようなゲームを作っていて、ウィンドウ移動中だと処理が行われず、
データの通信が止まってしまいます。
ゲームウィンドウの移動中にゲーム処理を行わせることは不可能なのでしょうか?
また、皆さんは何か対策などはしていますか?


137ポイント を手に入れた。


Name: めるぽん  ..初心者(7,094ポイント)   Date: 2010/07/18(日) 22:15   No:56942     
Title: Re:ウィンドウ移動中に処理を継続させる    
ウインドウメッセージを処理しているスレッド以外で通信処理を行えば大丈夫な気がしますね。

36ポイント を手に入れた。



Name: オーシロ  ..かけだし(1,262ポイント)   Date: 2010/07/18(日) 17:06   No:56931       
Title: 関数呼び出しを簡略化したい    
STGの敵の射撃パターンを作っています。

射撃パターン番号で分岐させる処理を作っているのですが、
switch文で分岐するとソースが長くなる気がして嫌だなぁ、と思いました。
そこで、射撃パターンの関数の名前を

Enemy_ShotPattern_1(en_data *enemy)
Enemy_ShotPattern_2(en_data *enemy)
Enemy_ShotPattern_3(en_data *enemy)
という様に似たような名前にして、(en_dataは敵のデータの構造体です)

#define EN_SH_PT(x, y)    Enemy_ShotPattern_x(y)
とマクロを宣言し、

EN_SH_PT(敵の射撃パターン番号, 敵のデータのアドレス);
と書くことで、分岐を簡略化できないかと思ったのですが、
Enemy_ShotPattern_xという関数は無い、とエラーが出てしまいました。

引数は同じにするつもりなので、関数ポインタの配列を使ってもいいかなとは考えました。
しかし結局それではソースが長くなるのではないかな、と考えました。

何かいい方法はないでしょうか?

そこまで凝った処理をする必要は無いとはわかっているのですが、どうにも気になったので。
わかりづらい質問かもしれませんが、よろしくお願いします。


78ポイント を手に入れた。


Name: ドラ  ..初心者(6,827ポイント)   Date: 2010/07/18(日) 17:38   No:56934     
Title: Re:関数呼び出しを簡略化したい    
こんな感じでしょうか?
マクロ定義の中に現れる"##"はトークン連結演算子です。

#include <stdio.h>
#define FUNC(x, y) func_##x(y)

void func_1(int n) { printf("func_1 : %d\n", n); }
void func_2(int n) { printf("func_2 : %d\n", n); }

int main(void)
{
    FUNC(1, 123);
    FUNC(2, 987);
    return 0;
}



83ポイント を手に入れた。

Name: ISLe  ..初心者(7,383ポイント)   Date: 2010/07/18(日) 17:46   No:56935     
Title: Re:関数呼び出しを簡略化したい    
> #define EN_SH_PT(x, y)    Enemy_ShotPattern_x(y)

#define EN_SH_PT(x, y)    Enemy_ShotPattern_##x(y)


> 引数は同じにするつもりなので、関数ポインタの配列を使ってもいいかなとは考えました。
> しかし結局それではソースが長くなるのではないかな、と考えました。

ソースの再利用を考えたらこっちのほうが良いと思います。
この部分だけですべての判断はできないですけど。


2倍のポイントを手に入れた! 154ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(87,178ポイント)   Date: 2010/07/18(日) 18:01   No:56938     
Title: Re:関数呼び出しを簡略化したい    
ソースが長くなるとは
どのくらい長くなるのでしょう?
実際にソースにしてみてはどうでしょう?

案外 思ってたよりスムーズにいくかもしれません


49ポイント を手に入れた。

Name: オーシロ  ..かけだし(1,545ポイント)   Date: 2010/07/18(日) 20:03   No:56939 解決!     
Title: Re:関数呼び出しを簡略化したい    
>ドラさん
トークン連結演算子なんてものがあったとは…勉強不足でした。
しかし、これで
EN_SH_PT(enemy.ShotPattern, &enemy)
とすると、そのままEnemyShotPattern_enemy.ShotPatternという様に置き換えられてしまう
ということが自分で調べてわかりました。(enemy.ShotPatternは弾の射撃パターン番号です)
やっぱりマクロでやるのは無理のようですね。
でも勉強になりました。ありがとうございます!

>ISLeさん
色々捻ってみようと思ったんですけど、関数ポインタにすることにします。

>dicさん
少なくともswitch文だと縦長になって見づらくなる気がしました。
でも自分がわかりやすいように書くのがやっぱり一番でしょうか。


皆さんレスありがとうございました。
また疑問ができたらここに書き込むかもしれませんので、そのときもどうぞよろしくお願いします。


283ポイント を手に入れた。



Name: dic  ..比類無きプログラマー(86,964ポイント)   Date: 2010/07/18(日) 13:52   No:56924       
Title: vector<string>の重複要素を削除する    
3連休ですね
人によっては4連休かもですね

質問ですが vector<string> 変数の内容で重複している内容を削除したいのです
ソースコードは下のような感じです
//=========================================
void a()
{
    vector<string>    v;
    char    buf[1024];
    int    i;
    for( i=0; i<100; i++ )
    {
        sprintf( buf, "%d", i/10 );
        v.push_back( buf );
    }
    //    ここで重複要素を削除したい
}

前にも質問し unique を使うような記憶があったんですが、
発言内容を覚えてなくて検索ができないので
もう一度質問させてください
vector<string>::iterator を使ったのは覚えています


181ポイント を手に入れた。


Name: めるぽん  ..初心者(6,554ポイント)   Date: 2010/07/18(日) 15:41   No:56925     
Title: Re:vector<string>の重複要素を削除する    
ソートされちゃってもいいのであれば、
std::vector<string> v;
// v に値を設定する
std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());

とすればいけます。

ソートされちゃうのが嫌な場合はちょっと面倒ですね。
その場合は少しやり方を考える必要があります。 編集済み


78ポイント を手に入れた。

Name: たいちう  ..ハッカー(101,023ポイント)   Date: 2010/07/18(日) 15:58   No:56926     
Title: Re:vector<string>の重複要素を削除する    
// 例えばこう
void func() {
    vector<string> v;
    for (int i = 0; i < 100; i++ ) {
        stringstream ss;
        ss << (i / 10);
        v.push_back(ss.str());
    }

    set<string> s(v.begin(), v.end());
    v = vector<string>(s.begin(), s.end());

    for (vector<string>::iterator it = v.begin(); it != v.end(); it++)
        cout << *it << endl;
}

// このような場合なら最初からsetを使っても良いかも
void func2() {
    set<string> s;
    for (int i = 0; i < 100; i++ ) {
        stringstream ss;
        ss << (i / 10);
        s.insert(ss.str());
    }

    for (set<string>::iterator it = s.begin(); it != s.end(); it++)
        cout << *it << endl;
}


195ポイント を手に入れた。

Name: めるぽん  ..初心者(7,058ポイント)   Date: 2010/07/18(日) 17:22   No:56933     
Title: Re:vector<string>の重複要素を削除する    
たいちうさんみたいに set を使えば、結構簡単にソートせずに重複を確認していくというのができそうですね。
std::vector<std::string> v;
// v に値を設定する

std::set<std::string> set;
std::vector<std::string> result;
for (std::vector<std::string>::iterator it = v.begin(); it != v.end(); ++it)
{
    if (set.insert(*it).second)
        result.push_back(*it);
}
// result にソートされていない unique な値が入っている
で、あとはこの処理を汎用的に使えるようにしておくといいかもしれませんね。
// *a < *b で比較するための predicate
struct direct_less
{
    template<class Iterator>
    bool operator()(const Iterator& a, const Iterator& b) const
    {
        return *a < *b;
    }
};

template<class Iterator, class OutputIterator>
void unique_no_sort(Iterator first, Iterator last, OutputIterator out)
{
    // 要素をコピーするのはコストがでかいので Iterator を格納するようにする
    std::set<Iterator, direct_less> set;
    for (; first != last; ++first)
    {
        if (set.insert(first).second)
            *out++ = *first;
    }
}
こんなのを作っておけば、
std::vector<std::string> v;
// v に値を設定する
std::vector<std::string> result;
unique_no_sort(v.begin(), v.end(), std::back_inserter(result));
// result に unique な値が入っている

とかできるようになります。


504ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(87,082ポイント)   Date: 2010/07/18(日) 17:55   No:56936 解決!     
Title: Re:vector<string>の重複要素を削除する    
めるぽんさん たいちうさん
回答ありがとうございます

条件書いてなかったですね すいません
ソートしても大丈夫な環境です

参考にさせてもらい、解決しました


>stringstream
初めてみました・・・
私の持っている本には載ってないですね
世界(C/C++)は広い・・・


118ポイント を手に入れた。



Name: とかげ  ..ぴよぴよ(216ポイント)   Date: 2010/07/18(日) 16:05   No:56927       
Title: 画像が読み込めません    
はじめまして
僕はC++を勉強し始めて2ヶ月くらいの初心者です。
「ゲームプログラミングの館
3.画像を表示する」
で、画像を表示させようと思ってDXLib_VCのサンプルプログラム実行用フォルダに画像を保存しました。
全文そのままコピーペーストすると結果としてコンパイルはできるのですが真っ黒なウィンドウが出ただけだったので「こちら」(http://dixq.net/g/trouble.html)で解決しようとしましたが、
"画像の保存場所が違うか、ファイル名が違うため、表示できません。"のメッセージがいつも出ます。
画像の保存場所もファイル名もあっているはずですがなぜか表示できないので、何がいけないのか分からず質問しました。ご回答よろしくお願いします。


200ポイント を手に入れた。


Name: シエル  ..プログラマー(29,369ポイント)   Date: 2010/07/18(日) 16:22   No:56928     
Title: Re:画像が読み込めません    
う〜ん。保存場所かファイル名が違うんだと思うんですけどねぇ。。。

16ポイント を手に入れた。

Name: とかげ  ..ぴよぴよ(328ポイント)   Date: 2010/07/18(日) 16:49   No:56929     
Title: Re:画像が読み込めません    
回答ありがとうございます。
ちゃんとDXLib_VCの"サンプルプログラム実行用フォルダ"に"char.png"で画像を保存して再度やってみたのですがエディターの出力に"1580:グラフィックファイル char.PNG がありません"というメッセージが表示されて、
出てきたウィンドウにも「画像の保存場所が違うか、ファイル名が違うため、表示できません。」とやっぱり表示されてしまいます…(;_;)


112ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(186,704ポイント)   Date: 2010/07/18(日) 17:03   No:56930     
Title: Re:画像が読み込めません    
場所が違うと思うんですけどね。
system("cd >point.txt");
という命令をプログラムの最初の方に追加してみてください。
※ ChangeWindowMode( TRUE ) ;の次など。

char.pngがある場所と同じフォルダにpoint.txtが出来ているたら場所以外の問題です。
見当たらなかったらpoint.txtを探してみてくてください。そこがchar.pngを置くべき場所です。


145ポイント を手に入れた。

Name: とかげ  ..ぴよぴよ(363ポイント)   Date: 2010/07/18(日) 17:09   No:56932 解決!     
Title: Re:画像が読み込めません    
やっぱり場所が間違っていたみたいです。
"http://dixq.net/g/trouble.html"の"自分が実行しているプロジェクトのある場所"というので
どこか別の場所に保存すればいいと思っていろいろとやっていたらうまくいきました。お騒がせしてすみません。またわからないことがあったら質問しますのでその時はよろしくお願いします。


35ポイント を手に入れた。



Name: しろ  ..ぴよぴよ(331ポイント)   Date: 2010/07/18(日) 00:18   No:56913       
Title: C言語の初歩的な質問です。    
こんにちは。ちょっとわからないところを質問です。つまらない質問かもしれませんが、ご教授いただけますと幸いです。

●scanf関数で文字列を読み込む場合の引数について

以下のプログラムをご覧ください。

char a[40];

scanf("%s",a);

char型の配列aに文字列を渡しているわけですが、そもそも文字列の配列は初期化子を代入できないんですよね。
例えば配列aに"xyz"という文字列(文字リテラル)を渡すとして

char a[40];

a="xyz";

というのはC言語の規約上? ダメなのはわかるのですが、それならそもそも上にあるscanfも同じ理由でダメな気がするのですが……

一応scanf関数上のaというのは、配列aの先頭のアドレスであり、そこに文字列を格納していくというのを考えたのですが(ポインタ型の配列だと、初期化子を代入できるので)、それだとchar a[40]ではなく、char *aと宣言しなければならない?

どうもこのあたりが持っている書籍には書いていなかったこともあり、よくわかりません。何卒よろしくお願いいたします。



264ポイント を手に入れた。


Name: box  ..ハッカー(156,397ポイント)   Date: 2010/07/18(日) 00:30   No:56914     
Title: Re:C言語の初歩的な質問です。    
> char型の配列aに文字列を渡しているわけですが、そもそも文字列の配列は初期化子を代入できないんですよね。

そういうことはありません。
定義と同時に初期化できます。

char a[40] = "xyz";

> というのはC言語の規約上? ダメなのはわかるのですが、それならそもそも上にあるscanfも同じ理由でダメな気がするのですが……

同じ理由、というのは、どういう理由のことでしょうか?


32ポイント を手に入れた。

Name: しろ  ..ぴよぴよ(335ポイント)   Date: 2010/07/18(日) 00:39   No:56915     
Title: Re:C言語の初歩的な質問です。    
ご解答ありがとうございます。

>そういうことはありません。
>定義と同時に初期化できます。 

すいません。自分のの言い方がまずかったです。char型の配列は宣言をしたあとに初期化子を代入できない(char a[40]; a="xyz";)んですよね。

その意味合いで、scanf("xyz",a);とすると、配列を宣言したあとに、文字列を渡しているので、同じことになってしまうのではないか、ということなのですが・・・・・・


4ポイント を手に入れた。

Name: へろり  ..プログラマー(25,596ポイント)   Date: 2010/07/18(日) 07:25   No:56917     
Title: Re:C言語の初歩的な質問です。    
>すいません。自分のの言い方がまずかったです。char型の配列は宣言をしたあとに初期化子を代入できない
>(char a[40]; a="xyz";)んですよね。

ちょっと重隅をつつくようですが、新ANSI C言語辞典にはこうあります。

初期化子: オブジェクト(変数など)を定義する宣言において初期化をする言語構成要素。

ですから、char a[40]; a = "xyz" の "xyz" は初期化子ではありません。

また、宣言した後で代入することも可能です。

char a[40];
a[0] = 'x';
a[1] = 'y';
a[2] = 'z';
a[3] = '\0';


char a[40] = "xyz";
というコードはあたかも配列aに文字列定数 "xyz" を代入しているかのように見えますが、実際は
char a[4] = {'x', 'y', 'z', '\0'};
のシンタックスシュガーに過ぎません。

配列として宣言された変数が、変数名のみで現れた場合、先頭要素へのポインタを意味します。
ですから、

char a[40];
a = "xyz";

というコードは

char a[40];
&a[0] = "xyz";

と等価となります。

代入出来ない理由は一目瞭然ですね。


>一応scanf関数上のaというのは、配列aの先頭のアドレスであり、そこに文字列を格納していくというのを考え>たのですが(ポインタ型の配列だと、初期化子を代入できるので)、それだとchar a[40]ではなく、char *aと>宣言しなければならない? 

ポインタ型の配列というのが今ひとつ分かりませんが、配列へのポインタですか? ポインタの配列ですか?
ちなみに、
char *hoge[40];  //ポインタの配列
char (*foo)[40]; //配列へのポインタ
です。

[]が配列としての意味を持つのは唯一宣言時だけです。
char *hiho;
char baa[40];
は両方とも、式の中での型は char* 型になります。


と、言うことを聞きたいのでしょうか。


368ポイント を手に入れた。

Name: しろ  ..ぴよぴよ(202ポイント)   Date: 2010/07/18(日) 09:55   No:56918     
Title: Re:C言語の初歩的な質問です。    
へろり様

ご解答ありがとうございます。
初期化子については理解できました。

えーとお伺いしたいのは、どちらかというとscanf関数のほうでして

a[4];

scanf("%s",&a);

で例えば「ptr」と打ち込むと、結果的に、a[4]={'p','t','r','\0'}となるわけですが、なぜそうなるのか理解できないのです(そういう関数だからといえばそれまでですが)。

&aが配列の先頭のポインタで、それにptrをいれるということは結果的に&a[0] = "xyz"; と同じなのではないか? という疑問です。


133ポイント を落としてしまった。

Name: へろり  ..プログラマー(25,792ポイント)   Date: 2010/07/18(日) 11:10   No:56920     
Title: Re:C言語の初歩的な質問です。    
>a[4]; 
>scanf("%s",&a);

これは、scanf("%s", &a[0]); もしくは scanf("%s", a); のつもりですよね。


>&aが配列の先頭のポインタで、それにptrをいれるということは結果的に&a[0] = "xyz"; と同じなのではないか? という疑問です。

先に述べました通り、配列として宣言された変数が、変数名のみで現れた場合、先頭要素へのポインタを意味します。 
関数の引数にポインタを渡すだけで、なぜ、&a[0] = "xyz"; というコードと等価だと思うのかちょっと分からないのですが。

scanf() 関数では、引数に受け取ったポインタのアドレスから1つ1つ文字を代入してくれている。 とは考えられませんか?


196ポイント を手に入れた。

Name: しろ  ..ぴよぴよ(272ポイント)   Date: 2010/07/18(日) 11:23   No:56921 解決!     
Title: Re:C言語の初歩的な質問です。    
>>scanf() 関数では、引数に受け取ったポインタのアドレスから1つ1つ文字を代入してくれている。 

なるほど、scanf関数はそういう関数ということですね。理解できました。またわからないことがあれば質問させていただきます。ありがとうございました。 編集済み


70ポイント を手に入れた。



Name: atpiza  ..ぴよぴよ(873ポイント)   Date: 2010/07/17(土) 15:26   No:56893       
Title: 背景の透明化    
お世話になっております。
このタイトルだと少し語弊があるとおもうので説明します。
プログラムで画像とかを背景を透明化表示して実行すると、
背景の透明化されたところは真っ黒(自分の場合は)ですよね。
それをなくして 画像の部分だけを純粋に切り取りたいのです(上の画像のように)・・。

解決策ありましたらよろしくお願いします。


130ポイント を手に入れた。


Name: 組木紙織  ..比類無きプログラマー(90,063ポイント)   Date: 2010/07/17(土) 15:40   No:56895     
Title: Re:背景の透明化    
解決策はあると思いますが、質問内容が不十分です。

環境の提示、サンプルコードの提示、より詳細な質問内容に説明をお願いします。


37ポイント を手に入れた。

Name: atpiza  ..かけだし(1,264ポイント)   Date: 2010/07/17(土) 20:13   No:56903     
Title: Re:背景の透明化    
visualC++2010 で DXライブラリを使わせていただいております。
うまく説明するのが難しいのですが、

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

#include "DxLib.h" 

    
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ 
     
    SetGraphMode( 128, 137, 32); 
    
     ChangeWindowMode(TRUE);    //ウィンドウモードに変更する為の関数 

     SetWindowStyleMode(4)    //ウィンドウ枠消す
    
         // ウインドウの初期位置を設定する 
     ;SetWindowInitPosition( 1150, 853); 
    
     ;if( DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
  SetWindowPos( GetMainWindowHandle(), HWND_TOPMOST, 1150, 853, 223, 45, SWP_NOSIZE | SWP_NOMOVE); 
         LoadGraphScreen( 0, 0, "maru.png" , TRUE ) ; //画像を描写
                ScreenFlip();    //裏画面に描画されている物を表に反映 
    } 
    
    DxLib_End();    //DXlib終了 
    return 0; 




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

こんなかんじで>>1の画像の上半分の状態になりました。

そうすると 画像の後ろが真っ黒になってしまいます。
それを消して(透明にして)本当に画像の部分「だけ」を表示させたいのですが・・・。 編集済み


391ポイント を手に入れた。

Name: 組木紙織  ..比類無きプログラマー(90,393ポイント)   Date: 2010/07/17(土) 20:56   No:56905     
Title: Re:背景の透明化    
多分ここと同じことをやりたいのかな。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_125.htm

先ほどDXライブラリのリファレンス見たとこ、そのような操作を出来るものが見つけられなかったので、
多分DXライブラリでは出来ないと思います。
(もし出来るなら詳しい方説明お願いします。)

Win32APIを使ってする方法(上のリンクと同じ方法)ならあるんですが、
問題点が二つあります。
1:DXライブラリと併用して問題ないかどうか。
2:Win32APIの使い方を理解して置くべき。

使うに当たっての問題点はその二つですが、
実際にゲームを作るためにすると特殊なウインドウなので、通常のウインドウの操作
(最小化、移動、終了処理、etc)を全部自分で書いてあげないといけないのでちょっと面倒です。




330ポイント を手に入れた。

Name: シエル  ..プログラマー(29,353ポイント)   Date: 2010/07/17(土) 21:14   No:56907     
Title: Re:背景の透明化    
この質問って、単に黒い部分を透過させたいってだけの質問じゃないんですか?

32ポイント を手に入れた。

Name: atpiza  ..かけだし(1,334ポイント)   Date: 2010/07/17(土) 21:23   No:56908     
Title: Re:背景の透明化    
わかりました。

Win32APIのほうが確実そうですね。
現時点の自分ではできそうにないのでもっと勉強しようと思います。


ご解答本当にありがとうございました。


70ポイント を手に入れた。

Name: atpiza  ..かけだし(1,362ポイント)   Date: 2010/07/17(土) 21:24   No:56909 解決!     
Title: Re:背景の透明化    
一応不可能ではないことがわかったのでこれで解決とさせていただきます。

28ポイント を手に入れた。



Name: やっくん  ..プログラマー(31,584ポイント)   Date: 2010/07/17(土) 02:59   No:56877       
Title: 全角文字と半角文字の複合文の処理    
現在、DXライブラリを使用してRPGで使用する会話システムを作っています。
大まかな仕様は
・与えられた任意の文字列を任意の速度で1文字ずつ表示する。
・リターンキーを押すと枠いっぱいになるまで文字を1文字ずつ速度MAXで表示していく。
・文字列を全て表示してしまったらリターンキーの入力待ち。
というものです。

1文字ずつ表示するということでとりあえず文字は全角文字だけに的を絞って作りました。
全角だけならば↑の条件を満たし、動きました。
しかし、半角と全角文字が混じっていても対応できるようにしたいのですが躓いてしまったので質問させていただきます。

まず以下に変更したい場所のプログラムソースを一部載せます。

/*
talkContents[] -> 与えられた会話文字列
talkStr[][]    -> 1行ずつ表示するために分解した文字列
i              -> 行No
j              -> 文字の要素No(現在は全角対象なので2つのNoで1文字)
pointer        -> 与えられた文字列の抜き出す文字を指し示す
*/
talkStr[i][j  ] = talkContents[pointer  ]; // 与えられた全角文字列を、
talkStr[i][j+1] = talkContents[pointer+1]; // 全角1文字ずつコピーして
talkStr[i][j+2] = '\0'; // そこまでを文字列とする
if(strcmp(&talkStr[i][j],"。") == 0){ // "。"を読み込んだら次の行へ
    i++;
    j=0;
}
else j+=2;
pointer+=2;


↑のソースでは全角しか対応できません。
質問内容:半角にも対応するためにはどうすれば良いでしょうか?

最初考えた物としてコピーしようとする文字の上位バイト(ここではtalkContents[pointer])を調べ、半角文字の場合の処理を作ってしまえば良いと思い、シフトJIS(http://charset.7jp.net/sjis.html)より

if(talkContents[pointer] >= 0x00 && talkContents[pointer] < 0x7e){
/* 処理 */
}  

という処理を以下の二つの命令の間に追記しましたが、結果は上手くいきませんでした。
/**********************************************
talkStr[i][j  ] = talkContents[pointer  ];
// ここに追記し、以下を場合分けして対応させた。
talkStr[i][j+1] = talkContents[pointer+1];
**********************************************/


2倍のポイントを手に入れた! 1,474ポイント を手に入れた。


Name: へろり  ..上級者(24,754ポイント)   Date: 2010/07/17(土) 07:04   No:56883     
Title: Re:全角文字と半角文字の複合文の処理    
DXライブラリとかはさっぱり解りませんが

いっそUnicodeでも使ったらどうですか?



33ポイント を手に入れた。

Name: ドラ  ..初心者(6,744ポイント)   Date: 2010/07/17(土) 07:51   No:56886     
Title: Re:全角文字と半角文字の複合文の処理    
こんな感じでしょうか?
赤字のところがポイントです。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char talkContents[128] = "ハロー Shift_JIS の世界!!。これでOK?。";
    char talkStr[4][128] = {'\0'};
    int pointer, i = 0, j = 0;
    
    for (pointer = 0; talkContents[pointer] != '\0'; )
    {
        unsigned char ch = talkContents[pointer++];
        if ( (ch >= 0x81 && ch <= 0x9f) || (ch >= 0xe0 && ch <= 0xef) ) // 全角文字の1バイト目だったら
        {
            talkStr[i][j]   = ch;                      // 全角文字の1バイト目をコピー
            talkStr[i][j+1] = talkContents[pointer++]; // 全角文字の2バイト目もコピー
            talkStr[i][j+2] = '\0';
            if(strcmp(&talkStr[i][j],"。") == 0){ // "。"を読み込んだら次の行へ
                i++;
                j=0;
            }
            else j+=2;
        }
        else // 半角文字だったら
        {
            talkStr[i][j++] = ch; // 半角文字をコピー
        }
    }
    talkStr[i][j] = '\0';
    
    printf("talkContents : \"%s\"\n", talkContents);
    for (i = 0; i < 4; i++)
    {
        printf("  talkStr[%d] : \"%s\"\n", i, talkStr[i]);
    }
    
    return 0;
}

もっと高速な判定方法も存在するようなので、そちらを使った方がいいかもしれません。
http://www.st.rim.or.jp/~phinloda/cqa/cqa15.html#Q4


301ポイント を落としてしまった。

Name: やっくん  ..プログラマー(31,733ポイント)   Date: 2010/07/17(土) 20:49   No:56904 解決!     
Title: Re:全角文字と半角文字の複合文の処理    
>へろりさん
助言ありがとうございますm(__)m
しかし、今回はシフトJISコードのままで解決しましたのでシフトJISで行こうと思います。

>ドラさん
わざわざソースコードと参考サイトまで示していただきありがとうございます。
おかげさまで解決しました(^^
参考サイトのマクロ定義はとても自分には高度な内容でしたが、利用することができたのでこちらを使わせていただきます。


149ポイント を手に入れた。



Name: ぼたろう  ..ぴよぴよ(5ポイント)   Date: 2010/07/16(金) 21:29   No:56839       
Title: 三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
どうしたらよいのでしょう?

5ポイント を手に入れた。


Name: シエル  ..プログラマー(28,528ポイント)   Date: 2010/07/16(金) 21:42   No:56841     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
このような質問で、あなたの求める回答が得られると思いますか?

30ポイント を手に入れた。

Name: 白い時空  ..入門者(2,525ポイント)   Date: 2010/07/16(金) 22:03   No:56845     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
ただの推測ですが、360°を一周とする度数法でやってませんか?
プログラミングで使うのは、2πを一周とする孤度法です。


2倍のポイントを手に入れた! 122ポイント を手に入れた。

Name: ookami  ..プログラマー(35,799ポイント)   Date: 2010/07/16(金) 22:16   No:56846     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
あるいはintなどの整数型でやってませんか?

13ポイント を手に入れた。

Name: KEN  ..ぴよぴよ(16ポイント)   Date: 2010/07/17(土) 00:30   No:56858     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
今自分も同じ事をしています
もし自分の思い違いでなければ
これで角度はでます

自分はアークタンジェントを使ってます

atan2( 物.y - 物.y, 物.x - 物.x );


16ポイント を手に入れた。

Name: へろり  ..上級者(24,933ポイント)   Date: 2010/07/17(土) 07:39   No:56884     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
6パターンくらいの角度というのが解りませんが、三角関数ですからまず角度を与えるものだと思うのですが。

難しく考えすぎではありませんか? 単純に公式に当てはめればいいだけだと思いますよ。

下記のコードは45度の角度で1移動したときのx座標とy座標をもとめています。

#define PI        3.141592

main
{
    double r = 45 * PI / 180;    //45度
    double y = sin(r);
    double x = cos(r);

    printf("x = %f, y = %f\n", x, y);
}



179ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(73,243ポイント)   Date: 2010/07/17(土) 17:48   No:56897     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
#define RAD (3.14159265/180)

float angle=30.0f;

x+=cos(angle*RAD)*Speed;
y-=sin(angle*RAD)*Speed;

これでどうでしょうか?


66ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(73,479ポイント)   Date: 2010/07/17(土) 19:08   No:56900     
Title: Re:三角関数をつかって移動処理をしているのですが、6パターンくらいの角度しかうごきません    
もしかして、STGの自機の動きでしょうか?

左上↑右上
 ← →
左下↓右下

だとすると、普通8パターンくらいしか動きませんよ。


前に回答者さんが言っていましたが、詳しく状況を書かないと詳しい回答が得られません。
詳しく開発環境から疑問している部分とソースコードを提示してください。


115ポイント を手に入れた。



Name: 爺プログラマー  ..入門者(4,089ポイント)   Date: 2010/07/15(木) 21:55   No:56731       
Title: BitBltは一回だけ?    
ループ処理1回に付きBitBltは1回のみ呼び出すのでしょうか?
何回でもいいのでしょうか?

ボタンなどがありウィンドー全体を書き換えたくないのです。
実は、描画処理はボタンを挟んだ形になりボタンを避けて2、3箇所に描画する必要あります。

それとも透過を組み込む必要があるでしょうか?
お尋ねします。


127ポイント を手に入れた。


Name: ISLe  ..初心者(6,891ポイント)   Date: 2010/07/15(木) 23:26   No:56739     
Title: Re:BitBltは一回だけ?    
以前DIBでゲーム作ったときは1フレームあたり数百回BitBlt呼び出してましたけど。
ループ処理って何でしょう。
ふつうのウインドウズアプリにはありませんよね。

> ボタンなどがありウィンドー全体を書き換えたくないのです。
> 実は、描画処理はボタンを挟んだ形になりボタンを避けて2、3箇所に描画する必要あります。

複数回に分けてBitBltしたらチラつくかもしれませんね。

WS_CLIPCHILDRENスタイルがあれば全体に描画しても勝手にボタンとか避けてくれませんでしたっけ。


147ポイント を手に入れた。

Name: シエル  ..プログラマー(28,395ポイント)   Date: 2010/07/16(金) 00:52   No:56768     
Title: Re:BitBltは一回だけ?    
私は前にシューティングゲーム作ったときは、100回以上は呼び出してました。
バックバッファに100回以上転送して、メインバッファへは一回だけ呼び出してました。

ウィンドウ全体を書き換えたくない件については、
前にWS_CLIPCHILDRENスタイルを指定して、解決してませんでしたっけ?


2倍のポイントを手に入れた! 166ポイント を手に入れた。

Name: 爺プログラマー  ..入門者(4,340ポイント)   Date: 2010/07/16(金) 10:21   No:56805     
Title: Re:BitBltは一回だけ?    
ISLe さん、回答ありがとうございます。
ループ処理とは1フレーム処理が1ループ処理に当たります。キャラクターの移動処理の一回分の処理が1ループになります。

WS_CLIPCHILDRENを選んでますので、さすがボタンやコンボボックスには上書きされないようです。
なので、今回は1ループ当たりBitBlt()は1回の呼び出しでOKとなりました。

お騒がせ致しました。


シエル さん、回答ありがとうございます。
前回WS_CLIPCHILDRENを設定したのは、別の問題でしたので気が付きませんでした。


1フレーム当たりBitBlt()は何回呼び出しても不具合はないようですね。
最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?

大変お騒がせ致しました。


251ポイント を手に入れた。

Name: へろり  ..上級者(24,479ポイント)   Date: 2010/07/16(金) 10:48   No:56807     
Title: Re:BitBltは一回だけ?    
>最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?

切り替えるというのは、具体的にどういう事なのか解りませんが、利用されるデバイスコンテキストを差し替えるなんて芸当は出来ないはずです。詳しくは知りません。

EndPaint()関数はBeginPaint()で用意した描画に必要なアレやコレの後始末をするための物です。
EndPaint()関数は、表も裏もありませんよ。

強いて言うなら、裏を表に切り替える?タイミングはBitBlt()関数等です。
メモリデバイスコンテキスト(正確には、に、割り付けられたビットマップ)にいろいろと描画した後、
ウィンドウのデバイスコンテキストにBitBlt()等で転送することで裏から表に描画出来ます。

ただ、0タイムで描画出来たとしても、BitBlt()関数には垂直同期を取るなんて機能はありませんので普通にちらつくとは思いますが。


225ポイント を手に入れた。

Name: シエル  ..プログラマー(28,477ポイント)   Date: 2010/07/16(金) 11:04   No:56810     
Title: Re:BitBltは一回だけ?    
>最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?

これはWM_PAINTメッセージが発生したときのタイミングというふうに捉えていいでしょうか?
だとしたら問題ないと思います。

前にタイマーを使ったブロック崩しも作ったことがありましたが、
その場合はWM_TIMERメッセージが来たタイミングで、メモリデバイスコンテキストに描画し、
最後にInvalidateRect関数を呼び出し、WM_PAINTメッセージを発生させて
WM_PAINTのメッセージ処理内で、メモリデバイスコンテキストから、ウィンドウのデバイスコンテキストに
bitbltを使って描画してました。

別にこのやり方でも特に問題は出なかったです。


49ポイント を手に入れた。

Name: ISLe  ..初心者(7,046ポイント)   Date: 2010/07/16(金) 22:34   No:56850     
Title: Re:BitBltは一回だけ?    
> 最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?

BeginPaintからEndPaintのあいだにもディスプレイに表示されている内容が逐次更新されることはあります。
そうでなければチラツキ防止のためにオフスクリーン作ってBitBlt一回にまとめたりする必要ないですから。

どの位の頻度で更新されるかはディスプレイデバイスドライバーの作りとか画面モード(リフレッシュレート)とかに影響されると思います。


99ポイント を手に入れた。

Name: 爺プログラマー  ..入門者(4,441ポイント)   Date: 2010/07/17(土) 09:47   No:56889     
Title: Re:BitBltは一回だけ?    
ISLe さんの回答のように、やはりBitBltはDirectXのFlipと同じ動作をすると考えた方がベターだと考えます。
BitBltは特別な事情が無い限り全画面一括処理向きだと思います。

1フレームで何回もBitBltを呼び出すのは敬遠したいです。BitBltを連発してチラツキが確認できなかったのは画像処理の順序若しくは同系統の色の塗り替え等よるものだと考えます。

みなさん、ご協力ありがとうございました。


101ポイント を手に入れた。



Name:  ..上級者(24,844ポイント)   Date: 2010/07/17(土) 00:49   No:56860       
Title: WEBブラウザ    
WEBブラウザ作成

今、C++の勉強をしていて、インターネット関連のアプリを作ろうと思ったのですが、どこから手をつけて良いのかわかりません。

C++&DXライブラリでの開発が望ましいのですが、可能ですか?

ぶしつけで失礼ですがよろしくお願いします。


118ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(214,841ポイント)   Date: 2010/07/17(土) 00:54   No:56861     
Title: Re:WEBブラウザ    
> C++&DXライブラリでの開発が望ましいのですが、可能ですか? 

可能です。
DXライブラリを使う理由がわかりませんが、レンダリングエンジンを自作するということでしょうか?
いずれにせよ、可能かどうかでいえば"可能"です。


68ポイント を手に入れた。

Name:  ..上級者(24,990ポイント)   Date: 2010/07/17(土) 01:04   No:56864     
Title: Re:WEBブラウザ    
ありがとうございます。


レンダリングエンジンですか……

IEやFirefoxみたいなやつを作りたいです
(難しいのは承知の上です)
これはこちらの記入ミスでした

URLを入力してサイトにジャンプ、サイトの文章や画像を表示する

って感じです

かなり抽象的だと思いますが、宜しくお願いします


146ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(186,456ポイント)   Date: 2010/07/17(土) 01:05   No:56865     
Title: Re:WEBブラウザ    
> C++&DXライブラリでの開発が望ましいのですが、可能ですか?  
HTMLのまともなレンダリングエンジンをDXライブラリとC++で一人で作れるとしたら相当(ウィザード級?)な技術者です。つまり、普通は技術的・時間的に無理です。


83ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(186,559ポイント)   Date: 2010/07/17(土) 01:11   No:56866     
Title: Re:WEBブラウザ    
一般的に出回っているブラウザは、IEやMozillaのレンダリングエンジンを利用しています。例えばSleipnirだとIEと同じTrident(トライデント)を使っていますね。
http://ja.wikipedia.org/wiki/Trident
HTMLレンダリングエンジン
http://ja.wikipedia.org/wiki/HTML%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3


103ポイント を手に入れた。

Name:  ..入門者(3,096ポイント)   Date: 2010/07/17(土) 01:20   No:56869     
Title: Re:WEBブラウザ    
↑名前が抜けていました

次は確認してから投稿します


28ポイント を手に入れた。

Name:  ..プログラマー(25,001ポイント)   Date: 2010/07/17(土) 01:31   No:56871     
Title: Re:WEBブラウザ    
> 一般的に出回っているブラウザは、IEやMozillaのレンダリングエンジンを利用しています。
元からあるレンダリングエンジンを基盤にして作られている。
ということですか?

それを利用すれば、楽にできるかもしれません。
ちょっとがんばってきます。


11ポイント を手に入れた。

Name:  ..プログラマー(25,048ポイント)   Date: 2010/07/17(土) 04:09   No:56881     
Title: Re:WEBブラウザ    
とりあえずベースを作っていこうと思ってがんばっていたのですが、
わかりません。

こんな感じの戻る&進むボタンってできますか?
またどうすればできますか?


47ポイント を手に入れた。

Name: へろり  ..プログラマー(25,096ポイント)   Date: 2010/07/17(土) 07:52   No:56887     
Title: Re:WEBブラウザ    
>元からあるレンダリングエンジンを基盤にして作られている。 
>ということですか? 

Mozillaは解りませんが、IEはCOMコンポーネントが提供されています。
この、COMコンポーネントが持つ機能を外部から呼び出す事で実現します。

戻る&進むボタンはとりあえずツールバーあたりを利用するのが手っ取り早いかと。
ボタンが押されたら、メッセージを捕まえて、COMコンポーネントの戻る機能を呼び出す。

とりあえず、グーグル先生に「IEコンポーネント」って聞いてみると幸せになれるかもしれません。


完全に自作したいのでしたら、HTMLのパーサを書くところが第一歩になると思います。
もしくは、HTTPでの対話。 ですか。


163ポイント を手に入れた。

Name:  ..プログラマー(25,102ポイント)   Date: 2010/07/17(土) 09:46   No:56888     
Title: Re:WEBブラウザ    
ありがとうございます

IEコンポーネントとHTMLのパーサ
どちらも難しそうです

まずはIEコンポーネントのほうから手を出していきたいと思います


54ポイント を手に入れた。



Name: まさ  ..かけだし(1,257ポイント)   Date: 2010/07/17(土) 01:13   No:56868       
Title: エラーで3週間ぐらい悩んでます。    
ある比較的有名なゲームプログラミング(C++です)のエラーの話です。

点をいろいろとうつプログラムなんですが、
main.cpp
udate.cpp
Framework.h
DebugStream.h
がありまして

mainが
#include "Framework.h"
namespace GameLib{
    void Framework::update(){
        unsigned* vram = videoMemory();
        static unsigned i;
        vram[ i ] += i * 100;
        i += 9973; //1万以下最大の素数
        i %= ( width() * height() );
    }
}

updateが
#include "Framework.h"

namespace GameLib{

    void Framework::update(){
    getInput();
    updateGame();
    draw();
    }
}
ヘッダーにFrameworkとDebugStreamがあります。
プロパティのリンカで
追加のライブラリにD:\GameLib2008\2DGraphics1\lib
追加の依存ファイルにGameLib_d.lib
とインクルードディレクトリの設定を本に指示されたとおりにやりました。


しかし、ビルドすると
....\update.cpp(6) : error C3861: 'getInput': 識別子が見つかりませんでした
....\update.cpp(7) : error C3861: 'updateGame': 識別子が見つかりませんでした
....\update.cpp(8) : error C3861: 'draw': 識別子が見つかりませんでした
エラー3
というのがでます。

ヘッダーにエラーが出てないので、
自分はライブラリに設定したものが動いてないと勝手に思って
いろいろしているんですが全く解決できません。


私は知識はローベルのC++の本をひととおりやったくらいです。
ライブラリ(---.libなど)についてはほとんど知識がありません。

いきなりでずうずうしいかもしれませんが、本当に悩んでいます。
みなさんの意見がほしいです。

長い文章読んでいただきありがとうございます。







713ポイント を手に入れた。


Name: めるぽん  ..初心者(6,047ポイント)   Date: 2010/07/17(土) 01:37   No:56872     
Title: Re:エラーで3週間ぐらい悩んでます。    
どういう処理をしたいのか分からないのですけど、
Framework.h にある Framework クラスには getInput() と updateGame() と draw() は宣言されているのでしょうか。
できればヘッダファイルの中も貼り付けて下さい。

あと、main.cpp と update.cpp の両方で Framework::update() を定義しているので、リンク時に多重定義でエラーになりますね。
そこも修正する必要があると思います。

あと、そのエラーはコンパイルエラーなので、リンク時に発生するエラーとは関係ありません。
つまり *.lib はリンク時に使用するものなので無関係ということです。 編集済み


105ポイント を手に入れた。

Name: まさ  ..入門者(3,273ポイント)   Date: 2010/07/17(土) 01:50   No:56873     
Title: Re:エラーで3週間ぐらい悩んでます。    
ご返事ありがとうございます。

エラーがこの3つ以外出てないんですが二重定義は
ひっかかってるのでしょうか?


こちらがFrameworkです。
#ifndef INCLUDED_GAMELIB_FRAMEWORK_H
#define INCLUDED_GAMELIB_FRAMEWORK_H

namespace GameLib{

class Framework{
public:
    Framework();
    ///ユーザ定義関数。これを書く。
    void update();
    ///インスタンス取得
    static Framework instance();
    ///画面幅取得
    int width() const;
    ///画面高さ取得
    int height() const;
    ///VRAM取得
    unsigned* videoMemory();
    ///Frameworkに終了命令を出す
    void requestEnd();
    ///Frameworkに終了命令が出ているか調べる
    bool isEndRequested() const;

    //以下ライブラリ使用者は知らなくていい
    void start( void* windowHandle );
    void preUpdate();
    void postUpdate();
    static void create();
    static void destroy();
};

//cinのラッパ
class StandardInput{
public:
    StandardInput();
    StandardInput& operator>>( char& );
private:
    bool mPrevEnterOn;
};
extern StandardInput cin;

} //namespace GameLib

#include "DebugStream.h"

#endif





こちらがDebugStreamです。
#ifndef INCLUDED_GAMELIB_DEBUGSTREAM_H
#define INCLUDED_GAMELIB_DEBUGSTREAM_H

#include <string>
using namespace std;

namespace GameLib{

class RefString;
class OStringStream;

//デバグアウトにcoutで出すためのもの
//複数スレッドから同時に呼んでも良い
class DebugStream{
public:
    DebugStream();
    int precision( int );
    DebugStream& operator<<( char );
    DebugStream& operator<<( unsigned char );
    DebugStream& operator<<( int );
    DebugStream& operator<<( unsigned );
    DebugStream& operator<<( short );
    DebugStream& operator<<( unsigned short );
    DebugStream& operator<<( float );
    DebugStream& operator<<( double );
    DebugStream& operator<<( const string& );
    DebugStream& operator<<( const char* );
    DebugStream& operator<<( char* );
    DebugStream& operator<<( const RefString& );
    DebugStream& operator<<( const OStringStream& );
    DebugStream& operator<<( DebugStream& ( *f )( DebugStream& ) );
    DebugStream& endl();
    DebugStream& hex();
    DebugStream& dec();

    void begin();
    void end();
private:
    class Impl;
    Impl* mImpl;
};

DebugStream& endl( DebugStream& );
DebugStream& hex( DebugStream& );
DebugStream& dec( DebugStream& );
extern DebugStream cout;

} //namespace GameLib

#endif


ちなみに、
int main(){
Framework framework;
while(true){
framework.update();
 }
}
という構成でmain()はライブラリの中に隠れていると考えればよい
と本に書いてありました。


ライブラリの追加はプロパティのリンカで
追加のライブラリと追加の依存ファイルに
入力すればでよろしいのでしょうか?




2倍のポイントを手に入れた! 2,016ポイント を手に入れた。

Name: まさ  ..入門者(3,371ポイント)   Date: 2010/07/17(土) 02:06   No:56874     
Title: Re:エラーで3週間ぐらい悩んでます。    
めるぽんさんありがとうございます。
勉強させていただきました。


本に沿ってこうなったのですが、プログラムにたりないものはありますか?



ほかのサンプルを乗せても同じエラーが出ます。



これはテキストデータです。
  #####
 .    #
# o o #
# op# #
#   # #
#.###. 
### ###


98ポイント を手に入れた。

Name: めるぽん  ..初心者(6,152ポイント)   Date: 2010/07/17(土) 02:13   No:56875     
Title: Re:エラーで3週間ぐらい悩んでます。    
Framework クラス内に、update.cpp の Frameworkd::update() 内で使っている getInput() と updateGame() と draw() の宣言がどこにもありませんね。それが原因でエラーが出ているようです。
これらは何を呼び出したつもりなのでしょうか。

というより、もしかして update.cpp って使うつもりのないソースだったりしませんか?
それならソースツリーから除けてしまえば解決しそうですけど...。


105ポイント を手に入れた。

Name: まさ  ..初心者(6,197ポイント)   Date: 2010/07/17(土) 02:48   No:56876     
Title: Re:エラーで3週間ぐらい悩んでます。    
ありがとうございます。


updateは
ライブラリのクラスの中身のイメージがありまして
class Framework{
        public:
        void update();
    static int width();
    static int height();
    static unsigned* videoMemory();
    }
これの
「三つは使い方を覚えて、残りの一つのupdateは自分で入力して作成しよう」と書いてありました。
それでupdateを作成したんですが、何か違いましたかね?




updateを外すとこんな感じのエラーがでてきます。

>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::fpos<int> __thiscall std::basic_istream<char,struct std::char_traits<char> >::tellg(void)" (?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ) は既に GameLib_d.lib(Manager.obj) で定義されています。
1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_istream<char,struct std::char_traits<char> > & __thiscall std::basic_istream<char,struct std::char_traits<char> >::seekg(long,int)" (?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@JH@Z) は既に GameLib_d.lib(Manager.obj) で定義されています。
1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_ifstream<char,struct std::char_traits<char> >::basic_ifstream<char,struct std::char_traits<char> >(char const *,int,int)" (??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z) は既に GameLib_d.lib(Manager.obj) で定義されています。
1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) は既に GameLib_d.lib(Manager.obj) で定義されています。
1>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) は既に msvcprtd.lib(locale0_implib.obj) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy は既に msvcprtd.lib(locale0_implib.obj) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) は既に msvcprtd.lib(locale0_implib.obj) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
1>LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
1>C:\Users\admin\Documents\Visual Studio 2008\Projects\Project1\2dgraphic\Debug\2dgraphic.exe : fatal error LNK1120: 外部参照 1 が未解決です。






私の実力がないばかりにすみません。




2倍のポイントを手に入れた! 2,826ポイント を手に入れた。

Name: めるぽん  ..初心者(6,292ポイント)   Date: 2010/07/17(土) 03:07   No:56878     
Title: Re:エラーで3週間ぐらい悩んでます。    
それは何かよく見るエラーですね。

プロジェクトを右クリックして「プロパティ」→「C/C++」→「コード生成」→「ランタイム ライブラリ」
が多分「マルチスレッド デバッグ DLL」になってませんかね?
そうだとすれば「マルチスレッド デバッグ」にすればいいかも。


2倍のポイントを手に入れた! 140ポイント を手に入れた。

Name: まさ  ..初心者(6,641ポイント)   Date: 2010/07/17(土) 03:42   No:56879     
Title: Re:エラーで3週間ぐらい悩んでます。    
マルチスレッド デバッグ (/MTd)
にしたらエラーがだいぶ減って
1>LIBCMTD.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
1>C:\Users\admin\Documents\Visual Studio 2008\Projects\Project1\2dgraphic\Debug\2dgraphic.exe : fatal error LNK1120: 外部参照 1 が未解決です。
エラー2

というあんまり見ないエラー二つになりました。


frameworkに
///ユーザ定義関数。これを書く。
    void update(); 
と書いてるんですが、これはやはりupdate.cppでつくったほうがいいんですかね?
けれど、作るとまた最初の3つのエラーに悩まされるんですよね.....


2倍のポイントを手に入れた! 444ポイント を手に入れた。

Name: めるぽん  ..初心者(6,413ポイント)   Date: 2010/07/17(土) 03:54   No:56880     
Title: Re:エラーで3週間ぐらい悩んでます。    
ああ、そういえば main 関数無かったですね。先ほど書かれていたように、main.cpp のどこかに

int main(){
  Framework framework;
  while(true){
    framework.update();
  }
}


とか書いておけばよかったりしませんかね?

> ///ユーザ定義関数。これを書く。
>    void update();  
既に main.cpp で update() の定義を書いているため、
update.cpp でさらに書くと多重定義でエラーになるので、どちらかしか書いてはいけません。


121ポイント を手に入れた。

Name: まさ  ..初心者(6,782ポイント)   Date: 2010/07/17(土) 04:16   No:56882     
Title: Re:エラーで3週間ぐらい悩んでます。    
ありがとうございますエラーがなくなりました!

しかし、
int main(){
  Framework framework;
  while(true){
    framework.update();
  }
}

を入れたところエラーがなくなったんですが、
起動するとすぐにプログラムが動作を停止して
ウィンドウに「続行するには何かキーを押してください」
みたいな文字が表示される状態になりました。

情報が少ないのですが、何が足りないのでしょうか?


141ポイント を手に入れた。



Name: シエル  ..プログラマー(29,066ポイント)   Date: 2010/07/16(金) 22:33   No:56849       
Title: クラスの効率の良い使い方?について    
いつもお世話になっております。シエルです。

ちょっと内容とタイトルとが合ってないかもしれませんが、
クラスの効率の良い使い方について、質問があります。
今まで画像を描画する際に、テクスチャの変数(LPDIRECT3DTEXTURE9型のlp3dtex9)を配列にして値を格納し、
Draw(lp3dtex9[0])のように、変数の配列の要素番号を指定しながら描画していました。
ですが、何の画像か分かりにくいうえ、解放するときも別の関数を作る必要があったため、
、下記のような画像のサイズとテクスチャの情報を持ったクラスを作成し、
コンストラクタで、テクスチャを作成、デストラクタでテクスチャを解放できるようにしました。

下記のクラスはコンストラクタで、文字、文字の高さ、フォントを渡すと、
その大きさのテクスチャを作成してくれるクラスです。
(コンストラクタとデストラクタのコードは必要ないと思ったので書きません)

class MOJI
{
    LPDIRECT3DTEXTURE9 lp3dtex9;
    int width,height;
public:
    MOJI(LPCWSTR moji,int height,LPCWSTR fontname);
    ~MOJI();
    LPDIRECT3DTEXTURE9 GetTexture(void);
    int GetLength(int);
};

これで、作成したインスタンスからlp3dtex9を呼び出すことが出来るので、
lp3dtex9は配列で管理する必要がなくなりました。

が、
作成したインスタンスはたくさんあるので、結局インスタンスを配列で管理するしかないのかなと
考えており、画像を指定する際には、moji[0]->lp3dtex9のようにまた配列を使って呼び出すしかない
状況になってしまっています。

私としてはインスタンス名を見るだけで何の文字、画像なのかが分かるようにしたいのですが、
何かいい方法はありますでしょうか?
インスタンス名を分かりやすい名前に変えるという方法以外の方法でお願い致します。

ちなみに現在は、以下のように配列で対応してます。
デストラクタでテクスチャが解放されるようにしています。

MOJI *moji[100];//グローバル変数


void TextureCreate(void)
{
moji[0] = new MOJI("あ",200,"MS 明朝");
moji[1] = new MOJI("い",200,"MS 明朝");



}

void TextureDelete(void)
{
  for(int i=0;i<100;++1){
    delete moji[i];
  }
}

分かりにくいかもしれませんが、ご回答よろしくお願い致します。


538ポイント を手に入れた。


Name: ISLe  ..初心者(7,229ポイント)   Date: 2010/07/17(土) 00:17   No:56857     
Title: Re:クラスの効率の良い使い方?について    
GetTexture("ひらがな あ")
みたいにして生成したテクスチャを取得する仕組みを作ったらどうでしょう。
文字列からハッシュ値を生成してそれをキーにしたマップで管理。

余談ですが一文字ずつのテクスチャですか?
テクスチャの切り替えでそうとう描画が遅くなると思いますけど。


75ポイント を手に入れた。

Name: シエル  ..プログラマー(29,299ポイント)   Date: 2010/07/17(土) 00:38   No:56859 解決!     
Title: Re:クラスの効率の良い使い方?について    
ISLeさん。ありがとうございます。

今まだ私はアルゴリズムの勉強中でハッシュ探索を知らなかったのですが、
ググってみると、かなり私が考えている理想に近いものでした。
一度ハッシュ探索で対応してみたいと思います。ありがとうございました。

>余談ですが一文字ずつのテクスチャですか? 
>テクスチャの切り替えでそうとう描画が遅くなると思いますけど。 

一文字ずつのテクスチャです。
私も毎回テクスチャを切り換える度に、SetTextureを呼び出す必要があるので、
遅くなるかなと思ってたのですが、一文字ずつ変化を付けて描画したいなと思ってたので一文字ずつ
のテクスチャにしました。
文字列で作成したテクスチャの場合に、一文字ずつ変化をつける方法がわからなかったものでして…


233ポイント を手に入れた。

Name: めるぽん  ..初心者(5,356ポイント)   Date: 2010/07/17(土) 01:00   No:56863     
Title: Re:クラスの効率の良い使い方?について    
(勉強のために自作するなら止めませんが)ハッシュマップを自分で正しく効率良く作るのは至難の業なので、
既存の unordered_map や hash_map、もしくはハッシュマップではなく std::map を使ってもいいかもしれません。
std::map なら標準で用意されてますし、文字列ならあまり考えることなくそれなりの効率で使えるはずです。


69ポイント を手に入れた。

Name: シエル  ..プログラマー(29,321ポイント)   Date: 2010/07/17(土) 01:12   No:56867     
Title: Re:クラスの効率の良い使い方?について    
ぬるぽんさんありがとうございます。
調べてみます。


22ポイント を手に入れた。



Name: KEN  ..ぴよぴよ(632ポイント)   Date: 2010/07/15(木) 23:48   No:56746       
Title: 回転    
回転が上手くいきません


//ここで角度を回す
void rotateMatrix( float Rad )
{
    //行列初期化
    D3DXMatrixIdentity( &posMat );
    D3DXMatrixIdentity( &rotMat );

    D3DXMatrixRotationZ( &rotMat, Rad );

    for( int i = 0; i < 4; i++ ){
        //回転を座標変換で反映させる
        D3DXVec2TransformCoord( &z[i], &z[i], &rotMat );
    }

    //変換した値を戻す
    MoveMatrix( v, x1, y1, 0.0f );
void Dire()
{    
    //ここで角度を出す
         //自分の位置 − 敵の位置

    tmpRad = atan2( A.y - Z.y, A.x - Z.x );

}

宜しくお願いします 編集済み


632ポイント を手に入れた。


Name: ookami  ..プログラマー(35,715ポイント)   Date: 2010/07/16(金) 17:24   No:56822     
Title: Re:回転    
正直よく分かりませんが

この辺は参考になりますでしょうか。
http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html
http://w3e.kanazawa-it.ac.jp/math/category/gyouretu/henkan-tex.cgi?target=/math/category/gyouretu/kaitengyouretu.html

static float prevRad = tmpRad;
というのもなんだか怪しい気がしますが...

ところで、
http://eow.alc.co.jp/Dire/UTF-8/?ref=sa
Dire ... 「ものすごい」??


110ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(556,326ポイント)   Date: 2010/07/16(金) 21:59   No:56843     
Title: Re:回転    
 よくわからない点が多いです。
 CUSTOMVERTEXの型の詳細とか、どうしてその処理をしているのか、とか。


 特に
>D3DXMatrixTranslation( &posMat, v[i], v[i], 0 ); 
に関しては vは CUSTOMVERTEX *型ですが、v[0]とかすると float型になるような特殊な型なのでしょうか?


 で、ookamiさんの
>static float prevRad = tmpRad; 
>というのもなんだか怪しい気がしますが... 
は同感ですね。

 この処理が自機と敵の角度を見て真横に移動させる関数なのだとしたら
1回目のrotateMatrixの処理で自機の横に敵が移動しているのに
2回目の評価で古い角度(1回目の処理をする前の角度)との差をみて
何度傾けるかを決めているように見えます。


246ポイント を落としてしまった。

Name: KEN  ..ぴよぴよ(785ポイント)   Date: 2010/07/17(土) 00:05   No:56856     
Title: Re:回転    
さいしょからうち直したら治りました

皆さんありがとうございました 編集済み


153ポイント を手に入れた。



Name: 深黒  ..中級者(9,405ポイント)   Date: 2010/07/15(木) 11:38   No:56714       
Title: while中のint    
ループ中に変数を使う際、

int main{
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
        int count=0;
        ・
        ・
        ・
    }
}

というのと、

int count=0;
int main{
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){

        ・
        ・
        ・
    }
}

というのと、

int main{
    int count=0;
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){

        ・
        ・
        ・
    }
}
では、どれが一番、メモリの効率?動作の負荷?の効率がいいのでしょうか?


227ポイント を手に入れた。


Name: だいちゃん  ..ぴよぴよ(592ポイント)   Date: 2010/07/15(木) 11:49   No:56715     
Title: Re:while中のint    
とりあえず2番目のmainの外で宣言する(グローバル変数)は
使わないほうがいいでしょう
自分も研修時代とか学生時代は使ってましたが
これはかなりよくない方法のようです

一般的なのは3番目のやつですが
whileの中でしか使わないのであれば1番目の宣言方法だと
多分メモリの節約?になるかも?
やったことないんで分かりませんが
多分whileを抜けた瞬間その変数は消えると思うんで(ガーベジコレクションとは違うのかな?)


もっと詳しい方よろしくお願いします〜m(_ _)m


162ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(214,828ポイント)   Date: 2010/07/15(木) 11:57   No:56716     
Title: Re:while中のint    
> どれが一番、メモリの効率?動作の負荷?の効率がいいのでしょうか?

プラットフォームとコンパイラ、そしてwhile文の内容によります。
whileの副文で関数(実質的に関数として実装される演算子を含む)の呼び出しを行わず、比較的単純な処理しか行わないのであれば、最初のものが一番効率がよくなる可能性が高いと思います。


98ポイント を手に入れた。

Name: へろり  ..上級者(24,268ポイント)   Date: 2010/07/15(木) 12:13   No:56717     
Title: Re:while中のint    
ぶっちゃけどれも同じです。

処理系依存かもしれませんが、私の環境(VC6.0)で厳密に言うと。

メモリ効率はどれも同じです。

動作の負荷? で言うなら、ループの中で毎回0の代入を行う(1)が一番高いです。

2と3は同じです。

という結果ですね。


今時のパソコンなら、この程度の差は1000万回ループを回しても実行速度に0.1秒も差は出ないでしょう。
それよりもっと、構造化を意識して安全で読みやすいコードを書くべきだと思います。


だいちゃんさん
>whileの中でしか使わないのであれば1番目の宣言方法だと 
>多分メモリの節約?になるかも? 

VC6.0が吐いたコード(混合モードですが)を見たところ、while()文内で宣言されている変数も、
main() 関数突入時にスタックを確保しているようでした。

>多分whileを抜けた瞬間その変数は消えると思うんで(ガーベジコレクションとは違うのかな?)
ちょっと違いますね。 ガーベージコレクションはあくまでも動的に確保された使われないメモリを回収するものです。 スタックの場合は、あらかじめまとまった量が確保されてます。 1Mぐらい?
その確保された領域の中で、ここまで使う。 ここまで使う。 と記憶しておくだけですから。


466ポイント を手に入れた。

Name: 深黒  ..中級者(9,409ポイント)   Date: 2010/07/15(木) 12:30   No:56718 解決!     
Title: Re:while中のint    
皆さん返答ありがとうございました
m(_ _)m


4ポイント を手に入れた。

Name: ookami  ..プログラマー(35,161ポイント)   Date: 2010/07/15(木) 12:47   No:56719     
Title: Re:while中のint    
他の方も仰るとおり、ケースバイケースだと思います。

int A;
int main{
    int B; // 1
    while(なにがし){ 
        int C; // 2
        なにがし
    } // 3
} // 4

↑ちょっといじりましたが、この場合は...

■作成と破棄のタイミングに注目すると、

A:プログラム起動時に作成され、プログラム終了時に破棄される。
B://1 で作成され、//4で破棄される。
C://2 で作成され、//3で破棄される。※ 作成と破棄が、ループの回数分繰り返される。

Cが、作成と破棄が多いぶん 遅くなるように思われますが、
コンパイラが気を利かせて、無駄な作成と破棄をしないようにしてくれる可能性もあります。



■作成されるメモリ領域に注目すると、

A:ヒープ領域
B,C:スタック領域

http://blog.goo.ne.jp/wildriver_1977/e/c2c3579e7805674471509bb841772f7b
> スタック領域は、領域がそのまま使えるの高速で処理することができる。
> ヒープ領域は、ポインタアドレスから実体を見にいくので、若干速度が遅い。
↑らしいので、Aが遅くなるようにも思われますが、
これも同様で、コンパイラが高速化してくれる気がします。

--

ということで、よく分かりませんね。

結局ケースバイケースなので、私は読みやすさとかで決めちゃいます。

-- 追記

あら、解決してましたね^^; 失礼しました。 編集済み


289ポイント を手に入れた。

Name: へろり  ..上級者(24,556ポイント)   Date: 2010/07/15(木) 13:17   No:56720     
Title: Re:while中のint    
>■作成されるメモリ領域に注目すると、 

>A:ヒープ領域 
>B,C:スタック領域 

グローバル変数はデータセグメント(静的記憶領域)じゃないでしょうか。


>> ヒープ領域は、ポインタアドレスから実体を見にいくので、若干速度が遅い。 
>↑らしいので、Aが遅くなるようにも思われますが、 

今回はポインタを使ってないのでこれは関係無いかと思います。

というよりも
int main(){ 
    int a, *b = malloc(sizeof(int));
    a = 5;
00411CCB  mov         dword ptr [a],5 
    *b = 5;
00411CD2  mov         eax,dword ptr [b] 
00411CD5  mov         dword ptr [eax],5 
} 

ですので、mov 命令1個分の差です。 若干遅いと体感出来る速度差は生まれるはずは無いと思うんですが。
ちょっと眉唾なブログですね。


288ポイント を手に入れた。

Name: ISLe  ..初心者(6,652ポイント)   Date: 2010/07/15(木) 17:45   No:56724     
Title: Re:while中のint    
モトローラ系のMPUだとスタックをベースレジスタ+オフセットでアクセスするので、オフセットのバイト長が短い分有利です(でした?)ね。

PS3のCellとかPowerPCアーキテクチャのプロセッサはモトローラの設計思想を引き継いでいるし意外と影響あるかもしれません。


60ポイント を手に入れた。

Name: めるぽん  ..初心者(5,258ポイント)   Date: 2010/07/15(木) 17:49   No:56725     
Title: Re:while中のint    
効率を考えておくのは構いませんが、実際にコードを弄るのは、それが本当に問題になってからでいいでしょう。
「時期尚早な最適化は諸悪の根源だ」と偉い人も仰ってます。

ということで効率の面をおいておくなら、一般的に変数のスコープというのは出来る限り小さく保つのが好ましいと言われているので、最初の例が一番いいでしょう。
そうするのが、一番「開発効率」がいいです。

というより、最初の例と他の例で動作が変わってきませんか?
ループするたびに 0 に初期化されるのと最初だけ 0 に初期化するというのでは全く違う意味になると思うのですけど。


172ポイント を手に入れた。

Name: ookami  ..プログラマー(35,224ポイント)   Date: 2010/07/15(木) 19:12   No:56726     
Title: Re:while中のint    
# へろりさん
すみません、勘違いしておりました;;
ヒープは動的割り当ての領域なんですね...

混乱を招き、申し訳ありませんでした。


63ポイント を手に入れた。

Name: ISLe  ..初心者(6,744ポイント)   Date: 2010/07/15(木) 23:07   No:56737     
Title: Re:while中のint    
> ヒープは動的割り当ての領域なんですね...

間違ってないですよ。

基本的にデータセグメントには初期値だけが置かれて、グローバル変数はヒープを消費します。

初期値のないグローバル変数を宣言しても実行ファイルのサイズが同じだけ増えたりしないです。


92ポイント を手に入れた。

Name: へろり  ..上級者(24,095ポイント)   Date: 2010/07/16(金) 09:53   No:56803     
Title: Re:while中のint    
>基本的にデータセグメントには初期値だけが置かれて、グローバル変数はヒープを消費します

そうだったのですか。 また一つ勉強になりました。

ookamiさん私の言ったことは忘れてください。


しかし
#include <stdio.h>

int count = 10;

int main(void) 
{ 
    printf("%#x", &count);

    return 0;
}


というコードを実行した結果は
0x40a128
となりました。

このプログラムのPEヘッダを調べてみると、
IMAGE_OPTIONAL_HEADER32.ImageBase = 0x00400000
IMAGE_OPTIONAL_HEADER32.BaseOfData = 0x0000a000
となっており、データセクションがメモリ上で 0x0040a000 に配置されることが解ります。

またデータセクションのヘッダを見ると、
IMAGE_SECTION_HEADER.VirtualAddress = 0x0000a000
IMAGE_SECTION_HEADER.Misk.VirtualSize = 0x00003000
となっており、メモリ上で 0x0040a000 から 0x0040d000 までがデータセクションとなるのでは無いでしょうか。

上記のコードを走らせた結果の 0x40a128 はこのデータセクションの範囲に入っていますので、
やっぱり変数 count の実体もデータセクションに配置されていると思うのですが。 どうなんでしょう。


ちょっと手元にWindowsしかなく、PEフォーマットでしか検証は出来ませんので、セクションという言葉を使ってますが許してください。


461ポイント を落としてしまった。

Name: たかぎ [URL]  ..ハッカー(214,843ポイント)   Date: 2010/07/16(金) 11:57   No:56814     
Title: Re:while中のint    
> 基本的にデータセグメントには初期値だけが置かれて、グローバル変数はヒープを消費します。 

そんなことはないでしょう。


15ポイント を手に入れた。

Name: ookami  ..プログラマー(35,605ポイント)   Date: 2010/07/16(金) 12:29   No:56815     
Title: Re:while中のint    
お騒がせしております;

# こういう時は、大元の言語仕様・コンパイラ仕様などを見たほうがよいのでしょうが、
# 見れてません。すみません。

サイトによって、説明のされ方が違うことまでは分かって参りました。

http://www1.cts.ne.jp/~clab/hsample/Point/Point19.html
>配置のされ方は、コンパイラやコンピュータによって一部違うものがあります
>データセグメントは ... 静的変数や大域変数(グローバル変数)が配置されます。
>ヒープ領域は ... malloc( )でメモリの割付が行われ、free( )の呼び出しで解放されます。
>スタックは ... 局所変数(ローカル変数)や、関数の引数が配置されます。

http://homepage2.nifty.com/well/Variable.html
>iValue1、acName、iValue2 はヒープに。 ... 結論的には、グローバル変数はヒープに取られるということです。
>システムによっては、ヒープに入らずに、特別なデータセグメントとして存在するかもしれませんが、ヒープに入ると考えてもプログラミング上は問題ありません。


381ポイント を手に入れた。

Name: ぽこ  ..上級者(22,384ポイント)   Date: 2010/07/16(金) 18:53   No:56828     
Title: Re:while中のint    
http://homepage2.nifty.com/well/Variable.html
> >iValue1、acName、iValue2 はヒープに。 ... 結論的には、グローバル変数はヒープに取られるということです。
> >システムによっては、ヒープに入らずに、特別なデータセグメントとして存在するかもしれませんが、ヒープに入ると考えてもプログラミング上は問題ありません。

こっちはかなり眉唾な気がします。
#全体的に論理展開がおかしい。。。
#プログラム組む上では問題ないかもしれないけど、人と話す上でこの前提はマズイだろ、と思います。

私もたかぎさんと同様、「そんなことない」と思ってまして、
ISLeさんの「基本的に」っていった処理系が知りたいです。

#確かWindowsの場合って、各セクションを仮想メモリに配置し、
#その後ヒープ(管理)の初期化を行っていたと記憶しています。
#なので、ヒープにグローバル変数が配置されるってのはちょっと納得できないですね。
#Inside Windowsにこの辺の解説があると思うんですが、誰か手元に持っていませんかね?

#UNIXライクなOSでもbss領域にグローバル変数(データセグメント上の情報)が展開されるって話、
#聞いたことないんですよね。。


309ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(214,773ポイント)   Date: 2010/07/16(金) 19:41   No:56831     
Title: Re:while中のint    
> #UNIXライクなOSでもbss領域にグローバル変数(データセグメント上の情報)が展開されるって話、 
> #聞いたことないんですよね。。 

組込み用の処理系などでは、初期値付きの静的変数は、スタートアップでROMやフラッシュメモリからRAMに転送されることは普通にあります。
しかし、転送先はあくまでもdataセクションであってヒープではありません。


70ポイント を落としてしまった。

Name: ISLe  ..初心者(7,116ポイント)   Date: 2010/07/16(金) 23:43   No:56853     
Title: Re:while中のint    
ごめんなさい。
ヒープを消費するというのは間違いですね。

dataセクションやbssセクション用に(再)配置されるRAM領域をヒープに含まれると勘違いしました。

ヒープは別モノでしたね。


70ポイント を手に入れた。



Name: gyt  ..ぴよぴよ(274ポイント)   Date: 2010/07/15(木) 23:38   No:56744       
Title: マウス操作について    
今、DXライブラリを使ってプログラムを作っています。
そこで質問なのですが、マウスを左クリックしたときにその押された場所に図形を表示したいのですが一回クリックされたらその場所にずっと表示させることはできますか?
今作ったプログラムでは押し続けている場合のみ、そこに表示されます。
左クリックして離すと表示されなくなって、困ってます(><;)


↓のようなプログラムで指定した座標内で左クリックしたら赤い○を表示するように書いたつもりです。

MouseInput = GetMouseInput() ;
if( MouseX<=240&&MouseX>=120&&MouseY<=240&&MouseY>=120&&( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
    {
        
            DrawString( 130 , 130 , "○" , circle_red);

        }

ご指南お願いします(>人<)


274ポイント を手に入れた。


Name: パコネコ  ..上級者(15,020ポイント)   Date: 2010/07/16(金) 00:11   No:56748     
Title: Re:マウス操作について    
その時の座標を保存してみては?
あんまり多くなると無理ですが。

それかマス目を作っておくとか…ダメですか?


18ポイント を手に入れた。

Name: 白い時空  ..かけだし(2,403ポイント)   Date: 2010/07/16(金) 00:23   No:56753     
Title: Re:マウス操作について    
こんな感じでどうですか?
MouseInput = GetMouseInput();
static int flag=0;
if( MouseX<=240&&MouseX>=120&&MouseY<=240&&MouseY>=120&&( MouseInput & MOUSE_INPUT_LEFT ) == 1 ){
        flag = 1;
}

if(flag==1){
        DrawString( 130 , 130 , "○" , circle_red);
}


87ポイント を手に入れた。

Name: シエル  ..プログラマー(28,206ポイント)   Date: 2010/07/16(金) 00:26   No:56757     
Title: Re:マウス操作について    
マウスが押されたらフラグを立てる。
フラグがたっているときだけ処理をするようにすればいいですよ。


16ポイント を落としてしまった。

Name: gyt  ..ぴよぴよ(414ポイント)   Date: 2010/07/16(金) 16:36   No:56820     
Title: Re:マウス操作について    

皆さんありがとうございました。
フラグを立てることで、解決しました(^^)ノ

ただパコネコさんの
>その時の座標を保存してみては?

>それかマス目を作っておくとか…

というのがよく意味が分からずにいます・・・orz
もし良かったらどういう意味か、またどのように考えればいいかなど、教えて欲しいです(><)
お願いします(-人-)


140ポイント を手に入れた。

Name: パコネコ  ..上級者(16,881ポイント)   Date: 2010/07/16(金) 21:06   No:56838     
Title: Re:マウス操作について    
どうやら私の勘違いだったようですが…
たとえば
>DrawString( 130 , 130 , "○" , circle_red); 
これを
a=Mousex;
b=Mousey;
DrawString( a , b , "○" , circle_red);

こんな感じ…Mousexってマウスの座標であってました?

ボタンを押したときにaとbの値に代入見たいなのです。

マス目のほうは、配列でその配列の座標内でボタンが押されたらその配列の値を1にして
描写のときに1なら描写とすればできると思いました。

if(nannka[a][b]==1)DrawString( a , b , "○" , circle_red);

混乱させてしまってすいませんでした。






261ポイント を手に入れた。

Name: gyt  ..ぴよぴよ(565ポイント)   Date: 2010/07/16(金) 21:35   No:56840 解決!     
Title: Re:マウス操作について    

なるほど!!
パコネコさん、丁寧に教えてくださりありがとうございます。

そういう考え方もできますね。
参考にさせてもらいます。

皆さん、丁寧な解説ありがとうございました。


5ポイント を手に入れた。



Name: ルーニー  ..ぴよぴよ(567ポイント)   Date: 2010/07/16(金) 18:20   No:56824       
Title: ファイルを読み込まない。    
「テキストエディット」のファイルが出力しません。
ファイル名は、「情報をみる」で表示した「場所」の最後に「保存したファイル名」を入力したのですが、うまくいきません。
確認の為に、ファイルを読み込んで標準出力するプログラムを作ったのですが、やはり読み込んでいないようです。
どのようにすれば、読み込ませられるでしょうか?下に、そのプログラムを載せておきます。よろしくお願いします。

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char line[100],point[100];
    
    FILE*in_file;
    in_file=fopen("場所/ファイル名","r");
    if(in_file==NULL){
        printf("ファイルが開きません\n");
        return 0;
    }
    
    
    while(fgets(line,100,in_file)!=NULL)    { 
        sscanf(line, "%s" ,point);
        printf("point=%s",point);
    }
    
    
    fclose(in_file);
    
    
    return 0;
}


238ポイント を手に入れた。


Name: dic  ..比類無きプログラマー(86,783ポイント)   Date: 2010/07/16(金) 18:31   No:56826     
Title: Re:ファイルを読み込まない。    
パスが通っているか
ファイルがあるか
確認してください


31ポイント を手に入れた。

Name: パコネコ  ..上級者(16,464ポイント)   Date: 2010/07/16(金) 20:27   No:56835     
Title: Re:ファイルを読み込まない。    
ちょっと無駄な作業かもだけど、モードをrじゃなくaでやってみて何もせずに終了。
どこに作られてるかで、場所が間違ってるか見たいな確認じゃダメですか?


35ポイント を手に入れた。



Name: KKK  ..ぴよぴよ(53ポイント)   Date: 2010/07/16(金) 00:20   No:56750       
Title: C言語のfor文問題    
わからない問題がありまして・・・

下のアスタリスクを表示させる問題なのですが・・・

課題の締め切りはあと僅かで、考えてる暇もないので、

わかる方いたら、C言語のソースコードだけでいいので、教えてくだい、お願いします

ただし、printfで、全てのアスタリスクを表示させるのはNGで、配列も使ってはいけません。

C言語はfor文が苦手です・・・


(1)

   *
   **
   ***
   **
   *

(2)

    *
   ***
  *****
   ***
    *

(3)

   **
  ****
   **

↑コンパイラした後の、表示イメージはこんな感じです。

以上3問です。


53ポイント を手に入れた。


Name: パコネコ  ..上級者(15,153ポイント)   Date: 2010/07/16(金) 00:22   No:56752     
Title: Re:C言語のfor文問題    
ソースを直接教えるのはここではアウトなんですよね。
考え方と解き方もしくはヒントでよければ…

多分そのうち怒られますよ?「利用規約読んでください」って…


82ポイント を手に入れた。

Name: パコネコ  ..上級者(15,175ポイント)   Date: 2010/07/16(金) 00:24   No:56754     
Title: Re:C言語のfor文問題    
この形で固定ですか?
たとえば入力してその数値が一辺の長さになったり…


22ポイント を手に入れた。

Name: ぽこ  ..上級者(22,171ポイント)   Date: 2010/07/16(金) 00:25   No:56756     
Title: Re:C言語のfor文問題    
> ただし、printfで、全てのアスタリスクを表示させるのはNGで、配列も使ってはいけません。
 
では、puts使えば良いんじゃないですか?


12ポイント を手に入れた。

Name: パコネコ  ..上級者(15,191ポイント)   Date: 2010/07/16(金) 00:26   No:56758     
Title: Re:C言語のfor文問題    
…後で先生に怒られる気がする…

16ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(589ポイント)   Date: 2010/07/16(金) 00:37   No:56759     
Title: Re:C言語のfor文問題    
とりあえず先生に怒られてきましょう
それがいやならまずはソースを書いてみましょう


41ポイント を手に入れた。

Name: シエル  ..プログラマー(28,229ポイント)   Date: 2010/07/16(金) 00:39   No:56761     
Title: Re:C言語のfor文問題    
ほとんど同じような質問前になかったっけ?

9ポイント を手に入れた。

Name: パコネコ  ..上級者(15,395ポイント)   Date: 2010/07/16(金) 00:39   No:56762     
Title: Re:C言語のfor文問題    
返信待ってても無駄な気がしてきたので、
一つ目のヒントでも…
(1) 


** 
*** 
** 
*
これを、表にします。
行:数
 1: 1
 2: 2
 3: 3
 4: 2
 5: 1
3までは一つずつ大きくなって、それ以降減っていきます。
for文苦手らしいですが、意味の理解はできてますか?
一応それも書いときます。
for(@;A;B){
 式
}
 まず最初に@を行います。
これはfor文に入った時の一回だけです。
おもに数値の初期化みたいなのが入ることが多いです。
a=0
みたいなの

次にAです。
条件式です。
if文みたいなものです。わかりますか?

最後にBです。
一番下の「}」のときに処理します。
たとえば
a=a+1
みたいな式が入ることが多いです。
わからないところはどこですか?







204ポイント を手に入れた。

Name: ぽこ  ..上級者(22,201ポイント)   Date: 2010/07/16(金) 00:42   No:56763     
Title: Re:C言語のfor文問題    
大学の場合だと、先生が怒るってことは、まず無いと思いますよ。
単純に単位がもらえなくなるだけです。


30ポイント を手に入れた。

Name: パコネコ  ..上級者(15,478ポイント)   Date: 2010/07/16(金) 00:43   No:56764     
Title: Re:C言語のfor文問題    
この問題では式の部分に
printf("*");
を入れてあげてください。
これでできるはずです。
一度書いてみてください。それでもわからないところはお教えします。
あとこれの場合for文は重ねて使います。



83ポイント を手に入れた。

Name: パコネコ  ..上級者(15,640ポイント)   Date: 2010/07/16(金) 00:48   No:56765     
Title: Re:C言語のfor文問題    
そういえば大学の先生は怒ってくれないってよく先生(高校の)が、言ってましたね。
ソースかけたら、できれば張ってくださいね。
3問ぐらいならそんなに時間掛からないと思うので、1時間かからないかと…
(教えてもらいながらでも)


2倍のポイントを手に入れた! 162ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(621ポイント)   Date: 2010/07/16(金) 00:50   No:56766     
Title: Re:C言語のfor文問題    
(1)の場合だと
for(・・・){
    for(・・・)

}
for(・・・){
    for(・・・)

}
出来ると思います


32ポイント を手に入れた。

Name: パコネコ  ..上級者(15,682ポイント)   Date: 2010/07/16(金) 00:52   No:56767     
Title: Re:C言語のfor文問題    
本人見てますかね?
もう寝てますか〜?


2倍のポイントを手に入れた! 42ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(633ポイント)   Date: 2010/07/16(金) 00:53   No:56769     
Title: Re:C言語のfor文問題    
やっぱりこういう課題出るのって大学なんですかね

12ポイント を手に入れた。

Name: KKK  ..ぴよぴよ(121ポイント)   Date: 2010/07/16(金) 00:54   No:56770     
Title: Re:C言語のfor文問題    
> ソースを直接教えるのはここではアウトなんですよね。
> 考え方と解き方もしくはヒントでよければ…

> 多分そのうち怒られますよ?「利用規約読んでください」って…ぎり

今回限りでお願いします、とにかく時間がないので。

この課題が終われば、次からは、夏休みにはいるので、そこからは自力で解けるようにします。



68ポイント を手に入れた。

Name: シエル  ..プログラマー(28,428ポイント)   Date: 2010/07/16(金) 00:55   No:56771     
Title: Re:C言語のfor文問題    
まったく分からないのはひどすぎます。
少しは自分で考えてコードを提示しましょう。


33ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(664ポイント)   Date: 2010/07/16(金) 00:59   No:56773     
Title: Re:C言語のfor文問題    
とりあえず書けたところまででもいいのでソースを見せてください

31ポイント を手に入れた。

Name: パコネコ  ..上級者(15,909ポイント)   Date: 2010/07/16(金) 01:00   No:56774     
Title: Re:C言語のfor文問題    
/*
課題の締め切りはあと僅かで、考えてる暇もないので、 
わかる方いたら、C言語のソースコードだけでいいので、教えてくだい、お願いします 
*/
とりあえずこの文章の悪いところを書いときますね。
締め切りまであと僅か?難しくてわからないのはわかりますが、時間が足りなくなるほどの問題じゃないです。
解き方さえわかれば、時間はあまりかかりません。

ソースコードだけでも?ソースコードって丸っきり答えじゃないですか!
利用規約読まないと結構反応冷たいですよ。

とりあえず丸投げどころか、答えだけを請求するのはひどいですよ〜。



227ポイント を手に入れた。

Name: KKK  ..ぴよぴよ(270ポイント)   Date: 2010/07/16(金) 01:04   No:56775     
Title: Re:C言語のfor文問題    
すいません、

じゃあ自分なりに書いたコードを書きますね。

include<stdio.h>
         void main (void)
   {
        int i,b;
     
           for(i=0; i<5; i++)
          {
             if(i<3)
         {   
            for(b=0; b<=i; b++)
            {
                printf("*");
            }
         }
         else
         {
          for(i=3; i0; i--) 
           
           {
                printf("*");
           }
        }
        printf("\n");
    }


}       


149ポイント を手に入れた。

Name: パコネコ  ..上級者(15,999ポイント)   Date: 2010/07/16(金) 01:05   No:56776     
Title: Re:C言語のfor文問題    
やる気があるなら付き合いますけど…他にもやらないといけない宿題でも溜まっているんですか?
とにかく実際に動かなくてもいいので自分でできるところまでソースのせてください。
足りない部分を埋めながらでも教えますから…2時までには終わりますよ…順調にいけばですけど
================
タイミングが…失礼
 編集済み


90ポイント を手に入れた。

Name: パコネコ  ..上級者(16,140ポイント)   Date: 2010/07/16(金) 01:14   No:56777     
Title: Re:C言語のfor文問題    
#include<stdio.h> 
void main (void) 

    int i,b; 
    for(i=0; i<5; i++){
        if(i<3)for(b=0; b<=i; b++)printf("*");
        else for(b=i; 0<b; b--)printf("*");
        printf("\n"); 
    }
}
とりあえず見ずらかったので書き換えました。
#つけ忘れてますよ…2つ目のループではiではなくbでループしましょう。
少し待ってくださいね、どう直せばよくなるか、見てみます。


141ポイント を手に入れた。

Name: KKK  ..ぴよぴよ(296ポイント)   Date: 2010/07/16(金) 01:16   No:56779     
Title: Re:C言語のfor文問題    
ありがとうございます、ホントに。

2倍のポイントを手に入れた! 26ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(701ポイント)   Date: 2010/07/16(金) 01:17   No:56780     
Title: Re:C言語のfor文問題    
外側のforのカウント用の変数にiを使っているのに内側のforのカウント用の変数にもiを使っています

37ポイント を手に入れた。

Name: パコネコ  ..上級者(16,267ポイント)   Date: 2010/07/16(金) 01:22   No:56781     
Title: Re:C言語のfor文問題    
とりあえずできるだけ近い形で修復しました。
#include<stdio.h> 
void main (void) 

    int i,b; 
    for(i=1; i<=5; i++){
        if(i<3)for(b=0; b<i; b++)printf("*");
        else for(b=6-i; 0<b; b--)printf("*");
        printf("\n"); 
    }
}
最初のfor文のとき、0からやっていたので中のループからすれば1回行いません
6-iは前に書いたグラフから式を出しました。



127ポイント を手に入れた。

Name: パコネコ  ..上級者(16,196ポイント)   Date: 2010/07/16(金) 01:27   No:56782     
Title: Re:C言語のfor文問題    
どこで何を行っているのかさえわかっていただければいいと思います。
元のソースを見てみるとiの値を触るなどのミスもありますが、結構おしいところまでできていました。
時間ないらしいのでソース書きましたが…。
次の問題も完成したら(未完成でも可)張ってくださいね。


71ポイント を落としてしまった。

Name: MAY  ..ぴよぴよ(717ポイント)   Date: 2010/07/16(金) 01:31   No:56783     
Title: Re:C言語のfor文問題    
else for(b=5-i;b>0;b--)
だと思うんですけど


16ポイント を手に入れた。

Name: KKK  ..ぴよぴよ(330ポイント)   Date: 2010/07/16(金) 01:32   No:56784     
Title: Re:C言語のfor文問題    
> どこで何を行っているのかさえわかっていただければいいと思います。
> 元のソースを見てみるとiの値を触るなどのミスもありますが、結構おしいところまでできていました。
> 時間ないらしいのでソース書きましたが…。
> 次の問題も完成したら(未完成でも可)張ってくださいね。

どーも、付き合ってくれてありがとうございます。


2倍のポイントを手に入れた! 34ポイント を手に入れた。

Name: パコネコ  ..上級者(16,213ポイント)   Date: 2010/07/16(金) 01:33   No:56785     
Title: Re:C言語のfor文問題    
それだとi=5のとき足りなくなりません?


17ポイント を手に入れた。

Name: パコネコ  ..上級者(16,263ポイント)   Date: 2010/07/16(金) 01:35   No:56786     
Title: Re:C言語のfor文問題    
/*
else for(b=5-i;b>0;b--) 
だと思うんですけど
*/
これだと他のところもいじればいいけど、ここだけなら駄目だと思う

================
たとえば
    for(i=0; i<=5; i++){
        if(i<3)for(b=0; b<=i; b++)printf("*");
        else for(b=5-i; 0<b; b--)printf("*");
        printf("\n"); 
    }
こんなんですよね。
 編集済み


50ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(704ポイント)   Date: 2010/07/16(金) 01:35   No:56787     
Title: Re:C言語のfor文問題    
else for(b=0;b<5-i;b++)
でも出来ると思います


13ポイント を落としてしまった。

Name: パコネコ  ..上級者(16,285ポイント)   Date: 2010/07/16(金) 01:37   No:56788     
Title: Re:C言語のfor文問題    
もともとb--って書いてたのでそっちで書きました。

22ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(729ポイント)   Date: 2010/07/16(金) 01:38   No:56789     
Title: Re:C言語のfor文問題    
すいません携帯から何で間違ってるといけないんで後は任せますね

25ポイント を手に入れた。

Name: ぽこ  ..上級者(22,075ポイント)   Date: 2010/07/16(金) 01:39   No:56790     
Title: Re:C言語のfor文問題    
> やっぱりこういう課題出るのって大学なんですかね

というか、この時期に課題が出るのが大学なんです。
#そして、不真面目な学生がネットで課題を丸投げするのが、この時期の風物詩の一つです。

まあ、(2)(3)もパコネコさんが提示したソースをベースにすれば大丈夫でしょうね。
アスタリスクの出力回数を変更するだけだし。


126ポイント を落としてしまった。

Name: パコネコ  ..上級者(16,291ポイント)   Date: 2010/07/16(金) 01:40   No:56791     
Title: Re:C言語のfor文問題    
グラフいります?

6ポイント を手に入れた。

Name: パコネコ  ..上級者(16,341ポイント)   Date: 2010/07/16(金) 01:48   No:56792     
Title: Re:C言語のfor文問題    
付き合いたいですが親がうるさくて(明日も学校で)…仕方ないので寝ます。
最後までつきあえなくてごめんなさい。
また明日きます。


50ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(772ポイント)   Date: 2010/07/16(金) 01:53   No:56793     
Title: Re:C言語のfor文問題    
ちょっとヒント(2)
今回は*だけではなく空白(_)も描画しなくてはなりません
__*
_***
*****
_***
__*



43ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(791ポイント)   Date: 2010/07/16(金) 01:59   No:56794     
Title: Re:C言語のfor文問題    
ちなみに課題の提出日はいつですか?

19ポイント を手に入れた。

Name: パコネコ  ..上級者(16,357ポイント)   Date: 2010/07/16(金) 02:01   No:56795     
Title: Re:C言語のfor文問題    
それ私も気になっていました

16ポイント を手に入れた。

Name: パコネコ  ..上級者(16,375ポイント)   Date: 2010/07/16(金) 02:05   No:56796     
Title: Re:C言語のfor文問題    
ちなみに今はpspからです。
長い文はしんどいから書かないけど・・・


18ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(804ポイント)   Date: 2010/07/16(金) 02:06   No:56797     
Title: Re:C言語のfor文問題    
携帯よりはましですよ

13ポイント を手に入れた。

Name: パコネコ  ..上級者(16,405ポイント)   Date: 2010/07/16(金) 02:17   No:56798     
Title: Re:C言語のfor文問題    
更新ボタン押した後長いんですよね
書いてる間は、前の文見えませんし


30ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(848ポイント)   Date: 2010/07/16(金) 02:29   No:56799     
Title: Re:C言語のfor文問題    
書いている間前の文が見れないのは同じです

それにしても遅いですね大丈夫かな


2倍のポイントを手に入れた! 44ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(805ポイント)   Date: 2010/07/16(金) 02:34   No:56800     
Title: Re:C言語のfor文問題    
もしかしてもう解決してるとか?
携帯からでは見れないので

それか明日までじゃないのか



43ポイント を落としてしまった。

Name: KKK  ..ぴよぴよ(339ポイント)   Date: 2010/07/16(金) 09:59   No:56804     
Title: Re:C言語のfor文問題    
> もしかしてもう解決してるとか?
> 携帯からでは見れないので

> それか明日までじゃないのか



今日までです


9ポイント を手に入れた。

Name: さかまき  ..ぴよぴよ(673ポイント)   Date: 2010/07/16(金) 10:48   No:56808     
Title: Re:C言語のfor文問題    
最小2乗法による離散データの近似結果を用い、1〜5における
スペースの数、星の数を数式化して解く方法です。
printfと配列をつかわずに(1)と(2)を解いてみました。

ちなみに(3)の星の数の方程式は
 -2 * x*x + 8x -4  (x=1,2,3) です。



#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int    funcSpace(int x)
{
double y=0.0;

    y += -(1.0 / 6.0)  * pow(x,4);
    y += 2.0 * pow(x,3) ;
    y += -(235.0 / 30.0) * pow(x,2) ;
    y += 11.0 * x ;
    y += -3.0  ;
    return (floor(y + 0.5));
}

int    funcAsterisk(int x)
{
double y=0.0;

    y += (1.0 / 3.0)  * pow(x,4);
    y += -4.0 * pow(x,3) ;
    y += (141 / 9.0) * pow(x,2) ;
    y += -22.0 * x ;
    y += 11.0  ;
    return (floor(y + 0.5));
}


void    drawSpace(int j)
{
    j=funcSpace(j);
    while(j>0)
    {
        putchar (' ');
        j--;
    }
}


void    drawAsterisk(int j)
{
    j=funcAsterisk(j);
    while(j>0)
    {
        putchar ('*');
        j--;
    }
}

main()
{
int    i;
    // (1)
    puts("(1)");
    for(i=1;i<6;i++)
    {
        drawAsterisk(i);
        puts("");
    }

    // (2)
    puts("(2)");
    for(i=1;i<6;i++)
    {
        drawSpace(i);
        drawAsterisk(i);
        puts("");
    }
}



113ポイント を落としてしまった。

Name: パコネコ  ..上級者(16,429ポイント)   Date: 2010/07/16(金) 20:09   No:56834     
Title: Re:C言語のfor文問題    
今日までってことはもちっと早く知りたかった…
今日ってことはもう手遅れか…


24ポイント を手に入れた。



Name: わたつみ  ..ぴよぴよ(81ポイント)   Date: 2010/07/16(金) 10:55   No:56809       
Title: ifの条件を抜けた後    
はじめまして。プログラミングを始めてまだ1ヶ月ちょっとの新人です。
質問ですが、画像を方向キーでマス目通りに移動させたいのですが、
現在地から左方向にマスがある時、flag4=1
それ以外、flag4=0
として

if (flag4=1)
{if(Key[KEY_INPUT_NUMPAD4]==1)Xzahyou-=48;}

と書くと、41章の「毎回書くプログラムの骨格(キー入力監視付)」を使わせてもらっているので
移動した直後に画像が元の位置に戻ってしまいます。
ifの条件を抜けた後も処理を反映させておくにはどうすればいいのでしょうか?


81ポイント を手に入れた。


Name: へろり  ..上級者(24,721ポイント)   Date: 2010/07/16(金) 11:07   No:56811     
Title: Re:ifの条件を抜けた後    
これだけでは何とも言えませんが。

変数 Xzahyou が画像のX軸の表示位置を保持していると仮定して。
この Xzahyou をどこかで元の値に戻してませんか?

if(Key[KEY_INPUT_NUMPAD4]==1) の中の式は、ある特定のキーが押されていたら。 という意味でいいでしょうか。

>移動した直後に画像が元の位置に戻ってしまいます。

という事ですが、キーを押しっぱなしにしていても、移動した直後に元の位置に戻りますか?


2倍のポイントを手に入れた! 242ポイント を手に入れた。

Name: シエル  ..プログラマー(28,498ポイント)   Date: 2010/07/16(金) 11:09   No:56812     
Title: Re:ifの条件を抜けた後    
if (flag4=1) 
↑これだと、毎回flag4に1を代入してしまってますが、大丈夫ですか?

if (flag4==1)の間違いではないですか?

 


21ポイント を手に入れた。

Name: さかまき  ..ぴよぴよ(759ポイント)   Date: 2010/07/16(金) 11:11   No:56813     
Title: Re:ifの条件を抜けた後    
質問の答えではありませんが、ありがちなミスがあるので。
if (flag4=1) は常に真となります。
私は定数との比較をする時は、if(定数==変数)で書く様にしています。
そうすると if (1=flag4)と書くとコンパイラさんがミスを教えてくれます。


86ポイント を手に入れた。

Name: わたつみ  ..ぴよぴよ(531ポイント)   Date: 2010/07/16(金) 14:50   No:56817     
Title: Re:ifの条件を抜けた後    
ご指摘通り(flag4=1)になってました。
なのでいろいろ書き直してみたら、今度はキーを押すと(押しっぱなしにしても)
一瞬消えてから、またもとの位置に表示されるようになってしまいました。
実際のコードを載せておくので、間違いなどあったらご指摘お願いします。

//ココから

//画像
int BF=LoadGraph("masume.png"),gazou[5];
LoadDivGraph ("gazou.png",5,5,1,64,41,gazou);
DrawGraph(0,0,BF,FALSE);


//座標
int yoko[13],tate[17],px=9,py=12;
yoko[px]=(px*48);
tate[py]=(py*16+160);


//移動
if ((px>0) && (py<16))
{if (Key[KEY_INPUT_NUMPAD4]==1)px--,py++;}

if ((px<12) && (py<16))
{if (Key[KEY_INPUT_NUMPAD2]==1)px++,py++;}

if ((px>0) && (py>0))
{if (Key[KEY_INPUT_NUMPAD8]==1)px--,py--;}

if ((px<12) && (py>0))
{if (Key[KEY_INPUT_NUMPAD6]==1)px++,py--;}

        
//描画
DrawGraph(yoko[px],tate[py],gazou[1],TRUE);

//ココまで



450ポイント を手に入れた。

Name: さかまき  ..ぴよぴよ(898ポイント)   Date: 2010/07/16(金) 15:36   No:56818     
Title: Re:ifの条件を抜けた後    
もし
Key[KEY_INPUT_NUMPAD4]==1
Key[KEY_INPUT_NUMPAD2]==1
Key[KEY_INPUT_NUMPAD8]==1
Key[KEY_INPUT_NUMPAD6]==1
で、px=9、py=12 だと
px--,py++;
px++,py++;
px--,py--; 
px++,py--;
となって結局pxもpyも値は変わらないけど、そういう事では無いですか?


139ポイント を手に入れた。

Name: スキマ妖怪  ..入門者(2,833ポイント)   Date: 2010/07/16(金) 18:59   No:56829     
Title: Re:ifの条件を抜けた後    
もしかして、提示されたコードをwhile、forとかの中に全部書いてたりしますか?

もしそうだと、

> int yoko[13],tate[17],px=9,py=12; 

毎回初期化されてしまうので結果、移動しても戻ってしまうのではないでしょうか


60ポイント を手に入れた。

Name: わたつみ  ..ぴよぴよ(638ポイント)   Date: 2010/07/16(金) 19:25   No:56830     
Title: Re:ifの条件を抜けた後    
> もしかして、提示されたコードをwhile、forとかの中に全部書いてたりしますか?

よく確認したら、whileの中に書いてました…
お騒がせしてすみませんでした。

もしよろしければ、41章の「毎回書くプログラムの骨格(キー入力監視付)」のサンプルの
どこに何(intやDrawGraphなど)を書けばいいのか教えて頂けないでしょうか?
プログラムの書く順番がいまいちよく解らないので…


107ポイント を手に入れた。



Name: X  ..かけだし(1,255ポイント)   Date: 2010/07/13(火) 17:36   No:56581       
Title: 最小化すると動かない    
こんにちは。初心者のXです。(^^)

DxLib使って、画面を出したときにある、最小化ボタンを押すと、最小化されるんですが、
元に戻そうとすると、
-------------------------------------------------
DinosaurX.exe の 0x005d8f23 で初回の例外が発生しました:
 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。

DinosaurX.exe の 0x005d8f23 でハンドルされていない例外が発生しました:
 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
-------------------------------------------------
と出てきて、エラーが起きて、そこで止まってしまいます。
どうすればよいでしょうかm(__)m

ちなみにVisualC++2008 Express Editionで、
    OSはWindowsXP Home Editionです。

  よろしくおねがいします。
        編集済み


240ポイント を手に入れた。


Name: やっくん  ..プログラマー(29,361ポイント)   Date: 2010/07/13(火) 18:58   No:56590     
Title: Re:最小化すると動かない    
ソースコードの提示をお願いしてもよろしいでしょうか?


21ポイント を手に入れた。

Name: X  ..かけだし(2,317ポイント)   Date: 2010/07/14(水) 18:33   No:56657     
Title: Re:最小化すると動かない    
ソースです------------------------------------------------------------------

#include "DxLib.h"
#include "../head/struct.h"
#include "../head/function.h"
#include "../head/define.h"

#define  GLOBAL_INSTANCE
#include "../head/global.h"




int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
       
    int max[16];

    ch_t ch;
    back_t bc;
    music_t ms;



    bc.x = GetClipMinX;
    bc.y = GetClipMinY;

    ch.x = 320;
    ch.y = 320;
    ch.walking_flag = 0;
    ch.muki = 3;



    SetMainWindowText("Ben10");

    

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; 
 
  
    SetDrawScreen( DX_SCREEN_BACK ) ;          

    

    LoadDivGraph("dat/img/max.png",16,4,4,32,32,max);

    ms.music = LoadSoundMem("dat/bgm/village_01.mp3");
    bc.img = LoadGraph("dat/img/bk_ground.png");


    PlaySoundMem(ms.music,DX_PLAYTYPE_LOOP);
    


    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){



if(ch.x%32==0 && ch.y%32==0){        
            ch.walking_flag=1;       
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  
                    ch.muki=0;     
            else if( Key[ KEY_INPUT_LEFT ]  == 1 ) 
                    ch.muki=1;         
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  
                    ch.muki=2;        
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  
                    ch.muki=3;         
            else                           
                    ch.walking_flag=0; 

            if      (ch.walking_flag == 1)
                if(can_or_cannot(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
                    ch.walking_flag=0;                  //歩かないフラグを立てる。

}
        if(ch.walking_flag==1){      
            if     (ch.muki==0)   {    
                    ch.y--;
                    bc.y++;
            }
            else if(ch.muki==1)  {      
                    ch.x--;
                    bc.x++;
            }
            else if(ch.muki==2)   {   
                    ch.y++;
                    bc.y--;
            }
            else if(ch.muki==3)    {    
                    ch.x++;
                    bc.x--;
            }
        }

        ch.img = max[(ch.x % 32 +  ch.y % 32)/8 + ch.muki * 4];
        

        DrawGraph( bc.x , bc.y ,bc.img ,FALSE);
        DrawGraph( GetCenterX-16, GetCenterY-16, ch.img,TRUE);
      
        
        ScreenFlip();
        
    }
 
    DxLib_End();
    return 0;
}

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

お願いします(*_ _)


1,062ポイント を手に入れた。

Name: ookami  ..プログラマー(35,786ポイント)   Date: 2010/07/16(金) 17:39   No:56823     
Title: Re:最小化すると動かない    
ソースには、特に怪しいところは無いように思います。
あとは...
 ・DxLibを最新版にする
 ・PCを再起動してみる
 ・「最小化→戻す」ではなく「画面外をクリック→画面内をクリック」でも同じ現象が起こるか確認
 ・DxLibの作者さんに連絡してみる
くらいでしょうか...



71ポイント を手に入れた。



Name: ぷにょ  ..ぴよぴよ(134ポイント)   Date: 2010/07/15(木) 23:27   No:56741       
Title: 文字を表示できません    
C言語初心者です。OSはウィンドウズビスタ、コンパイラはMicrosoft Visual C++ 2010を
使用しています。
次のコードで文字を表示したいのですが、下記のエラーが出てしまいます。

<コード>
#include <stdio.h>

int main(void)
{

        printf("こんにちは\n");
    
    return 0;
}


<エラー内容>
------ ビルド開始: プロジェクト: プリント, 構成: Debug Win32 ------
  プリント1.cpp
LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Users\***\documents\visual studio 2010\Projects\プリント\Debug\プリント.exe : fatal error LNK1120: 外部参照 1 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

どなたか解決方法のご教示をお願いします。


2倍のポイントを手に入れた! 84ポイント を手に入れた。


Name: ISLe  ..初心者(6,947ポイント)   Date: 2010/07/15(木) 23:35   No:56742     
Title: Re:文字を表示できません    
プロジェクトを作るとき『Win32 プロジェクト』を選択したのが原因です。
『Win32 コンソールアプリケーション』でプロジェクトを作り直してください。



56ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,233,617ポイント)   Date: 2010/07/15(木) 23:35   No:56743     
Title: Re:文字を表示できません    
プロジェクトの設定がWin32アプリケーションになっているのではないでしょうか?
コンソールプログラムを作りたいならコンソールアプリケーションにしないといけません。

プロジェクトはどうやって作りました?



※コンソールアプリケーションのプログラムの作り方
・新規作成>プロジェクト で 「プロジェクトの種類」を「Win32」に、「テンプレート」を「Win32コンソールアプリケーション」にします。


167ポイント を手に入れた。

Name: ぷにょ  ..ぴよぴよ(383ポイント)   Date: 2010/07/16(金) 00:25   No:56755     
Title: Re:文字を表示できません    
早速の回答をいただきありがとうございます。
申し訳ありません、ご指摘の手順で作成したところ、今度は次のエラーが出てきました。

------ ビルド開始: プロジェクト: ぷりんと, 構成: Debug Win32 ------
  ぷりんと1.cpp
c:\users\***\documents\visual studio 2010\projects\ぷりんと\ぷりんと1.cpp(10): fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "StdAfx.h"' をソースに追加しましたか?
  ぷりんと.cpp
c:\users\***\documents\visual studio 2010\projects\ぷりんと\ぷりんと.cpp(10): fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "StdAfx.h"' をソースに追加しましたか?
  コードを生成中...
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

何分初心なもので申し訳ありません。


249ポイント を手に入れた。

Name: シエル  ..プログラマー(28,220ポイント)   Date: 2010/07/16(金) 00:38   No:56760     
Title: Re:文字を表示できません    
空のプロジェクトで作成してください

14ポイント を手に入れた。

Name: ぷにょ  ..ぴよぴよ(405ポイント)   Date: 2010/07/16(金) 01:16   No:56778 解決!     
Title: Re:文字を表示できません    
ISLeさん、Dixq(管理人)さん、シエルさん、
解決できました。ありがとうございます。 



22ポイント を手に入れた。



Name: いむ  ..ぴよぴよ(562ポイント)   Date: 2010/07/15(木) 00:01   No:56682       
Title: ボタンについて    
どうでもよいような質問になってしまうかも
しれませんが、DXライブラリとC言語を使って色々と
プログラムを組んだりして練習?しているのですが、
ウィンドウ上にクリックできるボタンを配置することは
できますか?


77ポイント を落としてしまった。


Name: 山崎  ..熟練のプログラマー(45,610ポイント)   Date: 2010/07/15(木) 09:26   No:56712     
Title: Re:ボタンについて    
おはようございます。

「ウィンドウ上にクリックできるボタンを配置する」とのことですが、
ご自身でそのような仕組みを作れば十分可能であると思います。

DXライブラリを使わない場合でも、MFCとかいうモノを使えば、
一般的なウインドウズプログラムにあるようなコマンドボタンやチェックボックスなどを
比較的簡単に利用できると思います。
(この辺は詳しくないので、それ以上のことは他の方にお願いします…)

さてそのボタンをご自身で作る場合です。
「四角い枠の中をクリックすれば 何かしらの処理が行われる」というモノを満たせば
最低限のボタンにはなると思います。
なので、
・DXライブラリのDrawGraphやDrawBoxを使用してボタンとなる枠や絵を描画
・GetMouseInputとGetMousePointを使って、「枠の中をクリックしたか」を判定
・枠の中がクリックされたら、ボタンが押されたときに行いたい処理を実行
これを行えば、それっぽい動作にはなると思います。

「ボタン構造体」のようなものを作って、ボタンの左端の座標、ボタンの大きさなどをメンバを持たせれば、
移動したり再利用しやすい形で実装できるかなと思います。
また、「クリック」だけではなく、
「マウスのボタンが押された瞬間の処理」「ボタンが離された瞬間の処理」など、
処理を発生させるタイミングも自由に作れると思います。


3ポイント を手に入れた。

Name: シエル  ..プログラマー(28,222ポイント)   Date: 2010/07/15(木) 10:32   No:56713     
Title: Re:ボタンについて    
DXライブラリはまったく使わないので、出来るかわかりませんが
WINAPIならできますよ。


29ポイント を手に入れた。

Name: いむ  ..ぴよぴよ(680ポイント)   Date: 2010/07/15(木) 17:44   No:56723     
Title: Re:ボタンについて    
返信ありがとうございます。

>>山崎さん
やっぱり画像を使ってその範囲内で
クリックされたら・・・という処理になりますよね。
MFCについてはよくわからないです

>>シエルさん
WINAPIは少し見た程度なので山崎さんの
仰る方法にしようと思います


118ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(86,068ポイント)   Date: 2010/07/15(木) 19:57   No:56727     
Title: Re:ボタンについて    
WINAPIはCreateWindowですね
でもWINAPIの処理はDXライブラリがやる前提なので
ごちゃごちゃになるでしょうね
javaだと楽なんですけどね


26ポイント を手に入れた。



Name: TKOZ  ..熟練のプログラマー(68,391ポイント)   Date: 2010/07/09(金) 17:07   No:56386       
Title: クォータービューでの描画とマップの配列のデータの持ち方について    
おはようございます。こんにちは、こんばんわ、みなさん。
TKOZです。

ところで、現在、クォータービュー形式のゲームを作っております。
クォータービューの(一般的な?)描画方法と配列のデータの持ち方と
どうやれば、マウス座標などから配列を参照できるのかについて質問します。

私は、私なりにクォータービューを紙に印刷し、関数電卓とシャープペンシル、消しゴムなどで
計算し、求めた値に基づいて描画なり、配列を計算したのですが、
どうもうまくいきませんので、質問したいです。

具体的には、マウス座標から配列を参照するやり方がわかりません。
バグが出ており、右上が0,0とすると、目で測って求めた値とは違うのです。

そのほかに、一般的なクォータービューの描画方法や配列のデータの持ち方も質問したいです。

ソースコードを添付するので、どうか、C言語何でも質問掲示板の皆様、よろしくお願いします。
#pragma once
#include"Main.h"
#include "DxLib.h"
#include "parser.c"

int GHandle;

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
#define CHIP_WIDTH 128
#define CHIP_HEIGHT 64
#define MAX_CHIPX (21)
#define MAX_CHIPY (17)

typedef struct n3d{
    int x;//X座標
    int y;//Y座標
    int z;//Z座標
}n3d;

typedef struct Chara{
    int MovingValue;//移動量
    int HP;//HP(ヒットポイント
    int MP;//MP(マジックポイント
    int HavingItem[100];//持っているアイテムの数と種類
    int ii[MAX_CHIPY][MAX_CHIPX];//移動用の表示配列データ
    int jj[MAX_CHIPY][MAX_CHIPX];//移動用の表示配列データ
}Chara;
class SLGMode{
public:
    n3d xyz;//キャラの座標
    n3d show;//現在のいるマスの座標
    n3d menu;//メニューの座標
    int menuflag;//メニューの表示フラグ
    int menunumber;//現在マウス座標の上にあるメニューの番号
    int image[100];//イメージ配列
    int moveflag;//移動フラグ
    int selectnumber;//現在マウスで選択されているメニュー番号
    int dir;//移動方向
    int MoveMode;//移動状態
    int Divimage[4];//4種類のマップチップのイメージ配列
    Chara C;//主人公キャラの情報
public:
    SLGMode()//コンストラクタ(初期化関数)
    {
        xyz.x=256+128+128;
        xyz.y=224;
        show.x=256+128;
        show.y=224;
        menu.x=0;
        menu.y=0;
        menuflag=0;
        menunumber=0;
        moveflag=0;
        dir=0;
        C.MovingValue =5;
    }
    void DrawBlock()//マップチップ?を描画する関数
    {
        int i,j;
        for(i=0;i<17;i++)
        {
            static int flag=0;
            static int X=0,Y=0;
            for(j=0;j<21;j++)
            {
                int Sub=0;
                if(flag==0)
                {
                
                    Sub=128*(i+1);
                    
                    X=(640+128+128)-Sub;
                    Y=-32;
                    flag=1;
                }
                
                DrawGraph(X,Y,
                    Divimage[BGData[i][j]],TRUE);
                X+=64;Y+=32;
            }
            flag=0;
        }

    }
    void DrawLINE()//線を描画するメンバ関数
    {
        int i,j;

        //DrawBox(0,0,800,600,GetColor(255,255,255),TRUE);

        DrawRectGraph(show.x,show.y,0,0,128,64,image[0],TRUE,FALSE);
        

        for(i=0;i<MAX_CHIPY;i++)
        {
            for(j=0;j<MAX_CHIPX;j++)
            {
                DrawLine(j*CHIP_WIDTH,i*CHIP_HEIGHT  , j*CHIP_WIDTH+CHIP_WIDTH , i*CHIP_HEIGHT+CHIP_HEIGHT ,
                    GetColor(255,255,255) ) ;
                DrawLine(j*CHIP_WIDTH,i*CHIP_HEIGHT  , i*CHIP_WIDTH , j*CHIP_HEIGHT ,
                    GetColor(255,255,255) ) ;
                
            }
        }
        DrawGraph(xyz.x-96,xyz.y-64,image[1],TRUE);
    }
//関係の無いメンバ関数は飛ばす
        int GetXOfIndex(int NowX,int NowY)//現在座標からBGData配列の添え字を取得する関数
    {
        int i,j;
        int X2=9-NowX/128-2;
        int X=17-NowX/64-4*X2-1;
        int XX=X,YY=0;
        
        do{
            XX-=2;
            YY+=1;
        }while(NowY/32+1==YY);
        return X;
    }
    int GetYOfIndex(int NowY)//現在座標からBGData配列の添え字を取得する関数
    {
        int i,j;    
            
        return NowY/32+1;
    }


1,052ポイント を落としてしまった。


Name: パコネコ  ..中級者(13,050ポイント)   Date: 2010/07/09(金) 21:18   No:56399     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
クオータービューってこういうのですよね
   ____________→x
  /_/_/_/_/_/_/
 /_/_/_/_/_/_/
/_/_/_/_/_/_/
↓y
…もっと斜めだった気がするけど

   →X
  /\
 /\/\
/\/\/\
\/\/\/
 \/\/
↓Y
…こんな感じ
前に計算した時は、1マスの横幅をMxとして、縦幅をMyとして
座標x=Mx*(x+y)
座標y=My*(y-x)
で左上からのマス目をx、yとした時の式でした。
間違ってたり、すでに出してましたらすいません。
で、これがあってるとして計算してみると
マウスから習得した座標をpx,pyとした場合
px=Mx*(x+y)
px/Mx=x+y
ここで止まっちゃいました…
py=My*(y-x)
py/My=y-x
これを代入して
py/My+x=yを使って
px/Mx-py/My-x=x
px/Mx-py/My=2x

x=(px/Mx-py/My)/2
y=py/My+(px/Mx-py/My)/2
これが、出てきました。
yのほうをきれいにして、
2*y=2*py/My+px/Mx-py/My
y=(px/Mx+py/My)/2

よって

x=(px/Mx-py/My)/2
y=(px/Mx+py/My)/2

これでどうですか?
今計算したんで計算ミスがあるかもですが…


516ポイント を手に入れた。

Name: MNS  ..プログラマー(38,233ポイント)   Date: 2010/07/09(金) 21:47   No:56405     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
マウス座標 → マップ座標は、
確か、y座標の差分を補正した後、グリッドの高さと幅の比率をあわせて、求める
という段階を踏んでいたと記憶しています.

そうしますと、マウスの座標をmouse_x,mouse_yという変数に記憶しておいて、
差分を補正
mouse_y -= CHIP_HEIGHT/2 * MAX_CHIPX;
グリッドの縦横比を考慮して
mouse_y *= CHIP_WIDTH/CHIP_HEIGHT;
あとは求めて
map_x = (mouse_x - mouse_y) / CHIP_WIDTH;
map_y = (mouse_x + mouse_y) / CHIP_WIDTH;

負の値になると、1グリッドずれるので注意してください


239ポイント を手に入れた。

Name: ぽこ  ..上級者(20,180ポイント)   Date: 2010/07/09(金) 23:41   No:56413     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
やらなければならないのは、ひし形っぽく交差する軸を持つ座標系から、正方格子のような軸を持つ座標系への変換ですよね?
なんとなくですけど、一次変換を利用するとうまく計算出来ると思います。
↓のようなイメージで。
http://keysformath.seesaa.net/article/17244983.html

----追記
MNSさんが書かれている算出方法がまんま一次変換ですね。。  編集済み


77ポイント を手に入れた。

Name: パコネコ  ..中級者(13,081ポイント)   Date: 2010/07/10(土) 00:13   No:56415     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
# MNSさん
CHIP_WIDTHって何を表わすんですか?
勉強不足ですいません。


31ポイント を手に入れた。

Name: MNS  ..プログラマー(38,306ポイント)   Date: 2010/07/10(土) 11:48   No:56444     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
># MNSさん 
>CHIP_WIDTHって何を表わすんですか? 

私は、1グリッド(マップチップ単体)の幅として使用しました。
TKOZさんのコードから引用したものです。そのようなものとして使っていたのなら良いのですけれど。


73ポイント を手に入れた。

Name: パコネコ  ..中級者(13,201ポイント)   Date: 2010/07/10(土) 19:15   No:56463     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
クオータービューって「 基本的 」に縦横の大きさは同じなのでしょうか?


24ポイント を落としてしまった。

Name: TKOZ  ..熟練のプログラマー(69,108ポイント)   Date: 2010/07/10(土) 19:43   No:56465     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
>パコネコさん
>MNSさん
>ぽこさん
返信とアドバイスありがとうございます。
今、ちょっと時間が無いので、明日試してみる事にします。


71ポイント を手に入れた。

Name: TKOZ  ..熟練のプログラマー(69,145ポイント)   Date: 2010/07/11(日) 18:06   No:56499     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
あの、右上座標(896,0)を(0,0)としたいのですが、
その場合は補正値を加えるだけでよろしいのでしょうか? 編集済み


37ポイント を手に入れた。

Name: ぽこ  ..上級者(20,600ポイント)   Date: 2010/07/11(日) 19:55   No:56507     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
MNSさんが述べられた算出方法の後に、左上原点のmap_xを右上原点に変換したほうが良いと思います。

#この作業を補正といえば補正ですが。。


59ポイント を手に入れた。

Name: TKOZ  ..熟練のプログラマー(69,188ポイント)   Date: 2010/07/13(火) 17:00   No:56573     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
単純に足したり引くだけでは0,0に変換できない事が分かりました。
どうすれば、(896,0)を0,0に出来るのでしょうか?
ヒントかアドバイスをください。


43ポイント を手に入れた。

Name: MNS  ..プログラマー(38,720ポイント)   Date: 2010/07/13(火) 19:05   No:56591     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
何をしたいのか、いまいち良くわからないのですが、
画面の原点を896,0に移し、かつX軸の向きを逆にしたい場合は、
マウスのx座標をmouse_xという変数に格納しておいたとすると、
mouse_x = abs(mouse_x - 896);
とするのはどうでしょうか?


2倍のポイントを手に入れた! 228ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(72,810ポイント)   Date: 2010/07/14(水) 19:58   No:56660     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
何度も何度もすみません。
添付した画像のようには出来ないでしょうか?

もちろん、というかおそらくこれが出来るなら計算も出来るだろうと思われると思いますが、
うまくいかないんです。

原因は分かっています。(多分…?)GetXOfIndex()でif(NowX==X && NowY==Y)という記述がありますが、
事前の計算ですでにそれを超えてます。どうすれば、座標からインデックスを取り出せるでしょうか?
GetOfIndex2()は、原因が分かりません。

その関数を5つ書きます。

    void DrawBlock()//ブロック(マップチップを描画する関数)
    {
        int i,j;
        static int xx,yy;
        xx=0;yy=0;
        for(i=0;i<17;i++)
        {
            static int flag=0;
            static int X=0,Y=0;
            xx=0;
            for(j=0;j<21;j++)
            {
                int Sub=0;
                if(flag==0)
                {
                
                    Sub=128*(i+1);
                    
                    X=(640+128+128)-Sub;
                    Y=-32;
                    flag=1;
                }
                
                DrawGraph(X,Y,
                    Divimage[BGData[i][j]],TRUE);
                X+=64;Y+=32;
                xx++;
                DrawFormatString(X,Y,GetColor(255,255,255),"(%d,%d)",yy,xx);
            }
            yy++;
            flag=0;
        }
        yy=0;

    }
         int GetXOfIndex2()
    {
        int mouse_x,mouse_y;
        GetMousePoint(&mouse_x,&mouse_y);
        mouse_x -= CHIP_HEIGHT/2 * MAX_CHIPX; 
        mouse_y *= CHIP_WIDTH/CHIP_HEIGHT;  
        mouse_x = abs(896-mouse_x);

        int NowX = (mouse_x - mouse_y) / CHIP_WIDTH-5; 
        //NowY = (mouse_x + mouse_y) / CHIP_WIDTH; 
        return NowX;
    }
    int GetYOfIndex2()
    {
        int mouse_x,mouse_y;
        GetMousePoint(&mouse_x,&mouse_y);
        mouse_x -= CHIP_HEIGHT/2 * MAX_CHIPX; 
        mouse_y *= CHIP_WIDTH/CHIP_HEIGHT;  
        mouse_x = abs(896-mouse_x);

        //NowX = (mouse_x - mouse_y) / CHIP_WIDTH; 
        int NowY = (mouse_x + mouse_y) / CHIP_WIDTH-5;
        return NowY;
    }
    int GetXOfIndex(int NowX,int NowY)
    {
        int i,j;
        static int xx,yy;
        xx=0;yy=0;
        for(i=0;i<17;i++)
        {
            static int flag=0;
            static int X=0,Y=0;
            xx=0;X=0;
            for(j=0;j<21;j++)
            {
                int Sub=0;
                if(flag==0)
                {
                
                    Sub=128*(i+1);
                    
                    X=(640+128+128)-Sub;
                    Y=-32;
                    flag=1;
                }
                
                if(X==NowX && Y==NowY) return xx;
                X+=64;Y+=32;
                xx++;
                
            }
            yy++;
            flag=0;
        }
        yy=0; 
        return 0;
    }
    int GetYOfIndex(int NowX,int NowY)
    {
        int i,j;
        static int xx,yy;
        xx=0;yy=0;
        for(i=0;i<17;i++)
        {
            static int flag=0;
            static int X=0,Y=0;
            xx=0;
            X=0;
            for(j=0;j<21;j++)
            {
                int Sub=0;
                if(flag==0)
                {
                
                    Sub=128*(i+1);
                    
                    X=(640+128+128)-Sub;
                    Y=-32;
                    flag=1;
                }
                                
                X+=64;Y+=32;
                xx++;
                if(NowY==Y) return j;

            }
            yy++;
            flag=0;
        }
        yy=0;
        return 0;
    } 編集済み


1,298ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(72,825ポイント)   Date: 2010/07/14(水) 20:09   No:56661     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
GetYOfIndex2が上手くいけばなんとかなるのですが…上手くいかないです。
ちなみに、画像の添え字はY,Xの順番です。


15ポイント を手に入れた。

Name: ぽこ  ..上級者(20,641ポイント)   Date: 2010/07/14(水) 20:48   No:56662     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
マウスの位置は・・・・
というメッセージを出す箇所もソースコードを提供してください。

----追記
↑は自分で何とかしました。 編集済み


41ポイント を手に入れた。

Name: ぽこ  ..上級者(20,905ポイント)   Date: 2010/07/14(水) 21:30   No:56665     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
TKOZさん:

2つ質問があります。
画面の左上を原点とし、x方向が右方向、y方向が下方向となっている座標系をマウス座標系と呼び、
TKOZさんがマップチップの配列の座標系をマップ座標系と呼んだとき、

1.マップ座標系の原点をマウス座標系で表現するとどうなりますか?
 認識のズレをなくすため、(x座標,y座標)という形式で回答ください。

2.マップ座標系での単位ベクトル(1,0)および(0,1)をマウス座標系でのベクトル表現で
 表すとどうなりますか?
 これも認識のズレをなくすため、(x座標,y座標)という形式で回答ください。


264ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(73,081ポイント)   Date: 2010/07/14(水) 21:48   No:56667     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
1は、(0,0)ですね。間違えました。勘違いしてました。(896,0)です。
2は、マップ座標系の単位ベクトル?(1,0)は、(640+128,-32)です。
  (0,1)は、(896+64,0)です。
    ベクトルってあのベクトルでしょうか?
  だとしたら、勘違いしてました。
  マップ座標系の単位ベクトル(1,0)は、(1,0)です。
  (0,1)は、(0,1)じゃないでしょうか?
 編集済み


30ポイント を手に入れた。

Name: ぽこ  ..上級者(21,219ポイント)   Date: 2010/07/14(水) 22:07   No:56673     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
> 1は、(0,0)ですね。間違えました。勘違いしてました。(896,0)です。

了解です。

> 2は、マップ座標系の単位ベクトル?(1,0)は、(640+128,-32)です。
>   (0,1)は、(896+64,0)です。


すみません、表現が悪かったですね。x座標、y座標ではなく、x成分、y成分というべきでした。

えっと、↑はマウス座標系でのx座標、y座標ですね。
つまり、マップ座標系の各単位ベクトルをマウス座標系での成分で表すと、
X方向は(640+128-896,-32)=(-128,-32)となります。
つまり、マップ座標系でX方向に1進むと、マウス座標系で(-128,-32)進むことになります。

んで、Y方向は(896+64-896,0-0)=(64,0)
つまり、マップ座標系でY方向に1進むと、マウス座標系で(64,0)進むことになります。
これは嘘ですよね?
こういうふうに考えた場合、マップ座標系でY方向に1進むと、マウス座標系でどれだけ
進むことになりますか?

#X方向がこれであっているなら、Y方向は(-128,32)になるはずなんですけどね。
#なんとなく、TKOZさんが掲載された画像と違うような……



314ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(73,119ポイント)   Date: 2010/07/14(水) 22:34   No:56678     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
大きなスケッチブックに白と黒でスクリーンショットを印刷してセロハンテープで張ってみました。
Y方向は、(896+64,32)ですね。


38ポイント を手に入れた。

Name: ぽこ  ..上級者(21,284ポイント)   Date: 2010/07/14(水) 22:58   No:56679     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
そうすると、マップをひとマス描画すると、図の様になります。
赤と青と緑の線で囲まれている領域がひとマスです。
TKOZさんが用意しているマップチップとかなり異なる形になるのですが…


65ポイント を手に入れた。

Name: ぽこ  ..上級者(21,334ポイント)   Date: 2010/07/14(水) 23:37   No:56680     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
用意したマップチップに合わせるなら、図の上下どちらかの様にマップ座標系の
X方向、Y方向を決定したほうが良いと思います。


50ポイント を手に入れた。

Name: 白い時空  ..かけだし(2,316ポイント)   Date: 2010/07/15(木) 00:27   No:56686     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
このスレッドを見て、自己満足で、
http://dixq.net/g/26.htmlをクォータービューにしてみました。(マウス位置も表示させてみました。)
が、参考にならないかもしれません。関数名とかは適当です。

zero(原点)とvec[0](マップ座標のx方向)とvec[1](マップ座標のy方向)の値を変更してみてください。


これをやるには、行列がわからないとだめなので、高3レベルの数学が必要でした。
分からないとちょっと厳しいかも。
マウスからマップチップの座標を取得するときは逆行列を使う必要がありました。


240ポイント を手に入れた。

Name: ぽこ  ..上級者(22,380ポイント)   Date: 2010/07/15(木) 03:22   No:56706     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
マップチップに対する配列のインデックスのつけ方がおかしい気がしたので、
とりあえず、描画ルーチンだけ直してみました。
微妙に求める結果と違いますが、もう考える気力がありません。
違いは以下のとおりです。
 ・マウス座標→配列のインデックスへの変換で、XとYの結果が入れ替わっている
 ・配列のインデックス(マップチップ座標)のY方向が微妙にずれている。

----
void DrawBlock()
{
    for ( int i = 0; i < MAX_CHIPY; i++ ) {
        for ( int j = 0; j < MAX_CHIPX; j++ ) {
            int X = 832 + 64 * i - 64 * j;
            int Y = 32 * i + 32 * j; 
            DrawGraph(X,Y, 
                Divimage[BGData[i][j]],TRUE); 
            DrawFormatString(X + 64,Y + 32,GetColor(255,255,255),"(%d,%d)",j,i); 
        }
    }
}

//ゲームのメインループに以下を追加
int mx, my;
GetMousePoint(&mx, &my);
DrawFormatString(0,60,GetColor(0,255,255),"マウス位置は、(%d=>%d,%d=>%d)です。",
    mx,S.GetXOfIndex2(),my, S.GetYOfIndex2());


485ポイント を手に入れた。

Name: ぽこ  ..上級者(22,159ポイント)   Date: 2010/07/15(木) 08:22   No:56711     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
#ひと眠りすると、原因がすぐに分かるもんですね。

前の描画ルーチンは、No:56680の図の上のパターン、
この投稿の描画ルーチンはNo:56680の図の下のパターンの場合です。
マップ座標系のX方向、Y方向が異なります。
こちらの方だと、GetOfIndex2()等を劇的に変更させる必要はなさそうです。
#微調整は必要ですが。
#MNSさんが提示した変換式は、この方向の座標系が前提だったということですかね。

void DrawBlock()
{
    for ( int i = 0; i < MAX_CHIPY; i++ ) {
        for ( int j = 0; j < MAX_CHIPX; j++ ) {
            int X = 832 - 64 * i - 64 * j;
            int Y = 32 * i - 32 * j; 
            DrawGraph(X,Y, 
                Divimage[BGData[i][j]],TRUE); 
            DrawFormatString(X + 64,Y + 32,GetColor(255,255,255),"(%d,%d)",j,i); 
        }
    }
}


221ポイント を落としてしまった。

Name: TKOZ  ..比類無きプログラマー(73,177ポイント)   Date: 2010/07/15(木) 15:56   No:56722 解決!     
Title: Re:クォータービューでの描画とマップの配列のデータの持ち方について    
TKOZです。何とか解決しました。
力技の2つのテーブル化で対応しました。
また、問題が発生したら、書き込みます。
 編集済み


58ポイント を手に入れた。



Name: かむかむ  ..かけだし(1,388ポイント)   Date: 2010/07/14(水) 07:08   No:56623       
Title: 学校の課題が分かりません・・・    
↓前回のあらすじ・・・

題名の通り、学校の課題でつまってしまいました。
誰か教えてください。 お願いします。


↓問題文
基本: 構造体の配列、関数への構造体の引渡し

基本課題 13..2  

name(名前: char型配列), height(身長: float型変数), bloodType(血液型: char型変数)をメンバに持つ構造体を宣言し, 128名分が記憶可能になるようその構造体の配列を定義せよ.また,その配列に対して値を入力し,さらに表示できるようにせよ.構造体のメンバ値を表示するには、ひとつの構造体の各メンバの値を表示する関数を作成すること。

    % ./bodyData
    1人目のデータ: いい漢 175.5 A
    2人目のデータ: 竹達彩菜 169.0 B
    3人目のデータ: 能登麻美子 180.4 O
    4人目のデータ: 0 0 0                ← 0 0 0 と入力すると終わる.
    名前        身長        血液型
    いい漢    175.5       A
    竹達彩菜    169.0       B
    能登麻美子  180.4       O
    %
       

ヒント: 各人の名前、身長、血液型のデータを1行で入力するためには、参考12.1に示されたfgets()関数で、これらを1度に取り込み、最初の空白までを名前とみなし、次の空白までを身長とみなし、次に改行までを血液型をみなせばよい。これらを別々の文字列として、必要に応じて整数や浮動小数点数に変換し、構造体のメンバに設定すること。

ヒント: ひとつの構造体の各メンバの値を表示する関数に構造体を引渡すことを繰り返えせばよい。





↓とりあえず考えて作ってみたもの



#include<stdio.h>
#define BUFFER_SIZE 256
#define NUMBER 128
#define NAME_SIZE 32

struct PROFILE{
  char name[NAME_SIZE];

  float height;

  char bloodType;
}


int main(){
  struct PROFILE man[NUMBER];

  char buf[BUFFER_SIZE];

  int i, j, k, h;
  for(i = 0;man[i].name[0] == '0' && man[i].height == 0 && man[i].bloodType == 0;i++){
    printf("%d人目のデータ: ", i + 1);

    fgets(buf, BUFFER_SIZE, stdin);

    for(j = 0;buf[j] != ' ';j++){
      man[i].name[j] = buf[j];
    }
    for(k = j+1;buf[k] != ' ';k++){
      man[i].height = buf[k];
    }
    for(h = k+1;buf[h] != '\n';h++){
      man[i].bloodType = buf[h];
    }
  }
  printf("名前\t身長\t血液型\n");
  for(j = 0;j <= i;j++){
    printf("%s\t%f\t%c\n", man[j].name, man[j].height, man[j].bloodType);
  }
  return 0;
編集済み


818ポイント を手に入れた。


Name: かむかむ  ..かけだし(1,021ポイント)   Date: 2010/07/14(水) 07:14   No:56624     
Title: Re:学校の課題が分かりません・・・    
そこでstrtokをアドバイスから、使用してみましたが、コンパイルエラーが消えません・・・・
39行目に対し、incompatible types in 代入 っと表示されます

それとchar型変数にAB型というのをきれいに納める方法が分かりません・・

どうすればよいでしょうか?



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUFFER_SIZE 256 
#define NUMBER 128 
#define NAME_SIZE 32 

struct PROFILE{
  char name[NAME_SIZE];

  float height;

  char bloodType;
};

void printProfile(struct PROFILE *pp){
  printf("名前:%s\t身長:%f\t血液型:%c\n", pp->name, pp->height, pp->bloodType);

}

int main(){

  int i, count;
  struct PROFILE man[NUMBER];
  char buf[BUFFER_SIZE];

  float *height;
  char *blood;
  count = 0;

  height = &man[count].height;
  blood = &man[count].bloodType;

  while(count < NUMBER){
    printf("%d人目: ", count + 1);
    fgets(buf, BUFFER_SIZE, stdin);

    strcpy(man[count].name, strtok(buf, " "));
    height = (float)atof(strtok(NULL, " "));   ←39行目
    blood = strtok(NULL, "\n");

    count++;

    if(man[count].name[0] == '0' && man[count].height == '0' && man[count].bloodType == '0')
      break;
  }

  for(i = 0;i < count;i++){
    printProfile(&man[i]);
  }

  return 0;
}


367ポイント を落としてしまった。

Name: シエル  ..プログラマー(27,857ポイント)   Date: 2010/07/14(水) 08:31   No:56628     
Title: Re:学校の課題が分かりません・・・    
この課題とまったく同じ課題の質問が前にあったような…
間違いだったらすみません。


44ポイント を手に入れた。

Name: シエル  ..プログラマー(27,900ポイント)   Date: 2010/07/14(水) 08:45   No:56630     
Title: Re:学校の課題が分かりません・・・    
すいません。前の質問の続きだったんですね。
私の発言はスルーしてください。。


43ポイント を手に入れた。

Name: パコネコ  ..中級者(13,661ポイント)   Date: 2010/07/14(水) 09:11   No:56635     
Title: Re:学校の課題が分かりません・・・    
>incompatible types in 代入
互換性のない代入
って書いてました。…知ってました?
私もコピペして起動したところ、ポインタと他の型が混在してますと出てきました。


84ポイント を手に入れた。

Name: へろり  ..上級者(23,365ポイント)   Date: 2010/07/14(水) 09:46   No:56637     
Title: Re:学校の課題が分かりません・・・    
atof()関数の戻り値は、double型ですが、キャストされて float型です。 height の型は float*型ですね。
float型から、float*型への代入は出来ません。 ついでにキャストも出来ません。
float型で受けるようにしてください。

とりあえず、
*height = (float)atof(strtok(NULL, " "));
とすることで、コンパイルエラーは消えます。 意図した動きはしないでしょうが。


>strcpy(man[count].name, strtok(buf, " "));
と名前は直接構造体のメンバを指定してるわけですから、
man[count].height = (float)atof(strtok(NULL, " "));
と、身長も直接代入してしまった方が、より直感的でスマートだと思いますよ。


>それとchar型変数にAB型というのをきれいに納める方法が分かりません・・

これはちょっとどうなんでしょうね。

const char *BloodTypeStr[] = {"A", "B", "O", "AB"};
man[count].bloodType = 1;
printf("%s", man[count].bloodType);

という風にするか。


かなりトリッキーな方法ですが。
char *hoge = "A";
man[count].bloodType = !hoge[1] ? toupper(*hoge) - 'A' + 10 : 0xAB & 0xFF;
printf("%X\n", (unsigned char)man[count].bloodType);

という風にするか、どちらかしか無いかと。


500ポイント を手に入れた。

Name: バグ  ..ハッカー(200,328ポイント)   Date: 2010/07/15(木) 14:50   No:56721     
Title: Re:学校の課題が分かりません・・・    
>>これはちょっとどうなんでしょうね。 
>>const char *BloodTypeStr[] = {"A", "B", "O", "AB"}; 
>>man[count].bloodType = 1; 
>>printf("%s", man[count].bloodType); 
>>という風にするか。 

>>かなりトリッキーな方法ですが。 
>>char *hoge = "A"; 
>>man[count].bloodType = !hoge[1] ? toupper(*hoge) - 'A' + 10 : 0xAB & 0xFF; 
>>printf("%X\n", (unsigned char)man[count].bloodType); 
>>という風にするか、どちらかしか無いかと。 


個人的には前者が分かり易いかなぁ?と思いますね(^-^)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE    256
#define NUMBER        128
#define NAME_SIZE    32

struct PROFILE
{
    char name[NAME_SIZE];
    float height;
    char bloodType;
};

int main(void)
{
    char* bloodType[6] = {"0", "A", "B", "O", "AB", "Unknown"};
    char* bld = NULL;
    char buf[BUFFER_SIZE] = {0, };
    int i = 0, j = 0;
    struct PROFILE man[NUMBER];

    do
    {
        /* データの入力 */
        printf("%d人目のデータ: ", i + 1);
        fgets(buf, BUFFER_SIZE, stdin);

        /* 名前の取得 */
        strcpy(man[i].name, strtok(buf, " "));

        /* 身長の取得 */
        man[i].height = (float)(atof(strtok(NULL, " ")));

        /* 血液型の取得 */
        bld = strtok(NULL, "\n");
        for (j = 0; j < 6; ++j)
        {
            if (j == 5)
            {
                /* 登録されていない血液型だった */
                man[i].bloodType = 5;
            }
            else if (strcmp(bld, bloodType[j]) == 0)
            {
                /* 登録されてある血液型と一致した */
                man[i].bloodType = j;
                break;
            }
        }
    }
    while ((man[i].name[0] != '0' || man[i].height != 0.0f || man[i].bloodType != 0) && ++i < NUMBER);

    /* 入力データの出力 */
    printf("名前\t身長\t血液型\n");
    for(j = 0; j < i; ++j)
    {
        printf("%s\t%.1f\t%s\n", man[j].name, man[j].height, bloodType[man[j].bloodType]);
    }

    return 0;
}


1,025ポイント を手に入れた。



Name: shiro4ao  ..初心者(6,810ポイント)   Date: 2010/07/15(木) 04:47   No:56707       
Title: コンマ以前の部分を削除したい    
最初に出てくるコンマより前の部分を消したいです。
「a,b,c,d」が「b,c,d」になって欲しいのです。
以下のようなコードを書きましたがうまくいきませんでした。
=======================ここから==========================
#include <stdio.h>
#include <string.h>

int main(void){
    char *p,buf2[]="a,b,c,d";
    int k;
p = strchr( buf2, ',' );
if ( p != NULL ){
    for(k=0;k<(int)p-(int)buf2;k++){
        strcpy(buf2+k," ");
    }
}

printf("%s",buf2);
return 0;
}
==================ここまで===============================
何がまずかったのでしょうか?


134ポイント を落としてしまった。


Name: ドラ  ..初心者(7,045ポイント)   Date: 2010/07/15(木) 05:55   No:56708     
Title: Re:コンマ以前の部分を削除したい    
>最初に出てくるコンマより前の部分を消したいです。 
>「a,b,c,d」が「b,c,d」になって欲しいのです。
コンマより前の部分を消すとはどのような処理を想定されているのでしょうか?
'b'をbuf2[0]にコピー、その次の','をbuf2[1]にコピー・・といった具合に
ずらしていくのかと思いましたが、"  b,c,d"のように最初に見つけた','までを
半角スペースで上書きしたいのでしょうか?

>for(k=0;k<(int)p-(int)buf2;k++){ 
>    strcpy(buf2+k," "); 
>}
strcpy()ではナル文字まで書き込まれてしまいます。

また同じ配列の要素を指すポインタ同士の減算は合法です。
逆に (int)p-(int)buf2 のようにキャストしてしまうとまずいはずです。




247ポイント を手に入れた。

Name: フリオ  ..プログラマー(34,459ポイント)   Date: 2010/07/15(木) 06:29   No:56709     
Title: Re:コンマ以前の部分を削除したい    
 
 こういうことでしょうか。
 
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[] = "a,b,c,d", *p;
    
    puts(s);
    if(p = strchr(s, ',')){
        ++ p;
        memmove(s, p, strlen(p) + 1);
    }
    puts(s);
    return 0; 
}
 編集済み


151ポイント を手に入れた。

Name: shiro4ao  ..初心者(6,848ポイント)   Date: 2010/07/15(木) 06:42   No:56710 解決!     
Title: Re:コンマ以前の部分を削除したい    
なるほど!
メモリブロックの移動の関数があるのですね
ありがとうございました。無事解決しました。


38ポイント を手に入れた。



Name: derorian  ..ぴよぴよ(976ポイント)   Date: 2010/07/15(木) 00:04   No:56683       
Title: みなさんの力をお貸しください    
来週までに出さなければいけない課題がわかりません。
問題は2問あります。

・動的データ構造について

1.線形リスト構造(stackデータ構造)

[1]

 [1.1] stackデータ構造の生成
    条件1:挿入と削除のプログラムを作る
    条件2:pueueではない
    条件3:もし〜ならばという風に使い分ける(if文)

 [1.2] stackデータ構造については理解しています。しかし、プログラムの組み方がわかりません。

 [1.3] プログラムの組み方がまったくわかりません。来週までなので早めの回答をお願いします。

 [1.4] 今のままではプログラムを書いていただいてもわからないので詳しい説明があると幸いです。


[2]  
 [2.1] OS : Windows vista

 [2.2] コンパイラ名 : VC++ ソフト名:visual stadio 2008


[3] 
 初心者ではないのですが1からプログラムを組むことはやったことはありませんので、初心者と同じぐらいです。ちなみにアルゴリズムとデータ構造という授業です。

問題は[1.1]ですが、下記のプログラムを少し変えるという話を聞きました。↓↓↓


#include stdafx.h

#include <stdio.h>
#include <stdlib.h>

void main()
{
struct tbox
{

int data;
struct tbox *point;
};

struct tbox *root, *work, *awork;
FILE *fpi;
int flag;
int workint;
int code;

fpi = fopen(data.dat , r);
root = NULL;
flag = 1;
while(flag)
{
if((code = fscanf(fpi,%d,&workint)) !=EOF)
{
work = (struct tbox *)malloc(sizeof(struct tbox));
work -> data = workint;

work -> point = NULL;
if (root == NULL)
root = work;
else
awork -> point = work;
awork = work;
}
else
flag = 0;
}
work = root;
while(work != NULL)
{
printf(%d\n, work -> data);
work = work -> point;
}
}

2.木構造(二分探索木)


[1]

 [1.1] 二分探索木
    条件1:いかに早く効率よく、データの集まりが一つのデータを探し出せるか

 [1.2] プログラムの組み方がわかりません。

 [1.3] プログラムの組み方がまったくわかりません。来週までなので早めの回答をお願いします。

 [1.4] 今のままではプログラムを書いていただいてもわからないので詳しい説明があると幸いです。


[2]  
 [2.1] OS : Windows vista

 [2.2] コンパイラ名 : VC++ ソフト名:visual stadio 2008


[3] 
 初心者ではないのですが1からプログラムを組むことはやったことはありませんので、初心者と同じぐらいです。ちなみにアルゴリズムとデータ構造という授業です。

こちらはこのようなプログラムとなっています。下記のプログラムをいじることで効率良くなるそうです。

#include stdafx.h
#include <stdio.h>
#include <stdlib.h>

struct treebox
{
struct treebox *leftpointer;
int data;
struct treebox *rightpointer;
};

struct treebox *work , *awork;

void searchtree()
{
if(awork -> data > work ->data)
{
if(awork -> leftpointer = NULL)
awork -> leftpointer = work;
else
{
awork = awork -> leftpointer;
searchtree();
}
}
else
{
if(awork -> rightpointer == NULL)
awork -> rightpointer = work;
else
{
awork = awork -> rightpointer;
searchtree();
}
}
}

void printtree(struct treebox *p)
{
if(p != NULL)
{
printtree(p -> leftpointer);
printf(%d\n , p ->data);
printtree(p ->rightpointer);
}
}

int main()
{
struct treebox *root;
int flag;
int c;
int workint;

root = (struct treebox *)malloc(sizeof(struct treebox));
root -> leftpointer = NULL;
scanf(%d,&root -> data);
root ->rightpointer = NULL;


awork = root;


flag = 1;
while(flag)
{
workint = scanf(%d , &c);
if((workint == EOF))
flag = 0;
else
{

work -> leftpointer = NULL;
work -> data = c;
work ->rightpointer =NULL;
searchtree();
awork = root;
}
}
awork = root;
printtree(awork);

}


・長文ですが、回答よろしくお願いします。アドバイスのほうもできればお願いします。


976ポイント を手に入れた。


Name: ぽこ  ..上級者(21,484ポイント)   Date: 2010/07/15(木) 00:11   No:56684     
Title: Re:みなさんの力をお貸しください    
ご存知だとは思いますが、ここは「質問」掲示板です。
課題に対して、そのままの回答を得ることは期待しないでください。

プログラムの組み方がわからないとのことですが、まずプログラムを組めるところから始めましょう。
derorianさんが提示された上記プログラムをコンパイルする手順は分かりますか?



150ポイント を手に入れた。

Name: derorian  ..ぴよぴよ(983ポイント)   Date: 2010/07/15(木) 00:26   No:56685     
Title: Re:みなさんの力をお貸しください    
コンパイル手順はわかります

7ポイント を手に入れた。

Name: ぽこ  ..上級者(21,514ポイント)   Date: 2010/07/15(木) 00:34   No:56687     
Title: Re:みなさんの力をお貸しください    
では、問題に移りましょう。
問題文を提示してください。


30ポイント を手に入れた。

Name: derorian  ..かけだし(1,014ポイント)   Date: 2010/07/15(木) 00:41   No:56688     
Title: Re:みなさんの力をお貸しください    
2問ありますが一つ目は

・動的データ構造
線形リスト構造

stackデータ構造の生成
挿入と削除を行うプログラムを作る
pueueではない
もし〜ならばというふうに使い分ける

です。


31ポイント を手に入れた。

Name: ぽこ  ..上級者(21,548ポイント)   Date: 2010/07/15(木) 00:49   No:56689     
Title: Re:みなさんの力をお貸しください    
一つ目のプログラムは何をやっているか分かりますか?

#この課題の出し方だと、似たような内容をキュー(queue)でやっていますよね?


34ポイント を手に入れた。

Name: derorian  ..かけだし(1,083ポイント)   Date: 2010/07/15(木) 00:53   No:56690     
Title: Re:みなさんの力をお貸しください    
詳しくはわかりませんが大まかにならわかります。

そうですね。このプログラムはキューで作られているので、その内容をスタックに変えるのが一番の目的ですね


69ポイント を手に入れた。

Name: ぽこ  ..上級者(21,630ポイント)   Date: 2010/07/15(木) 01:05   No:56692     
Title: Re:みなさんの力をお貸しください    
> 詳しくはわかりませんが大まかにならわかります。

では判る範囲を「ソースコードにコメントを入れる形で」説明してください。
わからない部分は「目立つ形で」コメントを入れてください。

#derorianさんの不明な点を、ご自身と回答者の皆さんが
#認識する(させる)ことが目的です。


82ポイント を手に入れた。

Name: derorian  ..かけだし(1,490ポイント)   Date: 2010/07/15(木) 01:24   No:56693     
Title: Re:みなさんの力をお貸しください    
#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>


void main()
{
    struct tbox //動的データ構造を作成
    {

        int data;//struct tboxに対する変数
        struct tbox *point;
    };

    struct tbox *root, *work, *awork;
    FILE *fpi;
    int flag;
    int workint;
    int code;

    fpi = fopen("data.dat" , "r");
    root = NULL;
    flag = 1;
    while(flag)
    {
        if((code = fscanf(fpi,"%d",&workint)) !=EOF)
        {
            work = (struct tbox *)malloc(sizeof(struct tbox));//workのなかの変数を動的に領域をとる
            work -> data = workint;//

            work -> point = NULL;
            if (root == NULL)//NULLになったら
                root = work;//workの値をrootにいれる
            else
                awork -> point = work;//workとポインタをつなぐ
            awork = work;//aworkにworkの値を入れる
    }
    else
        flag = 0;
}
work = root;//rootの値をworkに入れる
while(work != NULL)//workがNULLになるまで繰り返す
{
    printf("%d\n", work -> data);
    work = work -> point;
}
}


わかるところ少なくてすいません
ポインタ変数どうしをつないでいくことしかわかりません


407ポイント を手に入れた。

Name: ぽこ  ..上級者(21,647ポイント)   Date: 2010/07/15(木) 01:36   No:56694     
Title: Re:みなさんの力をお貸しください    
最初のwhile文と2番目のwhile文はそれぞれ何をやっているか、分かりますか?
 編集済み


17ポイント を手に入れた。

Name: derorian  ..かけだし(1,514ポイント)   Date: 2010/07/15(木) 01:47   No:56695     
Title: Re:みなさんの力をお貸しください    
最初は変数同士をつないでいく
2番目は表示させる
ですか?


24ポイント を手に入れた。

Name: derorian  ..かけだし(1,545ポイント)   Date: 2010/07/15(木) 01:53   No:56696     
Title: Re:みなさんの力をお貸しください    
キューのデータ構造をスタックのデータ構造に変えるというものなのでキューで間違いないと思います

31ポイント を手に入れた。

Name: ぽこ  ..上級者(21,674ポイント)   Date: 2010/07/15(木) 01:53   No:56697     
Title: Re:みなさんの力をお貸しください    
そうですね。
では、変数をどのようにつないでいるか具体的に分かりますか?


27ポイント を手に入れた。

Name: ぽこ  ..上級者(21,696ポイント)   Date: 2010/07/15(木) 01:54   No:56698     
Title: Re:みなさんの力をお貸しください    
> キューのデータ構造をスタックのデータ構造に変えるというものなのでキューで間違いないと思います

すみません、私の勘違いでした。
#睡魔のせいにしときます…


22ポイント を手に入れた。

Name: derorian  ..かけだし(1,571ポイント)   Date: 2010/07/15(木) 01:58   No:56699     
Title: Re:みなさんの力をお貸しください    
awork -> point = work;
という部分でaworkとworkがつながると思います


26ポイント を手に入れた。

Name: ぽこ  ..上級者(21,725ポイント)   Date: 2010/07/15(木) 02:03   No:56701     
Title: Re:みなさんの力をお貸しください    
変数root、work、aworkがそれぞれ何を表しているか、分かりますか?

29ポイント を手に入れた。

Name: derorian  ..かけだし(1,593ポイント)   Date: 2010/07/15(木) 02:08   No:56702     
Title: Re:みなさんの力をお貸しください    
すいません。workとaworkがつなぐ変数 rootは予備の変数ですか?


22ポイント を手に入れた。

Name: ぽこ  ..上級者(21,835ポイント)   Date: 2010/07/15(木) 02:13   No:56703     
Title: Re:みなさんの力をお貸しください    
キューを意識してください。
上記、プログラムで入力データが例えば1,2,3順序だった場合、
各入力が行われた後で、root、work、aworkはどうなっていくかを考えてください。

#プログラムが組めなくても、紙と鉛筆があれば出来ます。


110ポイント を手に入れた。

Name: derorian  ..かけだし(1,605ポイント)   Date: 2010/07/15(木) 02:35   No:56704     
Title: Re:みなさんの力をお貸しください    
すいません。明日までに考えておきます。

12ポイント を手に入れた。

Name: ぽこ  ..上級者(21,895ポイント)   Date: 2010/07/15(木) 02:38   No:56705     
Title: Re:みなさんの力をお貸しください    
頑張ってください。
ここが明確になれば、スタックではどうすればいいか、簡単に分かります。
では、お休みなさい。


60ポイント を手に入れた。



Name: ゆーずぃ  ..初心者(6,828ポイント)   Date: 2010/07/14(水) 17:30   No:56654       
Title: ファイルポインタの正しい扱い方を教えて下さい。    
2日悩んだのですが、結局分からなかったので質問させて頂きます。
fopenの失敗処理までをセットにしたFileOpen関数を作ったのですが、fpに実引数として渡したポインタに代入が行われません。というか実引数として渡されていないような感もあります。私の考えだと、FILE構造体のポインタを引数として渡しているので、fopenの結果をfilenameのアドレスに直接代入して関数が終わる、といったイメージです。
必要なところだけ抜粋したのでおかしなところもあるかもしれません。よろしくお願いします。

環境はWindows xp
Visual C++ 2008 です。



以下ソースです。



#include <stdio.h>
#include <stdlib.h>


void FileOpen(FILE *fp , const char *filename,const char *mode);

void main(void){

    FILE *inputfile;
    int c;

    FileOpen(inputfile , "hoge.txt" , "r");

    while((c = fgetc(inputfile)) != EOF){
    printf("%c",c);
    }

}

//ファイルが開ければファイルポインタを返す(代入で)
void FileOpen(FILE *fp , const char *filename,const char *mode){    

    if((fp = fopen(filename,mode)) == NULL){                 //ファイルが開けるか
        printf("FILEが開けません。終了します。");
        exit(EXIT_FAILURE);        
    }
}





583ポイント を手に入れた。


Name: スキマ妖怪  ..入門者(2,670ポイント)   Date: 2010/07/14(水) 17:39   No:56655     
Title: Re:ファイルポインタの正しい扱い方を教えて下さい。    
引数をポインタのポインタにするか、

void FileOpen(FILE **fp , const char *filename,const char *mode){    

    if((*fp = fopen(filename,mode)) == NULL){                 //ファイルが開けるか
        printf("FILEが開けません。終了します。");
        exit(EXIT_FAILURE);        
    }
}


戻り値で返してあげるとうまくいくと思いますよ。

FILE *FileOpen(FILE *fp , const char *filename,const char *mode){    

    if((fp = fopen(filename,mode)) == NULL){                 //ファイルが開けるか
         return NULL;
    }
    return fp;
}




233ポイント を手に入れた。

Name: ゆーずぃ  ..初心者(6,809ポイント)   Date: 2010/07/14(水) 18:17   No:56656     
Title: Re:ファイルポインタの正しい扱い方を教えて下さい。    
どちらでも解決しました!ありがとうございます!!
出来ればもう一つ教えて頂きたいのですが、今回初めてポインタのポインタを使用しました。理屈はなんとなく分かるのですが、今まで使いどころがいまいち分からなかったのです。
ですので、今回ポインタのポインタで解決した理由や、ポインタのポインタの他の使いどころなどを教えては頂けませんか?宜しくお願いします(><)


19ポイント を落としてしまった。

Name: スキマ妖怪  ..入門者(2,773ポイント)   Date: 2010/07/14(水) 19:51   No:56659     
Title: Re:ファイルポインタの正しい扱い方を教えて下さい。    
呼び出し元のポインタ変数の中身(アドレス)を変更するためには、
ポインタ自体のアドレスが必要になるからとしか…

難しく考えなくても、単に「ポインタ」のポインタというだけです。


説明下手でスイマセンm(_ _)m

使い所についても、ムリに使う必要はないと思います。
必要ならいやでも使うことになるでしょうし
(具体例思いつきませんでしたorz)


103ポイント を手に入れた。

Name: あまち  ..ぴよぴよ(403ポイント)   Date: 2010/07/14(水) 22:14   No:56675     
Title: Re:ファイルポインタの正しい扱い方を教えて下さい。    
例えば
void funcA(int A)
{
A = 2;
}

void funcB(int *B)
{
*B = 2;
}
という2つの関数をmain関数から実行する場合を考えてください。
int C = 0;  // ・・・@
funcA( C);  // ・・・A
funcB(&C);  // ・・・A
@でint型の値を格納する領域がメモリに確保され 確保された領域にint型の0を示す値が格納されます。 funcAは引数を値渡しで渡しますので Aを実行してもCの値は変化しません。 funcBは引数を参照渡しで渡しますので Bを実行するとCの値が変化します。 ここで着目してほしいのは ある関数に引数として渡した変数の値を変更したい場合、 その関数には変更したい変数のポインタを渡している ということです。 今回変更したいのはFILE *fpですよね。 なのでFILE *fpのポインタを渡してあげればよいのです。 ついでですが、
void funcC(int *C)
{
printf("C = 0x%X\n", C); // ・・・A
C = NULL;
printf("C = 0x%X\n", C); // ・・・B
}
という関数をmain関数から実行する場合を考えてください。
int C = 0;
printf("C = 0x%X\n", &C); // ・・・@
funcC(&C);  // ・・・C
printf("C = 0x%X\n", &C); // ・・・C

結果は下記のようになります。
C = 0x12345678
C = 0x12345678
C = 0x0
C = 0x12345678

何が言いたいかというと
参照渡しは変数の値が格納されているアドレスを渡し
そのアドレスの先(要は変数の値)を変更するだけであって
アドレスそのものを変更することはできないのです。


これで説明になったかはわかりませんが・・・
何かの助けになれば幸いです。


599ポイント を落としてしまった。

Name: フリオ  ..プログラマー(34,308ポイント)   Date: 2010/07/14(水) 22:23   No:56676     
Title: Re:ファイルポインタの正しい扱い方を教えて下さい。    
 
 今回のように、呼び出した関数内で変数の値を変更し、
それを呼び出しもとの関数に反映させたい場合に、意味をよく理解せずに
"引数としてポインタを渡す"
と憶えると、今回のように、
ポインタを渡しているのに値の変更が反映されない、
ということが起こります。
これは、
"値を変更したい変数へのポインタ を渡す"
です。

 Cでは関数に渡せるのは値だけで、C++の"参照"の様に変数自体を関数に渡す手段がありません。
なので、その変数へのポインタ の値を渡し、その変数のある場所(その変数が保持する値のある場所)を
教えることで、その値を書き換えます。

 ですから、int型の変数の値を変更したい場合は、int型 へのポインタである int *型、
FILE *型の変数の値を変更したい場合は、FILE *型 へのポインタである FILE **型
を渡します。
 
 編集済み


144ポイント を手に入れた。

Name: ゆーずぃ  ..初心者(7,154ポイント)   Date: 2010/07/15(木) 02:00   No:56700 解決!     
Title: Re:ファイルポインタの正しい扱い方を教えて下さい。    
皆さん、ご回答ありがとうございます!

>スキマ妖怪さん

とかく難しく考えがちだったのですが、スキマ妖怪さんのお陰で身構えずに学ぶことができました。ありがとうございます。

>あまちさん

検証ソース、ありがとうございます!抽象的な説明よりも理解でき、とても分かり易かったです。

>フリオさん

>ですから、int型の変数の値を変更したい場合は、int型 へのポインタである int *型、 
 FILE *型の変数の値を変更したい場合は、FILE *型 へのポインタである FILE **型 
 を渡します。 

この一文で目の前が拓けましたwありがとうございます!


皆さんのおかげで、完全にとは言えないでしょうが、理解できました!お三方の説明の順番がいい具合に順を追っていてとても分かり易かったですw

本当にありがとうございました。心から感謝致します。


345ポイント を手に入れた。



Name: あ〜る  ..上級者(21,450ポイント)   Date: 2010/07/14(水) 10:58   No:56640       
Title: リリースビルドでの垂直同期について    
度々すいません、あ〜るです。
昨日リリースビルドの仕方を教えてもらい、無事ビルドする事は出来たのですが、いざ実行してみると画面にちらつきが生じてしまいます。
デバッグビルドで実行していたときは問題無かったのでリリースビルドをした事が原因になっているのではないかと思っています。
処理速度が上がり垂直同期が合わなくなってしまったのでしょうか?
画面がチラつくのも、単に沢山描画した時という訳ではなく、アイテムを取得した時に起こるので、その辺りに原因があるのでしょうか?
また、ちらつくのは3D背景を使用している所のみで2Dの描画は問題なく行われています

環境はWindowsXP、BCC DeveloperでBorlandC++を使用しています。DXライブラリも使用しています
 編集済み


307ポイント を手に入れた。


Name: あ〜る  ..上級者(22,413ポイント)   Date: 2010/07/14(水) 11:19   No:56642     
Title: Re:リリースビルドでの垂直同期について    
<デバッグビルド時のログ>

0:システムの情報を出力します
10:    DXライブラリ Ver2.25b
20:    OS  WindowsXP ( Build 2600 Service Pack 2 )
120:    CPU動作速度:大体1.31GHz
123:    MMX命令を使用します
127:    SSE命令が使用可能です
131:    SSE2命令が使用可能です
134:    CPUベンダ:GenuineIntel
149:    CPU名:        Intel(R) Pentium(R) M processor 1.60GHz
157:COMの初期化... 成功しました
166:メモリ総量:494.86MB  空きメモリ領域:262.48MB 
169:タイマーの精度を検査します
173:精度結果 更新回数 マルチメディアタイマー:0  パフォーマンスカウンター:60
176: パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz 
184: ソフトの二重起動検査... 二重起動はされていませんでした
196:ウインドウクラスを登録します... 登録に成功しました
204:フルスクリーンモード用のウインドウを作成します
209:ウインドウの作成に成功しました
226:カーソルを不可視にしました
231:IMEを無効にしました
435:DirectInput関係初期化処理
439:    DirectInput7 の取得中... 成功
496:        引き続き初期化処理... 初期化成功
505:    ジョイパッドの初期化... 
513:    ジョイパッドの初期化は正常に終了しました
518:    マウスデバイスの初期化... 初期化成功
527:    キーボードデバイスの初期化... 初期化成功
539:DirectInput 関連の初期化は正常に終了しました
543:DirectSound の初期化を行います
548:DirectSound インターフェースの取得を行います....  成功
597:引き続きインターフェースの初期化処理...  成功
714:    DirectSound デバイスを列挙します
721:        モジュール名:                 ドライバ記述:プライマリ サウンド ドライバ 
726:        モジュール名:   rdwm1098.sys  ドライバ記述:OUT (UA-1G) 
731:        モジュール名:      smwdm.sys  ドライバ記述:SoundMAX Digital Audio 
736:    最大サンプリングレート:44.10KHz 最小サンプリングレート:44.10KHz 
741:    総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 

746:    利用可能サンプリング精度
751:     プライマリ 16bit = OK  8bit = NO 
757:     セカンダリ 16bit = OK  8bit = NO 

762:    利用可能チャンネル
767:     プライマリ MONO = OK  STEREO = OK 
773:     セカンダリ MONO = OK  STEREO = OK 

778:DirectSound の初期化は正常に終了しました
783:DirectDraw 関連の初期化を行います
788:    DirectDraw オブジェクトの取得を行います....  成功
844:    引き続き初期化処理... 初期化に成功しました
857:    ビデオカードの情報
863:        画面モード変更処理を開始します
928:            ウインドウスタイルをフルスクリーンモード用に変更します... 完了
939:            画面モードの変更処理を開始します 640 x 480  32 bit 
945:                画面解像度を変更します... 成功しました
1302:            画面モードの変更は正常に終了しました 
1341:            カラー情報
1347:                A:00000000  B:00ff0000  G:0000ff00  B:000000ff
1352:            出力画面用の DirectDrawSurface を作成します
1416:                各スクリーンメモリの配置位置
1422:                    PrimaryBuffer : VIDEOMEMORY  
1427:                    BaskBuffer : VIDEOMEMORY  
1433:            出力画面用の DirectDrawSurface の作成は正常に終了しました
1438:            Direct3D 関連の初期化を行います
1444:            Direct3Dオブジェクトを取得します
1466:            Direct3Dオブジェクトを取得しました
1471:            HALデバイスを発見しました
1477:            3Dデバイスを作成します... 3Dデバイスの作成に成功しました
1524:                テクスチャ最大幅:2048 最小幅:1 
1529:                描画制限: D_D3DPTEXTURECAPS_POW2 = 1  D_D3DPTEXTURECAPS_SQUAREONLY = 0 
1535:                最大テクスチャステージ数 = 4   最大テクスチャブレンド数 = 4 
1540:                テクスチャピクセルフォーマット
1545:                    通常グラフィック用
1551:                         BIT:16  RED:5  GREEN:6  BLUE:5 
1557:                         RED:00f800 GREEN:0007e0 BLUE:00001f 

1562:                         BIT:32  RED:8  GREEN:8  BLUE:8 
1568:                         RED:ff0000 GREEN:00ff00 BLUE:0000ff 

1573:                    アルファチャンネル付きグラフィック用
1579:                         BIT:16  ALPHA:4  RED:4  GREEN:4  BLUE:4 
1585:                         ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f 

1590:                         BIT:32  ALPHA:8  RED:8  GREEN:8  BLUE:8 
1596:                         ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff 

1601:            Direct3D 関連の初期化は正常に終了しました
1607:            グラフィック管理系の初期化を行います
1614:                3Dグラフィック描画機能を使用します
1620:                フォントの初期化を行います
1631:                フォントの初期化は正常に終了しました
1638:            グラフィック管理系の初期化は正常に終了しました
1680:            サーフェス間転送には BltFast を使用します
1686:            BitBlt:22382μs   BltFast:8289μs
1691:            スキャンラインの数:480

2009:            1フレーム当たりの時間は 16 msecです
2021:                Tri00:184 msec
2027:                Tri01:16 msec
2033:                Tri02:17 msec
2038:                Tri03:16 msec
2044:        画面モード変更処理は正常に終了しました
2219:        オーバーレイサーフェスを使用します    UYVY
2226:    DirectDraw 関連の初期化は正常に終了しました
2239:    文字コードバッファの初期化を行います... 完了しました
65218:    DirectDraw 関連の終了処理をおこないます
65244:        フォントの初期化を行います
65256:        フォントの初期化は正常に終了しました
65263:        グラフィック管理系の終了処理は正常に終了しました
65270:        Direct3D 関連の終了処理を行います
65279:        3Dデバイスの削除は正常に終了しました
65286:        Direct3D 関連の終了処理は正常に終了しました
65293:        メインサーフェスを破棄をします... 完了しました
65311:        DirectDrawオブジェクトを解放します
65789:        DirectDrawオブジェクトを解放しました
65796:    DirectDraw 関連の終了処理は正常に終了しました
65802:    DirectInput 関連の終了処理... 完了
65848:    DirectSound の終了処理は正常に終了しました
66685:    ウインドウを閉じようとしています
66697:    ウインドウが破棄されようとしています
66703:    ソフトを終了する準備が整いました
66760:    
66766:    Alloc memory dump
66772:        Total size:0(0.000kb)  Alloc num:0
66778:    


963ポイント を手に入れた。

Name: あ〜る  ..上級者(24,641ポイント)   Date: 2010/07/14(水) 11:20   No:56643     
Title: Re:リリースビルドでの垂直同期について    
<リリースビルド時のログ>

0:システムの情報を出力します
10:    DXライブラリ Ver2.25b
10:    OS  WindowsXP ( Build 2600 Service Pack 2 )
110:    CPU動作速度:大体1.31GHz
113:    MMX命令を使用します
116:    SSE命令が使用可能です
120:    SSE2命令が使用可能です
123:    CPUベンダ:GenuineIntel
139:    CPU名:        Intel(R) Pentium(R) M processor 1.60GHz
143:COMの初期化... 成功しました
152:メモリ総量:494.86MB  空きメモリ領域:160.66MB 
158:タイマーの精度を検査します
162:精度結果 更新回数 マルチメディアタイマー:0  パフォーマンスカウンター:60
165: パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz 
173: ソフトの二重起動検査... 二重起動はされていませんでした
211:ウインドウクラスを登録します... 登録に成功しました
219:フルスクリーンモード用のウインドウを作成します
224:ウインドウの作成に成功しました
231:カーソルを不可視にしました
244:IMEを無効にしました
449:DirectInput関係初期化処理
453:    DirectInput7 の取得中... 成功
542:        引き続き初期化処理... 初期化成功
551:    ジョイパッドの初期化... 
560:    ジョイパッドの初期化は正常に終了しました
565:    マウスデバイスの初期化... 初期化成功
574:    キーボードデバイスの初期化... 初期化成功
584:DirectInput 関連の初期化は正常に終了しました
589:DirectSound の初期化を行います
593:DirectSound インターフェースの取得を行います....  成功
636:引き続きインターフェースの初期化処理...  成功
824:    DirectSound デバイスを列挙します
831:        モジュール名:                 ドライバ記述:プライマリ サウンド ドライバ 
837:        モジュール名:   rdwm1098.sys  ドライバ記述:OUT (UA-1G) 
842:        モジュール名:      smwdm.sys  ドライバ記述:SoundMAX Digital Audio 
847:    最大サンプリングレート:44.10KHz 最小サンプリングレート:44.10KHz 
852:    総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 

857:    利用可能サンプリング精度
863:     プライマリ 16bit = OK  8bit = NO 
868:     セカンダリ 16bit = OK  8bit = NO 

873:    利用可能チャンネル
879:     プライマリ MONO = OK  STEREO = OK 
884:     セカンダリ MONO = OK  STEREO = OK 

889:DirectSound の初期化は正常に終了しました
895:DirectDraw 関連の初期化を行います
900:    DirectDraw オブジェクトの取得を行います....  成功
934:    引き続き初期化処理... 初期化に成功しました
1005:    ビデオカードの情報
1010:        画面モード変更処理を開始します
1075:            ウインドウスタイルをフルスクリーンモード用に変更します... 完了
1087:            画面モードの変更処理を開始します 640 x 480  32 bit 
1093:                画面解像度を変更します... 成功しました
1479:            画面モードの変更は正常に終了しました 
1485:            カラー情報
1490:                A:00000000  B:00ff0000  G:0000ff00  B:000000ff
1496:            出力画面用の DirectDrawSurface を作成します
1969:                各スクリーンメモリの配置位置
1975:                    PrimaryBuffer : VIDEOMEMORY  
1981:                    BaskBuffer : VIDEOMEMORY  
1993:            出力画面用の DirectDrawSurface の作成は正常に終了しました
1999:            Direct3D 関連の初期化を行います
2005:            Direct3Dオブジェクトを取得します
2051:            Direct3Dオブジェクトを取得しました
2096:            HALデバイスを発見しました
2102:            3Dデバイスを作成します... 3Dデバイスの作成に成功しました
2843:                テクスチャ最大幅:2048 最小幅:1 
2849:                描画制限: D_D3DPTEXTURECAPS_POW2 = 1  D_D3DPTEXTURECAPS_SQUAREONLY = 0 
2855:                最大テクスチャステージ数 = 4   最大テクスチャブレンド数 = 4 
2860:                テクスチャピクセルフォーマット
2866:                    通常グラフィック用
2872:                         BIT:16  RED:5  GREEN:6  BLUE:5 
2882:                         RED:00f800 GREEN:0007e0 BLUE:00001f 

2888:                         BIT:32  RED:8  GREEN:8  BLUE:8 
2894:                         RED:ff0000 GREEN:00ff00 BLUE:0000ff 

2900:                    アルファチャンネル付きグラフィック用
2905:                         BIT:16  ALPHA:4  RED:4  GREEN:4  BLUE:4 
2911:                         ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f 

2917:                         BIT:32  ALPHA:8  RED:8  GREEN:8  BLUE:8 
2922:                         ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff 

2928:            Direct3D 関連の初期化は正常に終了しました
2934:            グラフィック管理系の初期化を行います
2941:                3Dグラフィック描画機能を使用します
2947:                フォントの初期化を行います
2960:                フォントの初期化は正常に終了しました
2968:            グラフィック管理系の初期化は正常に終了しました
2998:            サーフェス間転送には BltFast を使用します
3005:            BitBlt:11328μs   BltFast:7651μs
3010:            スキャンラインの数:480

3221:            1フレーム当たりの時間は 16 msecです
3227:                Tri00:16 msec
3233:                Tri01:16 msec
3239:                Tri02:33 msec
3245:                Tri03:17 msec
3259:        画面モード変更処理は正常に終了しました
3322:        オーバーレイサーフェスを使用します    UYVY
3371:    DirectDraw 関連の初期化は正常に終了しました
3386:    文字コードバッファの初期化を行います... 完了しました
178410:    DirectDraw 関連の終了処理をおこないます
178470:        フォントの初期化を行います
178483:        フォントの初期化は正常に終了しました
178490:        グラフィック管理系の終了処理は正常に終了しました
178496:        Direct3D 関連の終了処理を行います
178528:        3Dデバイスの削除は正常に終了しました
178535:        Direct3D 関連の終了処理は正常に終了しました
178541:        メインサーフェスを破棄をします... 完了しました
178553:        DirectDrawオブジェクトを解放します
179230:        DirectDrawオブジェクトを解放しました
179237:    DirectDraw 関連の終了処理は正常に終了しました
179308:    DirectInput 関連の終了処理... 完了
179968:    DirectSound の終了処理は正常に終了しました
181893:    ウインドウを閉じようとしています
181933:    ウインドウが破棄されようとしています
181939:    ソフトを終了する準備が整いました
181993:    
181998:    Alloc memory dump
182004:        Total size:0(0.000kb)  Alloc num:0
182010:



2,228ポイント を手に入れた。

Name: あ〜る  ..上級者(24,839ポイント)   Date: 2010/07/14(水) 11:21   No:56644     
Title: Re:リリースビルドでの垂直同期について    
ログです
長いので分割しました(添付すれば良かったですね、、、すいません)
これを見ると、デバッグビルド時は

2009:            1フレーム当たりの時間は 16 msecです
2021:                Tri00:184 msec
2027:                Tri01:16 msec
2033:                Tri02:17 msec
2038:                Tri03:16 msec

となっているのに対し、リリースビルド時は

3221:            1フレーム当たりの時間は 16 msecです
3227:                Tri00:16 msec
3233:                Tri01:16 msec
3239:                Tri02:33 msec
3245:                Tri03:17 msec

となっています。
この数値の違いも、何か関係あるのでしょうか?


198ポイント を手に入れた。

Name: あ〜る  ..上級者(24,859ポイント)   Date: 2010/07/15(木) 00:55   No:56691     
Title: Re:リリースビルドでの垂直同期について    
自己解決しました
お騒がせしてすいません


20ポイント を手に入れた。



Name: shiro4ao  ..初心者(6,240ポイント)   Date: 2010/07/14(水) 21:52   No:56669       
Title: CSVファイルの読み書き    
CSVファイルの読み書きを勉強しています。
しかし、実行すると途中で止まってしまいました。(応答なし?)
何がおかしいのでしょうか・・・?

=================ここから=====================================
#include <stdio.h>

int main(void)
{
  FILE *fpin,*fpout;
  char *fnameout = "export.csv";
  char *fnamein  = "import.csv";
  char s1,s2,s3;
  int n11,n12,n13,n21,n22,n23,n31,n32,n33;

  fpin = fopen(fnamein, "r" );
  if( fpin == NULL ){
    printf( "ファイルが開けません\n");
    return -1;
  }
  fscanf( fpin, "%s,%d,%d,%d\n", &s1,&n11,&n12,&n13);
  fscanf( fpin, "%s,%d,%d,%d\n", &s2 ,&n21,&n22,&n23);
  fscanf( fpin, "%s,%d,%d,%d\n", &s3 ,&n31,&n32,&n33);
  fclose( fpin);

  fpout = fopen(fnameout, "w" );
  if( fpout == NULL ){
    printf( "ファイルが開けません\n");
    return -1;
  }
  fprintf( fpout, "%s,%d,%d,%d\n", s1,n11,n12,n13);
  fprintf( fpout, "%s,%d,%d,%d\n", s2,n21,n22,n23 );
  fprintf( fpout, "%s,%d,%d,%d\n", s3,n31,n32,n33);
  fclose( fpout );

  return 0;
}
==============ここまで==================================
=============import.csv=======
test1,1,4,7
test2,2,5,8
test3,3,6,9
=============ここまで========
 編集済み


638ポイント を落としてしまった。


Name: シエル  ..プログラマー(28,082ポイント)   Date: 2010/07/14(水) 21:56   No:56670     
Title: Re:CSVファイルの読み書き    
char型の変数に入りきってない

13ポイント を手に入れた。

Name: shiro4ao  ..初心者(6,794ポイント)   Date: 2010/07/14(水) 22:01   No:56671     
Title: Re:CSVファイルの読み書き    
シエルさんありがとうございます!
charのs1,s2,s3を配列にしました。

================= ここから=====================================
#include <stdio.h>

int main(void)
{
  FILE *fpin,*fpout;
  char *fnameout = "export.csv";
  char *fnamein  = "import.csv";
  char s1[10],s2[10],s3[10];                    //変更箇所
  int n11,n12,n13,n21,n22,n23,n31,n32,n33;

  fpin = fopen(fnamein, "r" );
  if( fpin == NULL ){
    printf( "ファイルが開けません\n");
    return -1;
  }
  fscanf( fpin, "%s,%d,%d,%d\n", &s1,&n11,&n12,&n13);
  fscanf( fpin, "%s,%d,%d,%d\n", &s2 ,&n21,&n22,&n23);
  fscanf( fpin, "%s,%d,%d,%d\n", &s3 ,&n31,&n32,&n33);
  fclose( fpin);

  fpout = fopen(fnameout, "w" );
  if( fpout == NULL ){
    printf( "ファイルが開けません\n");
    return -1;
  }
  fprintf( fpout, "%s,%d,%d,%d\n", s1,n11,n12,n13);
  fprintf( fpout, "%s,%d,%d,%d\n", s2,n21,n22,n23 );
  fprintf( fpout, "%s,%d,%d,%d\n", s3,n31,n32,n33);
  fclose( fpout );

  return 0;
}
==============ここまで================================== 

実行できたようでしたが、結果がおかしなことになりました・・・
============export.csv============================
,2,0,4253508            
,4215195,1245016,4253484            
test03,3,6,9,5,4251648,512
===========ここまで==============================



554ポイント を手に入れた。

Name: shiro4ao  ..初心者(6,913ポイント)   Date: 2010/07/14(水) 22:07   No:56674     
Title: Re:CSVファイルの読み書き    
申し訳ありません。自己解決しました。

文字列の部分は","をふくんでしまうようなので、","を含まないようにスレパ良いようでした。
具体的には
==============================================================
  fscanf( fpin, "%[^,],%d,%d,%d\n", &s1,&n11,&n12,&n13);
  fscanf( fpin, "%[^,],%d,%d,%d\n", &s2 ,&n21,&n22,&n23);
  fscanf( fpin, "%[^,],%d,%d,%d\n", &s3 ,&n31,&n32,&n33);
=============================================================
%[^]を用いればうまくいきました。

シエルさんありがとうございました。 


119ポイント を手に入れた。

Name: シエル  ..プログラマー(28,193ポイント)   Date: 2010/07/14(水) 22:26   No:56677     
Title: Re:CSVファイルの読み書き    
%[]のフォーマット指定子って、スキャン集合って言うんですね。
まったく知りませんでした。便利ですね。
指摘した私がこんなこと言うのはすごい恥ずかしいですが、ありがとうございます(笑)

shiro4aoさんがこのフォーマット指定子を使わなかったら、
私がこのフォーマット指定子を知るのがいつになったことやら…


111ポイント を手に入れた。

Name: shiro4ao  ..初心者(6,944ポイント)   Date: 2010/07/14(水) 23:40   No:56681 解決!     
Title: Re:CSVファイルの読み書き    
なんとか解決できました!
「解決」にするのを忘れていました・・・
ありがとうございます。


31ポイント を手に入れた。



Name: MAY  ..ぴよぴよ(461ポイント)   Date: 2010/07/14(水) 21:43   No:56666       
Title: コンパイルが出来ない    
DxLibを使っていて、メイクは出来るのですが、コンパイルが出来ません。
環境はWindows2000、BorlandC++です
ほかのパソコン(WindowsXP)などでは出来たので、やっぱりWindows2000じゃ無理なんですかね


72ポイント を手に入れた。


Name: box  ..ハッカー(156,365ポイント)   Date: 2010/07/14(水) 21:50   No:56668     
Title: Re:コンパイルが出来ない    
コンパイルという概念はメイクという概念の部分集合にあたります。
よって、メイクができてコンパイルができない、という状況はあり得ません。

どんなソースを書いて何がどのようにできないのか、
エラーメッセージなどの情報を添えてくださると、
どなたかが何か答えてくれるかもしれません。


123ポイント を手に入れた。

Name: MAY  ..ぴよぴよ(548ポイント)   Date: 2010/07/14(水) 22:02   No:56672     
Title: Re:コンパイルが出来ない    
bccdevを使っていて[プロジェクト]→[コンパイル]を選んでも、下のエラーなどの表示をする欄?にコンパイルの状況が全く表示されない状況です。
携帯からの投稿なのでソースはちょっと無理です。すいません。


87ポイント を手に入れた。



Name: kei  ..かけだし(1,517ポイント)   Date: 2010/07/10(土) 18:17   No:56461       
Title: c言語のポインタ    
ポインタが苦手で、ポインタのポインタとかになると頭が混乱しそうになるんですが、ポインタに関するおすすめの書籍はありませんでしょうか?


68ポイント を手に入れた。


Name: たいちう  ..ハッカー(100,742ポイント)   Date: 2010/07/10(土) 23:12   No:56473     
Title: Re:c言語のポインタ    
ちゃんとした入門書ならば必ずポインタについては十分な説明が載っているはずです。
説明を何度も読んで、プログラムを色々書いて、それでも分からないことを
ピンポイントで掲示板で質問すれば良いと思いますが。


一応本も紹介しますが、今となっては古い本です。
Amazonのレビュー等も参考にして下さい(自分で読むのが一番ですが)。
その名も『C言語ポインタ完全制覇』。
http://www.amazon.co.jp/dp/4774111422


204ポイント を手に入れた。

Name: TKOZ  ..熟練のプログラマー(69,597ポイント)   Date: 2010/07/13(火) 17:18   No:56578     
Title: Re:c言語のポインタ    
ポインタのポインタは使い方さえ覚えれば使えますよ。。。

例えば、int **a,*b,c;というのがあったとして、
#include<stdio.h>

int main()
{
    int **a,*b,c;
    
    c=10;
    b=&c;
    a=&b;
    printf("%d",**a);
    
    return 0;
}
こうすればポインタのポインタの使い方も分かるのではないでしょうか?
まあ、普段こんな使い方しませんが。


110ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(71,512ポイント)   Date: 2010/07/14(水) 18:37   No:56658     
Title: Re:c言語のポインタ    
この例なんかは、どうでしょうか?

#include<stdio.h>

int main()
{
    char *StrTbl[9]={"ファミコン","ゲームボーイ","スーパーファミコン","Nintendo64","ゲームボーイカラー",
                    "ゲームボーイアドバンス","ゲームキューブ","NintendoDS","Wii"
                    };
    char **PointerOfPointer;//ポインタのポインタ
    int i;
    
    PointerOfPointer=StrTbl;
    
    for(i=0;i<9;i++){
        printf("%s\n",*PointerOfPointer);
        ++PointerOfPointer;
    }
    
    return 0;
}


138ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(86,042ポイント)   Date: 2010/07/14(水) 21:26   No:56664     
Title: Re:c言語のポインタ    
実技から入るか
テキスト、講座などから入るか
どちらが自分にあっているか検討されるのがいいですね


47ポイント を手に入れた。



Name: TKOZ  ..比類無きプログラマー(71,183ポイント)   Date: 2010/07/13(火) 21:55   No:56597       
Title: [雑談]13日の金曜日の出し方について    
13日の金曜日が不吉かどうかは定かではありませんが、
これの計算方法について雑談でもしませんか?

さっそく興味があったので、プログラミングしました。

しかし、少し計算にずれがあったみたいです。
なぜでしょうか!?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int NextYoubi(int youbi)
{
    youbi++;
    return youbi%7;
}

void Get13thFriday(int Year,int Month,int Day,char youbi[])
{
    int i,j,k=0;
    enum d{SUN,MON,TUE,WED,THU,FRI,SAT};
    char y[7][5]={"SUN","MON","TUE","WED","THU","FRI","SAT"};
    int DaysTbl[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int day=Day,year=Year,Youbi;
    int firstday=0;
    
    for(i=0;i<7;i++)
    {
        if(strcmp(youbi,y[i])==0)
        {
            Youbi=i;
        }
    }
        
    
        i=Month;
            while(year<2999)
            {
                
                if(year%4==0 && i==1)
                {
                    DaysTbl[1]=29;
                }
                if(DaysTbl[i]<=day)
                {
                    i++;
                    if(i>11) year++;
                    DaysTbl[1]=28;
                    day=1;
                    Youbi=NextYoubi(Youbi);
                    i=i%12;
                    firstday=Youbi;
                }
                
                if((day==13 && Youbi==5) && firstday==0)
                {
                    static int cnt=0;
                    printf("次の13日の金曜日は、%d年%d月%d日です。\n",year,i,day);
                    cnt++;
                    if(cnt>5)
                        break;
                }
                day++;
                Youbi=NextYoubi(Youbi);
            }
    
}

int main()
{
    int y,m,d;
    char youbi[100];
    printf("今日は西暦何年何月何日ですか?->");
                                                scanf("%d,%d,%d",&y,&m,&d);
    printf("今日は何曜日ですか?(SUN,MON,TUE,WED,THU,FRI,SAT)で答えて下さい。\n");
                                                scanf("%s",youbi);
    Get13thFriday(y,m,d,youbi);
    
    return 0;
}


2倍のポイントを手に入れた! 1,522ポイント を手に入れた。


Name: box  ..ハッカー(156,241ポイント)   Date: 2010/07/13(火) 22:08   No:56599     
Title: Re:[雑談]13日の金曜日の出し方について    
>                if(year%4==0 && i==1)
>                {
>                    DaysTbl[1]=29;
>                } 

もし、ここが閏年を求める箇所であるとすると、
「西暦年が4で割り切れる」という条件だけでは不足しています。


77ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(71,197ポイント)   Date: 2010/07/13(火) 22:15   No:56600     
Title: Re:[雑談]13日の金曜日の出し方について    
ちょっとwikipediaで調べてきます。閏年についてです。

14ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(71,374ポイント)   Date: 2010/07/13(火) 22:26   No:56601     
Title: Re:[雑談]13日の金曜日の出し方について    
4で割り切れる年は閏年、ただし、
100で割り切れる年は平年(普通の年?)
400で割り切れる年はうるう年です。
と書いてありました。
これは、グレゴリオ暦での計算方法です。

これをif文で表すと

if(year%4==0)
{
    if(year%100==0)
        return false;

    if(year%400==0)
        return true;
}
こんな感じですかね。


177ポイント を手に入れた。

Name: box  ..ハッカー(156,242ポイント)   Date: 2010/07/14(水) 00:03   No:56605     
Title: Re:[雑談]13日の金曜日の出し方について    
return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? true : false;

質問者さんが書かれたif文は、西暦年が4で割り切れない場合のことを
考慮していないため、不合格。 編集済み


1ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(54,105ポイント)   Date: 2010/07/14(水) 08:22   No:56626     
Title: Re:[雑談]13日の金曜日の出し方について    
if(year%4==0)
{
    if(year%100==0)
        return false;

    if(year%400==0)
        return true;

だと下のif文は実行されないですね(400で割り切れる数は必ず100で割り切れる)


76ポイント を手に入れた。

Name: 組木紙織  ..比類無きプログラマー(90,026ポイント)   Date: 2010/07/14(水) 08:57   No:56633     
Title: Re:[雑談]13日の金曜日の出し方について    
時間が足りなかったので仕様を合わせるところまではできませんでしたが、13日の金曜日プログラムです。
今晩にでも完成版あげます。


#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

enum week{SUN=0,MON=1,TUE=2,WED=3,THU=4,FRI=5,SAT=6};
const int DaysTbl[2][12]={
    {31,28,31,30,31,30,31,31,30,31,30,31},
    {31,29,31,30,31,30,31,31,30,31,30,31}};

int checkLeapYear(int y)
{
    return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 1 : 0; 
}

int checkDay(int month, int day,int leapYear)
{
    int ret = (month>12||month<1)?0:1;
    
    ret = (ret && DaysTbl[leapYear][month-1]>=day && day>=1)?1:0;
    return ret;
}
int Getdays(int month,int day,int leapYear)//うるう年なら1
{
    int ret =0;
    int i;

    if(!checkDay(month,day,leapYear)) return 0;
    for(i=1;i<month;++i)
    {
        ret+=DaysTbl[leapYear][i-1];
    }
    ret +=day;
    return ret;
}
int getWeek(int days,int firstdayWeek)
{
    return (days+firstdayWeek-1)%7;
}

void printAnswer(int month)
{
    printf("%d月13日は13日の金曜日です\n",month);
}
void Get13thFriday(int firstdayWeek,int leapYear)
{
    int i;
    for(i=1;i<13;i++){
        if(getWeek(Getdays(i,13,leapYear),firstdayWeek)==FRI)printAnswer(i);
    }
}

int main()
{
    Get13thFriday(FRI,0);
}


424ポイント を手に入れた。

Name: へろり  ..上級者(23,607ポイント)   Date: 2010/07/14(水) 10:07   No:56638     
Title: Re:[雑談]13日の金曜日の出し方について    
スレ主さんの趣旨とちがったら、ごめんなさい。
曜日を求めるなら、ツェラーの公式を使えば簡単ですよ。

以下のプログラムは1583年〜2999年までの13日の金曜日がいつかを列挙します。

#include<stdio.h> 

int getWeek(int y, int m, int d)
{
    if(m < 3) y--, m += 12;

    return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
}

int main()
{
    int year, month;

    for(year = 1583; year < 3000; year++){
        for(month = 0; month < 12; month++){
            if(getWeek(year, month + 1, 13) != 5) continue;
            printf("%d年 %2d月 13日(金)\n", year, month + 1);
        }
    }

    return 0;
}


私にしては珍しく動作確認済みです。


242ポイント を手に入れた。

Name: TKOZ  ..比類無きプログラマー(73,051ポイント)   Date: 2010/07/14(水) 21:25   No:56663     
Title: Re:[雑談]13日の金曜日の出し方について    
ツェラーの公式を使って、(wikipediaで調べました。)書き直してみました。
でも、最後がずれてます。
追記:ずれてませんでした。単なる年数の確認間違えでした。

#include<stdio.h>

int Tbl[12]={13,14,3,4,5,6,7,8,9,10,11,12};

int ZellersCongruence(int HighYear,int LowYear,int Month,int Day)
{
    int h,q=Day,m=Month,K=LowYear,J=HighYear;

    //K:年の2桁、m:月、q:日、h:曜日
    h=(q+(((m+1)*26)/10)+K+(K/4)+(J/4)-2*J)%7;

    return h;
}

int main(void)
{
    int i,j,k,i1,i2;
    //
    //printf("%d\n",2369/100%100);
    
    for(i=2010;i<2999;i++)
    {
        for(j=0;j<12;j++)
        {
            int tmp;
            if(j==0 || j==1) {
                i1=(i-1)/100%100;
                i2=(i-1)%100;
            }
            else{
                i1=i/100%100;
                i2=i%100;
            }
            if(6==ZellersCongruence(i1,i2,Tbl[j],13))
            {
                static int cnt=0;
                printf("次の13日の金曜日は、%d年%d月%d日です。\n",i,j+1,13);
                cnt++;
                if(cnt>5)
                    return 0;
            }
        }
    }

    return 0;
編集済み


226ポイント を手に入れた。



Name: ゆーずぃ  ..初心者(6,281ポイント)   Date: 2010/07/13(火) 15:01   No:56563       
Title: 許される配列の限度[雑談?]    
例えば1Gのメモリ,200GのHDDを積んだパソコンで実行するのが前提だとして、プログラムを組む際に皆さんならどの程度の配列までなら許せますか?

もしくはプログラム中で使用するのはメモリの何%以内とかでもいいです。

(別にbyte数を直接言ってもらってもいいのですが、)とりあえず計算のしやすいchar型を前提でお願いします(人'д`o)


138ポイント を手に入れた。


Name: Dixq (管理人)  ..ウィザード(1,232,654ポイント)   Date: 2010/07/13(火) 15:20   No:56565     
Title: Re:許される配列の限度[雑談?]    
何をするソフトかによると思うので一概には言えないと思います。
例えば本格的な3Dゲームやモデリングソフト、レイヤーを沢山使う画像処理ソフトなら1G食うこともあるでしょうし
反対に簡単な計算をするツールで1G取られたらたまりません。
使う側も行いたい事に応じてPCを用意するでしょうし、逆にロースペックなら例えば本格3Dゲーなんてしようと思わないでしょう。

まず、ソフトの仕様を示されてはいかがでしょう?


128ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(185,014ポイント)   Date: 2010/07/13(火) 15:22   No:56566     
Title: Re:許される配列の限度[雑談?]    
メモリ1GBだとOSが512MBとして、キャッシュや他のアプリとの共存を考えて300MBぐらいは残したい。ってことで200MBぐらいが限度。まぁ、メモリ200MB使ってるフリーソフトがあったらよほど有用じゃない限り使いません。ゲームなら、300〜400MBぐらいが上限ですかね。
前提として仮想記憶によるメモリスワップが発生すると重く・遅く・不安定になるので発生させてないって事を第一目的にメモリを決めます。


135ポイント を手に入れた。

Name: へろり  ..上級者(22,201ポイント)   Date: 2010/07/13(火) 15:42   No:56570     
Title: Re:許される配列の限度[雑談?]    
配列というのがよく解りませんが、要するにヒープのお話ですよね。

パソコン用のプログラムで、正直なところ意識したことはありません。
必要ならば1Gでも2Gでも使います。

それで不都合があるのなら、ちょっと考え直します。 その程度です。

以前過去10年間の為替のチャートデータの分析ソフトを作った際には、軽く1G程度は確保してましたね。
1分毎のデータを10年間分となるとそれぐらいは軽くいくのですよ。
必要なところを必要な分だけ、読んでは破棄、読んでは破棄なんてするより一気にどぱっとやってしまった方が、どう考えても楽です。

ケースバイケースだとは思いますが、必要な時に必要なとこだけ効率化を行い、効率化を行わなくても十分なパフォーマンスが得られるのであれば、富豪的プログラミングを行うべきだと考えます。

プログラムコードは短くなり、バグも入りにくくなる。 いいことずくめです。


メモ帳を作った時は、処理速度にこそとても気を使いましたが、メモリに関しては何も考えませんでした。

typedef struct{
    char buf[1024];
    char *sp;
    char *ep;
}LINE;

typedef struct tagPAGE{
    LINE *line[100];
    int sp;
    int ep;
    int useLine;
    struct tagPAGE *next;
    struct tagPAGE *prev;
}PAGE;

typedef PAGE* TEXTBUFFER;


メモ帳のテキストデータを保持する構造体ですが、とても富豪的です。


323ポイント を手に入れた。

Name: ゆーずぃ  ..初心者(6,582ポイント)   Date: 2010/07/14(水) 04:14   No:56620     
Title: Re:許される配列の限度[雑談?]    
>管理人さん

これから先色々な物を作っていく上での指針&参考にしたいので、とくにこれといって仕様はないのです(;^ω^)例をいくつか挙げてもよかったのですが、それだと自分の知らない分野の話が出なくなってしまうので、出来れば自由に語ってもらいたかったのです。

>softyaさん

確かに、OSの確保領域位は決めておいてもよかったかもしれませんね。ではOSは512MBを目安にしましょ(o´・∀・`o)

なるほど、メモリスワップまで考慮したことはなかったですね。勉強になります!

>へろりさん

>必要ならば1Gでも2Gでも使います。
富豪的ですねw小心者な自分では、メモリでも”もったいない病”が出てしまうのでうらやましいですw


>必要なところを必要な分だけ、読んでは破棄、読んでは破棄なんてするより一気にどぱっとやってしまった方が、どう考えても楽です。 

確かにそっちの方が楽なんですよねー。でも速度を考えるとどうなんでしょう?確かに一気に読んで一気に出した方が早い感じはあるのですが、実際の メモリ:速度比 ってどんな感じなんでしょうね?


301ポイント を手に入れた。

Name: へろり  ..上級者(22,603ポイント)   Date: 2010/07/14(水) 08:49   No:56631     
Title: Re:許される配列の限度[雑談?]    
>確かにそっちの方が楽なんですよねー。でも速度を考えるとどうなんでしょう?確かに一気に読んで一気に出した方が早い感じはあるのですが、実際の メモリ:速度比 ってどんな感じなんでしょうね?

規格やハードによってまちまちなので具体的な数値は控えますが、私の環境では以下のコードを走らせた結果は

HDD : 10530
MEM : 63

となりました。 圧倒的な速度差です。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>

int main(void)
{
    clock_t start, end;
    int i;
    char buf[1024] = {0}, *tmp;

    //HDDへ読み書き共に5万回
    start = clock();
    for(i = 0;i<50000;i++){
        FILE *fp = fopen("hoge.txt", "wb");
        fwrite(buf, 1, 1024, fp);
        fclose(fp);

        fp = fopen("hoge.txt", "rb");
        fread(buf, 1, 1024, fp);
        fclose(fp);
    }
    end = clock();
    printf("HDD : %d\n", end - start);

    //メモリコピーを10万回
    start = clock();
    for(i = 0;i<100000;i++){
        tmp = malloc(1024);
        memcpy(tmp, buf, 1024);
        free(tmp);
    }
    end = clock();
    printf("MEM : %d\n", end - start);

    return 0;
}

この検証でいいのかわかりませんが。


より低コストで、コストパフォーマンスの高いプログラムを書くのは、腕の見せ所で楽しいところの一つだと言うのは解りますが、そのためにトリッキーな手法を用いたり、泥臭いコードを書いたりするのは可能な限り避けるべきだと思いますよ。 大変だし、バグも入りやすくなりますし。


402ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(185,756ポイント)   Date: 2010/07/14(水) 10:32   No:56639     
Title: Re:許される配列の限度[雑談?]    
1GBを前提にメモリ量の目安をもう幾つか書いておきます。
常駐するソフトの場合は、上限は20MB程度だと自分で決めています。これでも大きい方ですけどね。大半の常駐ソフトは10MB未満です。

FireFoxとかは200MBぐらいを平気に使いますが、結構ほかのソフトを事を考えると厳しいです。これでVisualStudioを起動した場合にはセットで合わせて300〜400MBぐらい持って行かれますよね。
そこに500MBもあるようなソフトをデバッグしたら確実にメモリスワップします。なのでデバック中大容量メモリを使うとデバッグが困難になりますね。

へろりさんの言うことは一理あるというか使い方を間違えなければ正しいです。確保した大量のメモリ空間に対してシーケンシャルにアクセスする場合や単位時間あたりにアクセするメモリ量が少ない場合には、メモリスワップが発生していても大した速度低下は発生しません。逆にデータベースの様にランダムに大量のメモリにアクセスをする場合は、省メモリを考えないとメモリスワップの悪影響をもろに受けます。

フリーソフトでの配布を考えた場合は、使う人がメモリが足らなくなるような状況は避けるべきだと思います。ビデオ圧縮ソフトとか速度優先の場合は別ですよ。それ以外の場合はメモリを食うソフトは嫌われますからね。
使う人の事を考えて、ほかのソフトと共存共栄できるメモリ量を目指してソフトを作ったほうが良いというのがわたしの考えです。




454ポイント を手に入れた。

Name: へろり  ..上級者(23,767ポイント)   Date: 2010/07/14(水) 11:01   No:56641     
Title: Re:許される配列の限度[雑談?]    
softyaさんの意見には大いに賛成します。

>ケースバイケースだとは思いますが、必要な時に必要なとこだけ効率化を行い、効率化を行わなくても十分なパフォーマンスが得られるのであれば、富豪的プログラミングを行うべきだと考えます。

と、先のレスで申し上げた通り、ただ闇雲にメモリ効率を求めるべきではなく、メモリの効率化を図る事で、実行速度や可読性、プログラムの保守性や堅牢性など、トレードオフ的に潤沢な資源に頼れるところは頼ってしまっていいじゃないか。 ということです。

無駄遣いはよくありませんが、必要ならば1Gでも2Gでも使うべきだと考えます。


追記です。

No:56570 で書いたテキストデータを保持する構造体ですが、このデータ構造ではファイルサイズで大体数十kb程度のテキストファイルを読み込むと、1MBほどのメモリを必要とします。
ファイルサイズの実にン十倍ものメモリ量です。 これを無駄遣いと感じるかどうかは人それぞれだとは思いますが、テキストデータですから、編集作業を考慮した結果のデータ構造がこの形です。
その結果、要求メモリがファイルサイズのン十倍になろうがそれは必要なことだと考えます。

そもそも、プログラムが使うメモリは、搭載されているであろうメモリ量から決めるのではなく、
プログラムが扱うデータ量から決めるべきものではありませんか。 いかがでしょう。 編集済み


160ポイント を手に入れた。

Name: ゆーずぃ  ..初心者(6,245ポイント)   Date: 2010/07/14(水) 16:22   No:56653     
Title: Re:許される配列の限度[雑談?]    
>へろりさん

実際に検証して頂いてありがとうございます!色々な検証方法があるとは思いますが、これだけの違いが出るというのは肝に銘じておかなければなりませんね。
トリッキーすぎると可読性も悪くなりますしね、反省することしきりです(;^ω^)

>そもそも、プログラムが使うメモリは、搭載されているであろうメモリ量から決めるのではなく、 
 プログラムが扱うデータ量から決めるべきものではありませんか。 いかがでしょう。

賛否両論でしょうが、

>ケースバイケースだとは思いますが、必要な時に必要なとこだけ効率化を行い、効率化を行わなくても十分なパフォーマンスが得られるのであれば、富豪的プログラミングを行うべきだと考えます。

との言葉と合わせると、真を得た言葉だと思います。


>softyaさん

>1GBを前提にメモリ量の目安をもう幾つか書いておきます。 
 常駐するソフトの場合は、上限は20MB程度だと自分で決めています。これでも大きい方ですけどね。大半の常駐ソフトは10MB未満です。


常駐ソフトは作ったことが無かったので、そーゆーお話をして頂けるとありがたいです^^

>確保した大量のメモリ空間に対してシーケンシャルにアクセスする場合や単位時間あたりにアクセスするメモリ量が少ない場合には、メモリスワップが発生していても大した速度低下は発生しません。逆にデータベースの様にランダムに大量のメモリにアクセスをする場合は、省メモリを考えないとメモリスワップの悪影響をもろに受けます。


速度については常々悩んでいますが、そこを考えたことはなかったです。自分もすぐにそこまで考えつくように精進したいです!


>使う人の事を考えて、ほかのソフトと共存共栄できるメモリ量を目指してソフトを作ったほうが良いというのがわたしの考えです。 

そうですね、使い手はそのソフトだけを起動させるわけじゃないですもんね。とても含蓄のある言葉です。


482ポイント を落としてしまった。



Name: syosinnsya  ..ぴよぴよ(6ポイント)   Date: 2010/07/14(水) 13:44   No:56647       
Title: デバックなしで開始がない;;    
タイトルの通りです。。

なぜ???


6ポイント を手に入れた。


Name: シエル  ..プログラマー(28,069ポイント)   Date: 2010/07/14(水) 13:47   No:56648     
Title: Re:デバックなしで開始がない;;    
ツールのユーザ設定からいけば、追加できるはずです。

24ポイント を手に入れた。

Name: Mist  ..比類無きプログラマー(84,065ポイント)   Date: 2010/07/14(水) 14:08   No:56649     
Title: Re:デバックなしで開始がない;;    
[ツール]−[設定]−[上級者設定] 

で2008までと同じメニューになります。


15ポイント を手に入れた。

Name: Dixq (管理人)  ..ウィザード(1,232,738ポイント)   Date: 2010/07/14(水) 15:47   No:56652     
Title: Re:デバックなしで開始がない;;    
gccでコンパイルしてるのにEmacsでいつもついCtrl+F5押してます…。

ってことでショートカットキーでもできますよ。


3ポイント を落としてしまった。



Name: sood  ..入門者(3,565ポイント)   Date: 2010/07/14(水) 11:51   No:56646       
Title: キャラクターの絵画の透過設定について    
charファイルの中の0というpngファイルです。
これを、竜神録でキャラクターとして表示させるときに、白だと、白い枠組みが出てきてしまいます。
確かめたのは、第9章のソースをそのまま流用して、素材の状態を確かめました。

この場合、73*73で切り取ってあるのですが、そのまま73*73の白い枠ごと表示されます

どうすればいいのでしょうか?


143ポイント を手に入れた。


Name: やっくん  ..プログラマー(29,738ポイント)   Date: 2010/07/14(水) 14:28   No:56650     
Title: Re:キャラクターの絵画の透過設定について    
DXライブラリをご使用なされているのであれば、画像の透過させたい部分は黒(0,0,0)にすると透過させることができます。

35ポイント を手に入れた。

Name: へろり  ..上級者(23,802ポイント)   Date: 2010/07/14(水) 14:39   No:56651     
Title: Re:キャラクターの絵画の透過設定について    
的はずれだったらごめんなさい。

アルファ付きpngにしたらダメなんですか?


35ポイント を手に入れた。



Name: 秋色  ..ぴよぴよ(131ポイント)   Date: 2010/07/13(火) 12:24   No:56559       
Title: 途中からの読み込み    
こんにちは。
テキストファイルを読み込むものを作っているのですが…。

テキストに
田中 40 男
木村 28 男
中村 32 女

とある場合、名前の後から読み込んだり途中から
読み込むことってできますか??
 編集済み


62ポイント を手に入れた。


Name: だいちゃん  ..ぴよぴよ(430ポイント)   Date: 2010/07/13(火) 14:07   No:56561     
Title: Re:途中からの読み込み    
やったことないんでわかりませんが
なんで途中から読み込ませたいんですか?
頭から読み込んでも使いたいとこ以外は読み飛ばせば問題ないのでは?


61ポイント を手に入れた。

Name: 秋色  ..ぴよぴよ(711ポイント)   Date: 2010/07/13(火) 15:28   No:56568     
Title: Re:途中からの読み込み    
そうなんですが、読み飛ばしなしでできないかと思って…。

後、下記のプログラムで、実行すると不正命令検出って言われて
終わってしまうのはなぜですか??どこが間違えてるのか指摘お願いします。

#include <stdio.h>
#include <stdlib.h>

#define MAX 100
#define ITEM 5

struct meibo{
 char name[20];
 int age;
 char sex[5];
};

void main(void){
 FILE *fp;
 char filename[20];
 char str[MAX];
 int i, j;
 struct meibo list[5];
 
 printf("ファイル名を入力>>");
 gets(filename);

 if((fp = fopen(filename, "r")) == NULL){
  printf("ファイルがありません\n");
  exit(1);
 }

 while(fgets(str, MAX, fp) != NULL){
  for(j = 0; j < ITEM; j++){
   for(i = 0; str[i] != ' '; i++){ 
    list[j].name[i] = str[i];
   }
   for(i = i+1; str[i] != ' '; i++){
    list[j].age = str[i];
   }
   for(i = i+1; str[i] != '\0'; i++){
    list[j].sex[i] = str[i];
   }
  }
 }
 for(j = 0; j < ITEM; j++){
  printf("%s %d %s\n", list[j].name, list[j].age, list[j].sex);
 }
 fclose(fp);
}


580ポイント を手に入れた。

Name: softya [URL]  ..ハッカー(185,302ポイント)   Date: 2010/07/13(火) 15:54   No:56571     
Title: Re:途中からの読み込み    
ファイル内の読み込み位置(ファイル先頭からのバイト数)が分かっているのならfseek()で読み飛ばしができます。ただし、その位置を調べるにはファイルを一度開いて読み込んだときにftell()で読み込み位置を調べる必要がありますね。

>後、下記のプログラムで、実行すると不正命令検出って言われて

1.文字列の終端は'\0'で終わる必要があります。
2.list[j].age = str[i];は、左が数値で右が文字列ですので根本的に間違っています。
3.ITEMで5個と行数を固定してますが、実際にファイルも5行のデータですか?
もし、違ったらITEMで5で固定するのは間違いです。
4.while(fgets(str, MAX, fp) != NULL){とfor(j = 0; j < ITEM; j++)がループとして別になっているのでが変です。ファイルの行数掛けるITEM数分処理するんでしょうか?


208ポイント を手に入れた。

Name: 秋色  ..ぴよぴよ(731ポイント)   Date: 2010/07/13(火) 20:37   No:56592     
Title: Re:途中からの読み込み    
直してみました。でも、やっぱ2番目の年齢を格納するところが
上手くいかないです。 編集済み


20ポイント を手に入れた。

Name: dic  ..比類無きプログラマー(85,995ポイント)   Date: 2010/07/13(火) 21:31   No:56593     
Title: Re:途中からの読み込み    
修正してみました
配列のインデックス値がおかしかったりしてます
ファイルをオープンするのはきめうちにしてます
memset でゼロクリアしてます
デバッカでバグを追っていく辛抱強さが必要です

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>        //    memset に必要

#define MAX 20
#define ITEM 5

struct meibo{
    unsigned char name[20];
    unsigned long age;
    unsigned char sex[5];
};

void main(void){
    FILE *fp;
//    char    Filename[20];
    char str[MAX];
    unsigned long i, a, j = 0;

    char    age[20];

    struct meibo list[ITEM];
    memset( list, 0, sizeof(list) );                                    //    内容をゼロでクリアしておく

    //    ファイルをオープン(きめうち)
    fp = fopen( "test.txt", "rt" );

    while(fgets(str, MAX, fp) != NULL){
        for(i = 0; str[i] != ' '; i++){
            list[j].name[i] = str[i];
        }
        list[j].name[i] = '\0';
        memset( age, 0, sizeof(age) );                                    //    age をゼロでクリア
        for(i = i+1,a=0; str[i] != ' '; i++,a++){                        //    インデックスがおかしい
//        for(i = i+1; str[i] = ' '; i++){
            age[a] = str[i];
//            list[j].age = atoi(str[i]);
        }
        age[a] = '\0';
        list[j].age = atoi(age);                                        //    文字列をatoi
//        list[j].age[i] = '\0';
        for(i = i+1,a=0; str[i] != '\0'; i++,a++){
//        for(i = i+1; str[i] != '\0'; i++){    
            list[j].sex[a] = str[i];                                    //    list[j].sex[a] 配列がおかしい
//            list[j].sex[i] = str[i];
        }
        list[j].sex[i] = '\0';
        j++;
    }
    for(i = 0; i < j; i++){
        printf("%s %lu %s", list[i].name, list[i].age, list[i].sex);    //    \n はしょり
//        printf("%s %lu %s\n", list[i].name, list[i].age, list[i].sex);
    }
    fclose(fp);
}



732ポイント を手に入れた。

Name: box  ..ハッカー(156,164ポイント)   Date: 2010/07/13(火) 21:33   No:56594     
Title: Re:途中からの読み込み    
>    unsigned Filename[20];

ファイル名がint型でよいのでしょうか。


25ポイント を手に入れた。

Name: 白い時空  ..かけだし(2,076ポイント)   Date: 2010/07/13(火) 21:54   No:56596     
Title: Re:途中からの読み込み    
こういう入力はsscanf関数使ったほうが簡単です。
while(fgets(str, MAX, fp) != NULL){
    
    sscanf(str,"%s %lu %s",list[j].name,&list[j].age,list[j].sex);
    j++;
}

これだけで済みます。


28ポイント を手に入れた。

Name: 秋色  ..ぴよぴよ(787ポイント)   Date: 2010/07/13(火) 22:28   No:56603     
Title: Re:途中からの読み込み    
どなたもありがとうございます。
ですが、動かなかったです…。すみません。


2倍のポイントを手に入れた! 56ポイント を手に入れた。

Name: みつ  ..ぴよぴよ(46ポイント)   Date: 2010/07/14(水) 00:04   No:56606     
Title: Re:途中からの読み込み    
これを試してみてください。

for (i = 0; fscanf(fp, "%s %d %s", list[i].name, &list[i].age, list[i].sex) != EOF; i++);


46ポイント を手に入れた。

Name: 秋色  ..ぴよぴよ(825ポイント)   Date: 2010/07/14(水) 07:41   No:56625     
Title: Re:途中からの読み込み    
どこに入れたらいいですか??


2倍のポイントを手に入れた! 38ポイント を手に入れた。

Name: 秋色  ..ぴよぴよ(839ポイント)   Date: 2010/07/14(水) 11:35   No:56645 解決!     
Title: Re:途中からの読み込み    
解決できました。ありがとうございます。

14ポイント を手に入れた。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +