C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   クラス内でconstの使い ....   
     ・[55456] シエル 
     ・[55457] たかぎ 
     ・[55460] Limone 
   選択画面の作り方につ ....   
     ・[55452] クラ 
     ・[55453] Dixq (管理人) 
     ・[55458] クラ 
     ・[55459] クラ 
   フルスクリーンで実行 ....   
     ・[55443] ムンバ 
     ・[55445] wing 
     ・[55447] ムンバ 
     ・[55448] ベリ工 
     ・[55449] ベリ工 
     ・[55450] wing 
   コンパイルのエラー  ....   
     ・[55399] fatens 
     ・[55401] 森のプーさん 
     ・[55441] 組木紙織 
   LoadDivGraphのバグ   
     ・[55423] MNS 
     ・[55431] yamataro 
     ・[55432] yamataro 
   バイナリへの出力   
     ・[55406] タマ 
     ・[55407] ぽこ 
     ・[55425] タマ 
     ・[55428] ぽこ 
     ・[55429] box 
   キューのついて   
     ・[55311] ぽこ 
     ・[55314] toyo 
     ・[55316] ぽこ 
     ・[55329] かける 
     ・[55332] ぽこ 
     ・[55342] かける 
     ・[55346] ぽこ 
     ・[55377] かける 
     ・[55408] ぽこ 
     ・[55424] かける 
   GL,C++を使った球 ....   
     ・[55269] ひえらるきー 
     ・[55310] 組木紙織 
     ・[55326] ひえらるきー 
     ・[55331] 組木紙織 
     ・[55336] ISLe 
     ・[55417] ひえらるきー 
   C++について   
     ・[55413] たかぎ 
   3Dゲーム製作につい ....   
     ・[55387] TKOZ 
     ・[55390] TKOZ 
     ・[55395] TKOZ 
     ・[55396] TKOZ 
     ・[55403] fr 
     ・[55404] Justy 
     ・[55412] dic 
   i=i+1,i+=1,+ ....   
     ・[55374] y 
     ・[55375] ムンバ 
     ・[55376] Revell 
     ・[55381] 組木紙織 
     ・[55383] たかぎ 
     ・[55397] Revell 
   スクロール   
     ・[55379] わふー 
     ・[55384] Tatu 
     ・[55386] TKOZ 
   定積分について   
     ・[55321] asdf 
     ・[55322] asdf 
     ・[55327] 初級者 
     ・[55347] もぐりん 
     ・[55385] 初心者 
   多重リスト   
     ・[55328] ぽこ 
     ・[55330] asdf 
     ・[55333] asdf 
     ・[55334] ぽこ 
     ・[55335] asdf 
     ・[55338] ぽこ 
     ・[55339] asdf 
     ・[55340] asdf 
     ・[55351] ぽこ 
     ・[55380] asdf 
   ファイルの読み取り   
     ・[55357] ぽこ 
     ・[55360] タマ 
     ・[55361] シエル 
     ・[55363] ぽこ 
     ・[55369] タマ 
     ・[55370] box 
     ・[55371] シエル 
     ・[55372] タマ 
   昇進状態について(雑 ....   
     ・[55124] Dixq (管理人) 
     ・[55126] 山崎 
     ・[55138] ムンバ 
     ・[55313] しろ 
     ・[55315] シエル 
     ・[55323] ぽこ 
     ・[55324] 御津凪 
     ・[55337] たかぎ 
     ・[55341] 組木紙織 
     ・[55343] ムンバ 
     ・[55344] ROM 
     ・[55345] ぽこ 
     ・[55348] ムンバ 
     ・[55349] ぽこ 
     ・[55350] 三郎 
     ・[55352] ムンバ 
     ・[55364] Dixq (管理人) 
     ・[55367] ムンバ 
   DirectSoundでのWAVEフ ....   
     ・[55354] Justy 
     ・[55356] シエル 
   ::って何でしょう・・ ....   
     ・[55248] たかぎ 
     ・[55249] softya 
     ・[55256] シエル 
     ・[55299] ZASEA 
   比例航法について   
     ・[55263] シエル 
     ・[55264] ookami 
     ・[55265] シエル 
     ・[55266] ookami 
     ・[55267] シエル 
     ・[55274] へろり 
     ・[55276] toyo 
     ・[55290] HY 
     ・[55291] シエル 
     ・[55295] へろり 
     ・[55296] シエル 
     ・[55297] シエル 
   ダブルリンクリストの ....   
     ・[55199] モンティニオ 
     ・[55200] y 
     ・[55207] dic 
     ・[55208] toyo 
     ・[55284] dic 
     ・[55287] たかぎ 
     ・[55289] dic 
   ブロック崩し   
     ・[55279] シエル 
     ・[55280] kei 
     ・[55282] シエル 
     ・[55283] kei 
     ・[55285] TKOZ 
     ・[55286] kei 
   C言語のコメントにつき ....   
     ・[55252] 組木紙織 
     ・[55253] たかぎ 
     ・[55254] ムンバ 
     ・[55255] ムンバ 
     ・[55259] へろり 
     ・[55260] toyo 
     ・[55261] ムンバ 
   初心者です・・・   
     ・[55234] ideyan 
     ・[55238] つよ 
   このようなエフェクト ....   
     ・[55224] スキマ妖怪 
     ・[55228] Dixq (管理人) 
     ・[55230] シエル 
     ・[55232] Dixq (管理人) 
     ・[55233] Dixq (管理人) 
     ・[55235] シエル 
   DXライブラリを使った ....   
     ・[55212] 削除済み 
     ・[55213] softya 
     ・[55214] toyo 
     ・[55220] ookami 
     ・[55231] Limone 
   ”Hello, world” ....   
     ・[55218] シエル 
     ・[55219] ookami 
     ・[55225] 爺プログラマー 
   メイン関数を通らない   
     ・[55166] Dixq (管理人) 
     ・[55169] dic 
     ・[55171] 御津凪 
     ・[55173] たかぎ 
     ・[55174] Dixq (管理人) 
     ・[55177] mila 
     ・[55181] dic 
     ・[55190] ookami 
     ・[55192] Dixq (管理人) 
     ・[55193] ookami 
     ・[55215] yamataro 
     ・[55216] ookami 
   mySqlのhaving句につい ....   
     ・[55205] toyo 
     ・[55206] ookami 
     ・[55209] toyo 
     ・[55210] ookami 
   引数を用いる関数の戻 ....   
     ・[55198] y 
     ・[55201] フリオ 
     ・[55204] NN 
   コピーコンストラクタ ....   
     ・[55116] Justy 
     ・[55117] 小太鼓 
     ・[55118] 小太鼓 
     ・[55119] Justy 
     ・[55122] YuO 
     ・[55123] ookami 
     ・[55127] たかぎ 
     ・[55128] ookami 
     ・[55132] たかぎ 
     ・[55136] ookami 
     ・[55195] 小太鼓 
     ・[55203] ISLe 
   【雑談】ミニゲームを ....   
     ・[54853] Dixq (管理人) 
     ・[54858] Tatu 
     ・[54860] シエル 
     ・[54993] TKOZ 
     ・[55003] バグ 
     ・[55041] Cir 
     ・[55179] バグ 
     ・[55202] ISLe 
   C言語   
     ・[55187] パコネコ 
     ・[55188] mila 
     ・[55189] inc 
   OpenCVで画像認識用の ....   
   解決マークの動きのテ ....   
     ・[55147] ookami 
     ・[55148] ookami 
     ・[55149] ookami 
     ・[55151] ookami 
     ・[55154] toyo 
     ・[55155] ookami 
     ・[55168] Dixq (管理人) 
     ・[55172] ookami 
     ・[55175] Dixq (管理人) 
   複数あるファイル内の ....   
     ・[54534] トマト 
     ・[54544] ookami 
     ・[54593] トマト 
     ・[54594] シエル 
     ・[54595] へろり 
     ・[54597] トマト 
     ・[54599] ookami 
     ・[54600] へろり 
     ・[54601] へろり 
     ・[54602] トマト 
     ・[54611] トマト 
     ・[54615] シエル 
     ・[54620] ぽこ 
     ・[54672] へろり 
     ・[54703] トマト 
     ・[54784] ぽこ 
     ・[54970] トマト 
     ・[54991] トマト 
     ・[54997] シエル 
     ・[55000] ぽこ 
     ・[55058] トマト 
     ・[55059] シエル 
     ・[55061] へろり 
     ・[55063] トマト 
     ・[55065] へろり 
     ・[55066] トマト 
     ・[55067] へろり 
     ・[55068] トマト 
     ・[55075] へろり 
     ・[55109] ぽこ 
     ・[55141] トマト 
     ・[55142] トマト 
     ・[55150] ookami 
     ・[55152] へろり 
     ・[55157] トマト 
     ・[55158] へろり 
     ・[55159] へろり 
     ・[55160] トマト 
     ・[55167] Dixq (管理人) 
   マウスカーソル(カレ ....   
     ・[55114] 小太鼓 
     ・[55143] shiro4ao 
     ・[55145] 白 
     ・[55153] ookami 
     ・[55161] shiro4ao 

Name: Limone  ..かけだし(1,709ポイント)   Date: 2010/06/28(月) 15:38   No:55454       
Title: クラス内でconstの使い方    
class A{
public:
 A(const int x1);
 const int x;
}
A::A((const int x1){
  x = x1;
}

このような感じで
引数x1をxの値として、それ以後動かないようにしたいのですが
どうすればいいでしょう?

検索用語:「クラス」or「class」「引数」「const」


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


Name: シエル  ..上級者(16,504ポイント)   Date: 2010/06/28(月) 15:40   No:55456     
Title: Re:クラス内でconstの使い方    
動かないようにというのは、値が変わらないようにしたいということでしょうか?

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

Name: たかぎ [URL]  ..ハッカー(211,881ポイント)   Date: 2010/06/28(月) 15:43   No:55457     
Title: Re:クラス内でconstの使い方    
「コンストラクタ初期化子」でいますぐ検索


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

Name: Limone  ..かけだし(1,726ポイント)   Date: 2010/06/28(月) 16:41   No:55460 解決!     
Title: Re:クラス内でconstの使い方    
なるほど、出来ました
ありがとうございます。


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



Name: クラ  ..ぴよぴよ(22ポイント)   Date: 2010/06/28(月) 13:30   No:55451       
Title: 選択画面の作り方について    
初めまして。クラと申します。
今、このサイトの「選択画面の作り方」というページで
勉強させていただいています。


まずmainの中の6行目で

…&& GetHitKeyStateAll_2(Key)==0 &&…

とGetHitKeyStateAll_2を呼びだしていますが、
引数のKeyには、宣言以降何も代入していませんよね?
なぜそれをGetHitKeyStateAll_2に渡して
上手く行くのでしょうか?


また、mainの中の9行目で

…Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30…

と書かれてありますが、1ならそのキーを押されていて、
0だと押されていないのですよね?
0と1以外の値は一体何なのでしょうか?


もし分かりにくい文章でしたら申し訳ないです。
お時間のある方、よろしくお願いします。


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


Name: クラ  ..ぴよぴよ(52ポイント)   Date: 2010/06/28(月) 13:34   No:55452     
Title: Re:選択画面の作り方について    
投稿した後に2つ目の問題が解決しました。
こちらの見落としでした。すみません。


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

Name: Dixq (管理人)  ..ウィザード(1,229,532ポイント)   Date: 2010/06/28(月) 14:39   No:55453     
Title: Re:選択画面の作り方について    
グローバル変数は宣言をしたら何も書かなくても0が代入されるんです。

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

Name: クラ  ..ぴよぴよ(83ポイント)   Date: 2010/06/28(月) 16:10   No:55458     
Title: Re:選択画面の作り方について    
なるほど…
特に0を渡しても問題ないという事ですね。

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


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

Name: クラ  ..ぴよぴよ(95ポイント)   Date: 2010/06/28(月) 16:11   No:55459 解決!     
Title: Re:選択画面の作り方について    
解決マークを付け忘れました。

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



Name: wing  ..中級者(11,722ポイント)   Date: 2010/06/28(月) 00:00   No:55436       
Title: フルスクリーンで実行中に    
Dxライブラリを使って作ったゲームをフルスクリーンで実行している時、
キーボードのCtrlキーとAltキーの間にあるキーを押すと
(Windousのタスクバーのスタートボタンをクリックした時と同じこと)
スタートメニューが出てきて、ゲームは応答しなくなり、強制終了するしか
なくなります。

龍神録の館ベースにしているので、きっと龍神録でも同じだと思うのですが、
これは私だけなのか、または対策はしないでキーを押さないように気をつけるのか、
私がなにかコードを書き忘れているのか、
分かる方いましたら、アドバイスをください。


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


Name: ムンバ  ..初心者(7,674ポイント)   Date: 2010/06/28(月) 10:10   No:55443     
Title: Re:フルスクリーンで実行中に    
wingさん、おはようございます。

自宅と会社のパソコンでやってみました。
(龍神録の館のままのソース)
スタートメニューが出ますが、ゲームの画面は閉じた様に見えますが
タスクバーには残っていますので
タスクバーから再度開いて、ゲームの終了はできました。

環境は、Win7(Pro)WinXP(Home) で、VC++2008(SP1)です。


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

Name: wing  ..中級者(11,916ポイント)   Date: 2010/06/28(月) 11:04   No:55445     
Title: Re:フルスクリーンで実行中に    
ムンバさん、ありがとうございます。

私のは、Win7、VC2008EEです。

確かに、タクスバーの中で右クリックで終了させることはできました。
しかし、終了せずに再びゲームを再開しようとすると、画面が真っ黒になって
応答なしになってしまいます。

たまたま間違ってキーを押してしまっただけですから、気をつければ済むこのなんですけど。

余談ですが、
google→ググル
Yahoo!→ヤホーで検索
(少し前にはやりましたよね)


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

Name: ムンバ  ..初心者(7,862ポイント)   Date: 2010/06/28(月) 12:24   No:55447     
Title: Re:フルスクリーンで実行中に    
>>しかし、終了せずに再びゲームを再開しようとすると、画面が真っ黒になって 
>>応答なしになってしまいます。

 Win7 ですと、帰宅しないと試せ無いので
 帰宅したら色々と試したいと思います。^^
 ご存知の通り、もっと詳しい方がたくさんいらっしゃいますので
 それまでに、原因が解るといいですね。

>>google→ググル 
>>Yahoo!→ヤホーで検索

 はい。未だに、ヤホーって言ってますし。^^;


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

Name: ベリ工  ..入門者(4,266ポイント)   Date: 2010/06/28(月) 12:26   No:55448     
Title: Re:フルスクリーンで実行中に    
>ゲームをフルスクリーンで実行している時、キーボードのCtrlキーとAltキーの間にあるキーを押すと・・・

Windowsキーの事ですね?フルスクリーンモードでは良くある話ですね。
Windowsキーだけでなく、Alt+TabキーやAlt+Windowsキー、または別アプリが
アクティブになったりするとフルスクリーンモードが解除されます。

>終了せずに再びゲームを再開しようとすると、画面が真っ黒になって応答なしになってしまいます。

私も試しに行ってみたところ、画面は真っ黒になりましたが、ゲームが応答無しには
なりませんでしたね。ゲーム自体は動いていました。そこでちょっと調べたところ、
DXライブラリのリファレンスに記載がありましたね。詳しくは下記参照願います。

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R15N34

よって、上記リファレンスの対応を行ったらフルスクリーンのゲームに戻っても
真っ黒にはならずに元のゲーム画面に復帰しましたね。

>たまたま間違ってキーを押してしまっただけですから、気をつければ済むこのなんですけど。

確かにゲームの注意事項として『WindowsキーやAlt+Tabキー、別のアプリがアクティブになった
場合はフルスクリーンが解除され、ゲームが中断されます。』などと記載していればゲームユーザは
納得してくれるかも知れませんが、格闘ゲームやアクションゲームなど、ゲームユーザが
意図しない時に場合によってはいきなりフルスクリーンモードが解除され、ゲームが中断されてしまう
のはゲームとして行儀がよくありませんので、その対処は入れるべきだと思います。

なので試しにキーボードフックを掛け、Windowsキーがフルスクリーンモードで押下された
時にそのキーを『握りつぶす(無効にする)』処理を実装してみたところ、意図した動作
(フルスクリーンモード中にWindowsキーを押下しても解除されない事)を確認できましたので、
試してみてはいかがでしょう?但し、キーボードフックはゲーム画面が終了する際に解除する処理を
入れないと、場合によってはOSを再起動するまでずっとフックされる事があります(特にシステムフックは
他のアプリケーションにまで影響を及ぼします)。


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

Name: ベリ工  ..入門者(4,303ポイント)   Date: 2010/06/28(月) 12:29   No:55449     
Title: Re:フルスクリーンで実行中に    
URLパスを間違えました^^;;;;

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R15N33

です。


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

Name: wing  ..中級者(11,979ポイント)   Date: 2010/06/28(月) 13:19   No:55450     
Title: Re:フルスクリーンで実行中に    
ペリエさん、ありがとうございます。

あのキーはWindowsキーって言うんですね。いまごろ知りました。
キーボードフックを検索してみましたが、結構たいへんですね。
少しずつ勉強してみたいと思います。

Dxライブラリのリファレンスも読んでみました。
これもじっくり読んでみないとすぐにはできそうもないですね。

ゲームを作ることばかり考えていたんですが、それ以外にも
いろいろと勉強しなければならないことがあるんですね。



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



Name: 森のプーさん  ..ぴよぴよ(152ポイント)   Date: 2010/06/27(日) 14:56   No:55398       
Title: コンパイルのエラー c言語について    
#include <stdio.h>
#include <math.h>

/* 関数の定義 */
double func1(double x);
/* 台形公式 */
double trapezoidal( double a, double b, int n, double (*f)(double) );

int main(void)
{
    int n=100;

    printf(" sqrt 5 * ( 1.0 / ( 4 + sin(x) * sin(x) ) ) ) を [0,π/2]で積分します。分割数は%dです。    ", n);
    printf("結果は%20.15fです。", trapezoidal(0.0, M_PI_2, n, func1) );

    return 0;
}

/* 台形式 */
double trapezoidal( double a, double b, int n, double (*f)(double) )
{
    double T, h;
    int i;

    h =( b - a ) /n ; /* 刻み幅の指定 */

    /* 台形公式 */
    T = ( (*f)(a) + (*f)(b) ) / 2.0;
    for ( i = 1; i< n; i++) T += (*f)( a + i*h );
    T *= h;

    return T;
}

/* 関数の定義 */
double func1(double x)
{
    return( sqrt 5 * (1.0 / ( 4 + sin(x) * sin(x) ) ) );
}

コマンドプロントを実行すると

エラー E2293 kadai2kai2.c 38: ) が必要(関数 func1 )
警告 W8057 kadai2kai2.c 39: パラメータ 'x' は一度も使用されない(関数 func1 )
*** 1 errors in Compile ***

と出ます。

sqrt 5を(1.0 / ( 4 + sin(x) * sin(x) ) )に掛ける場合はどこを直せばよいか教えてもらいたいです。

 編集済み


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


Name: fatens  ..中級者(14,440ポイント)   Date: 2010/06/27(日) 15:08   No:55399     
Title: Re:コンパイルのエラー c言語について    
sqrt 5 → sqrt(5) です。



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

Name: 森のプーさん  ..ぴよぴよ(153ポイント)   Date: 2010/06/27(日) 15:11   No:55401 解決!     
Title: Re:コンパイルのエラー c言語について    
出来ました。ありがとうございます。

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

Name: 組木紙織  ..比類無きプログラマー(87,893ポイント)   Date: 2010/06/28(月) 08:24   No:55441     
Title: Re:コンパイルのエラー c言語について    
規約違反に気付いたので一応指摘。
以下のとことマルチポストになってます。

>http://bbs.wankuma.com/index.cgi?mode=al2&namber=51187


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



Name: yamataro  ..ぴよぴよ(544ポイント)   Date: 2010/06/27(日) 20:18   No:55420       
Title: LoadDivGraphのバグ    
こんにちは。今作っているゲームで、LoadDivGraph関数の部分で無限ループが起こっていることが
判明したのですが、原因が分かりません。画像がうまく読み込めないのではなく、
そこで処理が止まってしまいます。

LoadDivGraphは、クラスcharaとクラスtoredenのコンストラクタで呼び出しています。


クラスchara:
LoadDivGraph("img/chara/chara.png",6,6,1,40,40,chara_img);


クラスtoreden:
LoadDivGraph("img/enemy/toreden.png",4,4,1,40,40,enemy_img);

chara_imgは要素数が6の私的メンバで、
enemy_imgは要素数が20の、基本クラスenemyの保護メンバです。
もちろん、画像のサイズなどもあっています。
imgフォルダは、ちゃんと実行ファイルと同じ場所にあります。
どこに原因があるのでしょうか?


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


Name: MNS  ..プログラマー(37,416ポイント)   Date: 2010/06/27(日) 20:48   No:55423     
Title: Re:LoadDivGraphのバグ    
DXライブラリの初期化(DxLib_Init関数の呼び出し)以前に、
LoadDivGraph関数が呼び出されているからでは?


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

Name: yamataro  ..ぴよぴよ(583ポイント)   Date: 2010/06/27(日) 23:02   No:55431     
Title: Re:LoadDivGraphのバグ    
DxLib_Initのあとにもっていったら解決しました!
ありがとうございました!


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

Name: yamataro  ..ぴよぴよ(589ポイント)   Date: 2010/06/27(日) 23:02   No:55432 解決!     
Title: Re:LoadDivGraphのバグ    
解決するのを忘れました。

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



Name: タマ  ..入門者(2,655ポイント)   Date: 2010/06/27(日) 16:49   No:55405       
Title: バイナリへの出力    
typedef struct {
    int year;
    short month;
    short day;
} Date;

typedef struct {
    char name[40];
    char university[40];
    char department[40];
    Date birthday;
    char hobby[40];
} Student;
↑の文を使って、bininfo(拡張子無し)というファイルに最大5人分の生徒の情報を書き込む問題です。
出力例:
Input next student, please:
Name:
Tanaka Jiro
University:
Sakana Gakuin
Department:
Integrated Information Technology
Birthday:
2002/2/22
Hobby:
Tennis, Tea Ceremony, Go

ヒントなどで、
・ファイルの最初に生徒の人数を出力する(バイナリモードで)
と書いてあるのですがいまいち分からないです。

次のレスで、途中まで書いた文を載せます。


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


Name: タマ  ..入門者(3,060ポイント)   Date: 2010/06/27(日) 16:51   No:55406     
Title: Re:バイナリへの出力    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int year;
    short month;
    short day;
} Date;

typedef struct {
    char name[40];
    char university[40];
    char department[40];
    Date birthday;
    char hobby[40];
} Student;

int main(void)
{
int i;
Student s;
FILE *fp;
fp=fopen("bininfo", "wb");
printf("Input next student,please:\nName:");
fgets(s.name,sizeof(s.name),stdin);
fwrite(&s.name,sizeof(s.name),1,fp);
printf("University:");
fgets(s.university,sizeof(s.university),stdin);
fwrite(&s.university,sizeof(s.university),1,fp);
printf("Department:");
fgets(s.department,sizeof(s.department),stdin);
fwrite(&s.department,sizeof(s.department),1,fp);
printf("Birthday:");
fgets(s.birthday,sizeof(s.birthday),stdin);
fwrite(&s.birthday,sizeof(s.birthday),1,fp);
printf("Hobby:");
fgets(s.hobby,sizeof(s.hobby),stdin);
fwrite(&s.hobby,sizeof(s.hobby),1,fp);
fclose(fp);
return(0);
}

Birthdayの部分を出力例のように表示させる方法のヒントも教えていただけると嬉しいです。


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

Name: ぽこ  ..上級者(18,432ポイント)   Date: 2010/06/27(日) 17:10   No:55407     
Title: Re:バイナリへの出力    
> Birthdayの部分を出力例のように表示させる方法のヒントも教えていただけると嬉しいです。

とりあえず入力された誕生日を変数として取得するサンプルを上げておきます。
----
#include <stdio.h>

int main()
{
    char buf[256] = {0};
    int year = -1;
    int month = -1;
    int day = -1;
    
    fgets( buf, 255, stdin );
    sscanf( buf, "%d/%d/%d", &year, &month, &day );
    printf( "year: %d\nmonth: %d\nday: %d", year, month, day );
    getchar();

    return 0;
}


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

Name: タマ  ..入門者(3,370ポイント)   Date: 2010/06/27(日) 21:30   No:55425     
Title: Re:バイナリへの出力    
一番上の記事とは違ってしまいますが、typedef structの部分はそのままにして、
myinfo.txtから読み込んでそれをバイナリファイルに出力するプログラムを作り方で
int main(void)
{
Student s;
FILE *fp;
fp=fopen("myinfo.txt","r");
sscanf(fp,"%s/%s/%s/%d/%d/%d/%s",s.name,s.university,s.department,
&s.birthday.year,&s.birthday.month,&s.birthday.day,s.hobby);
fclose(fp);
fp=fopen("bininfo", "wb");
printf("Input next student,please:\nName:");
fwrite(&s.name,sizeof(s.name),1,fp);
printf("University:");
fwrite(&s.university,sizeof(s.university),1,fp);
printf("Department:");
fwrite(&s.department,sizeof(s.department),1,fp);
printf("Birthday:");
fwrite(&s.birthday,sizeof(s.birthday),1,fp);
printf("Hobby:");
fwrite(&s.hobby,sizeof(s.hobby),1,fp);
fclose(fp);
return(0);
}

これをコンパイルすると、sscanf内で
エラーが起きていると出てくるのですが一体何がいけないのでしょうか?


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

Name: ぽこ  ..上級者(18,537ポイント)   Date: 2010/06/27(日) 21:43   No:55428     
Title: Re:バイナリへの出力    
> これをコンパイルすると、sscanf内で
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?

sscanfの第一引数に求められる変数はconst char *型です。
それなのに、タマさんは第一引数にFILE*型の変数を渡しています。
これがエラーの直接の原因です。適切な型の変数を渡すことでエラーは解消されます。

し・か・し、ファイルを読むときには、sscanfは使用できません。
sscanfは、メモリ上の値を読む関数です。
ファイルを読みたい場合は、fscanfを使ってください。


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

Name: box  ..ハッカー(154,897ポイント)   Date: 2010/06/27(日) 21:52   No:55429     
Title: Re:バイナリへの出力    
> これをコンパイルすると、sscanf内で
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?

sscanfとfscanfとがごっちゃになっていませんか?
両方の関数の第1引数の違いをよ〜く比べてみましょう。


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



Name: かける  ..ぴよぴよ(114ポイント)   Date: 2010/06/26(土) 12:00   No:55305       
Title: キューのついて    
学校で使っている教科書のキューの順配列による表現のプログラム例で

#define M         1000
#define OVERFLOW  -1
#defime UNDERFLOW -2


if(f-r == 1 || f-r+M == 1)  //fはキューの先頭を表すポインタ、rは次に格納すべき番地を表すポインタ
  return OVERFLOW;
else {
  x[r] = y;
  if(++r == M) r = 0;
}



というenqueのときのプログラム何ですが、
最初のif文のところがわからないです


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


Name: ぽこ  ..上級者(17,126ポイント)   Date: 2010/06/26(土) 13:52   No:55311     
Title: Re:キューのついて    

キューが一杯かどうか確認する処理です。
f-r == 1はf>rの時、f-r+M == 1はf<rの時にいっぱいかどうかを表しています。

>  //fはキューの先頭を表すポインタ、rは次に格納すべき番地を表すポインタ

このコメントは嘘です。f,rはポインタではありません。


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

Name: toyo  ..熟練のプログラマー(50,411ポイント)   Date: 2010/06/26(土) 14:04   No:55314     
Title: Re:キューのついて    
fが読み出し位置でrが書き込み位置ですかね
リングバッファでこのような処理をします
もっとわかりやすい変数名にしてくれたらいいのに


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

Name: ぽこ  ..上級者(17,139ポイント)   Date: 2010/06/26(土) 14:22   No:55316     
Title: Re:キューのついて    
> fが読み出し位置でrが書き込み位置ですかね
> リングバッファでこのような処理をします
> もっとわかりやすい変数名にしてくれたらいいのに

f:front
r:rear
ですかね。


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

Name: かける  ..ぴよぴよ(199ポイント)   Date: 2010/06/26(土) 16:42   No:55329     
Title: Re:キューのついて    
みなさまお答えありがとうございます


fがデキューする位置でrがインキューする位置なのですが


f-r == 1の場合は
rにはあとひとつ値が入れられるのではないですか?
rがインキューする位置なのだから

何かひとつ領域を空けておく必要があるのですか?


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

Name: ぽこ  ..上級者(18,156ポイント)   Date: 2010/06/26(土) 16:56   No:55332     
Title: Re:キューのついて    
キューが空である場合と、満杯である場合を区別するためです。

・キューが空であるとは、fとrが等しい時である。→f-r == 0を満たす時である。
・キューが満杯であるとは、
 ・f<rのとき、fが0で、rが999の時である。→f-r+M == 1を満たす時である。
 ・f>rのとき、fが1ならrは0、fが2ならrは1、…fが999ならrは998のときである→f-r == 1を満たす時である。

さて、キューが満杯の条件をちょっと変え、もう一個余分に挿入できるようにした場合、どうなるでしょうか?

 ・f>rのとき、fが1ならrは1、fが2ならrは2、…fが999ならrは999のときである→f-r == 0を満たす時である。

キューが空である条件と被ります。
空なら挿入できますが、空でない場合は挿入できません。でも区別がつきません。
 編集済み


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

Name: かける  ..ぴよぴよ(239ポイント)   Date: 2010/06/26(土) 18:11   No:55342     
Title: Re:キューのついて    
ありがとうございます


区別をするためにひとつ領域を余らせているのですね!!


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

Name: ぽこ  ..上級者(18,304ポイント)   Date: 2010/06/26(土) 18:59   No:55346     
Title: Re:キューのついて    
キューの要素数を格納する変数を用意すれば領域の無駄を省けるんですけどね。


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

Name: かける  ..ぴよぴよ(282ポイント)   Date: 2010/06/27(日) 03:27   No:55377     
Title: Re:キューのついて    
ぽこさん
何どもありがとうございます


C言語は得意なのですか?


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

Name: ぽこ  ..上級者(18,442ポイント)   Date: 2010/06/27(日) 17:15   No:55408     
Title: Re:キューのついて    
> C言語は得意なのですか?

まだまだです。



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

Name: かける  ..ぴよぴよ(309ポイント)   Date: 2010/06/27(日) 21:26   No:55424 解決!     
Title: Re:キューのついて    
キューを使って横型探索をする課題がでているので詰まったらまたおねがいします


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



Name: ひえらるきー  ..かけだし(1,485ポイント)   Date: 2010/06/25(金) 11:56   No:55268       
Title: GL,C++を使った球の特性方程式について    
バネにつながった球の特性方程式の根が実数根をもつとき,虚数根をもつとき,重根をもつとき,となるようにm, c, kの係数を適当に決めて,それぞれの場合における解軌跡(ドラッグを離した場所を初期値として)を示すものをOPENGLを用いて表示させるプログラムをC++で作成したのが下記のプログラムなのですが、classを用いてm, c, kの値が異なる球を複数表示させたいと思っています。Omori classとしてclassの中にはx,y,z(球の座標)、m,c,k(球の質量, 減衰係数,ばね定数)、球の大きさ、色、バネの位置と設定しょうとしているのですが、うまく作ることが出来ません。
この場合のclassの書き方をどなたか教えていただけないでしょうか?
私は今大学4年生でC++は始めて2ヶ月くらいのまだまだ初心者です。
そのため下記のプログラムもかなり読みづらいかと思いますがどうぞよろしくお願いします。



#include<string>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<GL/glut.h>
#include<math.h>

unsigned char mouseFlag = GL_FALSE;
float x0;
float x = 0.0;
int a = 0;
int samplingTime = 50;
int startFlug;
double t = 0.0;
double xStart;
double yStart;
double startFlag;
double yy;


const int width = 1000, height = 1000;

void myKeyboard(unsigned char key, int x, int y)
{
    if (key == 27 ) exit(0);
    if(key == 'a'){
        a = 1;
        x = 0.0;
        x0 = 0.0;
        t = 0.0;
    }
    if(key == 'b'){
        a = 2;
        x = 0.0;
        x0 = 0.0;
        t = 0.0;
    }
    if(key == 'c'){
        a = 3;
        x = 0.0;
        x0 = 0.0;
        t = 0.0;
    }
}

void glutDrawString(const char *str,void *font,float A,float B,float C)
{
    glRasterPos3f(0,2,0);
    while(*str){
        glutBitmapCharacter(font, *str);
        ++str;
    }
}


void myDisplay(void)
{
    
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.6, 0.0, 0.5);
    glBegin(GL_LINES);
        glVertex2d(-10.0, 0.0);
        glVertex2d(x, 0.0);

    glEnd();
    
    glPushMatrix();
        glTranslated(x, 0.0, 0.0);
        glutWireSphere(0.5, 70, 70);
    glPopMatrix();
    
    glEnd();
    glFlush();
}

void myInit(char *progname)
{
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(1000, 1000);
    glutInitWindowPosition(0, 0);
    glutCreateWindow(progname);
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (double)width / (double)height, 0.1, 200.0);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
}


void myMouseFunc(int button, int state, int x1, int y1)
{
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        startFlag = 0;                                                        
        t = 0.0;
        x = 0.0;
        x0 = 0.0;
        yy = 0.0;
        xStart = x1;                                                        
        yStart = y1;                                                        
        mouseFlag =GL_TRUE;
    }else{
        mouseFlag = GL_FALSE;
        startFlag = 1;
    }
}

void myMouseMotion(int xx, int yyy)
{
    if(mouseFlag == GL_FALSE) return;
    x0 = 0.01 * (xx-xStart);                                                                                                
    glutPostRedisplay();
}


void myTimer(int value)
{    

    glutTimerFunc(samplingTime, myTimer, 1);
    
    if(a == 1){                                
        double m = 2, c = 5, k = 2, w, y, x1, x2, c1, c2;    
        w = sqrt(k / m);

        y = c / (2 * sqrt(m * k));
            x1 = -y * w + sqrt(y * y - 1) * w;

            x2 = -y * w - sqrt(y * y - 1) * w;

            c1 = (x2 / (x2 - x1)) * x0;

            c2 = (x1 / (x1 - x2)) * x0;
            if(startFlag == 1){
                x = c1 * exp(x1 * t) + c2 *exp(x2 * t);
            
                t += 0.2;
            }else{                                                            
                x = x0;
            }
    glutPostRedisplay();
    }
    if(a == 2){

        double m = 2, c = 4, k = 2, w, x1, c1, c2;    
        w = sqrt(k / m);
            x1 = -w;

            c1 = x0;

            c2 = x0 * w;

            if(startFlag == 1){
                x = (c1 + c2 * t) * exp(x1 * t);
                
            t += 0.2;
            }else{                                                            
                x = x0;
            }
    glutPostRedisplay();
    }if(a == 3){

        double m = 3.0, c = 0.4, k = 2, w, y, q;    
        w = sqrt(k / m);

        y = c / (2 * sqrt(m * k));
        q = w * sqrt(1 - y * y);

        if(startFlag == 1){
            x = exp(-y * w * t) * (x0 * cos(q * t) + ((y * w * x0) / q) * sin(q * t));
            
            t += 0.2;
        }else{                                                        
            x = x0;
        }
    glutPostRedisplay();
    }
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    myInit(argv[0]);
    glutKeyboardFunc(myKeyboard);
    glutDisplayFunc(myDisplay);
    glutMouseFunc(myMouseFunc);
    glutMotionFunc(myMouseMotion);
    glutTimerFunc(samplingTime, myTimer, 1);
    glutMainLoop();
    return 0;
}


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


Name: ひえらるきー  ..かけだし(1,526ポイント)   Date: 2010/06/25(金) 11:58   No:55269     
Title: タイトルつけ忘れました><    
タイトルは"classについて教えていただきたい"です^^;
よろしくお願いします。


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

Name: 組木紙織  ..比類無きプログラマー(87,598ポイント)   Date: 2010/06/26(土) 13:44   No:55310     
Title: Re:タイトルつけ忘れました><    
OPENGLは使った事がないので、指摘が正しいかどうか分かりませんが、
ほかのGUI系のライブラリと比較して、
glutTimerFunc()の第二引数の中でループ毎の動作を書くのだとおもうのですが、
その中でglutTimerFunc()を再度呼び出し、再帰の形をしてるのが気になります。
ライブラリを正しく使えているのでしょうか。
確認をお願いします。


aの値毎に物体の運動だと考えれらる処理を分岐させてますが、複数の物体の処理をしていないので
どう頑張っても一つの物体しか扱えないようになっているんですが、それはいいんでしょうか。



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

Name: ひえらるきー  ..かけだし(1,714ポイント)   Date: 2010/06/26(土) 16:19   No:55326     
Title: Re:タイトルつけ忘れました><    
> OPENGLは使った事がないので、指摘が正しいかどうか分かりませんが、
> ほかのGUI系のライブラリと比較して、
> glutTimerFunc()の第二引数の中でループ毎の動作を書くのだとおもうのですが、
> その中でglutTimerFunc()を再度呼び出し、再帰の形をしてるのが気になります。
> ライブラリを正しく使えているのでしょうか。
> 確認をお願いします。

この書き方は一応参考書に書いてあったもので動作はうまくいくようになっています。


> aの値毎に物体の運動だと考えれらる処理を分岐させてますが、複数の物体の処理をしていないので
> どう頑張っても一つの物体しか扱えないようになっているんですが、それはいいんでしょうか。

このプログラムに複数の物体を表示させる場合にはm2,c2,k2のようにもう1セットの値を用意して物体の運動の式を書けば2つ描くことはできるのですが、物体をclassにすることでいくつも値を作る必要がないようにしたいんです。物体のclassの中に書きたいと思っているのは、物体の初期座標・サイズ・色・m,c,kの計算などです。よろしくおねがいします。


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

Name: 組木紙織  ..比類無きプログラマー(87,648ポイント)   Date: 2010/06/26(土) 16:54   No:55331     
Title: Re:タイトルつけ忘れました><    
>この書き方は一応参考書に書いてあったもので動作はうまくいくようになっています。 
なら問題ないのかな。



手っ取り早いのが、
物体の運動に関するクラスを用意して、
グローバルな配列やstd::vectorに放り込んで操作するというものです。

class Object
{
private:
    /*物体の情報*/
public:
    /*物体の動作に関する関数*/
    /*物体の表示に関する関数*/
};

std::vector<Objct> vec;//物体のオブジェクトを入れる動的配列。



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

Name: ISLe  ..ぴよぴよ(752ポイント)   Date: 2010/06/26(土) 17:14   No:55336     
Title: Re:タイトルつけ忘れました><    
myTimer関数内の座標計算がまったく異なるのでクラスにするとオーバーライドとか手間が増えると思います。
とりあえず(純粋な)構造体を使って考えてみてはいかが?
クラス化するのはその先ということで。

glutTimerFuncはワンショットタイマー(指定時間後に一回コールバックされるだけ)なので繰り返し呼ばないと止まってしまいます。
でもコールバック関数の最初で呼ぶと時間のかかる関数だと再入がかかる気がします。

いちおう構造体使ったコード貼っておきます。

#include<string>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<GL/glut.h>
#include<math.h>

unsigned char mouseFlag = GL_FALSE;
float x0;
int samplingTime = 50;
int startFlug;
double xStart;
double yStart;
double startFlag;
double yy;

struct Omori {
    float  x;
    double t;
};

const int OMORI_NUM = 3;
Omori omori[OMORI_NUM];

const int width = 1000, height = 1000;

void myKeyboard(unsigned char key, int x, int y)
{
    if (key == 27 ) exit(0);
}

void glutDrawString(const char *str,void *font,float A,float B,float C)
{
    glRasterPos3f(0,2,0);
    while(*str) {
        glutBitmapCharacter(font, *str);
        ++str;
    }
}

void myDisplay(void)
{
    int i;

    glClear(GL_COLOR_BUFFER_BIT);

    for (i=0; i<OMORI_NUM; i++) {
        if (i==0) glColor3d(1.0, 0.0, 0.0);
        if (i==1) glColor3d(0.0, 1.0, 0.0);
        if (i==2) glColor3d(0.0, 0.0, 1.0);

        glBegin(GL_LINES);
        glVertex2d(-10.0, 0.0);
        glVertex2d(omori[i].x, 0.0);
        glEnd();

        glPushMatrix();
        glTranslated(omori[i].x, 0.0, 0.0);
        glutWireSphere(0.5, 70, 70);
        glPopMatrix();
    }
    glFlush();
}

void myInit(char *progname)
{
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(1000, 1000);
    glutInitWindowPosition(0, 0);
    glutCreateWindow(progname);
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (double)width / (double)height, 0.1, 200.0);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}

void myMouseFunc(int button, int state, int x1, int y1)
{
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
        int i;
        for (i=0; i<OMORI_NUM; i++) {
            omori[i].t = 0.0;
        }
        x0 = 0.0;
        startFlag = 0;
        yy = 0.0;
        xStart = x1;
        yStart = y1;
        mouseFlag =GL_TRUE;
    } else {
        mouseFlag = GL_FALSE;
        startFlag = 1;
    }
}

void myMouseMotion(int xx, int yyy)
{
    if(mouseFlag == GL_FALSE) return;
    x0 = 0.01 * (xx-xStart);
    glutPostRedisplay();
}

void omori_a1(Omori *omori)
{
    double m = 2, c = 5, k = 2, w, y, x1, x2, c1, c2;
    w = sqrt(k / m);

    y = c / (2 * sqrt(m * k));
    x1 = -y * w + sqrt(y * y - 1) * w;

    x2 = -y * w - sqrt(y * y - 1) * w;

    c1 = (x2 / (x2 - x1)) * x0;

    c2 = (x1 / (x1 - x2)) * x0;
    if(startFlag == 1) {
        omori->x = c1 * exp(x1 * omori->t) + c2 *exp(x2 * omori->t);

        omori->t += 0.2;
    } else {
        omori->x = x0;
    }
}
void omori_a2(Omori *omori)
{

    double m = 2, c = 4, k = 2, w, x1, c1, c2;
    w = sqrt(k / m);
    x1 = -w;

    c1 = x0;

    c2 = x0 * w;

    if(startFlag == 1) {
        omori->x = (c1 + c2 * omori->t) * exp(x1 * omori->t);

        omori->t += 0.2;
    } else {
        omori->x = x0;
    }
}
void omori_a3(Omori *omori)
{

    double m = 3.0, c = 0.4, k = 2, w, y, q;
    w = sqrt(k / m);

    y = c / (2 * sqrt(m * k));
    q = w * sqrt(1 - y * y);

    if(startFlag == 1) {
        omori->x = exp(-y * w * omori->t) * (x0 * cos(q * omori->t) + ((y * w * x0) / q) * sin(q * omori->t));

        omori->t += 0.2;
    } else {
        omori->x = x0;
    }
}

void myTimer(int value)
{
    glutTimerFunc(samplingTime, myTimer, 1);

    omori_a1(&omori[0]);
    omori_a2(&omori[1]);
    omori_a3(&omori[2]);

    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    myInit(argv[0]);
    glutKeyboardFunc(myKeyboard);
    glutDisplayFunc(myDisplay);
    glutMouseFunc(myMouseFunc);
    glutMotionFunc(myMouseMotion);
    glutTimerFunc(samplingTime, myTimer, 1);
    glutMainLoop();
    return 0;
}


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

Name: ひえらるきー  ..入門者(3,692ポイント)   Date: 2010/06/27(日) 19:38   No:55417     
Title: Re:タイトルつけ忘れました><    
今回の目標がclassを用いる練習ということなんでおもす><
一応classを使ってプログラムを作り直してみました。
でもm,c,kの入力を促すようにcout,cinを使っているのですが、そこが上手く動いてくれなくなってしまっています。
そのため、物体の動きの判別もうまく動いてくれなくて困っています。
どうすればよいかどなたか教えていただけないでしょうか?
よろしくお願いします。


#include<string>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<GL/glut.h>
#include<math.h>

using namespace std;

unsigned char mouseFlag = GL_FALSE;
int a = 0;
int samplingTime = 50;
int startFlug;
double t = 0.0;
double xStart;
double yStart;
double startFlag;
double yy;
double m1, k1, m2, k2, c1, c2;
double x, x0;


class Omori{

public:

    
    double y, x1, x2, t, w;
    double m, c, k;
    
    Omori();
    
    void zeta(int zeta_num);
    void Hanbetsu(double m, double c, double k);
    void draw(double A, double B, double C, double D, double E, double F);
};


Omori::Omori()
    {
         x = 0.0;
         x0 =0.0;
    }    

void Omori::Hanbetsu(double m, double c, double k)
{
    w = sqrt(k / m);
    y = c / (2 * sqrt(m * k));
    
    if(y > 1) a == 1;
    if(y == 1) a == 2;
    if(y < 1) a == 3;
     
}

void Omori::zeta(int zeta_num)

{
    if(a == 1){                                
            x1 = -y * w + sqrt(y * y - 1) * w;
            x2 = -y * w - sqrt(y * y - 1) * w;
            c1 = (x2 / (x2 - x1)) * x0;
            c2 = (x1 / (x1 - x2)) * x0;
            if(startFlag == 1){
                x = c1 * exp(x1 * t) + c2 *exp(x2 * t);
            
                t += 0.2;
            }else{                                                            
                x = x0;
            }
    glutPostRedisplay();
    }
    else if(a == 2){
            x1 = -w;
            c1 = x0;
            c2 = x0 * w;
            if(startFlag == 1){
                x = (c1 + c2 * t) * exp(x1 * t);
                
            t += 0.2;
            }else{                                                            
                x = x0;
            }
    glutPostRedisplay();
    }else if(a == 3){
        double w, y, q;    
        w = sqrt(k / m);
        y = c / (2 * sqrt(m * k));
        q = w * sqrt(1 - y * y);
        if(startFlag == 1){
            x = exp(-y * w * t) * (x0 * cos(q * t) + ((y * w * x0) / q) * sin(q * t));
            
            t += 0.2;
        }else{                                                        
            x = x0;
        }
    glutPostRedisplay();
    }
}

void Omori::draw(double A, double B, double C, double D, double E, double F)
{
    //glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(A, B, C);
    glBegin(GL_LINES);
        glVertex2d(D, E);
        glVertex2d(x, E);

    glEnd();
    
    glPushMatrix();
        glTranslated(x, E, 0.0);
        glutWireSphere(F, 30, 30);
    glPopMatrix();
    
    glEnd();
    glFlush();
}


Omori om1;
Omori om2;
const int width = 1000, height = 1000;

void myKeyboard(unsigned char key, int x, int y)
{
    cout << "m1:";
    cin >> m1;
    cout << "c1:";
    cin >> c1;
    cout << "k1:";
    cin >> k1;
    cout << "m2:";
    cin >> m2;
    cout << "c2:";
    cin >> c2;
    cout << "k2:";
    cin >> k2;
    
    om1.Hanbetsu(m1, c1, k1);
    om2.Hanbetsu(m2, c2, k2);
    
    if (key == 27 ) exit(0);
    /*if(key == 'a'){
        a = 1;
        x = 0.0;
        x0 = 0.0;
        t = 0.0;
    }
    if(key == 'b'){
        a = 2;
        x = 0.0;
        x0 = 0.0;
        t = 0.0;
    }
    if(key == 'c'){
        a = 3;
        x = 0.0;
        x0 = 0.0;
        t = 0.0;
    }*/
}

void glutDrawString(const char *str,void *font,float A,float B,float C)
{
    glRasterPos3f(0,2,0);
    while(*str){
        glutBitmapCharacter(font, *str);
        ++str;
    }
}

void myDisplay(void)
{
    om1.draw(0.6, 0.0, 0.5, -10.0, 0.8, 0.3);
    om2.draw(0.3, 0.3, 0.3, -10.0, -0.8, 0.3);
}
    

void myInit(char *progname)
{
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(1000, 1000);
    glutInitWindowPosition(0, 0);
    glutCreateWindow(progname);
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (double)width / (double)height, 0.1, 200.0);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
}


void myMouseFunc(int button, int state, int x1, int y1)
{
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        startFlag = 0;                                                        
        t = 0.0;
        x = 0.0;
        x0 = 0.0;
        yy = 0.0;
        xStart = x1;                                                        
        yStart = y1;                                                        
        mouseFlag =GL_TRUE;
    }else{
        mouseFlag = GL_FALSE;
        startFlag = 1;
    }
}


void myMouseMotion(int xx, int yyy)
{
    if(mouseFlag == GL_FALSE) return;
    x0 = 0.055 * (xx-xStart);                                                                                                
    glutPostRedisplay();
}


void myTimer(int value)
{    
    glutTimerFunc(samplingTime, myTimer, 1);
    
    om1.zeta(a);
    om2.zeta(a);
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    myInit(argv[0]);
    glutKeyboardFunc(myKeyboard);
    glutDisplayFunc(myDisplay);
    glutMouseFunc(myMouseFunc);
    glutMotionFunc(myMouseMotion);
    glutTimerFunc(samplingTime, myTimer, 1);
    glutMainLoop();
    return 0;
}


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



Name: 通りすがり  ..上級者(21,808ポイント)   Date: 2010/06/27(日) 17:46   No:55410       
Title: C++について    
はじめまして。情報オリンピックの春合宿の問題の答えが分からず、
http://d.hatena.ne.jp/pon64/
このpageの方のソースを見たのですが、

10行目などのs.insertとはなんですか?
22行目の.c_str()とはなんですか?(著者の方もかいていらっしゃいますが)

自分で調べようと思い検索してみたのですが、よく分かりません。よろしくお願いします。


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


Name: たかぎ [URL]  ..ハッカー(211,738ポイント)   Date: 2010/06/27(日) 19:15   No:55413     
Title: Re:C++について    
std::basic_stringクラステンプレートのリファレンスでも見てください。


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



Name: dic  ..比類無きプログラマー(81,370ポイント)   Date: 2010/06/27(日) 09:16   No:55382       
Title: 3Dゲーム製作について    
色々やりたいことがあり意味もなくいそがしいので
聞くだけになりますが
3Dゲーム製作をしようと将来的には考えています
そこで、行列の変換など3Dプログラミングに必要な数学の知識は何があるでしょうか?
もちろん作る内容にもよると思いますが、3Dプログラミングで基礎的なことです
また、グラフィックも3Dになるので、3Dグラフィックを作成、編集するソフトは
個人で手が出せる範囲内ではどんなソフトがあるのでしょうか?

なかなか3Dゲームの情報は入ってこない もしくは入ってきても理解できないのです


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


Name: TKOZ  ..熟練のプログラマー(67,347ポイント)   Date: 2010/06/27(日) 12:14   No:55387     
Title: Re:3Dゲーム製作について    
私は、「3Dプログラマーのための数学」大川義邦・著、「コンピュータゲームの数学」山北篤・著
「ゲーム開発のための数学・物理学入門」を持っていますが、
とりあえず、ベクトルの内積・外積と行列の掛け算を覚えるべきだと思ってます。

まず、内積ですが、これは、2つのベクトルのX,Y,Z成分をそれぞれ掛け合わせて、足す演算です。
具体的に説明しますと、
A→={0,-1,-3}  B→={2,-3,1}
というベクトルがあるとすると、内積をする場合、
A・Bと書きます。
で、計算手順は、x1*x2 + y1*y2 + z1*z2なので、
0 * 2 + (-1) * (-3) + -3 * 1
= 0 + 3 -3
= 0
という演算です。内積の結果が0の場合は、2つのベクトルのなす角度が90度ぴったりになっている
という状態です。

他に内積で角度を具体的に調べたい場合は、
たとえば、C→={-1,4,2} D→={3,0,5}
の場合、
A・B = |A| |B| * cosθ
という式が成立するので、
まず、内積を調べます。
-1*3 + 4*0 + 2*5
=-3 + 0 + 10
= 7
次に、|A|と|B|ですが、これは、ベクトルAとBの長さを求める演算です。

では、|C|=√(1+16+4)で√21となります。|D|は、√(9+25)=√34となります。

これで、あとは計算するだけです。
A・B = |A| |B| cosθなので、
7    = √21*√34 * cosθです。
7/(√21*√34)=cosθ
θ=cos^-1((7/(√21*√34))なので、
θ=74.81°となります。





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

Name: TKOZ  ..熟練のプログラマー(67,471ポイント)   Date: 2010/06/27(日) 12:29   No:55390     
Title: Re:3Dゲーム製作について    
次に外積です。

この外積は、3次元ベクトルでないと、演算できません。

a→={5 -6 0} b→={1 2 3}
だとすると、aとbの外積は、
a×bと書き、
{ay*bz-az*by az*bx-ax*bz ax*by-ay*bx}で求まります。

つまり、{-6*3-0*2 0*1-5*3 5*2-(-6)*1}となり、
{-18 -15 16}となります。

あと、a×bは、ベクトルaにもベクトルbにも垂直です。



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

Name: TKOZ  ..熟練のプログラマー(67,734ポイント)   Date: 2010/06/27(日) 14:01   No:55395     
Title: Re:3Dゲーム製作について    
ネットカフェより書き込みです。

ちょっと横道逸れますが、ベクトルの正規化について、書きたいと思います。

ベクトルの正規化は、ベクトルの大きさが1になる演算です。
どうやるかというと、ベクトルの大きさで各成分を割ってやればいいのです。

a→={-5,13,√2}というのが、あるとすると、
まず、ベクトルの大きさを求めます。

√(25+169+2)
=14となりますので、これで、各成分を割ります。

{-5/14,13/14,√2/14}
このようになります。
ベクトルの大きさを求めれば1になるはずです。


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

Name: TKOZ  ..熟練のプログラマー(68,242ポイント)   Date: 2010/06/27(日) 14:34   No:55396     
Title: Re:3Dゲーム製作について    
いきなりですが、行列の掛け算に飛びます。
しかし、行列の掛け算は重要です。

なぜ、重要かというと、ゲームプログラミングで行列を色々変換させる時に、
行列の掛け算が使われるからです。

まず、行列とは何かというと、
┏   ┓
┃0 1 2 ┃
┃3 4 5 ┃
┃6 7 8 ┃
┗   ┛
こんな形と数列をしたものを言います。
実は、ベクトルは、1行の行列ともいえます。

で、行列の掛け算ですが、
┏   ┓ ┏ ┓
┃0 1 2┃ ┃5 ┃
┃3 4 5┃*┃3 ┃    
┗   ┛ ┃1 ┃
     ┗ ┛
2行3列      3行1列

A行B列 *    C行D列
とすると、BとCが一致していないと行列の掛け算はできません。
また、掛け算した後に出来る行列は、A行D列となります。

で、掛け算の仕方ですが、ちょっと複雑です。
┏        ┓
┃0*5 + 1*3 + 2*1 ┃
┃3*5 + 4*3 + 5*1 ┃
┗        ┛
こんな形になります。

┏      ┓
┃0  + 3 + 2 ┃
┃15 +12 + 5 ┃
┗      ┛

┏ ┓
┃5 ┃
┃32┃
┗ ┛

こんな感じです。

  編集済み


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

Name: fr  ..ぴよぴよ(68ポイント)   Date: 2010/06/27(日) 15:47   No:55403     
Title: Re:3Dゲーム製作について    
>グラフィックも3Dになるので、3Dグラフィックを作成、編集するソフト
メタセコイアというのが有名ですね。フリー版もあります。


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

Name: Justy  ..伝説なるハッカー(552,205ポイント)   Date: 2010/06/27(日) 15:51   No:55404     
Title: Re:3Dゲーム製作について    
>必要な数学の知識は何があるでしょうか
 ざっくりとですけど数学としては

・ 中学・高校レベルの数学
 三角関数、微積分など

・ ベクトル
 基本的な演算
 内積・外積
 正規化
 長さ

・ 行列
 移動・回転・拡縮
 アフィン変換
 逆行列・転置

・ クォータニオン
 行列との変換
 各種演算

・ 幾何学
 点と直線の距離等
 ベクトルのなす角度
 各種交差・衝突判定
 法線

・ 補完
 線形
 各種スプライン

とかでしょうか(細かく見ていけば他にもありそうです)。
 物理の方も含めるなら各種運動方程式とか力学とか。

 数学の知識といっても結構ライブラリの機能として用意されているモノもあるので、必ずしも自分で計算できる必要は
ないですがやはり理解は必要になります。
 特にベクトルと行列は。
 まぁこの2つに関して言えば2Dでも出てくる話なので2Dで理解していれば3Dでもさほど難しくないでしょうけど。



>グラフィックも3Dになるので、3Dグラフィックを作成、編集するソフトは 
>個人で手が出せる範囲内ではどんなソフトがあるのでしょうか
 個人で手が出せるかどうかの基準は人それぞれですが、ほとんどのソフトは個人でも手は出せると思います。
 最初はフリーの Metasequoiaか Blenderあたりとかがいいんじゃないかと。

クラス別 3D グラフィックソフトの傾向
http://3dcg.homeip.net/3d_products/

定番 フリー・シェアウェアの 3D グラフィックソフトの紹介
http://3dcg.homeip.net/3d_products/free_shareware/


# あ、アニマスもう無いんだ……。


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

Name: dic  ..比類無きプログラマー(81,405ポイント)   Date: 2010/06/27(日) 19:10   No:55412 解決!     
Title: Re:3Dゲーム製作について    
たくさん返答ありがとうございます
保存してゆっくり読みたいと思います


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



Name: Revell  ..ぴよぴよ(197ポイント)   Date: 2010/06/27(日) 01:50   No:55373       
Title: i=i+1,i+=1,++i,i++の違い    
こんにちは。

最近すごく気になっているのですが、
i=i+1;
i+=1;
++i;
i++;
上の4つのステートメントの中で処理速度が一番速いものは一体どれなのでしょうか?

for文内などでカウンタとして使用する場合、多くのCやC++の書籍ではi++という後置型が用いられているようですが、i++が一番処理効率がよいということなのでしょうか。

少し調べてみますと、CPUによってはマシン語の命令の中に前置型か後置型の一方が設けられていることがあるので(インクリメントの場合は後置型)、i++を用いた方がよいというようなことが書いてありました。

僕の考えとしてはコンパイラによって最適化される際に全部同じように解釈されるのかな、という感じです。

状況としては、iは整数型で、単純に整数定数の1を加算するだけの処理についてです。
また、言語はCとC++、両方の場合について教えてほしいです。
ご回答よろしくお願いします。


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


Name: y  ..初心者(6,833ポイント)   Date: 2010/06/27(日) 02:15   No:55374     
Title: Re:i=i+1,i+=1,++i,i++の違い    
コンパイラの最適化によっては、いずれも殆ど同じなります。
ただし後置きインクリメントは一時変数を作るので、基本的に遅いです(コンパイラ依存)。

前置きは、単純にi+=1をしていますが、
後置きは、一旦値をどこかに退避させて、それからi+=1してから、退避させた値を返します。

といっても、潤沢な環境に於いては微々たる違いだと思います。


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

Name: ムンバ  ..初心者(7,610ポイント)   Date: 2010/06/27(日) 02:38   No:55375     
Title: Re:i=i+1,i+=1,++i,i++の違い    
こんばんは。

>>i=i+1; 
>>i+=1; 
>>++i; 
>>i++;

同じ条件で、各速度を計るソース(ファイル)を4種類作ってみて
各ファイルで、それぞれ何度も計測してみては如何でしょうか?


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

Name: Revell  ..ぴよぴよ(633ポイント)   Date: 2010/06/27(日) 03:25   No:55376     
Title: Re:i=i+1,i+=1,++i,i++の違い    
>>yさん
ご回答ありがとうございます。
では、
i=i+1,i+=1,++i
この3つはすべて同じ処理過程を踏む、ということでよろしいでしょうか。

また、CとC++は特に区別する必要なく、両言語とも内部処理は同じだということでしょうか。

>潤沢な環境に於いては微々たる違いだと思います
そうですね。実際にこのような加算の速度がプログラム全体の実行効率に影響を及ぼすようなことはまずないでしょうが、ふと気になった次第です。


>>ムンバさん
ご回答ありがとうございます。
そうですね。実はそれはもうやってみたのですが、計測のたびに結果が異なるので、おそらく数ミリ秒単位では計れないほどに微々たる差なのではないかと思います。
精密な測定環境でもあれば話は別ですが、マルチタスク処理を行っているWindowsでは無理なのかなと思いました。
また、計測時間を膨大に取れば可能でしょうが、そこまでするよりも理論を知ったほうが早いと思い、質問させていただいた次第です。


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

Name: 組木紙織  ..比類無きプログラマー(87,891ポイント)   Date: 2010/06/27(日) 08:58   No:55381     
Title: Re:i=i+1,i+=1,++i,i++の違い    
i=i+1;とi+=1;は規格上は同じとみなしたはずなので、計算速度に違いはないかと思います。
i+=1;と++i;は規格上同じとみなしたがどうか覚えていませんが、同じ動作だと思います。
yさんが言ってるのも考えると、
i=i+1;とi+=1;と++i;は同じ速度で、i++;だけが少し遅くなると思います。

今回の場合単純な場合は最適化されて違いは出てこないとおもいます。



実際にアセンブラを見てみると(Debugモードで)
今回のようなすべて単独で使われる場合だとすべて同じのが出力されたので、
速度に違いは一切ないです。
Releaseモードだと
int i=5;
と同等のアセンブラに最適化されてしまったので今回は考えていません。
#何時も思うけど最適化ってすごいですね。

環境VS2005,OS:Vista

//ソースプログラム
#include <iostream>
int main()
{
    int i=1;
    i=i+1;
    i+=1;
    i++;
    ++i;
    std::cout << i<< std::endl;
    return 0;
};
//出力されたアセンブラの一部
_main    PROC                        ; COMDAT

; 4    : {

    push    ebp
    mov    ebp, esp
    sub    esp, 204                ; 000000ccH
    push    ebx
    push    esi
    push    edi
    lea    edi, DWORD PTR [ebp-204]
    mov    ecx, 51                    ; 00000033H
    mov    eax, -858993460                ; ccccccccH
    rep stosd

; 5    :     int i=1;

    mov    DWORD PTR _i$[ebp], 1

; 6    :     i=i+1;

    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax

; 7    :     i+=1;

    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax

; 8    :     i++;

    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax

; 9    :     ++i;

    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax


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

Name: たかぎ [URL]  ..ハッカー(211,709ポイント)   Date: 2010/06/27(日) 09:47   No:55383     
Title: Re:i=i+1,i+=1,++i,i++の違い    
CINTのようなインタープリタ環境まで考えるなら、おそらく ++i が最も高速になるかと思います。
インタープリタでは実行時にソースの字面を解釈するので、構成する文字数が最も少なく、構文木が最も単純になるのが ++i だからです。

整数型以外、例えば反復子を考えるのであれば、やはり ++i が最も高速になります。
一時オブジェクトが生成されることがないのと、仮引数が最も少ないことが理由です。


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

Name: Revell  ..ぴよぴよ(883ポイント)   Date: 2010/06/27(日) 14:43   No:55397 解決!     
Title: Re:i=i+1,i+=1,++i,i++の違い    
>>組木紙織さん
ご回答ありがとうございます。
アセンブリレベルで解析すれば確かに同じだということが見て取れました。
iは整数型として単純にカウンタとして用いるような場合は違いはない、ということですね(コンパイラがVS2005の場合)。
組木紙織さんが試された言語はC++のようだったので、僕はCで同様にアセンブリコードを出力させたところ、4つのステートメントは全て同じように翻訳されていました。

参考になりました。
ありがとうございました。


>>たかぎさん
ご回答ありがとうございます。
インタプリタ環境では++iが最も高速になるかもしれないということですね。
参考にさせてもらいます。

C++で反復子を用いる際は前置型を使用したほうがよいということですね。
反復子を用いる場合は意識してみたいと思います。
参考になりました。
ありがとうございました。


ご回答くださったみなさん、ありがとうございました。
解決しました。


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



Name: リーじゅ  ..ぴよぴよ(87ポイント)   Date: 2010/06/27(日) 00:21   No:55368       
Title: スクロール    
こんばんわ。
初めて質問させていただきます。

早速ですが、アクションゲームを作っていて、キャラを中心としてマップの障害物を動かしたいのですが、プログラミングをどうすればいいのでしょうか?

お願いします。 編集済み


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


Name: わふー  ..入門者(2,818ポイント)   Date: 2010/06/27(日) 04:44   No:55379     
Title: Re:スクロール    
こんばんは。

if ( マップの障害物を動かしたい ){
 マップの障害物を動かす();
}

こんな感じでどうでしょう!


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

Name: Tatu  ..熟練のプログラマー(41,573ポイント)   Date: 2010/06/27(日) 10:32   No:55384     
Title: Re:スクロール    
私ならばスクロール時に全ての物体の座標を変化させるのは面倒なので
画面の左上の座標を記録する変数を用意し、
キャラクターの動きに応じて値が変わるようにします。

そして、描画関数の引数の座標を
(物体の座標)-(画面の左上の座標)とします。

キャラクターの動きに合わせてカメラを動かすようなものだと思ってください。


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

Name: TKOZ  ..熟練のプログラマー(66,871ポイント)   Date: 2010/06/27(日) 11:37   No:55386     
Title: Re:スクロール    
こんな感じでどうでしょう。
マップエディタは、C+WINAPIか、C#で作るか、フリーのものを使うとして、
Map[20][300];にマップチップ番号を代入してあげてください。

#define CHIP_SIZE 16
#define MAX_BLOCKX CHIP_SIZE*20
#define MAX_BLOCKY CHIP_SIZE*300
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320 

typedef struct Map_{
    int ChipNumber;    //マップチップ
    int ChipNumber2;    //マップチップ2
    int EnemyNumber;    //敵の番号(例:Map[0][0].EnemyNumber=1)
}Map_;

Map_ Map[20][300];

//初期化関数
void Init()
{
    FILE *fp;
    
    fp=fopen("./data/mapdata01.txt","r");
    
    for(i=0;i<300;i++){
        for(j=0;j<20;j++){
            if(j!=20)
            fscanf(fp,"%d,",&Map[j][i].ChipNumber);
            else
            fscanf(fp,"%d",&Map[j][i].ChipNumber);
        }
    }
}

//スクロールを計算する関数
void CalcScroll(void)
{
    
    //キャラクターが画面の中心にくるようにする
    sx=Player.x-(SCREEN_WIDTH/2);
    //sy=Player.y-(SCREEN_HEIGHT/2);

    //sxが0より小さいなら0にする。(それ以上下がらないようにする)
    if(ScrollX<0) ScrollX=0;
    if(ScrollY<0) ScrollY=0;
    if(ScrollX>(MAX_BLOCKX)-SCREEN_WIDTH) ScrollX=(MAX_BLOCKX)-SCREEN_WIDTH;
    if(ScrollY>(MAX_BLOCKY)-SCREEN_HEIGHT) ScrollY=(MAX_BLOCKY)-SCREEN_HEIGHT;
    
}

//背景を描画する関数
void DrawBG()
{
    int StartX=ScrollX/CHIP_SIZE,StartY=ScrollY/CHIP_SIZE;
    int EndX=(ScrollX+SCREEN_WIDTH-1)/16,EndY=(ScrollY+SCREEN_HEIGHT-1)/16;

    for(int i=StartY;i<=EndY;i++)
    {
        for(int j=StartX;j<=EndX;j++)
        {
            //マップチップを描画する
            DrawChip(Map[j][i].ChipNumber,j*CHIP_SIZE-ScrollX,i*CHIP_SIZE-ScrollY);
            
        }
    }
}


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



Name: 初心者  ..熟練のプログラマー(49,109ポイント)   Date: 2010/06/26(土) 15:36   No:55320       
Title: 定積分について    
#include <stdio.h>
#include <math.h>

/* 関数の定義 */
double func1(double x);
/* 台形公式 */
double traqezoidal( double a, double b, int n, double (*f)() );
/* sinの定義 */
double sin(double x);
/* π/2の定義 */
double M_PI_2;

int main(void)
{
    int n=100;

    printf("sqrt[5]*1/(4 + sin^2(x))) を [0,π/2]で積分します。分割数は%dです    /n", n);
    printf("結果は%20.15fです/n", trapezoidal(0.0, M_PI_2, n, func1) );

    return 0;
}

/* 台形式 */
double traqezoidal( double a, double b, int n, double (*f)() )
{
    double T, h;
    int i;

    h =( b - a ) /n ; /* 刻み幅の指定 */

    /* 台形公式 */
    T = ( (*f)(a) + (*f)(b) ) / 2.0;
    for ( i = 1; i< n; i++) T += (*f)( a + i*h );
    T *= h;

    /* π/2の定義 */
    M_PI_2 = 1.57079632679489661923;


    return T;
}

/* 関数の定義 */
double func1(double x)
{
    return(  1.0 / (4 + sin^2(x)) );
}


上のソースをコンパイルすると
(46):error C2297: '+':無効です。右オペランドには型 'double (_cdecl *)(double)'が指定されています。
(46):error C2064: -22 引数を取り込む関数には評価されません。
(46):warning C4033: 'func1' : 関数には戻り値が必要です。
と出ます。

どこを直せば良いのか教えて教えてほしいです。


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


Name: asdf  ..入門者(4,847ポイント)   Date: 2010/06/26(土) 15:45   No:55321     
Title: Re:定積分について    
sin^2(x) は sin(x) * sin(x)に

printf("結果は%20.15fです/n", trapezoidal(0.0, M_PI_2, n, func1) ); 

のtrapezoidalをtraqezoidalに

あとは、関数へのポインタの(*f)()を(*f)(double)

とすればよいと思います。


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

Name: asdf  ..入門者(4,901ポイント)   Date: 2010/06/26(土) 15:47   No:55322     
Title: Re:定積分について    
sin^2(x)というのは、
double func1(double x) 

    return(  1.0 / (4 + sin^2(x)) ); 


のところのことです


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

Name: 初級者  ..初心者(8,218ポイント)   Date: 2010/06/26(土) 16:32   No:55327     
Title: Re:定積分について    
誤:traqezoidal
正:trapezoidal


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

Name: もぐりん  ..かけだし(1,045ポイント)   Date: 2010/06/26(土) 19:03   No:55347     
Title: Re:定積分について    
こちらの掲示板にも回答が付いていますが・・・。

http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+33696



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

Name: 初心者  ..熟練のプログラマー(49,193ポイント)   Date: 2010/06/27(日) 10:56   No:55385     
Title: 謝罪    
すいません。
マルチポストを行ってしまい大勢の方に迷惑を掛けてしまいました。
自分の作ったソースが間違っていた場合、指摘していただきたいと思いますので今後もよろしくお願いいたします。


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



Name: asdf  ..入門者(4,765ポイント)   Date: 2010/06/26(土) 15:14   No:55319       
Title: 多重リスト    
商品管理簿を多重リストを使って作れ.
商品管理簿は,以下のデータからなるものとする.

顧客番号,顧客氏名,顧客電話番号,受注した商品の個数,出荷した商品の個数.

1)作成した商品管理簿に対し,商品の発送,新規商品の追加,廃番商品の削除,
顧客の登録,削除,新規商品の受注ができること.

2)商品ごとの受注量,出荷量,受注残量,顧客ごとの受注個数,受注残個数が計
算できること.

という問題で、「cプログラマのためのアルゴリズムとデータ構造」という本を参考に作ったのですが、削除の段階で躓いてしまいました。
Insert関数が変な追加の仕方をしているため、どう削除すればよいか分からなくなってしまいました。
(このInsert関数は、この本にのっている例をほとんど写しただけのものなのですが・・・)


自分が作ったプログラムは、少し長いので添付しました。
月曜日までに終わらせないといけません・・・
どうかご助力をお願いします。 編集済み


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


Name: ぽこ  ..上級者(17,892ポイント)   Date: 2010/06/26(土) 16:42   No:55328     
Title: Re:多重リスト    
2つ質問があります。

・データ構造に関する指定はありました?
・発送の所で失敗しているケースがありますが、問題文のどの箇所からこの処理が必要だと判断しました?


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

Name: asdf  ..初心者(5,061ポイント)   Date: 2010/06/26(土) 16:53   No:55330     
Title: Re:多重リスト    
>データ構造に関する指定はありました?

どういう意味でしょうか。多重リストというのがデータ構造なのではないでしょうか。

>発送の所で失敗しているケースがありますが、問題文のどの箇所からこの処理が必要だと判断しました?

受注残があるということから、受注分だけ発送できないときがあるということになります。
実際に発送できる量をいちいち入力するのが面倒だったので、rand関数を使っています。 編集済み


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

Name: asdf  ..初心者(5,117ポイント)   Date: 2010/06/26(土) 16:58   No:55333     
Title: Re:多重リスト    
添付プログラムの、構造体KANRIの説明が双方向になっていますが、あれは、最初は双方向で作ろうとしたのをやめたのに消すのを忘れていたからです。ということで、あのコメントは無視してください。

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

Name: ぽこ  ..上級者(18,190ポイント)   Date: 2010/06/26(土) 17:00   No:55334     
Title: Re:多重リスト    
> どういう意味でしょうか。多重リストというのがデータ構造なのではないでしょうか。

リストの要素(リストのポインタを除く)に関する指定です。

> 受注残があるということから、受注分だけ発送できないときがあるということになります。
> 実際に発送できる量をいちいち入力するのが面倒だったので、rand関数を使っています。

受注残って、単純に発送していない受注のことではないでしょうか?


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

Name: asdf  ..初心者(5,280ポイント)   Date: 2010/06/26(土) 17:07   No:55335     
Title: Re:多重リスト    
指定は特にないです。問題文に書かれていることがすべてです。

>受注残って、単純に発送していない受注のことではないでしょうか?

今までの累計受注が受注量で、発送していない受注が受注残量ということでしょうか。
確かにそうかもしれませんね。

とりあえず、発送のところは直しておきます。

今は、削除(または、Insert関数)のところだけお願いします。 編集済み


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

Name: ぽこ  ..上級者(18,250ポイント)   Date: 2010/06/26(土) 17:29   No:55338     
Title: Re:多重リスト    
> 今は、削除(または、Insert関数)のところだけお願いします。

すみません、横道にそれちゃいましたね。

Insert()は問題ないと思います。

配列syohin[]の該当するデータのリストslinkを順々辿り、各要素(struct KANRI構造体) に対して
 0.(単方向リストなら)自要素の顧客方向へのリストに関して前の要素を取得する。
 1.顧客方向へのリストで自要素の前と後ろを連結する。
 2.自要素を解放する。
を行えば良いです。
#双方向リストだと、0の処理は不要です。

別件で、商品の削除ですが、それまでの受注情報どうしますか?
商品を削除する際に
 1.受注残データが残っていたら、削除できないようにする。
 2.受注データが残っていたら、受注データももろとも消す(注文がなかったことになる)。


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

Name: asdf  ..初心者(6,557ポイント)   Date: 2010/06/26(土) 17:41   No:55339     
Title: Re:多重リスト    
>Insert()は問題ないと思います。

問題があると思うのですが・・・
こう思う理由は、以下のようにした場合です。(見づらいですが、よろしくお願いします)

ーー実行結果ーー

商品管理簿
何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 1

商品の受注を行います
顧客番号を入力> 0
商品番号を入力> 2
注文個数を入力> 39

何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 1

商品の受注を行います
顧客番号を入力> 0
商品番号を入力> 0
注文個数を入力> 39

何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 1

商品の受注を行います
顧客番号を入力> 0
商品番号を入力> 1
注文個数を入力> 30

何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 8
顧客番号0番     Sato Taro (tel:00-220-22)
Xbox    :   30個注文    0個受取 (  30個の受注残があります)
Wii     :   39個注文    0個受取 (  39個の受注残があります)
PS3     :   39個注文    0個受取 (  39個の受注残があります)

合計: 108個の注文 108個の受注残

顧客番号1番     Kato Taro (tel:389-2-323)

合計: 0個の注文 0個の受注残

顧客番号2番     Tanaka Taro (tel:378-2823-2)

合計: 0個の注文 0個の受注残


何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 1

商品の受注を行います
顧客番号を入力> 0
商品番号を入力> 1
注文個数を入力> 33

何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 1

商品の受注を行います
顧客番号を入力> 0
商品番号を入力> 0
注文個数を入力> 33

何をしますか?
商品の受注:1 商品の発送:2 新規商品の追加:3 新規顧客の登録:4
商品の削除:5 顧客の削除:6 商品毎の表示(受注量 出荷量 受注残量):7
顧客毎の表示(受注個数 受注残個数):8 > 8
顧客番号0番     Sato Taro (tel:00-220-22)
Wii     :   33個注文    0個受取 (  33個の受注残があります)
Xbox    :   33個注文    0個受取 (  33個の受注残があります)
Xbox    :   30個注文    0個受取 (  30個の受注残があります)
Wii     :   39個注文    0個受取 (  39個の受注残があります)
PS3     :   39個注文    0個受取 (  39個の受注残があります)

合計: 174個の注文 174個の受注残

顧客番号1番     Kato Taro (tel:389-2-323)

合計: 0個の注文 0個の受注残

顧客番号2番     Tanaka Taro (tel:378-2823-2)

合計: 0個の注文 0個の受注残

ーー実行結果ここまでーー

Wiiの商品番号は、0
Xboxは、1
PS3は、2
です。
本来なら、Wii→Xbox→PS3の順番で計3個出ないといけないのに、このようになってしまいます。
そもそも、1回目の表示で、Xbox→Wii→PS3となっている時点でおかしいです。


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

Name: asdf  ..初心者(6,884ポイント)   Date: 2010/06/26(土) 17:45   No:55340     
Title: Re:多重リスト    
>配列syohin[]の該当するデータのリストslinkを順々辿り、各要素(struct KANRI構造体) に対して 
 0.(単方向リストなら)自要素の顧客方向へのリストに関して前の要素を取得する。 
 1.顧客方向へのリストで自要素の前と後ろを連結する。 
 2.自要素を解放する。 
を行えば良いです。


このアルゴリズム自体はわかっているのですが、上記の理由のため、どう実装したらよいかわかりませんでした・・・

>商品を削除する際に 
 1.受注残データが残っていたら、削除できないようにする。 
 2.受注データが残っていたら、受注データももろとも消す(注文がなかったことになる)。


なるほど。確かにそうしたほうが良いですね。
時間があればやってみます。


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

Name: ぽこ  ..上級者(17,997ポイント)   Date: 2010/06/26(土) 20:11   No:55351     
Title: Re:多重リスト    
> このアルゴリズム自体はわかっているのですが、上記の理由のため、どう実装したらよいかわかりませんでした・・・

大体、問題はわかりました。
話をすすめる上で、以下を前提として置かせてください。
 ・構造体KANRIは顧客kと商品sの受注状況、発送状況を格納する。
 ・上記kとsのペアは、管理簿の中で1つしか存在しない。
  (なので注文履歴は出せません。/私はさっきまで複数あってもOKと前提を置いていました。)
 ・他の関数群に関しては、修正しない。

以上を前提とした場合、Insert(k,s,val)関数は、次のようになります。
1.顧客kのリストから商品sの注文を検索する(KANRI構造体を取得する)
 1.1商品sの注文がない場合
  1.1.1構造体KANRIのオブジェクトを作成する。
  1.1.2作成したKANRI構造体を商品sの顧客情報リストに追加する。
  1.1.3作成したKANRI構造体を顧客kの商品情報リストに追加する。

2.受注数にvalを足す。

とします。
ポイントは1.1.2と1.1.3で、これらのリストに追加する際に、ソートされた状態で追加します。
1.1.2では顧客番号順に並ぶように追加する場所を選び、1.1.3では商品番号順に並ぶように追加する場所を選びます。



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

Name: asdf  ..初心者(7,006ポイント)   Date: 2010/06/27(日) 05:35   No:55380 解決!     
Title: Re:多重リスト    
  1.1.2作成したKANRI構造体を商品sの顧客情報リストに追加する。 
  1.1.3作成したKANRI構造体を顧客kの商品情報リストに追加する。 

の方法でなんとか作れました。

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

何故かエラーが出まくり、今までかかってしまいました(笑)



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



Name: タマ  ..かけだし(1,255ポイント)   Date: 2010/06/26(土) 22:31   No:55355       
Title: ファイルの読み取り    
↓のプログラムは、名前、学生番号、年齢、メールアドレスを入力して
同じ場所にあるmyinfo.txtに情報を保存するプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILENAME "myinfo.txt"
int main(void)
{
char name[100];
char number[100];
char age[100];
char address[100];
FILE *fp;
fp=fopen(FILENAME, "w");
printf("Your name, please:\n");
fgets(name,sizeof(name),stdin);
printf("Your student number, please:\n");
fgets(number,sizeof(number),stdin);
printf("Your age, please:\n");
fgets(age,sizeof(age),stdin);
printf("Your e-mail address, please:\n");
fgets(address,sizeof(address),stdin);
fprintf(fp,"%s",name);
fprintf(fp,"%s",number);
fprintf(fp,"%s",age);
fprintf(fp,"%s",address);
fclose(fp);
return(0);
}

このプログラムに変更を加えて、myinfo.txtにある情報を読み込み出力するプログラムを作るのに困ってます。
fopenの"w"を"r"に変える事、fscanf、fgetsを用いる事がヒントに書かれてました。


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


Name: ぽこ  ..上級者(18,045ポイント)   Date: 2010/06/26(土) 22:42   No:55357     
Title: Re:ファイルの読み取り    
このままじゃ、課題の丸投げになっちゃうので、規約等を参考に不明点を掘り下げてください。

#それはそうと、上のプログラムで保存したデータは、名前、電話番号、年齢、住所の区別が
#つかなくなる気がするんですが。。


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

Name: タマ  ..かけだし(1,312ポイント)   Date: 2010/06/26(土) 22:55   No:55360     
Title: Re:ファイルの読み取り    
すみませんでした。
分からない部分はまさにそこで、fscanfを使った後にfgetsを使えと書いてあるのですが、
区別の仕方が良く分からないんです。


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

Name: シエル  ..上級者(16,162ポイント)   Date: 2010/06/26(土) 23:01   No:55361     
Title: Re:ファイルの読み取り    
fgetsで一行ずつ読み込んで表示すればいいのではないでしょうか?

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

Name: ぽこ  ..上級者(18,335ポイント)   Date: 2010/06/26(土) 23:16   No:55363     
Title: Re:ファイルの読み取り    
> #それはそうと、上のプログラムで保存したデータは、名前、電話番号、年齢、住所の区別が
> #つかなくなる気がするんですが。。

上の発言取り消します。

>分からない部分はまさにそこで、fscanfを使った後にfgetsを使えと書いてあるのですが、

「fscanf 例 C言語」や「「fgets 例 C言語」」辺りをキーワードにググッてみては?

#自分で例を書いちゃうと、まんま答えになっちゃいそうなので。


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

Name: タマ  ..かけだし(1,690ポイント)   Date: 2010/06/27(日) 00:36   No:55369     
Title: Re:ファイルの読み取り    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILENAME "myinfo.txt"
int main(void)
{
char name[100];
char number[100];
char age[100];
char address[100];
FILE *fp;
fp=fopen(FILENAME, "r");
fscanf(fp,"%d",&name);
fscanf(fp,"%d",&number);
fscanf(fp,"%d",&age);
fgetc(fp);
fscanf(fp,"%d",&address);

fprintf(fp,"My name:%s\n",name);
fprintf(fp,"My student number:%s\n",number);
fprintf(fp,"My age:%s\n",age);
fprintf(fp,"My e-mail address:%s\n",address);
fclose(fp);
return(0);
}
途中経過です。コンパイルしても何も出てきません。
あと、fgetsを入れるようにしたいのですが、どこに入れるべきでしょうか?


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

Name: box  ..ハッカー(154,849ポイント)   Date: 2010/06/27(日) 01:00   No:55370     
Title: Re:ファイルの読み取り    
> fp=fopen(FILENAME, "r");
> fprintf(fp,"My name:%s\n",name);
> fprintf(fp,"My student number:%s\n",number);
> fprintf(fp,"My age:%s\n",age);
> fprintf(fp,"My e-mail address:%s\n",address);

読み込み用にオープンしたファイルに書き込もうとしているので、
考え方が破綻しています。
また、途中にある

> fgetc(fp);

この文の意味が不明です。 編集済み


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

Name: シエル  ..上級者(16,202ポイント)   Date: 2010/06/27(日) 01:01   No:55371     
Title: Re:ファイルの読み取り    
fscanfやfgetc等の使い方をもう少し調べてみて下さい。
別にfgetsだけでも書けると思います。


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

Name: タマ  ..かけだし(1,991ポイント)   Date: 2010/06/27(日) 01:40   No:55372 解決!     
Title: Re:ファイルの読み取り    
int main(void)
{
char name[100];
char number[100];
int age;
char address[100];
FILE *fp;
fp=fopen(FILENAME, "r");
fgets(name,sizeof(name),fp);
fgets(number,sizeof(number),fp);
fscanf(fp,"%d",&age);
fgetc(fp);
fgets(address,sizeof(address),fp);

printf("My name: %s",name);
printf("My student number: %s",number);
printf("My age: %d\n",age);
printf("My e-mail address: %s",address);
fclose(fp);
return(0);
}
自力で解決しました。
ageの部分にintを用いつつ、fgetsとfscanfを両方使いfscanfで読み込めなかった改行部分を
fgetcで省く、つもりのプログラムでした。
説明と理解力でした、すみません。


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



Name: ムンバ  ..比類無きプログラマー(75,261ポイント)   Date: 2010/06/23(水) 01:02   No:55115       
Title: 昇進状態について(雑談)    
こんばんは。

私の昇進状態を「中級者」にして頂きたいのですが、可能でしょうか?^^;

現在、こちらの掲示板では「比類無きプログラマー」になってますが
何度も言っている様に、ほとんど聞くだけのプログラマーです。
たまに、解説とかさせて頂いてますが、ほとんど見当違いですし。<自爆

「比類無きプログラマー」として、こちらの掲示板で質問しにくくなってしまっています。

・気にしないで今まで通り、質問させて頂いても宜しいのでしょうか?
・今後、名前を変えて改めて、質問させて頂いた方が宜しいのでしょうか?

相変わらず勝手ながら、寝てしまいます。
ご指摘など御座いましたら、宜しくお願い致します。

---修正・追加---
私の言う「中級者」は、自己判断です。
たぶん、私は中級の下だと思っています。
勝手ながら寝ます。
おやすみなさい。(∪。∪)。。。zzzZZ 編集済み


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,225,900ポイント)   Date: 2010/06/23(水) 07:42   No:55124     
Title: Re:昇進状態について(雑談)    
ムンバさん

全くかまいませんが、このようなケースもあるのですね^^;
では単純に減らすというのではなく、別の所にポイントをお預かりするということでどうでしょう。

将来「ポイントを返してほしい」という事になればお返しします。
ポイント数ですが、キリのいい所で7万ポイントでいかがでしょう?

しかし最初の頃はすぐにランクアップするように作ってあるので、
雑談などに参加されているだけですぐにまたランクアップしてしまうとおもいます。
文字数に応じてポイントが入るので、ムンバさんは特にポイントが沢山入るのでしょうね^^;

ポイントシステムについてですが、
質問で得られるポイントと回答で得られるポイントは分けた方がいいのかもしれませんね〜;


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

Name: 山崎  ..熟練のプログラマー(44,977ポイント)   Date: 2010/06/23(水) 08:25   No:55126     
Title: Re:昇進状態について(雑談)    
おはようございます〜。

私も質問と雑談しかしないので、ポイントはそこそこ高いですが
プログラマとしての技術はそんなに高くありません ^^;

私もよく「こんな実力しかないのに、見合わない昇進状態かな?」とたまに思いますが、
プログラマとしての技術うんぬんよりも、よく掲示板に来てるかどうかという部分に主眼を置く
昇進状態だと思っていますので、たいして気にしていませんでした。
他の人から見たとき、「あ、この人はこの掲示板によく来てる人なんだな」とわかれば、
まぁ何かしらのプラスにはなると思っております(具体的にどう役立つかはわかりませんけれど)。

でも回答のポイントと質問のポイントを分けるってのはいい案かもしれませんね。

私もホントは回答のほうに参加したいのですが、
間違ったことを教えてしまうのが怖くて、なかなか投稿ボタンを押すことができません。 ^^;
学校で教わった事や自分の理解が、実は簡単に噛み砕かれていて、厳密には正確でない、
という事態も多いのではないかという懸念もあります。
学校の課題レベルならば厳密な正確さを求める必要はないのかも、と思っていますが、
それでもやはり躊躇してしまいますね〜。

あ、またポイントを稼いでしまいました ^^;


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

Name: ムンバ  ..初心者(5,545ポイント)   Date: 2010/06/23(水) 11:39   No:55138 解決!     
Title: Re:昇進状態について(雑談)    
おはようございます!

Dixqさん、山崎さん、お心使いありがとうございます。

>>文字数に応じてポイントが入るので、ムンバさんは特にポイントが沢山入るのでしょうね^^;
 
 そうなんですよね。
 もっと要点をまとめて書けばいいのですが
 いつも日記みたいになってしまい。^^;

お二人のおっしゃる、ポイントを分ける。
なのですが、Dixqさんにも、書き込みされる方にも負担になるかもしれませんし
その辺りは、どうなのでしょうか?

>>昇進状態だと思っていますので、たいして気にしていませんでした。 
>>他の人から見たとき、「あ、この人はこの掲示板によく来てる人なんだな」とわかれば、 
>>まぁ何かしらのプラスにはなると思っております

 私も全然気にしてなかったのですが
 比類なき・・・になった時に「あれっ?こんなんでいいのか?」
 って思いはじめました。
 
お二人のご意見を参考に、自分勝手ではありますが
もう少し考えさせて下さい。
とりあえず、一旦解決とさせて頂きます。

dixqさん、山崎さん
相談にのって頂きありがとうございました。
また、何度も読み返して考えて見ます。
失礼しました。

---編集・追記---
おおっ!初心者からスタートになってますねっ!
これで悩まずに済みました。^^
また、意欲?が沸いてきました。
お手数お掛けしました。
どうもありがとう御座いました! 編集済み


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

Name: しろ  ..中級者(13,665ポイント)   Date: 2010/06/26(土) 13:56   No:55313     
Title: Re:昇進状態について(雑談)    
すいません。
私はぴよぴよにしてもらっていいですか?

数学の話になるとつい書き込んでしまうのですが、プログラミングは素人以下ですので。

ポイントもしばらくは加算されないようにしていただけますと助かります。

お手数をおかけしますが、何卒よろしくお願いいたします。


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

Name: シエル  ..上級者(15,812ポイント)   Date: 2010/06/26(土) 14:16   No:55315     
Title: Re:昇進状態について(雑談)    
ポイントはポイントで加算して表示するだけにしといて、
ランクは自分で選択できるようにしてくれた方がいいかな〜


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

Name: ぽこ  ..上級者(17,718ポイント)   Date: 2010/06/26(土) 15:50   No:55323     
Title: Re:昇進状態について(雑談)    
> では単純に減らすというのではなく、別の所にポイントをお預かりするということでどうでしょう。
(略)
> 将来「ポイントを返してほしい」という事になればお返しします。

これが可能だということは、その逆、つまりポイントの前借りも可能ってことですかね?


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

Name: 御津凪 [URL]  ..ハッカー(143,054ポイント)   Date: 2010/06/26(土) 15:58   No:55324     
Title: Re:昇進状態について(雑談)    
しろさん
> ポイントはポイントで加算して表示するだけにしといて、
> ランクは自分で選択できるようにしてくれた方がいいかな〜

シエルさん
> ポイントもしばらくは加算されないようにしていただけますと助かります。 


そうなると、掲示板の機能にユーザーページのような項目を作らないといけませんね。
いちいち管理人さんに問い合わせると管理人さんが大変ですし。

そうなれば、本格的なフォーラム掲示板でないときれいに対処できなくなるかもしれません。


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

Name: たかぎ [URL]  ..ハッカー(211,353ポイント)   Date: 2010/06/26(土) 17:27   No:55337     
Title: Re:昇進状態について(雑談)    
あまりわがままな意見は相手にしない方がよいのでは?
ひとりふたりのうちはよいですが、みんなが好き勝手言い出すと破綻するのは目に見えています。


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

Name: 組木紙織  ..比類無きプログラマー(87,778ポイント)   Date: 2010/06/26(土) 17:56   No:55341     
Title: Re:昇進状態について(雑談)    
昇進状態を変更したいと思った理由は、プログラミングの能力のイメージがつくような
名前が付いているからですよね。

では、昇進状態の名前自体をそのイメージがつかないようなものにすれば問題ないかと。

#私は全然気にしてないので、どうなってもいいですけどね。


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

Name: ムンバ  ..初心者(6,562ポイント)   Date: 2010/06/26(土) 18:17   No:55343     
Title: Re:昇進状態について(雑談)    
すみません。私のわがままで、こんな風になるとは・・・。
いつも、皆さんにご迷惑をお掛けしてしまい、大変申し訳なく思います。(謝

落ち着いたら、必要であれば
スレッドごと消去して頂いても構いません。

>>しろさん
 管理人さんにはお手数をお掛けする事となりますが
 例えば、しろ→シロに変更したなどと、こちらの掲示板で宣言して頂いて
 管理人さんに、「しろ」の削除をお願いするとかで如何でしょうか?
 私も名前を「むんば」にしようか悩んでいましたので。^^; ---←誤字修正

メールで変更して頂こうかと思ったのですが
お忙しくて読む時間が無いと思い、掲示板でわがままを言ってしまった次第です。
あまり問題が大きくなる様でしたら、一旦、私のポイントを戻して頂き
名前を「むんば」などに変更して、「ムンバ」を削除して頂く形でも構いません。

今回のスレッドは、本当に悩んだ末のお願いです。
勝手言った私が言うのも変ですが
どうぞ、この件に関しましては
これ以上、管理人さんのお手を煩わせない様に、何卒宜しくお願い申し上げます。 編集済み


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

Name: ROM  ..入門者(2,693ポイント)   Date: 2010/06/26(土) 18:19   No:55344     
Title: Re:昇進状態について(雑談)    
> ぽこさん
> これが可能だということは、その逆、つまりポイントの前借りも可能ってことですかね?

どうしてそういう事になるのでしょう。
そして何の意味があるのでしょう。


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

Name: ぽこ  ..上級者(18,273ポイント)   Date: 2010/06/26(土) 18:52   No:55345     
Title: Re:昇進状態について(雑談)    
> そして何の意味があるのでしょう。

これが可能なら、100万ポイントほど前借りすることでWizard気分を味わえますよ。
 編集済み


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

Name: ムンバ  ..初心者(7,187ポイント)   Date: 2010/06/26(土) 19:19   No:55348     
Title: Re:昇進状態について(雑談)    
何度も、すみません。
いや、違うんです〜!

まず、このスレの始まりNo:55115 を読んで下さい。
そして、次に「Dixqさん」から、その次に「山崎さん」からレスを頂きました。
お二方のレスを何度も読み返して、私は「うんうん。ふむふむ。なるほど。」などと思い
もう少し考えてみようと思いました。

No:55138 のレスを書き、解決マークを押して送信しました。
 ↑このレスを送信した時点では、本人「初心者」になってる事に全く気付いてない。
自分のレスを読み返して見た時点で、「初心者」になっていた訳です。

ですので、欠席裁判みたいなもので(←変な意味は、全く無しっ!w)

いつも変な事ばかり聞いたり言ったりしてるムンバに、管理人さんからの制裁があり
「被告ムンバは、初心者に格下げと処すっ!」(ただし、出入り禁止は今の所は無し!とする)
という様な感じで、管理者権限でムンバが処罰されたと思って頂ければ幸いです。^^

現在も、自分なりにがんばって勉強してますし
今後、また変な質問とかしてしまうかもしれませんが
今、作ろうと思ってるチャットしながらゲームができるソフトが完成できた暁には
執行猶予で管理人さんにお預けした7万ポイントは
きっちり満額、1ポイントの漏れもなく返還して頂きますよっ!!!

って事で、皆さんには勝手ながらお許し頂き
今後は、別スレッドで、ご勘弁願えないでしょうか?
また、自分勝手過ぎますでしょうか?(涙


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

Name: ぽこ  ..上級者(18,345ポイント)   Date: 2010/06/26(土) 19:53   No:55349     
Title: Re:昇進状態について(雑談)    
> ムンバさん
> って事で、皆さんには勝手ながらお許し頂き
> 今後は、別スレッドで、ご勘弁願えないでしょうか?

雑談とあったので、悪ノリしちゃいました。
変な気苦労をかけてしまい、申し訳ありません。
 編集済み


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

Name: 三郎  ..入門者(4,313ポイント)   Date: 2010/06/26(土) 20:07   No:55350     
Title: Re:昇進状態について(雑談)    
此処のサイトの命名は実にユニークで、その程度の冗談があっても良いと思う。
比類なきプログラマー
ハッカー
伝説のハッカー、、、本当にハッカーかと思ってしまいました(笑)

しかし私の場合
「万年落第生」
と命名して欲しいですし、その通りです。ポイントも上げず、給料を下げてください。

オットト、、、給料は貰っていなかったんだった!!



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

Name: ムンバ  ..初心者(7,286ポイント)   Date: 2010/06/26(土) 20:40   No:55352     
Title: Re:昇進状態について(雑談)    
ぽこさん、お世話になります。

>>雑談とあったので、悪ノリしちゃいました。 
>>変な気苦労をかけてしまい、申し訳ありません。 

いえいえ。
こちらこそ、ごめんなさい。
元は、雑談なのでしたね。(自爆
悪ノリとか思ってませんよ。
お心使い、どうもありがとうございます。(_ _)



三郎さん

>>此処のサイトの命名は実にユニークで、その程度の冗談があっても良いと思う。

 難しく考えてしまいました。
 ご意見ありがとうございます。(_ _) 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,229,325ポイント)   Date: 2010/06/26(土) 23:35   No:55364     
Title: Re:昇進状態について(雑談)    
掲示板ランクの名前は、ドラゴンボールの強さのインフラに例えられるような状態で広がっていったものでして・・。
最初はプログラマー位までしか無かったので、意味的な面でも順調にランクが上がるのですが、
そこからが継ぎ足し継ぎ足しで増やした物なので違和感ありまくりなんですよね^^;
昔は「神」とかあったんですが「もうこれ以上の名前は付けられない・・」と削除になったり、苦労しましたw
まぁウィザードなら今後増やさなくてはならなくなっても「グル」があるかなとか思っているのですが、
パッと見、最高ランクに見える「比類なきプログラマー」が全然上のランクじゃなくなってしまうのもどうしたものかと思ったり・・。


>> しろさん

しろさんは白さんとは違う方ですか?
ではポイントをリセットしておきますね。
「13,665ポイント」ですね。
もし戻してほしい事があれば、この記事のリンクを一緒に書いて教えて下さい。

> ポイントもしばらくは加算されないようにしていただけますと助かります。

これは難しいですが、気付いたらなるべくポイントを減らすようにしますね;
そうなるとポイントを戻すことは難しくなりそうですが・・。

>> シエルさん
> ポイントはポイントで加算して表示するだけにしといて、 
> ランクは自分で選択できるようにしてくれた方がいいかな〜

う〜ん、今は無理ですが、今後検討します・・。

>> ぽこさん
> これが可能だということは、その逆、つまりポイントの前借りも可能ってことですかね? 

いえ、今回は特別な例ですし、前借りについては考えていません。

>> みつなぎさん

本腰いれて作らないといけなさそうですね^^;

>> たかぎさん

まぁ対応できる範囲では対応しようと思います^^;

>> 組木さん
>では、昇進状態の名前自体をそのイメージがつかないようなものにすれば問題ないかと。

ここの掲示板のデフォルトは「部長」「課長」みたいな役職名なんですよ。
でもいざプログラムに関係ないランクが付くと違和感があるというか面白くないというか・・。
何か面白いランクの名前ありますか?

>> 三郎さん

ランクの名前を自身の名前だと思う人も結構いますよね;
この表示の仕方はみにくいのだろうか・・


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

Name: ムンバ  ..初心者(7,552ポイント)   Date: 2010/06/27(日) 00:05   No:55367 解決!     
Title: Re:昇進状態について(雑談)    
私はそろそろ、潮時と言うところでしょうかね。^^
おやすみなさい。
失礼します。


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



Name: シエル  ..上級者(15,970ポイント)   Date: 2010/06/26(土) 21:16   No:55353       
Title: DirectSoundでのWAVEファイル再生について    
現在WAVEファイル再生のテストを色々と行おうと思って、
簡単なWAVEファイル再生プレーヤーをDirectSoundとWinAPIを使って、
作成したのですが、何故か音が鳴りません。

別で作成中のシューティングゲームは同じ方法で再生が出来ていることを確認
しているのですが、なぜかこのテストプレーヤーだけ音がなりません。
色々とコードを見比べたのですが、原因が分かりませんでした。

コードを添付いたしますので、どこが原因なのか分かる方ご教授願います。

ちなみにコンパイルエラーなどは出ません。


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


Name: Justy  ..伝説なるハッカー(551,307ポイント)   Date: 2010/06/26(土) 22:10   No:55354     
Title: Re:DirectSoundでのWAVEファイル再生について    
 協調レベルの設定に失敗してそうな。
 グローバル変数の hwndにウインドウハンドルが入っていない状態で協調レベルを設定しようとしているように見えます。


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

Name: シエル  ..上級者(16,146ポイント)   Date: 2010/06/26(土) 22:39   No:55356 解決!     
Title: Re:DirectSoundでのWAVEファイル再生について    
Justyさん!ありがとうございます!解決しました!

2時間ぐらい悩んでたので…本当に助かりました!

WM_CREATEのメッセージを処理する時点では、まだCreateWindowでのウィンドウ作成処理が
終わってなくて、まだhwndにウィンドウハンドルが入ってなかったんですね。。。

DirectSound関連にばかり目がいってしまっていて、ウィンドウプロシージャでの処理は
あまり気にしてなかったのがまずかったようです。

お忙しいところ、本当にありがとうございました!







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



Name: みすた  ..ぴよぴよ(24ポイント)   Date: 2010/06/25(金) 01:05   No:55247       
Title: ::って何でしょう・・・    
例えば↓のような感じで使われている「::」の意味がよくわかりません。

int main(){
 std::string s1,s2;
 s1="hello";
 std::cout << s1 << std::endl;
}

これは何なのでしょうか・・・。


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


Name: たかぎ [URL]  ..ハッカー(211,158ポイント)   Date: 2010/06/25(金) 01:08   No:55248     
Title: Re:::って何でしょう・・・    
「有効範囲解決演算子」です。


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

Name: softya [URL]  ..ハッカー(183,717ポイント)   Date: 2010/06/25(金) 01:31   No:55249     
Title: Re:::って何でしょう・・・    
補足として、お尋ねのプログラムはC++で書かれています。
C言語の文法の範囲では::は出てきませんし、使えません。


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

Name: シエル  ..上級者(15,174ポイント)   Date: 2010/06/25(金) 02:42   No:55256     
Title: Re:::って何でしょう・・・    
下記のURLを参照して下さい。
http://www.geocities.jp/ky_webid/cpp/language/018.html


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

Name: ZASEA  ..ぴよぴよ(383ポイント)   Date: 2010/06/25(金) 23:04   No:55299     
Title: Re:::って何でしょう・・・    
それは「スコープ解決演算子」と言って
C++のクラスと名前空間で使います。

C言語を使う限りは出てきません。


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



Name: HY  ..ぴよぴよ(443ポイント)   Date: 2010/06/25(金) 10:29   No:55262       
Title: 比例航法について    
比例航法について学習中の者です

現在、以下のサイトを参考に比例航法のプログラムを書いてみましたが
うまくいきません(コンパイルは成功するものの、途中でエラー終了してしまう)
参考サイト:ttp://raptor.ddo.jp/stg/doc.html

比例航法についてご理解のある方、ご助言よろしくお願いします

以下が失敗プログラムです

/*** missile.cpp ***/

//比例航法によるミサイル制御
void _pattern2(int i){
    double f,F,fF,e,eF,FF;
    int t=missile[i].cnt;//ミサイルフラグが立った時t=0
    if(t==0) missile[i].vy=2.0;//y方向への速度
    if(t>=60){//60でなくともよい
        if(t==60){
            e = atan2(terget.y-missile[i].y,terget.x-missile[i].x);
        }
        if(t>60){
        f = atan2(terget.y-missile[i].y,terget.x-missile[i].x);//対象への角度を計測
        F = atan2(missile[i].vy,missile[i].vx);//ミサイルの進行角度を計測
        fF=f-F;//差分計算
        eF=e-F;//1ループ前の差分計算
        FF=eF-fF;
        missile[i].vy = 2.0*sin(4.0*FF);//比例定数n=4とした
        missile[i].vx = 2.0*cos(4.0*FF);
        e = atan2(terget.y-missile[i].y,terget.x-missile[i].x);//対象への角度保存
        }
}


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


Name: シエル  ..上級者(15,192ポイント)   Date: 2010/06/25(金) 10:40   No:55263     
Title: Re:比例航法について    
どんなエラーが出るんですか?

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

Name: ookami  ..プログラマー(30,094ポイント)   Date: 2010/06/25(金) 10:59   No:55264     
Title: Re:比例航法について    
比例航法は分かりませんが、
途中でエラー終了するとのことなので、
気になった点を挙げます。

とりあえず{}が対応していないですね^^;
コンパイルが通るとのことなので、コピペのミスだと思いますが...

なんとなくですが、missile[i]のiに範囲外が指定されることは
ありませんか?


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

Name: シエル  ..上級者(15,251ポイント)   Date: 2010/06/25(金) 11:20   No:55265     
Title: Re:比例航法について    
 if(t>60)のとき、eが初期化されていないのにもかかわらず

eF=e-F;//1ループ前の差分計算

で、eを使用してるからかな。


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

Name: ookami  ..プログラマー(30,258ポイント)   Date: 2010/06/25(金) 11:32   No:55266     
Title: Re:比例航法について    
それなら 変な値が入るだけでエラーにはならないんじゃ...
と思ったら、なるんですね^^; 勉強になりました!

void main(void) {
    double i,j;
    i=j;
}

↑を実行したところ、添付のエラーが出ました。HYさん、同じエラーでしょうか?


--


ついでにこんなことも。
void main(void) {
    int i;
    printf("%d",i);
}
これでも同じエラーが出ました。
あれ...?前は、変な数字が出るだけで、実行時エラーにはならなかったと思ったのですが...
コンパイラが賢くなったのでしょうか。


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

Name: シエル  ..上級者(15,272ポイント)   Date: 2010/06/25(金) 11:37   No:55267     
Title: Re:比例航法について    
私もデタラメな値が入るだけだと思ったんですが、もしやと思って
一応指摘しました。。。


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

Name: へろり  ..上級者(15,827ポイント)   Date: 2010/06/25(金) 13:14   No:55274     
Title: Re:比例航法について    
>コンパイラが賢くなったのでしょうか。

C言語において、初期化されていない auto 変数の読み出しの動作は未定義となっています。 鼻から悪魔です。


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

Name: toyo  ..熟練のプログラマー(50,347ポイント)   Date: 2010/06/25(金) 14:07   No:55276     
Title: Re:比例航法について    
未初期化変数の使用はVC++2008だとコンパイル時の警告だけですね
VC++2010ではdebug版で実行時にもダイアログが出ました
releaseでは出ません


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

Name: HY  ..ぴよぴよ(999ポイント)   Date: 2010/06/25(金) 20:17   No:55290     
Title: Re:比例航法について    
>>シエル様 ookami様 へろり様 toyo様
早速のお返事ありがとうございます


まず、エラーについてですがookami様が示したエラーが出ます
次に、iについてですが「i=0」固定ですので(他の航法もあるので、比例航法はたまたまi=0になった)
ここには問題はないかと思われます(言葉足らずで申し訳ございません)

それから、比例航法についてですが参考サイトから以下のように認識しております

@対象への角度を計測(fの部分)「参考サイト:r+θ’」
Aミサイルの速度ベクトルの計測(Fの部分)「参考サイト:r」
B@とAとの差分を計算(fFの部分)「参考サイト:θ’」
C前回の対象への角度とミサイルの速度ベクトルとの差分を計算(eFの部分)「参考サイト:θ」
DCとDの差分を計算(FFの部分)「参考サイト:dθ」
EDの差分に定数を掛ける(4.0*FFの部分)「参考サイト:4.0*θ」
FEの数値を指定した旋回限界で切り揃えて速度ベクトルに加算(missile[i].vy = 2.0*sin(4.0*FF)の部分)
G敵への角度を保存(eの部分)「参考サイト:r+θ」
→以後@〜Gの繰り返し

以上からeについて
t=61におけるCの段階ではeの値が定まっていないと考え、t=60でeに値を持たせました
そして、t=61ではt=60のeの値が持ち越され、Cが算出できると考えておりました
ただ、eFのところで止まってしまうようなので、この認識は間違っているのかもしれません(シエル様もご指摘されてますが)

未だ解決には至らないので、再考してみます
また、何か妙案があればご報告していただければ幸いです


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

Name: シエル  ..上級者(15,567ポイント)   Date: 2010/06/25(金) 20:23   No:55291     
Title: Re:比例航法について    
if(t==60){ 
     e = atan2(terget.y-missile[i].y,terget.x-missile[i].x); 
}
↑のようにeの値はt==60の時しか設定されないようになっています。
eの変数は自動変数なので、一度この関数から抜けると、消滅して値は消えてしまいます。
よってtの値が60以外の値だと、eに値がセットされないまま、↓の計算式が実行されエラーが出ていると思われます。

eF=e-F;//1ループ前の差分計算 

ですので、eの変数はグローバル変数にするか、staticを付けて静的変数にするのが
いいと思われます。


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

Name: へろり  ..上級者(15,986ポイント)   Date: 2010/06/25(金) 21:26   No:55295     
Title: Re:比例航法について    

比例航法についてはさっぱりわかりませんが、変数 e に関するエラーはとりあえず、宣言時にでも e = 0.0 とでもして、とりあえず初期化しておくことで回避出来ます。


 編集済み


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

Name: シエル  ..上級者(15,641ポイント)   Date: 2010/06/25(金) 21:33   No:55296     
Title: Re:比例航法について    
>消えません。 
>変数 e は 関数 _pattern2 のブロックの頭で宣言されていますので、その寿命は関数を抜けるまで有効です。
ん?どういうことですか?
変数eは関数から抜けたら値は消えないんですか?


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

Name: シエル  ..上級者(15,744ポイント)   Date: 2010/06/25(金) 21:37   No:55297     
Title: Re:比例航法について    
>比例航法についてはさっぱりわかりませんが、変数 e に関するエラーはとりあえず、宣言時にでも e = 0.0 と>でもして、とりあえず初期化しておくことで回避出来ます。
初期化すると、

eF=e-F;//1ループ前の差分計算

での差分計算ができないと思われます。


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



Name: モンティニオ  ..ぴよぴよ(34ポイント)   Date: 2010/06/24(木) 02:29   No:55197       
Title: ダブルリンクリストの問題    
【質問】 
[1] 授業単元: データ構造
[2] 問題文 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10739.txt
[3] 環境 
 [3.1] OS: WindowsXP 
 [3.3] 言語: C言語 
[4] 期限: 6月24日 
よろしくお願いします。 


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


Name: モンティニオ  ..ぴよぴよ(71ポイント)   Date: 2010/06/24(木) 02:32   No:55199     
Title: Re:ダブルリンクリストの問題    
問題文が表示されないので添付ファイルでアップしました
どうかよろしくお願いします。


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

Name: y  ..初心者(6,702ポイント)   Date: 2010/06/24(木) 02:34   No:55200     
Title: Re:ダブルリンクリストの問題    
利用規約を読んだのかは分かりませんが、質問になってませんよ。
丸投げ、質問の仕方も含めて、もう一度よく利用規約を読みましょう。


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

Name: dic  ..比類無きプログラマー(79,029ポイント)   Date: 2010/06/24(木) 10:52   No:55207     
Title: Re:ダブルリンクリストの問題    
ザッとしか見てませんが
ほとんどできてるようです

どこが問題なのでしょうか?


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

Name: toyo  ..熟練のプログラマー(50,370ポイント)   Date: 2010/06/24(木) 12:14   No:55208     
Title: Re:ダブルリンクリストの問題    
これは2ちゃんねるの宿題丸投げスレのテンプレートとアップローダですよね
ここで質問するならここの規約も読んでおいてください


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

Name: dic  ..比類無きプログラマー(79,726ポイント)   Date: 2010/06/25(金) 16:52   No:55284     
Title: Re:ダブルリンクリストの問題    
#include <stdio.h>
#include <stdlib.h>
#define    SIZE    10

static    int    gData[SIZE];

void    reset()
{
    int    i;
    for( i=0; i<SIZE; i++ )
        gData[i] = 0;
}

///////////////////////////////////////////////
void    module000()
{
    char    b[80];
    printf( "入力する数字:" );
    fgets( b, 80, stdin );

    int    i = atoi(b);

again:
    printf( "入力する位置 0-9\n" );
    fgets( b, 80, stdin );
    int    j = atoi(b);
    if( (j<0) || (j>9) )
    {
        printf( "入力する位置が不適切です\n" );
        goto again;
    }

    gData[j] = i;
}

///////////////////////////////////////////////////////
void    module001()
{
again2:
    printf( "削除する位置を指定してください 0 - 9\n" );

    char    b[80];
    fgets( b, 80, stdin );
    
    int    i = atoi(b);

    if( (i<0) || (i>9) )
    {
        printf( "削除する位置が不適切です\n" );
        goto again2;
    }

    gData[i] = -1;
}


/////////////////////////////////////////////////////
void    module002()
{
    printf( "現在の状態\n" );

    int    i;
    for( i=0; i<SIZE; i++ )
        printf( "%3d ", gData[i] );
    printf( "\n" );
}

///////////////////////////////////////////////////
int    main()
{
    reset();    //    初期化

    char    b[80];

    while( b[0] != '9' )
    {
        printf( "命令を入力してください\n" );
        printf( "0 - 数字を入力\n" );
        printf( "1 - 数字の削除\n" );
        printf( "2 - 現在の状態を見る\n" );
        printf( "9 - 終了\n" );

        fgets( b, 80, stdin );

        if( b[0] == '0' )
            module000();
        else if( b[0] == '1' )
            module001();
        else if( b[0] == '2' )
            module002();
    }

    return 0;
}

固定配列バージョンを10分でつくりました
期限はすぎてるようですが
どうでしょうか?


基本情報処理試験にも双方向リストの問題はよくでますね
時間あるときに再思考してみます
 編集済み


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

Name: たかぎ [URL]  ..ハッカー(211,191ポイント)   Date: 2010/06/25(金) 17:30   No:55287     
Title: Re:ダブルリンクリストの問題    
「注目セル」と「着目セル」は同義なのか別なのかなど、読み取れない情報が少なからずあります。
結局どうしたいのかをもっと明確にすべきです。


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

Name: dic  ..比類無きプログラマー(81,185ポイント)   Date: 2010/06/25(金) 18:20   No:55289     
Title: Re:ダブルリンクリストの問題    
#include <stdio.h>
#include <stdlib.h>

#define    SIZE    10

typedef    struct    cell
{
    struct    cell    *next;
    struct    cell    *prev;
    int        val;
} cell;

static    cell    gCell[10];
static    cell    *first;
static    int        yuukou;

///////////////////////////////////////////////////////////
void    init()
{
    int    i;
    for( i=0; i<SIZE-1; i++ )
        gCell[i].next = &gCell[i+1];
    gCell[SIZE-1].next = NULL;

    for( i=1; i<SIZE; i++ )
        gCell[i].prev = &gCell[i-1];
    gCell[0].prev = NULL;

    for( i=0; i<SIZE; i++ )
        gCell[i].val = i*10;
}
///////////////////////////////////////////////////////////
void    print()
{
    printf( "gCellの中身: " );
    cell    *p = first;

    while( p != NULL )
    {
        printf( "%3d ", p->val );
        p = p->next;
    }
    printf( "\n" );
}
///////////////////////////////////////////////////////////
//    数字を追加する
//        val:    追加する数字
//        list:    追加するリスト
//
void    add( int val )
{
    char    mes[80];
    sprintf( mes, "%d を追加\n", val );
    printf( mes );

    //    追加する場所を探す
    cell    *p = first;
    while( p->next != NULL )
    {
        if( p->val <= val )
            p = p->next;
        else
        {
            p->val = val;
            break;
        }
    }
}
////////////////////////////////////////////////////////////
//    数字を削除する
//        out:    削除する場所 0 - 9
void    remove( int out )
{
    if( first == NULL )
        return;

    char    mes[80];
    sprintf( mes, "%d を削除\n", out );
    printf( mes );

    //    削除する数字を探す
    cell    *p = first;
    //    削除するのがラストの場合
    if( yuukou == 1 )
    {
        if( p->val == out )
        {
            first = NULL;
            p->next = NULL;
            p->prev = NULL;
            yuukou = 0;
        }
    }

    while( p->next != NULL )
    {
        if( p->val == out )
        {
            //    削除するのが先頭の場合
            if( p->prev == NULL )
            {
                first = p->next;
                (p->next)->prev = NULL;
            }
            //    削除するのが末尾の場合
            else if( p->next == NULL )
            {
                (p->prev)->next = NULL;
            }
            //    通常の場合
            else
            {
                (p->prev)->next = p->next;
                (p->next)->prev = p->prev;
            }
            p->val = -1;
            p->next = NULL;
            p->prev = NULL;
            yuukou -= 1;
        }
        else
            p = p->next;
    }
}

////////////////////////////////////////////////////////////
int main()
{
    printf( "---初期状態---\n" );
    first = &gCell[0];
    yuukou = SIZE;
    init();
    print();

    add( 22 );
    print();

    remove( 22 );
    print();

    remove( 60 );
    print();
    remove( 70 );
    print();
    remove( 80 );
    print();
    remove( 90 );
    print();
    remove( 90 );
    print();
    remove( 90 );
    print();

    print();

    return 0;
}

サクッとつくりました
末尾の削除が期待したとおりに動きませんが
サンプルほどできてるのに
何がわからないのかが わからない状態です


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



Name: kei  ..ぴよぴよ(910ポイント)   Date: 2010/06/25(金) 15:43   No:55278       
Title: ブロック崩し    
ブロック崩しをつくろうと思ってて、壁に当たったときに跳ね返るのは出来たんですが

ボールが操作しているバーに当たったときに上に跳ね返る

ということができません。

どのような考え方をすればいいでしょうか?


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


Name: シエル  ..上級者(15,309ポイント)   Date: 2010/06/25(金) 15:52   No:55279     
Title: Re:ブロック崩し    
壁に当たったときの判定をそのままバーに置き換えるだけです。

自分ではどの辺まで分かりますか?できるところまででいいのでコードを貼って下さい。


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

Name: kei  ..かけだし(1,368ポイント)   Date: 2010/06/25(金) 16:01   No:55280     
Title: Re:ブロック崩し    
判定に関するところで以下のような感じです

ボールは画像を使用してます(40×40)
ボールの座標は(Bullet_t.x,Bullet_t.y)
バーはDrawBox(x , 400, x+100, 410, GetColor(255,255,255), TRUE)


    //画面左端もしくは画面右端
    if(Bullet_t.x<0 || (Bullet_t.x+40)>640)
        if(Bullet_t.angle <PI)
            Bullet_t.angle = PI-Bullet_t.angle;
        else if(Bullet_t.angle<2*PI)
            Bullet_t.angle = 3*PI-Bullet_t.angle;
    //画面上に当たったとき
    if(Bullet_t.y<0)
        Bullet_t.angle = 2*PI-Bullet_t.angle;

    //ここから間違っているらしい
    if(!(x<Bullet_t.x || Bullet_t.x>x+100)){ //バーのx座標はxからx+100まで
        if(Bullet_t.y==400) //バーのy座標
            Bullet_t.angle= 2*PI -Bullet_t.angle;


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

Name: シエル  ..上級者(15,404ポイント)   Date: 2010/06/25(金) 16:33   No:55282     
Title: Re:ブロック崩し    
ざっと見ただけですが、
↓の判定を、
if(!(x<Bullet_t.x || Bullet_t.x>x+100)){ //バーのx座標はxからx+100まで 

if(x<Bullet_t.x && Bullet_t.x<x+100)にして、

if(Bullet_t.y==400) //バーのy座標 
は、
if(Bullet_t.y>400)
にしたらうまくいきませんか?  編集済み


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

Name: kei  ..かけだし(1,410ポイント)   Date: 2010/06/25(金) 16:40   No:55283     
Title: Re:ブロック崩し    
変えてやってみたんですが、ボールがバーをすり抜けていくんです。

うまくいかないです(TT)


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

Name: TKOZ  ..熟練のプログラマー(66,013ポイント)   Date: 2010/06/25(金) 17:08   No:55285     
Title: Re:ブロック崩し    
パソコンで実行してみました。
これで、いいと思います。
あと、PIの定義を3.14159265…か、180にするかで迷いました
なので、PIを180に置換しました。

//画面左端もしくは画面右端 
    if(Bullet_t.x<0 || (Bullet_t.x+40)>640) 
        if(Bullet_t.angle <180) 
            Bullet_t.angle = 180-Bullet_t.angle; 
        else if(Bullet_t.angle<2*180) 
            Bullet_t.angle = 3*180-Bullet_t.angle; 
    //画面上に当たったとき 
    if(Bullet_t.y<0) 
        Bullet_t.angle = 2*180-Bullet_t.angle; 

    //ここから間違っているらしい 
    if((x<Bullet_t.x && Bullet_t.x+40<x+100)){//バーのx座標はxからx+100まで 
        if(Bullet_t.y>400) //バーのy座標 
            Bullet_t.angle= 2*180 -Bullet_t.angle;
    }


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

Name: kei  ..かけだし(1,449ポイント)   Date: 2010/06/25(金) 17:17   No:55286     
Title: Re:ブロック崩し    
どこが変わったのかわからないですが、いけました!!

シエルさん,TKOZさんありがとうございました。


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



Name: ムンバ  ..初心者(5,629ポイント)   Date: 2010/06/25(金) 01:34   No:55250       
Title: C言語のコメントにつきまして    
こんばんは!
お世話になります。

C言語での「コメント」なのですが、頭の中で整理したいので質問させて頂きます。
(….cpp ファイルでは無く、….cファイル)

手持ちの本(14歳〜を除く)や、検索エンジン(C言語 コメント)の検索などで
C言語のコメントについて調べてみました。
確認不足でしたら、ご指摘下さい。

(C++ では無く)本来(現在)?の、C言語でのコメントは

例:/* C言語でのコメント */
  (/*〜*/)のみであり

例:// C言語でのコメント
  (//)は、C言語には無いものなのでしょうか?

環境依存無しの、本来のC言語での「コメント」が
/* 〜 */
のみかどうか?を、確認したいです。

ご指導の程、宜しくお願い致します。


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


Name: 組木紙織  ..比類無きプログラマー(87,375ポイント)   Date: 2010/06/25(金) 01:42   No:55252     
Title: Re:C言語のコメントにつきまして    
C言語(C99より古いもの)
(/* */)のみ

C言語(C99)とC++
(/* */)と(//)

ただし、環境依存で古いC言語でも(//)のコメントに対応しているものがある。(目立つ)

なので (/* */)のコメントを使っていれば常に安全です。



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

Name: たかぎ [URL]  ..ハッカー(211,160ポイント)   Date: 2010/06/25(金) 01:48   No:55253     
Title: Re:C言語のコメントにつきまして    
> なので (/* */)のコメントを使っていれば常に安全です。

厳密なことをいうと、「コメントに基本ソース文字集合だけを使っていれば」という条件付きで常に安全です。


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

Name: ムンバ  ..初心者(5,726ポイント)   Date: 2010/06/25(金) 01:51   No:55254     
Title: Re:C言語のコメントにつきまして    
組木紙織さん、早速のご指導ありがとうございます。

自分なりに、納得できました。
また何かあれば宜しくお願い致します。
ありがとうございました。(謝

おやすみなさい!(∪。∪)。。。zzzZZ

---修正・追加---
たかぎさんと、かぶってしまいました。ごめんなさい。

>>厳密なことをいうと、「コメントに基本ソース文字集合だけを使っていれば」という条件付きで常に安全です。

 「同じ言語を使って、同じ環境であれば」と言う事で、宜しいでしょうか? 

---修正---
解決ボタン、一時撤収しました。
すみません。 編集済み


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

Name: ムンバ  ..初心者(5,812ポイント)   Date: 2010/06/25(金) 01:59   No:55255     
Title: Re:C言語のコメントにつきまして    
解決後に、申し訳ないのですが・・・
たかぎさん、こんばんは!お世話になります。

>>基本ソース文字集合
 とは、何でしょうか?

すみません。眠いです〜っ!
ごめんない。おやすみなさい。(O_O;)


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

Name: へろり  ..上級者(15,778ポイント)   Date: 2010/06/25(金) 08:05   No:55259     
Title: Re:C言語のコメントにつきまして    
>>>基本ソース文字集合 
> とは、何でしょうか? 

そのまんまの意味です。

基本的にソースコードとして使える文字の集合です。
英数といくつかの記号と特殊文字の単バイト文字からなる文字集合です。


ついでに。 さらに厳密に言うなら、コメントに基本ソース文字集合に基本実行文字集合を加えても安全です。
ちなみに基本実行文字集合とは基本ソース文字集合にベルや改行コードの5つの特殊文字を加えたものです。


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

Name: toyo  ..熟練のプログラマー(50,303ポイント)   Date: 2010/06/25(金) 09:07   No:55260     
Title: Re:C言語のコメントにつきまして    
専門用語等で単語がわからない場合は質問するより検索した方が早いですよ
用語辞典のサイトやたかぎさんのサイトがひっかかったりしますのでそちらに詳しく具体的に説明してあります


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

Name: ムンバ  ..初心者(5,918ポイント)   Date: 2010/06/25(金) 10:11   No:55261 解決!     
Title: Re:C言語のコメントにつきまして    
おはようございます。

へろりさん、ご解説ありがとうございました。
理解できました。
ありがとうございます。

toyoさん、ご指導ありがとうございます。
おっしゃる通りです。(謝
どうもありがとうございます。

また何か御座いましたら、宜しくお願い致します。
できるだけ、自力でがんばってみます!
失礼します。


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



Name: つよ  ..ぴよぴよ(282ポイント)   Date: 2010/06/24(木) 20:25   No:55227       
Title: 初心者です・・・    
あるソフトウェアのソースコードに少し付け加えたいと思って編集しているのですが、どうもうまくできません。


問題としましてはあるポインタに文字が入力されていて(ソフトウェアで自動入力)、それが指定した文字と同じなら動作をする、というプログラムを付け加えたいのですが、上手く比較ができません。


printでポインタにどのような文字が入力されているかを表示させて確かめたところ、%s(文字列出力)での文字は一緒にはなっています。
%d(10進数出力)では若干違った値が出ました。

実際の結果は下のようになりました。
文字列 10進数
DIR  1875548980
DIR  1875549508

これはどのようにしたらよろしいでしょうか?


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


Name: ideyan  ..初心者(8,699ポイント)   Date: 2010/06/24(木) 21:31   No:55234     
Title: Re:初心者です・・・    
何やらポインタについて色々と誤解されているような気がします。

上手く比較ができません、でなく
現状どのように比較しているかぐらいは書くべきでしょう。

ポインタ同士を直接比較していると仮定して答えますが
「ポインタの比較」と「ポインタが指しているものの比較」は違います。
文字列を比較したいならstrcmpやstrncmpを使ってはどうでしょうか?


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

Name: つよ  ..ぴよぴよ(387ポイント)   Date: 2010/06/24(木) 22:34   No:55238 解決!     
Title: Re:初心者です・・・    
すみません(^_^;

普通に下のように
==
などを使って比較してました。

提案していただいた、strncmpを使わせていただきましたところ、思い通りに動作させることができました!


ありがとうございました<(_ _)> 編集済み


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



Name: シエル  ..上級者(15,023ポイント)   Date: 2010/06/24(木) 20:00   No:55222       
Title: このようなエフェクトの原理について教えてください。。。    
いつもお世話になっております。

現在、C言語とWinAPIとDirectXでシューティングゲームを作成しているのですが、ほぼ出来上がってきました。
ですが、何か物足りないので、ボス破壊時、必殺ショット、タイトル画面、起動時などに
もうちょっとエフェクトを加えたいと思っております。

どんなエフェクトを加えたいか例をあげますと、
まず一つ目は、
管理人のDixqさんが作成された,「AerobeatPlus」の起動時のようなエフェクトです。
AerobeatPlusをプレイした人しかわからないかもしれませんが、
添付した画像を見ていただきますと、
白い光が大きく輝きながら徐々に形を変えて、やがて消えてゆきます。
こちらに関しては、この光が形を変えなければ自分でも表現できたのですが、形を変えながら
動いているのでどういう原理か分かりませんでした。
色々な形の画像を何枚も用意して、徐々に画像を切り換えながら表現しているのでしょうか?


二つ目は同じく「AerobeatPlus」のタイトル画面の「Aerobeat」の文字の輝きです。(画像参照)
この文字は順番に左から右に輝きながら、光が動いていきます。
これも緑色の文字の画像と白色の文字の画像を切り替えながら描画しているのかと
思って、自分でやってみましたが、うまくいきませんでした。
こちらもどのような原理で表現しているか分かりません。

以上の2点のエフェクトについて、どのような原理で表現しているのか、原理だけでもかまいませんので
ご解説お願い致します。。。


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


Name: スキマ妖怪  ..かけだし(1,954ポイント)   Date: 2010/06/24(木) 20:11   No:55224     
Title: Re:このようなエフェクトの原理について教えてください。。。    
たしか、過去ログに似た質問があったような…
(サンプルもあったはず。)



追記------------------------------------

探してみました。(Dixqさんのサンプルです)

http://www.play21.jp/board/formz.cgi?action=res&resno=38794&page=&lognum=119&id=dixq&rln=39128#38952
 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,226,584ポイント)   Date: 2010/06/24(木) 20:36   No:55228     
Title: Re:このようなエフェクトの原理について教えてください。。。    
今までにこの質問結構ありましたね。サンプルプログラミングの館にでも置いておいた方が良いですかね。
こんなサンプルでもよければ・・。

http://www.play21.jp/board/formz.cgi?action=res&resno=48553&page=&lognum=149&id=dixq&rln=48605

文字の上に重ねてエフェクトをかけているのは「マスク」によるものです。
上のリンク先でも言っていますが、マスクについて勉強されると良いと思いますよ。
特定の部分にだけ描画したりする事が出来ます。


# しかし過去ログ検索しにくいですよね〜・・。
  早く自前の掲示板が欲しい・・。


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

Name: シエル  ..上級者(15,180ポイント)   Date: 2010/06/24(木) 20:57   No:55230 解決!     
Title: Re:このようなエフェクトの原理について教えてください。。。    
スキマ妖怪さん、Dixqさん、ありがとうございました!

すばらしいサンプルです!一気にテンション上がりましたw
マスクについても勉強します!
色々ググったんですが、掲示板は検索し忘れてました。今度からは検索します。。。

P.S.
明日休みなんで、デンマーク戦までこのテンションで起きといて、作ってしまいますw


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,227,019ポイント)   Date: 2010/06/24(木) 21:06   No:55232     
Title: Re:このようなエフェクトの原理について教えてください。。。    
な、、デンマーク戦が見られるだと、、

・・・・どういうアレだ!



(そういう解る人がいないギャグは置いといて)

いいですね〜><;
私は7:30起きなので、起きているにも微妙だし、早く寝て3時に起きるのも微妙だし結局目ざましテレビで結果だけ見る羽目になりそうです・・;


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,227,089ポイント)   Date: 2010/06/24(木) 21:15   No:55233     
Title: Re:このようなエフェクトの原理について教えてください。。。    
今改めてソース見てみましたが、なんというやっつけソース・・。
真似されませんよう・・(ぇ

一応ライブラリが古かったので新しくしてアップしなおしました。
windows7などだと動かないと思うので、新しいライブラリをお使い下さい。


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

Name: シエル  ..上級者(15,263ポイント)   Date: 2010/06/24(木) 21:48   No:55235     
Title: Re:このようなエフェクトの原理について教えてください。。。    
Windows7でした。再アップありがとうございます。

ソースはあまり真似しないようにします><

P.S.
すいません。。。ギャグさっぱり解りませんでした。。。


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



Name: Limone  ..かけだし(1,482ポイント)   Date: 2010/06/24(木) 15:35   No:55211       
Title: DXライブラリを使ったファイルの読み込み    
やりたいこと:ITWM.txtから1行ずつ読み込む
問題:ビルドは成功するものの、読み込めない
どうすれば良いんでしょう?

void setITEM_DATA(void){
#define    file_name    "ITWM.txt"
#define    full_path    file_path file_name
#define    Memory_Size    10240    //文字列を格納するメモリ領域のサイズ

    int FileHandle ;
    // ファイルを開く
    FileHandle = FileRead_open( file_path  ) ;
    test_data    td[3]; //構造体から
    
    for(int i=0;i<5;i++){
        char *dammy = new char();

        //1行ずつ読み込むんでdammyに格納?
        FileRead_gets( dammy, Memory_Size , FileHandle ) ;
        setRecord(dammy,&td[i]);//読み込んだ後の処理
    }

    // ファイルを閉じる
    FileRead_close( FileHandle ) ;

}


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


Name: 削除済み  ..ぴよぴよ(17ポイント)   Date: 2010/06/24(木) 15:47   No:55212     
Title: Re:DXライブラリを使ったファイルの読み込み    
規約違反コメントでしたので、管理人が削除致しました。
規約を守った投稿をお願いいたします。


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

Name: softya [URL]  ..ハッカー(183,676ポイント)   Date: 2010/06/24(木) 16:23   No:55213     
Title: Re:DXライブラリを使ったファイルの読み込み    
とりあえず、ざっと見ただけでも問題が多数あります。

void setITEM_DATA(void){
#define    file_name    "ITWM.txt"
#define    full_path    file_path file_name
#define    Memory_Size    10240    //文字列を格納するメモリ領域のサイズ

    int FileHandle ;
    // ファイルを開く
    FileHandle = FileRead_open( file_path  ) ; 
← full_pathでは?
  
FileHandle のエラーをチェックしてください。
    test_data    td[3]; //構造体から 
← このデータはsetITEM_DATA関数からreturnすると無効になりますが問題では?使っているところがありません
    
    for(int i=0;i<5;i++){ 
←td[3]を処理するなら5ではなく3では?
        char *dammy = new char(); 
←char dammy[Memory_Size];では?

        //1行ずつ読み込むんでdammyに格納?
        FileRead_gets( dammy, Memory_Size , FileHandle ) ;
        setRecord(dammy,&td[i]);//読み込んだ後の処理
    }

    // ファイルを閉じる
    FileRead_close( FileHandle ) ;
}

これらだけ直しても動く保証はありません。
ここで、これだけミスしているので他の部分にも相当ミスがあると思います。


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

Name: toyo  ..熟練のプログラマー(50,241ポイント)   Date: 2010/06/24(木) 17:39   No:55214     
Title: Re:DXライブラリを使ったファイルの読み込み    
今回はnewで動的確保する必要はないので
char dummy[Memory_Size];
のほうがいいと思いますがnewで動的に確保した場合は不要になった時点でdeleteしないといけません

    for(int i=0;i<3;i++){
        char *dummy = new char[Memory_Size];

        //1行ずつ読み込むんでdummyに格納?
        FileRead_gets( dummy, Memory_Size , FileHandle ) ;
        setRecord(dummy,&td[i]);//読み込んだ後の処理
        delete [] dummy;
    } 


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

Name: ookami  ..プログラマー(29,968ポイント)   Date: 2010/06/24(木) 18:55   No:55220     
Title: Re:DXライブラリを使ったファイルの読み込み    
ステップ実行はご存知ですか?
visual c++系なら「visual c++ ステップ実行 ブレークポイント」あたりで検索するとよいと思います。

一行ずつ実行できて、そのたびに変数などの値を見れるので非常に有効なデバッグ手段になりますよ。


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

Name: Limone  ..かけだし(1,579ポイント)   Date: 2010/06/24(木) 21:02   No:55231 解決!     
Title: Re:DXライブラリを使ったファイルの読み込み    
>FileHandle = FileRead_open( file_path  ) ; ← full_pathでは? 
ここが原因でした。
ステップ実行も試していたんですが、FileHandleの数値が動いてたので分かりませんでした。

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


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



Name: 爺プログラマー  ..かけだし(1,091ポイント)   Date: 2010/06/24(木) 18:29   No:55217       
Title: ”Hello, world”が表示されません    
#include <string>


WinMain(・・・){

CreateWindowEx(・・・)

printf("Hello, world");

}

どこが間違っているのでしょうか?


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


Name: シエル  ..中級者(14,428ポイント)   Date: 2010/06/24(木) 18:33   No:55218     
Title: Re:”Hello, world”が表示されません    
printfはコンソールアプリしか使えないと思います。

WinMain関数を使った、Windowsプログラミングでは、
TextOut関数やDrawText関数等を使うと思います。

詳しくはMSDNライブラリへ。


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

Name: ookami  ..プログラマー(29,870ポイント)   Date: 2010/06/24(木) 18:47   No:55219     
Title: Re:”Hello, world”が表示されません    
こんな方法も。

WinMainの最初で、
AllocConsole();
freopen("CONOUT$", "w", stdout);

これでコンソールが表示されprintfで出力できます。

デバッグ用に重宝してます。
リリース時に外します。


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

Name: 爺プログラマー  ..ぴよぴよ(918ポイント)   Date: 2010/06/24(木) 20:14   No:55225     
Title: Re:”Hello, world”が表示されません    
シエル さん
ookamiさん
ありがとうございます。

子ウィンドーを作成する画面には出力できないのですね、原因がわかりました。

今回はWM_PAINTで表示させます。

ookamiさんのコンソール窓を表示させる場合、その上のウインドーで消されるようです、またループがかかっている場所でリアルタイムに呼ぶと文字がスクロールします。
やはり表示アドレスが指定できる方法をとりたいと思います。

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


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



Name: yamataro  ..ぴよぴよ(50ポイント)   Date: 2010/06/23(水) 17:52   No:55164       
Title: メイン関数を通らない    
こんにちは。C++でゲームを作っている中2です。
今アクションを作っていて、途中まではうまくいっていたのですが、
敵の処理を加えてからは、なぜかメイン関数を通らず無限ループしてしまうようになりました。
メイン関数を通ってすぐに、メッセージボックスを出すようにしたのですが、それすら表示されません。
つまり、

・メイン関数を通っていないのでウィンドウすら表示されない
・でもプログラムは動いているので新しくメイクすることができない
・だからいちいちwindowsを再起動しなければならない

ということです。この状態がずっと続いていますが、いまだ解決策が見えません。
こんなことってあるのでしょうか。
また、その場合のプログラムを強制終了させる方法などはありますか?
どうかよろしくお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,226,125ポイント)   Date: 2010/06/23(水) 17:56   No:55166     
Title: Re:メイン関数を通らない    
環境や利用しているライブラリは何ですか?

メイン関数を通らないという事は無いと思います。※無い事が無いですね・・;
恐らく既に動いている実行ファイルがあるので、実行できていないだけではないでしょうか。

そんな時はタスクマネージャーで強制終了すると良いと思います。
Ctrl+Alt+Delでタスクマネージャーを起動し「プロセス」タブで自分が作ったものと同じ名前のプロセスを見つけて強制終了して下さい。

恐らく終了処理が正常に行われていないのだと思います。


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

Name: dic  ..比類無きプログラマー(78,394ポイント)   Date: 2010/06/23(水) 18:13   No:55169     
Title: Re:メイン関数を通らない    
失礼ながら
おそらく釣りかと・・・


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

Name: 御津凪 [URL]  ..ハッカー(142,850ポイント)   Date: 2010/06/23(水) 18:39   No:55171     
Title: Re:メイン関数を通らない    
> 失礼ながら
> おそらく釣りかと・・・

釣りかどうかはわかりませんが、原因の可能性を書いておきます。

グローバル変数にクラス型の変数があると、そのクラスの初期化がメイン関数を通る前に行われます。
そこの処理に問題があるのなら、この原因が起こる可能性があります。


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

Name: たかぎ [URL]  ..ハッカー(211,088ポイント)   Date: 2010/06/23(水) 19:10   No:55173     
Title: Re:メイン関数を通らない    
> メイン関数を通らないという事は無いと思います。

そんなことはありません。
可能性を以下に列挙します。

1. プログラムの開始がWinMain等の場合には、mainは通らない。
 MFCのように、WinMainが隠蔽されている環境でよくある。

2. コンソールアプリケーションとしてコンパイルしたので、WinMainを通らない。
 MinGWではあり得る。

3. 非静的オブジェクトの初期化で永久ループに陥った。




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

Name: Dixq (管理人) [URL]  ..ウィザード(1,226,149ポイント)   Date: 2010/06/23(水) 19:13   No:55174     
Title: Re:メイン関数を通らない    
> みつなぎさん

確かにそうですね。

> たかぎさん

確かにそうですね・・。

安易なコメントすみません;

> dicさん

どうしてそう思われるのです?


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

Name: mila  ..ぴよぴよ(50ポイント)   Date: 2010/06/23(水) 19:26   No:55177     
Title: Re:メイン関数を通らない    
古いプログラムが動作中なのでメッセージボックスを表示するようソースを変更しても
新しいプログラムがビルドできていないということはないですか?
または、ReleaseとDebugをいつの間にか切り替えていたということはないですか?

いずれにしろ、実行するexeファイルのタイムスタンプを確認してみてください。


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

Name: dic  ..比類無きプログラマー(78,647ポイント)   Date: 2010/06/23(水) 20:10   No:55181     
Title: Re:メイン関数を通らない    
>どうしてそう思われるのです?
1.メールアドレスが無料(yahoo)
2.中2
3.古い単語を使っているので長くプログラムにかかわっていると
思われるが上の2に反する

4.多分、レスがないと思う
5.ちょっと前に変な記事があった(削除されたようですが
6.知識を得る過程が普通ではない
>・メイン関数を通っていないのでウィンドウすら表示されない 
>・でもプログラムは動いているので新しくメイクすることができない 
>・だからいちいちwindowsを再起動しなければならない 

違ってたらすいません
私のレスは削除していただいてもいいです

知識を得る過程というより
知識のバランスがむちゃくちゃと言ったほうがいいでしょうか
 編集済み


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

Name: ookami  ..プログラマー(29,187ポイント)   Date: 2010/06/23(水) 22:37   No:55190     
Title: Re:メイン関数を通らない    
うーむ… たまたまステップ実行やタスクマネージャを知らなかったとか、あるいは、ソースのバックアップがなかったとかじゃないかと…

むちゃくちゃプログラミングに傾倒してる中二がいてもいいと私は思いますけどね。

ともかくyamataroさんの回答次第ですねw


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,226,378ポイント)   Date: 2010/06/23(水) 23:07   No:55192     
Title: Re:メイン関数を通らない    
確かに中学生のwindows使いがメイクするとはなかなか言わないかもしれませんが、Linuxから入った方かもしれませんし
釣るという行為の意味が私にはわかりません・・。

yamataroさんの回答を待ちましょう。


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

Name: ookami  ..プログラマー(29,198ポイント)   Date: 2010/06/23(水) 23:34   No:55193     
Title: Re:メイン関数を通らない    
私も釣る意味がないと思います。

windowsでもBCC Developerではメニュー「プロジェクト→メイク」で(ry


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

Name: yamataro  ..ぴよぴよ(244ポイント)   Date: 2010/06/24(木) 17:45   No:55215     
Title: Re:メイン関数を通らない    
テスト週間中で回答が遅れてすいません。
皆さんたくさんのコメントありがとうございます!

やはり2つのクラス型のグローバル変数に問題がありそうなのですが、
コンストラクタに無限ループは見つかりませんでした。
そこで宣言する位置を変更してみたのですが、なぜかそこの宣言のところで
「宣言の構文エラー」と出てしまいます(いい忘れましたがコンパイラはBorland C++ Compilerです)。
CからC++に変えたばかりなので原因がよく分かりません。
クラス型の変数はextern宣言できないのでしょうか?


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

Name: ookami  ..プログラマー(29,778ポイント)   Date: 2010/06/24(木) 17:54   No:55216     
Title: Re:メイン関数を通らない    
なんとなくですが、

chara.h
enemy.h

の中でも、
#ifndef INCLUDED


#endif
してませんか?「INCLUDED」という名前が同じで
charaのクラス宣言が飛ばされていたりしないかなと。

よろしければ、ソースをまるごとアップしてもらったほうが
早いかもしれません。

ていうかテスト週間中にゲーム作っt(ry
いやいや、私も人のこと言えませんからねwwww


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



Name: ookami  ..プログラマー(29,005ポイント)   Date: 2010/06/23(水) 15:34   No:55162       
Title: mySqlのhaving句について    
いつもお世話になっております。
mySqlでの質問です。

別スレでお見せしました掲示板について、
その後も可能性をさぐりつつ作り進めているのですが、
行き詰ってしまったところがあります。
一応回避はできるのですが、
どなたか分かりませんでしょうか...

「最小の id を持つレコードを取得する」クエリを投げようと、
最初、以下のようにしました。


[1]
SELECT * FROM T_integmessage having id=min(id)

戻り値なし


ということで、エラーではなかったのですが戻り値が無く、
ちょっと戸惑いつつ、
とりあえず2段階に分け、


[2]
SELECT min(id) FROM T_integmessage

min(id)
-------
10


としてmin(id)を取得してから、
以下のように[1]のmin(id)をマジックナンバー的にしたところ、


[3]
SELECT * FROM T_integmessage having id=10

id text
-- ----
10 なにがし...


と、期待した結果が得られました。

一応、php 側で[2][3]を順に投げるようにすれば回避できますが、
[1]がダメな理由を知りたいのです。
どなたか分かりませんでしょうか...


mysqlサーバのバージョン: 4.0.27

http://dev.mysql.com/doc/refman/4.1/ja/subqueries.html
> MySQL バージョン 4.1 以降では、標準 SQL で規定されているサブクエリのすべての形式と操作に加え、MySQL 固有のいくつかの機能をサポートしています。

ということで、今使っているサーバは4.1より前なので、サブクエリは使えないようです。
実際、 SELECT * FROM T_integmessage having id=(SELECT min(id) FROM T_integmessage)
はエラーでした。


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


Name: toyo  ..熟練のプログラマー(50,313ポイント)   Date: 2010/06/24(木) 07:34   No:55205     
Title: Re:mySqlのhaving句について    
havingの普通の使い方としては
having以下の条件を満たすgroupをselectする
という感じになると思います
select出来るのもgroup byで指定した列か集約関数だけなのでgroup byのないhavingはかなり特殊な使い方になりますね
私としては
SELECT * FROM T_integmessage having id=10 
で結果が表示されるほうに違和感を覚えます
検索したところgroup byのないhavingでは例外の発生するデータベースもあるようです
http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3U0700/EU070288.HTM

ちなみに最小値の選択の場合、私はソートして最初の列を取得しています


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

Name: ookami  ..プログラマー(29,387ポイント)   Date: 2010/06/24(木) 08:47   No:55206     
Title: Re:mySqlのhaving句について    
返答ありがとうございます!

>group byのないhavingでは例外の発生するデータベースもあるようです
うーん...そうなんですかね。示されたURLが何のデータベースか、ぱっと分からなかったのですが、
(HITACHI社の特有のデータベースでしょうか?)

mySqlでは以下の記述があります。
http://mysql.oss.eznetsols.org/doc/refman/5.1-olh/ja/group-by-functions.html
> GROUP BY 節を含まないステートメントでグループ関数を使用する場合、すべての行をグループ分けするのと同様の効果になります。

ということで、group by が無くてもよいと思うんですよ。

また、
http://mysql.oss.eznetsols.org/doc/refman/5.1-olh/ja/group-by-hidden-columns.html
> GROUP BY 節で名付けられていないカラムは、集約関数で使用されていない場合、SELECT リスト、または HAVING 節で利用することができません。
と、微妙な表現がされていますが、これで[1]がダメなら[2]もダメだろうし...

ということで、まだちょっとスッキリしません。すみません。

> ちなみに最小値の選択の場合、私はソートして最初の列を取得しています
確かにそうですね^^;
たまたま[1]から入ったので囚われていました。


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

Name: toyo  ..熟練のプログラマー(50,166ポイント)   Date: 2010/06/24(木) 12:44   No:55209     
Title: Re:mySqlのhaving句について    
HAVINGは単独で使えますがその場合SELECTで意味のあるのは集約関数のみということです
またはテーブル全体がある集約関数を使った条件を満たすかの判断には使えます
SELECT * FROM T_integmessage having max(id) > 20
というクエリで結果が得られればそのテーブルの最大idは20より大きいと判断できます
結果が得られなければ最大idは20以下ということになります
ただ得られた行には何の意味もないでしょう
SELECT * FROM T_integmessage having id=10 
ですが集約関数のないHAVINGはWHEREとみなされるのかもしれません
たまたま意図した結果が出ただけかもしれませんので私は使わないほうがいいと思います


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

Name: ookami  ..プログラマー(29,617ポイント)   Date: 2010/06/24(木) 14:33   No:55210 解決!     
Title: Re:mySqlのhaving句について    
お返事ありがとうございます!
ようやく分かってきました。

> 結果が得られればそのテーブルの最大idは20より大きいと判断できます

「MIN」「MAX」と、「<」「>」の組合せ4パターンで、
以下の[4]〜[7]のクエリを試してみました。

実際のデータでは、最小のidは10、最大のidは73ですので、
仰るとおりのようです。



[4]
SELECT * FROM T_integmessage HAVING MAX(id)>20

id text
-- ----
11 なにがし...

[5]
SELECT * FROM T_integmessage HAVING MAX(id)<20

戻り値なし

[6]
SELECT * FROM T_integmessage HAVING MIN(id)>20

戻り値なし

[7]
SELECT * FROM T_integmessage HAVING MIN(id)<20

id text
-- ----
11 なにがし...


たしかに、「得られた行には何の意味もない」ようですね。
ここまできて、ようやく最初のお返事の、
「select出来るのもgroup byで指定した列か集約関数だけ」
というのが理解できました。

「ソートして最初の列を取得」する方向で進めようと思います。

これにて「解決!」とさせていただきます。
ありがとうございました!


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



Name: NN  ..ぴよぴよ(353ポイント)   Date: 2010/06/24(木) 02:18   No:55196       
Title: 引数を用いる関数の戻り値について    
初めまして。
いつもお世話になっております。
非常に初歩的だと思われる質問をさせていただきます。

題名にもあるように、引数を用いる関数の作成に挑戦しています。
まずは、以下の関数を見ていただければと思います。


extern int fanctionB( int X, int Y );

void fanctionA(){
    fanctionB( i , j );
    fanctionB( k , l );
}

int fanctionB( int X, int Y ){
    if( X ){
        Y++;
    }
    else
        Y = 0 ;

    return 0 ;
}


ここで、何をしたいかというと、fanctionBを用いて、i,j,k,lの値を変化させたいと考えています。
具体的にはiが0でないときに、jをふやして、そうでないときに、jを0にもどす。
同じ様に、kが0でないときに、lをふやして、そうでないときに、lを0にもどす。
という風にしたいのですが、単純に、XやYがi,j,k,lに代入されていません。
これはfanctionBによって変化したX,Yを代入するには、fanctionBを実行した直後に
i=X,j=Y;などをかかないといけないのでしょうか?

いわゆる「行って来た値を、変化させて返してくる」という関数はどのように作成すればよろしいのでしょうか?
何か良いサンプルなどや解決法を教えていただければ幸いです。

以上になります。
お手数をお掛けしますが、ご教授いただければと思います。


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


Name: y  ..初心者(6,647ポイント)   Date: 2010/06/24(木) 02:30   No:55198     
Title: Re:引数を用いる関数の戻り値について    
functionBで返す値を0にしているところをYにして、
戻り値をそれぞれjやlに代入すればOKです。

以下、ほんの一例です。
extern int fanctionB( int X, int Y );

void fanctionA(){
    j = fanctionB( i , j );
    l = fanctionB( k , l );
}

int fanctionB( int X, int Y ){
    if( X ){
        Y++;
    }
    else
        Y = 0 ;

    return Y ;
}



赤い部分が変更箇所です。
NNさんの書いたfunctionBは、恐らく引数のYを変えれば元のjやlも変わるのではないかという考えだと思います。
しかし引数というものは、基本的に値渡し(変数の中身をコピーするだけ)なので、jとYは中身が同じでも全く異なる変数となります。


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

Name: フリオ  ..プログラマー(33,377ポイント)   Date: 2010/06/24(木) 03:35   No:55201     
Title: Re:引数を用いる関数の戻り値について    
 
一応突っ込み、
fanction ではなく function です。

>fanctionBを用いて、i,j,k,lの値を変化させたいと考えています。
 ポインタで渡してやれば出来ます。C++なら、参照で渡す方法もあります。
#include <stdio.h>

void func(int *a, int *b)
{
    *a = 1;
    *b = 2;
}

int main(void)
{
    int x = 0, y = 0;
    
    printf("x == %d, y == %d\n", x, y);
    func(&x, &y);
    printf("x == %d, y == %d\n", x, y);
    return 0;
}

 


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

Name: NN  ..ぴよぴよ(445ポイント)   Date: 2010/06/24(木) 05:13   No:55204 解決!     
Title: Re:引数を用いる関数の戻り値について    
>yさん
ありがとうございました!
冷静に考えれば、この関数は、iとkは返す必要がありませんでしたね。。。

>フリオさん
まさかのスペルミス! ずっと気づいていなかったです。。。ショック。。。
なるほど。そのような記述をすれば、複数の値を返すことができるのですね!
ありがとうございました!


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



Name: 小太鼓  ..ぴよぴよ(89ポイント)   Date: 2010/06/23(水) 00:38   No:55112       
Title: コピーコンストラクタについて    
はじめまして,小太鼓と申します.

C++の質問してもいいですよね・・・・?

ちょっとした疑問なんですけど,

以下のコードで,パターン1,2の結果が得られました.
#対応するコードはコメントアウトしてあります.

パターン1ではoperator=関数が呼び出されていますが,
パターン2では呼び出されていません.
それなのに,tttを出力すると期待通りの値が入力されています.
operator=が呼び出されてないならコピーコンストラクタかなと思ったんですが,
コピーコンストラクタはtttに関して呼び出されていません.

パターン2でtttに値がいつ入力されたのかわからない気持ち悪さが残っています.

ご協力願います.

パターン1
argument : Hello 0xbfdf6f98
argument : World 0xbfdf6f90
copy[Hello] 0xbfdf6f88
default[null] 0xbfdf6f84
--operator--
argument : foobar 0xbfdf6f80
0xbfdf6f98+0xbfdf6f90
/--operator--
operator= HelloWorld
destruct[HelloWorld] 0xbfdf6f80
output HelloWorld 0xbfdf6f84
destruct[HelloWorld] 0xbfdf6f84
destruct[Hello] 0xbfdf6f88
destruct[World] 0xbfdf6f90
destruct[Hello] 0xbfdf6f98

パターン2
argument : Hello 0xbf89cad8
argument : World 0xbf89cad0
copy[Hello] 0xbf89cac8
--operator--
argument : foobar 0xbf89cac4
0xbf89cad8+0xbf89cad0
/--operator--
output HelloWorld 0xbf89cac4
destruct[HelloWorld] 0xbf89cac4
destruct[Hello] 0xbf89cac8
destruct[World] 0xbf89cad0
destruct[Hello] 0xbf89cad8


#include<iostream>
#include<string>

class Test {

  public:
    Test() : str("null") {std::cout << "default[" << str << "] " << this << std::endl;}
    Test(std::string _str) : str(_str) {std::cout << "argument : " << str << " " << this << std::endl;}
    ~Test() {std::cout << "destruct[" << str << "] " << this << std::endl;}
    Test(const Test& t) {str = t.string(); std::cout << "copy[" << str << "] " << this << std::endl;}

    std::string string() const {return str;}
    void set(std::string _str) {str = _str;}

    void operator=(Test t) {

      str = t.string();
      std::cout << "operator= " << t.string() << std::endl;
    }

  private:
    std::string str;
};

Test operator+(Test& str_a, Test& str_b) {

  std::cout << "--operator--" << std::endl;

  Test t("foobar");

  std::cout << &str_a << "+" << &str_b << std::endl;

  t.set(str_a.string() + str_b.string());

  std::cout << "/--operator--" << std::endl;

  return t;
}

int main(int argc, char const* argv[]) {

  Test t("Hello"), tt("World");
  Test t2 = t;
//  パターン1
//  Test ttt;
//
//  ttt = t + tt;
//  パターン1終

//  パターン2
//  Test ttt = t + tt;
//  パターン2終

  std::cout << "output " << ttt.string() << " " << &ttt << std::endl;

  return 0;
}


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


Name: Justy  ..伝説なるハッカー(548,370ポイント)   Date: 2010/06/23(水) 01:09   No:55116     
Title: Re:コピーコンストラクタについて    
 RVO(戻値の最適化)ですね。しかも名前付きの。
 それによって operator+()の中で生成した tがそのまま呼び出し元の tttとして使われているのでしょう。 

 
Return value and constructor
http://www.fides.dti.ne.jp/~oka-t/cpplab-retval-ctor.html

RVOによるコピーコンストラクタの最適化 - (void*)Pないと
http://d.hatena.ne.jp/pknight/20090818/1250567769

行列ライブラリの設計(2) 12 一時オブジェクト(2)
 - 3.12.5 戻り値最適化
http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section03/section03_12.html



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

Name: 小太鼓  ..ぴよぴよ(209ポイント)   Date: 2010/06/23(水) 01:20   No:55117     
Title: Re:コピーコンストラクタについて    
Justyさま,

返信ありがとうございます.

URLじっくり拝見したいと思います.


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

Name: 小太鼓  ..ぴよぴよ(314ポイント)   Date: 2010/06/23(水) 01:49   No:55118     
Title: Re:コピーコンストラクタについて    

では,この場合はNRVOということになるのでしょうか?

RVOとNRVOの違いは名前の付いたオブジェクトを返した場合だと書いてあったんですが,
なにをもって名前つきと言ってるのでしょうか?

初心者なんでアホな質問ですが・・・

よろしくおねがいします.


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

Name: Justy  ..伝説なるハッカー(548,217ポイント)   Date: 2010/06/23(水) 02:01   No:55119     
Title: Re:コピーコンストラクタについて    
>この場合はNRVOということになるのでしょうか
 そうですね。

>なにをもって名前つきと言ってるのでしょうか? 
 変数‘名’があるかどうか、です。
 直接コンストラクタを呼び出した一時オブジェクトを戻り値にすると名前なしになります。


NRVO(RVO)とMove Semantics - 神様なんて信じない僕らのために
http://d.hatena.ne.jp/Isoparametric/20091219/1261192152


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

Name: YuO  ..熟練のプログラマー(46,918ポイント)   Date: 2010/06/23(水) 02:40   No:55122     
Title: Re:コピーコンストラクタについて    
・operator=がパターン2で呼ばれない点について
宣言文中の,declaratorに続く=はAssignment operatorsの=ではなく,initializerの=なので,初期化に使われます。
なので,
> Test ttt = t + tt;

Test ttt(t + tt);
は同等です。
ref) ISO/IEC 14882:2003 (以下IS) 8 Declarators / 8.5 Initializers
ref) IS 12 Special member functions / 12.6 Initialization / 12.6.1 Explicit initialization

なので,RVO云々を抜きにして,operator=は呼ばれません。

・RVOについて
一応,規格上の話を。
ref) IS 12.8 Copying class objects / Paragraph. 15
> When certain criteria are met, an implementation is allowed to omit the copy construction of a class object, even if the copy constructor and/or destructor for the object have side effects.
(略)
> - in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type, the copy operation can be omitted by constructing the automatic object directly into the function's return value
> - when a temporary class object that has not been bound to a reference would be copied to a class object with the same cv-unqualified type, the copy operation can be omitted by constructing the temporary object directly into the target of the omitted copy
最初の条件で,operator=内のtのreturnによるコピーが抑制され,さらに後の条件でoperator=の内のtの構築がtttの構築に置き換わります。
パターン1でも,最初の条件は使われていることに注意してください。
また,この省略は,副作用の有無にかかわらず実行されます。コピーコンストラクタやoperator=で副作用のあることをやろうとすると,すっ飛ばされることがあるので注意してください。

なお,規格上はRVOとNRVOの違いはありません。
実装側がどこまで対応しているかの違いです。


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

Name: ookami  ..プログラマー(26,497ポイント)   Date: 2010/06/23(水) 07:27   No:55123     
Title: Re:コピーコンストラクタについて    
RVOとかNRVOって初めて知りました…; いつも勉強になります。

以下、直接の回答にはなりませんが… 私の場合は、コピーコンストラクタとoperator=について理解が及ばず、以下のようにして封印しています。理解していない物は使わない方針で。

class T{
private:
    なにがし
public:
    なにがし
    T(T& obj);
    void operator=(T& obj);
};

それぞれ宣言だけして実装をかかないことで、うっかり使おうとしてもリンカがはじいてくれます。

…っていうやり方はまずいですかね。「それにも罠が」っていう事があったらご指摘ください。


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

Name: たかぎ [URL]  ..ハッカー(210,926ポイント)   Date: 2010/06/23(水) 08:40   No:55127     
Title: Re:コピーコンストラクタについて    
> うっかり使おうとしてもリンカがはじいてくれます。 

これはダメでしょう。
コピーを禁止するなら、コピーコンストラクタとコピー代入演算子をprivateにしないと。


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

Name: ookami  ..プログラマー(27,827ポイント)   Date: 2010/06/23(水) 09:06   No:55128     
Title: Re:コピーコンストラクタについて    
またやっちまったかw と思いましたが、ちゃんとリンカがはじいてくれました。



class T {
private:
    int i;
public:
    int j;
    T(){}
    ~T(){}
    T(T &obj); // コピーコンストラクタの宣言だけして実装を書かない
    void operator=(T &obj); // operator=の宣言だけして実装を書かない
};

void main(void) {
    T t1;

    // コピーコンストラクタ
    T t2(t1);

    // operator=
    T t3;
    t3=t1;
}

コンパイルしています...
main.cpp
リンクしています...
main.obj : error LNK2001: 外部シンボル ""public: void __thiscall T::operator=(class T &)" (??4T@@QAEXAAV0@@Z)" は未解決です。
main.obj : error LNK2001: 外部シンボル ""public: __thiscall T::T(class T &)" (??0T@@QAE@AAV0@@Z)" は未解決です。
c:\ookami\programming\test\Debug\test.exe : fatal error LNK1120: 外部参照 2 が未解決です。
ビルドログは "file://c:\ookami\programming\test\Debug\BuildLog.htm" に保存されました。
test - エラー 3、警告 0



↑コンパイルは通り、リンクで失敗しています。
たかぎさんがおっしゃるパターンでは、コンパイルの段階ではじいてくれました。



class T {
private:
    int i;
    T(T &obj); // コピーコンストラクタの宣言だけして実装を書かない
    void operator=(T &obj); // operator=の宣言だけして実装を書かない
public:
    int j;
    T(){}
    ~T(){}
};

void main(void) {
    T t1;

    // コピーコンストラクタ
    T t2(t1);

    // operator=
    T t3;
    t3=t1;
}

コンパイルしています...
main.cpp
c:\ookami\programming\test\main.cpp(18) : error C2248: 'T::T' : private メンバ (クラス 'T' で宣言されている) にアクセスできません。
        c:\ookami\programming\test\main.cpp(6) : 'T::T' の宣言を確認してください。
        c:\ookami\programming\test\main.cpp(3) : 'T' の宣言を確認してください。
c:\ookami\programming\test\main.cpp(22) : error C2248: 'T::operator =' : private メンバ (クラス 'T' で宣言されている) にアクセスできません。
        c:\ookami\programming\test\main.cpp(7) : 'T::operator =' の宣言を確認してください。
        c:\ookami\programming\test\main.cpp(3) : 'T' の宣言を確認してください。
ビルドログは "file://c:\ookami\programming\test\Debug\BuildLog.htm" に保存されました。
test - エラー 2、警告 0


あと、当然ですが、宣言もかかなければ、
勝手に生成されるコピーコンストラクタとoperator=が使われるので、
コンパイルもリンクも通りますね。
でもこれでは意図しない動作が(特にポインタをメンバに持っていると)起こるため、
まずご法度ですと。

class T {
private:
    int i;
public:
    int j;
    T(){}
    ~T(){}
};

void main(void) {
    T t1;

    // コピーコンストラクタ
    T t2(t1);

    // operator=
    T t3;
    t3=t1;
}

コンパイルしています...
main.cpp
リンクしています...
マニフェストを埋め込んでいます...
ビルドログは "file://c:\ookami\programming\test\Debug\BuildLog.htm" に保存されました。
test - エラー 0、警告 0


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

Name: たかぎ [URL]  ..ハッカー(211,004ポイント)   Date: 2010/06/23(水) 11:08   No:55132     
Title: Re:コピーコンストラクタについて    
> ↑コンパイルは通り、リンクで失敗しています。 
> たかぎさんがおっしゃるパターンでは、コンパイルの段階ではじいてくれました。 

sizeof演算子のオペランドにした場合など、リンカでエラーを検出できない場合があります。
また、仮に確実にリンクエラーにできるとしても、エラー検出は可能な限り前の段階で行うべきで、今回であればコンパイルエラーにできるわけですから、そうすべきです。


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

Name: ookami  ..プログラマー(28,492ポイント)   Date: 2010/06/23(水) 11:33   No:55136     
Title: Re:コピーコンストラクタについて    
> エラー検出は可能な限り前の段階で行うべきで、今回であればコンパイルエラーにできるわけですから、そうすべきです

確かに、私は「エラー検出は可能な限り前の段階で行う」のを軽視して、

class T { 
private: 
    int i; 
    T(T &obj);
    void operator=(T &obj);
public: 
    int j; 
    T(){} 
    ~T(){} 
};

より


class T { 
private: 
    int i; 
public: 
    int j; 
    T(){} 
    ~T(){} 
    T(T &obj);
    void operator=(T &obj);
}; 

のほうが何となく好み、というだけでこっちを採用していました。
(コンストラクタ、デストラクタ、コピーコンストラクタ、コピー代入演算子が並ぶので)

「エラー検出は可能な限り前の段階で行うべき」なのは分かりますので検討してみます。
というかすでにその気になってきましたw


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

Name: 小太鼓  ..ぴよぴよ(373ポイント)   Date: 2010/06/24(木) 00:35   No:55195     
Title: Re:コピーコンストラクタについて    

研究室が忙しくてあんまり見れてませんでした,すみません

疑問が解決してすっきりしましたし,他のユーザのみなさんも議論できる場が出来てうれしいです.


RVOの他にもこれは知っとくべきだというテクニックはあるんでしょうか?


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

Name: ISLe  ..ぴよぴよ(175ポイント)   Date: 2010/06/24(木) 04:09   No:55203     
Title: Re:コピーコンストラクタについて    
コンパイルエラーだと問題のあるコードにタグジャンプできますし。


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



Name: Cir  ..ぴよぴよ(43ポイント)   Date: 2010/06/20(日) 01:46   No:54849       
Title: 【雑談】ミニゲームを作ってみました    
はじめまして。Cirと申します。

ちっちゃなゲームを作ってみたので、よろしければ遊んでみてください。

http://www1.axfc.net/uploader/He/so/282714.zip
キーワード: Mini

[ルール]
自機(●)を操作してチップ(■)を集めます。
敵機(▲)に触れるとゲームオーバーとなります。

[操作方法]
方向キー: カーソルの移動、自機の向きを変更
Zキー:項目の決定
Xキー:項目のキャンセル


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,224,045ポイント)   Date: 2010/06/20(日) 02:44   No:54853     
Title: Re:【雑談】ミニゲームを作ってみました    
> Cirさん

面白いですね^^
これオリジナルゲームですか?
何か元になったゲームとかあるのでしょうか。

む〜、難しい^^;
なかなかスコアを伸ばす事が出来ません・・。

しかし、なんでウィンドウサイズがあのサイズなのでしょう?;


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

Name: Tatu  ..熟練のプログラマー(41,481ポイント)   Date: 2010/06/20(日) 08:36   No:54858     
Title: Re:【雑談】ミニゲームを作ってみました    
プレイしました。最高点は39点です。
画面が小さくてケータイのアプリみたいですね。


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

Name: シエル  ..中級者(11,338ポイント)   Date: 2010/06/20(日) 08:40   No:54860     
Title: Re:【雑談】ミニゲームを作ってみました    
遊ばせていただきました。数点しか取れなかった。
画面が大きかったらもっといけたかも。。。


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

Name: TKOZ  ..熟練のプログラマー(63,894ポイント)   Date: 2010/06/21(月) 18:38   No:54993     
Title: Re:【雑談】ミニゲームを作ってみました    
面白かったです。

→キーを押すと、右方向に回転移動し、
←キーを押すと、左方向に回転移動する
そして、画面端に触れると、移動量を反転させるという仕組みなのでしょうか?

まあ、そんな難しい事考えなくても面白かったです。


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

Name: バグ  ..ハッカー(198,027ポイント)   Date: 2010/06/21(月) 19:27   No:55003     
Title: Re:【雑談】ミニゲームを作ってみました    
ファミコンのクルクルランドを思い出しました(^-^)

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

Name: Cir  ..ぴよぴよ(167ポイント)   Date: 2010/06/22(火) 00:19   No:55041     
Title: Re:【雑談】ミニゲームを作ってみました    
返事が遅くなってしまい、申し訳ありません。

>>Dixqさん
プレイありがとうございます!
>これオリジナルゲームですか?何か元になったゲームとかあるのでしょうか。 
はい、オリジナルゲームです。シンプルなゲームを目指しました。ウィンドウのサイズが小さいのは、
携帯ゲームをイメージして製作したためです。(おかげで画面が見づらくなってしまいましたが…)

>>Tatuさん
プレイありがとうございます!
39点もとられたのですか!私には16点が限界でした…。
>画面が小さくてケータイのアプリみたいですね。 
携帯ゲームをイメージしたので、そう思っていただけるとうれしいです!

>>シエルさん
遊んでいただいて、ありがとうございます!
画面が小さいために、少しプレイしづらいですね…。
次回ゲームを作る際は、もっとプレイしやすいようにしなければいけませんね。

>>TKOZさん
>→キーを押すと、右方向に回転移動し、 
>←キーを押すと、左方向に回転移動する 
>そして、画面端に触れると、移動量を反転させるという仕組みなのでしょうか? 
はい、そのとおりです。少しわかりづらいですね…(ReadMeにもっと詳しく説明しておくべきだったかな?)。

>まあ、そんな難しい事考えなくても面白かったです。
ありがとうございます!製作したかいがありました!
これからも面白いと思っていただけるようなゲームを作ることが出来るようにがんばりたいと思います。

>>バグさん
>ファミコンのクルクルランドを思い出しました(^-^)
言われてみれば確かに似ていますね。残念ながら私はプレイしたことがありませんが…。
ファミコンには面白いゲームが多いですよね(個人的にはF1レース、スーパーマリオブラザーズが好きです)。


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

Name: バグ  ..ハッカー(198,044ポイント)   Date: 2010/06/23(水) 19:51   No:55179     
Title: Re:【雑談】ミニゲームを作ってみました    
一番大きい▲に当たってもゲームオーバーにならない事があるようです。

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

Name: ISLe  ..ぴよぴよ(146ポイント)   Date: 2010/06/24(木) 03:57   No:55202     
Title: Re:【雑談】ミニゲームを作ってみました    
> Cirさん

携帯ゲームを意識しているということですが、国内で発売されている携帯電話ではどのキャリアも解像度240x240を最低限保証していますのでもっと大きくて良いと思います。

240x240というのがどのくらいかというと最近だとアーケードゲームの怒首領蜂大復活とか240x320なのであれの横幅(短いほう)と同じと思ってください。
#画面の大きさだけで処理能力が同じという意味ではないですよ。
アーケードゲームも解像度の低いやつは携帯電話と同じくらいということです。


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



Name: inc  ..ぴよぴよ(307ポイント)   Date: 2010/06/23(水) 20:36   No:55184       
Title: C言語    
を使ってモンテカルロ法を作っているのですが、円周率(pi)が0.00000と表示されて
うまく表示できません。どこが間違っているのか教えてください。
関数プロトタイプで作れと言われているので変な形なのはご了承ください。


#include <stdio.h>
#include <stdlib.h>
#define N 10000

void print_result(int N_total,int N_in, double pi);
void print_result(int N_total,int N_in, double pi)
{
        
        printf("0.0〜1.0の乱数(x,y)%d組の内、\n (x*x+y*y)<1.0となるのは%d組なので、\n
モンテカルロ法により円周率は%lfとなる。",N_total,N_in,pi);
        return;
}

int main(void)
{
        double a,b,i,x,y;
        int j,is_in;
        
        j=0.0;
        for(i=0;i<=N;i++) 
        {
                x=rand()/(RAND_MAX+1.0);
                y=rand()/(RAND_MAX+1.0);        

                if((x*x+y*y)<1.0) 
                {                     
                      j+=1.0;
                                                         
                }
                else
                {
         is_in=0.0;
}
        }
        a=j/N*4.0;
        
        print_result( N ,j, a);
        
        return 0;
}


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


Name: パコネコ  ..入門者(3,654ポイント)   Date: 2010/06/23(水) 20:54   No:55187     
Title: Re:C言語    
失礼しま〜す
RAND_MAXってなんですか?


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

Name: mila  ..ぴよぴよ(74ポイント)   Date: 2010/06/23(水) 20:58   No:55188     
Title: Re:C言語    
ここを
a=j/N*4.0;
こうしてみてください。
a=(double)j/N*4.0;


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

Name: inc  ..ぴよぴよ(370ポイント)   Date: 2010/06/23(水) 21:04   No:55189 解決!     
Title: Re:C言語    
パコネコさん>
rand関数で返すことのできる最大値です。

milaさん>
解決しました。ありがとうございます。すごい盲点でした。。


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



Name: dic  ..比類無きプログラマー(79,000ポイント)   Date: 2010/06/23(水) 20:25   No:55183       
Title: OpenCVで画像認識用の学習用データを作る    
タイトルにあるとおりですが
OpenCVで画像認識を行いたいので画像認識用の為学習するデータを
作ろうとしてます
そして以下のサイトを参考にサンプルを作ったのですが
http://gihyo.jp/dev/feature/01/opencv/0004?page=3
sample.jpg はうまく学習されていなく
sample2.jpg はうまく学習され表示されます

sample2.jpg はほかの画像でも同じく学習されないのかな?と思って
テストしてみたところうまくいったので
sample.jpg の元画像に問題があるのか、わからない状態で
sample.jpg の学習用データが作れないです

どこに問題があるのでしょうか?

作業データのリンクです(サイズが大きいので
http://www1.axfc.net/uploader/H/so/109456
実行にはOpenCVのインストールが必要になるかもしれません


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




Name: ookami  ..プログラマー(28,521ポイント)   Date: 2010/06/23(水) 12:19   No:55146       
Title: 解決マークの動きのテスト(雑談)    
誠に勝手ながら、解決マークの動きを確認させてもらいます...
 編集済み


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


Name: ookami  ..プログラマー(28,561ポイント)   Date: 2010/06/23(水) 12:20   No:55147     
Title: Re:解決マークの動きのテスト(雑談)    
55146を「編集」で「解決!」チェックを外したところ、一覧でも「解決!」がなくなったことを確認。

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

Name: ookami  ..プログラマー(28,593ポイント)   Date: 2010/06/23(水) 12:20   No:55148 解決!     
Title: Re:解決マークの動きのテスト(雑談)    
改めてレスして「解決!」してみる。

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

Name: ookami  ..プログラマー(28,602ポイント)   Date: 2010/06/23(水) 12:21   No:55149     
Title: Re:解決マークの動きのテスト(雑談)    
一覧でも「解決!」したことを確認。

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

Name: ookami  ..プログラマー(28,751ポイント)   Date: 2010/06/23(水) 12:24   No:55151     
Title: Re:解決マークの動きのテスト(雑談)    
すみません、
http://www.play21.jp/board/formz.cgi?action=res&resno=54525&page=&id=dixq&rln=55142#55150
のために確認させていただきました。
不要であればスレごと削除していただいてかまいません。

失礼しました。m(_ _)m 


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

Name: toyo  ..熟練のプログラマー(50,252ポイント)   Date: 2010/06/23(水) 12:49   No:55154 解決!     
Title: Re:解決マークの動きのテスト(雑談)    
さらに解決を

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

Name: ookami  ..プログラマー(28,987ポイント)   Date: 2010/06/23(水) 12:54   No:55155 解決!     
Title: Re:解決マークの動きのテスト(雑談)    
そうか、他人に「解決!」されると編集パスワードが分からないから消せないんですねwwww

なんとなくさらに解決を

---

解決しわすれました 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,226,055ポイント)   Date: 2010/06/23(水) 17:59   No:55168     
Title: Re:解決マークの動きのテスト(雑談)    
解決マークはそのトピに誰かが一度でも付けると表示されてしまい、
トピ主じゃなくても適用されてしまうので、勝手に解決になる場合もありますね;

しかも削除キーを入れていなければ間違って解決マークを付けたのはもう外せないという・・。
まぁそのような事があれば教えて下さい;


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

Name: ookami  ..プログラマー(29,117ポイント)   Date: 2010/06/23(水) 19:02   No:55172     
Title: Re:解決マークの動きのテスト(雑談)    
> まぁそのような事があれば教えて下さい;

了解しました。「トピ主じゃなくても適用されてしまう」なども、一長一短ですし…

今作られているという掲示板で、うまい解決策が見つかるとよいですねw


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,226,162ポイント)   Date: 2010/06/23(水) 19:14   No:55175     
Title: Re:解決マークの動きのテスト(雑談)    
はい、ありがとうございます^^

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



Name: トマト  ..ぴよぴよ(428ポイント)   Date: 2010/06/17(木) 11:10   No:54525       
Title: 複数あるファイル内の重複を探す方法    
ファイルの内にある文字列をgrepするような操作をさせたい
最終的には、複数のファイル内という拡張させてたいのです。
どうしたらいいのか、ご教授頂けると幸いです。

現在は、引数でファイルを指定してそのファイルの中身を表示させる部分を構築しましたが
配列に格納して検索させるようにしたいのですが
それすらできずにいます。

/* ファイルの中身表示 */
if((fp = fopen( *argv, "rb" )) == NULL)                
{
    printf("can not open file. %s\n", *argv);
    return -2;
}
printf("file open success\n");
size = fread( buff, sizeof(char), STRING_MAX, fp);
if(size == 0)
{
    printf("Can not Open FILE\n");
    fclose(fp);
    return -3;
}
for(count=0; count<size; count++)
{
    printf("count[%d],%s\n", count,buff);
}

buff内にデータが格納されているのでしょうか?
どうしたら重複検索して一つだけ残すようにできるのでしょうか?

どうかよろしくお願いします。


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


Name: トマト  ..ぴよぴよ(592ポイント)   Date: 2010/06/17(木) 13:47   No:54534     
Title: Re:複数あるファイル内の重複を探す方法    
補足で追記します。上記のプログラムの出力結果は以下のようになっていました

count[0],2010/05/02 
00:00
iso.3.6.1.2.1.4.22.1.2.9 192.168.0.1 = Hex-STRING: 00 00 00 00 QQ AH
iso.3.6.1.2.1.4.22.1.2.9.143.125.64.93 = Hex-STRING: 00 00 00 43 ZZ 80 
2010/05/02 
12:00
iso.3.6.1.2.1.4.22.1.2.9.143.125.64.92 = Hex-STRING: 00 00 00 AA B1 55 
iso.3.6.1.2.1.4.22.1.2.9.143.125.64.93 = Hex-STRING: 00 00 00 5A X9 AB 

count[1],2010/05/02 
00:00

配列[0] と配列[6]を比較する等の検索をしたいと思っております。
どうか知識をお借りできないでしょうか?


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

Name: ookami  ..上級者(24,687ポイント)   Date: 2010/06/17(木) 19:37   No:54544     
Title: Re:複数あるファイル内の重複を探す方法    
はじめに、意地悪を言うつもりではないことを断っておきます。

> 文字列をgrepする
> 配列に格納して検索させる
> buff内にデータが格納されているのでしょうか?
> 重複検索して一つだけ残す
> 配列[0]と配列[6]を比較する
このあたりについて、もうちょっと説明を補足してもらえませんか?いまいち意味がわかりません。

あと、開発環境などもお願いします。


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

Name: トマト  ..ぴよぴよ(837ポイント)   Date: 2010/06/18(金) 09:20   No:54593     
Title: Re:複数あるファイル内の重複を探す方法    
分かりにくくて、すみませんでした。

開発環境は CentOS 5.2(Linux), C言語で書いています。

1つのファイルの中に、
iso.3.6.1.2.1.4.22.1.2.9 192.168.0.1 = Hex-STRING: 00 00 00 00 QQ AH 
のような文字列が20行くらいあるもの、5行しかないもの等バラバラで

ファイルの中には「192.168.0.1」と「00 00 00 00 QQ AH」のペアが重複して
混ざっているものがあります。
それを探すプログラムを作りたくて相談させていただきました。
重複があった場合は一つ消します。(重複箇所をなくす)

ファイル総数は30くらいです。
その30ファイルの中から重複箇所をなくすプログラムを作成したいです。

現在は以下にしてみました。(引数で検索したいファイルを指定)
 if((fp = fopen( *argv, "rb" )) == NULL)
  { 
    printf("can not open file. %s\n", *argv);
    return -2;
  }
  size = fread( buff, sizeof(char), STRING_MAX, fp);
  if(size == 0)
  {
    printf("Can not Open FILE\n");
    fclose(fp);
    return -3;
  }
  for(i=0;i<size; i++)
  {
     strcpy(data,buff);
  }
  fscanf(fp,"\n");
  fclose(fp);

まだまだ、分かりにくい点あると思います。指摘してくだされば直します。
どうかよろしくお願いします。


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

Name: シエル  ..中級者(9,762ポイント)   Date: 2010/06/18(金) 10:23   No:54594     
Title: Re:複数あるファイル内の重複を探す方法    
>重複があった場合は一つ消します。(重複箇所をなくす)
この意味は重複してる行をファイルから直接削除したいということでしょうか?

それと変数の宣言やmain関数などが含まれるコードをすべて貼っていただけますか?


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

Name: へろり  ..中級者(9,813ポイント)   Date: 2010/06/18(金) 10:23   No:54595     
Title: Re:複数あるファイル内の重複を探す方法    
具体的な事はさっぱりわかりませんが、やりたいことは何となく解りました。

とりあえず、ハッシュテーブルでも作ってテーブルの要素をリストで繋いで行けばいいんじゃないですか?

「192.168.0.1」と「00 00 00 00 QQ AH」をそれぞれ1つの語として扱うのなら、それをどんどん放り込んで行って、コリジョンを起こせば重複していることが解りますね。

で、コリジョンを起こさなければ、ファイルに書き込み、起こせばスルー。
それで出来ると思います。


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

Name: トマト  ..かけだし(1,336ポイント)   Date: 2010/06/18(金) 11:16   No:54597     
Title: Re:複数あるファイル内の重複を探す方法    
>重複してる行をファイルから直接削除したいということでしょうか?
->その通りです!

>それと変数の宣言やmain関数などが含まれるコードをすべて貼っていただけますか?

引数で指定されたファイルを配列にコピーしてみました。
(配列に入っているか自信はないですが・・・)

#define STRING_MAX 10000
#define ARP_INFO 2048

int main(int argc, char **argv)
{
        FILE *fp;
        //unsigned char buf[STRING_MAX];
        char buff[STRING_MAX];
        //char arpinfo[STRING_MAX];
        int  i, j, count;
        int chk;
        size_t size;
        char data[ARP_INFO];

        if(argc < 2)
        {
            printf("Usage : XTYPE filename1 [filename2 ...]\n");
            return -1;
        }
        while(--argc)
        {
            ++argv;
            if((fp = fopen( *argv, "rb" )) == NULL)
            {
                printf("can not open file. %s\n", *argv);
                return -2;
            }
            size = fread( buff, sizeof(char), STRING_MAX, fp);
            if(size == 0)
            {
                printf("Can not Open FILE\n");
                fclose(fp);
                return -3;
            }
            for(i=0;i<size; i++)
            {
                strcpy(data,buff);
            }
            fscanf(fp,"\n");
            fclose(fp);
        }
        return 0;
}

ハッシュは考えていませんでした!
取りあえず

配列[0]とマッチするのは配列[x]はある?
配列[1]とマッチするのは配列[x]はある?
配列[2]とマッチするのは配列[x]はある?
と、検索をしようとしていました。

いい方法ありましたら教えてください。

申し訳ありませんが、知識不足でハッシュテーブルのやり方をする場合のコードも
どのようにするのかさえ分かっていません。



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

Name: ookami  ..上級者(24,777ポイント)   Date: 2010/06/18(金) 11:50   No:54599     
Title: Re:複数あるファイル内の重複を探す方法    
まだいまいち分からないのですが、とりあえずハッシュの話が出たので、以下が参考になるでしょうか?
http://oshiete.homes.jp/qa3257451.html

あと、
> buff内にデータが格納されているのでしょうか? 
> (配列に入っているか自信はないですが・・・) 
このような場合はprintfか何かで画面に出力すれば確認できると思います。


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

Name: へろり  ..中級者(10,491ポイント)   Date: 2010/06/18(金) 12:14   No:54600     
Title: Re:複数あるファイル内の重複を探す方法    
やっぱり今ひとつ不明瞭です。

>引数で指定されたファイルを配列にコピーしてみました。
この配列というのは char buff[STRING_MAX]; の事ですよね。

>配列[0]とマッチするのは配列[x]はある? 
>配列[1]とマッチするのは配列[x]はある? 
>配列[2]とマッチするのは配列[x]はある? 
の、配列というのも char buff[STRING_MAX]; の事ですよね。

この配列にはファイルの中身のバイト列が納められていますので、buf[x]には、
改行コード等を含めファイルの先頭からxバイト目が1バイト納められています。
上記の文の、"配列[0]とマッチするのは配列[x]はある? "というのは、
0バイト目とxバイト目の文字を比較するのだと解釈できますがいかがでしょう。

おそらく、トマトさんが要求する仕様とは違いますよね?

比較の対象となる語が不明瞭です。


あまり1度に考えず1つ1つ丁寧にやって行けばそんなに難しいことはないと思いますよ。

手順としては、
1.ファイルを開く。
2.1行読み込む。
3.必要な語を切り出す。
4.どっかに覚えさせておく。
  この時に比較します。 もしすでに覚えている語だったら重複しています。
  で、まだ覚えていない語だった場合のみ、別のファイルに書き出すようにします。
5.ビールを飲む。

これらを1つ1つ関数化すれば、より見通しがよくなるわかりやすくなると思います。


ハッシュテーブルはただの配列ですよ。
ハッシュのコリジョン対策として、各要素をリスト構造で実装しましょうねというだけの事です。
ですから、構造体のポインタの配列ということになりますね。






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

Name: へろり  ..中級者(10,568ポイント)   Date: 2010/06/18(金) 12:19   No:54601     
Title: Re:複数あるファイル内の重複を探す方法    
私がここで言うハッシュというのは、Perlで言うところの連想配列ではなく、もっと広い意味でのハッシュです。

アルゴリズムの解説はここに詳しく。
http://www.geocities.jp/ky_webid/algorithm/014.html


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

Name: トマト  ..かけだし(1,877ポイント)   Date: 2010/06/18(金) 13:14   No:54602     
Title: Re:複数あるファイル内の重複を探す方法    
>0バイト目とxバイト目の文字を比較するのだと解釈できますがいかがでしょう。
>おそらく、トマトさんが要求する仕様とは違いますよね? 
そうです。違いますね。行単位での比較で行いたいです。

1つのファイルの中身は以下のようになっています。
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.11 = Hex-STRING: 00 00 00 CB 12 CC
iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.1 = Hex-STRING: 00 00 00 0A 58 2E
iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.12 = Hex-STRING: 00 00 00 AB 1E DF
(以下40行くらい続く・・・)


を以下のようにしました
配列[0]iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
配列[1]iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.11 = Hex-STRING: 00 00 00 CB 12 CC
配列[2]iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.1 = Hex-STRING: 00 00 00 0A 58 2E
配列[3]iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.12 = Hex-STRING: 00 00 00 AB 1E DF
char buff[STRING_MAX] の中身↑
printf()で表示させた結果で確認しました。

そのchar buff[STRING_MAX]で
配列[0] の [192.169.61.1] と [00 00 00 00 66 10]の組み合わせ
配列[1] の [192.169.61.11] と [00 00 00 CB 12 CC]の組み合わせ
配列[2] の [192.169.62.1] と [00 00 00 0A 58 2E]の組み合わせ
配列[3] の [192.169.62.12] と [00 00 00 AB 1E DF]の組み合わせ
比較したい文字を明確にする。


配列[0] と 配列[1] は同じもの?
配列[0] と 配列[2] は同じもの?
配列[0] と 配列[3] は同じもの?
配列[0] と 配列[4] は同じもの?

もし、配列[0] と 配列[1] は同じものならば配列[0]だけにしたい

重複箇所を取り除いたものを別ファイルにて保存。
ファイル総数は30前後。その30あるファイルには最終的に重複箇所は「なし」とする。

>1つ1つ関数化すれば、より見通しがよくなるわかりやすくなると思います。 
ありがとうございます。まずは、一つづつ関数化してみます。


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

Name: トマト  ..かけだし(1,538ポイント)   Date: 2010/06/18(金) 16:54   No:54611     
Title: Re:複数あるファイル内の重複を探す方法    

アドバイスをください

>1.ファイルを開く。
>2.1行読み込む。
>3.必要な語を切り出す。

char *substr(char *buffer, const char *string, int start, int stop)
{
        memmove(buffer, string + start, stop - start);
        buffer[stop - start]= '\0';

        return 0;
}
上記のような関数を利用し
>3.必要な語を切り出す。をしています。

substr(mojiIP, data, 45, 59);/* IP ADDRESS */
substr(mojiMAC, data, 74, 93); /* MAC ADDRESS */                

/* 文字列の連結 */      
strcat(mojiIP, ",");
strcat(mojiIP, mojiMAC);
(192.169.61.1,00 00 00 00 66 10が取り出せる)

これでは、以前に指摘いただいた
>0バイト目とxバイト目の文字を比較する
になってしまい、

今回やりたい
配列[0]iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
配列[1]iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.11 = Hex-STRING: 00 00 00 CB 12 CC 
の比較ができなくなってしまいました。
どのようにすれば比較できるようになれるのでしょうか?


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

Name: シエル  ..中級者(10,525ポイント)   Date: 2010/06/18(金) 17:58   No:54615     
Title: Re:複数あるファイル内の重複を探す方法    
バイナリモードで読み込むと改行をうまく読めないので、
テキストモードで読みこむようにし、下記のようなコードを書いてみました。

一応、「192.168.0.1」と「00 00 00 00 QQ AH」のペアがファイル内に重複していた場合、
「192.168.0.1」と「00 00 00 00 QQ AH」のペアを一回だけファイルに書きだし、
その他の文字列は順番にすべて書きだすようにしています。

コンパイル後、実行ファイルに該当のファイルをドラッグすると、重複を除いたtesttmp.txtが
作成されるようにしています。

イメージと違うかもしれませんが、参考になれば幸いです。

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

int main(int argc,char *argv[])
{
    char s1[]="192.168.0.1";
    char s2[]="00 00 00 00 QQ AH";
    char tmp[1024];
    int flag=0;
    
    FILE *fp,*fp2;
    if(argv[1]==NULL)
        return -1;

    fp2=fopen("testtmp.txt","w");

    fp=fopen(argv[1],"r");
    if(fp==NULL){
        printf("ファイルオープン失敗");
        return -1;
    }

    while(fgets(tmp,sizeof(tmp),fp)){
        if(strstr(tmp,s1)){
            if(strstr(tmp,s2)){
                if(flag==0){
                    fprintf(fp2,"%s",tmp);
                    flag=1;
                }
            }else{
                fprintf(fp2,"%s",tmp);
            }
        }else{
            fprintf(fp2,"%s",tmp);
        }

    }

    fclose(fp);
    fclose(fp2);

    return 0;
}


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

Name: ぽこ  ..上級者(15,622ポイント)   Date: 2010/06/18(金) 18:40   No:54620     
Title: Re:複数あるファイル内の重複を探す方法    
> 重複箇所を取り除いたものを別ファイルにて保存。 
> ファイル総数は30前後。その30あるファイルには最終的に重複箇所は「なし」とする。 

ここをもっと明確にしませんか?
処理後のファイル数は処理前と変わらないんですよね?
では、2つのファイルAとBに重複rが見つかったとして、どっちのrが消えるのですか?


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

Name: へろり  ..中級者(11,384ポイント)   Date: 2010/06/19(土) 08:40   No:54672     
Title: Re:複数あるファイル内の重複を探す方法    
>>3.必要な語を切り出す。をしています。 

>substr(mojiIP, data, 45, 59);/* IP ADDRESS */ 
>substr(mojiMAC, data, 74, 93); /* MAC ADDRESS */                 

>/* 文字列の連結 */       
>strcat(mojiIP, ","); 
>strcat(mojiIP, mojiMAC); 
>(192.169.61.1,00 00 00 00 66 10が取り出せる) 

ちょっと言い方が悪かったようです。
私の言う必要な語というのは、検索に必要な最終的な語のことです。
"192.169.61.1,00 00 00 00 66 10"が取り出せるというのは、上で切り出した2つの文字列を1セットに、それが重複していないかを調べるのですか?
私はてっきり"iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10 "という文字列が重複していないかを調べるのだと思っていましたが、どっちなんでしょう?


>これでは、以前に指摘いただいた 
>>0バイト目とxバイト目の文字を比較する 
>になってしまい、 

>今回やりたい 
>配列[0]iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10 
>配列[1]iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.11 = Hex-STRING: 00 00 00 CB 12 CC  
>の比較ができなくなってしまいました。 
>どのようにすれば比較できるようになれるのでしょうか? 

"iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10"自体がすでに文字の配列ですので、この文字の配列をさらに配列に納めるのならば、配列の配列を利用する必要があります。


ざくっと外枠だけ書いておきます。

#define LINE_MAX            1024        //1行あたりの最大文字数

static char **table = NULL;                //テーブル
static int tblSize = 0;                    //テーブルのサイズ(利用可能サイズ)
static int useSize = 0;                    //テーブルの使用済みサイズ

int AddString(const char *buf)
{
    int i;

    //テーブルから検索して、すでに覚えていれば1を返す。
    for(i = 0;i<useSize;i++){
        if(!strcmp(table[i], buf)) return 1;
    }

    //テーブルに覚えさせる。
    if(useSize >= tblSize){
        tblSize += 100;
        table = realloc(table, sizeof(char**) * tblSize);
    }
    table[useSize] = malloc(LINE_MAX);
    strcpy(table[useSize], buf);
    useSize++;

    return 0;
}


main()
{
    while(--argc){
        FILE *fr, *fw;
        char line[LINE_MAX];

        fr = fopen();        //読み込みファイルのオープン
        fw = fopen();        //書き込みファイルのオープン

        //1行ずつ読み込む
        while(fgets(line, LINE_MAX, fr)){
            char *word;

            //語の切り出し
            word = substr(line);

            //テーブルへ追加
            if(AddString(word)) continue;    //重複してたらとっとと次の行

            //ファイルへ書き込み
            fprintf();
        }

        fclose(fr);
        fclose(fw);
    }

    return 0;
}


こーんな感じでいいかと。
テーブルは語の数に応じてニョキニョキと伸長させてます。
単純な線形探索です。

見ての通りコンパイルは通りませんのでしてません。
変数名なんかのタイプミスはないと思います。 あったらごめんなさい。


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

Name: トマト  ..かけだし(1,862ポイント)   Date: 2010/06/19(土) 11:45   No:54703     
Title: Re:複数あるファイル内の重複を探す方法    
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10 "という文字列が重複していないかを調べる

が、やりたいことです。

 > 重複箇所を取り除いたものを別ファイルにて保存。  
> ファイル総数は30前後。その30あるファイルには最終的に重複箇所は「なし」とする。   

@どちらか一方だけが消えれば良いです。
Aファイル内の重複を消す。

ひとつのファイルの中身
検索-> 重複箇所発見-> ひとつにする

上記のような事をしたいファイルは30前後ある。

ファイルは、
4/10 いくつマシンがネットワークにあるか(IPアドレス&MACアドレス情報)
4/11 いくつマシンがネットワークにあるか(IPアドレス&MACアドレス情報)
4/12 いくつマシンがネットワークにあるか(IPアドレス&MACアドレス情報)
重複は必然と出てきてしまう。

コードありがとうございます!
さっそく作成してみます。



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

Name: ぽこ  ..上級者(16,874ポイント)   Date: 2010/06/19(土) 21:44   No:54784     
Title: Re:複数あるファイル内の重複を探す方法    
もう1点確認させてください。
プログラム作らなきゃ駄目ですか?
UNIX系のコマンド組み合わせるだけで行ける気がするんですが。。

grep 'iso.3.' *| sort -u > result.txt


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

Name: トマト  ..かけだし(1,953ポイント)   Date: 2010/06/21(月) 13:11   No:54970     
Title: Re:複数あるファイル内の重複を探す方法    
>grep 'iso.3.' *| sort -u > result.txt

このコマンド、初めて知りました。まさに「やりたい事」です!

ファイル数が多くて、その度にコマンドを入力しないといけないのを避けたいので
プログラムを組もうとしておりました。


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

Name: トマト  ..かけだし(2,201ポイント)   Date: 2010/06/21(月) 16:56   No:54991     
Title: Re:複数あるファイル内の重複を探す方法    
へろりさんが 教えて下さった方法でさらに質問です。

static char **table = NULL;

int AddString(const char *buf)
{
    int i;    //テーブルから検索して、すでに覚えていれば1を返す。
    for(i = 0;i<useSize;i++){        if(!strcmp(table[i], buf)) return 1;
    }
    //テーブルに覚えさせる。
    if(useSize >= tblSize){
        tblSize += 100;
        table = realloc(table, sizeof(char**) * tblSize);
    }
    table[useSize] = malloc(LINE_MAX);
    strcpy(table[useSize], buf);
    useSize++;

    return 0;
}

error: invalid conversion from ‘void*’ to ‘char*’になってしまいまして、
メモリの割り当ては単純にmallocだけではダメなものなのでしょうか?
恥ずかしい事に、よく理解ができなくてなってしまいました。



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

Name: シエル  ..中級者(12,567ポイント)   Date: 2010/06/21(月) 18:54   No:54997     
Title: Re:複数あるファイル内の重複を探す方法    
malloc(LINE_MAX)
↑これだけで、動的に確保できるんですかね?
型とか指定しなくていいのでしょうか?あまり詳しくないので分かりませんが。


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

Name: ぽこ  ..上級者(16,849ポイント)   Date: 2010/06/21(月) 19:08   No:55000     
Title: Re:複数あるファイル内の重複を探す方法    
> >> 
> このコマンド、初めて知りました。まさに「やりたい事」です!

> ファイル数が多くて、その度にコマンドを入力しないといけないのを避けたいので
> プログラムを組もうとしておりました。

シェルスクリプト組んでください。
以下サンプルです(動作確認してません)。
----sample.sh----
#!/bin/bash

for i in *
do
    grep 'iso.3.' $i| sort -u > $i_result.txt
done

----sample.sh----

実行すのも面倒ならcronでデイリーに実行すればOKです。


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

Name: トマト  ..かけだし(2,439ポイント)   Date: 2010/06/22(火) 09:01   No:55058     
Title: Re:複数あるファイル内の重複を探す方法    
シエルさんが教えて下さった方法で、配列に検索文字を格納させている方法で、
検索文字対象文字が可変な場合にはできませんでした。
ハッシュテーブルを考えていく方向で変更してみます。

メモリ確保で、reallocでメモリの割り当てを変更して、mallocでメモリを確保しないと
ダメなのでしょうけど、
コンパイルエラーが取れなかったのでreallocを行わずにメモリ確保させてしまってます。

>シェルスクリプト組んでください。
サンプルまで、本当にありがとうございます!
ですがこのままのLinux環境からWindowsに以降させなければならないので
プログラムを作成しています。
windowsの移植環境はVC++2010です。


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

Name: シエル  ..中級者(13,839ポイント)   Date: 2010/06/22(火) 09:31   No:55059     
Title: Re:複数あるファイル内の重複を探す方法    
>ファイルの中には「192.168.0.1」と「00 00 00 00 QQ AH」のペアが重複して 
>混ざっているものがあります。 
このようにおっしゃっていたので、このペアのやつだけ重複してるやつを
除けばいいと思ってました。すいません。。

時間があったら考えてみます。



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

Name: へろり  ..中級者(13,297ポイント)   Date: 2010/06/22(火) 10:00   No:55061     
Title: Re:複数あるファイル内の重複を探す方法    
>error: invalid conversion from ‘void*’ to ‘char*’になってしまいまして、 
>メモリの割り当ては単純にmallocだけではダメなものなのでしょうか?

すみません、C言語の話だと勝手に勘違いしていました。
C++では、void*型から、他のポインタ型へキャストする場合は、明示的なキャストを行わない場合エラーとなります。
ので、キャストしてください。


>malloc(LINE_MAX) 
>↑これだけで、動的に確保できるんですかね? 
>型とか指定しなくていいのでしょうか?あまり詳しくないので分かりませんが。

型を指定と言うのがよくわかりませんが。malloc()関数の戻り値はvoid*型です。
プロトタイプは次のようになっています。

void* malloc(size_t size);

引数は1個で、確保したいバイト数を指定します。


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

Name: トマト  ..入門者(2,686ポイント)   Date: 2010/06/22(火) 10:47   No:55063     
Title: Re:複数あるファイル内の重複を探す方法    

static char **table = NULL;

table = realloc(table, sizeof(char**) * tblSize);
table[useSize] = malloc(LINE_MAX);

へろり さんが作ってくださったコードで、上記の部分があり
このままではコンパイルエラーでしたので、以下のようにキャストしました。
table[useSize] = (char *)malloc(LINE_MAX);

同じようにrealloc()も 戻り値はvoid*型でしたが以下のようにしました
table = realloc((char *)table, sizeof(char**) * tblSize);

コンパイルしてみると 
error: invalid conversion from ‘void*’ to ‘char**’
で、キャストできていなかったので、メモリの割り当てをおこなわなくてもダメでしょうか?
と質問させていただきました。


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

Name: へろり  ..中級者(13,724ポイント)   Date: 2010/06/22(火) 11:15   No:55065     
Title: Re:複数あるファイル内の重複を探す方法    
>同じようにrealloc()も 戻り値はvoid*型でしたが以下のようにしました 
>table = realloc((char *)table, sizeof(char**) * tblSize);

>コンパイルしてみると  
>error: invalid conversion from ‘void*’ to ‘char**’ 
>で、キャストできていなかったので、メモリの割り当てをおこなわなくてもダメでしょうか? 
>と質問させていただきました。 


メモリの確保は必ず行うようにしてください。
char **table; はNULLで初期化されていますから、table[useSize] = malloc(LINE_MAX);のコードで落ちます。


キャストが必要なのはvoid*型から、具体的なポインタ型へ変換する場合です。
realloc() 関数の戻り値はvoid*型ですから、これを他のポインタ型へ変換する場合にキャストが必要となります。

ですから、上記のコードは次のようになります。
table = (char**)realloc(table, sizeof(char**) * tblSize);

ちなみにこの変数 table は char** 型です。


ついでに言うと、このテーブルにはハッシュは使っていませんよ。


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

Name: トマト  ..入門者(2,816ポイント)   Date: 2010/06/22(火) 11:48   No:55066     
Title: Re:複数あるファイル内の重複を探す方法    
大変申し訳ないですが質問させてください

//1行ずつ読み込む
   while(fgets(line, LINE_MAX, fr)){
   //語の切り出し
   word = substr(line);
   
   //テーブルへ追加                if(AddString(word)) continue;    //重複してたらとっとと次の行

 error: ‘substr’ was not declared in this scope
の上記エラーがでてしまいましたのでstrcpy(word,line); と置き換えは可能でしょうか?

substrをしようする際に 
#include <iostream>
#include <string> と using namespace std;を入れ str.substr
と使用する例のものがあったのですが
コンパイルエラーがとれませんでした。ですので、strcpyで逃げて見てるのですが






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

Name: へろり  ..中級者(14,016ポイント)   Date: 2010/06/22(火) 12:02   No:55067     
Title: Re:複数あるファイル内の重複を探す方法    
>  error: ‘substr’ was not declared in this scope
> の上記エラーがでてしまいましたのでstrcpy(word,line); と置き換えは可能でしょうか?

テキスト文書の1行を1語として扱うのならば、可能です。
fgets()関数は1行を読み出しますから、この時にすでに語の切り出しは完了していると見なせます。
また、その場合はwordは必要ありません。 AddString(line); として大丈夫です。


> substrをしようする際に 
> #include <iostream>
> #include <string> と using namespace std;を入れ str.substr
> と使用する例のものがあったのですが
> コンパイルエラーがとれませんでした。ですので、strcpyで逃げて見てるのですが

正直C++はさっっぱり解りませんのでここはスルーしますが、上記のエラーは単にプロトタイプ宣言が見つからないってだけの事だと思いますよ。


せっかくコンパイラがいろいろと教えてくれてるのですから、エラーが出たから代替手段を探すのではなく、どうしたら解決出来るのかもっとじっくりと考えてみることをおすすめします。
コンパイラが何を言ってるのか解らなければ、コンパイラの言った事をそのままグーグル先生に聞けば大抵の事は解りますから。


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

Name: トマト  ..入門者(2,917ポイント)   Date: 2010/06/22(火) 14:37   No:55068     
Title: Re:複数あるファイル内の重複を探す方法    
ありがとうございました。何とか動くようになりました。
ですが、読み込んだファイルをそのまま別ファイルに書き出しているようになってしまいました

grep 'iso.3.' (ファイル名)| sort -u > $find.txt
で表示される結果と違うのですが

どこをなおしたらいいのか分からなくなっています。
教えて頂けないでしょうか?


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

Name: へろり  ..中級者(14,199ポイント)   Date: 2010/06/22(火) 21:00   No:55075     
Title: Re:複数あるファイル内の重複を探す方法    
> ありがとうございました。何とか動くようになりました。
> ですが、読み込んだファイルをそのまま別ファイルに書き出しているようになってしまいました

書き出したファイルの中で重複が存在するということでしょうか。


> grep 'iso.3.' (ファイル名)| sort -u > $find.txt
> で表示される結果と違うのですが

存在する行のすべてを対象としていますから、iso.3.6.1.2.1.4.22.1.2.9 192.....といったデータだけで無く、日付や時間といった行も対象としています。
iso.から始まる行だけを切り出したい場合は、strncmp()関数あたりで場分けしてください。
また、ソートは行ってませんので、検索して見つかった行を見つかった順番に頭から出力します。


> どこをなおしたらいいのか分からなくなっています。
> 教えて頂けないでしょうか?
書いたコードを提示してください。


ついでに、重複が存在する入力ファイルの中身と、どのような結果になって欲しいのか期待する出力結果を提示してください。
今ひとつ仕様が固まってません。


将来Windows環境へ移行するために、プログラムが必要ということですが、Cygwinなんて選択肢もありますね。


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

Name: ぽこ  ..上級者(17,046ポイント)   Date: 2010/06/23(水) 00:13   No:55109     
Title: Re:複数あるファイル内の重複を探す方法    
> ですがこのままのLinux環境からWindowsに以降させなければならないので
> プログラムを作成しています。
> windowsの移植環境はVC++2010です。

衝撃の新事実。

Windows環境でPowerShellが使えるなら、やはりワンライナーで実現できます。

Get-Content hogehoge.log | Sort-Object | Get-Unique

コマンドプロンプトしかない環境でもsortコマンドはあるので、
uniqに該当する部分をWSH+VBS(かJS)で作っちゃえば良いです。
こんな感じで。

http://scripting.cocolog-nifty.com/blog/2009/09/uniq-77dd.html
http://d.hatena.ne.jp/janus_wel/20080725/1217089244

#ソースコードを統一したいのはよく判るんですが、この手の処理を
#時間をかけて作り込むのはどうかなと思うんですよね。


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

Name: トマト  ..入門者(4,237ポイント)   Date: 2010/06/23(水) 12:08   No:55141 解決!     
Title: Re:複数あるファイル内の重複を探す方法    
分かりにくくて申し訳ありません。教えてくださっているのに生かしきれず本当に申し訳ないです。
------------------------------------------------------------------
>重複が存在する入力ファイルの中身
2010/04/19 
12:00
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.11 = Hex-STRING: 00 00 00 CB 12 CC
iso.3.2.1.2.1.4.11.0.2.1062.192.169.9.10 = Hex-STRING: 00 00 00 0A 58 2E
iso.3.2.1.2.1.4.11.0.2.1062.192.169.5.134 = Hex-STRING: 00 00 00 AB 1E DF 
2010/04/20 
00:00
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
iso.3.2.1.2.1.4.11.0.2.1061.192.169.3.122 = Hex-STRING: 00 00 C0 BA 50 DE
iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.1 = Hex-STRING: 00 1B D0 0A 5B 2E
iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.12 = Hex-STRING: 00 00 D3 DD 1E 50 
2010/04/20 
12:00
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
iso.3.2.1.2.1.4.11.0.2.1061.192.169.3.122 = Hex-STRING: 00 00 C0 BA 50 DE
iso.3.2.1.2.1.4.11.0.2.1062.192.169.9.10 = Hex-STRING: 00 00 00 0A 58 2E
iso.3.2.1.2.1.4.11.0.2.1062.192.169.62.12 = Hex-STRING: 00 00 00 AB 1E DF
------------------------------------------------------------------
>どのような結果になって欲しいのか期待する出力結果
iso.3.2.1.2.1.4.11.0.2.1061.192.169.61.1 = Hex-STRING: 00 00 00 00 66 10
iso.3.2.1.2.1.4.11.0.2.1062.192.169.9.10 = Hex-STRING: 00 00 00 0A 58 2E
iso.3.2.1.2.1.4.11.0.2.1061.192.169.3.122 = Hex-STRING: 00 00 C0 BA 50 DE
-------------------------------------------------------------------
>最終的にファイルに保存する形式
192.169.61.1,00 00 00 00 66 10
192.169.9.10,00 00 00 0A 58 2E
192.169.3.122,00 00 C0 BA 50 DE
-------------------------------------------------------------------
>書いたコードを提示
>どのような結果になって欲しいのか期待する出力結果には至っていません。
/* ************************************************ */
/* define  */
/* ************************************************ */
#define STRING_MAX    102400        
#define ARP_INFO    5120
#define LINE_MAX    1024         
/* ************************************************ */
/* global variable */
/* ************************************************** */
static char **table = NULL;
static int tblSize = 0;        /* table size(利用可能なサイズ) */
static int useSize = 0;        /* table size(使用済みサイズ) */

/* ************************************************ */
/* main  */
/* ************************************************ */
int main(int argc, char **argv)
{
    FILE *fp;
    FILE *fdouble;
    FILE *fnotice;

    char buff[STRING_MAX];
    int  i; 
    int repet;
    size_t size;
    char data[STRING_MAX];

    char show[]="iso";
    char tmp[STRING_MAX];
    char cutIP[STRING_MAX];
    char cutMAC[STRING_MAX];
    char *juidge;
    //int flag=0;
    char *wordIP;
    char *wordMAC;

    if(argc < 2)
    {                                 /* パラメータ数のチェック */
        printf("Usage : XTYPE filename1 [filename2 ...]\n");
        return -1;
    }
    while(--argc)
    {
        ++argv;
        if((fp = fopen( *argv, "r" )) == NULL) 
        {
            printf("can not open file. %s\n", *argv);
            return -2;
        }
        /* 書き>込みファイルのオープン*/
        if((fnotice = fopen("notice.txt", "w"))== NULL)
        {
            printf("can not write file.\n");
                return -3;
        }
        while(fgets(tmp,sizeof(tmp),fp))
        {
            
            juidge = strstr(tmp,show);
            
            if(juidge != NULL)
            {
            
                fprintf(fnotice,"%s",juidge);

                if(AddString(juidge)) continue;
            }
            else
            {
                
                printf("show=\"iso\" not find.\n");
                
            }
                
            }
    }
    fclose(fp);
    fclose(fdouble);
    fclose(fnotice);
    return 0;
}


PowerShellは、初めて聞きました。
教えて下さったURLありがとうございます。
さっぱり何してるのか分からないので勉強します。


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

Name: トマト  ..入門者(4,248ポイント)   Date: 2010/06/23(水) 12:13   No:55142     
Title: Re:複数あるファイル内の重複を探す方法    
すみません。解決マークが付いてしまいました

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

Name: ookami  ..プログラマー(28,636ポイント)   Date: 2010/06/23(水) 12:22   No:55150     
Title: Re:複数あるファイル内の重複を探す方法    
「編集」で、「解決!」チェックをはずすと、一覧でも「解決!」ではなくなるようですよww いま別スレで確認してきましたw

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

Name: へろり  ..中級者(14,553ポイント)   Date: 2010/06/23(水) 12:33   No:55152     
Title: Re:複数あるファイル内の重複を探す方法    
解決されているようですが、もういいのでしょうか?

問題は次の行です。

>            juidge = strstr(tmp,show);
>
>            if(juidge != NULL) 
>            { 
>             
>                fprintf(fnotice,"%s",juidge); 
>
>                if(AddString(juidge)) continue; 
>            } 

juidge が NULL でない場合、つまり tmp に文字列 "iso" が含まれる場合次のfprintf(fnotice, "%s", juidge); で問答無用で出力するようになっています。
そして、その後で、テーブルへ追加して重複判定を行っていますね。
これでは重複もへったくれもありません。

AddString() は重複があれば1を返し、重複が無い場合は0を返します。
ですから、AddString() が0を返した場合のみ、ファイルへ出力するようにしてください。


ついでに、最後の方に fclose(fdouble); と、ありますが。
fdouble は初期化されていませんね。 ここでプログラムが落ちれば、次のfclose(fnotice);が実行されません。
そうすると、うまくファイルに書き込めないかと思われます。

Linux ではどうなっているのか解りませんが。



追記です。

書き出し用のファイルですが、入力ファイル毎に出力ファイルを用意するつもりでループの中でオープンするようにしてましたが、ファイル名は決め打ちされているようですね。

このままでは、ループを回るたびに新しくファイルが作られますから、ループの外へ追い出すか、追加書き込みでオープンするようにしてください。 編集済み


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

Name: トマト  ..入門者(4,584ポイント)   Date: 2010/06/23(水) 13:44   No:55157     
Title: Re:複数あるファイル内の重複を探す方法    
「解決」マークが今だ外せなくなってます。

AddString()の使い方がよく分かっていません。教えて頂けないでしょうか?

fclose(fdouble); は消し忘れです。すみません。

                while(fgets(tmp,sizeof(tmp),fp))
                {
                        juidge = strstr(tmp,show);
                        if(juidge != NULL)
                        {
                                flag = AddString(juidge);
                                if(flag != 0)
                                {
                                    fprintf(fnotice,"%s",juidge);
                                }
                                else
                                {
                                    continue;
                                }
                           }
                        else
                        {
                                printf("serch=\"iso\" not find.\n");
                        }
                }

総ファイル数が50あります。
最終的に一つのファイルにしないといけないです。->重複なしのファイルが最後に一つにします。
 編集済み


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

Name: へろり  ..上級者(15,328ポイント)   Date: 2010/06/23(水) 13:54   No:55158     
Title: Re:複数あるファイル内の重複を探す方法    
>                                if(flag != 0) 
>                                { 
>                                    fprintf(fnotice,"%s",juidge); 
>
                                } 

条件式が違います。

重複が無い場合、つまりそのデータが初見の場合0を返す訳ですから。

if(flag == 0){
    fprintf();
}

とします。

1を返した場合は、すでにテーブルへ記憶しているわけですから何もしません。


もう、全部書いておきます。 動作確認はしてません。


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

#define LINE_MAX            1024            //1行あたりの最大文字数

static char **table = NULL;                //テーブル
static int tblSize = 0;                    //テーブルのサイズ(利用可能サイズ)
static int useSize = 0;                    //テーブルの使用済みサイズ

int AddString(const char *buf)
{
    int i;

    //テーブルから検索して、すでに覚えていれば1を返す。
    for(i = 0;i<useSize;i++){
        if(!strcmp(table[i], buf)) return 1;
    }

    //テーブルに覚えさせる。
    if(useSize >= tblSize){
        tblSize += 100;
        table = (char**)realloc(table, sizeof(char**) * tblSize);
    }
    table[useSize] = (char*)malloc(LINE_MAX);
    strcpy(table[useSize], buf);
    useSize++;

    return 0;
}

int main(int argc, char *argv[])
{
    int i;
    FILE *fr, *fw;
    char line[LINE_MAX];

    if(argc < 2){
        printf("Usage : XTYPE filename1 [filename2 ...]\n");
        return -1;
    }

    if(!(fw = fopen("notice.txt", "w"))){
        printf("can not write file.\n");
        return -3;
    }

    while(--argc){
        ++argv;

        if(!(fr = fopen(*argv, "r"))){
            printf("can not open file. %s\n", *argv); 
            continue;
        }

        while(fgets(line, LINE_MAX, fr)){
            if(!strstr(line, "iso")) continue;
            if(AddString(line)) continue;

            fprintf(fw, line);
        }

        fclose(fr);
    }

    fclose(fw);

    return 0;
}



コンパイルが通らなかったらごめんなさい。


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

Name: へろり  ..上級者(15,645ポイント)   Date: 2010/06/23(水) 14:03   No:55159     
Title: Re:複数あるファイル内の重複を探す方法    
grep | sort の話も出てましたので、ついでにソートさせる版も書いておきます。
上のレスで編集してもいいのでせすけど、せっかくですので別に。

int compare(const void *str1, const void *str2)
{
    return strcmp(*(char**)str1, *(char**)str2);
}

int main(int argc, char *argv[])
{
    FILE *fr, *fw;
    int i;
    char line[LINE_MAX];

    if(argc < 2){
        printf("Usage : XTYPE filename1 [filename2 ...]\n");
        return -1;
    }

    if(!(fw = fopen("notice.txt", "w"))){
        printf("can not write file.\n");
        return -3;
    }

    while(--argc){
        ++argv;

        if(!(fr = fopen(*argv, "r"))){
            printf("can not open file. %s\n", *argv); 
            continue;
        }

        while(fgets(line, LINE_MAX, fr)){
            if(!strstr(line, "iso")) continue;
            if(AddString(line)) continue;
        }

        fclose(fr);
    }

    qsort(table, useSize, sizeof(char*), compare);
    for(i = 0;i<useSize;i++){
        fprintf(fw, table[i]);
    }

    fclose(fw);

    return 0;
}

compare() 関数の追加と、main() 関数の置き換えです。
やっぱり動作確認はしてません。



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

Name: トマト  ..入門者(4,623ポイント)   Date: 2010/06/23(水) 14:09   No:55160     
Title: Re:複数あるファイル内の重複を探す方法    
重複のないファイルがつくれました!
本当にありがとうございました!!


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,226,137ポイント)   Date: 2010/06/23(水) 17:58   No:55167     
Title: Re:複数あるファイル内の重複を探す方法    
解決マークはもうそのままで大丈夫ですか・・?

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



Name: shiro4ao  ..初心者(5,939ポイント)   Date: 2010/06/22(火) 23:01   No:55091       
Title: マウスカーソル(カレット)の作成方法    
通常Windowsにはマウスカーソル(矢印)はひとつだけですが、
キーボードの矢印キーで移動できるようなマウスカーソルをもう一個作ることは出来ますか?
マウスにコントロールされたマウスカーソルと
キーボードにコントロールされたマウスカーソルで同時に操作がしたいのです。

問題点として、
1.そもそもマウスカーソルは複数作成出来るのか
2.2つのマウスへの命令をどうやって分けるのか
 (mouse_event()関数にはマウスを識別するような引数はない)
といったものが有ります。
Windows Vista , C言語 API にて作成しようと思います。

非常におかしな質問ですがご回答いただければ幸いです。


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


Name: 小太鼓  ..ぴよぴよ(187ポイント)   Date: 2010/06/23(水) 00:42   No:55114     
Title: Re:マウスカーソル(カレット)の作成方法    
こんばんわ,

新人ですが,誰もレスしてないので・・・

linuxユーザなのでwindowsに詳しくはないですが,linuxではできるみたいです.

http://blog.livedoor.jp/vine_user/archives/51497803.html


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

Name: shiro4ao  ..初心者(6,019ポイント)   Date: 2010/06/23(水) 12:14   No:55143 解決!     
Title: Re:マウスカーソル(カレット)の作成方法    
ご回答ありがとうございます、
マウスカーソルの複数の作成はどうやらできないようです。
(調べ方が悪い可能性もあります!)
また別の方法を考えてみます。

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


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

Name:  ..初心者(5,946ポイント)   Date: 2010/06/23(水) 12:15   No:55145     
Title: Re:マウスカーソル(カレット)の作成方法    
 以前、フリーソフトでマウスカーソルをキーボードで動かすソフトとマウスカーソルを二つ表示して切り替えて使用するソフトは見たことがあるので、なんの根拠もありませんが、出来そうな気がします。windowsです。

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

Name: ookami  ..プログラマー(28,953ポイント)   Date: 2010/06/23(水) 12:35   No:55153     
Title: Re:マウスカーソル(カレット)の作成方法    
ズバリではありませんが、こんなのがありました。
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9E%E3%82%A6%E3%82%B9
入手や導入については分かりませんが...

以前デモを見学したことがあって、た〜しか「マインスィーパー」やってたと思うので、たぶんwindowsです。


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

Name: shiro4ao  ..初心者(6,164ポイント)   Date: 2010/06/23(水) 14:40   No:55161 解決!     
Title: Re:マウスカーソル(カレット)の作成方法    
解決にしたのに投稿ありがとうございます。
希望が持てました!
調べればあったのですね・・・・浅はかでした・・・・・

試してみたのですが、クリックの度に本物のマウスが移動してしまいました・・・
あと、(当然ですが)クリックのたびにアクティブウィンドウが切り
替わってしまいました・・・


ちょっと違う感じなので別の解決策を検討したいと思います。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +