C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   落下判定について   
     ・[53400] 伊藤 
     ・[53413] ookami 
     ・[53447] 伊藤 
     ・[53448] 伊藤 
     ・[53455] ookami 
     ・[53456] 伊藤 
     ・[53462] 伊藤 
     ・[53496] ookami 
     ・[53509] 伊藤 
     ・[53517] 伊藤 
     ・[53526] wing 
     ・[53531] ookami 
   スタッフロール作成   
     ・[53519] Dixq (管理人) 
     ・[53520] つつ 
     ・[53530] Ma 
   【雑談】 floatはdoub ....   
     ・[53392] Ma 
     ・[53393] ムンバ 
     ・[53394] たかぎ 
     ・[53395] たかぎ 
     ・[53396] Justy 
     ・[53398] たかぎ 
     ・[53402] Justy 
     ・[53403] Ma 
     ・[53410] ookami 
     ・[53411] たかぎ 
     ・[53412] Dixq (管理人) 
     ・[53417] たかぎ 
     ・[53418] ねこ 
     ・[53419] たかぎ 
     ・[53423] toyo 
     ・[53425] ねこ 
     ・[53427] たいちう 
     ・[53432] Libra 
     ・[53436] たかぎ 
     ・[53438] たいちう 
     ・[53439] たかぎ 
     ・[53440] シエル 
     ・[53441] たかぎ 
     ・[53450] fr 
     ・[53451] たかぎ 
     ・[53458] 山崎 
     ・[53459] たかぎ 
     ・[53464] Dixq (管理人) 
     ・[53466] たかぎ 
     ・[53468] たかぎ 
     ・[53473] たかぎ 
     ・[53474] softya 
     ・[53476] softya 
     ・[53477] Justy 
     ・[53479] softya 
     ・[53482] たいちう 
     ・[53483] softya 
     ・[53488] たかぎ 
     ・[53491] たかぎ 
     ・[53493] softya 
     ・[53529] たかぎ 
   NetWorkRecv()で受信し ....   
     ・[53524] つうこうにん 
     ・[53525] 山崎 
   DESについて   
   トリプルDESについて   
     ・[53508] sizuma 
     ・[53510] たいちう 
     ・[53511] たろう 
     ・[53512] たろう 
     ・[53515] たろう 
   プロセスに残ってしま ....   
     ・[53366] ookami 
     ・[53382] 深黒 
     ・[53408] ookami 
     ・[53494] 深黒 
     ・[53495] leaf 
     ・[53513] 深黒 
   格闘ゲーム作りの参考 ....   
     ・[53480] Dixq (管理人) 
     ・[53485] Day-D 
     ・[53486] softya 
     ・[53487] Dixq (管理人) 
     ・[53489] Day-D 
     ・[53490] softya 
     ・[53492] Day-D 
     ・[53505] Dixq (管理人) 
   【雑談】 NULLと0が同 ....   
     ・[53279] dic 
     ・[53281] たかぎ 
     ・[53282] sizuma 
     ・[53283] ムンバ 
     ・[53285] シエル 
     ・[53286] たかぎ 
     ・[53287] toyo 
     ・[53288] たかぎ 
     ・[53289] たいちう 
     ・[53290] たかぎ 
     ・[53291] toyo 
     ・[53292] たかぎ 
     ・[53293] シエル 
     ・[53294] たかぎ 
     ・[53297] たいちう 
     ・[53298] たかぎ 
     ・[53299] ムンバ 
     ・[53300] たかぎ 
     ・[53301] たかぎ 
     ・[53302] ひよこ 
     ・[53303] たかぎ 
     ・[53305] ひよこ 
     ・[53306] たかぎ 
     ・[53307] lbfuvab 
     ・[53308] たかぎ 
     ・[53310] ひよこ 
     ・[53312] たかぎ 
     ・[53313] Tororo 
     ・[53314] たかぎ 
     ・[53315] ひよこ 
     ・[53316] たかぎ 
     ・[53320] ideyan 
     ・[53321] たかぎ 
     ・[53323] たかぎ 
     ・[53324] ぽこ 
     ・[53327] やんち 
     ・[53328] たかぎ 
     ・[53330] ぽこ 
     ・[53331] たかぎ 
     ・[53346] ぽこ 
     ・[53348] たかぎ 
     ・[53349] たかぎ 
     ・[53367] たかぎ 
     ・[53371] Dixq (管理人) 
     ・[53372] たかぎ 
     ・[53374] Dixq (管理人) 
     ・[53375] 組木紙織 
     ・[53376] たかぎ 
     ・[53377] たかぎ 
     ・[53378] たかぎ 
     ・[53380] 組木紙織 
     ・[53504] ムンバ 
   【雑談】 sizeofを関数 ....   
     ・[53309] たいちう 
     ・[53311] たかぎ 
     ・[53317] Tororo 
     ・[53318] たかぎ 
     ・[53322] たかぎ 
     ・[53325] ぽこ 
     ・[53329] たかぎ 
     ・[53357] ムンバ 
     ・[53359] たかぎ 
     ・[53361] ムンバ 
     ・[53362] シエル 
     ・[53363] たかぎ 
     ・[53368] Dixq (管理人) 
     ・[53370] たかぎ 
     ・[53379] あ〜る 
     ・[53383] たかぎ 
     ・[53384] レッドリ 
     ・[53385] たかぎ 
     ・[53454] Tororo 
     ・[53457] レッドリ 
     ・[53460] たかぎ 
     ・[53461] たかぎ 
     ・[53500] ムンバ 
   カウントについて   
     ・[53472] シエル 
     ・[53481] Dixq (管理人) 
     ・[53497] 胡椒 
   アーカイブファイルを ....   
     ・[52706] ベリ工 
     ・[52707] ベリ工 
     ・[52730] softya 
     ・[52764] たろう 
     ・[52768] softya 
     ・[52780] たろう 
     ・[52782] softya 
     ・[52785] たろう 
     ・[52792] softya 
     ・[52799] たろう 
     ・[52800] softya 
     ・[52805] たろう 
     ・[52823] softya 
     ・[52835] たろう 
     ・[52836] softya 
     ・[52845] たろう 
     ・[52850] softya 
     ・[52863] たろう 
     ・[52879] softya 
     ・[52884] たろう 
     ・[52886] softya 
     ・[52889] たろう 
     ・[52891] softya 
     ・[52895] たろう 
     ・[52910] softya 
     ・[52913] たろう 
     ・[52917] softya 
     ・[52942] たろう 
     ・[52944] たろう 
     ・[52950] たろう 
     ・[52952] softya 
     ・[52957] たろう 
     ・[52960] softya 
     ・[52962] たろう 
     ・[52966] softya 
     ・[52972] たろう 
     ・[52974] softya 
     ・[52976] たろう 
     ・[52990] たろう 
     ・[52991] softya 
     ・[52992] たろう 
     ・[52993] たろう 
     ・[52995] たろう 
     ・[52996] softya 
     ・[53003] たろう 
     ・[53004] softya 
     ・[53006] たろう 
     ・[53008] softya 
     ・[53009] たろう 
     ・[53010] softya 
     ・[53011] たろう 
     ・[53012] softya 
     ・[53016] たろう 
     ・[53023] softya 
     ・[53024] たろう 
     ・[53026] softya 
     ・[53038] たろう 
     ・[53042] softya 
     ・[53069] たろう 
     ・[53110] softya 
     ・[53115] たろう 
     ・[53118] softya 
     ・[53130] たろう 
     ・[53131] たろう 
     ・[53132] たろう 
     ・[53210] softya 
     ・[53211] Justy 
     ・[53224] たろう 
     ・[53225] たろう 
     ・[53475] Justy 
   実行ファイルのsoundフ ....   
     ・[53465] シエル 
     ・[53467] dic 
   文字列と配列、関数に ....   
     ・[53421] toyo 
     ・[53422] たかぎ 
     ・[53433] しろ 
     ・[53437] たかぎ 
     ・[53442] toyo 
     ・[53444] たかぎ 
     ・[53449] しろ 
     ・[53452] たかぎ 
     ・[53453] しろ 
   配列の演習問題につい ....   
     ・[53389] たかぎ 
     ・[53390] hiroboh 
     ・[53391] たかぎ 
     ・[53397] hoge 
     ・[53399] たかぎ 
     ・[53401] hoge 
     ・[53404] toyo 
     ・[53409] たかぎ 
     ・[53415] たかぎ 
   プログラムについて質 ....   
     ・[53355] box 
     ・[53360] HK 
     ・[53405] しろ 
     ・[53406] toyo 
     ・[53407] しろ 
   初心者なんで、親切な ....   
     ・[53342] たかぎ 
     ・[53344] 炎獄 
     ・[53347] たかぎ 
     ・[53351] Ma 
     ・[53356] 炎獄 
     ・[53365] Dixq (管理人) 
     ・[53381] ムンバ 
   これは何の略?(Win3 ....   
     ・[53364] たいちう 
     ・[53369] シエル 
     ・[53373] HK 
   暗号化の本やサイトに ....   
     ・[53352] softya 
     ・[53354] たろう 
   バイナリデータの文字 ....   
     ・[53269] たかぎ 
     ・[53295] ユリアン 
     ・[53296] たかぎ 
     ・[53343] ユリアン 
   カレントディレクトリ ....   
     ・[53319] toyo 
     ・[53340] ひよこ 
   _sleep()の動きについ ....   
     ・[53078] ookami 
     ・[53096] hayakawa 
     ・[53101] ideyan 
     ・[53107] dic 
     ・[53111] hayakawa 
     ・[53119] hayakawa 
     ・[53189] ookami 
     ・[53212] dic 
     ・[53213] たいちう 
     ・[53214] やんち 
     ・[53217] dic 
     ・[53220] たいちう 
     ・[53250] dic 
     ・[53255] たいちう 
     ・[53256] たかぎ 
     ・[53257] ookami 
     ・[53264] ねこ 
     ・[53266] たかぎ 
     ・[53271] softya 
     ・[53272] たかぎ 
     ・[53276] softya 
     ・[53278] dic 
     ・[53284] たいちう 
     ・[53334] ookami 
     ・[530701276392013] hayakawa 
   NESASMのBG描きこみル ....   
     ・[53149] たかぎ 
     ・[53154] TKOZ 
     ・[53155] たかぎ 
     ・[53162] TKOZ 
     ・[53176] TKOZ 
     ・[53177] TKOZ 
     ・[53180] たかぎ 
     ・[53218] TKOZ 
     ・[53219] たかぎ 
     ・[53230] TKOZ 
     ・[53231] たかぎ 
     ・[53277] TKOZ 
     ・[53280] たかぎ 
   現在現役プログラマー ....   
     ・[53252] バグ 
     ・[53253] Dixq (管理人) 
     ・[53254] たかぎ 
     ・[53259] たいちう 
     ・[53263] 匿名 
     ・[53275] sizuma 
   超初心者ですが   
     ・[53168] Justy 
     ・[53204] 春すぎて 
     ・[53206] toyo 
     ・[53258] 春すぎて 
     ・[53260] たいちう 
     ・[53261] Ma 
     ・[53262] 春すぎて 
     ・[53270] Dixq (管理人) 

Name: 伊藤  ..かけだし(1,653ポイント)   Date: 2010/06/02(水) 21:05   No:53339       
Title: 落下判定について    
モデムが壊れてネットにつなげられなく回答が遅れてしまいました。
申し訳御座いませんでした。

http://www.play21.jp/board/formz.cgi?action=res&resno=52869&page=&lognum=162&id=dixq&rln=52922
で質問させて頂いたものです。

DXライブラリを使ってゲームを作っております。 
移動の判定が上手くいかず 
どうしてもわからなかったので質問させて頂きました。 

仕様 
・プレイヤーは常に左右のどちらかに移動し続けている 
・壁に当たったら移動方向を反転する 
・床がなかったら落ちる 
といったよくありそうなゲームです。 

壁に当たった際の左右反転は出来たのですが 
落ちる際に左右の移動の判定が入ってしまったり 
落ちた際に壁にめり込んで急に左右反転してしまうことがあります。 

必要そうな一部分だけを切り出したのでミスがあったらすみません。 


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


Name: 伊藤  ..かけだし(2,000ポイント)   Date: 2010/06/03(木) 02:58   No:53400     
Title: Re:落下判定について    
やり方を変えてみたのですがやはり上手くいきません・・・。
本当にわかりません・・・。


void PlayMove(void){

    // 移動量の初期化
    Play.Mx = 0;
    Play.My = 0;
    Play.Ox = Play.Px;
    Play.Oy = Play.Py;
    Play.Cx = int(Play.Px-16 / CEL_SW);
    Play.Cy = int(Play.Py-16 / CEL_SH);

    // 移動量のセット
    for(int speed=0; speed<Play.Speed; speed++){
        Play.Mx = 1;
        if(Play.Dir) Play.Mx *= -1;
        
        for(int i=0; i<OBJ_MAX; i++){

            if((Play.Px-16)%32 == 0){
                //if(Map[i].Ptn == 0) Play.My = 1;
            }

            // 左右の判定
            if(Map[i].Ptn != 0){
                if(Play.Px-CEL_SW/2 < Map[i].Px+CEL_SW/2 && Play.Px+CEL_SW/2 > Map[i].Px-CEL_SW/2 &&
                    Play.Py-CEL_SH/2 < Map[i].Py+CEL_SH/2 && Play.Py+CEL_SH/2 > Map[i].Py-CEL_SH/2){
                        
                        /*
                        // Y座標用
                        for(int j=0; j<OBJ_MAX-CEL_W; j++){
                            if(Map[i].Cy != CEL_W-1 && Map[i].Cx == Map[j].Cx && Map[i].Cy+1 == Map[j].Cy &&Map[j].Ptn == 0){
                                Play.My = 1;
                                break;
                            }
                        }
                        */
                        
                        Play.Dir = !Play.Dir;
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                        Play.Mx = 0;
                        Play.My = 0;
                        break;
                }
            }
            /*
            if(Play.Px%CEL_SW == 0){
                if(Play.Px == Map[i].Px && Play.Py == Map[i].Py+32 && Map[i].Ptn == 0){
                    Play.My = 10;
                    tf = true;
                }
            }
            */
        }

        // 落下中なら
        if(Play.My != 0) Play.Mx = 0;

        Play.Px += Play.Mx;
        Play.Py += Play.My;
    }

}



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

Name: ookami  ..上級者(18,585ポイント)   Date: 2010/06/03(木) 08:04   No:53413     
Title: Re:落下判定について    
分かりませんが(というかあちこちコメントアウトされていてどれを活かしたいか分からなかったので)、PlayMove関数の動きが意図通りにいかないなら部分処理を関数化して単体テストする方向でいかがでしょうか。

例えば、
・前方に壁があるか判定してtrueかfalseを返す関数
・下に床があるか判定してtrueかfalseを返す関数
あたりから。


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

Name: 伊藤  ..入門者(2,723ポイント)   Date: 2010/06/03(木) 11:48   No:53447     
Title: Re:落下判定について    
ookami様

回答ありがとうございます。
ご指摘ありがとうございます。
コメントを消して修正した最新版を書かせて頂きます。

関数に分けるのではなくY座標の判定をとってからX座標の判定をするようにしてみました。
// ここの条件が思いつかないです。
と書いてあるところの条件がどうしても思いつきません・・・。

void PlayMove(void){

    // 移動量のセット
    for(int speed=0; speed<Play.Speed; speed++){
        
        // 移動量の初期化
        bool turnF = false;
        
        Play.Mx = 0;
        Play.My = 1;
        Play.Ox = Play.Px;
        Play.Oy = Play.Py;
        Play.Cx = int(Play.Px-16 / CEL_SW);
        Play.Cy = int(Play.Py-16 / CEL_SH);        
        
        // Y座標の判定
        for(int i=0; i<OBJ_MAX; i++){
            if(Map[i].Ptn == 0){
                // ここの条件が思いつかないです。
                if((Play.Px-16)%CEL_SW == 0 && Play.Px = Map[i].Px && Play.Py){
                    Play.Py = 1;
                }
            }
        }

        Play.Py += Play.My;

        if(Play.My == 0){
            // X座標の判定
            Play.Mx = 1;
            if(Play.Dir) Play.Mx *= -1;
            Play.Px += Play.Mx;
        
            // 左右の判定
            for(int i=0; i<OBJ_MAX; i++){
                // 0でも100でも101でもなかったら
                if(Map[i].Ptn != 0 && Map[i].Ptn != 100 && Map[i].Ptn != 101){
                    if(Play.Dir == RIGHT && (Play.Px-16)%CEL_SW == 0
                        && Play.Py == Map[i].Py && Play.Px+CEL_SW == Map[i].Px) turnF = true;
                    else if(Play.Dir == LEFT && (Play.Px-16)%CEL_SW == 0    
                        && Play.Py == Map[i].Py && Play.Px-CEL_SW == Map[i].Px) turnF = true;
                }
            }

            // 左右の反転
            if(turnF){
                Play.Px = Play.Ox;
                Play.Dir = !Play.Dir;
            }        
        }
    }

}



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

Name: 伊藤  ..入門者(2,689ポイント)   Date: 2010/06/03(木) 11:49   No:53448     
Title: Re:落下判定について    
すみません・・・。
初期化のPlay.My = 1;は
Play.My = 0;でした。



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

Name: ookami  ..上級者(18,796ポイント)   Date: 2010/06/03(木) 12:29   No:53455     
Title: Re:落下判定について    
むむむ... まぁ私が言ったのはデバッグ手法のほんの一例ではありますけどね。
数えると、
代入文 16箇所、
if文 8箇所、
  うち && でさらに分岐するのが 10箇所、
2重 forループもある、
てな規模で、しかもそれが思い通りに動かないとなれば、処理を部分ごとに分割して単体テストするべきかと私は思います。

とりあえず、アップしてもらったソースについてですが...
Playの、Mx,My,Ox,Oy,Px,Py,Cx,Cy の意味を解説してもらえますか?
あと、
>Play.My = 0;でした。 
とすると、
Play.Myが常にゼロですが、意図通りですか?


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

Name: 伊藤  ..入門者(2,939ポイント)   Date: 2010/06/03(木) 12:45   No:53456     
Title: Re:落下判定について    
回答ありがとうございます。

Mx,My…移動量
Ox,Oy…前座標
Px,Py…描画位置
Cx,Cy…セル座標(中心点描画をしている為 座標は32*x+16です)

処理が多いのはわかっております・・・。
もちろん現在のソースでは32で割り切れないとバグが出ると言った
色々な問題点があることも理解しております。
ただどうしても減らしたり効率がよいロジックが思いつきません・・・。

ゼロを入れているのは毎フレーム移動はしておりません。
下が0ならYの移動量が1入りそれをspeed回数分まわしおります。

ookami様がおっしゃった部分ごとに作れるなら作りたいのですが
下にマップがあるかなどの判定の仕方がわかりません・・・。

本当に申し訳ないのですがサンプルを頂けないでしょうか?
丸投げ+手間をかけてしまって申し訳ないのですが
どうやっても自分では解決できないです・・・。


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

Name: 伊藤  ..入門者(3,413ポイント)   Date: 2010/06/03(木) 13:11   No:53462     
Title: Re:落下判定について    
何度もすみません。


bool HitLeftRight(void){
    
    bool hitF = false;
    
    for(int i=0; i<OBJ_MAX; i++){
        if(Map[i].Ptn != 0 && Map[i].Ptn != 100 && Map[i].Ptn != 101){
            if(Play.Dir == RIGHT && (Play.Px-16)%CEL_SW == 0
                && Play.Py == Map[i].Py && Play.Px+CEL_SW == Map[i].Px){
                    hitF = true;
                    break;
            }else if(Play.Dir == LEFT && (Play.Px-16)%CEL_SW == 0    
                && Play.Py == Map[i].Py && Play.Px-CEL_SW == Map[i].Px){
                    hitF = true;
                    break;
            }
        }
    }
        
    return hitF;
}

bool HitDown(void){

    bool hitF = false;
    
    for(int i=0; i<OBJ_MAX; i++){
        if(Map[i].Ptn == 0){ 
            if((Play.Px-16)%CEL_SW == 0 && Play.Px == Map[i].Px && Play.Py > Map[i].Py+CEL_SH && (Play.Py-Map[i].Py) < 32){
                hitF = true;
                break;
            }
        }
    }
        
    return hitF;
    
}

void PlayMove(void){
    
    // 移動量のセット
    for(int speed=0; speed<Play.Speed; speed++){
        
        // 移動量の初期化
        bool downF = false;
        bool turnF = false;
        
        Play.Mx = 0;
        Play.My = 0;
        Play.Ox = Play.Px;
        Play.Oy = Play.Py;
        
        // 落下判定
        downF = HitDown();
        if(!downF) Play.My = 1;
        
        // 左右の判定
        turnF = HitLeftRight();
        
        if(turnF){
            Play.Px = Play.Ox;
            Play.Dir = !Play.Dir;
        }else{
            if(Play.My == 0){
                Play.Mx = 1;
                if(Play.Dir) Play.Mx *= -1;
            }
        }

        Play.Px += Play.Mx;
        Play.Py += Play.My;

    }



判定をわけたものです。
やはり落下の判定が上手く取れません・・・
if文が問題なのかと思うのですがここの条件式が思い浮かびません・・。



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

Name: ookami  ..上級者(19,055ポイント)   Date: 2010/06/03(木) 20:44   No:53496     
Title: Re:落下判定について    
おぉ、関数に分けてくださいましたね!ぜんぜん丸投げじゃないです。とても主体的だと思います。

単体テストのために、テストコードを書いてみましょう。

void testHitDown(void){
    bool b;
    FILE *fp;
    fp=fopen("debug.txt","w");

    // テストパターン1
    Play.Px=32とか;
    Play.Py=32とか;
    :
    : その他必要なパラメータ
    :
    b=HitDown();
    fprintf(fp,"%d ",b);

    // テストパターン2
    Play.Px=なにがし;
    Play.Py=なにがし;
    :
    : その他必要なパラメータ
    :
    b=HitDown();
    fprintf(fp,"%d ",b);

    以下、テストしたいパターンだけ繰り返し。

    fclose(fp);
}

int メイン関数{
    初期化処理;
    testHitDown();
}

今あるメイン関数はいったんコメントアウトします。

これで、実行するとdebug.txtが生成されるはずですから、用意したテストパターンと予想した結果と照らし合わせてください。

ステップ実行などするのもよいでしょう。

原因がつかめなければ、
(Play.Px-16)%CEL_SW == 0 && Play.Px == Map[i].Px && Play.Py > Map[i].Py+CEL_SH && (Play.Py-Map[i].Py) < 32)
この部分が非常に複雑なので、ここだけさらに
bool HitDownElm(int i);
などとくくり出してもよいかもしれません。

サンプルどころかヒントすら示していなくてごめんなさい。しかし上記のように、関数を分けるだけでなく、固定値をつっこんでテストするということが非常に有効なので、ぜひやってみてください。


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

Name: 伊藤  ..初心者(5,755ポイント)   Date: 2010/06/03(木) 23:27   No:53509     
Title: Re:落下判定について    
色々とアドバイスありがとうございます。
頂いたソースなのですが使い方がよくわかりません・・・。
変数出力を駆使してみたらどうもHitDownの判定が上手くいっておりません・・・。

小分けにしたいのですが今の自分では出来ないのでまとめて判定だけを処理するようにしたいです。


//////////////////////////////////////////////////
マップデータイメージ こんな感じのtblでまとめて読み込んでいます。
//////////////////////////////////////////////////
int MapData_01[CEL_H][CEL_W] = {
    { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,1,1,1,2, 3,3,4,4,5, 5,1,1,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },

    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },

    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
    { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 },
};
//////////////////////////////////////////////////

void InitMap(void){

    MapNum = 0;
    
    for(int i=0; i<CEL_H; i++){
        for(int j=0; j<CEL_W; j++){
            MapData[i][j] = *(MapTbl[MapNum] + i*CEL_W + j);
            //MapData[i][j] = MapData_05[i][j];
        }
    }
    
    // オブジェ初期化
    for(int i=0; i<OBJ_MAX; i++){
        Map[i].Cy = i / CEL_W;
        Map[i].Cx = i-(Map[i].Cy*CEL_W);
        Map[i].Ptn = MapData[Map[i].Cy][Map[i].Cx];
        Map[i].Px = float(Map[i].Cx*CEL_SW + CEL_SW/2);
        Map[i].Py = float(Map[i].Cy*CEL_SH + CEL_SH/2);
        Map[i].Air = 0xff;
        Map[i].Cnt = 0;

        if(Map[i].Ptn == 100){
            M_Start.x = Map[i].Cx;
            M_Start.y = Map[i].Cy;
        }
        if(Map[i].Ptn == 101){
            M_Goal.x = Map[i].Cx;
            M_Goal.y = Map[i].Cy;
        }
    }

}
//////////////////////////////////////////////////
bool HitDown(void){

    bool hitF = false;
    
    for(int i=0; i<OBJ_MAX; i++){
        if((Play.Px-16)%CEL_SW == 0 && Play.Px == Map[i].Px && Play.Cy-1 == Map[i].Cy){
            hitF = true;
            break;
        }
    }
    if((Play.Px-16)%CEL_SW == 0){
        /*
        if(){
            if((Play.Px-16)%CEL_SW == 0 && Play.Px == Map[i].Px && Play.Cy-1 == Map[i].Cy){
                hitF = true;
                break;
            }
        }
        */
    }
        
    return hitF;
    
}


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

Name: 伊藤  ..初心者(6,373ポイント)   Date: 2010/06/04(金) 09:47   No:53517     
Title: Re:落下判定について    
かなり無理やりですがなんとか出来ました・・・

bool HitLeftRight(void){
    
    bool hitF = false;
    
    for(int i=0; i<OBJ_MAX; i++){
        /*
        if(Map[i].Ptn != 0 && Map[i].Ptn != 100 && Map[i].Ptn != 101){
            if(Play.Dir == RIGHT){
                if(Play.Px-CEL_SW/2 < Map[i].Px-CEL_SW/2+1 && Play.Px+CEL_SW/2 > Map[i].Px-CEL_SW/2 &&
                    Play.Py-CEL_SH/2 < Map[i].Py+CEL_SH/2 && Play.Py+CEL_SH/2 > Map[i].Py-CEL_SH/2){
                        hitF = true;
                        break;
                }
            }else if(Play.Dir == LEFT){
                if(Play.Px-CEL_SW/2 < Map[i].Px+CEL_SW/2 && Play.Px+CEL_SW/2 > Map[i].Px+CEL_SW/2-1 &&
                    Play.Py-CEL_SH/2 < Map[i].Py+CEL_SH/2 && Play.Py+CEL_SH/2 > Map[i].Py-CEL_SH/2){
                        hitF = true;
                        break;
                }
            }
        }        
        */
        if(Map[i].Ptn != 0 && Map[i].Ptn != 100 && Map[i].Ptn != 101){
            if(Play.Dir == RIGHT 
                && Play.Cy == Map[i].Cy && Play.Px+CEL_SW == Map[i].Px){
                    hitF = true;
                    break;
            }else if(Play.Dir == LEFT     
                && Play.Cy == Map[i].Cy && Play.Px-CEL_SW == Map[i].Px){
                    hitF = true;
                    break;
            }
        }
        
        
    }
        
    return hitF;
}

bool HitDown(void){

    bool hitF = false;
    for(int i=0; i<OBJ_MAX; i++){
        if(Map[i].Ptn != 0){
            if(Play.Px-CEL_SW/2 < Map[i].Px+CEL_SW/2 && Play.Px+CEL_SW/2 > Map[i].Px-CEL_SW/2 &&
                Play.Py-CEL_SH/2 < Map[i].Py-CEL_SH/2+1 && Play.Py+CEL_SH/2 > Map[i].Py-CEL_SH/2){
                    hitF = true;
                    break;
            }
        }
    }
    
    return hitF;
    
}

void PlayMove(void){
    
    // 移動量のセット
    for(int speed=0; speed<Play.Speed; speed++){
        
        // 移動量の初期化
        bool HitDownF = false;
        bool HitLeftRightF = false;
        
        Play.Mx = 0;
        Play.My = 0;
        Play.Ox = Play.Px;
        Play.Oy = Play.Py;
        Play.Cx = int(Play.Px-16) / CEL_SW;
        Play.Cy = int(Play.Py-16) / CEL_SH;
        
        // 落下判定
        HitDownF = HitDown();
        HitLeftRightF = HitLeftRight();
        tf= HitDownF;
        //tf= HitLeftRightF;
        
        //tf = HitDownF;
        
        // 床と当たってなかったら落下 当たってたら左右移動
        if(HitDownF){
            if(HitLeftRightF){
                Play.Px = Play.Ox;
                Play.Dir = !Play.Dir;
            }else{
                Play.Mx = 1;
                if(Play.Dir) Play.Mx *= -1;
            }            
        }else{
            Play.My = 1;
        }

        Play.Px += Play.Mx;
        Play.Py += Play.My;
    }
}



これの改善案的なもののアドバイスを頂けないでしょうか?


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

Name: wing  ..初心者(8,575ポイント)   Date: 2010/06/04(金) 12:53   No:53526     
Title: Re:落下判定について    
伊藤さんこんにちは。
自力で当たり判定を作成するなんて感心してみてました。
私なんかは他の人のサンプルを流用させてもらってばかりです。

参考にはならないと思いますが、superMariko2 のコードを
アップしますので、ほとんどが当たり判定なので、よかったら見てください。


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

Name: ookami  ..上級者(21,170ポイント)   Date: 2010/06/04(金) 14:23   No:53531     
Title: Re:落下判定について    
出来たとのこと、よかったです^^ あまりお役に立てませんで... 私も書き方を考えないといかんですね。

(ここまでは、意図通りに動かないプログラムへの対処でしたが、
 ここからは、意図通りには動くんだけど、ソースをどう改善するか、という話ですね)

総論的に、リファクタリングについてはこちら。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

提案としては以下です。

if( Play.Px-CEL_SW/2 < Map[i].Px+CEL_SW/2   && Play.Px+CEL_SW/2 > Map[i].Px-CEL_SW/2 &&
    Play.Py-CEL_SH/2 < Map[i].Py-CEL_SH/2+1 && Play.Py+CEL_SH/2 > Map[i].Py-CEL_SH/2  ){

↑こうなっているところを、if文の中身をくくりだして↓

bool hitRect(float ax1,float ay1,
             float ax2,float ay2,
             float bx1,float by1,
             float bx2,float by2) {
    return ( ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1 );
}

:
:

if( hitRect(Play.Px-CEL_SW/2,Play.Py-CEL_SH/2,
            Play.Px+CEL_SW/2,Play.Py+CEL_SH/2,
            Map[i].Px-CEL_SW/2,Map[i].Py-CEL_SH/2+1,
            Map[i].Px+CEL_SW/2,Map[i].Py-CEL_SH/2   )) {

こんな感じにします。引数については添付ファイルをご覧ください。
こうしておけば、今後、長方形同士の当たり判定に毎回使えます。
参考になれば幸いです。


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



Name: つつ  ..かけだし(2,022ポイント)   Date: 2010/06/04(金) 10:24   No:53518       
Title: スタッフロール作成    
DxLibで右から左方向に流れるスタッフロールを作ろうとしているのですが。

作り方がいまいちわかりません。教えてください。


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


Name: Dixq (管理人)  ..ウィザード(1,198,884ポイント)   Date: 2010/06/04(金) 10:30   No:53519     
Title: Re:スタッフロール作成    
私はシューティングと同じ概念で実装しています。
スタッフロールは計算速度うんぬん考慮する必要ないので適当にリストに追加してます。
シューティングについてはゲームプログラミングの館や龍神録プログラミングの館にかいてあります。


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

Name: つつ  ..かけだし(2,052ポイント)   Date: 2010/06/04(金) 10:52   No:53520     
Title: Re:スタッフロール作成    
自分のミニマムな脳では理解不可能らしいので
詳しく教えてください。


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

Name: Ma  ..ハッカー(103,919ポイント)   Date: 2010/06/04(金) 14:10   No:53530     
Title: Re:スタッフロール作成    
テキストに番号をつける。

番号ごとに位置を決める

描画


位置の決め方

開始からの経過時間と速度を考慮して1番目のテキストの位置を計算する。
そこからオフセットで、二番目以降は単純に加算する。
このとき、画面からはみ出るようならば表示しない。


他にも方法はありますが、とりあえず一つ。、


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



Name: たかぎ [URL]  ..ハッカー(197,262ポイント)   Date: 2010/06/03(木) 01:18   No:53387       
Title: 【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
似たような雑談スレばかり立ててすみません。

floatはdoubleより高速だと考えている人はどれぐらいいますか?

皆さんご自身のことや周りの状況など、何でもよいので情報をください。  


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


Name: Ma  ..ハッカー(103,607ポイント)   Date: 2010/06/03(木) 01:59   No:53392     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
どこかで、float は double より遅いとかって見たことがあるような・・・。
そんな感じのあいまいな認識ですが、double ほど精度がいらないときはfloatを使う事は結構あります。
どこかでそれを読むまでは単純にデータ長が短いから高速と思っていました。


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

Name: ムンバ  ..熟練のプログラマー(57,144ポイント)   Date: 2010/06/03(木) 02:01   No:53393     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
同一ファイル内での出来事ですよね?
同一ファイル内だとして、型の宣言の順番とかも関係してくるのでしょうか?

使用条件が同じ環境で、型宣言(同一bit?で)の順番も同じ条件とすると・・・
(何か勘違いしてたら、申し訳御座いません。)

float の方が・・・処理速度の事ですよね?<速いと思います。

それぞれ、型宣言した変数の値(のbit数?)にも影響されると思うのですが・・・。
と、現時点では思います。


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

Name: たかぎ [URL]  ..ハッカー(197,416ポイント)   Date: 2010/06/03(木) 02:05   No:53394     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> Maさん

> どこかで、float は double より遅いとかって見たことがあるような・・・。 

↓でしょうか?
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html

> どこかでそれを読むまでは単純にデータ長が短いから高速と思っていました。

実測されたこと、あるいはコンパイラの出力を確認したことはありますか?


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

Name: たかぎ [URL]  ..ハッカー(197,457ポイント)   Date: 2010/06/03(木) 02:08   No:53395     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> ムンバさん(寝たのでは?)

> 同一ファイル内での出来事ですよね? 

同一ファイルかどうかとかは考えたこともありませんでした。

> 同一ファイル内だとして、型の宣言の順番とかも関係してくるのでしょうか? 

型の宣言といっても、floatもdoubleも組み込み型ですが...

> float の方が・・・処理速度の事ですよね?<速いと思います。 
> それぞれ、型宣言した変数の値(のbit数?)にも影響されると思うのですが・・・。 
> と、現時点では思います。

要するにfloatのほうが高速だということですね。


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

Name: Justy  ..伝説なるハッカー(537,659ポイント)   Date: 2010/06/03(木) 02:17   No:53396     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
 環境によりけりなんでしょうけど、私の扱った・知っている狭い範囲の中だけでいうと
多くの環境で floatの方が高速に処理されるという印象はあります。


 最初に扱ったプラットフォームは sizeof(float) == sizeof(double) でどう書いても単精度として
扱われる環境だったこともあり、そのあたりは全く気にしていませんでした。

 次のプラットフォームでは double型が倍精度になりソフトウェア演算になった為 double型の演算が
激重になりました。
 後から知ったのですが、最初の環境もコンパイラオプションで切り替えできるらしく、
単精度化オプションを外せばきっと最初の環境も遅くなっていたでしょう。


 今の Windows + Intel CPUの場合ですと普通に使っている限り演算そのものの速度は全く変わらない
(或いは多少違いはあっても気にしなければならないレベルではない)と思っています。

 ただ、FPUのレジスタを変更して精度を下げた場合は floatの演算が速くなる(と言われていますが
テストしたことはありません)ということと、メモリアクセスが絡む場合(特に大量の)floatと doubleでは
単純に倍の領域にアクセスが必要になる、という2点において floatの方が高速になることがあると
思っています。


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

Name: たかぎ [URL]  ..ハッカー(197,509ポイント)   Date: 2010/06/03(木) 02:28   No:53398     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> Justyさん

なるほど。
速度に関していえば、double ≦ float だということですね。
そして、環境に依存すると。

doubleの方が高速になる可能性はないでしょうか?


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

Name: Justy  ..伝説なるハッカー(537,729ポイント)   Date: 2010/06/03(木) 03:24   No:53402     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>doubleの方が高速になる可能性はないでしょうか? 
 うーん、そうですね。

 先の「Cプログラミング診断室」で説明されている「HW/コンパイラ的に doubleの方が効率よく処理する」
ケースくらいしかちょっと思いつかないです……。

 思いついたら、また書き込みます。


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

Name: Ma  ..ハッカー(103,705ポイント)   Date: 2010/06/03(木) 03:54   No:53403     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>実測されたこと、あるいはコンパイラの出力を確認したことはありますか? 
ないですね。勝手な憶測です。


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

Name: ookami  ..上級者(18,531ポイント)   Date: 2010/06/03(木) 07:52   No:53410     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
ちょっとそれるかも分かりませんが、cosf(ang) が (float)(cos(ang)) と定義されていてビックリしたことがあります。わざわざdoubleで計算してからfloatに落としているのかと。それで漠然と、doubleの方が速いのかなと思ってました。

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

Name: たかぎ [URL]  ..ハッカー(197,701ポイント)   Date: 2010/06/03(木) 07:54   No:53411     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> ookamiさん

> ちょっとそれるかも分かりませんが、cosf(ang) が (float)(cos(ang)) と定義されていてビックリしたことがあります。わざわざdoubleで計算してからfloatに落としているのかと。それで漠然と、doubleの方が速いのかなと思ってました。

これは実装上の手抜きですね。
ただ、それが原因でdoubleの方が高速に処理できるということは確かにありそうです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,197,435ポイント)   Date: 2010/06/03(木) 08:02   No:53412     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
この件は、Cを学び始めたころ、たまたまネットでdoubleの方が早い事が多いという記事を見かけて知りました。

後、龍神録を作ってるときに何回も計った覚えがあります。
結果、ほとんど変わらないか、doubleの方が微妙に早いという印象でした。
(まぁ後になってJustyさんからDirectXではdoubleの精度はfloatと同じになると教えて頂く事になるわけですが・・)

今も計ってみました。

● コンソールプログラム ●

    t=clock();
    for( i=0; i<1000000000; i++ ){
        f+=1.1f;
    }
    printf("%d - %f\n",clock()-t,f);
    t=clock();
    for( i=0; i<1000000000; i++ ){
        d+=1.1;
    }
    printf("%d - %f\n",clock()-t,d);

実行結果

3104 - 33554432.000000
3086 - 1100000014.151283


● DXライブラリプログラム ●

    t=GetNowCount();
    for( i=0; i<1000000000; i++ ){
        f+=1.1f;
    }
    printfDx("%d - %f\n",GetNowCount()-t,f);
    t=GetNowCount();
    for( i=0; i<1000000000; i++ ){
        d+=1.1;
    }
    printfDx("%d - %f\n",GetNowCount()-t,d);

実行結果

3071 - 33554432.000000
3049 - 33554432.000000


DirectXにおいても微妙にdoubleの方が早いのはそのままなんですね。
まぁこれ位の差はほぼ無いに等しいでしょうけど。

CPU : i7 860
コンパイラ : VC++2008Express


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

Name: たかぎ [URL]  ..ハッカー(197,736ポイント)   Date: 2010/06/03(木) 08:15   No:53417     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> Dixqさん

> DirectXにおいても微妙にdoubleの方が早いのはそのままなんですね。 
> まぁこれ位の差はほぼ無いに等しいでしょうけど。 

これは有意な差とは言いにくいですね。


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

Name: ねこ  ..熟練のプログラマー(53,275ポイント)   Date: 2010/06/03(木) 08:58   No:53418     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
「float>=double」の認識が強いです。

DirectXの関数で使われてたり、3Dライブラリでもfloatを使うよう示唆していたりするための先入観です。
なのでずっとfloatの方が高速という印象を持っていました。
以前気になってネットで調べると最近?では大差が無いという記事を見つけたので「>=」という認識になっています。
「昔はfloatの方が高速だった」のではないか、という考えになりました。

きゅーさんのレス見てて思ったのが何において高速と判断するかでしょうか。
例えば1.1の加算を行っていますが、例えばこれが浮動(固定)小数点同士の乗算や除算、浮動小数点と整数型の演算になると差が出るのかなと。
また32ビット環境においてfloatは4バイトdoubleは8バイトという差もあるので当然メモリの生成速度?は倍変わるのかな等。
※32ビット環境以外は無知です。

演算においては恐らく同等
サイズの関係で深く大きいシステムにおいては「float>double」になるのではないか
という見解です。

ちなみに個人的にはfloatは演算誤差でバグ起こすイメージがあるのでほぼ使わない型です。


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

Name: たかぎ [URL]  ..ハッカー(197,887ポイント)   Date: 2010/06/03(木) 09:06   No:53419     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> ねこさん

> 「float>=double」の認識が強いです。

これは、IntelのCPUかつWindowsの場合に限った話でしょうか?

> 「昔はfloatの方が高速だった」のではないか、という考えになりました。 

例えばSSEが単精度しか使えないとか、現在ほどメモリが潤沢ではないので、頂点情報などをdoubleで持つとサイズ的に許容できないとか、あるいはキャッシュミスヒットやページフォルトが頻繁に発生するとか、そういうことでしょうかね。

> 例えば1.1の加算を行っていますが、例えばこれが浮動(固定)小数点同士の乗算や除算、浮動小数点と整数型の演算になると差が出るのかなと。 

四則演算の中では最も時間がかかる除算を使えば、もう少し差を確認しやすいかもしれませんね。



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

Name: toyo  ..熟練のプログラマー(47,815ポイント)   Date: 2010/06/03(木) 09:23   No:53423     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
結局コンパイラやFPUユニットなどの環境次第ではないかと考えてます
全部ソフトウェアで計算するならfloatの方が早い
double精度に適したfpuプロセッサならdoubleの方が早い

昔のPC9801がFPUコプロセッサが別売でしかもかなり高価だったのを思い出しました


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

Name: ねこ  ..熟練のプログラマー(53,194ポイント)   Date: 2010/06/03(木) 09:39   No:53425     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>たかぎさん

<これは、IntelのCPUかつWindowsの場合に限った話でしょうか? 
特にOSやCPUの規格を意識していないです。
自身で一番多い開発環境がWinXPでのVC6〜2008で、それ以外の環境でどうこうまでは考えていません。

WinOS、VC使いが、Windows上でだけ動かすものを作るために考えた結果という認識でお願いします。


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

Name: たいちう  ..比類無きプログラマー(90,773ポイント)   Date: 2010/06/03(木) 09:54   No:53427     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> > どこかで、float は double より遅いとかって見たことがあるような・・・。 

> ↓でしょうか?
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html

私も多分その本かサイトで知りました。
その本も古い本ですが、もっと古い時代にはfloatの方が確実に速く、
それが常識として定着していたのでしょう。

重要なのはそのような常識は変わりうる、という事を意識しておくことと思い、
最終段階で必要に迫られたとき以外は、そのような最適化はしません。
当然、その時は実測しながらです。

ある程度以上の大きさのnに対してなら、O(n^2)よりO(n*log(n))が速いという
常識が覆ることはないので、アルゴリズムは大好きです。


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

Name: Libra  ..上級者(20,785ポイント)   Date: 2010/06/03(木) 10:31   No:53432     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
自分はdoubleの方が早いと思っていました。
自分も>http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html
ここで、doubleの方が早いと見て「ふ〜ん」と思ってました。


それで実際に計測してみたのですが・・・・

> Dixqさん
速度の計測方法なのですが、

#include <stdio.h>
#include <time.h>

int main(void){
    int i;
    float sum;
    int timer;
    
    printf("size\n");
    printf("float %d\n",sizeof(float));
    printf("int %d\n",sizeof(int));
    printf("double %d\n",sizeof(double));
    timer = clock();
    for(i=0;i<1000000000;i++){
            sum += 1.0 ;
    }
    printf("%dms\n",clock()-timer);

    return 0;
}
この場合のsumでは、殆ど差は現れませんでした。 自分のパソコン(WinXP)では、両者とも3000msでした。 ここまでは、管理人さんが提示した結果と同じなのです。 しかし、以下のソースで計測した場合、floatの方が早い速度が出ました。
#include <stdio.h>
#include <time.h>
int main(void){
    int i;
    float sum1=3.5;
    float sum2=23.2;
    float sum3;
    int timer;
    
    printf("size\n");
    printf("float %d\n",sizeof(float));
    printf("int %d\n",sizeof(int));
    printf("double %d\n",sizeof(double));
    timer = clock();
    for(i=0;i<1000000000;i++){
            sum3 = sum1 / sum2 ;
    }
    printf("%dms\n",clock()-timer);

    return 0;
}

sumの型をfloatとdoubleに変えて計測したところ、
floatが7437ms、doubleが12719msでした。
10回程計測しましたが、大体floatが7秒、doubleが12秒でした。

5秒の差はかなり大きいのではないでしょうか。

「+=」で演算すると、ほとんど差が出ないのに、除算だと結構差が出ます。
また、演算を行わず、ループを同じ回数まわすだけの時は、300ms程度でした。(計測回数10回)
よって、ループによる時間の影響はほとんどないと考えられます。


実際計測して、今まで覚えてたものと違ってびっくりしてます。
この計測方法でもdoubleの方が場合によって早くなったりするのでしょうか・・・? 編集済み


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

Name: たかぎ [URL]  ..ハッカー(198,282ポイント)   Date: 2010/06/03(木) 10:41   No:53436     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> 特にOSやCPUの規格を意識していないです。 
> 自身で一番多い開発環境がWinXPでのVC6〜2008で、それ以外の環境でどうこうまでは考えていません。 
> WinOS、VC使いが、Windows上でだけ動かすものを作るために考えた結果という認識でお願いします。

なるほど。
まあ、Windowsといっても、例えばCPUがARMのモバイル環境もあるわけで、そういった場合は当然事情が異なりますね。

> 重要なのはそのような常識は変わりうる、という事を意識しておくことと思い、 

これはそのとおりですね。
ひとついえることは、あの書籍は標準化以前のCを対象にしているということです。
その場合、floatであってもdoubleに変換してから演算するのは言語仕様でしたので、あのような記述になっています。
ですので、単純に常識が時代とともに変化するというのとは、ちょっと違います。

> 最終段階で必要に迫られたとき以外は、そのような最適化はしません。 
> 当然、その時は実測しながらです。 

これは状況次第かもしれません。
最終的な最適化で済むのはアプリケーションの場合だけですので、ライブラリなどでは最適化のタイミングも変わります。
あと、環境によっては、floatとdoubleを混在させると遅い場合もあるので、実際に最適化するかどうかはともかく、事前に知っておくことは悪くないと思います。



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

Name: たいちう  ..比類無きプログラマー(91,289ポイント)   Date: 2010/06/03(木) 10:53   No:53438     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
Libraさん
> 実際計測して、今まで覚えてたものと違ってびっくりしてます。

コンパイラやコンパイルオプションを教えてください。
今、PCに負荷をかけていて測定できませんので、
私も後ほど追試したいと思います。

ソースコードを見る限りだと、最適化がどこまで効いているかですね。
sumもsum3も参照されないので、コンパイラが十分賢ければ、
ループ自体がなくなるはずです。

測定結果に最適化の程度が影響を与えている可能性がありますが、
もしも自分の使うコンパイラがfloatの最適化の方が
得意だという結論だとしても、意義のある測定結果ですね。


たかぎさん
> 最終的な最適化で済むのはアプリケーションの場合だけですので、
> ライブラリなどでは最適化のタイミングも変わります。

なるほど、作成時に使用状況が分からない場合もありますね。
一般のアプリケーションも、客先等でどのような使われ方を
されるか分かりませんが、ライブラリよりはまだ予想しやすいですね。


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

Name: たかぎ [URL]  ..ハッカー(198,503ポイント)   Date: 2010/06/03(木) 10:56   No:53439     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> Libraさん

> sumの型をfloatとdoubleに変えて計測したところ、 
> floatが7437ms、doubleが12719msでした。 
> 10回程計測しましたが、大体floatが7秒、doubleが12秒でした。 

Intel Macでも似たような結果になりました。
# 最適化すると、ループ自体がなくなってしまうのですが...

時間のあるときに、コンパイル結果を見て解析してみたいと思います。


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

Name: シエル  ..かけだし(1,372ポイント)   Date: 2010/06/03(木) 10:56   No:53440     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
初めはfloatのほうがdoubleより高速だと思ってましたが、
何かの本でfloatはdoubleに変換されてから処理されるというような事が
書いてあったので、それからはdoubleの方が高速だと勝手に思ってます。

CPU等の話になるとついていけない。。。
自分の知識不足を思い知らされる。。。


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

Name: たかぎ [URL]  ..ハッカー(198,525ポイント)   Date: 2010/06/03(木) 10:58   No:53441     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> シエルさん

> 何かの本でfloatはdoubleに変換されてから処理されるというような事が 
> 書いてあったので、それからはdoubleの方が高速だと勝手に思ってます。 

たぶん↓ですね。
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html 


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

Name: fr  ..ぴよぴよ(47ポイント)   Date: 2010/06/03(木) 11:53   No:53450     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
ちょっと関係ない話かもしれませんがDirectXではfloat型に最適化されていて速いみたいなことを聞きました

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

Name: たかぎ [URL]  ..ハッカー(198,593ポイント)   Date: 2010/06/03(木) 11:58   No:53451     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> frさん

> ちょっと関係ない話かもしれませんがDirectXではfloat型に最適化されていて速いみたいなことを聞きました

DirectX内部ではそうでも、それ以外のところでは影響を受けないのでは?


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

Name: 山崎  ..熟練のプログラマー(41,855ポイント)   Date: 2010/06/03(木) 12:51   No:53458     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
うっ、floatの方が速いのではないのですかっ!?

今までずっと、あまり高い精度が必要でない少数はfloatにするように心がけてました(汗)。
まぁ、速さよりもメモリの節約が主な目的でfloatを積極的に使っていました。
サイズが小さいからdoubleよりはfloatの方が処理が遅いことはまぁ無いだろうと
漠然を思っていましたが、必ずしもそうではないのですね…。

今は潤沢にメモリがある時代なんで、メモリ節約よりも処理速度向上を選んだほうが
いいかもしれないですね…。特にゲーム作りなどにおきましては。

しかし議論を拝見していますと、floatもdoubleも処理速度に大きな違いは無かったり、
floatの方が速い、という意見もあるようですね。

結局のところ、小数を全てdoubleで扱ったからといって、
多くの場合で効果的な高速化ができる、というわけではないのでしょうか。


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

Name: たかぎ [URL]  ..ハッカー(198,723ポイント)   Date: 2010/06/03(木) 13:00   No:53459     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> 山崎さん

> うっ、floatの方が速いのではないのですかっ!? 

そうとはいっていません。
ご意見をうかがっているだけです。

> サイズが小さいからdoubleよりはfloatの方が処理が遅いことはまぁ無いだろうと 
> 漠然を思っていましたが、必ずしもそうではないのですね…。 

では、floatの方が速いとお考えなのですね。

> 今は潤沢にメモリがある時代なんで、メモリ節約よりも処理速度向上を選んだほうが 
> いいかもしれないですね…。特にゲーム作りなどにおきましては。 

潤沢にメモリがあるのは特定のプラットフォームだけです。


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

Name: Dixq (管理人)  ..ウィザード(1,197,675ポイント)   Date: 2010/06/03(木) 13:48   No:53464     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
仕事や趣味でマイコンとか組み込みとかされてる人にはまだまだメモリは貴重な存在ですよね

そういう話で言えばうちの製品ではハードウェアで浮動小数が計算出来ないのでdoubleの方がむちゃくちゃ遅いです。とにかく浮動小数を使わずに実装しようと試みてます。


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

Name: たかぎ [URL]  ..ハッカー(198,833ポイント)   Date: 2010/06/03(木) 14:21   No:53466     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
> 仕事や趣味でマイコンとか組み込みとかされてる人にはまだまだメモリは貴重な存在ですよね 

そうですね。
メモリサイズの制約が大きい環境では、メモリの使用量を気にせずに設計やコーディングを行うというのは、程度にもよりますが、時期尚早な不最適化になってしまいます、


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

Name: たかぎ [URL]  ..ハッカー(198,994ポイント)   Date: 2010/06/03(木) 15:13   No:53468     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
メモリサイズについて、もう一言。

実行速度に関しては、ボトルネックなる部分というのはごく一部です。
けれども、サイズを肥大化に関しては、そのコードやデータの利用頻度がどんなに低くても、存在するだけで平等に責任があります。
だからこそ、明らかにfloatの精度で済むところをdoubleにするのは、オブジェクトの数が十分少ない場合を除けば、時期尚早な不最適化になりますね。


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

Name: たかぎ [URL]  ..ハッカー(199,360ポイント)   Date: 2010/06/03(木) 16:36   No:53473     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
Libraさんのコードを少し修正して乗算で試してみると、今度は逆にdoubleのほうがfloatより40%ぐらい速くなっています。
まだざっくりとしか調べていないのと、IA-32は必ずしも得意ではないのとで、原因がはっきりわかっていません。
mulssとmulsdの各命令を比べれば、データシート上はmulss(つまりfloatのほう)がレイテンシもスループットも同じかよいので、なぜこのような結果になるのかわかりません。


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

Name: softya [URL]  ..ハッカー(174,254ポイント)   Date: 2010/06/03(木) 17:32   No:53474     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>mulssとmulsdの各命令を比べれば、データシート上はmulss(つまりfloatのほう)がレイテンシもスループットも同じかよいので、なぜこのような結果になるのかわかりません。

パイプライン上ので動作が違うのかもしれません。

CPUやFPU搭載・性能やコンパイラなどによって違うので、実測値や実装コードを確認するようにしています。
少なくともFPU非搭載ならコンパイラ無関係にfloatの方が早いと思っています(実測しますが)。最近のx86系だと浮動小数点で速度的にシビアなコードを書いていないのですが、doubleの方が早い印象があります。

と言う事で実測してみました。CPUが変われば結果も違うと思います。
OS:Windows7(64bit)
開発環境:VisualStudio2005Standard(x86でReleaseビルド)
CPU:AMD Athlon II X4 630 Processor 2.8GHz

---------------------------------------------
        ループ100000000回 テスト10回 平均
---------------------------------------------

-- 加算 -------------------------------------------
float ave(加算):550ms
double ave(加算):236ms
int ave(加算):73ms
long long int ave(加算):264ms
-- 減算 -------------------------------------------
float ave(減算):548ms
double ave(減算):229ms
int ave(減算):73ms
long long int ave(減算):262ms
-- 除算 -------------------------------------------
float ave(除算):1137ms
double ave(除算):842ms
int ave(除算):959ms
long long int ave(除算):2084ms
-- 乗算 -------------------------------------------
float ave(乗算):541ms
double ave(乗算):237ms
int ave(乗算):110ms
long long int ave(乗算):528ms
---------------------------------------------


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

Name: softya [URL]  ..ハッカー(177,032ポイント)   Date: 2010/06/03(木) 17:38   No:53476     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
cinしているデータは添付します。

下記は、計測のコードです。
Libraさんのコードをベースに最適化がなるべく掛からない様に無理やり工夫してあります。
C++とC言語の書き方の混在はご容赦ください。

#include <iostream>
using namespace std; 
#include <stdio.h>
#include <time.h>


enum {
    MODE_ADD,
    MODE_SUB,
    MODE_DIV,
    MODE_MUL,
    
    MODE_MAX,
};

char *mode_type[] = {
    "加算",
    "減算",
    "除算",
    "乗算",
};

template<class T> int CalcTmp(char*name,T &value,int loop,int mode)
{
    int timer;
    T val2[2];
    
    cin >> val2[0] >> val2[1];
    cout << "計算値:" << val2[0] << ":" << val2[1] << " ";
    
    timer = clock();
    switch(mode) {
    case MODE_ADD:
        value = (T)0;
        for(int i=0;i<loop;i++){
            value += val2[i&1];
        }
        break;
    
    case MODE_SUB:
        value = (T)0;
        for(int i=0;i<loop;i++){
            value -= val2[i&1];
        }
        break;
    
    case MODE_DIV:
        value = (T)1;
        for(int i=0;i<loop;i++){
            value /= val2[i&1];
        }
        break;
    
    case MODE_MUL:
        value = (T)1;
        for(int i=0;i<loop;i++){
            value *= val2[i&1];
        }
        break;
    }
    
    int times = (clock()-timer)  * 1000 / CLOCKS_PER_SEC;
    cout << "結果:" << value;
    printf(" %s(%s) (%d)loops time:%dms\n",name,mode_type[mode],loop,times);
    
    return times;
}

int main(void)
{
    int TestCount;
    int LoopCount;
    
    int avetime[4][MODE_MAX] = {{0}};
    float  fval;
    double  dval;
    int   ival;
    long long int  lval;
    
    cin >> TestCount;
    cin >> LoopCount;
    
    printf("テスト回数 %d回 ループ回数 %d回\n",TestCount,LoopCount);
    printf("-----------------------------\n");
    printf("float size: %dbyte\n",sizeof(fval));
    printf("double size: %dbyte\n",sizeof(dval));
    printf("int size: %dbyte\n",sizeof(ival));
    printf("long long int size: %dbyte\n",sizeof(lval));
    printf("-----------------------------\n");
    printf("\n");
    
    for( int test=0 ; test<TestCount ; test++ ) {
        printf( "----- test No.%d ----------------------------------------\n",test+1);
        for( int mode=MODE_ADD ; mode<=MODE_MUL ; mode++ ) {
            printf( "-- %s -------------------------------------------\n", mode_type[mode] );
            avetime[0][mode] += CalcTmp("float",fval,LoopCount,mode);
            avetime[1][mode] += CalcTmp("double",dval,LoopCount,mode);
            avetime[2][mode] += CalcTmp("int",ival,LoopCount,mode);
            avetime[3][mode] += CalcTmp("long long int",lval,LoopCount,mode);
        }
    }
    
    printf( "\n" );
    printf( "\n" );
    printf( "---------------------------------------------\n" );
    printf( "    ループ%d回 テスト%d回 平均\n",LoopCount,TestCount );
    printf( "---------------------------------------------\n" );
    printf( "\n" );
    for( int mode=MODE_ADD ; mode<=MODE_MUL ; mode++ ) {
        printf( "-- %s -------------------------------------------\n", mode_type[mode] );
        printf( "float ave(%s):%dms\n", mode_type[mode], avetime[0][mode] / TestCount );
        printf( "double ave(%s):%dms\n", mode_type[mode], avetime[1][mode] / TestCount );
        printf( "int ave(%s):%dms\n", mode_type[mode], avetime[2][mode] / TestCount );
        printf( "long long int ave(%s):%dms\n", mode_type[mode], avetime[3][mode] / TestCount );
    }
    printf( "---------------------------------------------\n" );
    
    return 0;
}


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

Name: Justy  ..伝説なるハッカー(538,131ポイント)   Date: 2010/06/03(木) 17:45   No:53477     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>今度は逆にdoubleのほうがfloatより40%ぐらい速くなっています

 普通の四則演算の場合で、Visual C++だとコンパイルオプションによって
変わってきそうです。


/fp (浮動小数点の動作の指定) (C++)
ttp://msdn.microsoft.com/ja-jp/library/e7s85ffb(VS.80).aspx

・ /fp:fast
 floatも doubleも連続して演算するのでほとんど差はないと思います。

・ /fp:precise
 float型の演算をするとき1回計算する度にメモリにストア、再利用するときに
メモリからロードするコードを吐くのでその分遅くなりそうです。

・ /fp:strict
 floatと doubleどちらもメモリにロード・ストアするので /fp:fastより遅いですが、
それほど大きな差はないと思います。


 あと /archの方も影響があるかもしれません。

/arch (最小限の CPU アーキテクチャ)
http://msdn.microsoft.com/ja-jp/library/7t5yh4fd.aspx


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

Name: softya [URL]  ..ハッカー(177,191ポイント)   Date: 2010/06/03(木) 17:50   No:53479     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
みなさんも興味があると思うので、ついでに64bitモードです。
OS:Windows7(64bit)
開発環境:VisualStudio2005Standard(x64でReleaseビルド)
CPU:AMD Athlon II X4 630 Processor 2.8GHz 

恐ろしいほどx86と違う結果に。
予想通り long long intが速くなりますね。
あと、doubleとfloatの差が誤差範囲の差しか無くなります(除算除く)。
---------------------------------------------
        ループ100000000回 テスト10回 平均
---------------------------------------------

-- 加算 -------------------------------------------
float ave(加算):148ms
double ave(加算):147ms
int ave(加算):110ms
long long int ave(加算):111ms
-- 減算 -------------------------------------------
float ave(減算):147ms
double ave(減算):151ms
int ave(減算):81ms
long long int ave(減算):76ms
-- 除算 -------------------------------------------
float ave(除算):588ms
double ave(除算):741ms
int ave(除算):999ms
long long int ave(除算):998ms
-- 乗算 -------------------------------------------
float ave(乗算):146ms
double ave(乗算):164ms
int ave(乗算):151ms
long long int ave(乗算):147ms
---------------------------------------------


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

Name: たいちう  ..比類無きプログラマー(91,882ポイント)   Date: 2010/06/03(木) 17:57   No:53482     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
softyaさんのテスト結果についてですが、
処理時間がdouble < floatなのは予想通りですが、
除算についてわずかといえどdouble < intなのは意外でした。

ちなみに、sizeof(int) = sizeof(double) = 8ですよね?


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

Name: softya [URL]  ..ハッカー(177,330ポイント)   Date: 2010/06/03(木) 18:02   No:53483     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>ちなみに、 sizeof(int) = sizeof(double) = 8ですよね?

いえ、x64モードでコンパイルしてもintは4バイトです。
たしか、マイクロソフトのサイトの何処かに書いてあったと思います。

-----------------------------
float size: 4byte
double size: 8byte
int size: 4byte
long long int size: 8byte
-----------------------------

アセンブルコードも添付します。
コンパイルオプションは特にいじっていません。  編集済み


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

Name: たかぎ [URL]  ..ハッカー(199,418ポイント)   Date: 2010/06/03(木) 18:33   No:53488     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
みなさん、情報ありがとうございます。

doubleの方が圧倒的に速いのはAMDの特徴でしょうかね。
私はまだMac上のGCC(32bitと64bit)でしか試していないのですが、CPUの種類によってかなりバラつくことは確かなようですね。


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

Name: たかぎ [URL]  ..ハッカー(199,530ポイント)   Date: 2010/06/03(木) 19:09   No:53491     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
softyaさんが計測に使ったコードですが、32bit版のコンパイル結果を見ると、intの場合はループ2周分を開いているのに対して、floatやdoubleの場合はループ4周分を開いているように見えます。
ざっとしか見ていないので見間違いや勘違いがあるかもしれませんが、ちょっと計測方法に公正さを欠くかもしれません。


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

Name: softya [URL]  ..ハッカー(177,752ポイント)   Date: 2010/06/03(木) 19:24   No:53493     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
>softyaさんが計測に使ったコードですが、32bit版のコンパイル結果を見ると、intの場合はループ2周分を開いているのに対して、floatやdoubleの場合はループ4周分を開いているように見えます。 

あっ、そう見えますね。
うーん。まだ甘かったか。すごいぞ最適化。
もう少し、最適化と格闘してみます。


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

Name: たかぎ [URL]  ..ハッカー(199,673ポイント)   Date: 2010/06/04(金) 13:52   No:53529 解決!     
Title: Re:【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか?    
まだ若干議論中の内容も残っていますが、過去ログに落ちてしまいそうなのでいったん解決にしておきます。
必要に応じて、改めて新スレッドを立てます(誰か立ててくださってもいいです)。


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



Name: 山崎  ..熟練のプログラマー(42,365ポイント)   Date: 2010/06/04(金) 12:09   No:53523       
Title: NetWorkRecv()で受信した文字列の末尾が"フフフフ"になる    
いつもお世話になっております、山崎です。
今回は、NetWorkRecv()でバッファから取り出した文字列が
"フフフフフフフフ"
になってしまう件について伺いに参りました。

OSはXP、DXライブラリにVisualStudio2010を使っております。

ただ今通信部分を作っております。デバッグモードで作業しています。
通信のテストとして、接続相手に毎フレーム データを送信しあう、
というプログラムを作っています。
毎フレームでカウンタの値を+1し、その値を文字列として送信します。

しかしその受信したデータを表示すると、
受け取ったデータの先頭にはきちんと相手から送られたカウンタの値があるのですが、
それ以降が"フフフフフフ..."となってしまいます。
送信したデータは、"フフフフフフ..."となっていません。
以下が、そのデータの受信と送信を担う部分のコードです。
なお、接続する側もされる側も、以下のコードで動いております。

//データを受信して、その文字列の先頭を指すポインタを返す
char* CommunicationManager::GetReceiveData(int HandleListIndex)
{
    char Buffer[256];
    int DataLength=GetNetWorkDataLength(NetHandleList[HandleListIndex]);
    NetWorkRecv(NetHandleList[HandleListIndex],Buffer,DataLength);
    
    printfDx("受信データ表示 ReceiveData= [%s]\n",Buffer);

    return Buffer;
}

//データを送信する
void CommunicationManager::SendData(char* Data,int HandleListIndex)
{
    NetWorkSend(NetHandleList[HandleListIndex],Data,strlen(Data));
    printfDx("送信データ表示 Data= [%s]\n",Data);
}

//この関数を毎フレーム実行する
void CommunicationManager::CommunicationManagerMain()
{

    char SendDataTemp[256];
    sprintf(SendDataTemp,"%d",ServerTime);
    SendData(SendDataTemp,0);

    char* ReceiveData=GetReceiveData(0);

    ServerTime++;
    if(SERVER_COUNT_MAX<=ServerTime)
        ServerTime=0;
}


ブレークポイントで処理を中断して、受信したデータを見てみると、
送信したときにはあったはずの終端文字が受信したデータには無くなっているようでした。
NetWorkRecv()で受信した文字列からは自動で終端文字が無くなる、という仕様ではないですよね…?

どのようにすれば
受信した文字列の末尾に"フフフフフフフ"がないデータを受け取れるのでしょうか。


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


Name: つうこうにん  ..かけだし(1,926ポイント)   Date: 2010/06/04(金) 12:37   No:53524     
Title: Re:NetWorkRecv()で受信した文字列の末尾が    
NetWorkSend(NetHandleList[HandleListIndex],Data,strlen(Data));

ここの最後の引数はバイト数だとすれば
strlen(Data)+1
じゃないでしょうか


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

Name: 山崎  ..熟練のプログラマー(42,308ポイント)   Date: 2010/06/04(金) 12:41   No:53525 解決!     
Title: Re:NetWorkRecv()で受信した文字列の末尾が    
つうこうにん様
strlen(Data)+1 にしたところ、一瞬にして解決いたしました。
どうもありがとうございました。

…こんなことに気づかなかったなんてお恥ずかしい限りです。
まだまだ精進せねば…。


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



Name: たろう  ..上級者(22,214ポイント)   Date: 2010/06/04(金) 11:41   No:53522       
Title: DESについて    
DES一つ気になったのですが、本で、鍵のサイズは56ビット(規格上は64ビット)とのっていたのですが、 
これはサブキーが56ビットと解釈していいのでしょうか?またなぜ、64ビット中左の32ビットとサブ 
キー(56ビット(63ビット))でラウンド関数で計算してそれと右とで排他的論理輪で暗号化するのに、56ビット(64ビット)必要なのでしょうか?


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




Name: たろう  ..上級者(21,693ポイント)   Date: 2010/06/03(木) 22:56   No:53506       
Title: トリプルDESについて    
トリプルDESについて聞きたいのですが、暗号(1つめの鍵)=>復号(2つめの鍵)=>暗号(3つめの鍵)という流れはわかったのですが、
この復号は平文にすると言うことでよろしいのでしょうか?
また復号は平文にするという場合、どうやって、暗号化したやつから複合化するやつ(2つ目の鍵)を求めることができるのでしょうか?


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


Name: sizuma [URL]  ..熟練のプログラマー(40,342ポイント)   Date: 2010/06/03(木) 23:13   No:53508     
Title: Re:トリプルDESについて    
DESがどんな暗号化アルゴリズムをしていたか忘れましたが、3つの鍵はすべて別々ですよね。
平文とは暗号化される前の入力文のことを指します。

仮に、

入力前:あいうえお
↓鍵1で暗号化
入力後:えいうあお

となったならば、

入力前:えいうあお
↓鍵1で復号化
入力後:あいうえお

としなくてはいけません。
鍵2で復号処理をしても元には戻りません。
ここまではオッケーですかね?


なんで暗号化→暗号化→暗号化じゃなくて、
暗号化→復号→暗号化
ってしてるのかは、忘れました。
暗号化アルゴリズムが、繰り返すと強度が落ちるんだとは思うんですが。一周回って戻ってくるみたいな?
前のトピックでsofutoyaさんが紹介されてた本を読んだ後は分かってた気がするんで、読んでみてください。
分かりやすくて僕はおもしろいと感じました。 編集済み


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

Name: たいちう  ..比類無きプログラマー(92,293ポイント)   Date: 2010/06/03(木) 23:30   No:53510     
Title: Re:トリプルDESについて    
私もアリスを読んだ後は理解していたようなんだけど、図書館で借りた本だしな。
買おうかな。とりあえず調べてみました。

http://www.sophia-it.com/content/%E3%83%88%E3%83%AA%E3%83%97%E3%83%ABDES
2回の暗号化では、暗号強度が逆に弱まることが証明されている。

http://e-words.jp/w/Triple20DES.html
第2段階を復号とすることによって、3つの鍵をすべて同一にした場合にDESと同じ結果が得られるようになっている。

http://en.wikipedia.org/wiki/Triple_DES
In each case the middle operation is the reverse of the first and last.
This improves the strength of the algorithm when using keying option 2,
and provides backward compatibility with DES with keying option 3.

テキトーに意訳してみると、
Key1 = Key2 = Key3 の場合は、DESと一緒。後方互換性。
Key1 = Key3 != Key2 の場合は、鍵2つでDESよりも強くなる。


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

Name: たろう  ..上級者(21,893ポイント)   Date: 2010/06/03(木) 23:31   No:53511     
Title: Re:トリプルDESについて    
回答ありがとうございます。
復号化=平文というわけではないのですね。
わかりました。
と言うことは、二つ目の鍵は自分で考えても良いと言うことでしょうか?
それとなぜ暗号→復号→暗号なのでしょうか?わかるかたいらしたら説明よろしくお願いします。


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

Name: たろう  ..上級者(21,981ポイント)   Date: 2010/06/03(木) 23:54   No:53512 解決!     
Title: Re:トリプルDESについて    
たいちうさん回答ありがとうございます。
softyaさんの参考の本は明日図書館で借りてくる予定です。
サイト参考にさせていただきました。
納得しました。
ありがとうございました。


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

Name: たろう  ..上級者(22,098ポイント)   Date: 2010/06/04(金) 01:20   No:53515     
Title: Re:トリプルDESについて    
すみません。DES一つ気になったのですが、あるサイトで、鍵のサイズは56ビットとのっていたのですが、
これはサブキーが56ビットと解釈していいのでしょうか?またなぜ、64ビット中左の32ビットサブ
キーと右とで暗号化するのに、56ビット必要なのでしょうか?


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



Name: 深黒  ..かけだし(1,753ポイント)   Date: 2010/06/02(水) 20:42   No:53337       
Title: プロセスに残ってしまう・・・    
DxLib_End() ;って

#include "DxLib.h"

int draw();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if( DxLib_Init() == -1 ) return -1; 

    draw();

    WaitKey() ; 
    DxLib_End() ;
    return 0 ;
}
int draw(){
    色々処理
    DxLib_End() ;
    return 0 ;

}
といった感じにプロトタイプ関数(でしたっけ?)中に入れて正常に終了できますか?
タスクマネージャーのプロセスにずっと残ってしまう事があるので・・・ 編集済み


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


Name: ookami  ..上級者(18,326ポイント)   Date: 2010/06/02(水) 23:05   No:53366     
Title: Re:プロセスに残ってしまう・・・    
その前にdrawという名前の関数でDxLib_Endする必要はあるのでしょうか?よかったらソース全てを貼ってもらっていいですか?

ちなみにDxLib_Endは(というか何でもそうですが)main関数で呼ぶか別の関数で呼ぶかで、本質的な違いはありません。どんなタイミングで呼ぶかが重要です。


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

Name: 深黒  ..かけだし(1,913ポイント)   Date: 2010/06/03(木) 00:35   No:53382     
Title: Re:プロセスに残ってしまう・・・    
drawは一応代用でやっただけです・・・
int victory(){
    if(p1w>p2w||p1w==p2w&&p1p>p2p){
        DrawString(0,0,"貴方の勝ちです",White);
        WaitTimer(2000);
    }
    else if(p1w!=p2w||p1p!=p2p){
        DrawString(0,0,"相手の勝ちです", White);
        WaitTimer(2000);
    }
    else{
        DrawString(0,0,"引き分けです",White);
        WaitTimer(2000);
    }
    DxLib_End() ;     // DXライブラリ使用の終了処理
    return 0;
}

これだとプロセスに残ったままの終わり方をしてしまうので、前の書き込みのdrawのプロトタイプ関数の後にDxLib_End() ;とreturn 0;を書いて終わらせています


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

Name: ookami  ..上級者(18,464ポイント)   Date: 2010/06/03(木) 07:42   No:53408     
Title: Re:プロセスに残ってしまう・・・    
まぁdrawでも代用でも、main関数で初期化したものはできるだけmain関数で解放するのが、後々混乱しなくていいんじゃないかな、という程度の事です。

貼ってもらったvictory関数だけではプロセスが残るかどうかわかりませんが、最初のと合わせて考えると、DxLib_Endの後でWaitKeyしているのが怪しい気はします。


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

Name: 深黒  ..かけだし(2,215ポイント)   Date: 2010/06/03(木) 19:26   No:53494     
Title: Re:プロセスに残ってしまう・・・    
こんな感じにしました
・・・が、やはりvictory内にDxLib_End() ;があるとプロセスに残りますね・・・
出来ればvictoryの処理で終了させたいです

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ 
    ChangeWindowMode(TRUE); // ウインドウモードに変更 
    SetGraphMode(800,600,32);
    if( DxLib_Init()==-1) return -1
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
        if(deck==0){
            victory();
            DxLib_End() ;
            return 0;
        }
        色々処理
    }
    DxLib_End() ;
    return 0;
}
int victory(){ 
    if(p1w>p2w||p1w==p2w&&p1p>p2p){ 
        DrawString(0,0,"貴方の勝ちです",White); 
        WaitTimer(2000); 
    } 
    else if(p1w!=p2w||p1p!=p2p){ 
        DrawString(0,0,"相手の勝ちです", White); 
        WaitTimer(2000);
    }
    else{
        DrawString(0,0,"引き分けです",White); 
        WaitTimer(2000); 
    }
    return 0; 
}


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

Name: leaf  ..ぴよぴよ(56ポイント)   Date: 2010/06/03(木) 19:48   No:53495     
Title: Re:プロセスに残ってしまう・・・    
単純にEndが行われていないのでは?
whileの中に
        if(Key[ProcessMessage() == -1 ){
            break ;        // エラーが起きたらループを抜ける
        }
と書いてみて下さい。
Endはwhileの外だけに書いて下さい。


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

Name: 深黒  ..かけだし(2,236ポイント)   Date: 2010/06/04(金) 00:40   No:53513 解決!     
Title: Re:プロセスに残ってしまう・・・    
おー、どうやら出来たようです。
返信ありがとうございました


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



Name: Day-D  ..ぴよぴよ(3ポイント)   Date: 2010/06/03(木) 17:46   No:53478       
Title: 格闘ゲーム作りの参考になる本    
自分はプログラミング系のサークルに入っていて次に格闘ゲームを作ろうと思っています。
そこで格ゲーを作るにあたって参考になる本をおしえてもらえないでしょうか。

プログラミング歴は1年しかなく、加えほぼ個人制作のため完成するのかどうか疑わしいですが、出来る限り詳細なものを教えてもらえると嬉しいです。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,197,830ポイント)   Date: 2010/06/03(木) 17:51   No:53480     
Title: Re:格闘ゲーム作りの参考になる本    
格ゲーを作りたい人って結構いるわりに参考になるサイトもなければ本もあまり無いんですよね・・。
本はあまり知りませんが、ウェブには昔探しても見当たりませんでした。

まず、何で作るか、どんな仕様にするかを明確にした方が回答が集まりやすいと思います。
最低限

・2Dなのか3Dなのか
・使うライブラリは何なのか

は明確にした方が良いように思います。


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

Name: Day-D  ..ぴよぴよ(173ポイント)   Date: 2010/06/03(木) 18:07   No:53485     
Title: Re:格闘ゲーム作りの参考になる本    
>まず、何で作るか、どんな仕様にするかを明確にした方が回答が集まりやすいと思います。
仰る通りです。

とはいえそんな難しいものは作れる気がしませんし
・2D
・C++&DXライブラリ
です。

あと仕様ですか…何を説明すればよいのか…
基本的にそう奇をてらうつもりもないので一般的な格闘ゲームを思い浮かべていただければたぶん一致するのではないかと思うのですが…


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

Name: softya [URL]  ..ハッカー(177,376ポイント)   Date: 2010/06/03(木) 18:09   No:53486     
Title: Re:格闘ゲーム作りの参考になる本    
簡単なアクションゲームは作ることが出来ますか?
まず、そこが出来ないと格闘ゲームは作れませんので。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,198,033ポイント)   Date: 2010/06/03(木) 18:12   No:53487     
Title: Re:格闘ゲーム作りの参考になる本    
以前softyaさんがリンクを紹介されていた事があるのでそちら紹介します。
http://www.play21.jp/board/formz.cgi?action=res&resno=52890&page=&lognum=162&id=dixq&rln=52959

ウェブにも本にもあまり格ゲーで参考になりそうなものは私は見たことないので力になれないかもしれません。
ただDXライブラリならロジックなんて力づくで何とかなってしまいますし、
試行錯誤で作ってみる方が面白いかもしれませんよ。

私はとにかく思いついた順番からプログラムを書いて試行錯誤(して後で苦労)するタイプです^^;

今までにゲーム制作の経験はありますか?
DXライブラリでどう作ればいいか大体想像出来るようなレベルならtry and errorもありだと思いますよ。


もし経験が無ければ手始めにSTG位から始めた方がいいかもしれませんね。


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

Name: Day-D  ..ぴよぴよ(276ポイント)   Date: 2010/06/03(木) 18:34   No:53489     
Title: Re:格闘ゲーム作りの参考になる本    
>アクションゲーム
作ったことはありません…が作り方自体は分かりますし作れないということはない、と思います。多分。

>ゲーム制作の経験
パズルゲームを2作作ったことがあります。

>試行錯誤で作ってみる方が面白いかも
それしかないんでしょうかねぇ…本がないかググッても見たのですがほとんど引っかからず、でした。
流石に試行錯誤で作れるほどのスキルが自分にあるとは思えませんしそのレベルに達するまで他のゲームで腕を磨くしかないのかなぁ…


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

Name: softya [URL]  ..ハッカー(177,617ポイント)   Date: 2010/06/03(木) 18:43   No:53490     
Title: Re:格闘ゲーム作りの参考になる本    
アクションゲームとの違いは、
(1)技がコマンド式出る。
とりあえず、当面キーに技を割り振っちゃえばコマンド式である必要もありません。

(2)アニメーションが豊富。
コマンドで各々のアニメーションが再生されます。

(3)当たり判定が複雑。
四角か円の組み合わせで当たり判定します。専用ツールを用意した方が良いでしょう。

(4)敵がAIで攻撃してくる。
まぁ、最初は人対人で良いでしょう。

って処です。
あとはアクションゲームと根幹部分は同じです。
じっくり必要なことを一覧にまとめてみてください。
そして、自分が分からないのが何処かも考察してみてください。

>作ったことはありません…が作り方自体は分かりますし作れないということはない、と思います。多分。 
まず、何処のサンプルも見ずにDXライブラリのリファレンスだけで作って見ては?
作れるかどうかで、自分の理解度が分かると思います。


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

Name: Day-D  ..ぴよぴよ(290ポイント)   Date: 2010/06/03(木) 19:17   No:53492 解決!     
Title: Re:格闘ゲーム作りの参考になる本    
なるほど…参考にさせてもらいます。
とりあえずちょっとだけ試行錯誤してみようかと思います。

質問に答えていただきありがとうございました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,198,732ポイント)   Date: 2010/06/03(木) 22:25   No:53505     
Title: Re:格闘ゲーム作りの参考になる本    
STGは色んなゲームの基礎となる重要なゲームのように思います。

例えばマリオのファイヤーはシューティングの弾と同じ概念で実装出来ますよね。
ストリートファイターのハドウケンなんかも一緒に考えられますよね。

弾と自機とのあたり判定はマリオと敵との接触や格ゲーのあたり判定に使えるでしょう。

しかしアクションゲームはそれこそアクションがあるのでプログラムは複雑になりますし、
格ゲーはアクションプラス、複雑な当たり判定があるので更に難しくなると思います。
softyaさんと重複しますが、敵のAIを作るとなるとまた難しくなります。

そういう意味でも手始めにSTGを作る事お勧めします。
たかがSTGといっても作りこみ次第でいくらでも深いゲームになります。
弾幕について語り始めたら一晩j・・(ry


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



Name: たかぎ [URL]  ..ハッカー(194,590ポイント)   Date: 2010/06/02(水) 15:56   No:53273       
Title: 【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
ちょっと気になったので質問します。

NULLと0が同じ意味だと考えている人はどれぐらいいますか?

皆さんご自身のことや周りの人の状況など、何でもよいので情報をください。


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


Name: dic  ..熟練のプログラマー(69,233ポイント)   Date: 2010/06/02(水) 16:29   No:53279     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
#define NULL 0
ってなってるということを聞いたことがあるので
同じ意味だと思ってましたが・・・

環境などは覚えていないです


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

Name: たかぎ [URL]  ..ハッカー(194,916ポイント)   Date: 2010/06/02(水) 16:34   No:53281     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> dicさん

> #define NULL 0 
> ってなってるということを聞いたことがあるので 
> 同じ意味だと思ってましたが・・・

なるほど、情報ありがとうございます。


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

Name: sizuma [URL]  ..熟練のプログラマー(40,116ポイント)   Date: 2010/06/02(水) 16:34   No:53282     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
うちの学校はC言語習わないので、nullと0が同じ意味だと考えてる人はいないと思います。
javaしか習ってないと、nullはnullですからね。
僕はC言語を使って何か作ったことはないので、NULLと0の違いを考えることもないですね。
結構僕みたいに質問の意図も把握できない人は多いんじゃないかなって勝手に予測してます。

>雑談
もうすぐたかぎさんの本発売日ですね。
執筆お疲れさまでした!
アマゾンの紹介文見ると、僕でも読めそうな内容に感じるので、購入予定です^^
本屋で中身確かめてからにすると思いますが、内容楽しみにしてますね。

あ、僕は正誤表は間違いがなくてもWebにあってほしいです。
僕は読む前と、読んでておかしいなと感じたら正誤表を見に行くので・・・・


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

Name: ムンバ  ..熟練のプログラマー(55,295ポイント)   Date: 2010/06/02(水) 16:36   No:53283     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
こんにちは。

NULLは、メモリの0番地
と、私が呼んだ本か、何処かのサイトに書かれていた記憶が・・・。
どちらかは、忘れてしまいましたが。(汗


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

Name: シエル  ..かけだし(1,002ポイント)   Date: 2010/06/02(水) 16:40   No:53285     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
最近NULLにカーソルが当たって、0で定義されていることを初めて知りました(笑)
C言語暦一ヵ月半程度です。。


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

Name: たかぎ [URL]  ..ハッカー(195,161ポイント)   Date: 2010/06/02(水) 16:47   No:53286     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> sizumaさん

> うちの学校はC言語習わないので、nullと0が同じ意味だと考えてる人はいないと思います。 

なるほど、情報ありがとうございます。

> 結構僕みたいに質問の意図も把握できない人は多いんじゃないかなって勝手に予測してます。 

質問の意図ですか..
深い意味はありません。書いたとおりです。
得た情報の利用目的だけ補足しておきます。

1. 講師をやっている学校で、この話題になることがときどきあるので、世の中の状況を把握するための参考にしたい。
2. 現在執筆中の書籍で、この話題を取り上げるかどうか、取り上げるとすればどのような内容にするかの参考にしたい。

といったところです。

> アマゾンの紹介文見ると、僕でも読めそうな内容に感じるので、購入予定です^^ 
> 本屋で中身確かめてからにすると思いますが、内容楽しみにしてますね。 

ありがとうございます。

> あ、僕は正誤表は間違いがなくてもWebにあってほしいです。 

そうですね。発売日までに、訂正すべき内容がなくても空の状態で正誤表だけ作っておきます。


> ムンバさん

> NULLは、メモリの0番地 
> と、私が呼んだ本か、何処かのサイトに書かれていた記憶が・・・。 

なるほど,情報ありがとうございます。
どこのサイトか思い出せそうなら教えてください。

> シエルさん

> 最近NULLにカーソルが当たって、0で定義されていることを初めて知りました(笑) 

ということは、それまでNULLと0は別物と考えていたということでしょうか?


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

Name: toyo  ..熟練のプログラマー(47,557ポイント)   Date: 2010/06/02(水) 16:50   No:53287     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
NULLと0は使い分けてます
もっぱらVisual C++しか使ってないので
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
なのは知ってますが


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

Name: たかぎ [URL]  ..ハッカー(195,216ポイント)   Date: 2010/06/02(水) 16:52   No:53288     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> toyoさん

> NULLと0は使い分けてます 
> もっぱらVisual C++しか使ってないので 
> #ifdef __cplusplus 
> #define NULL    0 
> #else 
> #define NULL    ((void *)0) 
> なのは知ってますが 

確かにVisual C++ではこういう定義ですね。
では、C++では、NULLと0は同じことでしょうか? それでも使い分けますか?


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

Name: たいちう  ..比類無きプログラマー(90,064ポイント)   Date: 2010/06/02(水) 16:55   No:53289     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
C/C++言語歴:10年強

NULLと0が違うということは何度か読んだことはありますが、
詳細は忘れてしまっています。
デバッガで見てもNULLを代入されたポインタは0と表示されるし、
普段私の意識する範囲では0と同値です。
NULLが0でない処理系を使ったことはないし。
ポインタに0を代入したりすることはないですけど。


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

Name: たかぎ [URL]  ..ハッカー(195,269ポイント)   Date: 2010/06/02(水) 16:57   No:53290     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> たいちうさん

情報ありがとうございます。

> 普段私の意識する範囲では0と同値です。

では、次のような使い方はしますか?

char s[10];
memset(s, NULL, 10);

double x = NULL;


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

Name: toyo  ..熟練のプログラマー(47,579ポイント)   Date: 2010/06/02(水) 16:58   No:53291     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
一応NULLが0じゃない環境でも動くように書いてるつもりです


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

Name: たかぎ [URL]  ..ハッカー(195,284ポイント)   Date: 2010/06/02(水) 17:00   No:53292     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> 一応NULLが0じゃない環境でも動くように書いてるつもりです 

NULLが0ではないというのは、具体的にはどのようなケースを想定していますか?


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

Name: シエル  ..かけだし(1,086ポイント)   Date: 2010/06/02(水) 17:00   No:53293     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
>>ということは、それまでNULLと0は別物と考えていたということでしょうか?
そうです。
うまくいえませんが、「空っぽ」というまったく別の意味のものだと
思っていました。


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

Name: たかぎ [URL]  ..ハッカー(195,296ポイント)   Date: 2010/06/02(水) 17:01   No:53294     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> >>ということは、それまでNULLと0は別物と考えていたということでしょうか? 
> そうです。 
> うまくいえませんが、「空っぽ」というまったく別の意味のものだと 
> 思っていました。

よくわかりました。ありがとうございます。


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

Name: たいちう  ..比類無きプログラマー(89,908ポイント)   Date: 2010/06/02(水) 17:17   No:53297     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> では、次のような使い方はしますか?

> char s[10];
> memset(s, NULL, 10);

> double x = NULL; 

絶対無いです。それぞれ'\0'と0を使います。
char型を1バイトの整数として使う場合には0を代入します。
(ちなみに浮動小数点のために0.0等を使うようなこともしません。)

「ポインタに0を代入したりすることはないですけど。」
に含まれるのですが、使い分けをしています。
可読性が下がるし、メリットが見つかりません。

まとめるとこんな感じです
・厳密な定義では違うと知っているが詳細は覚えていない。
・値としては実質的に同じと認識している。
・コーディングスタイルとしては使い分けている。


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

Name: たかぎ [URL]  ..ハッカー(195,365ポイント)   Date: 2010/06/02(水) 17:22   No:53298     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> ・厳密な定義では違うと知っているが詳細は覚えていない。 
> ・値としては実質的に同じと認識している。 
> ・コーディングスタイルとしては使い分けている。

よくわかりました。
つまり、NULLと0は同じ意味(つまり互いに交換可能)ではないという認識ですね。


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

Name: ムンバ  ..熟練のプログラマー(55,351ポイント)   Date: 2010/06/02(水) 17:24   No:53299     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
>>どこのサイトか思い出せそうなら教えてください。 
 
 ttp://www2.netf.org/pointer3.html
 の、【NULL と ヌル文字】(↑このページの真ん中位)
 にあります。
 


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

Name: たかぎ [URL]  ..ハッカー(195,390ポイント)   Date: 2010/06/02(水) 17:32   No:53300     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
http://www2.netf.org/pointer3.html  (面倒なので、hを補いました)
> の、【NULL と ヌル文字】(↑このページの真ん中位) 
> にあります。 

なるほど。
NULLと0が同じ意味なのではなく、NULLと0番地が同じということですね。


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

Name: たかぎ [URL]  ..ハッカー(195,151ポイント)   Date: 2010/06/02(水) 17:33   No:53301     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
#define NULL 0

のように、NULLが0に定義されているから、両者は同じ意味だという人は実際多いですね。
(今回得た回答の中では、必ずしも多数はではないようですが...)

もし、そうだとすると、多くの処理系では、

#define SEEK_SET 0

と定義されていますので、SEEK_SETと0は同じ意味だということになります。
NULLと0が同じ意味で、SEEK_SETと0が同じ意味であれば、当然NULLとSEEK_SETは同じ意味でなければなりません。
結果として、

int *p = malloc(10*sizeof(int));
if (p != SEEK_SET)
    ...

とか

fseek(stream, 0L. NULL);

のような使い方も正しいことになるはずですが、どうなんでしょうね。


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

Name: ひよこ  ..比類無きプログラマー(83,769ポイント)   Date: 2010/06/02(水) 17:35   No:53302     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
私はNULL=0と考えてます。
ポインタなら0
数値でも0
と表すと思ってます。
Cくらいしか勉強してません。


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

Name: たかぎ [URL]  ..ハッカー(195,215ポイント)   Date: 2010/06/02(水) 17:38   No:53303     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> ひよこさん

ご意見ありがとうございます。

> 私はNULL=0と考えてます。 
> ポインタなら0 
> 数値でも0 
> と表すと思ってます。 

では、

char s[10];
memset(s, NULL, 10);

double x = NULL;

といった使い方は正しいという認識でよろしいでしょうか?


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

Name: ひよこ  ..比類無きプログラマー(84,564ポイント)   Date: 2010/06/02(水) 17:57   No:53305     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
char s[10]; 
memset(s, NULL, 10); 
>>sの配列の要素分0で初期化と読めます。
double x = NULL;
>>xを0で初期化してると読めると思います。

すみません、今思ったのですがNULLは
ポインタは0番地を指す(存在してない?)か指していないを表すフラグのような感じかもしれません。


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

Name: たかぎ [URL]  ..ハッカー(195,261ポイント)   Date: 2010/06/02(水) 18:00   No:53306     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> char s[10];  
> memset(s, NULL, 10);  
> >>sの配列の要素分0で初期化と読めます。 
> double x = NULL; 
> >>xを0で初期化してると読めると思います。 

処理系によってはそう振る舞うでしょうね。

> すみません、今思ったのですがNULLは 
> ポインタは0番地を指す(存在してない?)か指していないを表すフラグのような感じかもしれません。

フラグというのがよくわかりませんが、NULLは0番地をあらわすということでしょうか?


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

Name: lbfuvab  ..プログラマー(26,883ポイント)   Date: 2010/06/02(水) 18:08   No:53307     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
NULLはポインタ、0はただの即値なので同じ物とは考えてないです。


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

Name: たかぎ [URL]  ..ハッカー(195,329ポイント)   Date: 2010/06/02(水) 18:11   No:53308     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> lbfuvabさん

> NULLはポインタ、0はただの即値なので同じ物とは考えてないです。 

即値なので、というのがよくわからなかったのですが、

#define ZERO  0

というマクロを作るなどすれば、NULLとZEROは同じ意味になり得ますか?


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

Name: ひよこ  ..比類無きプログラマー(84,655ポイント)   Date: 2010/06/02(水) 18:26   No:53310     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
フラグというのがよくわかりませんが、NULLは0番地をあらわすということでしょうか? 

あんまり深く考えたことがないのですが、うまく説明できないのですが
もし0番地が使える処理系でも動くようにしたとしたら
deleteとかがNULLだったら削除しないということを考えると
NULL=指していない(無効)みたいな感じかもしれません。
結果的にNULL=0はポインタの場合0番地(無効空間)を表すのだと思います。


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

Name: たかぎ [URL]  ..ハッカー(195,543ポイント)   Date: 2010/06/02(水) 18:34   No:53312     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> もし0番地が使える処理系でも動くようにしたとしたら 
> deleteとかがNULLだったら削除しないということを考えると 
> NULL=指していない(無効)みたいな感じかもしれません。 
> 結果的にNULL=0はポインタの場合0番地(無効空間)を表すのだと思います。

だとすると、単なる数値にNULLを使うのはどういうことなのでしょうか?


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

Name: Tororo [URL]  ..初心者(7,059ポイント)   Date: 2010/06/02(水) 18:46   No:53313     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
0とは限らないとは呼んだ事がありますが、
基本的には0なのかなと考えていました。


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

Name: たかぎ [URL]  ..ハッカー(195,559ポイント)   Date: 2010/06/02(水) 18:48   No:53314     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> 0とは限らないとは呼んだ事がありますが、 
> 基本的には0なのかなと考えていました。 

わかりました。ありがとうございます。


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

Name: ひよこ  ..比類無きプログラマー(84,687ポイント)   Date: 2010/06/02(水) 18:48   No:53315     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
私は0と書くのでNULLは使いません。
ただ、NULLが0をあらわすだけなので見た目的にわかりやすくするためかもしれません。


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

Name: たかぎ [URL]  ..ハッカー(195,577ポイント)   Date: 2010/06/02(水) 18:49   No:53316     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> 私は0と書くのでNULLは使いません。 
> ただ、NULLが0をあらわすだけなので見た目的にわかりやすくするためかもしれません。

なるほど、そういうことですね。


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

Name: ideyan  ..初心者(5,552ポイント)   Date: 2010/06/02(水) 19:12   No:53320     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
NULLは空ポインタ定数:
値0をもつ整数定数式又はその定数式を型void*にキャストした式のこと

みたいな感じの記述をX3010で見たので、
#define NULL 0 とあったとしてもそれはポインタとして
何処も指していない状態を0としてるだけなんだと考えてそれっぽく使い分けてます。
基本的にポインタへの比較や代入でしかNULLは使ってないです(多分^^;)。

えーと、つまり、私はNULLと0は同じ意味だとは思ってないです。
C言語についてのみで、他の言語についてはよく知りません。


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

Name: たかぎ [URL]  ..ハッカー(195,627ポイント)   Date: 2010/06/02(水) 19:14   No:53321     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> ideyanさん

ご意見ありがとうございます。


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

Name: たかぎ [URL]  ..ハッカー(195,862ポイント)   Date: 2010/06/02(水) 19:24   No:53323     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
みなさん、ありがとうございます。
だいたい状況が見えてきました。

念のため確認しておきますが、今回の質問で問題にしているのは、NULLと0が同じ意味かどうかについてです。
空ポインタの内部表現がどうであるかは問題にしていません。
また、NULLの値が0かどうかも問題にしていません。
この点を勘違いされていそうな意見もあるようですので...


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

Name: ぽこ  ..中級者(12,596ポイント)   Date: 2010/06/02(水) 19:30   No:53324     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
遅まきながら。
私は↓のように考えています。

NULLと0は意味が全く異なる。
ただ、言語処理系はNULLと0は同じものであるかのように解釈する(評価するというべきか)。


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

Name: やんち [URL]  ..かけだし(1,506ポイント)   Date: 2010/06/02(水) 19:48   No:53327     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
C言語では、NULLは 0 であるとは限らない。
C++言語では、NULLは0として扱って良い。

と言う、認識です。


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

Name: たかぎ [URL]  ..ハッカー(195,885ポイント)   Date: 2010/06/02(水) 19:49   No:53328     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> ぽこさん

> NULLと0は意味が全く異なる。 
> ただ、言語処理系はNULLと0は同じものであるかのように解釈する(評価するというべきか)。

ご意見、ありがとうございます。
では、NULLを使うべきところに0を使うのはありだと思いますか?



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

Name: ぽこ  ..中級者(12,633ポイント)   Date: 2010/06/02(水) 19:52   No:53330     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> ご意見、ありがとうございます。
> では、NULLを使うべきところに0を使うのはありだと思いますか?

なし、です。
同じように解釈されるとはいえ、意味が異なるのでソースコードを
書く場合は明確に区別すべき、と考えています。


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

Name: たかぎ [URL]  ..ハッカー(195,989ポイント)   Date: 2010/06/02(水) 19:54   No:53331     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> > では、NULLを使うべきところに0を使うのはありだと思いますか? 
> なし、です。 
> 同じように解釈されるとはいえ、意味が異なるのでソースコードを 
> 書く場合は明確に区別すべき、と考えています。 

なるほど。
C++では伝統的に、NULLではなく空ポインタに0が使われてきましたが、それについてはいかがでしょうか?


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

Name: ぽこ  ..中級者(13,129ポイント)   Date: 2010/06/02(水) 21:35   No:53346     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> なるほど。
> C++では伝統的に、NULLではなく空ポインタに0が使われてきましたが、それについてはいかがでしょうか?

なんと答えれば良いか、なかなか良い表現が見つかりません。

私自身は伝統的な使われ方は「どうでもいい」という立ち位置です。
#伝統は、既存のコーディング規約の前では無力です。。
#コーディング規約の善し悪しは置いといて。

#C++ではNULLが0である事が保証されていましたっけ?
#(あるいはその逆が保証されていましたっけ?)
#型安全やマクロは悪って考えから、どちらかが保証されているとは思うのですが。
#すみません、勉強不足でこの辺分かりません。

C++では0には空ポインタって意味もあったとしても、「俺的コーディング規約」は
『C++ではNULLは「Cと同様」空ポインタって意味です、と覚えておけば、覚えるべきことがひとつ減る。だからC++でもNULLを使うのだ』
ってところですかねえ。

#「お前の知識不足、理解不足」だと言われれば「仰る通り」としか答えようが無いですね。。


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

Name: たかぎ [URL]  ..ハッカー(196,142ポイント)   Date: 2010/06/02(水) 21:49   No:53348     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> 私自身は伝統的な使われ方は「どうでもいい」という立ち位置です。 

それもひとつの考え方ですね。

> C++では0には空ポインタって意味もあったとしても、「俺的コーディング規約」は 
> 『C++ではNULLは「Cと同様」空ポインタって意味です、と覚えておけば、覚えるべきことがひとつ減る。だからC++でもNULLを使うのだ』 
> ってところですかねえ。

C++でNULLを使うこと自体は問題ありません。

> #C++ではNULLが0である事が保証されていましたっけ? 
> #(あるいはその逆が保証されていましたっけ?) 

処理系定義ですね。


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

Name: たかぎ [URL]  ..ハッカー(196,295ポイント)   Date: 2010/06/02(水) 21:54   No:53349     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
誤解を招きそうなので、少し補足しておきます。

> #C++ではNULLが0である事が保証されていましたっけ?  
> #(あるいはその逆が保証されていましたっけ?)  

CでもC++でも、NULLは空ポインタ定数に展開されるマクロです。
空ポインタ定数は...

Cでは、値がゼロの整数定数式か、それをvoid*でキャストしたものです。
C++では、値がゼロの汎整数定数式です。

規格に合致するかどうかはともかく、CでもC++でも、NULLを0に定義したのでは問題が生じることがあります。
例えば、intが16ビットでvoid*が32ビットの環境や、intが32ビットでvoid*が64ビットの環境では、単にNULLを0として定義すると...

printf("%p\n", NULL);

とした場合におかしくなります。
このような場合は、0Lや0LLに定義する必要があるのですが、必ずしもそうなっていない処理系がありますね。


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

Name: たかぎ [URL]  ..ハッカー(196,463ポイント)   Date: 2010/06/02(水) 23:07   No:53367     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> やんちさん

すみません。回答を見落としていました。

> C言語では、NULLは 0 であるとは限らない。 
> C++言語では、NULLは0として扱って良い。 

なるほど、CとC++では異なるということですね。
では、C++であれば、

char s[10];
std::memset(s, NULL, 10);

double x = NULL;

はありということでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,196,799ポイント)   Date: 2010/06/02(水) 23:14   No:53371     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
この件は何年か前からチョコチョコ掲示板でも話題になった事があったので知っているものの
0ではない処理系を見た事が無いので、普段意識していませんし
私が昔掲示板を見ていなければ知らなかったかも知れません。

同期に聞いてみたら何人が知ってるだろうかと想像すると知らない人はかなり多いと思います。

しかしよほどレアなコンパイラを使うような環境でなければ知らなくても問題ないような気もします・・。


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

Name: たかぎ [URL]  ..ハッカー(196,659ポイント)   Date: 2010/06/02(水) 23:20   No:53372     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> Dixqさん

No:53323で書いたように、内部表現の話ではありません。
単純にNULLと0が同じか、ということです。
つまり、++a と a += 1 のように、文脈を問わず、NULLと0は交換可能かということです(同じ意味ならどちらを使ってもよいはず)。

> しかしよほどレアなコンパイラを使うような環境でなければ知らなくても問題ないような気もします・・。

ですので、コンパイラは関係ありません。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,197,117ポイント)   Date: 2010/06/02(水) 23:53   No:53374     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
あぁすみません、全部読んでからコメントするべきでしたね;

Cを勉強し始めたころ、私の理解の順番としては

「NULLってポインタに付ける形式の0みたいなものなんだな」
↓数ヵ月後
「あれ?defineで0そのものなのか」

「いや0ポインタなのか」

「あれ、処理系によって違う?」

???

みたいな期間が長くあったように思います。
ポインタの代入や比較にしかNULLを使っているのを見た事が無かったので、
最初から0そのものと同義だとは思いませんでした。

これはちょっと聞いてみないとどれ位の人がどう解釈しているかわからないですねぇ。


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

Name: 組木紙織  ..比類無きプログラマー(86,460ポイント)   Date: 2010/06/02(水) 23:56   No:53375     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
遅くなりましたが、

私はNULLと0を別の意味と考えています。
しかしながら、if()の中では0をみなされるという認識です。
なぜなら以下のようなコードが時々見られるからです。
int * p;
/*中略*/
if(p)/*ポインタがNULL出なければ*/



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

Name: たかぎ [URL]  ..ハッカー(196,904ポイント)   Date: 2010/06/03(木) 00:11   No:53376     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> ポインタの代入や比較にしかNULLを使っているのを見た事が無かったので、 
> 最初から0そのものと同義だとは思いませんでした。 

結構まともなコードにしか触れていませんね。
今回も何度も例に出したような、

char s[10];
memset(s, NULL, 10);

double x = NULL;

のようなコード(とくに前者)は、割と普通に見かけますよ。
「memset NULL」で検索するだけでも、ウヨウヨ出てきます。

> これはちょっと聞いてみないとどれ位の人がどう解釈しているかわからないですねぇ。

今回、この問題を取り上げるべきかどうか迷ったのは、初心者叩きになるのが嫌だったからです。
うちのサイトのC/C++迷信集では、どちらかというと経験の浅い人たちに嘘を教えている人たちを叩いています。
ただ、ちょっと難しすぎるという批判もあり、レベルを下げようとすると、結果的に初心者〜初級者に矛先が向くことになります。
今回、いろいろな意見をいただいた感じでは、とりあえず取り上げた方がよさそうな気がしてきました。
どう表現するかは、また別の悩みがありますが...


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

Name: たかぎ [URL]  ..ハッカー(196,946ポイント)   Date: 2010/06/03(木) 00:13   No:53377     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
> 組木紙織さん

> 私はNULLと0を別の意味と考えています。 
> しかしながら、if()の中では0をみなされるという認識です。 

ifの条件式では「0とみなされる」というより「偽とみなされる」ということですよね。


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

Name: たかぎ [URL]  ..ハッカー(196,970ポイント)   Date: 2010/06/03(木) 00:13   No:53378 解決!     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
このあたりでいったん解決にしておきます。


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

Name: 組木紙織  ..比類無きプログラマー(86,522ポイント)   Date: 2010/06/03(木) 00:17   No:53380     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
>ifの条件式では「0とみなされる」というより「偽とみなされる」ということですよね。
結局はそうなるのかな。

if(NULL)

if(0)

if(false)
といった脳内変換をしています。



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

Name: ムンバ  ..熟練のプログラマー(57,425ポイント)   Date: 2010/06/03(木) 22:20   No:53504     
Title: Re:【雑談】 NULLと0が同じ意味だと考えている人はどれぐらいいますか?    
ちょっと、タイトルの趣旨とは違うかもしれませんし
マニアックな?サイトかもしれませんが・・・

NULLについて

http://www.geocities.jp/bleis_tift/cpp/null.html

↑C++の研究室?内のサイト内のページだと思います。
では、今度こそ、失礼しますっ!w



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



Name: たかぎ [URL]  ..ハッカー(194,695ポイント)   Date: 2010/06/02(水) 16:04   No:53274       
Title: 【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
連続質問失礼します。

sizeofを関数だと考えている人はどれぐらいいますか?

皆さんご自身のことや周りの人の状況など、何でもよいので情報をください。 
また、return, throw, typeidが関数だと考えている人についての情報もあわせて教えてください。


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


Name: たいちう  ..比類無きプログラマー(90,103ポイント)   Date: 2010/06/02(水) 18:15   No:53309     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
sizeofが関数じゃないと読んだのは、覚えたての頃でした。

returnを関数と思ったことはないですが、return(0);などはよく目にしますね。
その人たちは関数と思っている、というよりは、
どちらかというと何も考えていない人の方が多いと思います。
(あくまでも私の印象。以降も)

throwについてですが、例外を受け取るだけでなく、
投げる側のプログラムを書く人については、
関数と勘違いしている人は殆どいないと思います。

typeidは私は使いませんし、特に意識したこともなかったです。
他人の書いたtypeidを読んだ覚えもありません。
(入門書のような本で見かけていたとしても記憶に残っていない)


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

Name: たかぎ [URL]  ..ハッカー(195,538ポイント)   Date: 2010/06/02(水) 18:32   No:53311     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> たいちうさん

ご意見ありがとうございます。

Googleで「C言語 "sizeof関数"」を検索すると、多いとはいいませんが、それなりの数がヒットします。
ちなみに、「"sizeof関数"」だけだと、PHPに関する記述が大量にヒットするのであてになりません(PHPではsizeofは関数なので)。

> returnを関数と思ったことはないですが、return(0);などはよく目にしますね。 
> その人たちは関数と思っている、というよりは、 
> どちらかというと何も考えていない人の方が多いと思います。 

そうですね。
これについては、ずいぶん前に「returnのプロトタイプ宣言はどのヘッダにあるのですか?」という質問を受けたことがあります。
その質問をした人物は、そんなによくわかっているとはいいませんが、何も考えていないというほどひどくもなかった気がします。

> throwについてですが、例外を受け取るだけでなく、 
> 投げる側のプログラムを書く人については、 
> 関数と勘違いしている人は殆どいないと思います。 

sizeofやtypeidと違って、必ずオペランドに式を取りますので、throw(x)のように括弧を常に付ける人であれば、関数と誤解しそうなもんですが...
まあ、throwを使うのはそれなりにわかっているプログラマということかもしれませんね。

> typeidは私は使いませんし、特に意識したこともなかったです。 
> 他人の書いたtypeidを読んだ覚えもありません。 

確かにtypeidの遭遇頻度は少ないですね。
throw以上に、わかっている人しか使わないのかもしれません。


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

Name: Tororo [URL]  ..初心者(7,160ポイント)   Date: 2010/06/02(水) 18:51   No:53317     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
VC++ を使っていて、色の設定を変えてあるので
予約語?(int for)等は違う色になっているので、関数ではないと思っています。

関係ないかもしれませんが、return(0) と言うのは (0)を返しているのか、0を返しているのかが、
よく分かっていません。


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

Name: たかぎ [URL]  ..ハッカー(195,609ポイント)   Date: 2010/06/02(水) 18:54   No:53318     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> VC++ を使っていて、色の設定を変えてあるので 
> 予約語?(int for)等は違う色になっているので、関数ではないと思っています。 

確かにそういうこともありますね。

> 関係ないかもしれませんが、return(0) と言うのは (0)を返しているのか、0を返しているのかが、 
> よく分かっていません。

0と(0)は表記以外の違いはありませんね。


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

Name: たかぎ [URL]  ..ハッカー(195,691ポイント)   Date: 2010/06/02(水) 19:18   No:53322     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
そういえば、「苦しんで覚えるC言語」のようなサイトでも、下記では、「配列の要素数を知るには、sizeof関数を使用するのが簡単で確実です。」と記述していますね。
http://9cguide.appspot.com/22-01.html#S2


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

Name: ぽこ  ..中級者(12,600ポイント)   Date: 2010/06/02(水) 19:40   No:53325     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
私の周りにはいません(と思いたい!)。
#いたら矯正します。。


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

Name: たかぎ [URL]  ..ハッカー(195,903ポイント)   Date: 2010/06/02(水) 19:50   No:53329     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> 私の周りにはいません(と思いたい!)。 
> #いたら矯正します。。 

了解です。ありがとうございました。


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

Name: ムンバ  ..熟練のプログラマー(55,759ポイント)   Date: 2010/06/02(水) 22:34   No:53357     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
こんばんは!

私は今、勉強してる本の中に出てくる関数や演算子(配列)やキーワード?など
今まで勉強してきた復習も兼ねて、最初のページから出てきた順に
関数や演算子・配列やポインタや構造体などなどの例をあげながら
自分だけが見やすい様に、自分のページにまとめながら本の勉強を進めてます。
すぐ忘れちゃうから、こうしてます。(涙
ですので最近、こちらの掲示板で質問させて頂いた内容は
過去に読んだ本や、検索しまくったサイトで、自分なりにまとまりが付かず
こちらの掲示板でお聞きすれば、何とかまとまりが付くんじゃないかと・・・
甘えてるんですよね。こちらでお答え頂くと、自分の中でまとまりが付くんです。
何故か安心できるんですよね。^^
連投気味になってしまっておりますが、自分も必死ですのでご容赦お願い致します。

私が、リンク先のアドレスの頭の H を削除するのは(こちらのBBSは、見てる方が多いので)
リンク先のサイト(サーバー)に集中してアクセスされるのを防ぐためのみの理由からです。
でっ、たかぎさん。御忙しい所、また日記みたいになってしまい、ごめんなさい。(謝
------------------------------------------------------------------------------------

sizeof
 分類は、(自分では)今の所「演算子」と理解しています。
 参考サイト http://www.skpme.com/c/c_sizeof.shtml
   (↑こちらのサイト、サイト内の内容を引用する場合などは許可が必要との事です。)

return
 分類、調べるの忘れてました〜!今から調べまくります。
 return って、あるのが当たり前の様に使っていたので・・・。
 return については
 「関数の最終行に居て、値を返すやつ(奴)」としか思ってませんでした。^^;

throw, typeid につきましては、まだ勉強していませんので、すみません。


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

Name: たかぎ [URL]  ..ハッカー(196,380ポイント)   Date: 2010/06/02(水) 22:41   No:53359     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> 私が、リンク先のアドレスの頭の H を削除するのは(こちらのBBSは、見てる方が多いので) 
> リンク先のサイト(サーバー)に集中してアクセスされるのを防ぐためのみの理由からです。 

うちのサイトにここ経由で来る数を見る限り、大したことはありません。
OKWaveや知恵袋やWikipediaや2ちゃんねるからも来ますが、いずれも大したことはありません。
ですので、そんなに気を使う必要はありません。

> sizeof 
> 分類は、(自分では)今の所「演算子」と理解しています。 

了解です。
ほかについても調べてみてください。


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

Name: ムンバ  ..熟練のプログラマー(55,803ポイント)   Date: 2010/06/02(水) 22:46   No:53361     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
速っ!(爆

>>(略)ですので、そんなに気を使う必要はありません。
 了解しました!

 今から、return 行ってきま〜す!

---追記---
 上述、sizeofについて紹介させて頂いたサイト
 一部の引用でしたら、許可は必要なかったです。
 お詫びして、訂正させて頂きます。(謝

 編集済み


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

Name: シエル  ..かけだし(1,092ポイント)   Date: 2010/06/02(水) 22:50   No:53362     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
関数だと思ってました…

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

Name: たかぎ [URL]  ..ハッカー(196,406ポイント)   Date: 2010/06/02(水) 22:54   No:53363     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> シエルさん

> 関数だと思ってました…

こういう意見を待っていました(変な意味ではなく)。
ありがとうございます。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,196,604ポイント)   Date: 2010/06/02(水) 23:08   No:53368     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> こういう意見を待っていました

きっとここで10人中9人が「知っていた」と答えたとしても全体の9割が知っているだろうという推測は出来ないんでしょうねぇ。
・・なんてことは既に想定の範囲内でしょうけど。

なかなか「知っている」ことはアピール出来ても「知らない」ことをわざわざアピール出来ない場合が多いですもんね。
後、雑談トピに書きこむ人は普段の質問者より回答者の方が多い傾向にあることからも、偏っちゃいますね。
なのでシエルさんのようなコメントって有り難いですね。

私はというと、tororoさんの仰るようにVC++では青くなるので知っていた程度でしょうか。

最近VIエディタばかり使うのでこういう便利な機能が懐かしいです・・。


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

Name: たかぎ [URL]  ..ハッカー(196,564ポイント)   Date: 2010/06/02(水) 23:14   No:53370     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> Dixqさん

> きっとここで10人中9人が「知っていた」と答えたとしても全体の9割が知っているだろうという推測は出来ないんでしょうねぇ。

その通りです。

> なかなか「知っている」ことはアピール出来ても「知らない」ことをわざわざアピール出来ない場合が多いですもんね。 
> 後、雑談トピに書きこむ人は普段の質問者より回答者の方が多い傾向にあることからも、偏っちゃいますね。 
> なのでシエルさんのようなコメントって有り難いですね。 

そうなんですよ。
得られた結果をそのまま統計するのは愚の骨頂なのでもちろんやりませんが、どの程度のバイアスが掛かっているのか見極めるのはなかなか大変です。

> 私はというと、tororoさんの仰るようにVC++では青くなるので知っていた程度でしょうか。 

結構あの色分けに誘導されるもんなんですね。
だとすると、MSの独自拡張のキーワードと標準のキーワードの区別がつかなくなったりしませんか?

> 最近VIエディタばかり使うのでこういう便利な機能が懐かしいです・・。

色分けはともかく、インテリセンスに頼り切っていた人とかだと、viではコーディングできないでしょうね。


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

Name: あ〜る  ..上級者(19,489ポイント)   Date: 2010/06/03(木) 00:17   No:53379     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
恥ずかしさを抑えて書き込み書き込み
僕も関数だと思ってました・・・
()で囲ってるから標準で実装されてる関数だと思ってました。

あ、あと言い訳ですがどこかのサイトにも関数って書いてあった気が(ry


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

Name: たかぎ [URL]  ..ハッカー(197,149ポイント)   Date: 2010/06/03(木) 00:36   No:53383     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> あ〜るさん

> 恥ずかしさを抑えて書き込み書き込み

そんなに自虐的にならなくても...

> 僕も関数だと思ってました・・・
> ()で囲ってるから標準で実装されてる関数だと思ってました。

そう考える人は多いですね。
種明かしをすると、sizeofのオペランドを括弧で囲まなければならないのは型名の場合だけです。
つまり、

sizeof(int);  /* ← 括弧が必要 */

int a;
sizeof a;   /* ← 括弧は不要 */

ということになります。

> あ、あと言い訳ですがどこかのサイトにも関数って書いてあった気が(ry

例えば↓とか
http://support.microsoft.com/kb/60332/ja
本文はsizeof演算子なのに、なぜか見出しは「sizeof()関数」です。


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

Name: レッドリ  ..入門者(4,995ポイント)   Date: 2010/06/03(木) 00:40   No:53384     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
自分もsizeofは関数と思っていました。
演算子でしたか。
ZeroMemoryが関数なのでそこから勘違いしていたようです。


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

Name: たかぎ [URL]  ..ハッカー(197,178ポイント)   Date: 2010/06/03(木) 00:48   No:53385     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> レッドリさん

> ZeroMemoryが関数なのでそこから勘違いしていたようです。

すみません。sizeofとZeroMemoryがどう結びつくのかがわかりませんでした。



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

Name: Tororo [URL]  ..初心者(7,258ポイント)   Date: 2010/06/03(木) 12:27   No:53454     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
横槍ですが
レッドリsの言いたい事は、

struct A{
    int b;
    int c;
};
A test[10];
ZeroMemory(test, sizeof(A)*10);//初期化
          ↑こんな感じの事ですか?


違っていたらごめんなさい^^;


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

Name: レッドリ  ..初心者(5,000ポイント)   Date: 2010/06/03(木) 12:46   No:53457     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
そうです。

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

Name: たかぎ [URL]  ..ハッカー(198,749ポイント)   Date: 2010/06/03(木) 13:01   No:53460     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
> ZeroMemory(test, sizeof(A)*10);//初期化 
>           ↑こんな感じの事ですか? 

なるほど。
結論からすれば全然関係ないのですが、ここから類推したということですね。


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

Name: たかぎ [URL]  ..ハッカー(198,775ポイント)   Date: 2010/06/03(木) 13:02   No:53461 解決!     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
このあたりでいったん解決にしておきますが、何かありましたらよろしくお願いします。


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

Name: ムンバ  ..熟練のプログラマー(57,298ポイント)   Date: 2010/06/03(木) 21:55   No:53500     
Title: Re:【雑談】 sizeofを関数だと考えている人はどれぐらいいますか?    
こんばんは。
お返事、遅くなりました。

return
 呼び出しもとの関数にreturnの後ろの
 数値または変数の値を渡して関数を終了する文。

分類するとすると、if文やwhile文の様な「文」という事でした。
「猫でもわかるC言語・・・」内でも、return文と表現されていました。

---↓編集・追記---

書き忘れてました。
分岐文とか制御文(breakなど)と分類してるサイトもありました。

---↑編集・追記---

今日は、書き捨てで失礼します!
勉強せねば。^^
お疲れ様です! 編集済み


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



Name: 胡椒  ..初心者(8,592ポイント)   Date: 2010/06/03(木) 15:37   No:53471       
Title: カウントについて    
龍神録のプログラムでは、ステージカウントを表示するとカウントが一秒で60増えますよね。

でも↓の
#include <stdio.h> 

int main(){
    int cnt;
    cnt=0;
    while(1){
        printf("%d\r",cnt);
        cnt++;
    }
fflush(stdin); 
getchar(); 
return(0);
}  
というコードではあっという間にものすごい数が増えてしまいます。
一応
#include <stdio.h> 

int main(){
    int cnt,s;
    cnt=0;
    while(1){
                s=cnt/100;
        printf("%d\r",s);
        cnt++;
    }
fflush(stdin); 
getchar(); 
return(0);


とすればそれなりの(龍神録と似た)数になりますが、これはどうしてでしょうか?
龍神録の中には
s=cnt/100;
の部分が見当たらなくて、そのようなことをしているとは思わないのですが・・・


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


Name: シエル  ..かけだし(1,438ポイント)   Date: 2010/06/03(木) 15:41   No:53472     
Title: Re:カウントについて    
下記をお読み下さい。
http://dixq.net/g/51.html


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,198,022ポイント)   Date: 2010/06/03(木) 17:56   No:53481     
Title: Re:カウントについて    
下のプログラムはたまたま似たような値が出ているだけで関連性は全くないです。
ループは1億回位一瞬でまわってしまいますから、printfをかかなければものすごいいきおいで増加することでしょう。
プログラムの中ではprintf自体の処理に時間がかかっているので、遅くなり、100で割ると似たような数値が表示されているだけです。

概要はシエルさんが示されているリンク先をご覧ください。
しかしこれでは60FPSぴったりに出来ないので、ぴったりにしたい時はもっと長い目で見て修正する必要があります
その辺についてはこちらに書いています。
http://dixq.net/rp/43.html



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

Name: 胡椒  ..初心者(8,575ポイント)   Date: 2010/06/03(木) 21:03   No:53497 解決!     
Title: Re:カウントについて    
ありがとうございます。
よくわかりました。


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



Name: たろう  ..初心者(6,270ポイント)   Date: 2010/05/25(火) 00:50   No:52703       
Title: アーカイブファイルを解凍してメモリーに保持することは可能?    
プログラムであるアーカイブファイルを解凍してメモリーに保持することは可能でしょうか?
また出きるのなら、どういう風にプログラムすればよいのでしょうか?アーカイブファイルを解凍してメモリーに保持
する関数はあるのでしょうか?
それとどうやったらそのメモリに保持した画像データやテキストデータを使うことが出来るのでしょうか?(関数があ
るのでしょうか?)
環境はVC++2005
よろしくお願いします。


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


Name: ベリ工  ..入門者(4,101ポイント)   Date: 2010/05/25(火) 01:15   No:52706     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
昔私も同じ事を考え、いろいろ思考錯誤した結果、
zlib(詳細はネットで検索して下さい)という圧縮解凍する
ライブラリをファイルIOが発生しないメモリ上のみで
圧縮解凍できるように自分で改造しました。そのようなメモリ上で
圧縮解凍する関数等は見つかりませんでしたので・・・もしかしたら
見落としていただけかもしれませんが、改造にそこそこ苦労した
記憶があります。

なので、少なくともzlibというライブラリを自分でメモリ上で
圧縮解凍できるように改造すればできます。

参考までに。


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

Name: ベリ工  ..入門者(4,227ポイント)   Date: 2010/05/25(火) 01:21   No:52707     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
あ、ちょっと違いました。私が改造したのは
メモリ上のバイナリデータをファイルIO無しに
メモリ上で圧縮解凍する関数を自作したと言う意味です。
なのでたろうさんの意図する"ファイルから"では無いですが、
メモリ上のバイナリデータをメモリ上で圧縮解凍できるので
問題なくできるでしょう。


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

Name: softya [URL]  ..ハッカー(167,029ポイント)   Date: 2010/05/25(火) 09:47   No:52730     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
解凍ライブラリを自分で作るか、既存のライブラリをうまく使って処理する必要があります。C言語の標準ライブラリにはありません。また、ZIP解凍はWin32APIとして公開されていない様です。

こちらが開発関係の有名サイトです。
http://www.csdinc.co.jp/archiver/
ライブラリを使う場合は、各ライブラリのライセンスをよく読んでください。

>それとどうやったらそのメモリに保持した画像データやテキストデータを使うことが出来るのでしょうか?(関数があるのでしょうか?) 

それぞれのAPIやライブラリ別に方法が必要でモノによっては非常に面倒ですが、Win32API/MFC/.NET FrameWork/DirectX/DXライブラリで手法が違います。
解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。 編集済み


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

Name: たろう  ..初心者(6,350ポイント)   Date: 2010/05/25(火) 18:48   No:52764     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
ベリエさん回答ありがとうございます。
できることはできるんですね。
ありがとうございます。
softyaさん回答ありがとうございます。
>解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。 
とは何を勉強すればよいのでしょうか?
勉強不足ですみません。


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

Name: softya [URL]  ..ハッカー(167,822ポイント)   Date: 2010/05/25(火) 19:09   No:52768     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>>解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。 
>とは何を勉強すればよいのでしょうか? 

画像イメージファイルのバイナリ・ファイル入力でのメモリへ読み込みやテキストのファイル入出力などをC言語で行うことです。

例えば、画像イメージファイルをDXライブラリで扱う場合だと
画像イメージファイルをまずmalloc等で割り当てたメモリに読み込んでから、CreateGraphFromMem()でグラフィックハンドルを得て表示出来る事を確認して見てください。
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R15N26

テキストならプログラムでテキストファイルを作成したり、テキストファイルを読み込んで内容のテキストを画面に表示したりしてみてください。


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

Name: たろう  ..初心者(6,450ポイント)   Date: 2010/05/25(火) 21:24   No:52780     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
回答ありがとうございます。
>テキストならプログラムでテキストファイルを作成したり、テキストファイルを読み込んで内容のテキストを>画面に表示したりしてみてください。
とは、fopen関数を使ってやると言うことでしょうか?
だとしたら、アーカイブファイルを解凍してメモリ上にテキストで読み込むときどうすればよいのでしょうか?
なにか勘違いしていたらすみません。


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

Name: softya [URL]  ..ハッカー(167,962ポイント)   Date: 2010/05/25(火) 21:50   No:52782     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>とは、fopen関数を使ってやると言うことでしょうか?

そう言う事です。

>だとしたら、アーカイブファイルを解凍してメモリ上にテキストで読み込むときどうすればよいのでしょうか?
>なにか勘違いしていたらすみません。

アーカイブ以前に普通のファイルでこれが出来ないとアーカイブを扱うことは困難です。
一歩一歩理解してください。


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

Name: たろう  ..初心者(6,525ポイント)   Date: 2010/05/25(火) 22:03   No:52785     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
回答ありがとうございます。fopen()は普通にファイルの書き込みや読み込みはできてるつもりではいるのですが。引数1にファイル名を指定して引数2にファイルオープンモードを指定する。と言うのはわかるのですが、これでは駄目という事でしょうか?

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

Name: softya [URL]  ..ハッカー(168,426ポイント)   Date: 2010/05/25(火) 22:26   No:52792     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>回答ありがとうございます。fopen()は普通にファイルの書き込みや読み込みはできてるつもりではいるのですが。引数1にファイル名を指定して引数2にファイルオープンモードを指定する。と言うのはわかるのですが、これでは駄目という事でしょうか?

それで構いません。
テキストファイルを読み込んで表示するプログラムが作れますか?
ただしテキストサイズは不定です。
これがレベル1です。

次のレベル2は、
不定サイズのテキストファイルを復数読み込むプログラムを作ることは出来ますか?
全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
ファイルの読み込むメモリは、mallocを使って確保してください。
ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
数が決め打ちの配列を使うことは出来ません。
この前提でプログラムが作れるならレベル2をクリアです。



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

Name: たろう  ..初心者(6,643ポイント)   Date: 2010/05/25(火) 23:34   No:52799     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
レベル1はできるのですが、

>全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。 
ファイル名はどうやって調べればよいのでしょうか?
>ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
リスト構造は何を入れればいいのでしょうか?
初歩的な質問ですみません。


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

Name: softya [URL]  ..ハッカー(168,479ポイント)   Date: 2010/05/25(火) 23:50   No:52800     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>>全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。 
>ファイル名はどうやって調べればよいのでしょうか?

テキストで与えられても良いですし、Win32APIのFindFirstFile(),FindNextFile()でディレクトリ中からテキストだけ抽出しても良いです。
http://msdn.microsoft.com/ja-jp/library/cc429233.aspx

>>ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
>リスト構造は何を入れればいいのでしょうか?

ファイル名
サイズ
読み込みメモリのアドレス
は最低限必要です。
後は、リスト構造の管理に必要な情報ですね。アルゴリズムの基本通りです。


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

Name: たろう  ..初心者(5,857ポイント)   Date: 2010/05/26(水) 03:34   No:52805     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
回答ありがとうございます。
読み込みメモリのアドレスはどうやって調べればよいのでしょうか?
以下はできたプログラムです。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
typedef struct {
    char FileName[MAX_PATH];
    long long int size;
    unsigned int memoryAddress;
    int ftCreateTimeYear;
    int ftCreatetimeMonth;
    int ftCreatetimeday;

}FILEDATA;
int main(void)
{
    FILE *fp;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    FILEDATA filedata;
    SYSTEMTIME systemTime;
    int size;
    char* str;
    int i=0;
    hFind=FindFirstFile("*.txt",&FindFileData);
    do
    {
        fp=fopen(FindFileData.cFileName,"r");
        strcpy(filedata.FileName,FindFileData.cFileName);
        filedata.size=(FindFileData.nFileSizeHigh <<32)+ FindFileData.nFileSizeLow;    
        FileTimeToSystemTime(&FindFileData.ftCreationTime,&systemTime);
        filedata.ftCreateTimeYear=systemTime.wYear;
        filedata.ftCreatetimeMonth=systemTime.wMonth;
        filedata.ftCreatetimeday=systemTime.wDay;
        
        printf("%s %lld %d %d %d\n",filedata.FileName,filedata.size,
            filedata.ftCreateTimeYear,filedata.ftCreatetimeMonth,filedata.ftCreatetimeday);
        fseek(fp,0,SEEK_END);
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        str=(char*)malloc((size_t)(size));
        for(i=0;i<size;i++)
        {
            if((str[i]=fgetc(fp))=='\n')
                size--;
            
        }
        str[i]='\0';
        printf("%s",str);
        free(str);
        fclose(fp);
    }while(FindNextFile(hFind,&FindFileData) );
    printf("\n");
    FindClose(hFind);
    return 0; 
}


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

Name: softya [URL]  ..ハッカー(168,846ポイント)   Date: 2010/05/26(水) 11:11   No:52823     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
拝見しました。色々と問題あります。

1.リスト構造を理解されていると思えません。
http://www.geocities.jp/ky_webid/algorithm/010.html

2.ファイルサイズを得るときのデータ型が違います。
64bitの整数型の処理が必要です。

3.メモリアドレスはポインタで良いです。
mallocしたポインタをそのまま保存してください。
それにすぐfree()したのでは意味がありません。

4.取り込んだデータの\nの置換えはしなくて良いです。fgetcでは無く、freadを使ってください。
それにすぐ内容表示してますが、次のようなプログラムに書き換えてみてください。
(a)全テキストファイルをメモリに取り込む
(b)テキストファイル名の一覧を表示
(c)入力されたファイル名の内容を表示して、また(b)に戻る。
(d)endが入力されたら、全メモリを解放して終了



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

Name: たろう  ..初心者(5,873ポイント)   Date: 2010/05/26(水) 16:01   No:52835     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
回答ありがとうございます。
>(a)全テキストファイルをメモリに取り込む 
とはどのようにしたらいいのでしょうか?
各テキストファイルの文字列数の合計がわからないのにどうやって保持すればよいのでしょうか?


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

Name: softya [URL]  ..ハッカー(169,142ポイント)   Date: 2010/05/26(水) 16:11   No:52836     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>各テキストファイルの文字列数の合計がわからないのにどうやって保持すればよいのでしょうか?
ファイルサイズは分かっているので、そのまま読み込めば良いだけですよ。
文字列として扱う必要があるのはテキスト表示する時だけですので、その時に\nを文字列の終端として扱ってやればい良いことになります。


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

Name: たろう  ..初心者(6,664ポイント)   Date: 2010/05/26(水) 19:01   No:52845     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
返信ありがとうございます。
わからなくなったので質問します。
このソースで実行したら、ここの部分で処理が止まってしまいました。
どうしてでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    unsigned long long int size;
    unsigned int memoryAddress;
    int ftCreateTimeYear;
    int ftCreatetimeMonth;
    int ftCreatetimeday;
    struct _tagfiledata* nextnode;

}FILEDATA;
int main(void)
{
    FILE *fp;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata,*nextdata;
    SYSTEMTIME systemTime;
    long long int size;
    
    int i=0;
    filedata= (FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    nextdata=filedata;
    hFind=FindFirstFile("*.txt",&FindFileData);
    fp=fopen(FindFileData.cFileName,"rb");
    fseek(fp,0,SEEK_END);
    size=ftell(fp);
    fseek(fp,0,SEEK_SET);
    nextdata= (FILEDATA*)malloc((size_t)(sizeof(FILEDATA)));    
    nextdata->str= (char*)malloc((size_t)(size));    
    fread(nextdata->str,size,1,fp);
    nextdata=nextdata->nextnode;

    fp=fopen(FindFileData.cFileName,"rb");
    strcpy(filedata->FileName,FindFileData.cFileName);        
    while(FindNextFile(hFind,&FindFileData))
    {

        fp=fopen(FindFileData.cFileName,"rb");
        strcpy(filedata->FileName,FindFileData.cFileName);        
        printf("%s\n",filedata->FileName);
        fseek(fp,0,SEEK_END);
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        nextdata=(FILEDATA*)realloc(nextdata,(size_t)sizeof(FILEDATA));<===ここ
        nextdata->str=(char*)realloc(nextdata->str,(size_t)(size));
        fread(nextdata->str,size,1,fp);
        nextdata=nextdata->nextnode;
        
        fclose(fp);
    }
    printf("\n");
    FindClose(hFind);
    fclose(fp);
    nextdata=filedata;
    hFind=FindFirstFile("*.txt",&FindFileData);
    do{
        fp=fopen(FindFileData.cFileName,"rb");
        printf("%s",FindFileData.cFileName);
        printf("%s",nextdata->str);
        nextdata=nextdata->nextnode;
        fclose(fp);
    }while(FindNextFile(hFind,&FindFileData) );
    printf("\n");
    free(filedata->str);
    FindClose(hFind);
    return 0; 
}


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

Name: softya [URL]  ..ハッカー(169,601ポイント)   Date: 2010/05/26(水) 20:09   No:52850     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
えーと、読みづらいのでコメントを入れてくださいね。
理由は、nextdataに不正な値が入っているためです。
根本的な問題はリスト構造の作り方が間違っているためで、realloc()は出来くるはずが無いのですが見直してみてください。
それとFindFirstFile()とFindNextFile()のあとファイル処理は共通化出来るので関数に分離してみてください。


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

Name: たろう  ..初心者(7,326ポイント)   Date: 2010/05/27(木) 00:45   No:52863     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA* nextdata);
int main(void)
{
    FILE *fp;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    SYSTEMTIME systemTime;
    long long int size;

    hFind=FindFirstFile("*.txt",&FindFileData);
    //データを取得する
    Filedatasyutoku(FindFileData.cFileName,filedata);
    nextdata=filedata;
    while(FindNextFile(hFind,&FindFileData))
    {
         //データを取得する
        Filedatasyutoku(FindFileData.cFileName,nextdata);
    }
    nextdata=NULL;
    printf("\n");
    FindClose(hFind);
    
    nextdata=filedata;

    while(nextdata!=NULL ){
        //表示する
        printf("%s",nextdata->FileName);
        printf("%s",nextdata->str);
        nextdata=nextdata->nextnode;

    }
    printf("\n");
    //free(filedata->str);

    return 0; 
}
void Filedatasyutoku(char* str,FILEDATA* nextdata)
{
    FILE *fp;
    int size;
        //ファイルを開く
        fp=fopen(str,"rb");
        fseek(fp,0,SEEK_END);
        //データのサイズを取得する
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        //メモリーを確保
        nextdata=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
        nextdata->str=(char*)malloc((size_t)(size));
        //構造体にデータを入れる
        strcpy(nextdata->FileName,str);
        fread(nextdata->str,size,1,fp);

        nextdata=nextdata->nextnode;
        fclose(fp);

}

とやったのですが、
データが取得されないですが、
これはポインタが理解していないのでしょうか。
どこを直せばいいのでしょうか?


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

Name: softya [URL]  ..ハッカー(170,047ポイント)   Date: 2010/05/27(木) 16:58   No:52879     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
このプログラムってデバッガでトレースしてみましたか?
デバッガを使いないとちょっとした問題でも何時間でも悩むことになるので、デバッガを使うようにしてください。

問題点は幾つかあります。

・Filedatasyutoku()はnextdataでポインタデータを返すことが出来ません。
値渡しとポインタによる擬似参照渡しの違いを理解する必要がります。
ポインタの引数については、こちらの「ポインタ その3」を見てください。
http://chaichan.web.infoseek.co.jp/src/c.htm

・問題と言うほどでも無いですが、将来的なことも考えて
Filedatasyutoku()の引数のstrはfilenameとか意味を持つ名前にしてください。
filename_strでも良いです。nextdata->strと混乱を招きます。

・初期化されていないポインタの利用。Filedatasyutoku()中のnextdata=nextdata->nextnode;の部分ですが、nextdata->nextnodeは値が未定義ですので、nextdataは不定なポインタになります。
リスト構造のリストポインタのつもりだと思いますが、有効なデータ同士をリストすることに意味があるのであって未定・不定なポインタを結合しては行けません。

・main中のnextdata=NULL;は使い方が間違っています。
これもポインタの使い方の間違いですので、よく読んでみてください。
http://chaichan.web.infoseek.co.jp/src/c.htm
デバッガで変数をウォッチしてみるのも良い勉強になります。

・メモリのfree()が無くなってますね。
表示するのと処理が出来るならfree()出来ると思いますので挑戦してみてください。


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

Name: たろう  ..初心者(7,440ポイント)   Date: 2010/05/27(木) 18:48   No:52884     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
参考のサイトありがとうございます。
しかしそれは理解しているつもりの内容なのですが、
ダブルポインタでやるのはわかったのですがそれで試行錯誤してやっていったのですが、
できないというか、わかりません。何がいけないのでしょうか?


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

Name: softya [URL]  ..ハッカー(169,845ポイント)   Date: 2010/05/27(木) 19:01   No:52886     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>ダブルポインタでやるのはわかったのですがそれで試行錯誤してやっていったのですが、 

もし呼び出した関数の方でポインタの値を書き換えたいなら、ポインタのポインタを関数に渡す必要がありあます。現状のソースコードは、単純なポインタしか渡していませんよね。
ところで、ちゃんとデバッガでポインタの値などを確認してトレースしてますか?


ダブルポインタの基本的な書き方
int main()
{
 FILEDATA *pdata;
 func(&pdata);
}

void func(FILEDATA **ppdata) {
 *ppdata = malloc( sizeof(FILEDATA) );
}


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

Name: たろう  ..初心者(8,391ポイント)   Date: 2010/05/27(木) 19:14   No:52889     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
確認しました。
やっぱり、リストが結合されていませんでした。
アドレスがNULLのままで返ってきます。
リストを結合するにはどうすればよいのでしょうか?
以下はソースです
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
    FILE *fp;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    SYSTEMTIME systemTime;
    long long int size;

    hFind=FindFirstFile("*.txt",&FindFileData);
    nextdata=filedata;
    Filedatasyutoku(FindFileData.cFileName,&nextdata);

    while(FindNextFile(hFind,&FindFileData))
    {
        Filedatasyutoku(FindFileData.cFileName,&nextdata);
    }
    
    printf("\n");
    FindClose(hFind);
    
    nextdata=filedata;

    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("%s",nextdata->str);
        nextdata=nextdata->nextnode;

    }
    printf("\n");
    nextdata=filedata;
    while(nextdata!=NULL)
    {
        free(nextdata->str);
        free(nextdata);
    }
    return 0; 
}
void Filedatasyutoku(char* str,FILEDATA** nextdata)
{
    FILE *fp;
    int size;
        //ファイルを開く
        fp=fopen(str,"rb");
        fseek(fp,0,SEEK_END);
        //データのサイズを取得する
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        //メモリーを確保
        *nextdata=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
        (*nextdata)->str=(char*)malloc((size_t)(size));
        //構造体にデータを入れる
        strcpy((*nextdata)->FileName,str);
        fread((*nextdata)->str,size,1,fp);
        (*nextdata)=(*nextdata)->nextnode;
        (*nextdata)=NULL;
        fclose(fp);

}


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

Name: softya [URL]  ..ハッカー(169,684ポイント)   Date: 2010/05/27(木) 19:28   No:52891     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
根本的な問題は、メモリ割り当て時に後方に対してリスト結合を行おうとしてますが、後方のリストは存在しないので結合出来るはずがありません、後方のリストは基本的に無効なのでNULLを代入すべきです。
じゃあ、どうするかと言うとメモリ割り当て時に前方のリストに結合します。1つ手前のリストのポインタと今のリストのポインタをどう管理するか考えてみてください。

※ヒント
1.Filedatasyutoku()の引数は変更する必要はありません。
2.main側でも、Filedatasyutoku()側でも前方リストへの結合は可能です。自分に分かる方法を選んでください。
3.絵に書いてみるとイメージが掴みやすいです。


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

Name: たろう  ..中級者(9,345ポイント)   Date: 2010/05/27(木) 20:04   No:52895     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
できました!
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    struct _tagfiledata* prevnode;
    struct _tagfiledata* nextnode;

}FILEDATA;
FILEDATA* Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
    FILE *fp;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    SYSTEMTIME systemTime;
    long long int size;

    hFind=FindFirstFile("*.txt",&FindFileData);

    filedata=Filedatasyutoku(FindFileData.cFileName,&filedata);

    while(FindNextFile(hFind,&FindFileData))
    {
        filedata=Filedatasyutoku(FindFileData.cFileName,&filedata);
    }
    
  
    FindClose(hFind);
    
    nextdata=filedata;

    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%s",nextdata->str);
         printf("\n");
        nextdata=nextdata->nextnode;

    }
    printf("\n");
/*    filedata;
    while(filedata!=NULL)
    {
        free(filedata->str);
        free(nextdata);
    }*/
    return 0; 
}
FILEDATA* Filedatasyutoku(char* str,FILEDATA** nextdata)
{
    FILE *fp;
    int size;
    FILEDATA* prev;
        //ファイルを開く
        fp=fopen(str,"r");
        fseek(fp,0,SEEK_END);
        //データのサイズを取得する
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        //メモリーを確保
        prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
        prev->str=(char*)malloc((size_t)(size));
        prev->nextnode=(*nextdata);
        //構造体にデータを入れる
        strcpy(prev->FileName,str);
        fread(prev->str,size,1,fp);
        fclose(fp);
        return prev;

}

ただ、文字化けが出てくるのですが、
たとえば、
テキストファイルに
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
と入力してあるのに、結果は
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa□□□□ンン)
と出ますこれはどうしたらよいのでしょうか?
よろしくお願いします。
aaaaaaaaaaa


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

Name: softya [URL]  ..ハッカー(170,292ポイント)   Date: 2010/05/27(木) 22:53   No:52910     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
あっ、それは言い忘れてました。
メモリに保存されているのはテキストは文字列の終端コードがありませんので、そのまま出力するとマズイことになります。1文字づつテキストファイルのサイズ文だけ出力する必要があります。よく見たらテキストファイルのサイズが構造体から無くなってますね。まず構造体にサイズを追加してください。

それとメモリの解放が出来ていません。辿り方は表示する時と同じです。
ただ、何も考えずに解放すると後方のリストのポインタの処理に問題が出ますので注意してください。

それと、一番大きな問題はリスト処理に間違いがあります。3つ以上のテキストファイルを用意してみると分かりますよ。
ヒント
・後方のリストは基本的に無効なので NULLを代入すべきです。 と言ったはずですが守ってますか?
・全部のリストのポインタを確認しましたか?リスト自体のアドレスとnextnodeの指すアドレスを確認してください。
・双方向リストは作っていないので、prevnodeは不要です。と言うか使っていませんし。


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

Name: たろう  ..中級者(10,358ポイント)   Date: 2010/05/27(木) 23:46   No:52913     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
返信ありがとうございます。
>後方のリストは基本的に無効なので NULLを代入すべきです。 と言ったはずですが守ってますか?
できていると思うのですが、このfiledataが一番後ろの部分なので宣言のところにNULLと入れてます。
>全部のリストのポインタを確認しましたか?リスト自体のアドレスとnextnodeの指すアドレスを確認してください。 
確認しました。合ってました。
>双方向リストは作っていないので、prevnodeは不要です。と言うか使っていませんし。
すみません。消すの忘れてました。
プログラムできたので見てください。
>それと、一番大きな問題はリスト処理に間違いがあります。3つ以上のテキストファイルを用意してみると分かりますよ
3つ以上のテキストファイルを用意しましたが、変化はありませんでした。(全部のリストちゃんと表示されました。)
何が間違ってしるのでしょうか?
以下変更したソース載せます。
</pre>#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
    FILE *fp;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    SYSTEMTIME systemTime;

    hFind=FindFirstFile("*.txt",&FindFileData);

    Filedatasyutoku(FindFileData.cFileName,&filedata);

    while(FindNextFile(hFind,&FindFileData))
    {
      Filedatasyutoku(FindFileData.cFileName,&filedata);
    }
    
  
    FindClose(hFind);
    
    nextdata=filedata;

    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");        
        for(int i=0;i<nextdata->size;i++)
        {
            if(nextdata->str[i]=='\n')
                nextdata->size--;
            printf("%c",nextdata->str[i]);
        }
    
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    printf("\n");
   nextdata=filedata;
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(char* str,FILEDATA** nextdata)
{
    FILE *fp;
    int size;
    FILEDATA* prev;
        //ファイルを開く
        fp=fopen(str,"rb");
        fseek(fp,0,SEEK_END);
        //データのサイズを取得する
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        //メモリーを確保
        prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
        prev->str=(char*)malloc((size_t)(size));
        prev->size=size;
        prev->memoryAddress=prev;
        prev->nextnode=(*nextdata);
        (*nextdata)=prev;
        //構造体にデータを入れる
        strcpy(prev->FileName,str);
        fread(prev->str,size,1,fp);
        fclose(fp);

}</pre>


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

Name: softya [URL]  ..ハッカー(170,179ポイント)   Date: 2010/05/28(金) 00:10   No:52917     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>何が間違ってしるのでしょうか? 
ごめなさい勘違いしてましたね。後ろから前にリストを作っているんですね。で、最後のがリスト先頭になるって事ですね。いや、全然OKです。

削除も有ってますが、これは不要では?

   nextdata=filedata; ← これ
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    } 

じゃあ、まずLZHファイルの解凍処理に挑戦してみましょうか。
復数のテキストの入ったLZHファイルを用意してください。
ライブラリはこれ。
http://www2.nsknet.or.jp/~micco/mysoft/unlha32.htm
基本的な使い方はこれ
http://www13.plala.or.jp/kmaeda/winc/lzhtxt.htm
で、今回の目的に使用する関数はこれです。

UnlhaFindFirst
UnlhaFindNext
UnlhaExtractMem


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

Name: たろう  ..中級者(11,409ポイント)   Date: 2010/05/28(金) 16:02   No:52942     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
返信ありがとうございます。
実行中エラーがでてどこを直せばよいのかわかりません。
ここの所で、「既にUNLHA32.DLLは動作中です」と出ます。どこが間違っているのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd;
    FILE *fp;
    char str[512];
    unsigned char buffer;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;
    hWnd=NULL;
    char* filename;
    hArc = UnlhaOpenArchive(hWnd, "圧縮ファイル.lzh", M_ERROR_MESSAGE_ON); 
    strcpy(str,"圧縮ファイル.lzh");
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            strcpy(str,"圧縮ファイル.lzh c: ");
            strcat(str,ii.szFileName);
            UnlhaExtractMem(hWnd,str,&buffer,512,NULL,NULL,NULL);<==ここ

            Filedatasyutoku(ii.szFileName,&filedata);
            

        } while (UnlhaFindNext(hArc, &ii) != -1);
    }

    UnlhaCloseArchive(hArc);
    nextdata=filedata;
    

    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");        
        for(int i=0;i<nextdata->size;i++)
        {
            if(nextdata->str[i]=='\n')
                nextdata->size--;
            printf("%c",nextdata->str[i]);
        }
    
        printf("\n");
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    printf("\n");
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(char* file_str,FILEDATA** nextdata)
{
    FILE *fp;
    int size;
    FILEDATA* prev;
        //ファイルを開く
        fp=fopen(file_str,"rb");
        if(fp==NULL){
            exit(1); 
        }
        fseek(fp,0,SEEK_END);
        //データのサイズを取得する
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        //メモリーを確保
        prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
        prev->str=(char*)malloc((size_t)(size));
        prev->size=size;
        prev->memoryAddress=prev;
        prev->nextnode=(*nextdata);
        (*nextdata)=prev;
        //構造体にデータを入れる
        strcpy(prev->FileName,file_str);
        fread(prev->str,size,1,fp);
        fclose(fp);

}


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

Name: たろう  ..中級者(11,479ポイント)   Date: 2010/05/28(金) 16:19   No:52944     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
あと、このサイトに「UNLHA32.LIB はボーランド C++ 用なので間違えないようにして下さい。」
と載っていたのですが、VC++2005では使えないのでしょうか?





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

Name: たろう  ..中級者(10,391ポイント)   Date: 2010/05/28(金) 18:16   No:52950     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
変更しました。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    char* str;
    long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd=0;
    FILE *fp;
    char full_file_str[512];
    unsigned char buffer;
    int i=0;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;



    hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON); 
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            strcpy(full_file_str,"test.lzh c:");

            strcat(full_file_str,ii.szFileName);

            Filedatasyutoku(full_file_str,&filedata);
        } while (UnlhaFindNext(hArc, &ii) != -1);
    }

    UnlhaCloseArchive(hArc);
    UnlhaExtractMem(hWnd,full_file_str,&buffer,512,NULL,NULL,NULL);
    nextdata=filedata;
    

    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");        
        for(int i=0;i<nextdata->size;i++)
        {
            if(nextdata->str[i]=='\n')
                nextdata->size--;
            printf("%c",nextdata->str[i]);
        }
    
        printf("\n");
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    printf("\n");
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(char* file_str,FILEDATA** nextdata)
{
    FILE *fp;
    int size;
    FILEDATA* prev;
        //ファイルを開く
        fp=fopen(file_str,"rb");
        if(fp==NULL){
            exit(1); 
        }
        fseek(fp,0,SEEK_END);
        //データのサイズを取得する
        size=ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        //メモリーを確保
        prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
        prev->str=(char*)malloc((size_t)(size));
        prev->size=size;
        prev->memoryAddress=prev;
        prev->nextnode=(*nextdata);
        (*nextdata)=prev;
        //構造体にデータを入れる
        strcpy(prev->FileName,file_str);
        fread(prev->str,size,1,fp);
        fclose(fp);

}
とやったのですが、
ファイルが開きません。exit(1)のところで出てしまいます。
どのようにしたら開くことができるのでしょうか?


1,088ポイント を落としてしまった。

Name: softya [URL]  ..ハッカー(170,688ポイント)   Date: 2010/05/28(金) 19:13   No:52952     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>あと、このサイトに「UNLHA32.LIB はボーランド C++ 用なので間違えないようにして下さい。」
>と載っていたのですが、VC++2005では使えないのでしょうか? 

ドキュメントに
UNLHA32.LIB  : VC++ でコンパイルするためのインポートライブラリです。
と書いてあるので大丈夫ですよ。unlhavc.libじゃなくてUNLHA32.LIBを使ってください。
たぶん、サイトの情報が古いんだと思います。

プログラム見ましたが、fopen()する事はできません。
lzhなどアーカイブ・ファイルの中身に対して、fopenする事は出来ませんので。
fopen()とfread()の代わりがUnlhaExtractMem()です。 
ファイルのオリジナルサイズもINDIVIDUALINFO から得てください。



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

Name: たろう  ..中級者(10,412ポイント)   Date: 2010/05/28(金) 20:16   No:52957     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
返信ありがとうございます。
テキストファイルの文字列の出力方法はどうなるのでしょうか?


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

Name: softya [URL]  ..ハッカー(170,883ポイント)   Date: 2010/05/28(金) 21:07   No:52960     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>テキストファイルの文字列の出力方法はどうなるのでしょうか? 
アーカイブでもfopen()時と特に変わりません。


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

Name: たろう  ..中級者(10,473ポイント)   Date: 2010/05/28(金) 21:26   No:52962     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
回答ありがとうございます。
freadでやれと言うことでしょうか?
でも、fpは使えないのでどうすればよいのでしょうか?


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

Name: softya [URL]  ..ハッカー(170,922ポイント)   Date: 2010/05/28(金) 22:30   No:52966     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>回答ありがとうございます。
>freadでやれと言うことでしょうか?
>でも、fpは使えないのでどうすればよいのでしょうか? 

UnlhaExtractMem()でメモリ展開されるので読み込みは必要ありません。
これがfopen()とfread()の代用だと書いたのは、UnlhaExtractMem()が2つの機能を併せ持つからです。
一度メモリに読み込まれてしまえば、fread()したテキストもUnlhaExtractMem()したテキストも同じものです。


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

Name: たろう  ..中級者(10,941ポイント)   Date: 2010/05/28(金) 23:10   No:52972     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
このように変更してみたんですが、

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    BYTE* str;
    unsigned long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
    DWORD size;
    FILEDATA* prev;
    BYTE* buffer;
    unsigned long* i=0;
    //データのサイズを取得する
    size=data.dwOriginalSize ;  
    
   //メモリーを確保
        
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    prev->str=(BYTE*)malloc((size_t)(size));

    //ファイルを開く
    UnlhaExtractMem(hWnd,data.szFileName,prev->str,size,NULL,NULL,NULL);<==ここ
    //構造体にデータを入れる
    strcpy(prev->FileName,data.szFileName);
    prev->size=size;
    prev->memoryAddress=prev;
    prev->nextnode=(*nextdata);
    (*nextdata)=prev;
}

としたのですが、ここのところ(prev->str)にテキストファイルの文字列が出力されると思ったのですが、
違うのでしょうか?
違う場合何か抜けていたりするのでしょうか?


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

Name: softya [URL]  ..ハッカー(171,122ポイント)   Date: 2010/05/28(金) 23:41   No:52974     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
UnlhaExtractMem前に
            strcpy(full_file_str,"test.lzh c:");
            strcat(full_file_str,ii.szFileName);
の部分が抜けてますよ。


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

Name: たろう  ..中級者(12,167ポイント)   Date: 2010/05/29(土) 00:13   No:52976     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
追加してみましたがダメでした。
何が間違っているのでしょうか?
ソース載せます。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    BYTE* str;
    unsigned long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd=0;
    FILE *fp;
    char full_file_str[512];
    unsigned char buffer;
    int i=0;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;



    hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON); 
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            Filedatasyutoku(ii,hWnd,&filedata);
        } while (UnlhaFindNext(hArc, &ii) != -1);
    }


    UnlhaCloseArchive(hArc);
    nextdata=filedata;
    

    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");        
        for(int i=0;i<nextdata->size;i++)
        {
            if((const char)nextdata->str[i]=='\n')
                nextdata->size--;
            printf("%c",(const char)nextdata->str[i]);
        }
    
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
    DWORD size;
    FILEDATA* prev;
    BYTE* buffer;
    char full_file_str[512];
    unsigned long* i=0;
    //データのサイズを取得する
    size=data.dwOriginalSize ;  
    
   //メモリーを確保
        
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    prev->str=(BYTE*)malloc((size_t)(size));
    strcpy(full_file_str,"test.lzh c:"); 
    strcat(full_file_str,data.szFileName); 

    //ファイルを開く
    UnlhaExtractMem(hWnd,full_file_str,prev->str,size,NULL,NULL,NULL);
    //構造体にデータを入れる
    strcpy(prev->FileName,data.szFileName);
    prev->size=size;
    prev->memoryAddress=prev;
    prev->nextnode=(*nextdata);
    (*nextdata)=prev;
}


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

Name: たろう  ..中級者(13,270ポイント)   Date: 2010/05/29(土) 09:48   No:52990     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
変更したので載せます。
参考のサイト通りでやったつもりなのですが、どこが間違っているのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    BYTE* str;
    unsigned long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd=0;
    FILE *fp;

    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;


    hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON); 
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            Filedatasyutoku(ii,hWnd,&filedata);
        } while (UnlhaFindNext(hArc, &ii) != -1);
    }
    UnlhaCloseArchive(hArc);
    nextdata=filedata;
    

    while(nextdata!=NULL ){
    
        UnlhaExtractMem(hWnd,nextdata->FileName,nextdata->str,nextdata->size,NULL,NULL,NULL);
        nextdata=nextdata->nextnode;
    }
    nextdata=filedata;
    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");            
        printf("%d",nextdata->size);
        printf("\n");
        for(int i=0;i<nextdata->size;i++)
        {
            if(nextdata->str[i]=='\n')
            {
                nextdata->size--;
            }
            printf("%c",(const char*)nextdata->str[i]);
        }
    
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
    DWORD size;
    FILEDATA* prev;
    BYTE* buffer;
    char full_file_str[512];
    unsigned long* i=0;
    //データのサイズを取得する
    size=data.dwOriginalSize ;  
    
   //メモリーを確保
        
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    prev->str=(BYTE*)malloc((size_t)(size));
    strcpy(full_file_str,"test.lzh c:"); 
    strcat(full_file_str,data.szFileName); 

    //ファイルを開く
    //構造体にデータを入れる
    strcpy(prev->FileName,data.szFileName);
    prev->size=size;
    prev->memoryAddress=prev;
    prev->nextnode=(*nextdata);
    (*nextdata)=prev;
}


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

Name: softya [URL]  ..ハッカー(171,179ポイント)   Date: 2010/05/29(土) 12:04   No:52991     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
確認してみました。
なんども書いてますが、UnlhaExtractMemのパラメータが
  strcpy(full_file_str,"test.lzh c:");
  strcat(full_file_str,ii.szFileName); 
で作ったコマンドじゃないとダメですよ。
デバッガでちゃんと引数とか確認してますか?
基本的なことなんですが、基本を疎かにしてはプログラム力は伸びませんし、このやりとりが時間のロスです。
あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。


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

Name: たろう  ..中級者(14,341ポイント)   Date: 2010/05/29(土) 12:40   No:52992     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?      
 変更したので載せます。 
参考のサイト通りでやったつもりなのですが、どこが間違っているのでしょうか? 

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    BYTE* str;
    unsigned long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd=0;
    FILE *fp;

    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;


    hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON); 
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            Filedatasyutoku(ii,hWnd,&filedata);
        } while (UnlhaFindNext(hArc, &ii) != -1);
    }
    UnlhaCloseArchive(hArc);
    nextdata=filedata;
    

    while(nextdata!=NULL ){

        strcpy(full_file_str,"test.lzh c:"); 
        strcat(full_file_str,ii.szFileName); 
        UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
        nextdata=nextdata->nextnode;
    }
    nextdata=filedata;
    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");            
        printf("%d",nextdata->size);
        printf("\n");
        for(int i=0;i<nextdata->size;i++)
        {
            if(nextdata->str[i]=='\n')
            {
                nextdata->size--;
            }
            printf("%c",(const char*)nextdata->str[i]);
        }
    
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
    DWORD size;
    FILEDATA* prev;
    BYTE* buffer;
    char full_file_str[512];
    unsigned long* i=0;
    //データのサイズを取得する
    size=data.dwOriginalSize ;  
    
   //メモリーを確保
        
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    prev->str=(BYTE*)malloc((size_t)(size));
     //ファイルを開く
    //構造体にデータを入れる
    strcpy(prev->FileName,data.szFileName);
    prev->size=size;
    prev->memoryAddress=prev;
    prev->nextnode=(*nextdata);
    (*nextdata)=prev;
}
 
すみません。やっていませんでした。
直してみたのですが、できません。なぜでしょうか?
>あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。
テキストファイル名をさらにダブルクオートでかこむということでしょうか?


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

Name: たろう  ..上級者(15,318ポイント)   Date: 2010/05/29(土) 12:43   No:52993     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
変更しました。

#include<windows.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include "unlha32.h" 
     
#define MAX_PATH 260 
#define MAX_TEXT 260 

typedef struct _tagfiledata{ 
    char FileName[MAX_PATH]; 
    BYTE* str; 
    unsigned long long int size; 
    struct _tagfiledata* memoryAddress; 
    struct _tagfiledata* nextnode; 

}FILEDATA; 
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata); 
int main(void) 
{ 
    HWND hWnd=0; 
    FILE *fp; 
  char full_file_str;
    WIN32_FIND_DATA FindFileData; 
    HANDLE hFind,hFind2; 
    FILEDATA *filedata=NULL,*nextdata=NULL; 
    HARC hArc; 
    INDIVIDUALINFO ii; 


    hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);  
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) { 
        do {  
            Filedatasyutoku(ii,hWnd,&filedata); 
        } while (UnlhaFindNext(hArc, &ii) != -1); 
    } 
    UnlhaCloseArchive(hArc); 
    nextdata=filedata; 
     

    while(nextdata!=NULL ){ 

        strcpy(full_file_str,"test.lzh c:");  
        strcat(full_file_str,ii.szFileName);  
        UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL); 
        nextdata=nextdata->nextnode; 
    } 
    nextdata=filedata; 
    while(nextdata!=NULL ){ 
         
        printf("%s",nextdata->FileName); 
        printf("\n"); 
        printf("%p",nextdata->memoryAddress); 
        printf("\n");             
        printf("%d",nextdata->size); 
        printf("\n"); 
        for(int i=0;i<nextdata->size;i++) 
        { 
            if(nextdata->str[i]=='\n') 
            { 
                nextdata->size--; 
            } 
            printf("%c",(const char*)nextdata->str[i]); 
        } 
     
        printf("\n"); 
        nextdata=nextdata->nextnode; 

    } 
    while(filedata!=NULL) 
    { 
        nextdata=filedata->nextnode; 
        free(filedata->str); 
        free(filedata); 
        filedata=nextdata; 
    } 
    return 0;  
} 
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata) 
{ 
    DWORD size; 
    FILEDATA* prev; 
    BYTE* buffer; 
    char full_file_str[512]; 
    unsigned long* i=0; 
    //データのサイズを取得する 
    size=data.dwOriginalSize ;   
     
   //メモリーを確保 
         
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA)); 
    prev->str=(BYTE*)malloc((size_t)(size)); 
     //ファイルを開く 
    //構造体にデータを入れる 
    strcpy(prev->FileName,data.szFileName); 
    prev->size=size; 
    prev->memoryAddress=prev; 
    prev->nextnode=(*nextdata); 
    (*nextdata)=prev; 
} 

  すみません。やっていませんでした。 
直してみたのですが、できません。なぜでしょうか? 
>あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。 
テキストファイル名をさらにダブルクオートでかこむということでしょうか?


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

Name: たろう  ..上級者(16,666ポイント)   Date: 2010/05/29(土) 12:50   No:52995     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
変更しました。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    BYTE* str;
    unsigned long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd=0;
    FILE *fp;
    char full_file_str[512];
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;


    hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON); 
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            Filedatasyutoku(ii,hWnd,&filedata);
        } while (UnlhaFindNext(hArc, &ii) != -1);
    }
    UnlhaCloseArchive(hArc);
    nextdata=filedata;
    

    while(nextdata!=NULL ){
        strcpy(full_file_str,"test.lzh c:"""); 
        strcat(full_file_str,ii.szFileName); 
        strcat(full_file_str,"""");
        UnlhaExtractMem(hWnd,nextdata->FileName,nextdata->str,nextdata->size,NULL,NULL,NULL);
        nextdata=nextdata->nextnode;
    }
    nextdata=filedata;
    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");            
        printf("%d",nextdata->size);
        printf("\n");
        for(int i=0;i<nextdata->size;i++)
        {
            if(nextdata->str[i]=='\n')
            {
                nextdata->size--;
            }
            printf("%c",(const char*)nextdata->str[i]);
        }
    
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
    DWORD size;
    FILEDATA* prev;
    BYTE* buffer;
    char full_file_str[512];
    unsigned long* i=0;
    //データのサイズを取得する
    size=data.dwOriginalSize ;  
    
   //メモリーを確保
        
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    prev->str=(BYTE*)malloc((size_t)(size));

    //ファイルを開く
    //構造体にデータを入れる
    strcpy(prev->FileName,data.szFileName);
    prev->size=size;
    prev->memoryAddress=prev;
    prev->nextnode=(*nextdata);
    (*nextdata)=prev;
}

 すみません。やっていませんでした。  
直してみたのですが、できません。なぜでしょうか?  
>あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。  
テキストファイル名をさらにダブルクオートでかこむということでしょうか? 
ダブルクオ−トしないでやってみましたが、それでも文字列(UnlhaExtractMem(hWnd,nextdata->FileName,nextdata->str,nextdata->size,NULL,NULL,NULL);
のnextdata->str)は出力されませんでした。


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

Name: softya [URL]  ..ハッカー(171,355ポイント)   Date: 2010/05/29(土) 13:29   No:52996     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
どうみても、最後のコードはfull_file_strをUnlhaExtractMemのパラメータとして使ってませんよ。
なんども書きますが、デバッガで必ず確認してください。
それとコマンドの書式が微妙に違っています。
ヒント:空白
本当に参考サイトと同じ書き方ですか?よく確かめてみてください。
"""" ← これもちゃんと目的の動作してます?

全面的に確認不足がトラブルの原因です。よく確かめましょう。
1.作られた中間データ、文字列はデバッガで必ず確認。
2.引数に問題がないか、これもデバッガで確認。
3.どうしても動かなかったら、手書きで動作を確認。
UnlhaExtractMem(hWnd,"test.lzh c: test.txt",nextdata->str,nextdata->size,NULL,NULL,NULL); 編集済み


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

Name: たろう  ..上級者(16,767ポイント)   Date: 2010/05/29(土) 18:31   No:53003     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
すみません。
UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL); 
でした。
できたというか日本語のファイル名は処理してくれないのでしょうか?
それとも何か見落としているところがあるのでしょうか?


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

Name: softya [URL]  ..ハッカー(171,490ポイント)   Date: 2010/05/29(土) 18:42   No:53004     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
私のところでは問題なく動きます。
いろいろな名前でテストして見ましたか?
あるいは見落としはないですか?
ダメなら、そのダメなファイル名を教えてください。


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

Name: たろう  ..上級者(16,864ポイント)   Date: 2010/05/29(土) 18:56   No:53006     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
新規テキスト ドキュメント.txtと、新規テキスト ドキュメント(2).txt
日本語 日本語.txtです。

ファイル名を「日本語.txt」と「日本語 日本語」にしたら表示されました。
多分半角空白文字を入れるとダメみたいです。


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

Name: softya [URL]  ..ハッカー(171,537ポイント)   Date: 2010/05/29(土) 19:23   No:53008     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
いえ、私のところでは問題はありません。
>新規テキスト ドキュメント.txt と、新規テキスト ドキュメント(2).txt
>日本語 日本語.txtです。 
別の問題の可能性があります。
プロジェクトの構成プロパティの全般で文字セットは、マルチバイト文字になってますか?UNICODEだとまずいですよ。



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

Name: たろう  ..上級者(18,048ポイント)   Date: 2010/05/29(土) 19:35   No:53009     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
文字セットはマルチバイト文字になっています。
気にしなくても大丈夫でしょうか?
一応ソース載せてみます。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
    
#define MAX_PATH 260
#define MAX_TEXT 260

typedef struct _tagfiledata{
    char FileName[MAX_PATH];
    BYTE* str;
    unsigned long long int size;
    struct _tagfiledata* memoryAddress;
    struct _tagfiledata* nextnode;

}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
    HWND hWnd=0;
    FILE *fp;
    char full_file_str[512];
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind,hFind2;
    FILEDATA *filedata=NULL,*nextdata=NULL;
    HARC hArc;
    INDIVIDUALINFO ii;


    hArc = UnlhaOpenArchive(hWnd, "test.dat", M_ERROR_MESSAGE_ON); 
    if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
        do { 
            Filedatasyutoku(ii,hWnd,&filedata);
        } while (UnlhaFindNext(hArc, &ii) != -1);
    }
    UnlhaCloseArchive(hArc);
    nextdata=filedata;
    while(nextdata!=NULL ){
        strcpy(full_file_str,"test.dat c: "); 
        strcat(full_file_str,nextdata->FileName); 
        UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
        nextdata=nextdata->nextnode;
    }
    nextdata=filedata;
    while(nextdata!=NULL ){
        
        printf("%s",nextdata->FileName);
        printf("\n");
        printf("%p",nextdata->memoryAddress);
        printf("\n");            
        printf("%d",nextdata->size);
        printf("\n");
        for(int i=0;i<nextdata->size;i++)
        {
            printf("%c",(const char*)nextdata->str[i]);
        }
    
        printf("\n");
        nextdata=nextdata->nextnode;

    }
    while(filedata!=NULL)
    {
        nextdata=filedata->nextnode;
        free(filedata->str);
        free(filedata);
        filedata=nextdata;
    }
    return 0; 
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
    DWORD size;
    FILEDATA* prev;
    BYTE* buffer;
    char full_file_str[512];
    unsigned long* i=0;
    //データのサイズを取得する
    size=data.dwOriginalSize ;  
    
   //メモリーを確保
        
    prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
    prev->str=(BYTE*)malloc((size_t)(size));

    //ファイルを開く
    //構造体にデータを入れる
    strcpy(prev->FileName,data.szFileName);
    prev->size=size;
    prev->memoryAddress=prev;
    prev->nextnode=(*nextdata);
    (*nextdata)=prev;
}

それと次は何をすればいいのでしょうか?


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

Name: softya [URL]  ..ハッカー(171,627ポイント)   Date: 2010/05/29(土) 19:44   No:53010     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
基本は出来たのでDXライブラリで画像とテキストを表示するとか、自分で使いたいアーカイブ形式にチェンジするとか自由にしてもらってかまいませんよ。何やりたいですか?
コードは後で確認しておきます。ダブルクオートで囲んでいないのが問題かも。
ちなみに、"\""と書くのが正解です。


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

Name: たろう  ..上級者(18,164ポイント)   Date: 2010/05/29(土) 20:01   No:53011     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
うまくいきました。
ありがとうございます!
>基本は出来たのでDXライブラリで画像とテキストを表示するとか、自分で使いたいアーカイブ形式にチェン>ジするとか自由にしてもらってかまいませんよ。何やりたいですか? 
このサイトのアーカイブファイルの解凍ソフトを作りたいです!
http://asobinosusume.com/program/prg_arc.php
ハードル高いでしょうか?
どうすればよいのでしょうか?


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

Name: softya [URL]  ..ハッカー(171,707ポイント)   Date: 2010/05/29(土) 21:00   No:53012     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
大して長いプログラムでも無いので、まずアーカイブ・プログラムの理解とファイル構造の解析を行って見てください。そもそも圧縮かかってないですし。
出力されたファイルをバイナリエディタで覗いていて見るのも良いでしょう。
http://www.vector.co.jp/soft/win95/util/se079072.html


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

Name: たろう  ..上級者(18,210ポイント)   Date: 2010/05/29(土) 21:50   No:53016     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
出力されたファイルをバイナリエディタで見ましたが、これをどうやって元の形に戻すことができるんでしょうか?

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

Name: softya [URL]  ..ハッカー(171,855ポイント)   Date: 2010/05/29(土) 22:26   No:53023     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
ファイル構造を理解しないとアーカイブの展開処理を作るのは困難なので、アーカイブ作成プログラムの理解を進めましょう。書き出しの逆を作れば読み出し・展開プログラムになります。
そもそもプログラムは、ちゃんと読まれました?FindNextFileとか、その他のものもご存知の文法や関数しか出てこないと思うんですが違いますか?
ここでもデバッガを駆使して、どの様にfwriteされていくか追いかけてみてください。そしてファイルの、どの部分がアーカイブ構造体のどの部分に該当するか調べてみてください。
まず先頭16バイトは、どんな16進数になってます?


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

Name: たろう  ..上級者(18,254ポイント)   Date: 2010/05/29(土) 22:35   No:53024     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
返信ありがとうございます。
07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74  ........>...list
です。


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

Name: softya [URL]  ..ハッカー(172,156ポイント)   Date: 2010/05/29(土) 22:51   No:53026     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
じゃあ、この値の意味をプログラムから解読してみてください。
07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74   ........>...list 
先頭から2バイトは、構造体のここですとか。
struct DATA{
 short num;  =>07 00 
};
とか書き出してみてください。
※今は嘘書いてますので、ちゃんとプログラをみて書いてくださいね。、

ちなみにインテルx86系CPUは、数値のメモリ内保存形態がリトルエンディアンなので出力したファイルをバイナリエディタで見ると値の並びが逆になります。
例えば
int no = 0x01020304;
と言うデータをファイルに書いてバイナリエディタで16進で見ると
04 03 02 01
となります。これがリトルエンディアンです。
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3


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

Name: たろう  ..上級者(18,519ポイント)   Date: 2010/05/30(日) 00:24   No:53038     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>じゃあ、この値の意味をプログラムから解読してみてください。 
>07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74   ........>...list  
>先頭から2バイトは、構造体のここですとか。 
>struct DATA{ 
> short num;  =>07 00  
>}; 
>とか書き出してみてください。 
>※今は嘘書いてますので、ちゃんとプログラムをみて書いてくださいね。、 
書いてみたんですけど、こんなのでいいのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
    
#define MAX_PATH 260
typedef struct {
    unsigned short title;
    unsigned short memo;

}DATA;
int main(void)
{

    FILE *file_fp,*copy_fp;
    HANDLE hFind;
    WIN32_FIND_DATA    FindFileData;
    DATA filedata;
    hFind = FindFirstFile( "*.dat", &FindFileData );    
    do{
            if(fopen_s(&file_fp,FindFileData.cFileName,"rb")==NULL)
                return -1;
             
    }while(FindNextFile(hFind,&FindFileData));
    return 0;
}

すみません。全然わかりません。
どのようにしたらよいのでしょうか?


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

Name: softya [URL]  ..ハッカー(172,357ポイント)   Date: 2010/05/30(日) 00:34   No:53042     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
違いますよ。
アーカイブソフトの解読ですので、
http://asobinosusume.com/program/prg_arc.php
の自作アーカイバのソースコードをみて解析してください。
構造体もarc.zipの中にあるソースコード中に含まれています。


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

Name: たろう  ..上級者(18,543ポイント)   Date: 2010/05/30(日) 12:33   No:53069     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
理解したつもりなのですが、これをどうやって解析すればいいのでしょうか?

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

Name: softya [URL]  ..ハッカー(172,898ポイント)   Date: 2010/05/30(日) 21:18   No:53110     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>理解したつもりなのですが、これをどうやって解析すればいいのでしょうか?

とりあえず何をfwriteしているか確かめてみてはどうしょうか?
デバッガで確認できます。
私も一日中パソコンの前にいるわけではないので、自分でできることをやってみてください。
今週は、火曜日と金曜日は不在の予定です。




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

Name: たろう  ..上級者(18,674ポイント)   Date: 2010/05/30(日) 22:19   No:53115     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
できました。ありがとうございます。
一つ聞きたいのですが、関係あるんですけどD3DXCreateTextureFromFileInMemory()関数の第二引数のメモリ内のファイルへのポインタとは、画像ファイルをmalloc()関数で画像分のデータを確保したデータにfread()関数で書き込んだデータを入れてそのmalloc()関数した先頭のポインタを入れればいいのでしょうか?


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

Name: softya [URL]  ..ハッカー(173,098ポイント)   Date: 2010/05/30(日) 22:48   No:53118     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
>できました。ありがとうございます。 

アーカイブの展開が出来たと言うことでしょうか?

>一つ聞きたいのですが、関係あるんですけどD3DXCreateTextureFromFileInMemory()関数の第二引数のメモリ内のファイルへのポインタとは、画像ファイルを malloc()関数で画像分のデータを確保したデータにfread()関数で書き込んだデータを入れてそのmalloc()関数した先頭のポインタを入れればいいのでしょうか?

そのはずです。なにか問題がありましたか?



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

Name: たろう  ..上級者(18,737ポイント)   Date: 2010/05/31(月) 01:52   No:53130     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    

はい。単純に考えてみたらできました。
いろいろ助言ありがとうございました!
>そのはずです。なにか問題がありましたか? 
いいえ。合っているのならいいです。
ありがとうございます!


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

Name: たろう  ..上級者(18,627ポイント)   Date: 2010/05/31(月) 02:09   No:53131     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
すみません。このエラーはどうしたら消えるのでしょうか?
main.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateSprite@8 が関数 _WinMain@16 で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateTextureFromFileA@12 が関数 _WinMain@16 で参照されました。


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

Name: たろう  ..上級者(20,100ポイント)   Date: 2010/05/31(月) 02:44   No:53132     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
すみません。解決したので別の質問をします。
このプログラムで画像ファイルを出力しようとしたのですが、
表示されません。なぜでしょうか?


#include<windows.h>
#include<stdio.h>
#include <d3dx9.h>
#pragma comment( lib, "d3dx9.lib") 
#pragma comment( lib, "d3d9.lib" )
    LPD3DXSPRITE            g_pD3DXSprite = NULL;
    LPDIRECT3DTEXTURE9      g_pD3DTexture = NULL;
    char g_SpriteFileName[MAX_PATH] = "test.png";
    WIN32_FIND_DATA    FindFileData;
    BYTE* data; 
    HRESULT hr;
    LPDIRECT3D9    m_pD3D;
    IDirect3DDevice9* g_pD3DDevice=NULL;
    LPDIRECT3D9                g_pD3D            = NULL; // Direct3Dインターフェイス
    FILE *fp;
    D3DDISPLAYMODE dmode;
    D3DPRESENT_PARAMETERS    g_D3DPP;                // D3DDeviceの設定(現在)

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
{
    HRESULT hr = S_OK;

    switch(msg)
    {

    case WM_DESTROY:
        // ウインドウを閉じる
        PostQuitMessage(0);
        return 0;
    }
    // デフォルト処理
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hprevInst,LPSTR lpCmdLine,int nShowCmd)
{


    WNDCLASSEX wc;
    HWND hWnd;

    wc.cbSize=sizeof(WNDCLASSEX);
    wc.style =0;
    wc.cbClsExtra=0;
    wc.cbWndExtra=32;
    wc.lpfnWndProc=MainWndProc;
    wc.hInstance =hInstance;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hIconSm =LoadIcon(NULL,IDI_WINLOGO);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName=NULL;
    wc.lpszClassName="gamemain";


    if (!RegisterClassEx(&wc))
        return -1;
    hWnd = CreateWindow("gamemain", "ant",
        WS_OVERLAPPEDWINDOW,
            0, 0, 640, 480,
            NULL, NULL, hInstance, NULL);
    if(hWnd==NULL)
    {
        return -1;
    }
    ShowWindow(hWnd,nShowCmd);
    UpdateWindow(hWnd);
    
    D3DCAPS9 Caps; // 能力を受け取るD3DCAPS9構造体
    g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if (g_pD3D == NULL)
        return -1 ;

    hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &Caps);
    if (FAILED(hr))
    {


        hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, &Caps);
        if (FAILED(hr) )
            return -1;
    }

    // 現在のディスプレイのフォーマットなどを取得しておく
    hr = g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode);
    if (FAILED(hr))
        return -1;
        ZeroMemory(&g_D3DPP, sizeof(g_D3DPP));
    g_D3DPP.BackBufferCount            = 1;
    g_D3DPP.SwapEffect                = D3DSWAPEFFECT_DISCARD;
    g_D3DPP.hDeviceWindow                = hWnd;
    g_D3DPP.Windowed                    = TRUE;
    g_D3DPP.PresentationInterval        = D3DPRESENT_INTERVAL_IMMEDIATE;

    hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                        D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice);
    if (FAILED(hr))
    {
        hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice);
        if (FAILED(hr))
            return -1;
    }



         //ファイルを開く
    if((fp=fopen("test.png","r+b"))==NULL)
    {
        return -1;
    }
         //ファイルのデータを読み込む
    FindFirstFile("*.png",&FindFileData);
    data=(BYTE*)malloc((size_t)(FindFileData.nFileSizeLow));
    fread(data,FindFileData.nFileSizeLow,1,fp);
    
         //メモリに読み込む
    if( FAILED(D3DXCreateTextureFromFileInMemory(g_pD3DDevice,data,FindFileData.nFileSizeLow,&g_pD3DTexture)))
        return -1; 

       // スプライト生成
    if( FAILED(D3DXCreateSprite(g_pD3DDevice, &g_pD3DXSprite)))
    {
        return -1; 
    }

    MSG msg;
    do
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
             g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB( 0, 0, 0, 255 ), 1.0f, 0 );

            if( SUCCEEDED( g_pD3DDevice->BeginScene() ) )
            {
                g_pD3DXSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE);
                RECT r={0,0,128,32};
                D3DXVECTOR3 C(100,100,0);
                D3DXVECTOR3 P(100,100,0);
                g_pD3DXSprite->Draw(g_pD3DTexture,NULL,NULL,NULL,0xffffffff);
                g_pD3DXSprite->End();

                g_pD3DDevice->EndScene();
            }
        }

    } while (msg.message != WM_QUIT);

    return 0;
}

です。よろしくお願いします。


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

Name: softya [URL]  ..ハッカー(173,250ポイント)   Date: 2010/06/01(火) 11:32   No:53210     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
すいません、今日も無理そうなんで。
ここは解決にして、別質問してもらえますか?
どう、うまく表示されないか書き添えてください。
出来ればプロジェクト全体(debug/Releaseフォルダ内容は不要)をアップロードすると回答してくれる人が楽です。



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

Name: Justy  ..伝説なるハッカー(538,030ポイント)   Date: 2010/06/01(火) 12:12   No:53211     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
 多分 IDirect3DDevice9::Presentが呼ばれてないんじゃないかと思いますけど。

 全くアーカイブに関係ないのであれば、softyaさんの仰るとおり別スレした方がいいですね。


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

Name: たろう  ..上級者(20,169ポイント)   Date: 2010/06/01(火) 18:18   No:53224     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
softyaさんありがとうございます。
解決します。本当にありがとうございました。

Justyさんありがとうございます。
言われたとおりやってみたらうまくいきました。
ありがとうございました。またわからないことがあるので別スレに書こうと思います。


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

Name: たろう  ..上級者(20,178ポイント)   Date: 2010/06/01(火) 18:19   No:53225 解決!     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
解決しました!

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

Name: Justy  ..伝説なるハッカー(537,749ポイント)   Date: 2010/06/03(木) 17:33   No:53475     
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?    
 なにやら投稿がダブっていたので削除しました。 編集済み

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



Name: みなみ  ..ぴよぴよ(164ポイント)   Date: 2010/06/03(木) 13:35   No:53463       
Title: 実行ファイルのsoundフォルダ内にある全てのwavファイルを取得する    
実行したexeの同階層にあるsoundフォルダの中身から
wavファイルの名前のみをすべて取して表示するPGを書いております。
DXライブラリを使っているのですが強制終了してしまいます。
これを直すことはできないのでしょうか?


HANDLE hFind;
WIN32_FIND_DATA fd;

int dxLibのmain関数{

    FindFirstFile("\\sound\\*.wav", &fd); //

    while(1){

        do {
            /* 結果の表示 */
            DrawFormatString(400,200,GetColor(255,255,255),"%s",fd.cFileName);
        } while(FindNextFile(hFind, &fd));
    
        /* 検索終了 */
        FindClose(hFind);
    }

}


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


Name: シエル  ..かけだし(1,435ポイント)   Date: 2010/06/03(木) 13:51   No:53465     
Title: Re:実行ファイルのsoundフォルダ内にある全てのwavファイルを取得する    
ざっとしか見てませんが、FindNextFileが終わって一つ目のループ抜けた後に、
FindCloseを何回も無限ループしてるからではないでしょうか?


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

Name: dic  ..熟練のプログラマー(69,369ポイント)   Date: 2010/06/03(木) 14:56   No:53467     
Title: Re:実行ファイルのsoundフォルダ内にある全てのwavファイルを取得する    
int dxLibのmain関数{

    FindFirstFile("\\sound\\*.wav", &fd); //

    while(1){

        do {
            /* 結果の表示 */
            DrawFormatString(400,200,GetColor(255,255,255),"%s",fd.cFileName);
        } while(FindNextFile(hFind, &fd));
   
    }

    /* 検索終了 */
    FindClose(hFind);

}

FindCloseの呼び出す位置が違ってますね


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



Name: しろ  ..初心者(8,935ポイント)   Date: 2010/06/03(木) 08:12   No:53416       
Title: 文字列と配列、関数について    
こんにちは。昨日の投稿に続けての質問になります。

どうも文字列の扱いに自信がなく(「やさしいC」という本を読みましたが、いろいろと説明が載ってない!)、以下の質問をさせていただきます。ちょっと長くなってしまいますが、お許しください。

http://karetta.jp/book-node/game-programming/235064

に以下のプログラムが記載されています。

-----

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

//SHIFT_JISの場合,上位バイトが0x81〜0x9F、0xE0〜0xFCの範囲に収まる

//code が日本語であるか判定する
//戻り値 1:日本語 0:日本語ではない
int isJapaneseCharacter(unsigned char code)
{
        if( (code >= 0x81 && code <= 0x9F) || 
                (code >= 0xE0 && code <= 0xFC) ) {
                        return 1;
        }
        return 0;
}

int main()
{
        char check_first[3] = "え";
        char check_second[3] = "下";
        char check_third[3] = "h";

        printf("「え」の場合, %d\n", isJapaneseCharacter( check_first[0] ) );
        printf("「下」の場合,%d\n", isJapaneseCharacter( check_second[0] ) );
        printf("「h 」の場合,%d\n", isJapaneseCharacter( check_third[0] ) );
        
        return 0;
}

-------

質問1

        char check_first[3] = "え";
        char check_second[3] = "下";
        char check_third[3] = "h";



        char check_first[2] = "え";
        char check_second[2] = "下";
        char check_third[1] = "h";

でも問題ないでしょうか?(「え」と「下」は2バイト文字、「h」は1バイト文字なので、という理解です)

--------

質問2

isJapaneseCharacter( check_thire[1] )でcheck_first[0] をcodeに渡している。
つまりcode='h'となっている。

ここで理解できないのが

code >= 0xE0という表記です。そもそも0xE0というのはポインタを表している(のだろう)と思うのですが、codeはあくまでcode='h'であり、ポインタを表すものではないような気がします。

質問3、たとえば以下のプログラムを作成したとき

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



#include <stdio.h>

void bcd(char *c){

    printf("%s",c);
    printf("%p",&c[0])
       
}

int main(void)
{
    char a[]="hello"; 

 bcd(a);
       
        
        return 0;
}


-----------------
これは配列a[]の先頭のポインタを引き渡すことでcを配列a[]とみなすんですよね(みなすという言い方はおそらく間違っていると思いますが、うまい表現が思い浮かびませんでした)。

(ちなみにちょっと話がそれますが「やさしいC」には配列とポインタが「密接な関係」にあるとき、ポインタを配列として扱うことができるとありました。「密接な関係」を参考所内で定義していないのでいったいなんのことなのかさっぱりでしたが、まぁ上のような感じで理解しています)

話がごちゃごちゃしてきましたが、要は質問2の部分がわかりません。参考書にあんまり詳しく載っていないこともあり、文字列についての理解があやしく、質問3も果たして自分の理解があっているのか疑問で質問させていただきました。

よろしくお願いいたします。



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


Name: toyo  ..熟練のプログラマー(47,732ポイント)   Date: 2010/06/03(木) 09:11   No:53421     
Title: Re:文字列と配列、関数について    
回答1
" "で囲まれた文字列は最後に文字列の終わりを示すナル文字('\0')が存在します
"え", "下"は3バイト、"h"は2バイトの領域が必要です
        char check_first[2] = "え";
        char check_second[2] = "下";
        char check_third[1] = "h"; 

は問題ありです。

回答2
0xE0はポインタではありません。
単なる整数の16進表記です。
(code >= 0xE0 && code <= 0xFC)

(code >= 224 && code <= 252)
と同じです。

回答3
確かに関数の引数に配列を渡すとポインタになりますが
配列とポインタはまったく別物と考えた方がいいと思います。
C言語ではこの辺の理解が一番難しい部分ではあります。



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

Name: たかぎ [URL]  ..ハッカー(198,017ポイント)   Date: 2010/06/03(木) 09:17   No:53422     
Title: Re:文字列と配列、関数について    
シフトJIS限定であれば、

>        char check_first[2] = "え"; 
>        char check_second[2] = "下"; 
>        char check_third[1] = "h"; 

これでも問題ないといえばないのですが、わかっていてやるならよいのですが、そうでなければ避けた方がよいでしょう。
シフトJISに決め打った最適化も然りです。
できれば、

        char check_first[] = "え"; 
        char check_second[] = "下"; 
        char check_third[] = "h"; 

このようにする方が無難です。


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

Name: しろ  ..中級者(9,226ポイント)   Date: 2010/06/03(木) 10:32   No:53433     
Title: Re:文字列と配列、関数について    
ご回答いただき、ありがとうございます。

>toyoさん

char型を16進数表記するとはいったいどういうことでしょうか?

これはchar a='c';のような文字だけではなく
char a="hello"などとした場合も同じようにaを16進数表記できるということでしょうか?
あと、上記のプログラムのように不等号をchar型の16進数表記したものに使っても問題ないですか?

(不等号は単なる「数字」の大小だけではなく、char型の16進数した場合の「数値」でも使用してOKということでしょうか?)

>toyoさん、たかぎさん

 char check_first[] = "え";  
 char check_second[] = "下";  
 char check_third[] = "h";  

と書く表記方法ですが、よくキーボードからの打ち込んだ文字列を格納する場合

char a[100];

などとして、「文字を多めに打ち込んでも問題ないように」と参考書等に書いてありますが、
a[]のようにすれば、どんなときでも問題ない、ということでしょうか?

本によっては結構混在しているのですが、使い分けについては特に記載がなかったもので……

(おそらくは)初歩的な質問(であろう)ばかりで申し訳ございません。よろしくお願いいたします。


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

Name: たかぎ [URL]  ..ハッカー(198,454ポイント)   Date: 2010/06/03(木) 10:45   No:53437     
Title: Re:文字列と配列、関数について    
> a[]のようにすれば、どんなときでも問題ない、ということでしょうか? 

そんなことはありません。
配列に書き込む場合は、必要な大きさを確保してください。
ただ、どんなに大きめに確保しても、あふれる可能性は常にあります。
結局は配列のサイズが足りない場合の処理も書かないといけませんので、極端に小さい場合を除けば、実行速度とメモリ使用量の効率に関わる問題でしかありません。
(初学者が勉強している間は、そこまで気を使わなくてもよいのかもしれませんが...)


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

Name: toyo  ..熟練のプログラマー(48,131ポイント)   Date: 2010/06/03(木) 11:00   No:53442     
Title: Re:文字列と配列、関数について    
char型は確かにcharacter(文字)で誤解を招くことがありますが実体はint型と同じ整数型の一種です
1バイトが8ビットの環境では符号つきchar型は-128から127までの整数を扱えます
昔のコンピュータの世界では英数文字その他で127文字もあれば事足りたので文字を扱う型にchar型と名前をつけただけだと思います
char a = 'c';
は人間にわかりやすく文字で書いているだけでコンピュータにとっては'c'もただの整数としか認識してないのです
char a = "hello"
は型が違うのでエラーになります(整数型にポインタを代入している)

char check_first[] = "え";   
のように宣言と同時に初期化をする場合、配列の数を指定しないとコンパイラが必要な分だけ自動的に確保してくれます
長い文字列で初期化するときいちいち文字数を数えなくていいし数え間違えてバグることもありません。


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

Name: たかぎ [URL]  ..ハッカー(198,570ポイント)   Date: 2010/06/03(木) 11:14   No:53444     
Title: Re:文字列と配列、関数について    
> char a = "hello" 
> は型が違うのでエラーになります(整数型にポインタを代入している) 

未定義の動作になる場合もありますが(ならない場合もあります)、エラーになるとは限りませんね。
# C++なら、コンパイルエラーになりますが...


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

Name: しろ  ..中級者(9,352ポイント)   Date: 2010/06/03(木) 11:49   No:53449 解決!     
Title: Re:文字列と配列、関数について    
>たかぎさん、とよさん

ご教授ありがとうございます。

・配列に書き込む場合は、必要な大きさを確保
・それ以外に配列に文字列を代入する場合は、a[]のように自動的に確保してもらう

という認識でいいわけですね。

なおchar a = "hello"  は書き間違いでした。
(あと"hello"はポインタなんですね!)

どうもありがとうございました!!


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

Name: たかぎ [URL]  ..ハッカー(198,661ポイント)   Date: 2010/06/03(木) 11:59   No:53452     
Title: Re:文字列と配列、関数について    
> (あと"hello"はポインタなんですね!) 

違います。
"hello"はchar[6]という配列型です。
配列型は、多くの演算において、暗黙的にポインタ型に変換されるというだけのことです。


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

Name: しろ  ..中級者(9,333ポイント)   Date: 2010/06/03(木) 12:02   No:53453 解決!     
Title: Re:文字列と配列、関数について    
なるほど!

理解できました! 重ね重ねありがとうございます!


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



Name: hiroboh  ..ぴよぴよ(265ポイント)   Date: 2010/06/03(木) 01:18   No:53388       
Title: 配列の演習問題について    
初めまして、最近C言語の勉強を始めました。hirobohと言います。
プログラム言語は今まで触ったこともありません。よろしくお願いします。

C言語の参考書を買ったのですが、演習問題の解答が載っておらず
よろしければ答えを見て頂きたいと思い、投稿しました。

コンパイラは GNU C(OSはLinux)と記載されていました。

次のプログラムは10+20の結果を画面に表示するプログラムです。

#include <stdio.h>
int main()
{
 int a[3]
 
 a[0] = 10
 a[1] = 20
 a[2] = a[0] +a[1];

 printf("%d,¥n",a[2]);
 return 0;
}

よろしくお願いします。


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


Name: たかぎ [URL]  ..ハッカー(197,327ポイント)   Date: 2010/06/03(木) 01:21   No:53389     
Title: Re:配列の演習問題について    
変わった書き方ですが、間違ってはいないと思います。
一点気になるのは、

>  printf("%d,¥n",a[2]); 

¥ではなく、\です。
Linuxの場合、EUCを使う場合でもUTF-8を使う場合でも、円記号ではなく逆斜線として表示されるはずです。


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

Name: hiroboh  ..ぴよぴよ(301ポイント)   Date: 2010/06/03(木) 01:29   No:53390 解決!     
Title: Re:配列の演習問題について    
早い解答ありがとうございます。
間違っていなくて安心しました。

¥は\と表すのですね、覚えておきます。


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

Name: たかぎ [URL]  ..ハッカー(197,361ポイント)   Date: 2010/06/03(木) 01:43   No:53391     
Title: Re:配列の演習問題について    
もう一点、見落としていました。

> int main() 

ここは、

int main(void)

と書きましょう。


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

Name: hoge  ..入門者(3,802ポイント)   Date: 2010/06/03(木) 02:19   No:53397     
Title: Re:配列の演習問題について    
> > int main() 

> ここは、

> int main(void)

> と書きましょう。


これは何故でしょう?

どちらでも同じ意味ではないでしょうか。


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

Name: たかぎ [URL]  ..ハッカー(197,645ポイント)   Date: 2010/06/03(木) 02:31   No:53399     
Title: Re:配列の演習問題について    
> どちらでも同じ意味ではないでしょうか。

違います。

int main()
{
  main(0, 0);
  return 0;
}

はコンパイルできますが、

int main(void)
{
  main(0, 0);
  return 0;
}

はコンパイルできません。
つまり、意味が異なるということです。



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

Name: hoge  ..入門者(3,913ポイント)   Date: 2010/06/03(木) 03:03   No:53401     
Title: Re:配列の演習問題について    
> 違います。

> int main()
> {
>   main(0, 0);
>   return 0;
> }

> はコンパイルできますが、

確かにGCCでは、コンパイルできますね。

しかし、そんな保証はないです。
関数定義(プロトタイプ宣言でない)で仮引数並びが空の場合、その関数は、仮引数をもたないことを意味します。
そして、仮引数の数と実引数の数が異なる関数呼出しをした場合の動作は、未定義です。



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

Name: toyo  ..熟練のプログラマー(47,531ポイント)   Date: 2010/06/03(木) 05:32   No:53404     
Title: Re:配列の演習問題について    
気になって調べてみたらCでは(C++ではなく)引数を省略したら可変引数になるような記事がありました
func( )はfunc(...)とみなされるという意味です
渡された引数にアクセスする手段はなさそうですが
C++ではfunc( )とfunc(void)は同じ意味になります


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

Name: たかぎ [URL]  ..ハッカー(197,676ポイント)   Date: 2010/06/03(木) 07:51   No:53409     
Title: Re:配列の演習問題について    
> しかし、そんな保証はないです。

保証はされます。

> 関数定義(プロトタイプ宣言でない)で仮引数並びが空の場合、その関数は、仮引数をもたないことを意味します。 

仮引数はありませんが、それはvoidを指定した場合と等価ではありません。


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

Name: たかぎ [URL]  ..ハッカー(197,715ポイント)   Date: 2010/06/03(木) 08:11   No:53415     
Title: Re:配列の演習問題について    
失礼。

> > しかし、そんな保証はないです。 
> 保証はされます。 

こちらは未定義ですね。


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



Name: しろ  ..初心者(7,590ポイント)   Date: 2010/06/02(水) 22:02   No:53350       
Title: プログラムについて質問です。    
こちらのサイトにある以下のプログラムについて質問です。


http://karetta.jp/book-node/game-programming/235062
(一部抜粋です。お手数ではございますが、上記のサイトも併せてご参考ください)


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

        //指定した位置からlen文字分表示する
        for( i = 0; i < len && message[ start + i ] != '\0'; i += 2 ) {
                printf("%c", message[ start + i ] );    //(1)
                printf("%c", message[ start + i + 1 ]);  //(2)
        }
        printf("\n");
}

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

なぜ(1)(2)のようにprintf関数を2行準備しないとうまく作動しないのかわかりません(もちろん「日本語はchar 2文字で表現している」という説明に対応しているのだと思いますが)。

もう少しそのあたりを詳しく説明してくださる方がいらっしゃいますと大変助かります。
何とぞよろしくお願いいたします。
(すべてのプログラムを転載するのはいろいろ問題がある気がしたので、一部抜粋にいたしました)





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


Name: box  ..ハッカー(154,439ポイント)   Date: 2010/06/02(水) 22:27   No:53355     
Title: Re:プログラムについて質問です。    
>なぜ(1)(2)のように printf関数を2行準備しないとうまく作動しないのかわかりません

こう書かれているということは、printfを1つにまとめて
うまくいかなかったのですね。
もし、1つにまとめてうまくいったとすれば、その質問が出てくることが
おかしいですから。

そこで、1つにまとめてうまくいかなかったときのソースコードを見せてください。


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

Name: HK  ..初心者(5,126ポイント)   Date: 2010/06/02(水) 22:45   No:53360     
Title: Re:プログラムについて質問です。    
簡単に言うと、文字は種類ごとに番号付けされています。(文字コードとか言いますよね)

たとえばaは61番です。Mは4d番です。(ただし16進数)
このように半角の文字は2ケタで書けます。
しかし、この世に文字は無数にあるので、2ケタまでしかない番号では扱いきれません。
そこで、全角文字は 2ケタ+2ケタ で表すことになっています。
たとえば「あ」は 82,a0 番です。「院」は89,40 番です。


しろさんの書かれたURLのリンク先での主題は、日本語の表示の仕方とのことですので、
全角文字を扱います。

message[0] に89が入っていて、
message[1] に40が入っていたとします。そこで

printf("%c", message[0]);
printf("%c", message[1]);

と書けば、89 40 という文字番号に相当する文字「院」が描画されます。

ちなみに上記の「文字の番号」は覚える必要はありません。
http://charset.7jp.net/sjis.html
 編集済み


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

Name: しろ  ..初心者(7,721ポイント)   Date: 2010/06/03(木) 06:25   No:53405     
Title: Re:プログラムについて質問です。    
>BOXさん
>HKさん

ご説明ありがとうございます。ただおっしゃることは理解できるのですが

 for( i = 0; i < len && message[ start + i ] != '\0'; i++ ) {
                printf("%c", message[ start + i ] );
 
        }

ではだめなのでしょうか。(i+=2をi++、中身を一行にしました)
これでも同じものが表示されるような気がするのですが・・・・・・


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

Name: toyo  ..熟練のプログラマー(47,584ポイント)   Date: 2010/06/03(木) 07:15   No:53406     
Title: Re:プログラムについて質問です。    
messageが2バイト文字であれば結果は同じですね
printfを1行にしても1文字表示するのに2回のループが必要なだけで問題ありません
2行のほうは1回のループで1文字を表示したいというプログラマーの意図が読み取れます


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

Name: しろ  ..初心者(7,679ポイント)   Date: 2010/06/03(木) 07:23   No:53407 解決!     
Title: Re:プログラムについて質問です。    
>toyoさん

なるほど。一行でも問題ないのですね。
2行で書かなければいけない理由があるのではないか? と疑っていました。

皆様ありがとうございました。


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



Name: 炎獄  ..ぴよぴよ(36ポイント)   Date: 2010/06/02(水) 21:11   No:53341       
Title: 初心者なんで、親切な人教えてください!お願いします^^    
龍神録プログラミングの館の2.「まずは実行させてみよう」のやり方がわかりません
できるだけ、くわしく教えてもらえませんか??
初心者卒業した〜い♪!!


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


Name: たかぎ [URL]  ..ハッカー(196,054ポイント)   Date: 2010/06/02(水) 21:12   No:53342     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
> 初心者卒業した〜い♪!!

本気でそう思うのなら、他人に頼る前にまずは自分でやってみることです。


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

Name: 炎獄  ..ぴよぴよ(110ポイント)   Date: 2010/06/02(水) 21:29   No:53344     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
はい。・・・すみません
ですが、やっぱりmain.cppがでてきません><
自分が頭が悪いのはわかっているけど、どうしてもやりたいんです!!
おねがいです、できるかぎり、くわしく教えてくれませんか??


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

Name: たかぎ [URL]  ..ハッカー(196,115ポイント)   Date: 2010/06/02(水) 21:44   No:53347     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
> やっぱりmain.cppがでてきません

「でてくる」とは、どうなることを期待しているのでしょうか?
どうなることを期待して、何をやって、結果どうなったのかを示していただかないと、どうすることもできません。


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

Name: Ma  ..ハッカー(103,520ポイント)   Date: 2010/06/02(水) 22:02   No:53351     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
自分で main.cpp は作ってください。
VC++2008なら、ソリューションエクスプローラー内のソースフォルダを右クリック→追加→新しい項目→C++ファイルです。

あと、龍神録プログラミングの館の前に、ゲームプログラミングの館はやりましたか?
もし、飛ばしているようならゲームプログラミングの館からやるべきです。


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

Name: 炎獄  ..ぴよぴよ(164ポイント)   Date: 2010/06/02(水) 22:28   No:53356     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
すみません・・・・
ゲームプログラミングの館をやってませんでした。。。。
本当にすみません・・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,196,298ポイント)   Date: 2010/06/02(水) 23:01   No:53365     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
同じ話題はなるべく同じトピックにお願いしますね。
VisualStudioがインストールされていないようなので、まずはコンパイラを導入するところからやってみましょう。

まずはこちらをお読みください。

C言語を始めるには?
http://dixq.net/vcpp.html

後はゲームプログラミングの館をご覧になればいいと思いますが、
C言語を全く知らない状態ではこちらを見ても意味が解らないと思います。
現時点でC言語の経験はおありですか?

もしなければ入門サイトなどを見てやっていけそうでしょうか?
http://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E5%85%A5%E9%96%80&lr=lang_ja


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

Name: ムンバ  ..熟練のプログラマー(56,889ポイント)   Date: 2010/06/03(木) 00:28   No:53381     
Title: Re:初心者なんで、親切な人教えてください!お願いします^^    
炎獄さん、こんばんは。

私は、C言語(本当はC++での予定だったのですが)などで
とにかく、内輪(身内)でできるネットゲームを作りたい!
と思い、検索エンジンで検索しまくった結果
1年半ほど前こちらのサイトにたどり着きました。
以来こちらで、とてもお世話になっている者です。

>初心者卒業した〜い♪!!
 
とおっしゃってますが、
何かゲームを作って、C言語(など)プログラミングの初心者を卒業したいのか?・・・
あっ?!龍神録プログラミングの館に挑戦しようとしてらっしゃるのでしたら
Maさんがおっしゃっている、こちらのサイト内の「ゲームプログラミングの館」
私も、ここから始めました。

どこまでが初心者で、どこからが初心者ってのは最近、自分で決める事にしてます。
今の私は、こちらの掲示板でのランクで表現するとすると
「ぴよぴよのプログラマー」だと思ってますので。w

自分自身、今も初心者だと思ってますので読み流して頂いて良いと思うのですが
一応、どの様な過程を辿ったか、箇条書きにさせて頂きます。

・何でもいいから、内輪(うちわ)でできるネットゲームを作りたいと思った。
・C言語(C++)と言うプログラムでゲームが作れると知人からの情報やネットで知った。
・ネットで本を探して自分に合いそうな
 「これからはじめるC言語の本」(著者:朝井 淳 発行所:葛Z術評論社)1980円を購入。
・読み終わった後、これでゲームが作れるかも?と思って
 色々と検索してたら、このサイトにたどり着いた。
・何をやりたくて、どうしたらいいか、こちらの掲示板で聞いた。
・DXライブラリというライブラリを使って、こちらのサイトを参考に
 簡単な じゃんけんゲーム・落ち物ゲーム・シューティングゲーム
 を作れる様になれば、自分が作りたいゲームを作れると思うと、教えて頂いた。

その後、こちらのサイトの「ゲームプログラミングの館」で勉強を始めました。
途中、知識が足りないと思い
「猫でもわかる C言語プログラミング」(著者:粂井康孝 発行所:潟\フトバンククリエイティブ)1900円
をネットで検索して購入したが、バカな私には難しい本だったので
「苦しんで覚えるC言語」というサイト http://9cguide.appspot.com/
にネットで検索してたどり着き、「猫でも・・・」の本で解らない所は
「苦しんで覚えるC言語」の、ご解説でだんだんと理解できる様になってきました。
  ↑今も何かあると、まずはこのサイトを参考にさせて頂いてます。

以下、私が「ゲームプログラミングの館」で勉強する前にした順序(準備)です。

  VisualC++ 2008 (今は VisualC++ 2010 が最新バージョンらしいですが)をダウンロード
   ↓
  DXライブラリ置き場 HOME http://homepage2.nifty.com/natupaji/DxLib/
   ↓
  DXライブラリのダウンロード http://homepage2.nifty.com/natupaji/DxLib/dxdload.html
  (私は VisualC++ 2008用(略)をダウンロード)
   ↓
  DXライブラリの使い方 http://homepage2.nifty.com/natupaji/DxLib/dxuse.html
   ↓
  VisualC++ 2008 Express Edition を使用した場合のDXライブラリの使い方
   http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html
   ↑↓
  このページのサンプルソースで、「点」が表示される事を確認。
   ↓↑
  こちらのサイトの「ゲームプログラミングの館」の勉強開始。

以上〜!だったと思います。^^
途中何度も、こちらの掲示板で(今でも)質問させて頂いてます。
(誤字・脱字、リンク先間違いなどあれば、ご指摘下さい。)

自作ゲーム、がんばりましょう〜っ!<私も^^

-------------------------------------------------------------------------------
おっと・・・return を探しに行かないと、た○ぎさんに怒れるので
今日は、この辺で失礼します。(謎笑
おやすみなさい。w

---↓寝る前にPS追加です。すみません。---
 タイトルに「親切な人教えてください」とありますが
 自分が親切な人だと思ったから、レスしたのではありませんし
 自分が苦労して、今の自分がある。とも思ってません。
 勘違いしないで下さいね。
 まずは
 自分で考える→調べる→考える→調べる(繰り返して)→断末魔(この世の終わり)と思ったら聞く。
 今は、こんな感じです。^^
  編集済み


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



Name: HK  ..入門者(4,873ポイント)   Date: 2010/06/02(水) 22:19   No:53353       
Title: これは何の略?(Win32API)    
Win32APIの勉強をしています。
型の名前や、一般的に用いられている変数名が
何の英単語の略なのかを知りたいのですが、そのような
用語集的なサイトは無いのでしょうか…

『猫でもわかる』シリーズの本で、たとえば、

//ウィンドウクラス
ATOM InitApp(HINSTANCE hInst)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;    //プロシージャ名
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInst;//インスタンス
    ……(略)


という書かれ方がされています。
wc はウィンドウクラスの略というのはわかります。
では cbSize の cb って何の意味なのでしょうか。

かなりどうでもいい様なことを質問させていただいてますが、
単語の意味がわからないと、呪文の勉強をしているように感じて
なかなか前に進みません… 


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


Name: たいちう  ..比類無きプログラマー(90,156ポイント)   Date: 2010/06/02(水) 23:00   No:53364     
Title: Re:これは何の略?(Win32API)    
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95

> では cbSize の cb って何の意味なのでしょうか。

cbは載ってなかった。
"count of bytes"

別にこだわる必要はないと思いますが、気になるならばここで聞いたら良いのでは?


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

Name: シエル  ..かけだし(1,251ポイント)   Date: 2010/06/02(水) 23:10   No:53369     
Title: Re:これは何の略?(Win32API)    
私も意味の分からない単語はたくさんあります(笑)

意味は私も分からないので、答えられませんが、
やっていくうちにだんだん覚えていけると思います。

私もWindows APIの勉強したときは、コードの量や知らない型、構造体、引数の多さなどに
愕然としましたが、インテリセンス機能に助けられて、知らない間に勝手に頭の中で
覚えていくことが出来ました。

単語の意味ではなく、何を意味するものなのかを考えてやっていけば、
気にならなくなってきます。


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

Name: HK  ..初心者(5,333ポイント)   Date: 2010/06/02(水) 23:23   No:53373 解決!     
Title: Re:これは何の略?(Win32API)    
>>たいちうさん
目からウロコでした。
ハンガリアン記法で検索すれば色々出てきますね。

ハンガリアン記法の欠点について述べてる記事も結構見つけました。
「暗号めいている」「可読性が低い」など言われてますね。
私もまさにそう感じている内の一人です。

>>シエルさん
やはり最初は習うより慣れよということでしょうか 笑
気楽にやっていこうと思います。

どうでもいい質問にお答えして頂き、ありがとうございました。


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



Name: たろう  ..上級者(21,518ポイント)   Date: 2010/06/02(水) 19:42   No:53326       
Title: 暗号化の本やサイトについて    
暗号化について勉強したいと思っているのですが、暗号化について載っている本やサイトなどありましたら教えてください。

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


Name: softya [URL]  ..ハッカー(173,716ポイント)   Date: 2010/06/02(水) 22:07   No:53352     
Title: Re:暗号化の本やサイトについて    
私はこれを使っています。
http://www.hyuki.com/cr/
実用度という意味で推薦します。


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

Name: たろう  ..上級者(21,546ポイント)   Date: 2010/06/02(水) 22:23   No:53354     
Title: Re:暗号化の本やサイトについて    
softyaさんいつもありがとうございます。
ありがたく参考にさせていただきます。


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



Name: ユリアン  ..ぴよぴよ(259ポイント)   Date: 2010/06/02(水) 13:29   No:53268       
Title: バイナリデータの文字列変換    
バイナリを文字列に変換する方法で困っています・・・

数値がバイナリになっていて、日本語文字列は文字列になっているdatファイルを読み込みました。
datをテキストエディタで見たときには"  東京"という表示になっており、
バイナリエディタでは"01000000938C8B9E"となっています。
(もともとのデータは"1東京"です。)

ひとまずdatをバイナリで読み込み、メモリ上に"01000000938C8B9E"は確保出来たのですが、
東京という文字列に戻す方法がわからなくて困っています。
VBAでのChr()関数のようなものは、CかC++にはないのでしょうか?

どなたか方法等ご存知でしたら教えてください。
よろしくお願いいたします。


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


Name: たかぎ [URL]  ..ハッカー(194,394ポイント)   Date: 2010/06/02(水) 13:45   No:53269     
Title: Re:バイナリデータの文字列変換    
> VBAでのChr()関数のようなものは、CかC++にはないのでしょうか? 

そんなものは不要です。
該当する部分だけを抽出し、charの配列に入れればOKです(ナル文字を付加するのを忘れないように)。
C/C++そのものに限った話ではありませんが、多バイト文字やエンコーディングについても調べておくことをお勧めします。


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

Name: ユリアン  ..ぴよぴよ(407ポイント)   Date: 2010/06/02(水) 17:05   No:53295     
Title: Re:バイナリデータの文字列変換    
ありがとうございます、そのまま突っ込んで文字になることを確認しました。
しかしながらメモリアクセスで戸惑っています・・・

上記のdatファイルをvoid* addr に置いているのですが、
memcopy( strings , addr + 4 , 8);
とするとerror C2036: 'void *' : サイズが不明です。とコンパイルエラーになりました。
第二引数のアドレス指定はどのようにすればいいのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(195,319ポイント)   Date: 2010/06/02(水) 17:10   No:53296     
Title: Re:バイナリデータの文字列変換    
voidは不完全型ですので、void*に対して加減算を行うことはできません。
いったんchar*などにキャストしてから加減算を行うようにしてください。


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

Name: ユリアン  ..ぴよぴよ(495ポイント)   Date: 2010/06/02(水) 21:13   No:53343 解決!     
Title: Re:バイナリデータの文字列変換    
ありがとうございます。
無事に解決できました!すごく助かりました。
でもアドレスに+1したら4byteシフトされてしまってちょっと???です。
datファイルの後半には1byteのデータやビットデータもあるので、
これからちょっと悩んでみます。


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



Name: ひよこ  ..比類無きプログラマー(84,479ポイント)   Date: 2010/06/02(水) 17:50   No:53304       
Title: カレントディレクトリについて    
私は今、簡単な音楽プレイヤーを作っているのですが、
カレントディレクトリがコマンドラインをチェックすると変わってしまうのですが、
これを解決しようとSetCurrentDirectoryを使ったら0が帰ってきて失敗しているのですが、
どこが悪いと思われますか?

//file :ファイル名 curent:ファイルパスを返すポインタ
void Set_curent(TCHAR *file,TCHAR **curent){
    int i=0;
    while(file[i]!='\0'){
        if(file[i]=='.'){//拡張子だったら文字の終わりにして終了
            file[i]='\0';    
            break;
        }
        i++;
    }
    *curent=new TCHAR [i+1];

    _tcscpy(*curent,file);
}

int argc;
    
LPTSTR *argv;
        
//コマンドラインを手に入れる
argv = CommandLineToArgvW(GetCommandLine(), &argc);
    
//コマンドライン引数をチェック    
Check_Comand(argc,argv);

TCHAR *curent;
        
Set_curent(argv[0],&curent);
        
//メモリ解放
LocalFree(argv);
    
//カレントディレクトリを実行ファイルのところと同じところにする。
if(SetCurrentDirectory(curent)==0)
    Error_MB(NULL,"error");
    
//実行ファイルのパスを表示
MessageBox(NULL,curent,curent,MB_OK);
    
TCHAR buf[MAX_PATH];

//カレントディレクトリが設定されたかチェック
if(GetCurrentDirectory(MAX_PATH, buf)==0)
    ;//まだ、失敗した時の処理を書いてません
    
//カレントディレクトリの表示ここがコマンドラインの場所になってしまいます。
MessageBox(NULL,buf,buf,MB_OK);


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


Name: toyo  ..熟練のプログラマー(47,595ポイント)   Date: 2010/06/02(水) 19:03   No:53319     
Title: Re:カレントディレクトリについて    
curent(正確にはcurrentです)にはディレクトリじゃなくて拡張子を除いたファイル名まで入ってるんですよね
SetCurrentDirectoryにファイル名を指定したらエラーになると思いますよ


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

Name: ひよこ  ..比類無きプログラマー(84,749ポイント)   Date: 2010/06/02(水) 21:05   No:53340 解決!     
Title: Re:カレントディレクトリについて    
あ、本当ですね。ファイル名まで入ってました。
ファイル名が入らないようにしたらできました。
toyoさん、ありがとうございました。


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



Name: hayakawa  ..ぴよぴよ(552ポイント)   Date: 2010/05/30(日) 13:45   No:53070       
Title: _sleep()の動きについて    
どうしてもわからないことがあり、質問させていただきます。
_sleep(1)を1000回実行する以下のサンプルプログラムを作成し、実行すると
pcによって出力される結果が異なります。
出力結果を<out1>,<out2>としてsample programの下に示します。
<out1>では毎回_sleep()関数が機能しているようですが<out2>では
毎回は機能していないようです。

なぜこのようなことがおこるのかご教示願えませんか?
よろしくお願いします。


<sample program>
--------------------------------------
#include <stdlib.h>
#include <stdio.h>

#include <time.h>


int main()
{
    int i;
    clock_t        tick, base1, base2;
    FILE    *log_file;


    log_file = fopen("LOGFILE.txt", "w");

    base1 = clock();

    printf("Start test program\n");

    for (i = 1; i <= 1000; i++) {


        base2 = clock();

        _sleep(1);

        tick = clock();
        fprintf(log_file,"  sleeep time %d mS\n", tick - base2);
        fprintf(log_file,"    tick %d mS  base2 %d mS\n", tick, base2);


    }

    tick = clock();
    fprintf(log_file,"  total time %d mS\n", tick - base1);
    fprintf(log_file,"    tick %d mS  base1 %d mS\n", tick, base1);

    printf("End test program\n");


    return 0;
}
-----------------------------------------

<out1>
---------------------
  sleeep time 10 mS
    tick 20 mS  base2 10 mS
  sleeep time 10 mS
    tick 30 mS  base2 20 mS
  sleeep time 10 mS
    tick 40 mS  base2 30 mS
  sleeep time 10 mS
    tick 50 mS  base2 40 mS
  sleeep time 10 mS
    tick 60 mS  base2 50 mS
  sleeep time 10 mS
    tick 70 mS  base2 60 mS
  sleeep time 10 mS
    tick 80 mS  base2 70 mS
  sleeep time 10 mS
    tick 90 mS  base2 80 mS
  sleeep time 10 mS
    tick 100 mS  base2 90 mS
  sleeep time 10 mS
    tick 110 mS  base2 100 mS
  sleeep time 10 mS
    tick 120 mS  base2 110 mS
  sleeep time 10 mS
    tick 130 mS  base2 120 mS
  sleeep time 10 mS
    tick 140 mS  base2 130 mS
  sleeep time 10 mS
    tick 150 mS  base2 140 mS
  sleeep time 10 mS
    tick 160 mS  base2 150 mS
  sleeep time 10 mS
    tick 170 mS  base2 160 mS
           .
           .
           .
       以下省略
---------------------
<out2>
---------------------
  sleeep time 0 mS
    tick 0 mS  base2 0 mS
  sleeep time 15 mS
    tick 15 mS  base2 0 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 0 mS
    tick 15 mS  base2 15 mS
  sleeep time 16 mS
    tick 31 mS  base2 15 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 0 mS
    tick 31 mS  base2 31 mS
  sleeep time 16 mS
    tick 47 mS  base2 31 mS
  sleeep time 0 mS
    tick 47 mS  base2 47 mS
  sleeep time 0 mS
    tick 47 mS  base2 47 mS
           .
           .
           .
       以下省略
---------------------


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


Name: ookami  ..上級者(17,338ポイント)   Date: 2010/05/30(日) 16:05   No:53078     
Title: Re:_sleep()の動きについて    
http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/_sleep_xml.html
↑ここによりますと、
>停止時間の精度は,100 分の 1 秒またはオペレーティングシステムクロックの精度のどちらか低い方になります。 
ということで、環境によって結果が異なるのが前提のようです。


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

Name: hayakawa  ..ぴよぴよ(683ポイント)   Date: 2010/05/30(日) 17:44   No:53096     
Title: Re:_sleep()の動きについて    
回答ありがとうございます。m(__)m
私もこのURLは確認しました。
>停止時間の精度は,100 分の 1 秒またはオペレーティングシステムクロックの精度のどちらか低い方になります。
と書かれていますが、0カウントというのはないのではと思うのですが...。


また、同じPC(GateWay960ハード構成は同一)で同じO/S(Windows NT4.0 sp6)の2つのPCでも
片方は<OUT1>の様に_sleep()関数は毎回確実に作動するのにもう一方は<OUT2>の様に確実に作動しないという事象が発生しました。
この違いがなぜ発生するのかまったくわかりません。
よいアドバイスがありましたら是非ご教示ください。



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

Name: ideyan  ..初心者(5,375ポイント)   Date: 2010/05/30(日) 19:04   No:53101     
Title: Re:_sleep()の動きについて    
とりあえず、単位がmsなら
tick - base2 ではなく
 (tick - base2)*1000.0f/CLOCKS_PER_SEC
じゃないかなと思います。
%dなら1000.0fじゃなくて1000でも同じですが。。。
(CLOCKS_PER_SECが1000で、わざとそうしてるなら
ここは気にしないでください)

そもそも、↑のリンク先の_sleep()の説明を見ると引数は秒ですよね?
_sleep(1)で1秒止まるなら、ちゃんとした場合でも
10msでなく1000msが出るはずだと思うのですがそうはなってませんよね。

で、clockがプロセスが起動してから使用した時間を通知するとするなら、
sleepしてる間は他プロセスにCPUの使用権がいってるわけだから
数値は増えないんじゃないかと。

カウントが10だったり0だったりするのはそれこそ精度の違いで、
私の環境の場合、CLOCKS_PER_SECが1000でした。
つまり、clock()は1ms単位でしか刻まれないので
1ループにかかった時間がsleep()を除いて1ms以下では
まだカウントが変わらず差分が0になっているのだと思います。

(色々書きましたが、私も今ちょこっと調べてみただけなので
正しいかはわかりません……)





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

Name: dic  ..熟練のプログラマー(68,619ポイント)   Date: 2010/05/30(日) 20:47   No:53107     
Title: Re:_sleep()の動きについて    
それほどまでの精度となると

i++;

のインクリメントだけでも1ms秒はかかるのではないでしょうか
実際に計ったわけではないので厳密にはわかりませんが

さらに fprintf() 関数が1ms秒で終わるということが前提でハードウェアの処理能力がないと
期待している精度は出ないでしょうね
メモリアクセス、メモリ上(でしょう)の数字の計算、関数の呼び出し、戻り値の処理
オペレーティングシステムの精度も考慮しないといけないはず

    for (i = 1; i <= 1000; i++) { 


        base2 = clock(); 

        _sleep(1); 

        tick = clock(); 
        fprintf(log_file,"  sleeep time %d mS\n", tick - base2); 
        fprintf(log_file,"    tick %d mS  base2 %d mS\n", tick, base2); 


    } 



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

Name: hayakawa  ..かけだし(2,002ポイント)   Date: 2010/05/30(日) 21:20   No:53111     
Title: Re:_sleep()の動きについて    
ideyanさん、いろいろと調査頂き本当にありがとうございます。m(__)m

<out1>,<out2>どちらのPCもCLOCKS_PER_SECは1000です。
でsample programにより_sleep(1)を1000回繰り返すと
実際に処理にかかる時間は<out1>の場合10秒程度であり、<out2>の場合2秒程度となります。

また、それぞれ処理の最後に表示される'total time'は
次のように表示され、<out1>のtotal time 10014 mSと、<out2>のtotal time 1954 mS
は実際に処理にかかる時間と合致します。

そのため、やはり<out2>のPCの場合、_sleep()関数はまれにしか
実行されていないように思われます。
いかがでしょう?

皆さんお手数おかけします、よろしくお願いします。


<out1> 
--------------------- 
  sleeep time 10 mS
    tick 10 mS  base2 0 mS
  sleeep time 10 mS
    tick 20 mS  base2 10 mS
  sleeep time 10 mS
    tick 30 mS  base2 20 mS
  sleeep time 10 mS
    tick 40 mS  base2 30 mS
  sleeep time 10 mS
    tick 50 mS  base2 40 mS
  sleeep time 10 mS
    tick 60 mS  base2 50 mS
  sleeep time 10 mS
    tick 70 mS  base2 60 mS
  sleeep time 10 mS
    tick 80 mS  base2 70 mS
  sleeep time 10 mS
    tick 90 mS  base2 80 mS
  sleeep time 10 mS
    tick 100 mS  base2 90 mS
  sleeep time 10 mS
    tick 110 mS  base2 100 mS
  sleeep time 10 mS
    tick 120 mS  base2 110 mS
  sleeep time 10 mS
    tick 130 mS  base2 120 mS
  sleeep time 10 mS
    tick 140 mS  base2 130 mS
  sleeep time 10 mS
    tick 150 mS  base2 140 mS
  sleeep time 10 mS
    tick 160 mS  base2 150 mS
  sleeep time 10 mS
    tick 170 mS  base2 160 mS
  sleeep time 10 mS
    tick 180 mS  base2 170 mS
           . 
       途中省略 
           . 
  sleeep time 10 mS
    tick 10014 mS  base2 10004 mS
  total time 10014 mS
    tick 10014 mS  base1 0 mS
--------------------- 

<out2> 
--------------------- 
  sleeep time 0 mS
    tick 0 mS  base2 0 mS
  sleeep time 16 mS
    tick 16 mS  base2 0 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 0 mS
    tick 16 mS  base2 16 mS
  sleeep time 16 mS
    tick 32 mS  base2 16 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 0 mS
    tick 32 mS  base2 32 mS
  sleeep time 15 mS
    tick 47 mS  base2 32 mS
           . 
       途中省略 
           . 
  sleeep time 0 mS
    tick 1954 mS  base2 1954 mS
  total time 1954 mS
    tick 1954 mS  base1 0 mS
--------------------- 



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

Name: hayakawa  ..かけだし(2,470ポイント)   Date: 2010/05/30(日) 22:51   No:53119     
Title: Re:_sleep()の動きについて    
dicさん、このsample programにて_sleep()関数を確認することになった経緯をご説明します。

ある製品を試験する試験装置に組み込まれたプログラムの処理の中で頻繁にデジタル通信を行っており
確実に通信を行うためにデータの受け渡しの前に_sleep(1)を挿入しておりました。
で、ある時期に新プログラムの検証用に新しいHDを用意し(2つのHDについて。O/Sはwindows nt 4.0 sp6で同様。器材ドライバも同様。VXIドライバのみバージョンアップ)それを使用して試験プログラムの検証を
実施したところ、試験時間が3時間45から4時間半と大幅に伸びました。

遅延の原因を調査したところ、どうやらこれまでのHDを使用した場合は_sleep(1)が毎回確実に
動作していないためにその分処理が早かったことがわかりました。

そこで_sleep(1)を1000回実施するsample programを作成し、2つのHDでそれぞれ_sleep関数が確実に
動作するか確認することにしました。
すると、やはりこれまで使用していたHDでは_sleep(1)が毎回確実に動作せず、検証用に用意したHDでは
1000回全て確実に動作していました。
(注意、今回出力例として掲載した<OUT1>,<OUT2>のデータはこの2つのHDを使用した時のものではありません。)
そこで、これまで使用していたHDでも_sleep(1)が確実に動作するようにする方法はないか、その手がかりが
つかめればと今回、この質問を投稿させていただきました。


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

Name: ookami  ..上級者(17,823ポイント)   Date: 2010/05/31(月) 23:01   No:53189     
Title: Re:_sleep()の動きについて    
環境依存なので推測ですが、たぶん、

>_sleep()関数はまれにしか実行されていない

というより、out2では、「_sleep(1)で実際に1ms停止しいるが、clock()が精度が悪くて同じ値を返しているので 0ms と表示されている」のではないでしょうか。out1では「_sleep(1)で10msスリープしている」ように思います。

ループの中でIOせずに、
t=clock();
for(i=0;i<1000;i++) {
    _sleep(1);
}
printf("%d\n",clock()-t);
とした時の結果は、環境1と2でどうなりますか?


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

Name: dic  ..熟練のプログラマー(68,867ポイント)   Date: 2010/06/01(火) 12:39   No:53212     
Title: Re:_sleep()の動きについて    
マルチタスク
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%82%B9%E3%82%AF
>一方、OSがCPU時間を管理する必要があり、また、一定時間毎にタスク切り替え処理が発生するため、
>処理にはコストがかかる
を読んでみるといいかもしれません

Windows NT SP6 とあるのでマルチタスクを採用しているOSです
_sleep(1); が成功していても他のプロセスにもCPUが割り当てられる可能性が高いため
仮に成功していても 1ms 秒以内にもとのプロセスにCPUが割り当てられる可能性がない
ということです

OSが最適化をかけて実行していている場合もあります
コンパイラが最適化をかけている場合もあります


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

Name: たいちう  ..比類無きプログラマー(89,596ポイント)   Date: 2010/06/01(火) 14:18   No:53213     
Title: Re:_sleep()の動きについて    
> それほどまでの精度となると

> i++;

> のインクリメントだけでも1ms秒はかかるのではないでしょうか
> 実際に計ったわけではないので厳密にはわかりませんが

発言の趣旨が分かりませんが、
もしもインクリメントに1msかかるとすると、
for (int i = 0; i < 10000; i++) { ; }
を抜けるのに10秒かかってしまいますよ。

今時のPCの場合、インクリメントにかかる時間は、
1ms(milli second : 10^-3秒)ではなく、
1ns(nano second : 10^-9秒)のオーダーです。


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

Name: やんち [URL]  ..かけだし(1,449ポイント)   Date: 2010/06/01(火) 14:50   No:53214     
Title: Re:_sleep()の動きについて    
今、気が付いたんですが、
clock()関数は、プロセスのCPU使用時間を計測する関数だったと思うので、
_sleep()関数が、CPUを占有せずに、OSに返しているなら、
経過時間は計測出来ないかもしれませんよ。


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

Name: dic  ..熟練のプログラマー(68,988ポイント)   Date: 2010/06/01(火) 16:57   No:53217     
Title: Re:_sleep()の動きについて    
>たいちうさん

>for (int i = 0; i < 10000; i++) { ; }
0(ゼロ)が一個おおいですよね^^;

>今時のPCの場合、インクリメントにかかる時間は、 
>1ms(milli second : 10^-3秒)ではなく、 
>1ns(nano second : 10^-9秒)のオーダーです。
実際に計ったわけではないので厳密にはわかりませんが
そうなのでしょうかね


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

Name: たいちう  ..比類無きプログラマー(89,713ポイント)   Date: 2010/06/01(火) 17:35   No:53220     
Title: Re:_sleep()の動きについて    
> >for (int i = 0; i < 10000; i++) { ; }
> 0(ゼロ)が一個おおいですよね^^;

多くありません。1ms * 10000 = 10sec です。
十分長い時間を体感するため、10秒を計算結果にしています。


> 実際に計ったわけではないので厳密にはわかりませんが
> そうなのでしょうかね

私も計ったことはなく、今計ることに意味があるとも思いませんが、
あまりにも桁違いな予想が書かれていたのでしたので、
指摘させてもらいました。


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

Name: dic  ..熟練のプログラマー(69,044ポイント)   Date: 2010/06/02(水) 07:06   No:53250     
Title: Re:_sleep()の動きについて    
>たいちうさん
すいません 質問者に対して回答しているので
たいちうさんの返答の内容がよくわからないです^^;

質問がそれるのでやめませんか?


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

Name: たいちう  ..比類無きプログラマー(89,717ポイント)   Date: 2010/06/02(水) 08:48   No:53255     
Title: Re:_sleep()の動きについて    
> 質問がそれるのでやめませんか?

dicさんが理解できないならそれでも結構ですが、
あまりにもおかしい書き込みに対しては、
今後も指摘させていただきますね。


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

Name: たかぎ [URL]  ..ハッカー(194,327ポイント)   Date: 2010/06/02(水) 09:00   No:53256     
Title: Re:_sleep()の動きについて    
> 質問がそれるのでやめませんか? 

そんなにそれてはいないと思いますよ。
一応、私もコメントしておくと...

> i++; 
> のインクリメントだけでも1ms秒はかかるのではないでしょうか 

Windows NTとかであれば、よほど性能の悪いインタープリタでもそれはないと思います。
あらゆる環境を考慮するなら、32kHzのクロックをプロセッサ内部で分周して使っているようなマイコンなら、1ms以上かかることもあり得ます。比較的ハイエンドな機種でも、消費電力を抑えるために低速モードが用意されていることはよくありますので。

> 実際に計ったわけではないので厳密にはわかりませんが 

計測しなくても概算は可能です。

あと、

> もしもインクリメントに1msかかるとすると、 
> for (int i = 0; i < 10000; i++) { ; } 
> を抜けるのに10秒かかってしまいますよ。 

intにvolatile修飾子がないので、ループ全体が削除される可能性が高いですね。


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

Name: ookami  ..上級者(18,360ポイント)   Date: 2010/06/02(水) 09:09   No:53257     
Title: Re:_sleep()の動きについて    
> やんちさん
http://www9.plala.or.jp/sgwr-t/lib/clock.html
↑のように、clock()関数は「プログラム実行開始からの経過時間」なので、問題ないと思いますが、もしかしてコンパイラによって違ったりするんでしょうかね?

> dicさん、たいちうさん
上のリンクの例では、
for (l=0; l<100000000; l++);
で 1.65秒 という結果に。私も、よほどの環境でなければそんなもんだろうな、と思います。


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

Name: ねこ  ..熟練のプログラマー(52,801ポイント)   Date: 2010/06/02(水) 12:26   No:53264     
Title: Re:_sleep()の動きについて    
恐らくですがdicさんは
「1000回インクリメントを繰り返すだけで1msくらいかかるのではないか」
と言ったのに対してたいちうさんは
「インクリメント1回に1ms」
という認識をしてるのではないかと。
なので1000(元処理)と10000(サンプル)で0が1個多いという指摘をしてるのだと思います。

とりあえず「QueryPerformanceCounter」あたりを使うと良いのではないかとぽそっと呟いて去ります。


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

Name: たかぎ [URL]  ..ハッカー(194,378ポイント)   Date: 2010/06/02(水) 12:42   No:53266     
Title: Re:_sleep()の動きについて    
http://www9.plala.or.jp/sgwr-t/lib/clock.html 
> ↑のように、clock()関数は「プログラム実行開始からの経過時間」なので、問題ないと思いますが、もしかしてコンパイラによって違ったり> するんでしょうかね? 

そのサイトの説明が間違っています。
clock関数はCPU使用時間を返します。
CPU使用時間が具体的に何を意味するのかは定義されていませんし、常に-1を返すことも許されています。


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

Name: softya [URL]  ..ハッカー(173,423ポイント)   Date: 2010/06/02(水) 14:53   No:53271     
Title: Re:_sleep()の動きについて    
私もCPUの経過時間であるclock()よりは、QueryPerformanceCounterでシステム時間の経過で測った方が良いと思います。
指定時間自分のプロセスでCPUを使わないようにOSに依頼する_Sleepの時間をclock()で測る事自体が間違っています。



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

Name: たかぎ [URL]  ..ハッカー(194,450ポイント)   Date: 2010/06/02(水) 15:40   No:53272     
Title: Re:_sleep()の動きについて    
機器制御ということであれば、もしかすると計測用に何らかの信号を出力できる可能性もありますね。
だとすれば、QueryPerformanceCounterより、その信号を使ってオシロスコープかロジックアナライザで計測する方がずっと正確です。


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

Name: softya [URL]  ..ハッカー(173,697ポイント)   Date: 2010/06/02(水) 16:15   No:53276     
Title: Re:_sleep()の動きについて    
試験時間が3時間45分から4時間半に伸びたと言う話が問題なのですよね。
なので次のことを考え直してみてはどうでしょうか?

・_Sleep(1);に失敗していてちゃんと予定通りの動作をしていないと思われる3時間45分のマシンの方は計測に失敗していなかったのでしょうか?
・もし失敗していないのなら_Sleep(1);は妥当に動作していたのではないでしょうか?
・単に時間が伸びたのは、NT側のプロセス/スレッド負荷の違いとは考えれないでしょうか?
・そもそも、試験時間は理想的にパソコンが動作したとして何時間で計測終了するのが正しいのでしょうか?
・理想と現実のギャップが大きい場合、なぜ理想値から遠いのかじっくり調べてみるのは出来ないのでしょうか?(もちろんCLOCK()以外の方法で)。

そもそもWindowsOSは時間通りきっちり動作するプログラムを動かすことは出来ませんので、RTOSの利用の検討やマイコンなどを使ったデータロガーを使えば悩みを解決出来るかもしれません。
※うまくいけば、試験時間の大幅短縮が出来る可能性も!


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

Name: dic  ..熟練のプログラマー(69,176ポイント)   Date: 2010/06/02(水) 16:20   No:53278     
Title: Re:_sleep()の動きについて    
>for (int i = 0; i < 10000; i++) { ; }
これがどこからきたのかちょっと理解できないです


>hayakawaさん ねこさん たかぎさん softyaさん ookamiさん ideyanさん
私はマイコンのような機器を制御したことがないので
これ以上は何もいえないです


ただ、私が言いたかったのはWindowsなので、仮にxmsで処理が完了しても
他のプログラムがエラーを起こしてそちらに処理時間が割り当てられる場合もありますってことでした


ひっこみますね


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

Name: たいちう  ..比類無きプログラマー(89,914ポイント)   Date: 2010/06/02(水) 16:36   No:53284     
Title: Re:_sleep()の動きについて    
> >for (int i = 0; i < 10000; i++) { ; }
> これがどこからきたのかちょっと理解できないです

単なるインクリメントが1msもかかるわけがない、
ということを理解してもらうためのソースコードです。
回数に意味はなく以下のように別の数字でも構いません。
確実に体感できる10秒になる回数を選びました。

for (int i = 0; i < 100; i++) { ; } // i++ に 1ms かかるとすると、0.1秒かかる
for (int i = 0; i < 1000; i++) { ; } // i++ に 1ms かかるとすると、1秒かかる
for (int i = 0; i < 10000; i++) { ; } // i++ に 1ms かかるとすると、10秒かかる
for (int i = 0; i < 100000; i++) { ; } // i++ に 1ms かかるとすると、100秒かかる

念のため書くと、プログラムを実行するまでもなく10秒かからない事が分かるだろうから、
インクリメントに1msもかからないという事に気付いてもらおうという意図です。


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

Name: ookami  ..上級者(18,393ポイント)   Date: 2010/06/02(水) 20:12   No:53334     
Title: Re:_sleep()の動きについて    
たかぎさん
> そのサイトの説明が間違っています。
うわわわ、大変失礼しました。ご指摘ありがとうございます。


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

Name: hayakawa   Date: 2010/06/13(日) 10:20   No:530701276392013     
Title: Re:_sleep()の動きについて    
皆さんいろいろとご意見を頂き、ありがとうございます。

softyaさん
> 試験時間が3時間45分から4時間半に伸びたと言う話が問題なのですよね。
ではなく、今まで3時間45分で行われていたことが問題ではないかと考えています。

> なので次のことを考え直してみてはどうでしょうか?
> ・_Sleep(1);に失敗していてちゃんと予定通りの動作をしていないと思われる3時間45分のマシンの方は計測に失敗していなかったのでしょうか?
> ・もし失敗していないのなら_Sleep(1);は妥当に動作していたのではないでしょうか?
> ・単に時間が伸びたのは、NT側のプロセス/スレッド負荷の違いとは考えれないでしょうか?
> ・そもそも、試験時間は理想的にパソコンが動作したとして何時間で計測終了するのが正しいのでしょうか?
> ・理想と現実のギャップが大きい場合、なぜ理想値から遠いのかじっくり調べてみるのは出来ないのでしょうか?(もちろんCLOCK()以外の方法で)。
_Sleep(1)の関数は1553バスを使用した通信でコマンドを送信する前に入れています。
このマシンは現在運用中ですが、時々原因不明の通信エラーでfailすることがあるので
今回見つかった_Sleep(1)関数が確実に機能していないのがその原因でないかと考えています。
同様の試験装置は本機を含め4台ありますが、試験時間が3時間45分となるのはこの試験装置だけで
他3台の試験時間は4時間半です。
それぞれの試験装置は、使用するPCも計測器材もまちまちなのでハードの違いで試験時間に差が出るのでは
ないかと漠然と考えておりました。
しかし、今回わかったこと(試験時間が3時間45分の試験装置では_Sleep()関数が確実に作動していない。)
が通信エラーでのfailの原因ではないかと考え、_Sleep()関数を確実に作動させるようにしたいと考えました。
そのために試験時間が4時間半に伸びても問題ないと考えています。
というか、それが正常な姿だと考えています。^^;





Name: TKOZ  ..熟練のプログラマー(58,683ポイント)   Date: 2010/05/31(月) 17:35   No:53147       
Title: NESASMのBG描きこみルーチンについて    
ファミコンソフトをC言語で作るのは実用的ではないと思いまして、ファミコンのアセンブリ言語を
使っています。そこで問題が生じました。以下のC言語で実装したBG描きこみルーチンを
6502のアセンブリ言語で実装しようとしたらエラーが出てしまいました。
どうすればエラーを回避し、思い通りの結果が期待できるでしょうか?
どうかみなさまお力を貸してください。

あと、アセンブリ言語でもこの掲示板に書き込むのは適切だったでしょうか…?
他に有名なアセンブリ言語の掲示板を知らないので良かったらそちらも教えていただくと嬉しいです。


void DrawBG(unsigned char x,unsigned char y,unsigned char number)
{
  int adr;
  adr = (y-1)*32+x;
  *(char*)0x2006 = 0x20+adr/256;
  *(char*)0x2006 = adr;

  *(char*)0x2007 = number;
}
C言語で記述するとこうなるのですが、NESASMというファミコン用のアセンブラでこうなるように
記述してみたのですが、エラーが出てしまいます。

Sum    EQU    $0010
Count    EQU    $0011
AA    EQU    $0012
B    EQU    $0013
A2    EQU    $0014
B2    EQU    $0015
Sum2    EQU    $0016
ADR    EQU $0017
XX    EQU $0018
YY    EQU $0019
NUM    EQU    $0020

Div:
    lda AA
    sta Sum
    lda #$00
    sta Count
    lda Sum
loop:
    inc Count
    sbc B
    bne loop 
    rts
Mul:
    lda #$00
    sta Sum2
loop2:    
    ldx B2
    adc A2
    dex
    bne loop2
    sta Sum2
    rts
wrtBG:
    lda YY
    dec a
    lda YY
    sta A2
    lda #32
    sta B2
    jsr mul
    lda Sum2
    adc XX
    sta ADR
    lda ADR
    sta AA
    lda #256
    sta B
    jsr div
    lda Count
    adc #$20
    sta $2006
    lda ADR
    sta $2006
    lda NUM
    sta $2007
    rts

エラーは次のとおりです。

Microsoft (R) KKCFUNC バージョン 1.10
Copyright (C) Microsoft Corp. 1991,1993. All rights reserved.

KKCFUNC が組み込まれました.

マイクロソフトかな漢字変換  バージョン 2.51
(C)Copyright Microsoft Corp. 1992-1993
NES Assembler (v2.0)

#[1]   PUTSTRING.ASM
  131  03:0038                    jsr mul
       Undefined symbol in operand field!
  137  03:004A                    lda #256
       Incorrect immediate value!
  139  03:004D                    jsr div
       Undefined symbol in operand field!
# 3 ERROR(s)

C:\DOCUME~1\HP\デスク~1\PUTSTR~1>



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


Name: たかぎ [URL]  ..ハッカー(193,747ポイント)   Date: 2010/05/31(月) 18:01   No:53149     
Title: Re:NESASMのBG描きこみルーチンについて    
ざっとしか見ていませんが...

>   131  03:0038                    jsr mul 
>        Undefined symbol in operand field! 
>   139  03:004D                    jsr div 
>        Undefined symbol in operand field! 

この二つは、単にシンボルの大文字・小文字がそろっていないだけでは?

>   137  03:004A                    lda #256 
>        Incorrect immediate value! 

ldaのオペランドに指定できるイミディエイト値は8ビットなので、256だと大きすぎます。

このアセンブリ言語のコードをどうやって得たのかわかりませんが、ぱっと見ただけでもいろいろ怪しいところがあります。
そもそも乗除算は必要ありませんし、個々の命令の使い方もおかしいところだらけです。
(キャリーフラグを放置したままadcとか...)


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

Name: TKOZ  ..熟練のプログラマー(58,947ポイント)   Date: 2010/05/31(月) 18:56   No:53154     
Title: Re:NESASMのBG描きこみルーチンについて    
>このアセンブリ言語のコードをどうやって得たのかわかりませんが、
>ぱっと見ただけでもいろいろ怪しいところがあります。 
>そもそも乗除算は必要ありませんし、個々の命令の使い方もおかしいところだらけです。 
>(キャリーフラグを放置したままadcとか...) 
すみません。。ファミコンのアセンブリ言語やるの久しぶりなもので…私が書いたコードです。


>   131  03:0038                    jsr mul  
>        Undefined symbol in operand field!  
>   139  03:004D                    jsr div  
>        Undefined symbol in operand field!  

>この二つは、単にシンボルの大文字・小文字がそろっていないだけでは? 
そうですね。ありがとうございます。


>   137  03:004A                    lda #256  
>        Incorrect immediate value!  

>ldaのオペランドに指定できるイミディエイト値は8ビットなので、256だと大きすぎます。
256だと大きすぎる場合、どうすれば実装すればいいでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(193,843ポイント)   Date: 2010/05/31(月) 19:10   No:53155     
Title: Re:NESASMのBG描きこみルーチンについて    
> >ldaのオペランドに指定できるイミディエイト値は8ビットなので、256だと大きすぎます。 
> 256だと大きすぎる場合、どうすれば実装すればいいでしょうか?

この256は、adr/256の除数ですよね。
adrのアドレスはADRだと思いますが、1バイト分しか確保されていないようです(直後はXXなので)。それでよいのでしょうか?
そうではなく、ADRとADR+1の2バイトでadrを表現するのであれば、256で割るということは上位1バイトを取ればよいので、割り算なんかしなくても、

lda  ADR+1

で済むはずですね。


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

Name: TKOZ  ..熟練のプログラマー(59,116ポイント)   Date: 2010/05/31(月) 19:47   No:53162     
Title: Re:NESASMのBG描きこみルーチンについて    
>たかぎさん

256を割らなくても、+1すればいいという事でしょうか?
アセンブリソースコードを次のように直してみたのですが、
やはりBGに書き込めませんでした。
何が駄目だったのでしょうか?

wrtBG:
    lda YY
    dec a
    clc
    asl a
    asl a
    asl a
    asl a
    asl a
    clc
    adc XX
    sta ADR
    clc
    lda ADR+1
    clc
    adc #$20
    sta $2006
    lda ADR
    sta $2006
    lda NUM
    sta $2007
    rts


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

Name: TKOZ  ..熟練のプログラマー(59,169ポイント)   Date: 2010/05/31(月) 21:57   No:53176     
Title: Re:NESASMのBG描きこみルーチンについて    
ADR+1の意味がよく分からないです。 編集済み

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

Name: TKOZ  ..熟練のプログラマー(59,206ポイント)   Date: 2010/05/31(月) 22:03   No:53177     
Title: Re:NESASMのBG描きこみルーチンについて    
もしかして、僕はものすごい勘違いをしてますか?
ビット演算系は、かなり不得意なので、丁寧に教えてください。
(アセンブリ言語向いてないかも)


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

Name: たかぎ [URL]  ..ハッカー(193,997ポイント)   Date: 2010/05/31(月) 22:26   No:53180     
Title: Re:NESASMのBG描きこみルーチンについて    
レジスタが8ビットしかないことを再認識してください。

>      ADR+1の意味がよく分からないです。

変数adrの値は、ADR+0, ADR+1の2バイトに格納されるはずですね。
6502はリトルエンディアンですので、ADR+0に下位8ビット、ADR+1に上位8ビットが入ります。
16ビットの値を256で割るということは、上位8ビットだけを取り出せばよいので、ADR+1を読めばよいことになります。


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

Name: TKOZ  ..熟練のプログラマー(59,038ポイント)   Date: 2010/06/01(火) 17:01   No:53218     
Title: Re:NESASMのBG描きこみルーチンについて    
>レジスタが8ビットしかないことを再認識してください。 

>      ADR+1の意味がよく分からないです。 

>変数adrの値は、ADR+0, ADR+1の2バイトに格納されるはずですね。 
>6502はリトルエンディアンですので、ADR+0に下位8ビット、ADR+1に上位8ビットが入ります。 
>16ビットの値を256で割るということは、上位8ビットだけを取り出せばよいので、
>ADR+1を読めばよいことになります。 
分かりました。ありがとうございます。

あと、計算式で32倍するところがあるのですが、これはどう実装すればいいでしょうか?
32倍の限界はレジスタが8ビットしかないので、7*32までしか出来ません。


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

Name: たかぎ [URL]  ..ハッカー(194,042ポイント)   Date: 2010/06/01(火) 17:24   No:53219     
Title: Re:NESASMのBG描きこみルーチンについて    
> あと、計算式で32倍するところがあるのですが、これはどう実装すればいいでしょうか? 

5ビット分左シフトします。
ただし、シフト対象は16ビットにしなければなりません。
下位ビットに対してはASL命令で、上位8ビットに対してはROL命令でシフトしてください。


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

Name: TKOZ  ..熟練のプログラマー(59,244ポイント)   Date: 2010/06/01(火) 19:03   No:53230     
Title: Re:NESASMのBG描きこみルーチンについて    
ソースを書いてみたらこうなったのですが、何がいけなかったのでしょうか?

wrtBG:
    lda YY
    dec a
    clc
    sta N
    rol N+1
    rol N+1
    rol N+1
    rol N+1
    rol N+1
    asl N
    asl N
    asl N
    asl N
    asl N
    clc
    lda N
    adc XX
    sta ADR
    sta ADR+1
    clc
    adc #$20
    sta ADR
    sta $2006
    lda ADR+1
    clc
    adc #32
    sta $2006
    lda NUM
    sta $2007
    rts


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

Name: たかぎ [URL]  ..ハッカー(194,129ポイント)   Date: 2010/06/01(火) 19:22   No:53231     
Title: Re:NESASMのBG描きこみルーチンについて    
もう少し命令セットの解説をよく読んで、レジスタやフラグの振る舞いを把握するようにしてください。

    rol N+1 
    rol N+1 
    rol N+1 
    rol N+1 
    rol N+1 
    asl N 
    asl N 
    asl N 
    asl N 
    asl N 

上はどういう意図なのか、説明していただけますか?


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

Name: TKOZ  ..熟練のプログラマー(59,312ポイント)   Date: 2010/06/02(水) 16:19   No:53277     
Title: Re:NESASMのBG描きこみルーチンについて    
ネットカフェから書き込みます。

rol a+1がエラーでうまくいかなかったのでNという変数をでっちあげ

sta N
rol N+1
rol N+1
rol N+1
rol N+1
rol N+1
asl N
asl N
asl N
asl N
asl N
としました。


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

Name: たかぎ [URL]  ..ハッカー(194,931ポイント)   Date: 2010/06/02(水) 16:32   No:53280     
Title: Re:NESASMのBG描きこみルーチンについて    
シフトに入る前にclcを行っていますから、初期の時点でキャリーフラグは0、Nにはstaでストアした値、N+1は不定です。
N、N+1およびキャリーの状態を追っていくと...
         C N        N+1
sta N    0 ABCDEFGH IJKLMNOP
rol N+1  I ABCDEFGH JKLMNOP0
rol N+1  J ABCDEFGH KLMNOP0I
rol N+1  K ABCDEFGH LMNOP0IJ
rol N+1  L ABCDEFGH MNOP0IJK
rol N+1  M ABCDEFGH NOP0IJKL
asl N    A BCDEFGH0 NOP0IJKL
asl N    B CDEFGH00 NOP0IJKL
asl N    C DEFGH000 NOP0IJKL
asl N    D EFGH0000 NOP0IJKL
asl N    E FGH00000 NOP0IJKL

上のようになります。ここで、A〜Pは各ビットの初期値で状況に依存します。
このように、命令を実行する度に、各ビットがどうなるのかを追っていくことが大切です。
 編集済み


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



Name: 寅之助  ..ぴよぴよ(384ポイント)   Date: 2010/06/02(水) 03:24   No:53246       
Title: 現在現役プログラマーさんに質問します    
私は基本情報技術者の資格を持ってます。
午後の選択問題はC言語を選択しました。
勉強した時間は一日5時間、三ヶ月ほどで、
一発で取得しました。

それまでプログラミングの経験もなく、
パソコンの知識もまったくと言っていいほど
無知でしたが、IT系の仕事に興味を持ち
「あれば就職に有利だろう。よし。取得しよう。」
という安易な考えでした。

勉強して資格を取得してパソコンに
詳しくなれたかと聞かれると
あんまり詳しくなったと思いません。
確かに勉強したところは覚えられましたが、
普段滅多に使わないかな?と思います。

そこで質問なのですが、
資格を持っていなくプログラミング経験のある(実務ではなく趣味程度)新卒者と
資格を持っててプログラミング経験のない(資格取得はしてるので基本はわかる)新卒者、
どちらが就職に有利なのでしょうか?


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


Name: バグ  ..ハッカー(197,469ポイント)   Date: 2010/06/02(水) 08:07   No:53252     
Title: Re:現在現役プログラマーさんに質問します    
資格を持っている事自体は素晴らしいと思います。
ただ、どちらが有利というのは企業の考え方次第かと思います。
即戦力を欲している企業と、0から新人を教育・育成するつもりのある企業では採用基準が違いますから。



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,195,892ポイント)   Date: 2010/06/02(水) 08:14   No:53253     
Title: Re:現在現役プログラマーさんに質問します    
どのような企業に行くかによると思います。
即戦力を必要とするような中小企業ならもちろんバリバリに経験が必要ですし、
一から育ててくれるような企業なら全くプログラミング経験0でも問題ありません(もちろんそれでも欲しいと言われる要素が必要ですが)

基本情報は正直持っていても面接で有利だという事は無いと思います。
何十万人も合格者がいるような試験をクリアしたと言っても面接で特に有利になるような事は無いようです。
基本情報の上のソフト技術者ならアピールになるかもしれませんが。
大事なのは資格があるかどうかではなく、それをネタにしてとかして面接で話題を盛り上げる事、自分をアピールすることだと思います。

専門的な仕事に対して、面接で話題が作れるのは

>資格を持っていなくプログラミング経験のある(実務ではなく趣味程度)新卒者と 
>資格を持っててプログラミング経験のない(資格取得はしてるので基本はわかる)新卒者

のうち前者かもしれません。もちろん両方が一番でしょうから、今からでも勉強してはいかがでしょう?
就活はいつされるのでしょうか?

また、質問文に自分が希望する企業が即戦力を必要とするようなベンチャーや中小なのか、安定した大企業なのか、何かの研究職なのかなど、書いてはいかがでしょう。
それによって対策が完全に異なると思います。
(後、何の仕事がしたいのか)

学生に即戦力を求めるところと求めない所があるようです。
どっちが多いんでしょうね。大抵研修はあると思いますが。
ただ言える事は教育制度がしっかりしてなくて、即戦力ばかり求める企業だと自分が好きで取り組めなければ非常に辛いと思います。
反対に、自分の技術に自信があれば、若くから会社に貢献できるのでやりがいがあるかもしれません。

どのような会社に魅力を感じるかはそれぞれだと思います。


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

Name: たかぎ [URL]  ..ハッカー(194,166ポイント)   Date: 2010/06/02(水) 08:20   No:53254     
Title: Re:現在現役プログラマーさんに質問します    
IT系の仕事といってもいろいろありますし、新卒といっても高卒と専門学校卒と大卒と大学院卒では事情が異なります。
もちろん応募先の企業によっても変わります。

確実にいえることは、普通は資格があって邪魔にはならないだろうということです。
資格がじゃまになることがあるとすれば、デザイナーや営業職などを希望しているのに、基本情報の資格を持っているがために技術部門に配属されるといった場合でしょう。


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

Name: たいちう  ..比類無きプログラマー(90,090ポイント)   Date: 2010/06/02(水) 11:13   No:53259     
Title: Re:現在現役プログラマーさんに質問します    
特に難しい試験ではありません。
この資格を持っていることだけで、高い評価を受けられることは少ないと思います。

勉強熱心であることはアピールできると思いますけどが、
「IT系の仕事に興味を持ち」というのが、
「プログラマになりたいと思い」というような意味だとすると、
何故プログラムを作ろうとしなかったの?と私なら聞きます。
何か回答を用意しておいた方が良いと思いますよ。
あるいはこれからプログラムも沢山作るか。


> 資格を持っていなくプログラミング経験のある(実務ではなく趣味程度)新卒者と
> 資格を持っててプログラミング経験のない(資格取得はしてるので基本はわかる)新卒者、

話をしてみて、経験者がどの程度の経験があるか、
有資格者がどの程度基本を理解しているか判断してからですが、
経験者が有利な場合が多いでしょう。

資格試験について人事の人と話すと「同じ条件ならば資格を持っている人を
採用する」と必ず言いますが、同じ条件の人、というのは存在しないんですよね。
殆ど同じ条件で資格の有無が決め手になった、というケースも少ないそうで、
それよりも、年令や学歴・職歴、就職時の試験の成績や面接での印象などの方が
よほど重視されます。その程度のものです。


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

Name: 匿名  ..上級者(21,341ポイント)   Date: 2010/06/02(水) 12:10   No:53263     
Title: Re:現在現役プログラマーさんに質問します    
取ったほうが良い資格で言うならば、情報システム試験の

基本スキル
プログラミングスキル

は抑えたほうがいいでしょう。


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

Name: sizuma [URL]  ..プログラマー(39,845ポイント)   Date: 2010/06/02(水) 16:11   No:53275     
Title: Re:現在現役プログラマーさんに質問します    
新卒だったら資格やスキルがなくても面接次第で仕事につくことはできますよ。
もちろん会社によるでしょうけど。

僕は3年過程の専門学生です。
基本情報持ってない同級生でも内定を先にを決めてる人もいます。
とはいっても専門学生で資格を持ってない人は僕だったら採用しませんけどね。
大学生だったら文理関係なく募集しているところも多いので、+αで資格を持ってるのはいいことなんじゃないかなと思います。


>確実にいえることは、普通は資格があって邪魔にはならない
ですね。
話すネタにもなりますし。
僕は合同企業説明会で持ってる資格とか印象を気に入られて学校経由で2次面接から受けに来てくださいって言われたこともありました。


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



Name: 春すぎて  ..ぴよぴよ(735ポイント)   Date: 2010/05/31(月) 02:54   No:53133       
Title: 超初心者ですが    
プログラムは全くの初心者です。ゲームプログラミングの館〜入門編〜15.音楽を流す。ここまでは何とかマスター出来たと思って、ためしに簡単な(ボタンをクリックしたら音楽が流れるだけ)のソフトを作って、自分のホームページ(レンタルサーバーを借りました)へアップロードしてみたのですが、うまくいきません。自分のパソコン内のサンプルプログラム実行用フォルダ内の、Releaseファイルをまるごと一式をCDにコピーして別のパソコンで試してみるとうまくいったのです。それと同じようにReleaseファイルをまるごと一式をホームページへアップロードして、別のパソコンでそのホームページを開いてみると、ボタンをクリックすると音楽再生中の画面は表示されるのですが、音声が全く出ないのです。そのパソコンのデスクトップにLog.txtファイルが勝手に作られており、その中を見ると「11885:右記の音声ファイルのロードに失敗しました_1:46.mp3」というようなことが書かれています。ホームページ作成も今回が初めてなので、どこが間違っているのか全く分かりません。
今の自分の知識と能力で、こんなことをやるのは無謀だということもよく分かってはいるのですが、なんでも実際に試してみないと気がすまない性格なものですから、何かアドバイスを頂けると有りがたいのですが、よろしくお願いします。
基本的に私のやりたいことは、簡単なゲームをいくつか作って自分のホームページで公開してみたいということです。本格的なゲームは考えていません。ほんのお遊び程度のものです。
OS:WindowsXP HomeEdition
VisualC++2008ExpressEdition


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


Name: Justy  ..伝説なるハッカー(537,952ポイント)   Date: 2010/05/31(月) 21:04   No:53168     
Title: Re:超初心者ですが    
 音声ファイルが入っていないのでしょう。
 exeとその mp3ファイルを一緒につけて下さい。

 あと Releaseフォルダ全てをアップする必要はありません。
 入門編の通りであれば。Releaseフォルダ内の exeファイルと音声ファイルだけあれば動くはずです。


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

Name: 春すぎて  ..ぴよぴよ(971ポイント)   Date: 2010/06/01(火) 01:16   No:53204     
Title: Re:超初心者ですが    
もう一度、exeファイルとmp3ファイルをアップロードし直したのですが、やはり再生中の画面は出るけれど、音声は出ません。ボタンをクリックすると次の曲が流れるように作ったのですが、クリックすると曲名は次の曲名に変わるのですが無音のままです。
ホームページへアップロードする時に、いろいろと設定が有るようなので、そのへんの設定方法とかアップロードの仕方が悪いのかも知れません。もう少し詳しく説明を読んでから、再度チャレンジしたいと思います。
自分の勉強不足を痛感しています。アドバイス頂きまして有り難うございました。


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

Name: toyo  ..熟練のプログラマー(47,476ポイント)   Date: 2010/06/01(火) 06:33   No:53206     
Title: Re:超初心者ですが    
同一のファイル一式でCD-R経由だと他のパソコンでも動くがネット経由でダウンロードすると音声ファイルの読み込みに失敗するということですね
音声ファイルのアップロードがうまくいってないような気がしますね
zipにまとめてではなくファイル個々にアップロードしてるのでしょうか
mp3をテキストモードで転送しているならバイナリーモードにすればうまくいくと思います


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

Name: 春すぎて  ..かけだし(1,263ポイント)   Date: 2010/06/02(水) 11:09   No:53258     
Title: Re:超初心者ですが    
今までの私の説明で、状況を正しく伝えられていなかったような気がします。へたな説明で申し訳ありませんでした。アドバイス通りにmp3とexeをzipにまとめてアップロードしてみました。別のパソコン内にフォルダを作ってその中へ解凍して開いてから、exeをクリックすれば全てうまくいくことが確認できました。でも私が今まで音が出ないと言っているのは、ホームページ内に、この部分をクリックすれば音楽が流れます、もう一度クリックすると次の音楽が流れますという、簡単な音楽プレーヤーのようなものを作ろうとしているのですが、これが画像表示だけはうまくいっているのに、音が出ないということなのです。一つのプログラムで画像作成については順調に動作するのに、音楽再生については動作しないということが不思議です。結局のところホームページ上では音楽を流せないということなんでしょうか?

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

Name: たいちう  ..比類無きプログラマー(90,049ポイント)   Date: 2010/06/02(水) 11:17   No:53260     
Title: Re:超初心者ですが    
パソコンの中の実行ファイルが音楽をならす方法と、
ホームページが音楽をならす方法は、全く別と考えてください。

キーワード:ホームページ 音楽


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

Name: Ma  ..ハッカー(103,436ポイント)   Date: 2010/06/02(水) 11:43   No:53261     
Title: Re:超初心者ですが    
たいちうさんと同意見です。
ウェブページにexeファイルを組み込むなんて聞いた事ないです。
リンクをクリックしてブラウザのダウンロードフォルダに自動的に落とされたexeファイルを起動しているだけではないのですか?

音楽をHP上で流したいなら(プレイヤーを含めて)、javaスクリプト等を使うべきでしょう。


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

Name: 春すぎて  ..かけだし(1,331ポイント)   Date: 2010/06/02(水) 11:58   No:53262 解決!     
Title: Re:超初心者ですが    
ホームページの仕組みについて知識が無さすぎたようです。プログラムに関してもですが。
もっと学習してから再チャレンジします。
皆様方のアドバイスに感謝いたします。


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

Name: Dixq (管理人)  ..ウィザード(1,195,943ポイント)   Date: 2010/06/02(水) 14:30   No:53270     
Title: Re:超初心者ですが    
ホームページ上で動作するものをDXライブラリで作る事は出来ないです。
Flashゲームなどを見てウェブ上で動くゲームやシステムなんかを想像されているのかもしれませんが、
あれはその言葉通り、Flashというもの(ActionScript)で出来ているのでまったく違います。
また、ウェブで複雑な事をするならJAVAScriptなどを使います。

詳しくは知りたいキーワードをググれば見つかると思います。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +