C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   C++の宿題での質問です ....   
     ・[44581] たかぎ 
     ・[44582] kos-mos 
     ・[44583] kos-mos 
     ・[44584] たかぎ 
     ・[44588] kos-mos 
     ・[44589] たかぎ 
     ・[44590] kos-mos 
     ・[44597] kos-mos 
     ・[44608] トントン 
     ・[44611] kos-mos 
   教えてください   
     ・[44610] MNS 
     ・[446061261846083] 初心者 
   弾幕のプチテストプレ ....   
     ・[44544] チルチル 
     ・[44548] jay  
     ・[44550] チルチル 
     ・[44602] jay 
   forループでの数値代入 ....   
     ・[44566] 50シーマ 
     ・[44577] たかぎ 
   ブロックの描画   
     ・[44535] Justy 
     ・[44539] 256bit 
   雑談   
     ・[44531] mnkr 
     ・[44532] ぽこ 
     ・[44537] dic 
   ソリューションファイ ....   
     ・[44536] DVDM 
   3DCGソフトウェアにつ ....   
     ・[44509] Justy 
     ・[44521] MNS 
     ・[44534] Justy 
   テキストファイルから ....   
     ・[44404] バグ 
     ・[44405] たかぎ 
     ・[44430] test 
     ・[44431] シノニム 
     ・[44432] たかぎ 
     ・[44442] Dixq (管理人) 
     ・[44471] non 
     ・[44500] シノニム 
     ・[44503] non 
     ・[44524] シノニム 
   斜め坂について   
   3DエンジンをDibSecti ....   
     ・[44517] TKOZ 
   無料でダウンロードで ....   
     ・[44473] 御津凪 
     ・[44474] softya 
     ・[44481] ターボ 
     ・[44484] softya 
     ・[44515] ターボ 
   3Dエフェクト:ドップ ....   
     ・[44514] Ma 
   mp3再生について   
     ・[44415] Naohiro19 
     ・[44443] Dixq (管理人) 
     ・[44505] デラ初心者 
   Cの参考書   
     ・[44295] たかぎ 
     ・[44296] デラ初心者 
     ・[44298] たかぎ 
     ・[44299] デラ初心者 
     ・[44300] デラ初心者 
     ・[44301] sizuma 
     ・[44302] MNS 
     ・[44410] デラ初心者 
     ・[44445] Dixq (管理人) 
     ・[44450] たかぎ 
     ・[44453] Lbfuvab 
     ・[44456] mats 
     ・[44457] kazuoni 
     ・[44464] Dixq (管理人) 
     ・[44490] たかぎ 
     ・[44492] たいちう 
     ・[44496] たかぎ 
     ・[44504] デラ初心者 
   Window7 64bitの環境で ....   
     ・[44422] softya 
     ・[44424] アーロン 
     ・[44434] softya 
     ・[44441] Dixq (管理人) 
     ・[44502] アーロン 
   戦術シミュ製作につい ....   
     ・[44458] Justy 
     ・[44470] MNS 
     ・[44498] yskey 
     ・[444261273189373] にゃ 
   DirectXによるポリゴン ....   
     ・[44078] 御津凪 
     ・[44147] Libra 
     ・[44166] 御津凪 
     ・[44187] Libra 
     ・[44235] 御津凪 
     ・[44343] Libra 
     ・[44346] 御津凪 
     ・[44455] Libra 
     ・[44477] 御津凪 
     ・[44493] Libra 
     ・[44495] 御津凪 
   ソースコードの行数   
     ・[43613] Dixq (管理人) 
     ・[43615] non 
     ・[43618] mii 
     ・[43620] non 
     ・[43621] mii 
     ・[43622] non 
     ・[43625] mii 
     ・[43627] Dixq (管理人) 
     ・[43629] non 
     ・[43630] mii 
     ・[43637] non 
     ・[43639] mii 
     ・[43640] non 
     ・[43641] mii 
     ・[43643] non 
     ・[43644] mii 
     ・[43645] non 
     ・[43647] たかぎ 
     ・[43650] non 
     ・[43651] mii 
     ・[43652] mii 
     ・[43654] non 
     ・[43660] mii 
     ・[43661] non 
     ・[43662] mii 
     ・[43663] non 
     ・[43664] mii 
     ・[43666] mii 
     ・[43667] non 
     ・[43668] mii 
     ・[43676] mii 
     ・[43677] non 
     ・[43679] mii 
     ・[43680] non 
     ・[43681] non 
     ・[43682] mii 
     ・[43683] non 
     ・[43686] mii 
     ・[43687] non 
     ・[43693] mii 
     ・[43695] non 
     ・[43698] mii 
     ・[43699] non 
     ・[43700] non 
     ・[43701] non 
     ・[43704] mii 
     ・[43705] non 
     ・[43707] mii 
     ・[43722] mii 
     ・[43734] non 
     ・[43738] mii 
     ・[43743] non 
     ・[43745] mii 
     ・[43748] mii 
     ・[43749] non 
     ・[43750] mii 
     ・[43824] mii 
     ・[43835] non 
     ・[43838] mii 
     ・[43839] mii 
     ・[43842] non 
     ・[43843] mii 
     ・[43845] mii 
     ・[43985] mii 
     ・[43986] non 
     ・[44014] mii 
     ・[44023] mii 
     ・[44065] mii 
     ・[44184] ドラ 
     ・[44208] mii 
     ・[44232] mii 
     ・[44236] non 
     ・[44327] ドラ 
     ・[44365] mii 
     ・[44384] mii 
     ・[44392] Mist 
     ・[44439] ドラ 
     ・[44472] mii 
     ・[44478] non 
     ・[44479] Mist 
     ・[44483] mii 
     ・[44486] non 
     ・[44488] mii 
     ・[44489] mii 
     ・[44494] mii 
   無題   
     ・[44231] sizuma 
     ・[44233] non 
     ・[44244] 初級者 
     ・[44367] poi 
     ・[44368] Mist 
     ・[44369] バグ 
     ・[44371] Mist 
     ・[44372] たいちう 
     ・[44373] バグ 
     ・[44401] たかぎ 
     ・[44403] バグ 
     ・[44406] たかぎ 
     ・[44485] poi 
   ゲームでのグラフィッ ....   
     ・[44454] kazuoni 
     ・[44467] Dixq (管理人) 
     ・[444511261482663] ti 
   コード   
     ・[44255] たかぎ 
     ・[44256] softya 
     ・[44259] Dixq (管理人) 
     ・[44261] ぜるだ 
     ・[44262] softya 
     ・[44263] たかぎ 
     ・[44264] ぜるだ 
     ・[44266] バグ 
     ・[44267] ぜるだ 
     ・[44269] softya 
     ・[44276] Dixq (管理人) 
     ・[44281] ぜるだ 
     ・[44283] ぜるだ 
     ・[44285] softya 
     ・[44288] softya 
     ・[44290] たかぎ 
     ・[44309] softya 
     ・[44310] たかぎ 
     ・[44318] Dixq (管理人) 
     ・[44319] たかぎ 
     ・[44321] Dixq (管理人) 
     ・[44388] たかぎ 
     ・[44397] softya 
     ・[44399] たかぎ 
     ・[44448] Dixq (管理人) 
   たすけてください!   
     ・[44375] たかぎ 
     ・[44376] たかぎ 
     ・[44377] バグ 
     ・[44378] ERK。 
     ・[44379] softya 
     ・[44380] たかぎ 
     ・[44381] バグ 
     ・[44382] たかぎ 
     ・[44383] バグ 
     ・[44385] やそ 
     ・[44386] たかぎ 
     ・[44387] バグ 
     ・[44389] たかぎ 
     ・[44390] softya 
     ・[44391] バグ 
     ・[44393] たかぎ 
     ・[44394] たかぎ 
     ・[44440] Dixq (管理人) 
   STG製作者(特に管 ....   
     ・[44022] バグ 
     ・[44024] dic 
     ・[44025] チルチル 
     ・[44038] Dixq (管理人) 
     ・[44070] DVDM 
     ・[44076] Dixq (管理人) 
     ・[44080] 光翼型近接支援残酷超初心者 
     ・[44083] 御津凪 
     ・[44088] 光翼型近接支援残酷超初心者 
     ・[44096] 御津凪 
     ・[44197] DVDM 
     ・[44204] Dixq (管理人) 
     ・[44323] 光翼型(携帯より 
     ・[44425] 光翼型近接支援残酷超初心者 
     ・[44429] Dixq (管理人) 

Name: kos-mos  ..中級者(10,249ポイント)   Date: 2009/12/21(月) 18:29   No:44580       
Title: C++の宿題での質問です    
今回は3x3行列の和、差、積という宿題についての質問です。

宿題の内容は以下の通りです。

=問題=
    *  以下の機能を持つプログラムを、「プログラム作成の系統的な手順」に従って作成せよ。
         1. 指定された3x3の行列(行列1または行列2)に値を入力する
         2. 行列1+行列2を求める
         3. 行列1-行列2を求める
         4. 行列1x行列2を求める
         5. 行列1、行列2、または計算結果を表示する
         6. 行列1x行列2の中間式を表示する。なお、負の数は()で囲むこと
         7. プログラムを終了する 
    * 5種類の機能を個別に実行できるようにすること
    * 行列の要素はint型
    * 行列の要素の初期値は0
    
=演習問題の考え方=
関数

    * 主プログラム(main) 
    * 指定された行列を入力する。(getMatrix)
    * 指定された行列を表示する。(showMatrix)
    * 行列の和を求める。(addMatrix)
    * 行列の差を求める。(subtractMatrix)
    * 行列の積を求める。(multiplyMatrix)
    * 行列の積の中間結果を表示する。(showMultiplicationFormula)
    * 機能を一覧表示する。(showMenu) 

=アルゴリズム=
定数:     行列の大きさ     N

定数:     機能番号0     「終了」
    機能番号1     「行列の入力」
    機能番号2     

「行列の表示」
    機能番号3     「行列の和」
    機能番号4     「行列の差」
    機能番号5     「行列の積」
    機能番号6     「中間式の表示」
=主プログラム=
変数:     機能番号     int functionNo
    操作する行列番号     int matrixNo
    配列1     int matrix1[N][N]
    配列2     int matrix2[N][N]
    計算結果     int matrix3[N][N]

1. 機能を一覧表示する。
2. 機能番号を入力する。
3. 機能番号が「終了」でない限り以下の処理を繰り返す。

     3-1. 機能番号が「行列の入力」ならば、以下の処理を実行する。

       3-1-1. 行列番号(1=配列1 or 2=配列2)を入力する。
       3-1-2. 指定された行列に値を入力する。

     3-2. 機能番号が「行列の表示」ならば、以下の処理を実行する。

       3-2-1. 行列番号(1=配列1, 2=配列2  or 3=計算結果)を入力する。
       3-2-2. 指定された行列を表示する。

     3-3. 機能番号が「行列の和」ならば、行列の和を求める。
     3-4. 機能番号が「行列の差」ならば、行列の差を求める。
     3-5. 機能番号が「行列の積」ならば、行列の積を求める。
     3-6. 機能番号が「中間式の表示」ならば、行列の積を求める中間式を表示する。
     3-7. 機能を一覧表示する。
     3-8. 機能番号を入力する。

指定された行列に値を入力する
 引数:指定された行列
 アルゴリズムはプログラミング演習1-10を参考にすること。

指定された行列を表示する
 引数:指定された行列
 アルゴリズムはプログラミング演習1-10を参考にすること。

行列の和を求める
 引数:行列1、行列2、計算結果

1. 各行row に対して以下の処理を繰り返す

 1-1. 当該行の各列column に対して以下の処理を繰り返す。

  1-1-1. 行列1のrow行 column列の値と行列2のrow行 column列の値を加えて、計算結果のrow行 column列に代入する。
 

行列の差を求める 
 引数:行列1、行列2、計算結果

1. 各行row に対して以下の処理を繰り返す

 1-1. 当該行の各列column に対して以下の処理を繰り返す。

  1-1-1. 行列1のrow行 column列の値から行列2のrow行 column列の値を引いて、計算結果のrow行 column列に代入する。

行列の積を求める
引数:行列1、行列2、計算結果

1. 各行row に対して以下の処理を繰り返す

 1-1. 当該行の各列column に対して以下の処理を繰り返す。

  1-1-1. 計算結果のrow行 column列を 0 とする。
  1-1-2. 変数 iの値を0〜N-1まで変えながら以下の処理を繰り返す。

   1-1-2-1. 行列1のrow行 i列の値と行列2のi行 column列の値を乗じて、計算結果のrow行 column列に加算する。

行列の積を求める中間式を表示する
引数:行列1、行列2

1. 各行row に対して以下の処理を繰り返す。

 1-1. 当該行の各列column に対して以下の処理を繰り返す。

  1-1-1. 変数 iの値を0〜N-1まで変えながら以下の処理を繰り返す。

   1-1-1-1. 行列1のrow行 i列の値を表示する。(負数の場合のみ()で囲む)
   1-1-1-2. "*"を表示する。
   1-1-1-3. 行列2のi行 column列の値を表示する。(負数の場合のみ()で囲む)
   1-1-1-4. iがN-1でなければ"+"を表示する。

 1-2. 改行する。
 
機能の一覧を表示する
 アルゴリズムはプログラミング演習1-10を参考にすること。



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


Name: たかぎ [URL]  ..ハッカー(142,803ポイント)   Date: 2009/12/21(月) 18:32   No:44581     
Title: Re:C++の宿題での質問です    
質問は?
あと、

> プログラミング演習1-10

とは?


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

Name: kos-mos  ..中級者(12,075ポイント)   Date: 2009/12/21(月) 18:33   No:44582     
Title: Re:C++の宿題での質問です    
わかる範囲で以下のように書いてみてコンパイルしたところ、 「'showMatrix' : 関数に 1 個の引数を指定できません。」とエラーがでましたが、どうしたらいいかわかりません。
OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。 どうかお願いします。

長すぎるようなので、二つに切りました(その1)
#include <iostream>
using namespace std;

//定数定義 
#define N 3
#define END 0 //終了
#define INPUT 1 //行列の入力
#define SHOW 2 //表示
#define ADD 3 //行列の和
#define SUB 4 //行列の差
#define MULTI 5 //行列の積
#define SHOWMULTI 6 //中間式の表示

//プロトタイプ宣言
void showMenu(int matrix[N][N]); //機能の一覧を表示する関数
void getMatrix(int matrix[N][N]); //行列に値を入力する関数
void showMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列を表示する関数
void addMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の和を求める関数
void subtractMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の差を求める関数
void multiplyMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の積を求める関数
void showMultiplicationFormula(int matrix1[N][N], int matrix2[N][N]); //行列の積の中間結果を表示する関数
void showMenu(void); //機能の一覧を表示する関数



/******************************
メイン関数
******************************/
void main(){
    int functionNo;        //機能番号
    int matrixNo;          //操作する行列番号
    int matrix1[N][N] = {  //配列1
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0},
    };              
    int matrix2[N][N] = {  //配列2
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0},
    };               
    int matrix3[N][N] = {  //計算結果
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0},
    };              
    
    //1.機能の一覧を表示する
    showMenu();

    //2.機能番号を入力する
    cout << "機能番号を入力してください";
    cin >> functionNo;

    //3.機能番号が「終了」でない限り、以下の処理を繰り返す
    while(functionNo != END){

        //機能番号に対応する処理に分岐する
        switch(functionNo) {

            //3.1機能番号が「行列の入力」ならば、以下の処理を実行する
            case INPUT:

                //3.1.1行列番号(1=配列1 or 2=配列2)を入力する
                cout << "入力する配列は? (1 or 2) : ";
                cin >> matrixNo;

                //3.1.2指定された行列を入力する
                if(matrixNo == 1){
                    getMatrix(matrix1);
                }
                
                else if(matrixNo == 2){
                    getMatrix(matrix2);
                }

                else{
                    cout << "配列番号がおかしいです";
                }
                break;

            //3.2機能番号が「行列の表示」ならば、以下の処理を実行する
            case SHOW:

                //3.2.1配列番号を入力する
                cout << "表示する配列は? (1, 2 or 3) : ";
                cin >> matrixNo;

                //3.2.2指定された行列を表示する
                if(matrixNo == 1){
                    showMatrix(matrix1);
                }

                else if(matrixNo == 2){
                    showMatrix(matrix2);
                }

                else if(matrixNo == 3){
                    showMatrix(matrix3);
                }

                else{
                    cout << "配列番号がおかしいです";
                }
                break;


            //3.3機能番号が「行列の和」ならば、以下の処理を実行する
            case ADD:
                addMatrix(matrix1, matrix2, matrix3);
                break;

            //3.4機能番号が「行列の差」ならば、以下の処理を実行する
            case SUB:
                subtractMatrix(matrix1, matrix2, matrix3);
                break;

            //3.5機能番号が「行列の積」ならば、以下の処理を実行する
            case MULTI:
                multiplyMatrix(matrix1, matrix2, matrix3);
                break;

            //3.6機能番号「中間式の表示」ならば、以下の処理を実行する
            case SHOWMULTI:
                showMultiplicationFormula(matrix1, matrix2);
                break;
            
            //機能番号が0〜6以外ならば、コメントを表示する
            default:
                cout << "機能番号が対応していません" << endl;
                break;
        //3.7機能を一覧表示する
        showMenu();
        cout << "機能番号=";

        //3.8機能番号を入力する
        cin >> functionNo;
        }
    }
}





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

Name: kos-mos  ..中級者(13,231ポイント)   Date: 2009/12/21(月) 18:34   No:44583     
Title: Re:C++の宿題での質問です    
(その2)です。

/************************************
指定された行列に値を入力する
************************************/
void getMatrix(int matrix[N][N]){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.当該行の各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < N; j++){

            //1.1.1.指定された行列のrow行column列の要素に値を入力する
            cout << "行列の" << i << "行" << j << "列要素を入力してください:";
            
            cin >> matrix[i][j];
        }
    }
}

/************************************
指定された行列を表示する
************************************/
void showMatrix(int matrix[N][N]){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < N; j++){

            //1.1.1.行列のrow行 column列の要素の値を表示する
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;
}

/**************************
行列の和を求める
**************************/
void addMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]){
    
    //1.配列の各要素を加算する
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            matrix3[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }
}

/**************************
行列の差を求める
**************************/
void subtractMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]){
    
    //1.配列の各要素を減算する
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            matrix3[i][j] = matrix1[i][j] - matrix2[i][j];
        }
    }
}

/**************************
行列の積を求める
**************************/
void multiplyMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]){
    
    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.当該行の各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < N; j++){

            //1.1.1.計算結果のrow行column列を0とする
            matrix3[i][j] = 0;

            //1.1.2.変数 kの値を0〜N-1まで変えながら以下の処理を繰り返す
            for(int k = 0; k < N-1; k++){

                //1.1.2.1.行列1のrow行 k列の値と行列2のk行 column列の値を乗じて、計算結果のrow行 column列に加算する。 
                int x = matrix3[i][j] + matrix1[i][k] * matrix2[k][j];
                matrix3[i][j] = x;
            }
        }
    }
}

/*********************************
行列の積を求める中間式を表示する
*********************************/
void showMultiplicationFormula(int matrix1[N][N], int matrix2[N][N]){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.当該行の各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < N; j++){

            //1.1.1.変数 kの値を0〜N-1まで変えながら以下の処理を繰り返す
            for(int k = 0; k < N-1; k++){

                //1.1.1.1.行列1のrow行 i列の値を表示する。(負数の場合のみ()で囲む) 
                cout << matrix1[i][k];

                //1.1.1.2."*"を表示する
                cout << " * ";

                //1.1.1.3.行列2のi行 column列の値を表示する。(負数の場合のみ()で囲む) 
                cout << matrix2[k][j];

                //1.1.1.4.kがN-1でなければ "+"を表示する
                if(k != N-1){
                    cout << " + ";
                }
            }
        }

        //1.2.改行する
        cout << endl;
    }
}

/******************************
機能の一覧を表示する
******************************/
void showMenu(void){

    //1.機能番号の一覧を表示する
    cout << "機能番号を選択してください" << endl;
    cout << " 0 " << "プログラムの終了(END)" << endl;
    cout << " 1 " << "行列の入力(INPUT)" << endl;
    cout << " 2 " << "行列の表示(SHOW)" << endl;
    cout << " 3 " << "行列の和(ADD)" << endl;
    cout << " 4 " << "行列の差(SUB)" << endl;
    cout << " 5 " << "行列の積(MULTI)" << endl;
    cout << " 6 " << "中間式の表示(SHOWMULTI)" << endl;
}



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

Name: たかぎ [URL]  ..ハッカー(142,914ポイント)   Date: 2009/12/21(月) 18:46   No:44584     
Title: Re:C++の宿題での質問です    
> 「'showMatrix' : 関数に 1 個の引数を指定できません。」とエラーがでましたが、どうしたらいいかわかりません。 

選択肢は次のどれかです。

・showMatrixに適切な実引数を3つ渡す。
・showMatrixに省略時実引数を設定する。
・多重定義されたshowMatrixの宣言を呼出しより前に行う。
・showMatrixではなく、別の関数を呼び出す。
・showMatrixの呼び出しそのものをやめる。



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

Name: kos-mos  ..中級者(13,256ポイント)   Date: 2009/12/21(月) 19:41   No:44588     
Title: Re:C++の宿題での質問です    
getMatrix で同様のことがならないのはなんでですか?

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

Name: たかぎ [URL]  ..ハッカー(142,931ポイント)   Date: 2009/12/21(月) 19:46   No:44589     
Title: Re:C++の宿題での質問です    
> getMatrix で同様のことがならないのはなんでですか?

文法的に間違っていないから。


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

Name: kos-mos  ..中級者(13,299ポイント)   Date: 2009/12/21(月) 19:50   No:44590     
Title: Re:C++の宿題での質問です    
>showMatrixに省略時実引数を設定する。
>多重定義されたshowMatrixの宣言を呼出しより前に行う。
とは、具体的にどうしたらいいんでしょうか?


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

Name: kos-mos  ..中級者(14,224ポイント)   Date: 2009/12/21(月) 20:23   No:44597     
Title: Re:C++の宿題での質問です    
以下のように書き換えたところ当初のエラーはなくなったのですが、新たに 「'addMatrix' : 1 番目の引数を 'int' から 'int [][3]' に変換できません。(新しい機能 ; ヘルプを参照)」と表示されました。
どうしたらいいでしょうか?

//プロトタイプ宣言
void showMenu(int matrix[N][N]); //機能の一覧を表示する関数
void getMatrix(int matrix[N][N]); //行列に値を入力する関数
void showMatrix(int matrix[N][N]); //行列を表示する関数
void addMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の和を求める関数
void subtractMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の差を求める関数
void multiplyMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の積を求める関数
void showMultiplicationFormula(int matrix1[N][N], int matrix2[N][N]); //行列の積の中間結果を表示する関数
void showMenu(void); //機能の一覧を表示する関数



/******************************
メイン関数
******************************/
void main(){
    int functionNo;        //機能番号
    int matrixNo;          //操作する行列番号
    int matrix1[N][N] = {  //配列1
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0},
    };              
    int matrix2[N][N] = {  //配列2
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0},
    };               
    int matrix3[N][N] = {  //計算結果
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0},
    };              
    
    //1.機能の一覧を表示する
    showMenu();

    //2.機能番号を入力する
    cout << "機能番号を入力してください。機能番号= ";
    cin >> functionNo;

    //3.機能番号が「終了」でない限り、以下の処理を繰り返す
    while(functionNo != END){

        //機能番号に対応する処理に分岐する
        switch(functionNo) {

            //3.1機能番号が「行列の入力」ならば、以下の処理を実行する
            case INPUT:

                //3.1.1行列番号(1=配列1 or 2=配列2)を入力する
                cout << "入力する配列は? (1 or 2) : ";
                cin >> matrixNo;

                //3.1.2指定された行列を入力する
                if(matrixNo == 1){
                    getMatrix(matrix1);
                }
                
                else if(matrixNo == 2){
                    getMatrix(matrix2);
                }

                else{
                    cout << "配列番号がおかしいです";
                }
                break;

            //3.2機能番号が「行列の表示」ならば、以下の処理を実行する
            case SHOW:

                //3.2.1配列番号を入力する
                cout << "表示する配列は? (1, 2 or 3) : ";
                cin >> matrixNo;

                //3.2.2指定された行列を表示する
                if(matrixNo == 1){
                    showMatrix(matrix1);
                }

                else if(matrixNo == 2){
                    showMatrix(matrix2);
                }

                else if(matrixNo == 3){
                    showMatrix(matrix3);
                }

                else{
                    cout << "配列番号がおかしいです";
                }
                break;


            //3.3機能番号が「行列の和」ならば、以下の処理を実行する
            case ADD:
                addMatrix(matrix1[N][N], matrix2[N][N], matrix3[N][N]);
                break;

            //3.4機能番号が「行列の差」ならば、以下の処理を実行する
            case SUB:
                subtractMatrix(matrix1[N][N], matrix2[N][N], matrix3[N][N]);
                break;

            //3.5機能番号が「行列の積」ならば、以下の処理を実行する
            case MULTI:
                multiplyMatrix(matrix1[N][N], matrix2[N][N], matrix3[N][N]);
                break;

            //3.6機能番号「中間式の表示」ならば、以下の処理を実行する
            case SHOWMULTI:
                showMultiplicationFormula(matrix1, matrix2);
                break;
            
            //機能番号が0〜6以外ならば、コメントを表示する
            default:
                cout << "機能番号が対応していません" << endl;
                break;
        }

        //3.7機能を一覧表示する
        showMenu();
        
        //3.8機能番号を入力する
        cout << "機能番号=";
        cin >> functionNo;
    }
}



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

Name: トントン  ..ぴよぴよ(487ポイント)   Date: 2009/12/21(月) 22:14   No:44608     
Title: Re:C++の宿題での質問です    
>'addMatrix' : 1 番目の引数を 'int' から 'int [][3]' に変換できません
渡す引数が間違っているからエラーになります。
渡そうとした引数の中身を確認してみましょう。


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

Name: kos-mos  ..中級者(14,243ポイント)   Date: 2009/12/21(月) 22:25   No:44611 解決!     
Title: Re:C++の宿題での質問です    
おかげさまでちゃんと動作しました。
ありがとうございました。


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



Name: お願いします  ..かけだし(1,502ポイント)   Date: 2009/12/21(月) 22:12   No:44606       
Title: 教えてください    
今、「c言語わくわくゲームプログラミング教室」という本で勉強しています。
そこで、本のコードを改造しています。
以下のコードは、自キャラの動きの部分です。(みにくくてすいません)
//メインループ
void MyMain(){
    Vector curvec1 = {0,0} ;

    int Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
    if( Key & PAD_INPUT_LEFT ){
        curvec1 = AddVector( curvec1, LEFTMOVEC );
        g_direction = DIRECTIN_LEFT;
    }
    if( Key & PAD_INPUT_RIGHT ){
        curvec1 = AddVector( curvec1, RIGHTMOVEC );
        g_direction = DIRECTION_RIGHT;
    }

    //地面との当たり判定
    BOOL ontheground = FALSE; //着地フラグ
    if ( g_jikipos.y > 399 ){
        ontheground = TRUE;
        g_nowjumping = FALSE;
        g_jikivector.x = 0;
        g_jikivector.y = 0;
    }

    if( Key & PAD_INPUT_A ){
        curvec1 = AddVector( curvec1, JUMPMOVEC );
        g_nowjumping = TRUE;
    }

    //自キャラ座標の計算
    if ( ontheground == TRUE ){
                //接地時
        g_jikivector = AddVector( g_jikivector, curvec1 );
    } else {
        //ジャンプ中
        g_jikivector = AddVectorInFrameTime( g_jikivector, GRAVITY );
        if(g_jikivector.y > 400) g_jikivector.y = 400;
    }
    g_jikipos = AddVectorInFrameTime( g_jikipos, g_jikivector );
    //自キャラの描画
    if ( (ontheground == TRUE) && (g_nowjumping == FALSE) ){
        if ( fabs(curvec1.x) > ZEROVALUE ){
            //走る
            DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0.3, g_direction,
                &g_jikiimage[2], 6, 12);
        } else {
            //停止状態
            DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0 , g_direction,
                &g_jikiimage[0],1, 12 );
        }
    } else {
        //ジャンプ状態
        if ( fabs(g_jikivector.x) < ZEROVALUE ){
            DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
                &g_jikiimage[8],1, 12 );
        } else {
            DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
                &g_jikiimage[9],1, 12);
        }
    }
}



このコードを実行すると、ジャンプ中に左右の移動ができなくなります。
接地している時と同じように、空中でも左右に動けるようにはできませんか?
お願いします。


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


Name: MNS  ..プログラマー(25,366ポイント)   Date: 2009/12/21(月) 22:21   No:44610     
Title: Re:教えてください    
中身がわからない関数がいくつかあるので、あまり自信はありませんが

    //自キャラ座標の計算
    if ( ontheground == TRUE ){
                //接地時
        g_jikivector = AddVector( g_jikivector, curvec1 );
    } else {
        //ジャンプ中
        g_jikivector = AddVectorInFrameTime( g_jikivector, GRAVITY );
        if(g_jikivector.y > 400) g_jikivector.y = 400;
    }
この部分を
    //自キャラ座標の計算
    if ( ontheground == FALSE ){
        //ジャンプ中
        g_jikivector = AddVectorInFrameTime( g_jikivector, GRAVITY );
        if(g_jikivector.y > 400) g_jikivector.y = 400;
    }
    g_jikivector = AddVector( g_jikivector, curvec1 );


こうしたらどうでしょう?


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

Name: 初心者   Date: 2009/12/27(日) 01:48   No:446061261846083 解決!     
Title: Re:教えてください    
返信遅れてすいません。
早速やってみたいと思います。




Name: jay  ..中級者(14,086ポイント)   Date: 2009/12/20(日) 19:01   No:44538       
Title: 弾幕のプチテストプレイその3    
例によって龍神録仕様でコードを書きますので、お気軽にしてみて下さい。
テストプレイした後で指摘、感想、意見等よろしくお願いします。

void boss_shot_bulletH032(){
    #define TM032 300 
    int s,i,k,t=boss_shot.cnt%TM032,t2=boss_shot.cnt;
    double angle=bossatan2();
    static int n,c,b,cnum;
    if(t2==0){//最初なら
        cnum=0;
        b=150;
        n=25;
        c=8;
    }
    if(t%6==0){
        for(s=-5;s<6;s+=2){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =8;
            boss_shot.bullet[k].col   =c;
            boss_shot.bullet[k].x     =boss.x+40;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =bossatan4(boss_shot.bullet[k].x,boss_shot.bullet[k].y)+(PI/180*n*s);
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =5;
            boss_shot.bullet[k].state =0;
            se_flag[0]=1;
            }
        }
    }
    if(t%6==0){
        for(s=-5;s<6;s+=2){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =8;
            boss_shot.bullet[k].col   =c;
            boss_shot.bullet[k].x     =boss.x-40;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =bossatan4(boss_shot.bullet[k].x,boss_shot.bullet[k].y)+(PI/180*n*s);
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =5;
            boss_shot.bullet[k].state =0;
            se_flag[0]=1;
            }
        }
    }
    if(t%b==0){
        for(s=1;s<3;s++){
        for(i=0;i<8;i++){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =0;
            boss_shot.bullet[k].col   =4;
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =angle+PI2/8*i;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2;
            boss_shot.bullet[k].state =s;
            se_flag[0]=1;
                }
            }
        }
    }
    for( i=0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 ){
        int state = boss_shot.bullet[i].state;    
            if(state==1)
                boss_shot.bullet[i].angle-= PI/10/36;
            if(state==2)
                boss_shot.bullet[i].angle+= PI/10/36;
        }
    }
if(t==0){
    if(cnum>1){
        for(i=0;i<24;i++){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =11;
            boss_shot.bullet[k].col   =5;
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =PI2/24*i;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2.3;
            boss_shot.bullet[k].state =3;
            se_flag[0]=1;
                }
            }
        }
    }
    for( i=0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 ){
        int state = boss_shot.bullet[i].state;
        if(t==70){
            if(state==3){
                boss_shot.bullet[i].angle = bossatan4(boss_shot.bullet[i].x,boss_shot.bullet[i].y);
                boss_shot.bullet[i].spd  -= rang(0.4);
                }
            }
        }
    }
if(t==299){
    cnum++;
    if(cnum==2){
        n=20;
        c=0;}
    if(cnum==4){
        n=15;
        c=3;
        b=100;}
    if(cnum==6){
        n=12;
        c=5;}
    if(cnum==8)
        b=75;
    if(cnum==8)
        b=60;
    }
}

この弾幕は3面ボスがラストで使う予定です(ラストは少し難易度高めに)。
それもふまえて指摘などよろしくお願いします。


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


Name: チルチル  ..比類無きプログラマー(86,844ポイント)   Date: 2009/12/20(日) 20:07   No:44544     
Title: Re:弾幕のプチテストプレイその3    
今までと比べると難しくなっていますね
でも難易度高めにするつもりなら問題無いと思いますよ
まあ5,6面の難易度が高くなりすぎるのは心配ですが・・

気になった所は
避けにくくする演出だと思うんですが
蝶弾が自機の方に向きを変える時にバラバラになって
飛んでくるのが少し理不尽な感じがしました

軌道が読みにくいのでメビウスの輪のように
形を維持したまま綺麗に飛んできて欲しいです

それにしても早くも3面まで作るとは凄いですね

あとbossatan4関数ってjayさんが追加した関数でしょうか?
だとすると前のトビを見ていない人はわからないと思うのでとりあえず定義を・・
double bossatan4(double x,double y){//指定座標と自機
return atan2(ch.y-y,ch.x-x);
}


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

Name: jay  ..かけだし(1,157ポイント)   Date: 2009/12/20(日) 21:41   No:44548     
Title: Re:弾幕のプチテストプレイその3    
>まあ5,6面の難易度が高くなりすぎるのは心配ですが・・ 
一応前5ステージのつもりです。

>避けにくくする演出だと思うんですが 
蝶弾が自機の方に向きを変える時にバラバラになって 
飛んでくるのが少し理不尽な感じがしました 
バラバラにした方が難しいかと思いまして。

>早くも3面まで作るとは凄いですね 
早くないと課題の期限に間に合わないんですよ・・・

>bossatan4関数ってjayさんが追加した関数でしょうか? 
だとすると前のトビを見ていない人はわからないと思うのでとりあえず定義を・・
あっ、わざわざありがとうございます。
でも”bossatan4関数”は龍神録の館の中で管理人さんが作られた関数なんですよ。
番外編3 正直者の死を作ってみよう で追加された関数です。

関係ないですが僕も自分で495の波紋とか二重黒死蝶とか月のいはかさの呪いとか
作ったはいいですが、果してこのゲームで使っていいものか・・・

>軌道が読みにくいのでメビウスの輪のように 
形を維持したまま綺麗に飛んできて欲しいです
こんな感じですか?

これだとワインダーの色が赤くなってからが凄く難しい気がしますけど

void boss_shot_bulletH032(){
    #define TM032 300 
    int s,i,k,t=boss_shot.cnt%TM032,t2=boss_shot.cnt;
    double angle=bossatan2();
    static int n,c,b,cnum;
    if(t2==0){//最初なら
        cnum=0;
        b=150;
        n=25;
        c=8;
    }
    if(t%6==0){
        for(s=-5;s<6;s+=2){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =8;
            boss_shot.bullet[k].col   =c;
            boss_shot.bullet[k].x     =boss.x+40;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =bossatan4(boss_shot.bullet[k].x,boss_shot.bullet[k].y)+(PI/180*n*s);
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =5;
            boss_shot.bullet[k].state =0;
            se_flag[0]=1;
            }
        }
    }
    if(t%6==0){
        for(s=-5;s<6;s+=2){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =8;
            boss_shot.bullet[k].col   =c;
            boss_shot.bullet[k].x     =boss.x-40;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =bossatan4(boss_shot.bullet[k].x,boss_shot.bullet[k].y)+(PI/180*n*s);
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =5;
            boss_shot.bullet[k].state =0;
            se_flag[0]=1;
            }
        }
    }
    if(t%b==0){
        for(s=1;s<3;s++){
        for(i=0;i<8;i++){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =0;
            boss_shot.bullet[k].col   =4;
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =angle+PI2/8*i;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2;
            boss_shot.bullet[k].state =s;
            se_flag[0]=1;
                }
            }
        }
    }
    for( i=0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 ){
        int state = boss_shot.bullet[i].state;    
            if(state==1)
                boss_shot.bullet[i].angle-= PI/10/36;
            if(state==2)
                boss_shot.bullet[i].angle+= PI/10/36;
        }
    }
if(t==0){
    if(cnum>1){
        for(i=0;i<24;i++){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].knd   =11;
            boss_shot.bullet[k].col   =5;
            boss_shot.bullet[k].x     =boss.x;
            boss_shot.bullet[k].y     =boss.y;
            boss_shot.bullet[k].flag  =1;
            boss_shot.bullet[k].angle =PI2/24*i;
            boss_shot.bullet[k].cnt   =0;
            boss_shot.bullet[k].spd   =2.3;
            boss_shot.bullet[k].state =3+i;
            se_flag[0]=1;
                }
            }
        }
    }
    for( i=0; i < BOSS_BULLET_MAX; i++ ){
        if( boss_shot.bullet[i].flag > 0 ){
        int state = boss_shot.bullet[i].state;
        if(t==70){
            if(state>=3){
                boss_shot.bullet[i].angle = bossatan4(boss_shot.bullet[i].x,boss_shot.bullet[i].y);
                boss_shot.bullet[i].spd  = 2;
                }
            }
        }
    }
if(t==299){
    cnum++;
    if(cnum==2){
        n=20;
        c=0;}
    if(cnum==4){
        n=15;
        c=3;
        b=100;}
    if(cnum==6){
        n=10;
        c=5;}
    if(cnum==8)
        b=75;
    if(cnum==8)
        b=60;
    }
}


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

Name: チルチル  ..比類無きプログラマー(87,096ポイント)   Date: 2009/12/20(日) 22:07   No:44550     
Title: Re:弾幕のプチテストプレイその3    
>一応前5ステージのつもりです。

なら問題無いと思いますよ

>早くないと課題の期限に間に合わないんですよ・・・

課題だったんですか
それは急がないといけませんね

>番外編3 正直者の死を作ってみよう で追加された関数です。

そう言えば番外編は別ルートでしたね

>作ったはいいですが、果してこのゲームで使っていいものか・・・

別に大丈夫だと思いますよ
今回は期限に間に合わないという大義名分もありますしね

>これだとワインダーの色が赤くなってからが凄く難しい気がしますけど

でも前回よりはバランスが良くなったと思いますよ
あとは赤の時の幅をもう少し広げてくれれば避けやすいです


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

Name: jay  ..中級者(14,095ポイント)   Date: 2009/12/21(月) 21:17   No:44602     
Title: Re:弾幕のプチテストプレイその3    
チルチルさん
>前回よりはバランスが良くなったと思いますよ
見栄えもよくなりました。
ワインダーの隙間ももう少し広げてみます。

一応解決にしときますが引き続き意見など募集します。


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



Name: 50シーマ  ..ぴよぴよ(608ポイント)   Date: 2009/12/21(月) 15:42   No:44564       
Title: forループでの数値代入    
管理人様、先日は大変お世話になり感謝しております。
おかげである程度のプログラムを作ることができました。
しかし、行き詰ってしまったので質問さしてください。
大変貴重なスペースおかりします。

I=i0sin^2(2θ)sin^2(Δndπ/λ)

数値は θ=45° I0=1 Δndは500 800 1100 1400
λは400〜800までの数値で計算しファイルに落としグラフ化することができました。
そのプログラムがこのようになりました。

#include <stdio.h>
#include <math.h>
int main(){
    FILE *fp;    /* ファイルポインタの宣言 */
    fp = fopen("C:\\exam.txt", "w");//ファイルポインタを書き込みモード
  double  ns[4]={500.,800.,1100.,1400.};//冢d
  double  rs=400; //λ
  double  pi=3.141592653589793;
  int     i,n=4;  //  ns
  int     j,m=401;  //  rs
  double  arg;    // sin(arg)
  double  snx;    // sqrt(fij)
  double  f[4][401];
  double  ni,rj;
  int res;
  printf("番号を入力\n");
  printf("1 : 直行ニコル\n");
  printf("2 : 平行ニコル\n");
  printf("3 : 直行ニコル2\n");
  printf("4 : 平行ニコル2\n");
  printf("5 : 直行ニコル3\n");
  printf("6 : 平行ニコル3\n");
  scanf("%d", &res);

  for(i=0;i<n;i++){
    ni = ns[i];
    for(j=0;j<m;j++){
        rj = rs+j;
        arg = ni*pi/rj;
        snx = sin(arg);
        if(res == 1)
        {
            f[i][j] = snx*snx;
        }
        else if(res == 2)
        {
            f[i][j] = 1-snx*snx;
        }
        else if(res == 3)
        {
            f[i][j] = snx*snx*snx*snx;
        }
        else if(res == 4)
        {
            f[i][j] = 1-snx*snx*snx*snx;
        }
             else if(res == 5)
        {
            f[i][j] = snx*snx*snx*snx*snx*snx;
        }
        else if(res == 6)
        {
            f[i][j] = 1-snx*snx*snx*snx*snx*snx;
        }
    }
  }
    fprintf(fp, "\t");
//Δnd
  for(i=0;i<n;i++)
  {
    ni = ns[i];
    printf("%5.0\t",ni);
    fprintf(fp,"%5.0f\t", ni);

  }
    printf("\n");
    fprintf(fp, "\n");
//波長の数値
  for(j=0;j<m;j++)
  {
    rj = rs+j;
    printf("%d\t",j+400);
    fprintf(fp, "%d\t", j+400);

        for(i=0;i<n;i++)//波長の数値ごとにΔndにおける透過強度を計算
        {
          printf("%5.3f\t",f[i][j]);
          fprintf(fp, "%5.3f\t", f[i][j]);
        }
    printf("\n");
    fprintf(fp,"\n");
  }
  fclose(fp);//ファイルを閉じる

  return 0;
}

このプログラムから冢とdの数値を入力できるようにしたいのでるがどのようにすればいいですか?
数値を入力しても冢dがforループでつかえるようにしたいのです。
最初のdの値は1.5なのですがどのようにしたらいいのかアドバイスもらえたらたすかります。
協力おねがいいたします。


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


Name: 50シーマ  ..ぴよぴよ(664ポイント)   Date: 2009/12/21(月) 16:13   No:44566     
Title: Re:forループでの数値代入    
追加です。
最初は冢とdに数値を入れ
冢*dを500 800 1100 1400の数値をだしプログラムが起動させたいです。
よろしくおねがいします。


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

Name: たかぎ [URL]  ..ハッカー(142,743ポイント)   Date: 2009/12/21(月) 17:37   No:44577     
Title: Re:forループでの数値代入    
まずはお約束ですので...



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



Name: 256bit  ..入門者(2,568ポイント)   Date: 2009/12/18(金) 20:10   No:44499       
Title: ブロックの描画    
              for(i=0;i<15;i++)
                       for(j=0;j<20;j++)
                              if(hantei[i][j]==0)
                                      DrawGraph(○○,○○,image[*],TRUE);//←※
 

 自分で作ったブロックをマップ上に描画したいのですが、※の部分をDrawGraph関数で表記することはできますか?


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


Name: Justy  ..伝説なるハッカー(486,399ポイント)   Date: 2009/12/20(日) 01:41   No:44535     
Title: Re: ブロックの描画    
 出来ないと考えられる理由は特に見あたらないので、出来るはずです。

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

Name: 256bit  ..入門者(2,625ポイント)   Date: 2009/12/20(日) 19:04   No:44539 解決!     
Title: Re: ブロックの描画    
 >>Justyさん

 ありがとうございます。
 本文の○○に値を入れてみたら、成功しました。(^_^)b

 
 


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



Name: dic  ..熟練のプログラマー(41,467ポイント)   Date: 2009/12/19(土) 20:46   No:44527       
Title: 雑談    
シューティング製作で、ここのサイトにめぐり合えたのですが、
私はオブジェクト指向で考えていたので、ここのプログラムの構造には
私が考えていたものと違い、また、他のサイトでも違っていてて悩んでいました


私なりに調べ、タスクシステムというものも探しあて
これも私独自に納得し、これをオブジェクト指向でとらえたのが
http://10.niceboat.org/10/s/10ko143734.jpg
です

私なりに独自に生み出したオブジェクト指向で、
ゲームを表現したものが
http://10.niceboat.org/10/s/10ko143733.jpg
です

私なりのやり方でやっていきたいのですが、
正直複雑になりすぎて、なにがなんだが、わからなくなっていきます
ので、私なりのやり方でいきたいけど、複雑になるという葛藤が起きてしまいます
ここはシンプルに作っていった方がいいのか、私なりのやり方でいくのか
どちらがいいか、ご意見をいただきたいです

現状としては、「ザツでいいからやりなさい」という先生の助言の通り
やっていきたいですが、途中で、修正したいなぁとも思ったりして
3歩進んで2歩さがる状態で、統一性がなくなり完成が困難になってしまってます


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


Name: mnkr  ..入門者(3,011ポイント)   Date: 2009/12/19(土) 23:48   No:44531     
Title: Re:雑談    
机上で考えるだけだとどうしようもないので、
とりあえず何か作ってみてはどうでしょう?

例えば、考えている100機能のうちの5機能だけ実装したものを作り、
それから自分の考えている方向へすすめて都度都度修正していくとか。

いきなり全てを実装した完璧なものを作ろうと考えるから難しくなるんだと思います。
まずは小さい物からやってみては?


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

Name: ぽこ  ..かけだし(2,406ポイント)   Date: 2009/12/20(日) 00:24   No:44532     
Title: Re:雑談    
パッと見、十分シンプルだと思いますよ。
このまま進めてはどうですか?


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

Name: dic  ..熟練のプログラマー(41,489ポイント)   Date: 2009/12/20(日) 09:12   No:44537 解決!     
Title: Re:雑談    
そうですね
進めてみてからまたつまづいたら、質問します
ありがとうございました


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



Name:  ..ぴよぴよ(33ポイント)   Date: 2009/12/19(土) 00:52   No:44507       
Title: ソリューションファイル    
ソリューションファイル[sln]

が開けませんどうしてですか?


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


Name: DVDM [URL]  ..熟練のプログラマー(45,235ポイント)   Date: 2009/12/20(日) 03:58   No:44536     
Title: Re:ソリューションファイル    
>>初さん
考えられる原因は
・コンパイラをダウンロードしていないため
・はじめて起動する場合はコンパイラからファイル→開くをしないと駄目だそうです

もし、コンパイラをダウンロードしていないのであれば
http://www.microsoft.com/japan/msdn/vstudio/Express/
こちらのページ中央くらいにあります
「Visual Studio C++ 2008 Express Edition」(黄色い画像のところ)でもダウンロードしてみてください。
「Web インストール (ダウンロード)」 をクリックするとダウンローが始まります。
インストールのやり方がわからなければ、「はじめての方のためのインストール方法」を読んでみてはいかがでしょうか。


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



Name: MNS  ..プログラマー(25,073ポイント)   Date: 2009/12/18(金) 20:38   No:44501       
Title: 3DCGソフトウェアについて    
現在、シムシティのようなシミュレーションゲームを製作しており、
マップをクォータービューで表示するようにしています。
その際に、マップチップ等は俯瞰視点で描かなければならず、
面倒だと感じたので、どうにか3DCGソフトで作れないものかと思いました。

私は、3DCGソフトではメタセコイアを触れた程度の経験しかないのですが、
図形として正方形を用意し、そこにテスクチャを貼って、視点を適当に定めて
レンダリングすることによって、楽に製作できると考えました。

3DCGソフトにはメタセコイアを使用し
正方形を作成してテスクチャを貼ることぐらいは簡単に出来ましたが、
その後のレンダリングの作業でいまいちわからなくなりました。
マップチップは、横32pixel、縦16pixelのひし形ですが、
この形になるように視点を定めることはできたのですが、(ピッチを30に設定した)
具体的に、レンダリングで生成される図形が、
さきのような幅、高さになるようにレンダリングする方法がわかりませんでした。
また、マップには高さがあり、4つの頂点の高さが異なる場合があり、
その画像も、正方形を作成しテスクチャを貼り、頂点を適当な高さに持っていき、
あとは同じようにレンダリングすれば出来ると考えたのですが、
はっきりとした影等の明暗が出ず、望むような結果は得られませんでした。

ここで質問なのですが、上の二つのことを、メタセコイアで実現できるのでしょうか?
できるとしたら、どのような手法を用いれば可能でしょうか?
また、出きないとしたら、それが出来るような3DCGソフトを教えていただけたらと思います。


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


Name: Justy  ..伝説なるハッカー(486,282ポイント)   Date: 2009/12/19(土) 01:31   No:44509     
Title: Re:3DCGソフトウェアについて    

> さきのような幅、高さになるようにレンダリングする方法

 レンダリング段階でぴったし合わせるには、理論的には計算で出せなくもないでしょうが、
いろいろ大変なので、何度もレンダリングして試して調整するのが早いです。

 ただこの場合レンダリング段階でサイズをそろえなくても、後から PSとか GIMPで
リサイズすればいいのではないですか?



> はっきりとした影等の明暗が出ず

 ライティングの問題ということではなくて?
 現状と望む結果というのがどういう状態なのかよくわからないです。
 
 ちなみにこの高さというのは地形の高低表現としての高さであれば、
素材側では何もしないでゲーム側で位置を底上げして表示する、
では代用できないでしょうか?

 あれ?でもテクスチャを貼ったオブジェクトが正方形だと高さがあった場合
側面部分はどうなるんでしょう?


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

Name: MNS  ..プログラマー(25,232ポイント)   Date: 2009/12/19(土) 12:22   No:44521 解決!     
Title: Re:3DCGソフトウェアについて    
解決した、というわけではないのですが、
この方法も結構煩わしく、こういうことならゲーム内で直接ポリゴンを作り、
テスクチャを貼りつけて変形させてしまえばいいのではないか、
という結論に達したので、とりあえずはそちらの手法を用いることにしました。
(ただ、DXライブラリの3D機能で出来るものなのか不明ですが)

Justyさん、どうもありがとうございました。


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

Name: Justy  ..伝説なるハッカー(486,385ポイント)   Date: 2009/12/20(日) 01:24   No:44534     
Title: Re:3DCGソフトウェアについて    
 やはりそうなりましたか。


> DXライブラリの3D機能で出来るものなのか

 平面のマップチップを並べて俯瞰始点から見ることくらいなら
3Dに本格対応した ver3.X系は勿論、ver2.X系のDXライブラリでも十分に可能ですので
その方向でいいと思います。


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



Name: シノニム  ..ぴよぴよ(794ポイント)   Date: 2009/12/17(木) 17:49   No:44402       
Title: テキストファイルからの読み込みについて    
こんにちわ。今回はファイルの扱いについて質問したいと思います

現在音ゲーを作っていて、譜面を作成する関数をやっと作れたんですが、保存したテキストデータを読み込むところが難しくて悩んでいます

テキストファイルには、

143:1
現在の時間(?):音符の場所

FIRST:235:3
識別コード:時間:場所

こんな感じに入力されているんですが、『:』で区切って時間と場所を別々の変数に格納したいと思ってます
FIRSTの部分はchar型で、時間と場所はint型で出力したいです
どうやって判別させればいいのかが分かりません

どなたかお力添えをお願いします

OS:WindowXP
言語:C++(しかし読み込む際にはfscanfを使用したい)


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


Name: バグ  ..ハッカー(180,577ポイント)   Date: 2009/12/17(木) 18:08   No:44404     
Title: Re:テキストファイルからの読み込みについて    
書式指定でなんとかなりそうです。
以下サンプルです。

#include <stdio.h>

void main(void)
{
    char* text = "test:1234:5678";
    char s1[10];
    int a = 0, b = 0;
    sscanf(text,"%[^:]:%d:%d", s1, &a, &b);
    printf("%s\n", text);
    printf("%s\n", s1);
    printf("%d\n", a);
    printf("%d\n", b);
}


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

Name: たかぎ [URL]  ..ハッカー(140,107ポイント)   Date: 2009/12/17(木) 18:10   No:44405     
Title: Re:テキストファイルからの読み込みについて    
> FIRSTの部分はchar型で、時間と場所はint型で出力したいです 
> どうやって判別させればいいのかが分かりません 

"FIRST"をchar型のオブジェクトに格納することは、一般的にはできません。
判別については、いったん文字列で入力し、意味を解析しながら目的の型になるように変換するとよいでしょう。


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

Name: test  ..ぴよぴよ(491ポイント)   Date: 2009/12/17(木) 23:12   No:44430     
Title: Re:テキストファイルからの読み込みについて    
<pre>
#include <stdio.h>



void main(void)

{
    FILE *fp;
    fp = fopen("EASY.txt","r");
    char* text;

    fscanf_s(fp, "%s", &text);

    char s1[10];

    int a = 0, b = 0, c = 0, d = 0, e = 0;

    sscanf(text,"%[^:]:%d:%d,%d,%d,%d", s1, &a, &b, &c, &d, &e);

    printf("%s\n", text);

    printf("%s\n", s1);

    printf("%d\n", a);

    printf("%d\n", b);

    printf("%d\n", c);

    printf("%d\n", d);

    printf("%d\n", e);
    
    fclose(fp);
}
<\pre>


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

Name: シノニム  ..ぴよぴよ(944ポイント)   Date: 2009/12/17(木) 23:16   No:44431     
Title: Re:テキストファイルからの読み込みについて    
すいません上の記事自分です・・・

ソースコードを初めて乗せるので、文字下げしようとしたんですが、こういうの初めてなのでテストしようとした結果です・・・

バグさんのソースを参考にしてこのように作っていじってみたんですが、実行すると何も表示されなくなってしまいました。どうすれば直りますかね・・・

追記:ソースコードの囲み方も教えていただけませんでしょうか・・・(´・ω・`)


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

Name: たかぎ [URL]  ..ハッカー(140,617ポイント)   Date: 2009/12/17(木) 23:19   No:44432     
Title: Re:テキストファイルからの読み込みについて    
> 追記:ソースコードの囲み方も教えていただけませんでしょうか・・・(´・ω・`)

とりあえずこれだけ。
普通に、
<pre>
...
</pre>
のように囲むだけです(<と>は半角)。
最後は、\preではなく、/preです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,114,576ポイント)   Date: 2009/12/17(木) 23:58   No:44442     
Title: Re:テキストファイルからの読み込みについて    
>>シノニムさん

こんばんは^^
音ゲーですか、私も今音ゲー作っていますが、音ゲー作り楽しいですよね☆

さて、読み込み方は色々あって、
形式が完全に決まっているならバグさんのような方法が良いでしょうし、
区切る文字が決まっていて、その形式が不定なら
strtok
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
を使うのもよいでしょう。
また、一文字読み込みつつ、「:」が来たら別の文字列に格納する関数を自作するのも良いと思います。

私としては最後の自作がお勧めです。
私は「初心者は標準関数をなるべく使うな」と教えられました。
関数を作ることは良い勉強になるんですよね。

ところで、投稿する前に確認したい時は「プレビュー」にチェックいれて投稿するとよいですよ。


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

Name: non  ..比類無きプログラマー(82,537ポイント)   Date: 2009/12/18(金) 08:47   No:44471     
Title: Re:テキストファイルからの読み込みについて    
FIRST:235:3 
識別コード:時間:場所 

143:1 
現在の時間(?):音符の場所 

とのことですが、実際のデータでは

FIRST:315:1
SECOND:407:3,2
THERD:516:4,3,2
965:3
1013:2
1052:1
(途中略)
1976:4
FINISH:2046
COMBO:50

sscanfを使うなら、データの形式がはっきりしてないと、いけません。
データのフォーマットを正確に示してください。
場所はカンマ区切りで何個後ろに続くか不明なのですね。
識別コードか現在の時刻を表す行の違いは文字か数字かの違いでしょうか?




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

Name: シノニム  ..ぴよぴよ(202ポイント)   Date: 2009/12/18(金) 20:18   No:44500     
Title: Re:テキストファイルからの読み込みについて    
>> たかぎさん
なるほど・・・スラッシュとバックスラッシュを間違えてましたorz
ご指摘、ありがとうございます

>> 管理人さん
音ゲー作りは今回が初めてなんですが、かなり楽しいです!
strtok関数ですか・・・んー初めて聞く関数です(無知ですいません・・・)
管理人さんが言うように、一度独自に関数作成を試みて、もし折れてしまった際に頼ってみます!

-> 投稿する前に確認したい時は「プレビュー」にチェックいれて投稿するとよいですよ。
そうなんです・・・チェックしようと思っていたんですが忘れてしまいまして。今度から気をつけます

>> nonさん
sscanfをいじっていて分かったんですが(上記のソースで)、

void main(void)
{ 
    char* text = "SECOND:256:2,3"; 


    char s1[10]; 

    int a = 0, b = 0, c = 0, d = 0, e = 0; 

    sscanf(text,"%[^:]:%d:%d,%d,%d,%d", s1, &a, &b, &c, &d, &e); 

    printf("%s\n", text); 

    printf("%s\n", s1); 

    printf("%d\n", a); 

    printf("%d\n", b); 

    printf("%d\n", c); 

    printf("%d\n", d); 

    printf("%d\n", e); 

    fclose(fp); 
} 
このようにしたところ、変数bまではしっかり代入されて、c、d、eは0で初期化された状態でした。 エラーが出なかったので、これを応用して、nonさんの懸念していた問題は解決できそうです。 ->識別コードか現在の時刻を表す行の違いは文字か数字かの違いでしょうか? これを説明すると、ゲームの核部分を事細かに説明しなければならないので、失礼ながら省略させて頂きました。すいません。そしてありがとうございました しかしながら、
 
#include <stdio.h>



void main(void)

{
    FILE *fp;
    fp = fopen("EASY.txt","r");
    char* text;

    fscanf_s(fp, "%s", &text);

    char s1[10];

    int a = 0, b = 0, c = 0, d = 0, e = 0;

    sscanf(text,"%[^:]:%d:%d,%d,%d,%d", s1, &a, &b, &c, &d, &e);

    printf("%s\n", text);

    printf("%s\n", s1);

    printf("%d\n", a);

    printf("%d\n", b);

    printf("%d\n", c);

    printf("%d\n", d);

    printf("%d\n", e);
    
    fclose(fp);
}



なぜこのソースでテキストデータを読み込んでくれないのかが分かりません・・・
エラーは出ないんですが(´・ω・`)


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

Name: non  ..比類無きプログラマー(84,517ポイント)   Date: 2009/12/18(金) 20:46   No:44503     
Title: Re:テキストファイルからの読み込みについて    
>エラーが出なかったので、これを応用して、nonさんの懸念していた問題は解決できそうです。 

そんな、単純な問題ではないと思う。

>char* text;
>fscanf_s(fp, "%s", &text);

char text[80];
fscanf_s(fp,"%s",text);



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

Name: シノニム  ..ぴよぴよ(237ポイント)   Date: 2009/12/19(土) 17:30   No:44524 解決!     
Title: Re:テキストファイルからの読み込みについて    
なんとか解決できました!助けてくださった皆様、ありがとうございました!


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



Name: TKOZ  ..熟練のプログラマー(44,393ポイント)   Date: 2009/12/19(土) 11:50   No:44519       
Title: 斜め坂について    
softyaさんへ

先日のスレが過去ログに入ってしまったので、改めて質問させていただきます。
坂道のアルゴリズムを教えてください。よろしくおねがいします。(09/12/21(改))


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




Name: TKOZ  ..熟練のプログラマー(44,348ポイント)   Date: 2009/12/19(土) 09:12   No:44516       
Title: 3DエンジンをDibSectionで作っているのですが…    
TKOZです。
3DエンジンをWINAPIのDibSectionで作っています。
最終的には、この3Dエンジンを使って、ゲームを作りたいところですが、
下記のページのZバッファでポリゴンを描画したら、画面に全く表示されず、
真っ黒の画面になってしまいました。

※下記のページは、なくなっていました。
OPEN PROGRAMMINGというサイトです。

ソースを載せますので、どなたか、原因が分かる方いますでしょうか?
よろしくお願いします。


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


Name: TKOZ  ..熟練のプログラマー(44,363ポイント)   Date: 2009/12/19(土) 09:42   No:44517     
Title: Re:3DエンジンをDibSectionで作っているのですが…    
ページを保存してあったので、アップロードします。
(本当はいけないのでしょうか?)


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



Name: ターボ  ..入門者(2,531ポイント)   Date: 2009/12/18(金) 07:41   No:44466       
Title: 無料でダウンロードできる本    
青空文庫のように無料でダウンロードできる本のサイトを探しています。英語の本(日本語訳して有る本や日本語訳して無い元々の文学や専門書)や青空文庫に無いような日本の本とかが有るサイトを知っている方がいらっしゃったらご教授お願いします。

青空文庫と近代ディジタルライブラリは知っているのでそれ以外のサイトを紹介していただけると助かります。

本のジャンルは特に指定していません。

よろしくお願いします。


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


Name: 御津凪 [URL]  ..ハッカー(133,477ポイント)   Date: 2009/12/18(金) 10:19   No:44473     
Title: Re:無料でダウンロードできる本    
ジャンルは特に指定しないとのことなので、最近見つけたものを。
IA-32 インテル アーキテクチャ ソフトウェア・デベロッパーズ・マニュアル
http://www.intel.co.jp/jp/download/index.htm

アセンブラプログラミングの参考文献にもなるそうですが、数千ページ(4冊構成)にも及ぶそうです。
(私は中身を見ていませんが)

あと、本ではありませんが、MSDN ライブラリにも参考文献となるようなページがたくさんあります。
特に日本語に翻訳されていない関数群も部分もたくさんありますし。
まあ、こちらのほうはご存知ですよね。


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

Name: softya  ..比類無きプログラマー(70,192ポイント)   Date: 2009/12/18(金) 10:41   No:44474     
Title: Re:無料でダウンロードできる本    
ここはプログラミングのサイトですので、プログラミングにまつわるものを。

Cプログラミング診断室
http://www.pro.or.jp/~fuji/mybooks/cdiag/
自前でダウンロードする必要がありますが、本の内容はほぼ網羅されています。


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

Name: ターボ  ..入門者(2,828ポイント)   Date: 2009/12/18(金) 12:49   No:44481     
Title: Re:無料でダウンロードできる本    
御津凪さんsoftyaさん返信ありがとうございます。

御津凪さんへ
MSDN libraryは無料でダウンロードできるんですね。知らなかったのでさっそくMSDN Library for Visual Studio 2008 SP1 (2008年12月更新版)をダウンロードしています。Visual Studio Express Edition Sp1は数ヶ月前にダウンロードしていたのですが、気づきませんでした。

MSDN libraryは昔Visual C++やVisual Basicなどを買った時に一緒に付いて来たので、これらの製品やViaual Studioなどの製品版を買わないと手に入らないのかと思っていました。無料のExpress Editionの影響かなぁと思いました。

softyaさんへ
実は紹介してもらったサイトは何年か前に他の掲示板に書いてあったので知っていました。でも、親切に紹介してくれてありがとうございました。

引き続きサイト紹介お願いします。出来ればPDFとかでダウンロード出来て、青空文庫みたいに一つのサイトから複数の本がダウンロード出来ればうれしいです。


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

Name: softya  ..比類無きプログラマー(70,406ポイント)   Date: 2009/12/18(金) 13:31   No:44484     
Title: Re:無料でダウンロードできる本    
C言語関係の入門書。
http://www.vector.co.jp/soft/data/prog/se027617.html
http://www.vector.co.jp/soft/data/prog/se145968.html
http://www.vector.co.jp/soft/win95/edu/se205478.html
http://www.vector.co.jp/soft/data/prog/se350385.html
C言語プログラミング入門
http://karetta.jp/book-cover/c-for-beginners

大学とかだと幾つか見つかりますよ。

C プログラミング(基礎と応用) 
http://jubilo.cis.ibaraki.ac.jp/~isemba/PROGRAM/CPROG/c.shtml
C/C++プログラミング入門
http://www.db.is.kyushu-u.ac.jp/adp/


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

Name: ターボ  ..入門者(2,906ポイント)   Date: 2009/12/19(土) 07:30   No:44515     
Title: Re:無料でダウンロードできる本    
softyaさん返信ありがとうございます。そして、色々URLを教えてくださってとても感謝しています。

C プログラミング(基礎と応用)のサイトなどは私はLinuxにも興味があるのでとても興味深かったです。


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



Name: Ma  ..上級者(24,930ポイント)   Date: 2009/12/19(土) 05:52   No:44513       
Title: 3Dエフェクト:ドップラー効果の再現    
(今回自己完結してしまいました、すいません。)

過去すれ
http://www.play21.jp/board/formz.cgi?action=res&resno=44195&page=&lognum=135&id=dixq&rln=44342

の続きになりますが、

ドップラー効果を二次元(高さを考慮しない)で考える場合の再現方法を教えてください。
アイディアでもかまいません。

・やったこと/問題点
ドップラー効果の公式は物理で勉強しましたが、あれは一直線上の場合のみでした。
三次元空間の前に、まずは二次元空間でのドップラー効果の再現方法を考えてみようと思います。

・条件
音の観察者または主人公(これから観察者と略)と、音源の移動方向ベクトルは規則性は特になく変化する。
 (片方はプレイヤーによる操作で、音源は移動する物)
遮蔽物は考えない。

・思いついた方法
1次元のドップラー効果のように正確に周波数を割り出すのは無理だと思い断念、その代わりに
観察者から音源への距離の変化量(距離の微分)、をリストにして各音源に持たせる。
(リストじゃなくても、1フレーム前だけでもいいかも?)
マイフレーム距離の変化量を記録し、その変化量が負ならそれだけ周波数をあげ、正ならばそれだけ周波数を下げる。0のときは、元の音にする。

・欠点
やはりアバウトな計算になり、正確には求められません。


ほかにいい方法とかありますか?

追記:
環境は 
DXライブラリ 3.00f
VC++ 2008 Express Edition

追記2:
そもそも、音が一瞬で伝わってしまうような計算になっていたので、音が伝わるまでに何フレームかかるかも計算して、その分リストを昔に戻って距離の変化量を求めてから周波数をかえる、なんてのも思いつきましたが、、、、
やりすぎでしょうかねw


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


Name: Ma  ..上級者(24,884ポイント)   Date: 2009/12/19(土) 07:15   No:44514 解決!     
Title: Re:3Dエフェクト:ドップラー効果の再現    
実際に前フレームとの距離からで計算してみたら、思ってたよりりも満足できるものになってました。
机上の空論で投稿しないよう気をつけます。お騒がせしました。
でも、もっといい方法ありましたら、アイディア等お願いします。


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



Name: うほ  ..ぴよぴよ(292ポイント)   Date: 2009/12/17(木) 20:53   No:44414       
Title: mp3再生について    
#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;              // ウィンドウモード
        if( DxLib_Init() == -1 ) return -1;     // 初期化
 
 
        int Sound ;
 
        Sound = LoadSoundMem( "test.wav" );      //wavファイルを読み込み、ハンドルをint型変数へ格納
        PlaySoundMem( Sound , DX_PLAYTYPE_BACK );//バックグラウンド再生
 
 
        WaitKey() ;             // キーが押されるまで待つ
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

このなかのtest.wavをじぶんのもっているmp3の名前にしたんですが、よくできません。
どうしたらよいか教えてください。


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


Name: Naohiro19  ..かけだし(2,053ポイント)   Date: 2009/12/17(木) 21:00   No:44415     
Title: Re:mp3再生について    
お答えしたいのですが、質問内容では詳しいことが分からず回答が困難です。
「規約と注意事項」にある「よくわからない人はテンプレを」にあるテンプレートを使って詳細を教えてください。そうすればスムーズに回答を行えますので。
http://dixq.net/board/board.html


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,114,658ポイント)   Date: 2009/12/18(金) 00:02   No:44443     
Title: Re:mp3再生について    
test.wavの名前を変えただけじゃダメですか?
LoadSoundMem関数はwavファイルもmp3ファイルも、またはoggファイルなども読めるので、ファイル名変えたらいいだけですよ。

ところで、Naohiro19さんが仰っているように、なるべく規約に沿った投稿をお願いしますね。
特にソースコードは見やすいようにタグを使って投稿して下さいとお願いしています。
詳しくは規約をご覧ください。


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

Name: デラ初心者  ..入門者(2,782ポイント)   Date: 2009/12/18(金) 22:12   No:44505     
Title: Re:mp3再生について    
階層の問題もあるんじゃないですか?

少し場違いかもしれませんが

タグをどうやったら入れれますか?


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



Name: デラ初心者  ..かけだし(2,366ポイント)   Date: 2009/12/16(水) 19:24   No:44292       
Title: Cの参考書    
C言語の参考書を探しています

前読んだ奴にはstaticやmath.hの関数
が載ってなかったので詳しく載ってる
奴が欲しいです。

C言語は始めて半年位です。
前読んだ本はC言語スタートブックとアルゴリズムの絵本です

年齢は14なので解り易いのがいいです


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


Name: たかぎ [URL]  ..ハッカー(138,274ポイント)   Date: 2009/12/16(水) 19:52   No:44295     
Title: Re:Cの参考書    
「新ANSI C言語辞典」を読むのが一番ですが、絶版になってしまったような気がします。
math.hの関数を知るには数学の教養が不可欠です(最低限、高校生レベルの)。
高校数学の参考書をあわせて読むとよいかと思います。


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

Name: デラ初心者  ..入門者(2,557ポイント)   Date: 2009/12/16(水) 20:25   No:44296     
Title: Re:Cの参考書    
数学は面積や角度は苦手なんですよね・・・

math.h以外の関数も知りたいので
新ANSI C言語辞典は役立ちますか?

絶版なら読んで買う事が出来ませんね
残念です


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

Name: たかぎ [URL]  ..ハッカー(138,269ポイント)   Date: 2009/12/16(水) 20:31   No:44298     
Title: Re:Cの参考書    
> 絶版なら読んで買う事が出来ませんね 

かなりの数が出回っていますので、アマゾンのマーケットプレイスでも古本屋でも入手できると思います。
この本は、C言語を深く学ぶ上では必携です。


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

Name: デラ初心者  ..入門者(2,595ポイント)   Date: 2009/12/16(水) 20:33   No:44299     
Title: Re:Cの参考書    
そうなんですか〜

amazonの中古で500円で売っていたので
買ってみます(送料含めたら850円なんですけどね)


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

Name: デラ初心者  ..入門者(2,612ポイント)   Date: 2009/12/16(水) 20:36   No:44300     
Title: Re:Cの参考書    
他にもオススメがあれば教えてください

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

Name: sizuma [URL]  ..上級者(19,500ポイント)   Date: 2009/12/16(水) 20:46   No:44301     
Title: Re:Cの参考書    
標準ライブラリの内容とかは必要なときに調べるってしてます。
http://www.cppll.jp/cppreference/
たかぎさんがご紹介されてる本はとてもよさそうですね。
ただ、ちょっとなにしてるのか知りたい、ぐらいだったら上のサイトで引数、戻り値、処理内容が分かるぐらいでいいと思います。(趣味レベルのプログラミングならば、ね)

また、大体文法が分かるのであれば
http://www.kumei.ne.jp/c_lang/
とかで分からない部分を見直す、とか。
入門サイトはたくさんありますので

>年齢は14なので
学校の勉強が苦手なのであれば、学校の数学とかをがんばった方が今はいいかもです。
中学校の数学は習うことはすべて基本的なことなので、、、、
文法の入門書等は、中学生が読んで分からない表現はないと思います。(小学生でも大丈夫でしょう)
読んで分からないのであれば、基礎学力不足。もしくは和訳が異常に下手、とか。

とは言っても分かりにくいものは分かりにくいです^^;
「明解C言語 入門編」
なんてどうでしょうか?


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

Name: MNS  ..上級者(24,214ポイント)   Date: 2009/12/16(水) 20:47   No:44302     
Title: Re:Cの参考書    
参考書、ですか。というと、入門書などとは異なるということでしょうか。
デラ初心者さんが、どのくらい、C言語を扱うことが出来るのかが分からないので、適当な回答が出来ないのですが、
14歳ということなので、おそらく学校の授業で使用するなどという用途ではなく、あくまで趣味としてのプログラミングにおいて用いるのだと思います。
しかし、本当に辞書のようなC言語の参考書を読むとしたら、ある程度のC言語のスキルというものが必要になると思います。
まあ、実際に買ってみて、理解出来るかどうかを試してみるのも良いと思いますが、
math.hで定義されている関数なら、ネット上でもあふれるほど情報がありますので、あえてそれ用に本を買う必要も無いんじゃないかな、などと思います。
それよりかは、入門書を買って、ある程度のC言語のスキルを習得してから、そのような参考書となる本を買う方を個人的にはオススメします。

入門書としては、ラトルズ社から出版されている
「14歳からはじめるC言語わくわくゲームプログラミング教室」
という本がおすすめです。年齢的にもちょうど良いかと思います。
これはC言語の入門、というよりは、C言語を用いたゲーム製作の入門書、という形にはなりますが、
内容的にはかなり分かりやすいですし、ある程度のスキルは習得できるかと思います。


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

Name: デラ初心者  ..入門者(2,643ポイント)   Date: 2009/12/17(木) 19:08   No:44410 解決!     
Title: Re:Cの参考書    
皆さん有り難う御座いました

sizumaさん
http://www.cppll.jp/cppreference/ 
参考にさせていただきます


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,114,949ポイント)   Date: 2009/12/18(金) 00:07   No:44445     
Title: Re:Cの参考書    
>たかぎさん

その本持っていますが、14才に勧めるにはちょっとハードルが高いのでは^^;
文字が小さくて絵がなくてビーッチリ字が書いてあると私のような人間は読む気が減りますorz

> デラ初心者さん
> 数学は面積や角度は苦手なんですよね・・・

う〜ん、math.hを勉強したいならそれはちょっと言ってられないですね〜^^;
math.hの何が知りたいですか?
このライブラリには名前からしてもわかるとおり、数学的な関数が入っています。
ですから数学的な知識が必要です。
「アークタンジェント」なんていうしばらく習わないだろう関数まで入ってます。

まず、math.hを使って何がしたいですか?
なんとなく勉強するよりやりたい事を明確にして、それを調べた方が早いような気がしますよ。
まずは必要なものだけついばんで勉強すれば最初は十分だと思います。


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

Name: たかぎ [URL]  ..ハッカー(141,224ポイント)   Date: 2009/12/18(金) 00:34   No:44450     
Title: Re:Cの参考書    
> その本持っていますが、14才に勧めるにはちょっとハードルが高いのでは^^; 
> 文字が小さくて絵がなくてビーッチリ字が書いてあると私のような人間は読む気が減りますorz 

14歳といえば、中学2〜3年生ですよね。
それなら問題ないと思いますよ。
普通の国語辞典や英和辞典でもこんな感じでしょう?

> 文字が小さくて絵がなくてビーッチリ字が書いてあると私のような人間は読む気が減りますorz 

最近は、教科書もマンガか絵本のようになっていますからね。
いっそのこと、しまじろうとミミリンが解説してくれるような本+DVDのほうがよかったりして(その代わり高額)。

> 「アークタンジェント」なんていうしばらく習わないだろう関数まで入ってます。 

逆三角関数はまだ高校で習うからましなほうですね。
双曲線関数のように、大学でなければ習わないような関数もあります。


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

Name: Lbfuvab  ..初心者(6,663ポイント)   Date: 2009/12/18(金) 01:44   No:44453     
Title: Re:Cの参考書    
>>たかぎさん

話がずれますが、双曲線って、
「ある異なった二点からの距離の差の等しい点の軌跡」ですよね。
だとしたら、数学Cでやりますよ?


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

Name: mats  ..かけだし(2,035ポイント)   Date: 2009/12/18(金) 02:16   No:44456     
Title: Re:Cの参考書    
>>Lbfuvabさん

双曲線の標準形については高校で学びますが,
sinh(x)やcosh(x)などの双曲線関数は大学の分野だったような….


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

Name: kazuoni [URL]  ..ハッカー(119,264ポイント)   Date: 2009/12/18(金) 02:16   No:44457     
Title: Re:Cの参考書    
> 双曲線関数

sinh , cosh , tanhは高等学校学習指導要領には含まれていませんね。
レベルの高い大学入試にはそのような概念は出ているようですが、
「y=sinh(x)を微分せよ」
みたいな問題はでないですね(きっと)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,116,424ポイント)   Date: 2009/12/18(金) 07:38   No:44464     
Title: Re:Cの参考書    
そういえば「辞典」と名づくものに絵で説明されているというのもちょっとおかしな話でしたね。
一ページ目から読むものではなく、それこそ必要な時に必要な物を調べる本として買うなら問題なさそうですね。

> 逆三角関数はまだ高校で習うからましなほうですね。 
> 双曲線関数のように、大学でなければ習わないような関数もあります

私の時(8年前)は逆でした。
アークタンジェントは大学に入ってから、双曲線は数Cでやりました。

((・・・って書いてて自分でびっくりしましたが、8年前なんて信じられない^^;


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

Name: たかぎ [URL]  ..ハッカー(141,814ポイント)   Date: 2009/12/18(金) 15:36   No:44490     
Title: Re:Cの参考書    
双曲線自体は高校で習うと思います。
ただ、sinhなどの双曲線関数は、

sin x = (eix - e-ix) / 2i

なので、ここから i を取り除いたものを sinh x と定義するわけです。
上記 sin x の式に使われている eix 云々を理解するには、複素関数やらガウス平面やらを理解しないといけません。
これは高校ではやりませんよね。


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

Name: たいちう  ..熟練のプログラマー(40,557ポイント)   Date: 2009/12/18(金) 16:19   No:44492     
Title: Re:Cの参考書    
ガウス平面って高校でやりませんでしたっけ?
複素数を教えてもガウス平面を教えないというのは、
負の数を教えても数直線を教えないみたいなものだと思うのですが。

20年以上前の記憶なので定かではないのと、
今とは大きく変わっていることと思いますけど。


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

Name: たかぎ [URL]  ..ハッカー(141,860ポイント)   Date: 2009/12/18(金) 17:09   No:44496     
Title: Re:Cの参考書    
> ガウス平面って高校でやりませんでしたっけ?

やっていないと思います。
高校数学では、複素数といっても、方程式の虚数解程度のことしか扱いませんから。


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

Name: デラ初心者  ..入門者(2,725ポイント)   Date: 2009/12/18(金) 21:04   No:44504     
Title: Re:Cの参考書    
皆さんレベル高いですね

math.hが知りたいのはシューティングゲームの館で
math.hが出てきましたが、良くわからなかったので
勉強しようと思いましたが
ガウス平面や双曲線は初めて聞いたので
高校になって習ったら勉強したいと思います


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



Name: アーロン  ..ぴよぴよ(448ポイント)   Date: 2009/12/17(木) 21:27   No:44419       
Title: Window7 64bitの環境で動作しない。    
初歩的な質問で大変申し訳ありません。

龍神録の環境を一式ダウンロードし
コンパイルしなおしてデバックを開始したのですが
動作がしませんでした。
現象の詳細についてですが
ツールは立ち上がるのですが画面は真っ黒のままで何も表示
されません。少したつと、"RyuJin.exeは動作を停止しました。”と
言うメッセージが表示されてしまいツールがおちてしまいます。

あくまで私の推測にすぎませんがビデオカードが影響しているのか?
64bitの環境のためなのか?この二点が影響しているのではないのかと思っております。


どんな原因が考えられるかわかりますでしょうか?
アドバイスのほどよろしくお願いいたします。

ちなみに環境は下記になります。
【環境】
環境:Visual Stadio2008
OS:Windows7home 64bit

 


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


Name: softya  ..比類無きプログラマー(70,010ポイント)   Date: 2009/12/17(木) 21:53   No:44422     
Title: Re:Window7 64bitの環境で動作しない。    
デバッグビルドでF5実行されたなら出力ウィンドウにDXライブラリの情報が残っているはずなので貼りつけてもらえますか。

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

Name: アーロン  ..ぴよぴよ(745ポイント)   Date: 2009/12/17(木) 22:03   No:44424     
Title: Re:Window7 64bitの環境で動作しない。    
DirectDraw 関連の初期化は正常に終了しました
文字コードバッファの初期化を行います... 完了しました
RyuJin.exe の 0x75739b60 で初回の例外が発生しました: 0xC0000005: 場所 0x08278000 に書き込み中にアクセス違反が発生しました。
RyuJin.exe の 0x75739b60 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x08278000 に書き込み中にアクセス違反が発生しました。
RyuJin.exe の 0x75739b60 で初回の例外が発生しました: 0xC0000005: 場所 0x08278000 に書き込み中にアクセス違反が発生しました。
RyuJin.exe の 0x75739b60 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x08278000 に書き込み中にアクセス違反が発生しました。

この情報でよろしいでしょうか?
よろしくお願いします。


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

Name: softya  ..熟練のプログラマー(69,995ポイント)   Date: 2009/12/17(木) 23:19   No:44434     
Title: Re:Window7 64bitの環境で動作しない。    
DXライブラリの初期化後に例外で異常終了していますので、プログラムにバグが有る可能性が高いです。
デバッグビルドで「デバッグ開始(F5)」を選んだ場合、初期化が終了したタイミングで何かウィンドウは表示されませんでしたか?
出たウィンドウに表示されたメッセージを正確に書いてください。「RyuJin.exeは動作を停止しました。」以外の情報がありませんか?

>少したつと、"RyuJin.exeは動作を停止しました。”と言うメッセージが表示されてしまいツールがおちてしまいます。 
このツールが落ちるとはVisualStudioが異常終了で停止すると言う意味でしょうか?
それとも起動したプログラムが落ちたと言う意味でしょうか?

もう少し正確な情報をお願いします。
エラーの原因追求に必要な情報が不正確な情報だと何時まで経っても答えに辿りつけません。
上の二つの質問には重要な原因追求の情報が含まれています。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,114,297ポイント)   Date: 2009/12/17(木) 23:51   No:44441     
Title: Re:Window7 64bitの環境で動作しない。    
softyaさんがせっかくご回答いただいているのに横からすみません。


64ビット環境やwindows7では古いDXライブラリのバージョンでは不具合が起きる事があるようです。
今の最新バージョンではそれが解決されているようなので、
DXライブラリのバージョンを最新にしてみてください。

DXライブラリは本家からダウンロードしてきて、
「プロジェクトに追加すべきファイル」みたいなフォルダに入ってるファイル群をごっそり取り換えるとOKです。

私もwindows7を使っていますが、古いバージョンでは同じように強制終了してしまいます。


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

Name: アーロン  ..ぴよぴよ(898ポイント)   Date: 2009/12/18(金) 20:45   No:44502 解決!     
Title: Re:Window7 64bitの環境で動作しない。    

Dixq(管理人)様

Dxライブラリを最新にしましたら動作しました。
たすかりました。
ありがとうございます。
softya様
解析をしていただき、誠にありがとうございます。
それと情報の不備があったこと大変ご迷惑をおかけしました。
今回の件で、大変勉強になりました。
もし、わからないことなどがあった場合はSoftya様の
アドバイスを参考にさせていただきます。

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


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



Name: yskey  ..入門者(4,601ポイント)   Date: 2009/12/17(木) 22:39   No:44426       
Title: 戦術シミュ製作について    
どうもお世話になっていますYskeyです。
戦術シミュを制作中です。
正方形マスでのユニット操作の大体の作り方はわかりましたが、
最近は市販戦略シミュで主流の「プロヴィンス」単位で管理されたマップのプログラムはどうなってるんでしょうか。
(参考を見てもらえればわかると思います)
というか、ヘックス型すらわからないです・・・

それからプロヴィンス型やヘックス型でのグラフィック描写の方法、座標拾得・・・
謎なことが多すぎて困っています。グーグル先生にも聞いていますがなかなか見つかりません・・・

この手のことに詳しい方。。。参考になる話や、サイト、本、etc、、、
あれば教えてください。

参考:
(ハーツオブアイアン3)
http://www.4gamer.net/games/062/G006240/20091215066/
(ヨーロッパユニバーサリス ローマ)
http://www.4gamer.net/games/096/G009635/20091021027/


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


Name: Justy  ..伝説なるハッカー(486,126ポイント)   Date: 2009/12/18(金) 03:04   No:44458     
Title: Re:戦術シミュ製作について    
 別に詳しいというわけではないですが。

 まずは正方形マス、或いはヘックス型での基本的な作り方をきっちりと押さえるのが
先決なわけですが……移動系はちょこちょことあるようですが、
体系的に解説しているサイトとか書籍とかがちょっと見つかりませんね。


ゲームのアルゴリズム 思考ルーチンと物理シミュレーション: ねおだ 如: 本
http://www.amazon.co.jp/dp/4797335955

 この本にはチラッとだけ載っているようですが、1章だけっぽいので
どれだけ参考になるのかはわかりません。



> マップのプログラムはどうなってるんでしょうか

 記事を見た限りなので、プロヴィンスの定義を正しく理解していないのですが、
プロヴィンスというのは「ヘックスに相当するものの形状が固定でない」的な意味合いで
いいのでしょうか?

 それで問題なければデータ構造としては相互の位置関係、移動コストなどを
管理するのにグラフ構造を使うことになるので、最初のうちは結構大変かもしれません。
 ただ、プロヴィンスだからといって戦略SLGとしての諸々の処理とか考え方そのものとしては
一般的なヘックス型と大差ないように思います。

グラフ (データ構造) - Wikipedia
ttp://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)

 とは言っても紹介されているゲームはいろいろ複雑そうですが……。



> プロヴィンス型やヘックス型でのグラフィック描写の方法

 紹介されていたサイトのキャプチャ画像を見たところからの推測だと
プロヴィンス型は単純に大きな背景を用意し表示しているだけのように見えます

 これを常時表示することになるのですが、暗くしたいなど色を変えたいプロヴィンスが
あるのなら白で塗った各プロヴィンスの形状の絵を用意し(余白は透明)、
これをディフューズカラーで変えて半透明で上からかぶせればそのプロヴィンスだけが変化します。
(必要なら加算とかもかけます)

 これ以上は実際の動いているゲーム画面を見ないと何とも言えません。


 ヘックス型の方はグリッド型(正方マス)と向きが違うだけなので、
描画は基本並べるだけです。



> 参考になる話

 ググったらこんなのが。
 
プロヴィンス情報 - HoI2DataWiki
ttp://www.hayasoft.com/hiko/paradox/wiki_hoi2/index.php?%A5%D7%A5%ED%A5%F4%A5%A3%A5%F3%A5%B9%BE%F0%CA%F3

 セーブデータの情報を書き換えるもののようです。
 これを読み解けばプロヴィンス管理データの構造が透けて見える、かも。


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

Name: MNS  ..上級者(24,652ポイント)   Date: 2009/12/18(金) 08:36   No:44470     
Title: Re:戦術シミュ製作について    
戦術シミュレーションですか、私も似たようなものを作りましたが、
一番大変だったのは敵AIの製作でしたね・・・。
それはさておき、ヘックス型マップの描写方法や座標取得方法などは、
http://geogames.net/labs/geohex
というサイトが参考になるかもしれません。

Justyさんがオススメされている、
「ゲームのアルゴリズム 思考ルーチンと物理シミュレーション」
という本は、私も持っていますが、
マップは正方形(ただし、ゲーム自体は3D)であり、
解説している内容は、どちらかといえばSLGにおけるAIについてのほうなので、
戦術シミュレーションを作る上では非常に役立ちますが、
yskeyさんが今求めている情報とは違うかもしれませんね。

プロヴィンス形というと、一マスの形が不定ということになると思います。
私自身がやったことはないのですが、通常のマップの画像と、
裏で描画しない、色を別々に塗り分けたマップとを用意しておいて、
マウスの座標から、塗り分けたマップのピクセル単位での色を取得し、
その色に応じて判別する、という方法があります。
HoIや、EUのように、マップが一つしかないようなゲームには、
この手法が使い易いかもしれません。(実際には使ってないと思いますが)


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

Name: yskey  ..入門者(4,756ポイント)   Date: 2009/12/18(金) 18:29   No:44498 解決!     
Title: Re:戦術シミュ製作について    
>>Justyさん、MNSさん
どうもご回答ありがとうございます。
「ゲームのアルゴリズム 思考ルーチンと物理シミュレーション」はもう購入済ですが
基礎的なことはほとんど載っているので重宝しています。

色を拾得して座標を拾得するのは良いアイデアですね。
とりあえず、マスだけでも完成したいと思います。
ありがとうございました。


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

Name: にゃ   Date: 2010/05/07(金) 08:42   No:444261273189373     
Title: Re:戦術シミュ製作について    
スクエアの移動が解れば、ヘックスの移動も解りませんか?縦に並べたものの偶数あるいは奇数の座標を元のスクエアの半分ズラします。多分、一つのマスと接するマスが増えます。私が聞いたときには「ブリック」とか言われていましたが、こうして作られたものはヘックスと同じように処理出きるはずです。あとは、見せ方の工夫です。

> どうもお世話になっていますYskeyです。
> 戦術シミュを制作中です。
> 正方形マスでのユニット操作の大体の作り方はわかりましたが、
> 最近は市販戦略シミュで主流の「プロヴィンス」単位で管理されたマップのプログラムはどうなってるんでしょうか。
> (参考を見てもらえればわかると思います)
> というか、ヘックス型すらわからないです・・・

> それからプロヴィンス型やヘックス型でのグラフィック描写の方法、座標拾得・・・
> 謎なことが多すぎて困っています。グーグル先生にも聞いていますがなかなか見つかりません・・・

> この手のことに詳しい方。。。参考になる話や、サイト、本、etc、、、
> あれば教えてください。

> 参考:
> (ハーツオブアイアン3)
http://www.4gamer.net/games/062/G006240/20091215066/
> (ヨーロッパユニバーサリス ローマ)
http://www.4gamer.net/games/096/G009635/20091021027/






Name: Libra  ..上級者(15,020ポイント)   Date: 2009/12/15(火) 06:57   No:44073       
Title: DirectXによるポリゴンの表示    
現在、DirectX9.0で画像を表示するプログラムを作成しています。
今、ポリゴンの表示を使って図形を描画(テクスチャを貼らない)
しようとしているのですが、
ウィンドウモードからフルスクリーンに切り替え以降、
ウィンドウを戻してもポリゴンが表示されなくなってしまいます。
しかし、テクスチャを貼って表示するポリゴンは表示されます。

・SetTexture( 0 , NULL )を設定
・DrawPrimitive( D3DPT_TRIANGLESTRIP , 0 , 2 ) で表示

現在分からない部分
// 頂点バッファの作成
if( FAILED( lpD3DDev->CreateVertexBuffer( sizeof( PolygonVertex ) * 4 , D3DUSAGE_WRITEONLY , FVF_VERTEX2D , D3DPOOL_MANAGED , &pVertex , NULL ) ) )
{
    return FAILURE ;
}

IDirect3DVertexBuffer9* でバッファを作成して、描画をしています。

・頂点バッファの作成は、構造体が使うポリゴンのサイズが違うごとに行うのか?
今現在、4角形を表示するため、4つの頂点のポリゴンのバッファを作成しているが、
ラインを引くときは、頂点数2になるので、別にバッファが必要なのか?

ラインは描画モードを切り替えても表示されるが、
ウィンドウモードの時の表示される色が薄い感じがする。


開発環境
VC2008EE
C++
DirectX 9.0

添付したソースの実行時の緑色の四角が表示したいものです。


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


Name: 御津凪 [URL]  ..ハッカー(132,429ポイント)   Date: 2009/12/15(火) 10:30   No:44078     
Title: Re:DirectXによるポリゴンの表示    
テクスチャを張らないポリゴンを描画する場合、
FVF に指定するフラグには D3DFVF_TEX1 は指定しないようにする必要があります。

これが指定されていると、描画時にテクスチャを SetTexture 関数でセットしていない(あるいは NULL をセットしている)場合、
ポリゴンも表示されなくなるのが普通です。
(1x1のテクスチャをセットするという手もありますが)


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

Name: Libra  ..上級者(15,359ポイント)   Date: 2009/12/15(火) 20:35   No:44147     
Title: Re:DirectXによるポリゴンの表示    
自分で気づいた点に変更を加えましたが、改善しませんでした・・・。
変更を加えたソースを添付します。

変更点
・ポリゴンを貼らない描画をする時の、頂点座標の構造体を別にした。(u,vの値無し構造体)
・SetTextureは呼ばれないようにデバッグ
・FVFに指定するフラグを(D3DFVF_XYZRHW | D3DFVF_DIFFUSE)にした。

実行結果
描画モードを変更すると、テクスチャ無しのポリゴンが表示されない。
起動時フルスクリーンでも、描画モード変更で描画されなくなる。
テクスチャ無しのポリゴン描画はDrawBox、DrawLineメソッドで行っています。


http://marupeke296.com/DXGSmp_No2_2DPoly.html
ここと同じになるように、やってみたのですが、
描画モードを変更すると上手くいきませんでした。
描画モードを変更しても、線ポリゴンは表示されます。
線と三角形ポリゴンの結果の違いはどこで出ているのでしょうか・・・。


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

Name: 御津凪 [URL]  ..ハッカー(133,387ポイント)   Date: 2009/12/15(火) 21:36   No:44166     
Title: Re:DirectXによるポリゴンの表示    
こちらでも表示されなくなる状況を確認しました。

まず、正しくデバイスリセットがなされていないようです。
 TestCooperativeLevel 関数をマイフレーム必ず呼び出し、その戻り値をチェックしてください。
それ以外の関数では、デバイスロスト状態でも正しい値を返さない(正しく動作しているようにふるまう)ためです。

次に、リセットしたら、レンダリングステートなど再設定をしておくことを推薦します。
いくつかのステートや行列設定もリセットされますので。


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

Name: Libra  ..上級者(16,107ポイント)   Date: 2009/12/16(水) 00:03   No:44187     
Title: Re:DirectXによるポリゴンの表示    
回答ありがとうございます。m(_ _)m

TestCooperativeLevel関数を使う→値はS_OK
レンダリングステートの設定をメソッドにまとめ、
リセットしたところに処理を挿入したところ、表示されました。
原因は、リセットのあとのレンダリングステートの再設定だったようです。


あとこれとは別に質問があります。



質問1:ポリゴンで円を描くとき、頂点はどのように取ったら良いのでしょうか?

中心と半径を決めて、1個ずつ点の座標を取り、ラインリストで表示
という方法を思いついたのですが、
DirectXのポリゴンで円を描く(または、ポリゴン座標を楽に求める)
関数などは用意されてないのでしょうか?


質問2:頂点バッファを利用して描画を行っているのですが、
引数で指定したバイトサイズ以下の時であれば、描画を一括で行えると思うので、
指定するバイトサイズを大きめに確保するのは良いのでしょうか?

質問1にも関わるのですが、ポリゴンの頂点100個取った円を描画する時に
あらかじめ頂点バッファのサイズを取っておけば
一気に描画出来ると考えました。
この方法は実際にやって良いのでしょうか?


質問3:頂点バッファに用いるLPDIRECT3DDEVICE9

バッファを作成する際、引数でパラメーターを設定しますが、これは
パラメーター毎に変数を用意するべきなのでしょうか?
試しに毎ループこのメソッドを呼び出したところ、
メモリ使用量がどんどん膨れ上がっていきました。


色々検索をかけたりしたのですが、
これが解説されているものが見つかりませんでした。
これらに関するヒントや参考ページ等でも良いので、
教えていただけないでしょうか。お願いします。


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

Name: 御津凪 [URL]  ..ハッカー(132,728ポイント)   Date: 2009/12/16(水) 15:41   No:44235     
Title: Re:DirectXによるポリゴンの表示    
> 質問1

ポリゴンで完全な円を表現するのは非効率です。
点ごとに頂点を指定すると、膨大な個数になりやすく、重くなりやすいです。
正多角形の形でポリゴンを構成すれば円に見せることができます。

以下は正多角形のポリゴン位置を構成する関数のサンプルです。
/*!
 * @brief 正多角形ポリゴンを構成する関数。
 * @param outVtx     [out] 構成する頂点配列。最低 inCount + 1 の個数が必要。
 * @param inCount    [in]  構成する角数。
 * @param inHalfSize [in]  半径。
 */
void GenerateCirclePolygon( Vertex* outVtx, UINT inCount, float inHalfSize ){
    outVtx->x = outVtx->y = 0.0f;
    ++outVtx;
    for(UINT i = 0;i < inCount;++i){
        float rad = D3DX_PI * 2.0f * i / inCount;
        outVtx->x = cosf(rad) * inHalfSize;
        outVtx->y = sinf(rad) * inHalfSize;
        ++outVtx;
    }
}

これは、最初の点を原点に置き、そのあとに角数分の点を円に沿って配置しています。
このように構成したポリゴンは D3DPT_TRIANGLEFAN を指定して描画することで正しく表示できます。
これを 3D に応用すれば正多角錐を構成することもできます。

> 質問2

DrawPrimitive 関数の第二引数には、描画に使う頂点データのオフセットを指定できます。
これを利用すれば、頂点バッファに複数のポリゴンデータを持たせ、個別に描画させることができます。
ただし、一括して(一回の呼び出しで)描画する場合は第一引数で指定したプリミティブ構成によっては
形が崩れますので注意してください。

なお、インデックスバッファも併用すれば、比較的楽に一括描画はできるかと思います。

> 質問3

メモリ使用量が膨れ上がっていくのはきちんと解放されていないせいです。

DirectX で作成された全てのデータは、使用が済んだら Release() を呼び出して解放しなければならない決まりがあります。
これは、各データには参照カウントが存在し、参照カウントが 0 になると解放される仕組みになっているからです。

そのため、複数の場所で同じデータを扱う場合は、 AddRef() を呼び出して参照カウントを増やしておく必要もあります。

なお、DirectX 関数群でセットする場合は AddRef() は呼び出す必要はありません。
また、DirectX 関数群でデータを取得する場合は、使用が済んだらRelease() を呼び出して解放する必要があります。
(これらの正確な情報は MSDN ライブラリや SDK リファレンスに載っています)

頂点バッファは、当然のことながら頂点データを格納しているだけのものです。
なので、1頂点を構成する情報が変われば、作成しなおす必要がありますし、
余分な頂点データが混じっていても、DrawPrimitive 関数などで必要な部分だけ描画することもできます。


あと、これらとは関係ないですが、下記のページの文章を一読しておくといいと思います。
リソースの管理 (Direct3D 9)
http://msdn.microsoft.com/ja-jp/library/bb147168%28VS.85%29.aspx

専門用語も混じっていますが、その中で「リソース管理は頻繁に変更されるリソースには推奨されない」旨の
説明も含まれてます。


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

Name: Libra  ..上級者(16,827ポイント)   Date: 2009/12/17(木) 01:32   No:44343     
Title: Re:DirectXによるポリゴンの表示    
> 質問1
説明が不足してました。
御津凪さんに示していただいた実装方法と、
自分の考えていた方法と同じでした。
->(円を描くメソッド) ってのは無いようですね。
パラメーターが D3DPT_TRIANGLEFAN であれば円の中の塗りつぶし、
D3DPT_LINESTRIPであれば、円の中を塗りつぶさないといった形ですね。
1個ずつ点の座標を取り〜と書かずに、説明に多角形と書けば良かったですね(汗)

>質問2
>>DrawPrimitive 関数の第二引数には、描画に使う頂点データのオフセットを指定できます。 
>>これを利用すれば、頂点バッファに複数のポリゴンデータを持たせ、個別に描画させることができます。 
>>ただし、一括して(一回の呼び出しで)描画する場合は第一引数で指定したプリミティブ構成によっては 
>>形が崩れますので注意してください。 


四角形を表示する時に、
三角形ポリゴンを2つバッファに持たせたあと、
->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0 , 1 ) ;
->DrawPrimitive( D3DPT_TRIANGLESTRIP , 1 , 1 ) ;
といった感じにやるということでしょうか?
(違う気がしますが・・・・)

>>インデックスバッファ
DXライブラリで使用した事があります。
四角形表示するのにも、頂点4つで済むのが楽でした。
頂点数が増えると必要になりそうです・・・。


> 質問3
>>あと、これらとは関係ないですが、下記のページの文章を一読しておくといいと思います。 
>>リソースの管理 (Direct3D 9) 
>>http://msdn.microsoft.com/ja-jp/library/bb147168%28VS.85%29.aspx 

>>専門用語も混じっていますが、その中で「リソース管理は頻繁に変更されるリソースには推奨されない」旨の 
>>説明も含まれてます。 

ということは、パラメーター毎 ( FVFと構造体サイズ (それ以外は同じパラメーター) )
で頂点バッファをある程度の大きさで作成しておき、使うという形でいいのでしょうか?
また、作成したバッファより大きなサイズの頂点データを
->Lock
した場合は、S_OK以外が返るという感じで解釈しました。

バッファを使う度に、作成→使用→開放とやるのは、
恐らくリソースの管理的に良くないとされるのですね?


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

Name: 御津凪 [URL]  ..ハッカー(133,243ポイント)   Date: 2009/12/17(木) 02:11   No:44346     
Title: Re:DirectXによるポリゴンの表示    
> 四角形を表示する時に、
> 三角形ポリゴンを2つバッファに持たせたあと、
> ->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0 , 1 ) ;
> ->DrawPrimitive( D3DPT_TRIANGLESTRIP , 1 , 1 ) ;
> といった感じにやるということでしょうか? 

そんな感じです。
ただ、この場合はそもそも
->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
でいいので分ける利点はありませんね。


基本、頂点バッファは一つの物体に一つ持つようにするのが普通です。(3Dモデルとか複雑な物体)
ですが、単純なもの(三角形や四角形など)の場合は、グループ分けするように一つの頂点バッファに纏めて
一括描画(非表示部分はゼロ初期化するなどして対処)でやると効率的に良いです。

> バッファを使う度に、作成→使用→開放とやるのは、
> 恐らくリソースの管理的に良くないとされるのですね?

上記の URL では、 D3DPOOL_MANAGED で作成したリソースを頻繁にロックし、書き換えるという動作は
処理速度の低下につながる恐れがある、というような文面があります。
私はそれを伝えるためにも URL を張っておきました。


「作成」は、初期化時やとある場面から必要になった時に行い、
「開放」は、それ以降使用されなくなった場合に行うのがベストです。
毎フレーム作成や開放を行っていては非効率になります。


参考になるかどうかわかりませんが、
私のサイトで公開しているゲームライブラリのサンプルゲームがあり、
それをオープンソースとして公開しています。
その中に DrawPrimitive 周り(正確には DrawPrimitiveUP と DrawIndexedPrimitiveUP )を使用している
コードがありますので、気になったら見てみてください。
ただし、読みやすいとは言えないのでその点ご了承を。

なお、将来 DirectX 10 以降を使用して構築する場合は注意してください。
別物と言っていいほど構造が違いますので。

(そのうち DX11 講座みたいなの書いてみようかな)


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

Name: Libra  ..上級者(17,731ポイント)   Date: 2009/12/18(金) 02:14   No:44455 解決!     
Title: Re:DirectXによるポリゴンの表示    
>>上記の URL では、 D3DPOOL_MANAGED で作成したリソースを頻繁にロックし、書き換えるという動作は 
>>処理速度の低下につながる恐れがある、というような文面があります。 
>>私はそれを伝えるためにも URL を張っておきました。

D3DPOOL_MANAGED を使うと、速度低下の恐れが有りますが、
それ以上に ->Reset メソッドをした時のデバイスロストの処理関係を
DirectXに色々処理を任せることができるので、
(DirectX入門の書く側としては)こっちの方、D3DPOOL_MANAGEDを取ることにします。



>>また、作成したバッファより大きなサイズの頂点データを 
>>->Lock 
>>した場合は、S_OK以外が返るという感じで解釈しました。

試しに、作成したバッファ(構造体8個分)より大きいバッファをロック(構造体0xffff個分)
してみたのですが、S_OKが返りました。
作成したバッファより大きいサイズが指定された場合は、
新たに、サイズのバッファが再作成されるのでしょうか(^^;


>>参考になるかどうかわかりませんが、 
>>私のサイトで公開しているゲームライブラリのサンプルゲームがあり、 
>>それをオープンソースとして公開しています。 
>>その中に DrawPrimitive 周り(正確には DrawPrimitiveUP と DrawIndexedPrimitiveUP )を使用している 
>>コードがありますので、気になったら見てみてください。 
>>ただし、読みやすいとは言えないのでその点ご了承を。 

>>なお、将来 DirectX 10 以降を使用して構築する場合は注意してください。 
>>別物と言っていいほど構造が違いますので。

ソースのところまでたどり着きましたが、ソース量が多いので
ゆっくり探してみることにします。
あと、7Zip(?)初めて解凍しました。
サンプルゲームは以前やりましたが、NORMALクリア出来ませんでした。
本家ならHARD行けるんですが・・・。


現在、円と楕円の描画が完成したところです。
少しずつですが、描画出来る図形の種類が増えてくと
嬉しくなってきますね。
おかげでDxlibにのリファレンスには記載されてない機能、
DrawExtendGraphのX、Y軸別倍率指定回転描画や、
図形ポリゴンの角度指定描画など実装出来ました。

現在出来たところまでのソース添付します。


御津凪さん、的確なアドバイスありがとうございました!


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

Name: 御津凪 [URL]  ..ハッカー(134,274ポイント)   Date: 2009/12/18(金) 11:08   No:44477     
Title: Re:DirectXによるポリゴンの表示    
> ソースのところまでたどり着きましたが、ソース量が多いので
> ゆっくり探してみることにします。 

VC++ にはフォルダ内(GREP)検索(Ctrl+Shift+F)ができますので、それを使って関数名を調べると見つけやすいですよ。

> あと、7Zip(?)初めて解凍しました。

7-Zip は高圧縮率、高速解凍が可能な圧縮形式 LZMA を扱う圧縮・解凍ツールです。
LZMA SDK は自由に使用できるので(zlibより緩いライセンス)、ライブラリのアーカイブ機能に使わせてもらってます。

> サンプルゲームは以前やりましたが、NORMALクリア出来ませんでした。
> 本家ならHARD行けるんですが・・・。 

難しいのはすみませんが、現時点で仕様です。
あっさりクリアできてしまうのでは余り面白みが無いですから。
かといって難しすぎるとやる気をそいでしまいますけれども。

> 作成したバッファより大きいサイズが指定された場合は、
> 新たに、サイズのバッファが再作成されるのでしょうか(^^;

実際のサイズより大きな範囲を指定した場合の挙動はリファレンスにも載っていないようです。
しかし、ロックするだけの関数なので、自動で領域を拡張するようなことは無いと思います。
試しに確保より大きなサイズをロックし、その領域に書き込んでみてください。
実行時、アクセス違反のエラーが出たのなら、領域は拡張されておらず、
ロックされた領域は実際のサイズに丸められていることを表します。


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

Name: Libra  ..上級者(17,969ポイント)   Date: 2009/12/18(金) 16:20   No:44493     
Title: Re:DirectXによるポリゴンの表示    
実際のサイズより大きな範囲を指定し、
ロックしたあと、その領域に適当な数値を書き込んでみたところ、
(作成サイズ構造体4つ分、ロック書き込みサイズ構造体8つ分)
起動中はS_OKのみ返っていましたが、
終了時、RELEASEを行う際に、メモリのアクセス違反が起こりました。
なので、大きな範囲を指定した場合は、
メモリが範囲外を指していることになっているようです。(+起動中範囲外を指していることが検出されない)

あと、描画部分のソースに大きく改変を加え、
バッファをLockして描画しているところを全てPrimitiveUPで描画するようにしたところ、
ピクセルの表示で、処理落ちの起こる回数が
Lock時0xfff個だったのがLock未使用時0x8fffまで増えました。
頻繁にLockするとかなりの速度低下が引き起こされていたようです。

LPDIRECT3DVERTEXBUFFER9のバッファ用変数用意したのに、使わなくなってしまいました(^^;


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

Name: 御津凪 [URL]  ..ハッカー(134,370ポイント)   Date: 2009/12/18(金) 16:48   No:44495     
Title: Re:DirectXによるポリゴンの表示    
> なので、大きな範囲を指定した場合は、
> メモリが範囲外を指していることになっているようです。

ということは DirectX 側ではロック範囲を正確にはチェックしていないということになりますね。


> あと、描画部分のソースに大きく改変を加え、
> バッファをLockして描画しているところを全てPrimitiveUPで描画するようにしたところ、
> ピクセルの表示で、処理落ちの起こる回数が
> Lock時0xfff個だったのがLock未使用時0x8fffまで増えました。
> 頻繁にLockするとかなりの速度低下が引き起こされていたようです。

それだけ Lock の回数には気をつけないといけないわけです。
それに、 D3DPOOL によっても大きく差が出ます。
D3DPOOL_MANAGED を指定していたことにも影響があると思います。
多分 D3DPOOL_DEFAULT と D3DUSAGE_DYNAMIC で作成した場合のほうが D3DPOOL_MANAGED より速いはずです。


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



Name: mii  ..ぴよぴよ(29ポイント)   Date: 2009/12/08(火) 02:00   No:43608       
Title: ソースコードの行数    
初めまして。miiと申します。

課題でc言語のみを扱うステップ数をカウントするプログラムを作成するのですが、
良い方法が思いつかず困っています。

環境はborland C 5.5でWinVistaになります。

総ステップと実行ステップを求めるというもので、、
実行ステップを求める際にどうすればよいのか教えて頂きたいです。

実行ステップについてはコメント行と空白行を除いた行数となり

1 : /*コメント*/  printf("hello")
2 : printf("hello")
3 : // printf("hello")

なら実行ステップは1行目と2行目になるような仕様です。

総ステップ数と空白行の部分は何とかなりそうなのですが、
コメントの部分で/**/の処理をどうすればよいか分からないので、
具体的な考え方を教えて頂ければと思います。

よろしくお願いします。



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


Name: Dixq (管理人) [URL]  ..ウィザード(1,097,497ポイント)   Date: 2009/12/08(火) 08:32   No:43613     
Title: Re:ソースコードの行数    
一番簡単な方法としてはfgetcを使ったプログラムでしょうか。
一文字ずつ取ってきて、単純に改行コードが来た数だけカウントしてやれば
行数が解ると思います。
新しい行において、何か文字が来る前に改行コードが来たら空白行だとわかるでしょう。
また、/**/についてはフラグを用意したらいいのではないでしょうか。
/*が来たら「カウントしないフラグ」を立て、改行コードが来てもステップ数をカウントしないようにします。
*/が来たら「カウントしないフラグ」をおろし、改行コードが来たらステップ数をカウントするようにします。
これで出来るのではないでしょうか?


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

Name: non  ..比類無きプログラマー(76,139ポイント)   Date: 2009/12/08(火) 08:36   No:43615     
Title: Re:ソースコードの行数    
初めまして。
学校の課題の場合、どの辺まで学んで、何を使って良いかが問題になります。すなわち、先生が
その課題で、何を学ばせようとしているかがあるはずです。
わかりやすくいえば、ファイルの入出力をどうするのか、ポインタは学んだのかなどです。
また、あなたがどれくらい習得しているかも知りたいところです。
>総ステップ数と空白行の部分は何とかなりそうなのですが
ということですので、総ステップ数(行数だとおもうけど)を求めるプログラムを
作って、添付してください。


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

Name: mii  ..ぴよぴよ(345ポイント)   Date: 2009/12/08(火) 10:35   No:43618     
Title: Re:ソースコードの行数    
おはようございます。
とりあえず総ステップ数を求めてみました。

ポインタ、ファイル等までは学習しています。


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE    *fp;        // ファイルポインタ
    int    lineCnt;    // 行数
    int    blankLines;    // 空白行
    int    c;
    
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    
    lineCnt = 1;
    // 総ステップ数と空白行を求める
    while((c = fgetc(fp)) != EOF) {
        
        // 改行文字の場合行数を増やす
        if (c == '\n') {
            lineCnt++;
        }
    }
    
    printf("総ステップ数 = %d", lineCnt);
    
    return 0;
}




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

Name: non  ..比類無きプログラマー(76,253ポイント)   Date: 2009/12/08(火) 11:17   No:43620     
Title: Re:ソースコードの行数    
問題の確認ですが、
1 空白行とは、TABも含みますよね。
2 最終行は、EOFのみの行でしょうか?それとも、文字があって行の終わりにEOFでしょうか?
  または、どちらでも正しく計数する必要があるのでしょうか?



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

Name: mii  ..ぴよぴよ(393ポイント)   Date: 2009/12/08(火) 11:40   No:43621     
Title: Re:ソースコードの行数    
その通りです。明記しておらずすみません。

1については空白行はTAB、スペースともに含みます。
2についてはどちらとも正しく計算する必要があります。



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

Name: non  ..比類無きプログラマー(76,550ポイント)   Date: 2009/12/08(火) 11:41   No:43622     
Title: Re:ソースコードの行数    
最初に、空白行(TABを含む)をカウントするプログラムのみ作りましょう。

考え方としてはDixqさんが仰るようにフラグを使います。
まず、フラグの宣言です。
int space_flag=0;
カウントをクリアしておきましょう
blankLines=0;
スペースやTAB以外の文字が出てきたら、space_flag=1;にします。
改行文字のときに、space_flag==0のままならblankLinesをカウントアップします。
space_flag=0;に戻します。

ただし、プログラムするときは、
改行文字かチェックして、それ以外の場合に、空白文字以外かとチェックした方が簡単です。

そこまで、作ってみてください。
なお、EOFの場合分けは不明なので、まだ考えていません。


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

Name: mii  ..ぴよぴよ(802ポイント)   Date: 2009/12/08(火) 12:19   No:43625     
Title: Re:ソースコードの行数    
nonさんお世話になってます。
取りあえず作ってみました。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;                // ファイルポインタ
    int        lineCnt;            // 行数
    int        blankLines = 0;        // 空白行
    int        space_flag = 0;
    int        ch;
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    lineCnt = 1;
    // 総ステップ数と空白行を求める
    while((ch = fgetc(fp)) != EOF) {
        // 改行文字の場合行数を増やす
        if (ch =='\n') {
            lineCnt++;    
            // 改行の後が空白だけなら
            if (space_flag == 0) {
                blankLines++;
            }
            space_flag = 0;
        }
        // 空白文字以外なら
        else if (!isspace(ch)) {
            space_flag = 1;
        }
    }
    printf("総ステップ数 = %d", lineCnt);
    printf("総空白数 = %d", blankLines);
    
    return 0;
}



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

Name: Dixq (管理人)  ..ウィザード(1,097,817ポイント)   Date: 2009/12/08(火) 12:35   No:43627     
Title: Re:ソースコードの行数    
おぉ、もう出来そうじゃないですか。
後は私が上で言ったようにコメント部無視すれば完成ですね。

ヒント:
今読み取った文字が*で、一つ前に読み取った文字が/ならコメント開始ですね。終了はその逆。一つ前に読み取った文字は、新しい変数を一つ用意してループの最後に記憶させてやればOKです。


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

Name: non  ..比類無きプログラマー(76,717ポイント)   Date: 2009/12/08(火) 14:14   No:43629     
Title: Re:ソースコードの行数    
さて、コメントはやっかいですね。
私が思いつく方法は3通り。

方法1 Dixqさんの方法。 1文字ずつ、処理していく。力業 。
方法2 配列(または動的に確保したメモリ)に1行分格納し、1行ずつ処理していく。
方法3 コメントを削除したファイルを中間ファイルとして保存し、再度読み込み、行数を数える。

一番簡単なのは方法3、一番ややこしいのが方法1です。どうします?


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

Name: mii  ..かけだし(1,503ポイント)   Date: 2009/12/08(火) 14:18   No:43630     
Title: Re:ソースコードの行数    
管理人さんお世話になります。
一応書いてみたのですが、グチャグチャでわからなくなってしまいました(汗
/* 〜 */の間をコメント、そうでなければなどと考えていたら困ってきました。
どんな感じにすればよいでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
    FILE    *fp;            // ファイルポインタ
    int  lineCnt;           // 行数
    int  blankLines = 0;    // 空白行
    int  space_flag = 0;
    int  comentLines = 0;
    int  cntOff = 0;
    int  ch;
    int  back;
    
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    
    lineCnt = 1;
    // 総ステップ数と空白行を求める
    while((ch = fgetc(fp)) != EOF) {
        
        // 改行文字の場合行数を増やす
        if (ch =='\n' && cntOff != 1) {
            lineCnt++;
            
            // 改行の後が空白だけなら
            if (space_flag == 0) {
                blankLines++;
            }
            space_flag = 0;
        }
        // コメントの処理
        else if (ch == '*') {
            // 前の文字が/なら
            if (back == '/') {
                cntOff = 1;
            }
        }
        // コメント終了
        else if (ch == '/') {
            if (back == '*') {
                cntOff = 0;
            }
        }
        // 空白文字以外なら
        else if (!isspace(ch)) {
            space_flag = 1;
        }                                                                                                                                       
        back = ch;
    }
    
    printf("総ステップ数 = %d\n", lineCnt);
    printf("総空白数 = %d\n", blankLines);
    printf("コメント行数 = %d\n", comentLines);
    /*kkk*/ 
    printf("ss");
    return 0;
}



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

Name: non  ..比類無きプログラマー(76,810ポイント)   Date: 2009/12/08(火) 15:37   No:43637     
Title: Re:ソースコードの行数    
方法1の力業にしましたか。面倒だな・・・・。
とりあえず、方法3で作って、考え方を整理してから方法1を考えた方がいいと思います。
いきなり、方法1で作るなら、私はパス。



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

Name: mii  ..かけだし(1,737ポイント)   Date: 2009/12/08(火) 15:51   No:43639     
Title: Re:ソースコードの行数    
いきなり力業にしましたが、確かにフラグ等も多くてわかりにくくなってしまいました。
とりあえず方法3でやってみたいと思うのですが、教えて頂けますでしょうか?

ちなみに処理ステップ数というのが追加されまして、
実行ステップ数のうち(プリプロセス行・中カッコのみの行を除いたステップ数)
という3種類を求めなければならない仕様になりました(泣


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

Name: non  ..比類無きプログラマー(77,164ポイント)   Date: 2009/12/08(火) 16:14   No:43640     
Title: Re:ソースコードの行数    
方法3ならお手伝いしましょう。

まず、仕様をはっきりしましょう。

コメントには次のような場合があると思われます。
または、その複合です。
/* abc */

a=5;/*  abc */

/* abc */ a=5;

/* abc
   def
   ghi  */

// abc
a=5; // abc

さらに、
コメントのネストは面倒だから考えない。
ダブルコーテーションの間にあるコメントも面倒だから考えない。
という条件にしたいのですが。
これで、もれがないでしょうか?

それから追加された仕様ですが
>実行ステップ数のうち(プリプロセス行・中カッコのみの行を除いたステップ数) 
意味がよくわかりません。{や}だけの行を除けということでしょうか?

PS
普通の授業の課題にしては結構面倒な課題ですね。
まさかとおもうけど、このあと、コンパイラを作ろうという話じゃないでしょうね。



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

Name: mii  ..かけだし(2,253ポイント)   Date: 2009/12/08(火) 16:41   No:43641     
Title: Re:ソースコードの行数    
最終的には総ステップ数、実行ステップ数、処理ステップ数
を3つにわけて算出したいのですが、

a=5;/*  abc */
a=5; // abc
/* abc */ a=5;

例えば上記のようなコメントは総ステップと実行ステップと処理ステップにカウントすればOKです!

// abc
/* abc */
/*
 ab
*/

上記ならば総ステップ数だけカウントされればOKです!

} //abc

上記ならば総ステップと実行ステップにカウントされればOKです!

1.総ステップ数        (すべての行数)
2.実行ステップ数        (コメント行および空白行を除いた行数)
3.処理ステップ数    (実ステップ数のうち、プリプロセッサ行・
              中カッコのみの行を除いたステップ数)

こんな感じです。

>さらに、コメントのネストは面倒だから考えない。
ダブルコーテーションの間にあるコメントも面倒だから考えない。という条件にしたいのですが。
これで、もれがないでしょうか?

大丈夫です!

>実行ステップ数のうち(プリプロセス行・中カッコのみの行を除いたステップ数)
意味がよくわかりません。{や}だけの行を除けということでしょうか? 

これは実行ステップから先頭に#が付くもの(#ifや#include等です)と
中カッコは{や}だけというnonさんの見解で合ってます!

>PS 普通の授業の課題にしては結構面倒な課題ですね。
それはたぶん...ないと思います(笑

長くなってすみません。


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

Name: non  ..比類無きプログラマー(77,799ポイント)   Date: 2009/12/08(火) 17:04   No:43643     
Title: Re:ソースコードの行数    
まず、miiさんのプログラムから無駄なモノを省き、ファイルを読み込んで
1文字遅れで標準出力するプログラムにしました。
(最初の段階では、ファイルに出力せず、標準出力にしています)
理解できますでしょうか?
最初の1文字目を呼んだときは、1個前の文字がないため、出力しないように
変数startを使っています。
また、EOFにぶつかったとき最後の文字はまだ出力していないので、whileの外で
最後の文字を出力します。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
    FILE    *fp;            // ファイルポインタ
    int  cntOff = 0;
    int  ch;
    int  back=0;
    int start=1;
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        /* ここに処理を加えていく */


        if(start==0 && cntOff==0)
            putchar(back);
        start=0;
        back = ch;
    }
    if(start==0 && cntOff==0)
        putchar(back);
    
    fclose(fp);
    return 0;
}

さて、ここで、コメントになれば、cntOffを0以外にして、コメントでない間はcntOff=0に
するプログラムを作っていきます。

まずは、簡単なのは
// abc
a=5; // abc
のような//のコメントです。ここを最初に作りましょう。

今の文字chが'/'で1個前も'/'なら cntOff=1にします。

cntOff=1で1個前が改行なら cntOff=0 に戻します。

ここまで入力して、実行したら、//のコメントが消えれば正解です。

ここまで、できたら、プログラムを貼り付けてください。


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

Name: mii  ..かけだし(1,942ポイント)   Date: 2009/12/08(火) 17:18   No:43644     
Title: Re:ソースコードの行数    
nonさんありがとうございます。
一応コメントが消えましたので貼ります。

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>



int main(void)

{

    FILE    *fp;            // ファイルポインタ

    int  cntOff = 0;

    int  ch;

    int  back=0;

    int start=1;

    // ファイルオープン

    if ((fp = fopen("a.c", "r")) == NULL) {

        printf("open error\n");

        exit(EXIT_FAILURE);

    }

    while((ch = fgetc(fp)) != EOF) {

        /* ここに処理を加えていく */
        if (ch == '/' && back == '/') {
            cntOff = 1;
        }
        
        if (cntOff == 1 && back == '\n') {
            cntOff = 0;
        }

        if(start==0 && cntOff==0)

            putchar(back);

        start=0;

        back = ch;

    }

    if(start==0 && cntOff==0)

        putchar(back);

    

    fclose(fp);

    return 0;

}



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

Name: non  ..比類無きプログラマー(78,055ポイント)   Date: 2009/12/08(火) 17:35   No:43645     
Title: Re:ソースコードの行数    
では次に、/*〜*/のコメントです。
基本的な考え方は//と同じです・
/*のとき cntOff = 2 にしましょう。

*/のとき cntOff=0 にすればよさそうですが、まだ*/の2文字を
出力したくないので、int count を用意して
cntOff=-1にしておいて、
count=2にします。

cntOff=-1のとき
count==0になったらcntOff=0にします。
そうでなければ、countを減らします。

ここまでで、コメントが消えると思いますが、コメントが複数行にわたったときは
改行は消したくありません。ですから、'\n'のときは、cntOffが何であってもputcharする
ように変更します。

じゃ、ここまで。



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

Name: たかぎ [URL]  ..ハッカー(134,874ポイント)   Date: 2009/12/08(火) 17:49   No:43647     
Title: Re:ソースコードの行数    
この問題は、まともに考えると結構面倒ですね。
引用符やコメントのネストも本来は処理すべきですし、それ以外にも三文字表記や二文字表記も考慮しなければなりません。

//形式のコメントや前処理指令は、行末に\(または??/)がある場合には次の行に続くことになります。
前処理指令は、#のほか、??=や%:もあり得ます。
文字列リテラルの処理は、文字列中のエスケープとして、\以外に??/を考慮しなければなりません。
中かっこは、{と}の他に、<%と%>、または??<と??>を考慮しなければなりません。


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

Name: non  ..比類無きプログラマー(78,178ポイント)   Date: 2009/12/08(火) 17:54   No:43650     
Title: Re:ソースコードの行数    
たかぎさん
そうですよね。こんな面倒なの考えたくないです。条件を絞らないと。


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

Name: mii  ..かけだし(2,455ポイント)   Date: 2009/12/08(火) 17:58   No:43651     
Title: Re:ソースコードの行数    
とりあえず出来たので張ります。
お忙しい中ありがとうございます!

ちょっとフラグの状態で戸惑ってしまいました(汗

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;            // ファイルポインタ
    int  cntOff = 0;
    int  ch;
    int  back=0;
    int start=1;
    int count = 0;
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        if (ch == '/' && back == '/') {
            cntOff = 1;
        }
        else if (ch == '*' && back == '/') {
            cntOff = 2;
        }
        else if (ch == '/' && back == '*') {
            cntOff = -1;
            count = 2;
        }
        if (cntOff == 1 && back == '\n') {
            cntOff = 0;
        }
        else if (cntOff == -1) {
            if (count == 0) {
                cntOff = 0;
            }
            else {
                count--;
            }
        }
        if(start==0 && cntOff==0)
            putchar(back);
        start=0;
        back = ch;
    }
    if(start==0 && cntOff==0)
        putchar(back);
    fclose(fp);
    return 0;
}


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

Name: mii  ..かけだし(2,491ポイント)   Date: 2009/12/08(火) 18:02   No:43652     
Title: Re:ソースコードの行数    
nonさんたかぎさんご迷惑をお掛けしてすみません。

お忙しい中本当にありがとうございます。


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

Name: non  ..比類無きプログラマー(78,493ポイント)   Date: 2009/12/08(火) 18:37   No:43654     
Title: Re:ソースコードの行数    
>ここまでで、コメントが消えると思いますが、コメントが複数行にわたったときは 
>改行は消したくありません。ですから、'\n'のときは、cntOffが何であってもputcharする 
>ように変更します。

まだ、ここができてませんね。
a=10; /* bbbb
cccc */b=20;

のような場合、
このままでは、
a=10;b=20;
のように1行になってしまいませんか?
あとで、総行数をカウントしなければいけないのでまずいです。

ま、すぐにできるでしょうから、次に進みましょう。
では、次に、方法3なら

○中間ファイルを書き込みようにオープンする。
○putcharをputcに書き換える。
○一度クローズした後、先に作った行数をカウントするプログラムを後ろに貼り付ける。

でうまくいくはずです。

さて、しかし方法3の目途が立ったので、方法3をせずに、(してもいいけど)方法1に
変更します。

今作ったプログラムでputcharする文字が、ファイルから入力する文字だと考えればよいので、
このputcharの所に、前作ったプログラム(No43625)のwhileの中のプログラムをコピーします。
また、最後のputcharの所にも、必要なカウント部分を入れます。
最後のputcharの所のためには仕様をはっきりさせておく必要があります。
それは、EOFのみの行は1行として数えるのか否かです。

なお、後で追加された仕様は、自分で考えてみてください。







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

Name: mii  ..入門者(3,501ポイント)   Date: 2009/12/08(火) 21:21   No:43660     
Title: Re:ソースコードの行数    
とりあえず方法3で作成したみたのですが、
実行ステップ数が10桁の数字になってしまいます(汗
どのようにすればよいでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp, *wfp;
    int        space_flag = 0;
    int      cntOff = 0;
    int      ch;
    int      back=0;
    int     start=1;
    int     count = 0;
    int        lineCnt;
    int        blankLines;
    
    printf("a");/* ファイルオープン 
    abc*/ printf("b");
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    if ((wfp = fopen("out.c", "w")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        
        if (ch == '/' && back == '/') {
            cntOff = 1;
        }
        else if (ch == '*' && back == '/') {
            cntOff = 2;
        }
        else if (ch == '/' && back == '*') {
            cntOff = -1;
            count = 2;
        }
        if (cntOff == 1 && back == '\n') {
            cntOff = 0;
        }
        else if (cntOff == -1) {
            if (count == 0) {
                cntOff = 0;
            }
            else {
                count--;
            }
        }
        if (start == 0 && cntOff == 0) {
            putc(back, wfp);
        }
        else if (back == '\n') {
            putc(back, wfp);
        }
        start=0;
        back = ch;
    }
    if (start == 0 && cntOff == 0) {
        putc(back, wfp);
    }
    fclose(wfp);
    fclose(fp);
    if ((fp = fopen("out.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    lineCnt = 1;
    while((ch = fgetc(fp)) != EOF) {
        if (ch =='\n') {
            lineCnt++;
            if (space_flag == 0) {
                blankLines++;
            }
            space_flag = 0;
        }
        else if (!isspace(ch)) {
            space_flag = 1;
        }
    }
    printf("総ステップ数   = %d\n", lineCnt);
    printf("実行ステップ数 = %d\n", blankLines);
    fclose(fp);
    return 0;
}


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

Name: non  ..比類無きプログラマー(78,517ポイント)   Date: 2009/12/08(火) 21:27   No:43661     
Title: Re:ソースコードの行数    
だいたいそういうときは、初期値を入れたか疑うものです。
入れたの?


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

Name: mii  ..入門者(3,557ポイント)   Date: 2009/12/08(火) 21:31   No:43662     
Title: Re:ソースコードの行数    
すいません初期化に今気づきました。。。
っとnonさんの方が先でしたか(汗
すみませんでした。

ただやはり結果がおかしくて、実行ステップ数が合いません(泣

もう少し見てみます。


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

Name: non  ..比類無きプログラマー(78,646ポイント)   Date: 2009/12/08(火) 21:34   No:43663     
Title: Re:ソースコードの行数    
if (start == 0 && cntOff == 0) {
    putc(back, wfp);
}
else if (back == '\n') {
     putc(back, wfp);
}
これでも間違ってはないけど、後で方法1にするときに、putcのところに プログラムを挿入したいから、putcを1つにまとめましょう。
if ((start == 0 && cntOff == 0) || back == '\n') {
    putc(back, wfp);
}

このようにね。


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

Name: mii  ..入門者(3,572ポイント)   Date: 2009/12/08(火) 21:44   No:43664     
Title: Re:ソースコードの行数    
ご指摘ありがとうございます。
訂正しておきます!


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

Name: mii  ..入門者(4,543ポイント)   Date: 2009/12/08(火) 21:54   No:43666     
Title: Re:ソースコードの行数    
なんとかいけました。
ありがとうございます。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp, *wfp;            // ファイルポインタ
    int      cntOff = 0;        // 0はコメントでない間
    int      ch;
    int      back=0;
    int     start=1;
    int     count = 0;
    int        lineCnt;
    int        blankLines = 0;
    int        space_flag = 0;
    printf("a");/* ファイルオープン 
    abc*/ printf("b");
    
    //int
    
    /*kokikjhj*/
    
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    if ((wfp = fopen("out.c", "w")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        
        if (ch == '/' && back == '/') {
            cntOff = 1;
        }
        else if (ch == '*' && back == '/') {
            cntOff = 2;
        }
        else if (ch == '/' && back == '*') {
            cntOff = -1;
            count = 2;
        }
        if (cntOff == 1 && back == '\n') {
            cntOff = 0;
        }
        else if (cntOff == -1) {
            if (count == 0) {
                cntOff = 0;
            }
            else {
                count--;
            }
        }
        if ((start == 0 && cntOff == 0) || back == '\n') {
            putc(back, wfp);
        }

        start=0;
        back = ch;
    }
    if (start == 0 && cntOff == 0) {
        putc(back, wfp);
    }
    fclose(wfp);
    fclose(fp);
    if ((fp = fopen("out.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    lineCnt = 1;
    while((ch = fgetc(fp)) != EOF) {
        if (ch =='\n') {
            lineCnt++;
            if (space_flag == 0) {
                blankLines++;
            }
            space_flag = 0;
        }
        else if (!isspace(ch)) {
            space_flag = 1;
        }
    }
    printf("総ステップ数   = %d\n", lineCnt);
    printf("実行ステップ数 = %d\n", lineCnt - blankLines);
    fclose(fp);
    return 0;
}


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

Name: non  ..比類無きプログラマー(78,661ポイント)   Date: 2009/12/08(火) 22:04   No:43667     
Title: Re:ソースコードの行数    
おめでとうございます。じゃ、後はがんばって。


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

Name: mii  ..入門者(4,556ポイント)   Date: 2009/12/08(火) 22:22   No:43668     
Title: Re:ソースコードの行数    
頑張ってみます。
本当にありがとうございました。


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

Name: mii  ..入門者(4,603ポイント)   Date: 2009/12/09(水) 09:40   No:43676     
Title: Re:ソースコードの行数    
方法1にしようと思ったのですが、
put文の部分にwhileのループを入れても
上手く動きませんでした(泣




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

Name: non  ..比類無きプログラマー(78,755ポイント)   Date: 2009/12/09(水) 09:44   No:43677     
Title: Re:ソースコードの行数    
おはようございます。

「うまくいかない」だけでは、原因は、わかりません。
whileはいらないですからね。whileの中だけね。
もちろん、chはbackに直してね。


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

Name: mii  ..初心者(5,150ポイント)   Date: 2009/12/09(水) 10:09   No:43679     
Title: Re:ソースコードの行数    
おはようございます。
とりあえず直してみました。
どこがダメなのでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;            // ファイルポインタ
    int      cntOff = 0;        // 0はコメントでない間
    int      ch;
    int      back=0;
    int     start=1;
    int     count = 0;
    int        lineCnt = 1;
    int        blankLines = 0;
    int        space_flag = 0;
    
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        
        if (ch == '/' && back == '/') {
            cntOff = 1;
        }
        else if (ch == '*' && back == '/') {
            cntOff = 2;
        }
        else if (ch == '/' && back == '*') {
            cntOff = -1;
            count = 2;
        }
        if (cntOff == 1 && back == '\n') {
            cntOff = 0;
        }
        else if (cntOff == -1) {
            if (count == 0) {
                cntOff = 0;
            }
            else {
                count--;
            }
        }
        if ((start == 0 && cntOff == 0) || back == '\n') {
            lineCnt++;
            if (space_flag == 0) {
                blankLines++;
            }
            space_flag = 0;
            if (!isspace(back)) {
                space_flag = 1;
            }
        }
        start=0;
        back = ch;
    }
    if (start == 0 && cntOff == 0) {
        lineCnt++;
        if (space_flag == 0) {
            blankLines++;
        }
        space_flag = 0;
        if (!isspace(back)) {
            space_flag = 1;
        }
    }
    fclose(fp);
    printf("総ステップ数   = %d\n", lineCnt);
    printf("実行ステップ数 = %d\n", lineCnt - blankLines);
    fclose(fp);
    return 0;
}



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

Name: non  ..比類無きプログラマー(78,900ポイント)   Date: 2009/12/09(水) 10:16   No:43680     
Title: Re:ソースコードの行数    
今、実行できる状況にないからソースみてもわからない。どう、うまくいかないの?


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

Name: non  ..比類無きプログラマー(78,990ポイント)   Date: 2009/12/09(水) 10:20   No:43681     
Title: Re:ソースコードの行数    
No43666ではwhileの中身は下のようだけど、上は違うじゃん。
        if (ch =='\n') {
            lineCnt++;
            if (space_flag == 0) {
                blankLines++;
            }
            space_flag = 0;
        }
        else if (!isspace(ch)) {
            space_flag = 1;
        }


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

Name: mii  ..初心者(5,186ポイント)   Date: 2009/12/09(水) 10:23   No:43682     
Title: Re:ソースコードの行数    
とりあえず総ステップ数が40行くらいのファイルを指定したのですが、
総ステップ数が504
実行ステップが350とかになります。


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

Name: non  ..比類無きプログラマー(79,002ポイント)   Date: 2009/12/09(水) 10:27   No:43683     
Title: Re:ソースコードの行数    
じゃ、やっぱり、上が原因だ。

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

Name: mii  ..初心者(5,263ポイント)   Date: 2009/12/09(水) 11:11   No:43686     
Title: Re:ソースコードの行数    
>No43666ではwhileの中身は下のようだけど、上は違うじゃん。
ただそうすると今度は総ステップも実行ステップも1になってしまいます(泣

ちなみに上記No43666のchをbackに直してみてもだめでした。


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

Name: non  ..比類無きプログラマー(79,010ポイント)   Date: 2009/12/09(水) 11:20   No:43687     
Title: Re:ソースコードの行数    
そんなはずはない。冷静になって、よく考えてみてください。


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

Name: mii  ..初心者(5,290ポイント)   Date: 2009/12/09(水) 13:55   No:43693     
Title: Re:ソースコードの行数    

う〜ん。調べてみたんですが分かりません(泣
どこが悪いんでしょうか?


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

Name: non  ..比類無きプログラマー(79,016ポイント)   Date: 2009/12/09(水) 14:03   No:43695     
Title: Re:ソースコードの行数    
添付してください。

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

Name: mii  ..初心者(5,670ポイント)   Date: 2009/12/09(水) 14:44   No:43698     
Title: Re:ソースコードの行数    
よろしくお願いします。
フラグの状態と変化を理解していないから、
わからないんだと思います(泣
う〜ん混乱してきました。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;                 // ファイルポインタ
    int      cntOff = 0;        // 0はコメントでない間
    int      ch;
    int      back=0;
    int     start=1;
    int     count = 0;
    int        lineCnt = 1;
    int        blankLines = 0;
    int        space_flag = 0;
    
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        
        if (ch == '/' && back == '/') {
            cntOff = 1;
        }
        else if (ch == '*' && back == '/') {
            cntOff = 2;
        }
        else if (ch == '/' && back == '*') {
            cntOff = -1;
            count = 2;
        }
        if (cntOff == 1 && back == '\n') {
            cntOff = 0;
        }
        else if (cntOff == -1) {
            if (count == 0) {
                cntOff = 0;
            }
            else {
                count--;
            }
        }
        if ((start == 0 && cntOff == 0) || back == '\n') {
            if (ch =='\n') {
                lineCnt++;
                if (space_flag == 0) {
                    blankLines++;
                }
                space_flag = 0;
            }
            else if (!isspace(ch)) {
                space_flag = 1;
            }
            start=0;
            back = ch;
        }
    }
    if (start == 0 && cntOff == 0) {
            if (ch =='\n') {
                lineCnt++;
                if (space_flag == 0) {
                    blankLines++;
                }
                space_flag = 0;
            }
            else if (!isspace(ch)) {
                space_flag = 1;
            }
    }
        fclose(fp);
    printf("総ステップ数   = %d\n", lineCnt);
    printf("実行ステップ数 = %d\n", lineCnt - blankLines);
    fclose(fp);
    return 0;
}



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

Name: non  ..比類無きプログラマー(79,039ポイント)   Date: 2009/12/09(水) 15:04   No:43699     
Title: Re:ソースコードの行数    
まだ、チラ見ですが、chがbackになってません。


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

Name: non  ..比類無きプログラマー(79,058ポイント)   Date: 2009/12/09(水) 15:07   No:43700     
Title: Re:ソースコードの行数    
start=0;
back = ch;
はifの外です。


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

Name: non  ..比類無きプログラマー(79,085ポイント)   Date: 2009/12/09(水) 15:13   No:43701     
Title: Re:ソースコードの行数    
whileから出た後の、元putcharがあった部分は、無駄が多いので整理してください。


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

Name: mii  ..初心者(5,703ポイント)   Date: 2009/12/09(水) 16:04   No:43704     
Title: Re:ソースコードの行数    
nonさんの通り訂正してみました。

コメント等いれてみたのですが、
間違ってる部分などがあるかもしれませんがお願いします!



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

Name: non  ..比類無きプログラマー(79,127ポイント)   Date: 2009/12/09(水) 16:13   No:43705     
Title: Re:ソースコードの行数    
で、結論からいえば、うまくいったのでしょうか?

countの使用目的はNo:43645 に書いてます。


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

Name: mii  ..初心者(5,768ポイント)   Date: 2009/12/09(水) 16:23   No:43707     
Title: Re:ソースコードの行数    
テストは少ししかしていませんがちゃんと動いています。
nonさんありがとうございます!

ただこれに追加分を付けるとなると。。。先が思いやられます(T_T)


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

Name: mii  ..初心者(5,786ポイント)   Date: 2009/12/09(水) 22:43   No:43722     
Title: Re:ソースコードの行数    
度々すみません。
先ほどテストしていたんですがバグがありました。

#include <stdio.h>
/*#include <stdlib.h>*/
#include <ctype.h>
//int main(void)

/*
kome
}*/ abc

abc //kome


というファイルでテストしていたのですが、期待する結果とは違う結果
になってしまいました。どこがおかしいのでしょうか?


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

Name: non  ..比類無きプログラマー(79,195ポイント)   Date: 2009/12/10(木) 08:37   No:43734     
Title: Re:ソースコードの行数    
何度もいうようですが、どのプログラムでどのように期待していたら、どう期待する結果と
違うのかがわからないと答えようがないです。
プログラムは添付ファイルのままですか?


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

Name: mii  ..初心者(6,078ポイント)   Date: 2009/12/10(木) 09:35   No:43738     
Title: Re:ソースコードの行数    
おはようございます。

>何度もいうようですが、どのプログラムでどのように期待していたら、どう期待する結果と
違うのかがわからないと答えようがないです。
プログラムは添付ファイルのままですか?

その通りです。問題提示だけしてしまってすみませんでした。

プログラムムは添付のままで、以下がテストファイル内容です。
とりあえずコンパイルが通るという条件でテストファイルを作成しました。

1 #include <stdio.h>
2         
3 int main(void)
4 {
5     int a;    // a
6     
7    // aだよ int b;
8    
9    /*
10    int
11    int
12    */    int b;
13    
14    /*****************************************
15    **********************/
16 }
17 #include <stdio.h>
18
19 /*#include <stdlib.h>*/
20
21 #include <ctype.h>
22
23 //int main(void)
24
25
26
27 /*
28
29 kome
30
31 }*/ double abc;
32
33
34
35 double cba; //kome
36
37 [EOF]


上記だと総ステップが37、実行ステップが10になるようにしたいのですが、
実行ステップが12になってしまいます。よろしくお願いいたします。


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

Name: non  ..比類無きプログラマー(79,429ポイント)   Date: 2009/12/10(木) 14:18   No:43743     
Title: Re:ソースコードの行数    
whileから抜けた後の、putcharの代わりに挿入したプログラムに問題があります。

backに入っている文字は1文字前であることから、最後の1文字を考慮しなくてはいけません。
今回のようにEOFの1つ前の行が、空白行の時のカウントをするプログラム部分が必要ですが、
ここには書かれていません。

もう一つは、No:43654 の最後で書いたように、EOFしかない行を1行として数えるかどうかです。
もし、数えるのなら、このような場合は当然空白行としてもカウントが必要です。

なお、データに行番号がついていると、同じ条件で試せないので、不便です。



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

Name: mii  ..初心者(6,331ポイント)   Date: 2009/12/10(木) 14:48   No:43745     
Title: Re:ソースコードの行数    
>なお、データに行番号がついていると、同じ条件で試せないので、不便です。
わざわざつけちゃってすいません。逆に不便ですよね。消したものを張りなおします!

// 最初の文字でないかつ非コメント状態であれば
if (start == 0 && cntOff == 0) {
    if (back =='\n') {
        lineCnt++;
    }
        // この部分を追加しました
    // EOFしかない行を1行として数える
    if (space_flag == 0) {
        blankLines++;
    }
}


>今回のようにEOFの1つ前の行が、空白行の時のカウントをするプログラム部分が必要
これはどういう風に書いたらよいでしょうか?


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

Name: mii  ..初心者(6,556ポイント)   Date: 2009/12/10(木) 15:43   No:43748     
Title: Re:ソースコードの行数    
#include <stdio.h>
        
int main(void)
{
    int a;    // a
    
    // aだよ int b;
    
    /*
    int
    int
    */    int b;
    
    /*****************************************
    **********************/
}
#include <stdio.h>

/*#include <stdlib.h>*/

#include <ctype.h>
総数は37になります!

//int main(void)



/*

kome

}*/ double abc;



double cba; //kome



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

Name: non  ..比類無きプログラマー(79,561ポイント)   Date: 2009/12/10(木) 16:16   No:43749     
Title: Re:ソースコードの行数    
whileの外の部分はこんな感じかな?チェックをあまりしてないけど。
    if (start == 0) {
            if (back =='\n') {
                lineCnt++;
                blankLines++;
            }
            if (space_flag == 0)
                blankLines++;
    }
    else{
        blankLines=1;    
    }



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

Name: mii  ..初心者(6,686ポイント)   Date: 2009/12/10(木) 17:10   No:43750     
Title: Re:ソースコードの行数    
ありがとうございます!
whileの外部分をnonさんのソースでためした所希望通りの結果が出ました。

ちなみに3番目の仕様については#がきたらその行をカウント、
カッコだけがきたらその行をカウントする方法でよいでしょうか?

ただカッコだけとなるとどう判断すればいいのか困っています。


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

Name: mii  ..初心者(6,773ポイント)   Date: 2009/12/11(金) 14:19   No:43824     
Title: Re:ソースコードの行数    
とりあえず関数化してコメントを付けて見ました。

処理ステップ数 (実ステップ数のうち、プリプロセッサ行・中カッコのみの行を除いたステップ数)
を求める為にはどうすればよいでしょうか?

よろしくお願いします。


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

Name: non  ..比類無きプログラマー(79,989ポイント)   Date: 2009/12/11(金) 15:51   No:43835     
Title: Re:ソースコードの行数    
後は自分で考えて欲しいのだけど・・・
じゃ、最後のヒントで。
まず、仕様の条件を絞ること。

今回は#が出てきた行数と{または}のみ現れた行数をカウントしました。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;                // ファイルポインタ
    int        lineCnt;            // 行数
    int        sharpLines = 0;        // 空白行
    int        sharp_flag = 0;
    int        braceLines = 0;
    int        brace_flag =0;
    int        ch;
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        if (ch =='\n') {
            if (sharp_flag == 1) 
                sharpLines++;
            if (brace_flag ==1)
                braceLines++;
            sharp_flag = 0;
        }
        else if (!isspace(ch)){
            if (ch == '{' || ch == '}')
                if(brace_flag==0)
                    brace_flag=1;
            else
                brace_flag=2;
        }
        if (ch=='#') {
            sharp_flag = 1;
        }
    }
    printf("プリプロセッサ = %d\n", sharpLines);
    printf("括弧の行 = %d\n", braceLines);
    
    return 0;
}



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

Name: mii  ..初心者(6,881ポイント)   Date: 2009/12/11(金) 16:09   No:43838     
Title: Re:ソースコードの行数    
本当にありがとうございます!
実行してみたんですが

#include 

int main(void) {

}
}
}
{

とすると括弧の数が4になって欲しいのですが2と表示されてしまいます。
どうしたらよいでしょうか?


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

Name: mii  ..初心者(6,910ポイント)   Date: 2009/12/11(金) 16:29   No:43839     
Title: Re:ソースコードの行数    
度々すいません。修正出来ました。
もうちょっと頑張ってみます!


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

Name: non  ..比類無きプログラマー(80,259ポイント)   Date: 2009/12/11(金) 16:56   No:43842     
Title: Re:ソースコードの行数    
テストしてなかったので、抜けがありましたね。
今度は実行して確認しました。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;                // ファイルポインタ
    int        lineCnt;            // 行数
    int        sharpLines = 0;        // 空白行
    int        sharp_flag = 0;
    int        braceLines = 0;
    int        brace_flag =0;
    int        ch;
    // ファイルオープン
    if ((fp = fopen("a.c", "r")) == NULL) {
        printf("open error\n");
        exit(EXIT_FAILURE);
    }
    while((ch = fgetc(fp)) != EOF) {
        if (ch =='\n') {
            if (sharp_flag == 1) 
                sharpLines++;
            if (brace_flag ==1)
                braceLines++;
            sharp_flag = 0;
            brace_flag=0;
        }
        else if (!isspace(ch)){
            if (ch == '{' || ch == '}'){
                if(brace_flag==0)
                    brace_flag=1;
            }
            else
                brace_flag=2;
        }
        if (ch=='#') {
            sharp_flag = 1;
        }
    }
    printf("プリプロセッサ = %d\n", sharpLines);
    printf("括弧の行 = %d\n", braceLines);
    
    return 0;
}



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

Name: mii  ..初心者(6,928ポイント)   Date: 2009/12/11(金) 17:00   No:43843     
Title: Re:ソースコードの行数    
ありがとうございます!
上手く組み込める用やってみます。


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

Name: mii  ..初心者(8,336ポイント)   Date: 2009/12/11(金) 17:25   No:43845     
Title: Re:ソースコードの行数    
う〜ん。。。やはり中々上手くいきませんね(泣

nonさんに頂いたサンプルだと上手く動くのですが、
組み込んでみたら上手くカウント出来ませんでした。

なぜか括弧の数が少なく出てきます。。。

何度もすいません。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    FILE    *fp;            // ファイルポインタ
    int      currentChar;        // 現在の文字
    int      backChar = 0;        // 1個前の文字
    int      commentFlag = 0;    // 各コメント状態を表す    
    int     countFlag = 0;        // 複数行コメントの終了判定
    int        spaceFlag = 0;        // 空白又はTABを判定
    int     startFlag = 1;        // 最初の文字か判定    
    int        lineCnt = 0;        // 総ステップ数
    int        nonRealCnt = 0;        // 実ステップ数に含めない数
    int        sharp_flag = 0;
    int        brace_flag = 0;
    int        sharpLines = 0;
    int        braceLines = 0;
    // ファイルオープン
    if ((fp = fopen("b.c", "r")) == NULL) {
    printf("open error\n");
    exit(EXIT_FAILURE);
    }
    while ((currentChar = fgetc(fp)) != EOF) {
    // 単一行コメントの開始
    if (currentChar == '/' && backChar == '/') {
            commentFlag = 1;
        }
    // 複数行コメントの開始
        else if (currentChar == '*' && backChar == '/') {
            commentFlag = 2;
        }
    // 複数行コメントの継続
        else if (currentChar == '/' && backChar == '*') {
            commentFlag = -1;
            countFlag = 2;
        }
    // 単一行コメント終了判断
        if (commentFlag == 1 && backChar == '\n') {
            commentFlag = 0;
        }
    // 複数行コメント終了判断
        else if (commentFlag == -1) {            
        // 複数行コメントが非コメント状態
            if (countFlag == 0) {
                commentFlag = 0;
            }
        // 複数行コメント継続状態
            else {
                countFlag--;
            }
        }
        // 非コメント状態又は読み取った文字の1個前が改行文字のいずれか
        if ((startFlag == 0 && commentFlag == 0) || backChar == '\n') {        
            // 1個前の文字が改行文字だった場合
            if (backChar =='\n') {
                lineCnt++;
                if (sharp_flag == 1) {
                    sharpLines++;
                }    
                if (brace_flag == 1) {
                    braceLines++;
                }
                // コメント又は空白行であれば
                if (spaceFlag == 0) {
                    nonRealCnt++;
                }
                spaceFlag = 0;
                sharp_flag = 0;
                brace_flag = 0;
            }
            // 1個前の文字が空白又はTAB文字文字以外の場合
            else if (!isspace(backChar)) {        
                if (backChar == '{' || backChar == '}') {        
                    if (brace_flag == 0) {
                        brace_flag = 1;
                    }
                }
                spaceFlag = 1;
            }
            else {
                brace_flag = 2;
            }    
            if (backChar == '#') {
                sharp_flag = 1;
            }
        }
        startFlag = 0;
        backChar = currentChar;
    }
    printf("プリプロセッサ = %d\n", sharpLines);
    printf("括弧の行 = %d\n", braceLines);
    return 0;
}


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

Name: mii  ..初心者(8,396ポイント)   Date: 2009/12/13(日) 16:20   No:43985     
Title: Re:ソースコードの行数    
う〜ん。。。
グチャグチャになってしまって、
どうしても上手くいきません(泣

どうしたら良いのでしょうか?


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

Name: non  ..比類無きプログラマー(81,225ポイント)   Date: 2009/12/13(日) 16:46   No:43986     
Title: Re:ソースコードの行数    
1つめは
>brace_flag = 2;
の場所でしょ。
2つめは、
EOFの直前の文字の処理。



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

Name: mii  ..初心者(8,586ポイント)   Date: 2009/12/14(月) 13:31   No:44014     
Title: Re:ソースコードの行数    
nonさんありがとうございます。

以下のテスト用ファイルを用いてテストを行っているのですが
総ステップ27
実行ステップ18
処理ステップ11
となり実行ステップ17、処理ステップ10となる予定でした。
どこがおかしいのでしょうか?

ちなみにEOFのみの場合は行に含めず、1文字以上の何か文字や、
空白があった場合は行数にカウントするということになりました(泣

これは0からカウントすることで何とかしているんですが、
EOF行だけの場合、文字が来たときに1行とするのはどうすればよいでしょうか?

質問ばかりですみません。


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

Name: mii  ..初心者(8,700ポイント)   Date: 2009/12/14(月) 16:14   No:44023     
Title: Re:ソースコードの行数    
>ちなみにEOFのみの場合は行に含めず、1文字以上の何か文字や、
空白があった場合は行数にカウントするということに

これはどういう風に修正すればよいでしょうか?
どうしても修正すると他の部分に影響が出たりして上手くいきません(泣


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

Name: mii  ..初心者(8,743ポイント)   Date: 2009/12/15(火) 02:14   No:44065     
Title: Re:ソースコードの行数    
最終行は、EOFのみの行でも、文字があって行の終わりにEOFでも正しく計算するには、
大幅な修正が必要なんでしょうか?どうすれば良いでしょうか(T_T)


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

Name: ドラ  ..入門者(4,128ポイント)   Date: 2009/12/15(火) 23:34   No:44184     
Title: Re:ソースコードの行数    
かなり手こずっておられますね・・・。

>最終行は、EOFのみの行でも、文字があって行の終わりにEOFでも正しく計算するには、 
>大幅な修正が必要なんでしょうか?どうすれば良いでしょうか(T_T) 
EOFがくるとwhile文を抜けますが、抜けた先でbackCharの値を見てフラグを更新した後、
フラグの状態を見て行数をカウントすれば良いのでは?
ただ、backCharを見て行数をカウントするよりcurrentCharを見て行数をカウントする方が
都合がいいような気がします。
(これまでの流れを全て追っているわけではないので見当違いかもしれませんが・・・)


それから、最終結果が自分の想定した結果と違うということを言っておられますが
途中経過のどこで想定と食い違っているか把握していますか?

ファイルから読みとった文字を1文字ずつコンソール画面に表示していき、
改行文字またはEOFが来たら、その行が何の行と判定されたかを表示していけば
問題がある部分を把握しやすくなると思います。



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

Name: mii  ..中級者(9,015ポイント)   Date: 2009/12/16(水) 09:42   No:44208     
Title: Re:ソースコードの行数    
おはようございます。

昨日レビューらしきものをしたんですが、//がきたら改行まで読み飛ばす。
/*がきたら*/を探してしまえばいいんじゃないかという風になってしまいました(汗

何やら混乱状態です(T_T)

>それから、最終結果が自分の想定した結果と違うということを言っておられますが
途中経過のどこで想定と食い違っているか把握していますか?

やはりここが問題です。フラグの制御を追い切れていないのが原因ですよね。

>ファイルから読みとった文字を1文字ずつコンソール画面に表示していき、
改行文字またはEOFが来たら、その行が何の行と判定されたかを表示していけば
問題がある部分を把握しやすくなると思います。 

なるほど!ちょっとその方法で試してみます!

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


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

Name: mii  ..中級者(9,149ポイント)   Date: 2009/12/16(水) 13:31   No:44232     
Title: Re:ソースコードの行数    
//がきたら改行まで読み飛ばす
/*がきたら次の*/まで読み飛ばすようにして、
コメント行、空白行を分けてカウントするようにしました。

1 int a; // コメント
2 /*
3 コメント
4 コメント
5 コメント
6 */  int a;

などと入力されていると、
1行目と6行目はコメント行に認識したくないのですが、
コメント行と認識されてしまいます。

どういう風に修正したらよいでしょうか?


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

Name: non  ..比類無きプログラマー(82,624ポイント)   Date: 2009/12/16(水) 15:44   No:44236     
Title: Re:ソースコードの行数    
まだやってたのねと思って覗いたら・・・

>昨日レビューらしきものをしたんですが、//がきたら改行まで読み飛ばす。 
>/*がきたら*/を探してしまえばいいんじゃないかという風になってしまいました(汗 

いつのまにかアルゴリズムが変わったのね。
「なってしまいました」ってのが、よくわからないけど。チームですか?

まっ、いずれにしても、私は厭きたので、頑張ってください。
アルゴリズムも変わったし、スレッドを立て直したら、他の方のレスもあるかもね。



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

Name: ドラ  ..入門者(4,412ポイント)   Date: 2009/12/16(水) 23:39   No:44327     
Title: Re:ソースコードの行数    
nonさんが厭きておられるようなので代わりに・・・

>1行目と6行目はコメント行に認識したくないのですが、
>コメント行と認識されてしまいます。 
コメントを読み飛ばしている最中に'\n'が来たら、その行はコメント行として
カウントしていることが問題です。

混乱しているなら、まず問題を整理することからはじめましょう。
1行の中にどのような項目が存在する可能性があるか考えてください。
 ・空白類文字
 ・コメント
 ・中カッコ
 ・前処理
 ・その他の文字
の5つですね。
という事は'\n'またはEOFを読み込んだときに5種類のフラグの状態を調べて
何の行なのかを判定すればいいことになりませんか?

後はどのフラグが立っているときに何の行と判定すればいいのかを
見抜く事ができればとりあえず完成しそうです。


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

Name: mii  ..中級者(9,232ポイント)   Date: 2009/12/17(木) 09:27   No:44365     
Title: Re:ソースコードの行数    
ドラさんありがとうございます。

そういう方法があったのですね!
思いつかず、力技で処理してしまいました。
論理的じゃないのできっとバグがあると思いますが(汗

後はEOF行だけの時の処理ですが、
これも力技しかないのかなぁと。
考えるのは難しいですね。。。(泣


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

Name: mii  ..中級者(9,758ポイント)   Date: 2009/12/17(木) 16:43   No:44384     
Title: Re:ソースコードの行数    
取りあえず修正した後、
以下のテストファイルを用いてテストしてみました。

<test1>
/**/#include <stdio.h>#include <stdlib.h>/* --- */int a;
#define LOKI 123
#define IKOL 123
#
void main()
{ //ask
    int a,b ;/* bbb */
    a=0;/* ccc */    /*
    a\n
    a */
    /* ddd */    /* ooo
    a\n
    a */
    a=0 ;/* eee */    /* */    /* */
    //aaa
    b=a ;//
    b=a ; /* b */b=b;
    printf( "\" " ) ;
    b=1 ;
    while(a!=b)
    { a=b ;
    }
//    printf( "%d\n",LOKI ) ;
/*/
    int g;
    */
}

正しくは
コメント行 = 10
空白行 = 0
シャープ行 = 4
中カッコ行 = 3
なのですが
コメント行が9
中カッコ行が2になってしまいます。

<test2>
/**/#include <stdio.h>#include <stdlib.h>/* --- */int a;
#define LOKI 123
#define IKOL 123
#
/**/#define AA 123/***/
//#define BB 456
#define CC 789 /*
#define DD 741
*/
void main()
{ //ask
    int a,b ;/* bbb */
    a=0;/* ccc */    /*
    a\n
    a */
    /* ddd */    /* ooo
    a\n
    a */
    a=0 ;/* eee */    /* */    /* */
    //aaa
    b=a ;//
    b=a ; /* b */b=b;
    printf( "\" " ) ;
    b=1 ;
    while(a!=b)
    { a=b ;
    }
//    printf( "%d\n",LOKI ) ;
/*/
    int g;
    */

}

int main2()
{    int j;/*
*/    int i;/***//**//*
    int bb;
    */
    // int cc;
    for (i = 9; i< 10; i++) {
        /**/{/**/ printf("%d\n", i);
    }}    // aaaa
/**/}}

こちらは正しくは
コメント行 = 16
空白行 = 2
シャープ行 = 6
中カッコ行 = 5
なのですが
中カッコ行が2になってしまいます。
こちらはなぜかコメントは正常でした。

どこに問題があるか教えていただけないでしょうか?

またファイル内容がEOFのみの1行だけの場合
上手く処理出来ません(泣
最初の1文字を上手く取れてないんでしょうか?

お力添えよろしくお願いいたします。


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

Name: Mist  ..比類無きプログラマー(78,558ポイント)   Date: 2009/12/17(木) 17:16   No:44392     
Title: Re:ソースコードの行数    
途中経過を表示させて確認していますか?
printfデバッグすれば、どの時点で自分の思い描くとおりに動いていないかすぐにわかると思いますよ。

http://funini.com/kei/c/debug.shtml


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

Name: ドラ  ..入門者(4,909ポイント)   Date: 2009/12/17(木) 23:45   No:44439     
Title: Re:ソースコードの行数    
>backChar = fgetc(fp);
これはまずいのでは?
backCharはコメントの開始を判定するのに使っているだけなので'/'以外
の文字でもセットしておいて下さい。


>後はEOF行だけの時の処理ですが、 これも力技しかないのかなぁと。
EOFを読み込んだときどのフラグも立っていなかったらEOFだけの行と判定するとか・・
EOFを読み込んだときのbackCharが'\n'ならEOFだけの行と判定するとか・・
(これをやるならbackCharの初期値は'\n'が適当ですね)


それから'#'が来たら'\n'が来るまで読み飛ばさないといけないのでは?


ソースコードをざっと見てみましたが、できているところとできていないところが
混ざり合っているように見えました。
今のソースは捨てて、最初から作りなおしてみてはどうでしょうか?
その時に一気に作りたいものの仕様を満たすものを作ろうとするのではなく、
まずは空白のみの行数とそれ以外の行数を正確にカウントできるものを目指して下さい。
(合計すれば総行数も出てきますね)

このときに、前にも言った
「ファイルから読みとった文字を1文字ずつコンソール画面に表示していき、 
 改行文字またはEOFが来たら、その行が何の行と判定されたかを表示していけば 」
を実践して下さい。
これがMistさんのおっしゃられているprintfデバッグです。
途中経過ではバグっているのに最終結果だけは自分の想定通りというようなケースも
考えられますので・・・

ここまでの事がきちんと出来るようになったら、今度は空白のみの行数、コメントのみの行数、
それ以外の行数を正確にカウントできるように仕様を拡張していきましょう。
このような事を実践することで自分の書いたソースコードの中でできている部分と
問題がありそうな部分を切り離して考える事ができるようになります。
miiさんの質問を見ていると、これができていません。


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

Name: mii  ..中級者(9,912ポイント)   Date: 2009/12/18(金) 09:23   No:44472     
Title: Re:ソースコードの行数    
Mistさんドラさんありがとうございます。

提出日が月曜なので間に合うかどうかわかりませんが、
新しく作ってみようと思います!

わからなくなったらまた質問すると思うのでよろしくお願いします。



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

Name: non  ..比類無きプログラマー(84,217ポイント)   Date: 2009/12/18(金) 11:38   No:44478     
Title: Re:ソースコードの行数    
提出期限が近そうなので、少しお手伝い。
ただし、最初の考えかたNo44014の添付ファイルを使ってです。
int Cstep(const char *filePath, FILE *fp)
{
    int      currentChar;        // 現在の文字
    int      backChar = 0;        // 1個前の文字
    int      commentFlag = 0;    // 各コメント状態を表す        (0の場合非コメント状態)
    int     countFlag = 0;        // 複数行コメントの終了判定    (0の場合非コメント状態)
    int        spaceFlag = 0;        // 空白又はTABを判定        (0の場合空白又はTAB状態)
    int     startFlag = 1;        // 最初の文字か判定            (0の場合2個目以降の文字)
    int        lineCnt = 0;        // 総ステップ数
    int        nonRealCnt = 0;        // 実ステップ数に含めない数
    int        sharp_flag = 0;
    int        brace_flag = 0;
    int        sharpLines = 0;
    int        braceLines = 0;
    int        cF=0;
    
    while ((currentChar = fgetc(fp)) != EOF) {
        
        // 単一行コメントの開始
        if (currentChar == '/' && backChar == '/') {
            commentFlag = 1;
        }
        // 複数行コメントの開始
        else if (currentChar == '*' && backChar == '/') {
            commentFlag = 2;
            cF=2;
        }
        // 複数行コメントの継続
        else if (currentChar == '/' && backChar == '*' && cF==0) {
            commentFlag = -1;
            countFlag = 2;
        }
        if(cF>0) cF--;
        // 単一行コメント終了判断
        if (commentFlag == 1 && backChar == '\n') {
            commentFlag = 0;
        }
        // 複数行コメント終了判断
        else if (commentFlag == -1) {
            
            // 複数行コメントが非コメント状態
            if (countFlag == 0) {
                commentFlag = 0;
            }
            // 複数行コメント継続状態
            else {
                countFlag--;
            }
        }

        // 非コメント状態又は読み取った文字の1個前が改行文字のいずれか
        if ((startFlag == 0 && commentFlag == 0) || backChar == '\n') {
            
            // 1個前の文字が改行文字だった場合
            if (backChar =='\n') {
                lineCnt++;
                
                if (sharp_flag == 1) {
                    sharpLines++;
                }
                
                if (brace_flag == 1) {
                    braceLines++;
                }
                // コメント又は空白行であれば
                if (spaceFlag == 0) {
                    nonRealCnt++;
                }
                
                spaceFlag = 0;
                sharp_flag = 0;
                brace_flag = 0;
            }
            // 1個前の文字が空白又はTAB文字文字以外の場合
            else if (!isspace(backChar)) {
                
                // 1個前の文字が括弧の場合
                if (backChar == '{' || backChar == '}') {
                    
                    if (brace_flag == 0) {
                        brace_flag = 1;
                    }
                }
                else {
                    brace_flag = 2;
                }
                
                spaceFlag = 1;
            }
            
            if (backChar == '#') {
                sharp_flag = 1;
            }
        }
        
        startFlag = 0;
        backChar = currentChar;
    }
    Print(filePath, lineCnt, nonRealCnt, sharpLines, braceLines);    
    // 最初の文字でなく
    if (startFlag == 0) {
        // 1個前の文字が改行文字の場合
//        if (backChar =='\n') {
            lineCnt++;
            //nonRealCnt++;
//    }    

        // 空白又はTAB状態の場合
        if (spaceFlag == 0) {
            nonRealCnt++;
        }
        
        if (sharp_flag == 1) {
            sharpLines++;
        }
        
        if (brace_flag == 1) {
            braceLines++;
        }
    }
    
    // 表示
    Print(filePath, lineCnt, nonRealCnt, sharpLines, braceLines);
    
    return 0;
}

あの段階で問題になったのはEOFのみの行をカウントしないようにするということでした。
上の赤いコメントにしたところが、その処理です。これくらいは、自分で考えられると思い
わざと、放っておきました。
次に問題になったのは、No44384のファイルでコメント行の数があわないという件です。
これは、
/*/ 
int g; 
*/ 
の場合が、チェックからもれていました。
/*の*が次の*/とダブって認識したのが原因です。
そこで、カウンタを設けて、1文字読み飛ばすようにしました。
これが、黄色文字の部分です。

なんで、最初の方法で最後まで頑張らないんだろ?
fgetcが複数の箇所に出てくるのは、好きじゃないなぁ。





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

Name: Mist  ..比類無きプログラマー(78,712ポイント)   Date: 2009/12/18(金) 11:48   No:44479     
Title: Re:ソースコードの行数    
> なんで、最初の方法で最後まで頑張らないんだろ? 
ここまでの流れを見ての私の感想。

デバッグが出来ていない(処理の途中経過を追えていない)ので微細な間違いが修正できない。

やり方自体に問題があるんだ!(この方法では無理)という結論になる。

違うやり方で解決しようとする。

大幅に修正する。

正しかったところまで動かなくなる。

気づいた範囲で修正してある程度までは動くけど、微細な間違いを修正できないから終わらない。

以下、エンドレス



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

Name: mii  ..中級者(10,182ポイント)   Date: 2009/12/18(金) 13:25   No:44483     
Title: Re:ソースコードの行数    
nonさんありがとうございます。

どうしてもわからないのですが、
else if (currentChar == '/' && backChar == '*' && cF==0) {
    commentFlag = -1;
    countFlag = 2;
}


のカウントフラグ = 2の部分ですが、どうして2にするのでしょう?
過去レス見たんですが、あの時はputcharで出力したくないとのことでしたが、
どういうことなんでしょうか?

上手く説明できずに困っています(泣


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

Name: non  ..比類無きプログラマー(84,427ポイント)   Date: 2009/12/18(金) 14:24   No:44486     
Title: Re:ソースコードの行数    
No43645の再掲です。

> では次に、/*〜*/のコメントです。
> 基本的な考え方は//と同じです・
> /*のとき cntOff = 2 にしましょう。

> */のとき cntOff=0 にすればよさそうですが、まだ*/の2文字を
> 出力したくないので、int count を用意して
> cntOff=-1にしておいて、
> count=2にします。

> cntOff=-1のとき
> count==0になったらcntOff=0にします。
> そうでなければ、countを減らします。

意味がわからないのなら、countFlag = 0;
でどう動作するのか試してみればいい。


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

Name: mii  ..中級者(10,249ポイント)   Date: 2009/12/18(金) 14:32   No:44488     
Title: Re:ソースコードの行数    
>意味がわからないのなら、countFlag = 0;
でどう動作するのか試してみればいい。

そうですよね(汗
なぜ気付かなかったんだろう。。。orz
早速やってみます!
ありがとうございます。


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

Name: mii  ..中級者(10,399ポイント)   Date: 2009/12/18(金) 15:00   No:44489     
Title: Re:ソースコードの行数    
後は1文字だけでEOF行だけの場合の処理になりました。
a[EOF]

この場合必ずspaceFlagが0なので、この行が空白行扱いになってしまいます。
これを回避するにはどうすればいいでしょうか?

文字の長さを取得して1行かつ1文字だったらという条件でやろうとしたのですが、
1文字が2バイト文字だと2文字扱いになるのでどうしようかと思いまして。


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

Name: mii  ..中級者(10,591ポイント)   Date: 2009/12/18(金) 16:30   No:44494 解決!     
Title: Re:ソースコードの行数    
"コンパイルが通る"という仕様を忘れておりました。
ということなので1文字等に関しては無視してOKとのことでした。

管理人さん、nonさん、たかぎさん、ドラさん、Mistさん
本当にありがとうございました。

特にnonさんにはかなりご迷惑をおかけして申し訳ありませんでした。

ここで質問者の回答が出来るくらいにCを勉強したいと思います。

また来るかもしれませんが、その際はよろしくお願いします。





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



Name: poi  ..ぴよぴよ(113ポイント)   Date: 2009/12/16(水) 13:14   No:44229       
Title: 無題    
配列ファイル(下は、任意の数字)

 12
      ←空白
 315
 2132 
 23

を読み込み、

 1 322
  2 113
    53
     2
  ↑
  空
  白

の転置行列(空白の行も、列に対応)をするプログラムは作成できるのでしょうか?



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


Name: sizuma  ..上級者(19,233ポイント)   Date: 2009/12/16(水) 13:24   No:44231     
Title: Re:無題    
できます。

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

Name: non  ..比類無きプログラマー(82,576ポイント)   Date: 2009/12/16(水) 15:01   No:44233     
Title: Re:無題    
ちょっとわからない。
>配列ファイル
って何ですか?このような文字列が、全角文字で入っているファイルと考えていいのでしょうか?
数値は必ず、1桁なのでしょうか?行列の大きさは?ファイルを読んで、自動で判断する?
で、それを、転置行列を求めて、求めた後はどうするのでしょうか?





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

Name: 初級者  ..初心者(7,220ポイント)   Date: 2009/12/16(水) 16:17   No:44244     
Title: Re:無題    
入力データが行列の形になっているように見えません。

何行何列の行列なのでしょうか?


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

Name: poi  ..ぴよぴよ(607ポイント)   Date: 2009/12/17(木) 14:09   No:44367     
Title: Re:無題    
>sizumaさん nonさん 初級者さん

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


5X5の行列のサイズで、

「r.txt」に下のような数字が入っています。
(数字は1桁で半角、数字は手入力、空白の行もあり)

 1 2
      ←空白
 3 1 5
 2 1 3 2 1
 2 3

上記のファイルを読み込み、下記の数字に転置して、「w.txt」に下記の数字を
書き込むことを行っていますが、上手く転置できない状態です。

 1   3 2 2
  2   1 1 3
      5 3
      2
        1
  ↑
  空
  白 

/****************ファイル読み込み********************/
    file=fopen("r.txt","r");
    for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            fscanf(file,"%d", &PixelData[i][j]);
        }
    }
    fclose(file);
/*******************ファイル書き込み****************/
    file=fopen("w.txt","w");
        for(j=0; j<PI_W; j++){
            for(i=1+j; i<PI_H; i++){
            buf=PixelData[i][j];
            PixelData[i][j]=PixelData[j][i];
            PixelData[j][i]=buf;
            if(PixelData[i][j]>0)fprintf(file,"%d ",PixelData[i][j]);
        }fprintf(file,"\n");
    }
    fclose(file);

を作成しr.txtの数字を入力しましたが、

123152132123
13
315
21321
23
11
11
2
と出力されました。


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

Name: Mist  ..比類無きプログラマー(78,074ポイント)   Date: 2009/12/17(木) 14:25   No:44368     
Title: Re:無題    
preタグ使用しないと半角空白、タブは削除されちゃうから見づらくて。
  1   3 2 2
   2   1 1 3
       5 3
       2
         1

/****************ファイル読み込み********************/
    file=fopen("r.txt","r");
    for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            fscanf(file,"%d", &PixelData[i][j]);
        }
    }
    fclose(file);
/*******************ファイル書き込み****************/
    file=fopen("w.txt","w");
        for(j=0; j<PI_W; j++){
            for(i=1+j; i<PI_H; i++){
            buf=PixelData[i][j];
            PixelData[i][j]=PixelData[j][i];
            PixelData[j][i]=buf;
            if(PixelData[i][j]>0)fprintf(file,"%d ",PixelData[i][j]);
        }fprintf(file,"\n");
    }
    fclose(file);



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

Name: バグ  ..ハッカー(180,071ポイント)   Date: 2009/12/17(木) 14:33   No:44369     
Title: Re:無題    
有効な値(r.txtファイルに書き込まれる値)が0の場合というのは有りうるのでしょうか?
文字のまま扱ってはいけないのでしょうか?
数値に置き換えなければいけないのでしょうか?


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

Name: Mist  ..比類無きプログラマー(78,618ポイント)   Date: 2009/12/17(木) 15:01   No:44371     
Title: Re:無題    
添付テキストのような条件だったら動くソース。
参考にしてください。
#include <stdio.h>
#include <string.h>

#define PI_H    5
#define PI_W    5

int main(void)
{
    FILE    *file;
    char    PixelData[PI_H][PI_W];
    int     read, i, j;
    char    buf;

    memset(PixelData, ' ', sizeof(PixelData));

/****************ファイル読み込み********************/

    file=fopen("r.txt","r");

    for(i=0; i < PI_H; i++){
        for(j=0; ; j++){
            read = fgetc(file);
            if (read == '\n' || read == EOF) {
                break;
            }

            if (j < PI_W) {
                PixelData[i][j] = (char)read;
            }
        }
    }
    fclose(file);

/*******************入れ替え****************/

    for(j=0; j<PI_W; j++){
        for(i=1+j; i<PI_H; i++){
            buf=PixelData[i][j];
            PixelData[i][j]=PixelData[j][i];
            PixelData[j][i]=buf;
       }
    }

/*******************ファイル書き込み****************/
    file=fopen("w.txt","w");
    for(i=0; i<PI_H; i++){
        for(j=0; j<PI_W; j++){
            fprintf(file, "%c", PixelData[i][j]);
        }
        fprintf(file, "\n");
    }

    fclose(file);

    return 0;
}


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

Name: たいちう  ..熟練のプログラマー(40,256ポイント)   Date: 2009/12/17(木) 15:11   No:44372     
Title: Re:無題    
ファイル書き込みの前に、

for(i=0; i<PI_H; i++){
    for(j=0; j<PI_W; j++){
        printf("%d ", PixelData[i][j]);
    }
    printf("\n");
}


と追加してみれば、読み込みに失敗していることは明らか。
fgetsとsscanfを使うのが定石でしょう。例を探してみてください。


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

Name: バグ  ..ハッカー(180,157ポイント)   Date: 2009/12/17(木) 15:29   No:44373     
Title: Re:無題    
fgetsとsscanfでは空白の後に数字があった場合に変換できないのでは?
Mistさんの取られたfgetcで一文字ずつチェックするしかないと思います。


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

Name: たかぎ [URL]  ..ハッカー(140,179ポイント)   Date: 2009/12/17(木) 17:48   No:44401     
Title: Re:無題    
> fgetsとsscanfでは空白の後に数字があった場合に変換できないのでは? 

やってやれないことはありませんね。


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

Name: バグ  ..ハッカー(180,418ポイント)   Date: 2009/12/17(木) 17:51   No:44403     
Title: Re:無題    
>>たかぎさん
え?空白箇所を無効な値として判断できますか?(^_^;)
どうやるんでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(140,144ポイント)   Date: 2009/12/17(木) 18:12   No:44406     
Title: Re:無題    
極端な話、sscanf(str, "%c", &c) で1文字ずつ処理すればよいのです。
実際には、"%[^ ]"とか、もっと気の利いた書式も使えると思います。


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

Name: poi  ..ぴよぴよ(541ポイント)   Date: 2009/12/18(金) 13:52   No:44485 解決!     
Title: Re:無題    
>Mistさん バグさん たかぎさん たいちうさん

みなさんのおかげで、先ほどプログラムが完成しました。


まことにありがとうございます。


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



Name: ti  ..かけだし(1,251ポイント)   Date: 2009/12/18(金) 00:50   No:44451       
Title: ゲームでのグラフィックの描画について    
RPGでの街中にイベントNPCグラフィックを追加したいのですがどうすればいいか教えてください

今現在
・街用bmp(サイズ1800,1800くらい)を
DrawRectGraph( 0, 0, chdata.x, chdata.y, 640, 640, image, TRUE, FALSE ) ;
を使って表示位置を移動しながら表示しています

十字キーでchdata.x chdata.yの値を+-しながらキャラが移動するように作っています

街用bmpを640.640で表示しているのですが表示しているところ表示していないところに透過処理したキャラクターグラフィックを追加したい場合どうすればいいですか?



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


Name: kazuoni [URL]  ..ハッカー(119,205ポイント)   Date: 2009/12/18(金) 02:02   No:44454     
Title: Re:ゲームでのグラフィックの描画について    
NPCもメインキャラと同じように座標を持たせてやります。
毎ループメインキャラとNPCの距離を比較し、
キャラからみた画面フィールドにNPCが入り込むならばDrawすれば一応事が足りそうです。
(NPCが画面外ならば、描写はしない)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,116,573ポイント)   Date: 2009/12/18(金) 07:42   No:44467     
Title: Re:ゲームでのグラフィックの描画について    
町の座標にキャラの座標を使うと混乱してしまうのでは?
入ってる値が同じであっても、町は町で変数を別に用意するとかして分けるといいかも知れません。
そうすればキャラ、町、NPCが見てすぐに解り、管理もしやすいのではないでしょうか。
考え方はkazuoniさんが言っていらっしゃるように、NPCにもそれぞれ座標を持たせて、
町の座標情報から引き算するなどして描画位置を求めればいいと思います。


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

Name: ti   Date: 2009/12/22(火) 20:51   No:444511261482663 解決!     
Title: Re:ゲームでのグラフィックの描画について    
がんばってなんとか作成してみます
また何かあったらアドバイスのほうよろしくお願いします
レスのほう遅れて申し訳ありません




Name: ぜるだ  ..ぴよぴよ(562ポイント)   Date: 2009/12/16(水) 17:06   No:44253       
Title: コード    
#include "DxLib.h"
 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
 
        //ココ!! 
 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

//ココ!!の部分にコードを入力するんですが、いまいち意味がわかりません
どうゆう意味か解説してもらえませんか?


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


Name: たかぎ [URL]  ..ハッカー(137,728ポイント)   Date: 2009/12/16(水) 17:11   No:44255     
Title: Re:コード    
こういうことでしょうか?

#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない






ScreenFlip();
}

DxLib_End();
return 0;
}


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

Name: softya  ..熟練のプログラマー(67,740ポイント)   Date: 2009/12/16(水) 17:12   No:44256     
Title: Re:コード    
これ龍神録の3章のコードですよね?
何を聞きたいのか分かりません。
もう少し具体的に質問してください。


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

Name: Dixq (管理人)  ..ウィザード(1,111,940ポイント)   Date: 2009/12/16(水) 17:34   No:44259     
Title: Re:コード    
携帯なので、よく読んでませんが、
ゲームプログラミングの館の「毎回書くプログラムの骨格」でしょうか?
龍神録にもありましたかね。

ゲームプログラミングの館をご覧になっているなら、
その章までに出て来たこと書けばいいのですが、何がわかりませんか?


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

Name: ぜるだ  ..ぴよぴよ(600ポイント)   Date: 2009/12/16(水) 17:38   No:44261     
Title: Re:コード    
要するにhttp://dixq.net/g/43.htmlさんで
//ココ!!の自分の好きなコードに書き換えてください。
ということでコードとはどうゆうものなのかが分かりません


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

Name: softya  ..熟練のプログラマー(67,749ポイント)   Date: 2009/12/16(水) 17:41   No:44262     
Title: Re:コード    
>ということでコードとはどうゆうものなのかが分かりません
この場合はソースコード=プログラムの事です。


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

Name: たかぎ [URL]  ..ハッカー(137,810ポイント)   Date: 2009/12/16(水) 17:41   No:44263     
Title: Re:コード    
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89
http://e-words.jp/w/E382BDE383BCE382B9E382B3E383BCE38389.html
http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9


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

Name: ぜるだ  ..ぴよぴよ(631ポイント)   Date: 2009/12/16(水) 17:45   No:44264     
Title: Re:コード    
http://dixq.net/rp/2.htmlのやり方で
//ココにはたとえばどんなものを入力すればよろしいですか?


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

Name: バグ  ..ハッカー(180,009ポイント)   Date: 2009/12/16(水) 17:48   No:44266     
Title: Re:コード    
自分のしたい処理を書けばよいと思いますよ。
どんなことをやりたいのでしょうか?

グラフィックを表示したいとか、音楽を再生したいとか、キー入力に応じた何かをしたいとか…


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

Name: ぜるだ  ..ぴよぴよ(679ポイント)   Date: 2009/12/16(水) 17:51   No:44267     
Title: Re:コード    
音楽を再生したいです

僕のC言語のれべるは今日から勉強しているので
知識はないといってもOKなれべるで
年齢12です


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

Name: softya  ..熟練のプログラマー(67,875ポイント)   Date: 2009/12/16(水) 17:55   No:44269     
Title: Re:コード    
>音楽を再生したいです
>僕のC言語のれべるは今日から勉強しているので
>知識はないといってもOKなれべるで
>年齢12です


最低限の事がわからないと何も出来ませんので、まずC言語の基本文法を勉強してください。
C言語の入門書籍を買うのが良いと思います。数千円しますが書籍の購入は可能ですか?


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

Name: Dixq (管理人)  ..ウィザード(1,112,118ポイント)   Date: 2009/12/16(水) 18:20   No:44276     
Title: Re:コード    
C言語歴1ヶ月でも解りますとは言っていますが、
0日では出来ないです‥。

まずはCを勉強しましょう。
もしかしたらコンパイラの導入すらまだではないでしょうか?
コンパイラの準備は出来ていますか?

小学生となると、ドキュメントを読むのも難しい場面があるかもしれません。
確かC言語で絵本のようなものもあったと思います。
まずはそのような敷居の低い物を親の人に買ってもらってはどうですか?


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

Name: ぜるだ  ..ぴよぴよ(748ポイント)   Date: 2009/12/16(水) 18:27   No:44281     
Title: Re:コード    
>最低限の事がわからないと何も出来ませんので、まずC言語の基本文法を勉強してください。
>C言語の入門書籍を買うのが良いと思います。数千円しますが書籍の購入は可能ですか?
可能です


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

Name: ぜるだ  ..ぴよぴよ(903ポイント)   Date: 2009/12/16(水) 18:28   No:44283     
Title: Re:コード    
>C言語歴1ヶ月でも解りますとは言っていますが、
>0日では出来ないです‥。

>まずはCを勉強しましょう。
>もしかしたらコンパイラの導入すらまだではないでしょうか?
>コンパイラの準備は出来ていますか?

>小学生となると、ドキュメントを読むのも難しい場面があるかもしれません。
>確かC言語で絵本のようなものもあったと思います。
>まずはそのような敷居の低い物を親の人に買ってもらってはどうですか?
そうしてみます


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

Name: softya  ..熟練のプログラマー(69,025ポイント)   Date: 2009/12/16(水) 18:31   No:44285     
Title: Re:コード    
>確かC言語で絵本のようなものもあったと思います。 

「Cの絵本」の事でしょうか?
あれは、あくまで補助の本ですのでこれだけで勉強するのはちょっと・・・。
それに小〜中学生対象に書いてあるわけでもありません。

良さそうな本を探してみますので、ちょっと待ってください。


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

Name: softya  ..熟練のプログラマー(69,188ポイント)   Date: 2009/12/16(水) 18:55   No:44288     
Title: Re:コード    
どれを推薦しようか悩んでます。
みなさんの意見をお聞かせください。

「これからはじめるC言語の本」
http://www.amazon.co.jp/dp/4774131857/
とか
「これならわかるC 入門の入門」
http://www.amazon.co.jp/dp/4798108472/
なんかどうでしょうか?

それとも
「C言語改訂版1 はじめてのプログラミング (CD-ROM付) 」
http://www.amazon.co.jp/dp/4798118060/
「C言語改訂版2 はじめて学ぶCの仕組み (CD-ROM付)」
http://www.amazon.co.jp/dp/4798118079/
を推薦した方が良いんでしょうか?

「14歳からはじめる C言語わくわくゲームプログラミング教室
Visual Studio 2008編」
http://www.amazon.co.jp/dp/4899772173
はC言語の入門書として危険すぎますよね?




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

Name: たかぎ [URL]  ..ハッカー(138,008ポイント)   Date: 2009/12/16(水) 19:04   No:44290     
Title: Re:コード    
普通の入門書でよいと思いますよ。
子供向けにと思ってレベルを下げても、結局はそれだけでは何もできずに、もっと専門性の高い本に手をだすしかなくなります。
それなら、はじめから1冊で十分な知識が身につく本を選ぶ方が得策です。
小中学生にとっては、何冊も書籍を買い揃えることの方が困難でしょうから。

C言語と並行して、国語と数学と英語を勉強することをおすすめします。
これは、学校の教科書や参考書で十分ですが、上の学年のものまで手をだす必要があります。
参考書なら、ご両親にも買ってもらいやすいでしょうし、学校の図書室や図書館で借りてもよいと思います。
(できれば、ゆとり世代以前の参考書の方がよいかも)


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

Name: softya  ..熟練のプログラマー(69,382ポイント)   Date: 2009/12/16(水) 21:28   No:44309     
Title: Re:コード    
では、とりあえず定番を。
「新版 明解C言語 入門編」
http://www.amazon.co.jp/dp/4797327928/
読めない漢字などがあれば、漢和辞典片手にがんってください。
大きな本屋で今まで出てきた本を一度眺めてから決めるのが一番良いと思います。
「新版 明解C言語 入門編」が余りにもツラそうに感じたら、上にあげた本の中から頑張れそうな本を探してみてくださいね。

ただし、「14歳からはじめる C言語わくわくゲームプログラミング教室 Visual Studio 2008編」 
はC言語の説明が不十分なのでもし買うなら、お金は掛かりますがちゃんとした本も一緒に買ってください。


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

Name: たかぎ [URL]  ..ハッカー(138,560ポイント)   Date: 2009/12/16(水) 21:39   No:44310     
Title: Re:コード    
「新版 明解C言語 入門編」 は私もおすすめです。
最近の書籍は、難しい漢字は極力「開く」傾向にあります。「開く」というのは業界用語でひらがなにすることです。
# その割には、拙著の執筆時に「繋ぐ」を開かせてくれなかったのですが...

ですので、12歳でもそれほど難しくはないと思います。
仮に読んでも理解できないようなら、学校の勉強をもっとがんばったほうがよいと思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,113,826ポイント)   Date: 2009/12/16(水) 22:54   No:44318     
Title: Re:コード    
ぜるださん、名前は一つに決めてください。
同じ名前でいつも投稿するようにして下さい。

で、本ですが、明解C言語はやはり定番ですね。
私も入門時にこれを買いました。

ん〜ただ小学生がどの程度の本を読めるのかよく解らないので何とも言えませんが・・。
入門書としては定番です。解りやすいです。

一番いいのは大きな書店に行って自分が読めそうな本を探すことです。
どこか近くに大きな書店がありますか?もしあれば行って端から読んでみてはどうでしょう?


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

Name: たかぎ [URL]  ..ハッカー(138,691ポイント)   Date: 2009/12/16(水) 22:57   No:44319     
Title: Re:コード    
> ん〜ただ小学生がどの程度の本を読めるのかよく解らないので何とも言えませんが・・。 

今度の日曜日にでも、うちの娘に「新版 明解C言語 入門編」を読ませてみます(忘れていなければ...)。
興味がないと難しいとは思いますが...


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,113,936ポイント)   Date: 2009/12/16(水) 22:59   No:44321     
Title: Re:コード    
>たかぎさん

おぉ、これは貴重な情報!

(・・・・・何が貴重かってたかぎさんに娘s・(ry

よろしくお願いします^^


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

Name: たかぎ [URL]  ..ハッカー(139,824ポイント)   Date: 2009/12/17(木) 17:06   No:44388     
Title: Re:コード    
先ほど少し読ませてみましたが、チンプンカンプンなようです。
書籍が難しいというより、基礎学力が不足しすぎています。

例えば、「整数」の意味がわかりません。
負の数を習うのは中学校ですので、小学生には最初のところでつまずいてしまいます。
漢字については、4年生でもそれほど問題はなさそうでした。


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

Name: softya  ..比類無きプログラマー(70,031ポイント)   Date: 2009/12/17(木) 17:29   No:44397     
Title: Re:コード    
ぜるださんが、公文式とかやっていれば数学が中学レベルまで進んでいる可能性もあるんですが、ご本人が登場しないのでなんとも言えませんね。

いっそのことHSP言語の
「12歳からはじめるHSPわくわくゲームプログラミング教室 Windows 95/98/2000/Me/XP対応」
http://www.amazon.co.jp/dp/4899770782
を推薦したほうが良いんでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(140,166ポイント)   Date: 2009/12/17(木) 17:37   No:44399     
Title: Re:コード    
> ぜるださんが、公文式とかやっていれば数学が中学レベルまで進んでいる可能性もあるんですが、ご本人が登場しないのでなんとも言えませんね。 

うちの娘は公文式をやっていますが、処理が遅いのでいまだに学年相応のところまで到達していません。

> いっそのことHSP言語の 
> 「12歳からはじめるHSPわくわくゲームプログラミング教室 Windows 95/98/2000/Me/XP対応」 
http://www.amazon.co.jp/dp/4899770782 
> を推薦したほうが良いんでしょうか?

何を推薦しても、基礎学力が不足しているとどうすることもできませんので、まずは学校の勉強+αを頑張った方がよい気がします。
簡易的にプログラミングの気分を味わうことならできますし、機会があるならぜひやるべきですので、そのつもりなら改めて質問してもらった方がよいでしょうね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,115,155ポイント)   Date: 2009/12/18(金) 00:15   No:44448     
Title: Re:コード    
>たかぎさん

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

なるほど、実はあれから、うちの両親にも少し聞いてみました。
(両親はどちらも小学校の教員)
漢字が読めたら解るというものでもないようですね。
解らない言葉がいくつか出てくるともう嫌になってしまうことが多いようで、
よほどに興味がないと自分で調べたり耐え忍んで読み進めたりという事は難しいようです。

今後の参考にさせて頂きます。ありがとうございます。




・・ということで、質問者さんはいらっしゃらないんでしょうか^^;


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



Name: ERK。  ..ぴよぴよ(218ポイント)   Date: 2009/12/17(木) 16:09   No:44374       
Title: たすけてください!    
学校の課題で出たんですが、全くサッパリわかりません…

〜問題〜
キーボードから元金、返済回数(月数)、利率(年利)を入力し、元金均等払いの1回から指定回数までの支払額、利息、残高を以下のように表示せよ。

元金?100000
回数?10
利率(%)?3
回数 支払額 利息  残高
 1  10250  250 90000
 2  10225  225 80000
 3  10200  200 70000
 4  10175  175 60000
 5  10150  150 50000
 6  10125  125 40000
 7  10100  100 30000
 8  10075   75 20000
 9  10050   50 10000
 10  10025   25   0
合計 101375 1375


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


Name: たかぎ [URL]  ..ハッカー(139,273ポイント)   Date: 2009/12/17(木) 16:16   No:44375     
Title: Re:たすけてください!    
> キーボードから元金、返済回数(月数)、利率(年利)を入力し

キーボードから入力するための一般的な方法はありません。
そもそも、対象としたハードウェアにキーボードが存在することは期待してもよいのでしょうか?
入力には、I/Oポートを直接制御するのでしょうか?
あるいは、(あるのかないのか、あったとしても何か知りませんが)OSの助けを借りられるのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(139,369ポイント)   Date: 2009/12/17(木) 16:19   No:44376     
Title: Re:たすけてください!    
もうひとつついでに...

> 以下のように表示せよ。

表示するための一般的な方法はありません。
対象としているハードウェアには、表示デバイスが存在することを期待してもよいのでしょうか?
表示には、VRAMに直接書きこむとか、LCDのセグメントを直接制御するとか、その他、I/Oを直接制御する必要があるのでしょうか?
あるいは、(あるのかないのか、あったとしても何か知りませんが)OSの助けを借りられるのでしょうか? 


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

Name: バグ  ..ハッカー(180,100ポイント)   Date: 2009/12/17(木) 16:19   No:44377     
Title: Re:たすけてください!    
えっと、この課題の何が分かりませんか?

1:キーボードからの値の入力

2:支払額、利息、残高の計算

3:結果の表示


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

Name: ERK。  ..ぴよぴよ(671ポイント)   Date: 2009/12/17(木) 16:29   No:44378     
Title: Re:たすけてください!    
前のスレに

#include <stdio.h>
#include <math.h>

int main(void)
{
    int    gankin, kaisuu, pay, pri_bal, total = 0, odd, i;
    double riritsu;
    
    scanf("%d %d %lf", &gankin, &kaisuu, &riritsu);
    printf("\n元金 %d, 回数 %d, 利率 %.3f\n\n", gankin, kaisuu, riritsu);
    riritsu /= 12;
    odd = gankin % kaisuu;
    pri_bal = gankin;
    puts("回数     支払額  利息       残高");
    for(i = 1; i <= kaisuu; i ++){
        pay = (int)floor(gankin / kaisuu + pri_bal * riritsu + (odd > 0) + 0.5);
        printf("%4d %10d %5d %10d\n",
                i,
                pay,
                (int)floor(pri_bal * riritsu + 0.5),
                pri_bal - gankin / kaisuu - (odd > 0));
        total += pay;
        pri_bal -= gankin / kaisuu + (odd -- > 0);
    }
    printf("\n合計     %d\n", total);
    return 0;
}


というのがあり、参考にさせていただいたのですが、
これだと3%の利率を入力した場合3ではなく0.03と入力しなければならず、
また入力する際の元金?回数?利率(%)?という文字が出ません。

この2点を変えるにはどうすればいいですか?


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

Name: softya  ..熟練のプログラマー(69,804ポイント)   Date: 2009/12/17(木) 16:33   No:44379     
Title: Re:たすけてください!    
お助けしたいのですが、今の質問内容では詳しいことが分からず回答が困難です。
「規約と注意事項」にある「よくわからない人はテンプレを」にあるテンプレートを使って詳細を教えてください。そうすればスムーズに回答を行えますので。
http://dixq.net/board/board.html
それと規約の「宿題の質問はOK!でも丸投げは×」に該当すると思いますので、勉強方法のアドバイスをすると言うことでよろしいですか?


たかぎさんが聞いているのは、コンソールで動くのか、それともまったく別の入出力なのかと言うことです。ERK。さんが一般的に使っているキーボードからの入力と表示を方法を例を挙げて説明してください。


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

Name: たかぎ [URL]  ..ハッカー(139,426ポイント)   Date: 2009/12/17(木) 16:33   No:44380     
Title: Re:たすけてください!    
規約も守らず、回答も読んでいただけないようですので、一応これだけ貼っておきます。




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

Name: バグ  ..ハッカー(180,241ポイント)   Date: 2009/12/17(木) 16:36   No:44381     
Title: Re:たすけてください!    
>>これだと3%の利率を入力した場合3ではなく0.03と入力しなければならず

上記のソースではdouble型という浮動小数型変数で入力を受け付けていますから、いったんint型などの整数型の変数で入力を受け付けておいて、キャストしてやればいいかと思います。

int a = 0;
double b = 0.0;
scanf("%d", a);
b = (double)a;


こんな感じでしょうか?


>>入力する際の元金?回数?利率(%)?という文字が出ません。 

これは表示してから入力を受け付ければOKです。


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

Name: たかぎ [URL]  ..ハッカー(139,572ポイント)   Date: 2009/12/17(木) 16:36   No:44382     
Title: Re:たすけてください!    
softyaさんとかぶったので、こちらも貼っておきます。

回答者様用テンプレート

● 対 宿題の丸投げ用 ●

 ・ 自分はどこまで理解しているのか、学校ではどこまで習ったのか明確にしましょう
 ・ 自分で書いたソースプログラムがあるなら提示しましょう
 ・ (提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい
 ・ ソースコードは< pre>と< /pre>のタグで囲んでください
 詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html


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

Name: バグ  ..ハッカー(180,279ポイント)   Date: 2009/12/17(木) 16:38   No:44383     
Title: Re:たすけてください!    
失礼、前述のコードに修正です…

int a = 0;
double b = 0.0;
scanf("%d", a);
b = (double)(a) / 100.0;


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

Name: やそ  ..比類無きプログラマー(99,250ポイント)   Date: 2009/12/17(木) 16:45   No:44385     
Title: Re:たすけてください!    
現在規約遵守推進期間(無期限)となっております(笑)

 
printf("元金 "); 
scanf("%d", &gankin);
のようにすれば入力時に項目の表示ができると思いますよ。
利率もint型の変数で入力して、必要なときにfloatなどに代入してやればいいだけでは?



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

Name: たかぎ [URL]  ..ハッカー(139,670ポイント)   Date: 2009/12/17(木) 16:51   No:44386     
Title: Re:たすけてください!    
2.5%とかの金利はないのでしょうか?
通貨単位が円とは書かれていませんので、例えば米ドルであれば100分の1まで計算対象にする必要があります。
また、お金の計算に浮動小数点数を使うべきではないのは基本ですね。


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

Name: バグ  ..ハッカー(180,324ポイント)   Date: 2009/12/17(木) 17:01   No:44387     
Title: Re:たすけてください!    
>>たかぎさん
なるほど。
最初からdouble型変数に入力値を受けておいて、計算する際に100分の1にして計算するほうがスマートですね。


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

Name: たかぎ [URL]  ..ハッカー(139,849ポイント)   Date: 2009/12/17(木) 17:10   No:44389     
Title: Re:たすけてください!    
> 最初からdouble型変数に入力値を受けておいて、計算する際に100分の1にして計算するほうがスマートですね。

それだと誤差が出ます。
自分で文字列を解析して、100倍した整数に変換する必要があります。


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

Name: softya  ..熟練のプログラマー(69,891ポイント)   Date: 2009/12/17(木) 17:11   No:44390     
Title: Re:たすけてください!    
>>たかぎさん 
そうですね。
金融業界ならBCDとかCOBOLで言うところのPACKED-DECIMALが基本ですよね。
浮動小数点は誤差が付きまといますので使うのは危険ですね。
C言語の標準規格に無いのが問題ですが(^^ゞ


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

Name: バグ  ..ハッカー(180,363ポイント)   Date: 2009/12/17(木) 17:13   No:44391     
Title: Re:たすけてください!    
スレ主さんがそこまで厳密な値が必要かどうかはさておき…
そうですね、誤差を気にするならばそこまでやるべきでしょうね。


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

Name: たかぎ [URL]  ..ハッカー(140,002ポイント)   Date: 2009/12/17(木) 17:20   No:44393     
Title: Re:たすけてください!    
100倍した整数を使う場合、int型を使うと、(処理系不明なので)327.67までしか表現できません。
これでは(円の場合)子供の小遣いにも満たない金額です。韓国ウォンなら...
long型を使っても、約2147万程度しか表現できませんので、円であれば住宅ローンの計算を行うことすらできなくなります。
long long型を使えば、国債の計算でもできるかと思います。
ただし、処理系不明なのでlong long型が使えるかどうかわかりません。
多倍長演算を視野に入れる必要があるかもしれませんね。


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

Name: たかぎ [URL]  ..ハッカー(140,030ポイント)   Date: 2009/12/17(木) 17:22   No:44394     
Title: Re:たすけてください!    
> スレ主さんがそこまで厳密な値が必要かどうかはさておき… 

それは、質問者さんが前提条件を提示してくれない限り、勝手に設定することはできませんね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,114,119ポイント)   Date: 2009/12/17(木) 23:48   No:44440     
Title: Re:たすけてください!    
>やそさん

思わず笑いましたw


>ERKさん

最近、説明不足でどう答えていいかわからない投稿が多く、
回答者の皆さんでどうしたらいいですかねって話していたところだったんですね。

質問して頂くとき、質問者さんが何に困ってて、何で作ってて、質問者さんのスキルがどれ位なのかが解らないと
答えようが無い場合が多いんです。
どう答えていいか解らない時は一度規約を読んで頂ければと思います。

さて、最初の質問としては、文字の表示の仕方が解らないということでしょうか?
Cの基本はわかっていらっしゃいますか?

hello world

と画面に表示させるプログラムならかけますか?


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



Name: 光翼型近接支援残酷超初心者  ..かけだし(1,358ポイント)   Date: 2009/12/14(月) 15:45   No:44021       
Title: STG製作者(特に管理人さん)様に質問    
こんにちわ。

自分で描いた「一枚絵の自機で」龍神録のプログラムをコピペしながら一章一章をたまに改造しながらやっていたのですが、C言語超初心者の自分には改造すら困難な道だったようで、何度もつまずいたりしてます(自機の動きが変だったり、敵が表示されなかったり)。

このままつまずきながらも、なんとかやっていくのも良いのかもしれませんが、やはり効率やら何やらが悪いと思ってます。

そこで後学のタメに、自分も龍神録の素材のような分割されてる自機・敵機・弾、それにボード等の絵を作りたいと思っているのですが、色々ググってみても有効と思えるようなページは見つかりませんでした。

で、質問なのですが、
「STGを製作されてる皆様が参考にしているサイト」を教えて頂きたいのです。

特に「●●(ソフト名)でSTGの自機等を作る」のような、わかりやすいのがあると嬉しいです。
無理かもしれませんが過去ログがあれば、そちらだけでも結構です。

管理人さんを名指しさせてもらっているのは、やはり龍神録を改造するという事なので、基になっている物を創られた方に聞くのが一番かなと思った故です。


どうかお願いします。


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


Name: バグ  ..ハッカー(179,926ポイント)   Date: 2009/12/14(月) 15:53   No:44022     
Title: Re:STG製作者(特に管理人さん)様に質問    
>>このままつまずきながらも、なんとかやっていくも良いのかもしれませんが…

実はこれが一番の近道なんですけどねぇ…(^_^;)


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

Name: dic  ..熟練のプログラマー(40,923ポイント)   Date: 2009/12/14(月) 16:31   No:44024     
Title: Re:STG製作者(特に管理人さん)様に質問    
C言語をきちんと理解していれば
改造までできるレベルと私は勝手に想像するんですけどね


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

Name: チルチル  ..比類無きプログラマー(83,741ポイント)   Date: 2009/12/14(月) 16:32   No:44025     
Title: Re:STG製作者(特に管理人さん)様に質問    
サイトは良く知らないんですが管理人さんを名指しで過去ログでも良いとの事なので
前に管理人さんに聞いた興味深い情報を・・

背景の素材などは写真とかの上にレイヤーを作って上からなぞると綺麗に描けるようです

実際に龍神録の桜の画像などは写真を上からなぞって描いたそうですし
とりあえず既存の素材を上からなぞってみれば上達するんじゃないでしょうか
特にドット絵などは元々ドットですから何回かやれば1から作れるようになるかもしれません


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,108,789ポイント)   Date: 2009/12/14(月) 21:58   No:44038     
Title: Re:STG製作者(特に管理人さん)様に質問    
質問は「ドット絵の描き方」ということでいいのでしょうか?

せっかく名指しして頂いていますが、ドット絵は私も描けないのでアドバイスのしようがありません。。
頑張って書いてあの程度なので
BEMANIさんとか絵のうまい人にお聞きになった方がいいかも・・。

ドット絵って普通の絵とまた違ったスキルがいりますもんね。
私は大きな画像を小さくして書いているので、ドット絵ではないです。
ドットは何度も挑戦しましたが、無理でした;
いや大きな画像もかけないのですが。

「どうにも、自分じゃかけない!でもSTGの素材屋さんなんて、探してもどこにもない!なら作るしかない!」
ということで半泣きになりながら書きました。
絵がうまいからスイスイなんてまずありえないです。。
龍神録作った時間の1/3は素材作っていたといっても過言ではないです。。。
絵は人一倍苦手なのですが時間でカバーするように頑張りました。
(下手でも時間をかけたらそれなりになると信じて・・

私はどーにも絵心がないので、なんとかならないかと考えたあげく、
チルチルさんの仰るように、レイヤーの下に写真を置いて、その上からトレースするように作りました。

STGを作るにあたって参考にしたサイトはありません。
強いて言えば昔みたDXライブラリのサンプルプログラムか、
ゲームシステムは東方そのものです(といいつつこれが一番大きいですが)

絵の勉強はプログラムとは関係ないですし、
それ一つで十分デザイナ関係の専門にまで突き詰められる分野ですから、
本当に作りたいなら本とか買ってガっつり勉強した方がいいかもしれませんね。


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

Name: DVDM [URL]  ..初心者(7,455ポイント)   Date: 2009/12/15(火) 03:52   No:44070     
Title: Re:STG製作者(特に管理人さん)様に質問    
なんか名前が見えたので、コメントしておいた方がよいのでしょうか。


>>光翼型近接支援残酷超初心者さん
管理人さんは絵心がないから・・・と仰ってますが正直そういうのはそこまで関係ないと思ってます。
なんでもそうだと思いますが練習しないとうまくなれませんので、
やはり地道にやるしかないのではないでしょうか。
バグさんが仰る通り、それが一番の近道だと思います。

と言っても何もわからないと思いますので、以下の文はあくまで私個人の意見として捉えて頂きたいです。
みながみな、そうではないと思いますので・・・。


どのような絵を描くのか・描きたいのかで練習するべき場所が変わってくると思います。
キャラクターを描きたいのか、背景を描きたいのか、明るい感じなのか、メタリックな感じなのか・・・
絵にも沢山のスタイルが存在します。
キャラクターも背景もなんでもこなすぜ! という意気込みであれば結構練習量がいるかと思います。
一部分だけ自分でやって、あとは素材を使ってみようでも全然いいと思います。
さらに言うなら、素材と素材を組み合わせて新しいものを作る加工専門で行ってもいいかもしれません。

何がしたいのかが決まってくればネットでの検索がかけやすくなるはずです。
例えば、背景が作りたいなら「背景 CG」みたいに検索をかければ大体講座が存在します。
さらに、使うソフトが決まっているのであればそれも検索条件に入れることができますね。
まずはその辺りを明確にしてみましょう。


私はPhotoShopユーザーなので無料でお勧めされているGIMPやEdge、Pixiaというツールが使えないので
ソフトに関するアドバイスは出来ないですが、正直「慣れればペイントでも描ける」です。
使いにくいというのであれば、そう思わないようにずっと使っていけば次第に機能も把握出来るでしょうし、
やることが増えていくので素材の加工や制作はスムーズになってくるはずです。

ただ、画像を加工するのであれば「レイヤー」と呼ばれる機能を扱えるソフトがお勧めです。
レイヤーというのは透明な紙に例えば顔を描き、もう一枚別の透明な紙に体を描き、
さらにもう一枚の透明な紙に背景を描いたとして、それを重ねると一枚の絵に見えるという仕組みです。
しかし、紙自体は別々なので一枚の絵として扱うよりは非常に便利だと思います。
(最初は何がどう便利なのかわからないと思いますが;)


少しくらいのお金を出してもいいというのであれば、SAI辺りをお勧めしておきます。(5000円です)
とても安い上に、結構なユーザー数が使っているソフトでもあります。
お勧めしておいてなんですが、私はSAIを使いません(笑)


光翼型近接支援残酷超初心者さんはお気に入りのゲームありますか?
もしあるなら、そのゲームで使われている画像をいつも以上に意識して見てあげてください。
宝探しが出来るかも知れないくらい素材の宝庫です(笑)
気に入った画像があれば、それを見ながら描いていくだけで絵はうまくなっていきます。


何年か前にはゲームを作るプログラミング力がなく、とりあえず絵だけは描いておこうと思い、
きたるべきに備え、ゲームの素材作りとかやってHPで公開してみたいなぁ〜と思ってたのですが
いかんせん、素材を作るだけの画力がなかったので断念しました。
需要あるんですかね・・・。





>>管理人さん
改めまして、BEMANIことDVDMです。
季節的にそちらは大変そうですね〜〜
夏に半袖で過ごせないくらい寒かったので、今の時期は想像しただけで鳥肌立ちそうです(笑)

そういえば名前が変わったことを管理人さんに言ってなかった気がします;
申し訳ございませんでした;


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,109,048ポイント)   Date: 2009/12/15(火) 07:48   No:44076     
Title: Re:STG製作者(特に管理人さん)様に質問    
>>DVDMさん

寒いっすよ・・。マジで・・。mixiでご覧になったかもしれませんが、
詳しくはブログ参照でw

名前の件了解です。ポイントうつしときますね^^


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

Name: 光翼型近接支援残酷超初心者  ..かけだし(2,054ポイント)   Date: 2009/12/15(火) 12:21   No:44080     
Title: Re:STG製作者(特に管理人さん)様に質問    
(ちょっと訂正あり)

心よりのご回答、皆さんありがとうございます。


あの、大変申し上げにくいのですが、実は質問内容にとても重大な誤字があるんです。

本当の質問は「STGを製作されてる皆様が『自機等の画像を描く際に』参考にしているサイト」だったのです。

だったのですが、書いたつもりが思いっきり誤字ってました。本当にすみません。


つまり何が言いたいのかというと、勝手に添付させてもらった、上の龍神録の素材のようなものを作りたいのです。


もちろん、皆さんの興味深い話を多く聞けて、とても参考になりました。

ですが、今一度、質問にご回答を頂けないでしょうか? 

もちろん「何様テメエ」と思って回答される気をなくされたのなら、離れて下さっても構いません。

なかったら、「んなもんなかった」の一言でも結構です。

今一度お願いします。



以下、変身をば。

>>バグさん
>>dicさん

お二人とも仰る通りなのですが、やはりああ言う自機の画像の描き方を知っておきたいのです。
もちろんCをちゃんと理解していればこのような事にはならないんですけどね……。


>>チルチルさん
>>DVDMさん

僕はPixiaを使っているのですが、イマイチ使い方が分かってなくて、色塗りぐらいしかできてないんです。
なるほど、レイヤですか。そちらもあまり分かってないのですが、特に写真を使って、なんて、いろいろ活用法がありそう楽しいですね。

DVDMさんも、レイヤの話だけでなく、とても参考になる話をありがとうございます。
PhotoShop欲しいんですけどね。昔、東方キャラで遊戯王カード作ったりするのに体験版を使った事があるので、PhotoShopの使い易さがよくわかります。


>>管理人さん

やはりドット絵は難しいんですね。ドット絵の作り方をいろいろググったのですが、Pixiaも使いこなせてない自分には無茶っぽいです。

>大きな画像を小さくして書いているので、ドット絵ではないです
そうだったんですが、てっきりドット絵だと思ってました。でも、何かとってもヒントになった気がします。



ところで、質問内容とまったく関係もなく、質問でもないのですが、背景の話が出たので一つ。

東方や龍神録、その他の沢山のSTGのクオリティの高さって、やはり弾幕もありますが、『背景』が綺麗な点も一つの要素だと思うんですよね。

背景が真っ黒だけだったり、特に特徴のない寂しいだけのような背景じゃなく、ああいうCG(3D?)徴というか、アクション(?)性のある背景があるから、東方や龍神録は、『ただ弾幕を避けるだけのゲーム』以上の素晴らしさがあるんだと、勝手に思ってます。


……どうでもいい話でしたね。どうか忘れて下さい。


脱線して無駄に文章を増やしてしましましたが、どうか回答お願いします。


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

Name: 御津凪 [URL]  ..ハッカー(132,996ポイント)   Date: 2009/12/15(火) 12:56   No:44083     
Title: Re:STG製作者(特に管理人さん)様に質問    
> 光翼型近接支援残酷超初心者 さん
投稿するまえに一度は読み直してから投稿したほうが良いと思いますよ。
結構誤字があります…。

それはさておき、自機の絵というより単純に絵の描き方を習う方が良いと思います。
自機の画像の作り方はあっても、自機の絵の描き方というのは無いような気がしますし。

自機や敵のアニメーションを作るとき、ドット絵として打ち込んでいってもいいのですが、
綺麗さを持たせるならば、完成サイズの2の乗数倍のサイズで各イラストを描き、
最後にそれぞれを実際のサイズに縮小し、纏める、という方法が良いでしょう。
(私はこういう方法でやってます)

なお、東方のような 3D の背景はまた少し別の技術が必要ですが、
それほど難しいものはないと思います。
(3D系ソフトの扱いのほうが難しいのだけれど)


また、下記のソフトはアニメーションイラストに特化したソフトの紹介記事です。
私は触ったことはありませんが、アニメーションする絵は楽に作業できるかもしれません。

パラパラマンガを描く要領で簡単にアニメーション動画を作成「Pencil」
http://www.forest.impress.co.jp/docs/review/20091211_334719.html


ゲームバランスにはゲームのシステムはもちろん、シナリオ・世界観やグラフィックも含まれるので、
それらがバランス良くあれば、ユーザーは「ゲームを楽しむ」ことができます。

そういうものを作るのは、結構大変ですけど楽しいですよね。


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

Name: 光翼型近接支援残酷超初心者  ..入門者(2,582ポイント)   Date: 2009/12/15(火) 13:33   No:44088     
Title: Re:STG製作者(特に管理人さん)様に質問    
>>御津凪さん

ありがとうございます。いろいろ修正してみました。


>パラパラマンガを描く要領で簡単にアニメーション動画を作成「Pencil」

面白そうですね。簡単で、とくにFLASHでも画像でも出力できるのがいいとおもいます。
動画とか作るのにも使えそうですよね。



>自機の画像の作り方

そうです。それです。絵じゃなくて『画像』でした。


「自機の『画像』を作りたい!」のです。

ああ、確かに。「絵」を作りたいのと、「画像」を作りたい、のとじゃ全然意味が違いましたね。


この場を借りて訂正します。上でも訂正しましたが。


「STGを製作されてる皆様が『自機等の画像を描く際に』参考にしているサイト」を知りたいのです。


この際、サイトじゃなくても結構です。

とても単純な方法でしたら、「こうやってこう」程度でいいので教えて頂けるとありがたいです。飛んで跳ねます。


どうかもう一度回答をお願いします。


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

Name: 御津凪 [URL]  ..ハッカー(133,528ポイント)   Date: 2009/12/15(火) 14:29   No:44096     
Title: Re:STG製作者(特に管理人さん)様に質問    
> 「自機の『画像』を作りたい!」のです。

であれば、

> 「STGを製作されてる皆様が『自機等の画像を描く際に』参考にしているサイト」

ではなく、

「STGを製作されてる皆様が『自機等の画像を作る際に』参考にしているサイト」

ではないですか?

「自機等の画像を描く」だと、結局「自機等の絵を描く」とほぼ同意義になってしまいます。


まあ、それは置いといて、 GIMP での場合の作り方を紹介します。

・まずあらかじめ一コマずつ描いた各画像ファイルを用意します。
・次に GIMP で完成時の画像サイズを指定し、背景が透明(詳細設定で設定可能)の状態で新規作成します。
・前述した各画像ファイルを GIMP のメインウインドウにドラッグ&ドロップします。
・全て追加し、レイヤーが各画像ごとに取り込まれていることを確認します。
・ツールウインドウの「移動」ツール(十字の矢印のアイコン)でそれぞれを目的の位置に揃え、整えます。
 (スナップやグリッドを有効にすると合わせやすくなります)
・メニューの保存で、ファイル名に保存するファイル名に .png をつけて(PNG形式で保存するので指定)保存します。
・レイヤー統合に関するダイアログが出るので「可視レイヤーを統合」を選択、後は適当なオプションを指定して保存。
・完成。

となります。

なお、環境によっては GIMP の起動にしばらく時間がかかったり、稀に強制終了することがあります。
そこらへんはフリーソフトということで我慢してください。


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

Name: DVDM [URL]  ..初心者(8,119ポイント)   Date: 2009/12/16(水) 03:07   No:44197     
Title: Re:STG製作者(特に管理人さん)様に質問    
>>光翼型近接支援残酷超初心者さん
>お二人とも仰る通りなのですが、やはりああ言う自機の画像の描き方を知っておきたいのです。
>もちろんCをちゃんと理解していればこのような事にはならないんですけどね……。

絵を描くのにC言語を理解する必要はないように感じます。
画像をうまく表示したり出来ないのはプログラム側で制御する必要があると思います。


>僕はPixiaを使っているのですが、イマイチ使い方が分かってなくて、
>色塗りぐらいしかできてないんです。

Pixiaも、私的にですがわかりやすいインターフェースをしていると思います。
こちらの機能が使えないと恐らくですがPhotoShopは使えないという可能性もありそうです。
レイヤーの機能に関してはソフトでの操作に差はあれど概念は同じですので
ここでレイヤーを扱えるようにしてみてはいかがでしょうか?
レイヤーを少しでも知っていると作業効率が上がると言ってもいいと思っています。

まぁ、PhotoShopにはフィルタ機能という適当に描いてもそれっぽく見えたりするのもあるんですが・・・。
添付画像がちょうどフィルタを適当に使って描いたものに加工したものです。


サイトと言っていたのでPhotoShopではありますがお気に入りのサイトのリンクを張っておきます。

//------------------------------
【Photoshop ロゴワークショップ】
http://web.kyoto-inet.or.jp/people/hikeda/justnet/logows/pictureindex.html
PhotoShopの色々な機能をここで勉強させて頂いています。
//------------------------------
【Photoshop Vip】
http://photoshopvip.net/
個人的にPhotShopサイトの中で一番気に入っています。
//------------------------------

上でも書きましたが、好きなゲーム等に使われている画像を真似して作るだけでも練習になります。
絵のクオリティはいきなり上がったりしないので、まずはソフトに慣れるところから始めていきましょう^^




>>管理人さん
こちらがすでに寒いので、そちらは相当寒いでしょうね;
mixiで拝見させて頂いておりますが、どちらかというと豪勢な料理のほうが気になりますね(笑)

ポイントありがとうございます^^;
御礼にこっそり貼ってみるテストでもしました(笑)

なにか、見てはいけないようなものを見た気がしますが、敢えて見なかったことにしておきます(笑)



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,111,891ポイント)   Date: 2009/12/16(水) 07:25   No:44204     
Title: Re:STG製作者(特に管理人さん)様に質問    
>> 光翼型近接支援残酷超初心者さん
>お二人とも仰る通りなのですが、やはりああ言う自機の画像の描き方を知っておきたいのです。 
>もちろんCをちゃんと理解していればこのような事にはならないんですけどね……。

何か誤解していらっしゃるのでは?
C言語にいくら詳しくなっても絵は描けないと思います。
現に「プログラムは出来るけど絵が描けない、音楽が作れない」ということで困っている人はたくさんいらっしゃると・・。
ゲームって音楽・画像・プログラム(ジャンルによってはシナリオ)がそろわないと完成しないのですよねぇ。

まぁC言語に詳しくなればあらゆる素材を使ってエフェクトが表現できるようになるとかそう言う事はあるかもしれませんが
「画像の描き方」と仰っているので当てはまらないと思います。

所で、参考サイトにこだわっていらっしゃいますが、サイトにこだわらなくてもいいのでは?
上でも言いましたが、特に私はどこのサイトも見たわけではないです。
(ゆえにあの程度の出来です)
もし勉強したければ大きな書店に行って、イラストの描き方の本を購入されてはどうでしょう。
ドット絵の描き方系の本は色々あると思いますよ。

>>DVDMさん

実は忘れてて、ついさっきポイント統合したのは内緒^^;
・・って、、FLASH、見えてはいけないものを見せないようにw


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

Name: 光翼型(携帯より  ..ぴよぴよ(75ポイント)   Date: 2009/12/16(水) 23:23   No:44323     
Title: Re:STG製作者(特に管理人さん)様に質問    
携帯から失礼します。


今日はどうにもPCに触れている時間が取れなかったものですので、ちゃんとした返信ができそうにありません。


質問している側から失礼ですが、ちゃんとした返信は明日、させて頂きます。


明日、可能であればさっそくGIMPで作ってみようと思ってます。


携帯から失礼しました。


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

Name: 光翼型近接支援残酷超初心者  ..入門者(3,123ポイント)   Date: 2009/12/17(木) 22:36   No:44425 解決!     
Title: Re:STG製作者(特に管理人さん)様に質問    
1日たって、御津凪さんに教えて頂いた方法でみごとGIMPにて作成に成功しました。ほんとありがとうございます!



さて、ではいろいろ返信させて頂きます。


>画像を作る際に』参考にしているサイト」ではないですか? 
>サイトにこだわらなくてもいいのでは?

すみませんでした。当時はいろいろ急いでたのと興奮してたもので、焦ってました。
普通に「画像の作り方を教えて下さい」って書(聞)けばよかったですね。サイトにこだわるも必要なかったですね。


>PhotoShopではありますがお気に入りのサイトのリンクを張っておきます。

ありがとうございます。PhotoShopが手に入った時に参考にさせて頂きます。


>絵を描くのにC言語を理解する必要はないように感じます。
>何か誤解していらっしゃるのでは?

すみませんでした。誤解を招く日本語ばかり書いてしまって。
自分、どうにも国語力がなってない上にボキャもなってないものでして。
CAVE語より性質が悪いですね。下らん事言ってすみません。

こんな事、って言うのは、「Cを十分理解していれば『自分で改造できない』事もない」って意味でした。
前の文章の噛み合って無い上に、変なこといってましたね。すみませんでした。



とにかく、無事、絵の方も完成しました。(勝手ながら)一件落着です。

今後とも、精進していきます。行く行くは、なるべく質問者側ではなく回答者側になりたいものですね。

多くの方にタメになる話を教えて頂いて幸せでした。
本当にありがとうございました!


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,114,201ポイント)   Date: 2009/12/17(木) 22:56   No:44429     
Title: Re:STG製作者(特に管理人さん)様に質問    
いえいえ、私なんか書いてるうちに言いたいこと変わってきて読み返してみるとめちゃくちゃになってることよくあります。
国語力無いので人一倍文章の粗悪さには自信がありますが、
私は読み返してから投稿するようにしています。
一度しっかりおかしな文章ではないか読み返して投稿することで大分マシになると思います。

さて、画像の方は無事完成されたようでよかったですね。
最初のうちは難しくても書いてるうちに慣れてくるんじゃないでしょうか。
GIMP1はかなり使いにくかったですが、2になってずいぶん使いやすくなりました。
使いこなせば、10万位するフォトショップと同じようなことが出来るので、
GIMPはお勧めです。

よい作品が出来るといいですね。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +