トップページ⇒tech
1001コメント330KB

スレを勃てるまでもないC/C++の質問はここで 4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/09/17(水) 15:41:48
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
0679デフォルトの名無しさん2008/12/18(木) 16:57:50
ごめん別のところで問題起こしてた、自己解決さーせんwww
0680デフォルトの名無しさん2008/12/18(木) 16:58:53
とりあえず、問題なかったわ。 +1.0fで50が返る可能性があるのがちとまずいだけだな
0681デフォルトの名無しさん2008/12/18(木) 17:08:43
>>680
50が返る可能性はないと思うが
0682デフォルトの名無しさん2008/12/18(木) 17:12:07
(rand() / ((double)RAND_MAX+1.0f)
この部分は 0 〜 1に満たない範囲で値になるので、1にならない以上
50にはならないから大丈夫。
0683デフォルトの名無しさん2008/12/18(木) 17:54:41
いや実際返ってきたけど
0684デフォルトの名無しさん2008/12/18(木) 17:57:34
ねーよ。配列内部の値と、添え字を勘違いしていないか?
0685デフォルトの名無しさん2008/12/18(木) 18:03:07
RAND_MAX : 65535 を +1.0の 65536.0 で割った値は、1には満たない、0.9999・・・
それに50を掛けても、50に近い値にはなるが、50には満たない。
その値の整数部分をとっているわけだし。
0686デフォルトの名無しさん2008/12/18(木) 18:08:47
return array[(int)((rand() / ((double)RAND_MAX+1.0f)) * x)];
      ↑
int array[50]={1,2,3,…,48,49,50};
0687デフォルトの名無しさん2008/12/18(木) 18:52:01
わろす
0688デフォルトの名無しさん2008/12/18(木) 19:00:21
クラスのある一つの大小関係でclass全体のスワップをしたいんだが如何すればいいですか?
クラスをベクタコンテナで宣言してvt.at(i).swap(vt.at(i+1))みたいなアルゴリズムを考えています。
0689デフォルトの名無しさん2008/12/18(木) 19:03:46
stlにすでにある件
0690デフォルトの名無しさん2008/12/18(木) 19:14:56
いやあるのはswapするとこだけね
06916882008/12/18(木) 19:28:45
>>689-690
どういう意味ですか?
vt1.swap(vt2)
で
temp=vt1,vt1=vt2,vt2=tempになるのは解るんですが
vt.at(i)とvt.at(k)のスワップ方法が解らないんです。
0692デフォルトの名無しさん2008/12/18(木) 19:37:20
#include <algorithm>
std::swap(vt.at(i), vt.at(k));
06936882008/12/18(木) 19:39:25
>>692
そんな簡単なのがあるんですね。
本には載っていなかったので助かりました。
ありがとうございます。
すいませんでした。
0694デフォルトの名無しさん2008/12/19(金) 00:21:53
マジで勉強しようと思っている者ですが
初心者にお勧めのサイトとか教えてください#
0695デフォルトの名無しさん2008/12/19(金) 00:24:24
http://www.bohyoh.com/
ぼうようはどうよう?
0696デフォルトの名無しさん2008/12/19(金) 00:32:24
>>694
初心者なら素直に本を一冊買った方がいいと思うなぁ…
0697デフォルトの名無しさん2008/12/19(金) 00:32:59
ふむふむ・・
0698デフォルトの名無しさん2008/12/19(金) 00:42:39
俺にできるかな?
0699デフォルトの名無しさん2008/12/19(金) 00:42:51
手法を学ぶのも重要だが、言語の使用や、標準ライブラリを逆引きできる本も欲しいね。
0700デフォルトの名無しさん2008/12/19(金) 00:50:20
翻訳の手順やプログラムの実行方法などは、処理系や実行環境によって異なりますから、....
つまり、・・・・どうすればいいのか.....
0701デフォルトの名無しさん2008/12/19(金) 00:52:04
ふむふむ・・・コンパイラが必要って訳ですね。
0702デフォルトの名無しさん2008/12/19(金) 01:05:32
>>694
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/000.html

最初は意味分からんことが多いと思うが、一つ一つ理解していけばいい。
ゆっくりしていってね。
0703デフォルトの名無しさん2008/12/19(金) 01:25:16
よし、早速自分なりに頑張ってみるよ
0704デフォルトの名無しさん2008/12/19(金) 02:51:30
main(void)
{
return 0;
}


エラーがでます。
0705デフォルトの名無しさん2008/12/19(金) 02:58:22
解の公式を加算減算だけで表すプログラムがわからぬ・・・
0706デフォルトの名無しさん2008/12/19(金) 02:58:31
そうですか。
0707デフォルトの名無しさん2008/12/19(金) 07:14:06
>704
プログラミングの質問に限らず、エラーが出て質問する時は
出たエラーメッセージを貼ろうね、しまじろうとのお約束だよ
0708デフォルトの名無しさん2008/12/19(金) 12:23:58
はい、わかりました。
0709デフォルトの名無しさん2008/12/19(金) 13:26:06
やっぱり、言語をノートに書いたりして覚えたりした?
0710デフォルトの名無しさん2008/12/19(金) 13:39:52
目の前の箱で試せる時代に、それはない。
0711デフォルトの名無しさん2008/12/19(金) 13:42:33
何回も繰り返してたら覚えれえるかな
0712デフォルトの名無しさん2008/12/19(金) 14:35:16
567という整数の10の位だけ(つまり6)を取り出して出力する

#include <stdio.h>

int main(void)
{
int num = 567;

num = num / 10;
num = num % 10;
printf( "%d\n", num );

return 0;
}

どうしてこれで6になるのかわかりやすく教えて!偉い人
0713デフォルトの名無しさん2008/12/19(金) 14:38:33
>>712
int num = 567;
num = num / 10; < num=56
num = num % 10; < num=6
0714デフォルトの名無しさん2008/12/19(金) 14:41:27
そ・・・そういうわけか!!
0715デフォルトの名無しさん2008/12/19(金) 15:20:26
中学校数学レベル
0716デフォルトの名無しさん2008/12/19(金) 15:59:21
残念、小学生レベル。あと、自分基準で〜レベルとか、ランクをつけなくて良いから。
時代によって違うから。
0717デフォルトの名無しさん2008/12/19(金) 16:15:53
 ( ⌒;::)
 |||
<#`Д´>=3
0718デフォルトの名無しさん2008/12/19(金) 16:28:41
>>717
なんで頭に●ンコが生えてんの?
0719デフォルトの名無しさん2008/12/19(金) 16:31:14
>>716
>残念、小学生レベル。
>自分基準で〜レベルとか、ランクをつけなくて良いから。
>残念、小学生レベル。
>自分基準で〜レベルとか、ランクをつけなくて良いから。
0720デフォルトの名無しさん2008/12/19(金) 16:49:48
>>719
いや、本当にそれは小学生レベルだろ?割り算、余りを求める算数を
あんたは中学で習ったのかい?w
0721デフォルトの名無しさん2008/12/19(金) 16:53:39
それじゃ聞くが、割り算、余りを求める算数を、中学校で習った時代を教えてくれ。
近代の義務教育でな。
0722デフォルトの名無しさん2008/12/19(金) 16:57:54
#include <stdio.h>

int main(void)
{
int no;

printf("数字を入力してください:");
scanf( "%d", &no);   /*数字を読み込む*/

printf("あなたは%dと入力しましたね\n", no);

return 0;
}

ビルドエラーが発生しました。続行して、最後に成功したビルドを表示しますか?

教えて!偉い人
0723デフォルトの名無しさん2008/12/19(金) 17:05:46
>>722
   /*数字を読み込む*/
^^^^^の全角空白かな
0724デフォルトの名無しさん2008/12/19(金) 17:09:33
ありがとう!!偉い人!!
0725デフォルトの名無しさん2008/12/21(日) 08:35:26
シューティングで当たり判定の高速化を図りたいんだけど
vector<obj>::iteraot p, q;

p = playerbullet.begin()
while ( p != playerbullet.end() ) {
  q = enemy.begin();
  while( q != enemy.end() ) {
    if( isHit(p,q) )
     // 当たってたときの処理
  }
}

のようにやってるんだけど
遅くて使い物にならない
何か高速化の方法ってありますか?
0726デフォルトの名無しさん2008/12/21(日) 10:24:52
>>725
敵を4分木に入れて、弾の直線と当たり判定を取るってのは?
弾をレイと捉えてレイトレースみたいなイメージ
0727デフォルトの名無しさん2008/12/21(日) 11:21:03
>>725
画面を数分割して敵弾の位置を大まかに分類しておいて、
明らかに無関係な領域にある敵弾は当たり判定自体をスキップする。

複雑な当たり判定を要する弾の場合は、
まずは判定の楽な円-円の判定で大まかに判定し、
明らかに離れているものは真面目に当たり判定を行わずスキップ。
0728デフォルトの名無しさん2008/12/21(日) 12:28:11
どう考えてもボトルネックはisHit()関数なのになんでそこを晒さないのか
0729デフォルトの名無しさん2008/12/21(日) 12:41:23
画面を4分割にするとして、境目にある場合は
どう処理すればいい?
0730デフォルトの名無しさん2008/12/21(日) 12:42:51
どっちかに所属させとけよw
0731デフォルトの名無しさん2008/12/21(日) 12:46:12
両方に属すると判断しとけばいいんじゃね
0732デフォルトの名無しさん2008/12/21(日) 12:46:37
>>725みたいな総当りは、シェーダとかGPGPUでやったら速そうだな
0733デフォルトの名無しさん2008/12/21(日) 12:50:34
>>731
つうか、例えば横512ドットだとして
左は、0 <= x < 256
右は、256 <= x < 512
とすれば、元から境目に存在はしない
0734デフォルトの名無しさん2008/12/21(日) 12:56:53
上下左右別々に扱うわけか。
0735デフォルトの名無しさん2008/12/21(日) 13:21:21
>>728
////////////////////////////////////////////////////////////////////////////////////////////////
//  指定された2つの RECT構造体が、重なっているか判定する
//  重なっていると true
//  かさなっていないと false を返す。
bool    RectLap( const RECT *a, const RECT *b )
{
    //  改良失敗
//  if( (a->top < b->bottom) && (a->bottom < b->top) && (a->left<b->right) && (a->right>b->left) )
//  {
//      return true;
//  }

    if( a->top < b->bottom )
        if( a->bottom > b->top )
            if( a->left < b->right )
                if( a->right > b->left )
                    return true;

    return false;
}
となります
改良の余地があればご指摘お願いします
0736デフォルトの名無しさん2008/12/21(日) 13:41:57
単純な□同士の判定なのか。
それで重いってことは、よほど沢山の弾があるのか?
0737デフォルトの名無しさん2008/12/21(日) 13:53:01
100発もないのですが、どうしても重くなるのです
別スレッドで処理しているのですが、
CPUが割り当てられなくて処理落ちしてるとかも
考えられますか?
0738デフォルトの名無しさん2008/12/21(日) 13:57:12
同期処理に時間がかかってんじゃね?
別スレッドにするメリットってあんの?
0739デフォルトの名無しさん2008/12/21(日) 14:00:43
Celeron 2.53GHz
重たいわけもないでして
昔作ったやつは100発でもいけたので
不思議なのです
変えたといえばコンパイラだけですが
VC++6.0 -> VC++ 2008 Express にしただけです
0740デフォルトの名無しさん2008/12/21(日) 14:02:09
>>738
スレッドを使った理由は技術的好奇心だけです
元の1スレッドに戻してみます
0741デフォルトの名無しさん2008/12/21(日) 14:08:59
VC++ 2008 Express
リリースモードでコンパイルしたら実用レベルになりました
スレ汚しすいません
0742デフォルトの名無しさん2008/12/21(日) 16:01:12
学校の講義でC言語を学ぶことになったので、
VC++ 2008 ExpressをPCに導入したのですが、
計算をさせて、結果を表示するプログラムを作って実行させたら
結果が出力される前にDOS窓が閉じてしまいます。

どうしてでしょうか?
0743デフォルトの名無しさん2008/12/21(日) 16:05:28
そういう仕様
デバッグしないでいいならCtrl-F5(デバッグしないで実行)で。
それ以外にもとめる方法はいくつかあるが。
0744デフォルトの名無しさん2008/12/21(日) 16:06:39
>>742
あきらめろ
0745デフォルトの名無しさん2008/12/21(日) 16:14:07
>>743
ご親切にありがとうございました!

出力結果を無事に見ることができましたmm
0746デフォルトの名無しさん2008/12/21(日) 16:22:20
最近のム板もひどいな
0747デフォルトの名無しさん2008/12/21(日) 16:49:43
返り値に複数の値を返したいんだけど

こういう場合は
1、グローバル変数を使う
2、ポインタで参照渡し
3、1つの関数を関数をいくつかに分ける
4、関数内で返したい値を1つの値に纏めた後、呼び出し先でまとめられた値を復元する

どれがスマート?
0748デフォルトの名無しさん2008/12/21(日) 17:19:36
1 → よほど制限された状況でなければあり得ない解決法
2 → どうしても同時に2つ返す必要があるのであれば、普通はそうする
3 → 同時に2つ値を返す必然性がないのであれば、そうする
4 → よほど制限された状況でなければあり得ない解決法
5、構造体にして返す。コピーのコストに見合えばアリ
0749デフォルトの名無しさん2008/12/21(日) 18:08:53
質問です。
構造体に値を入れて、その入れた内容をポインタにキャストしたのですが
出来ませんでした(何も渡すことが出来なかった)

char *test;

test = (char *)&kouzoutai;

上記のようにしても駄目でした。
構造体をポインタにキャストする事は出来るのでしょうか?
0750デフォルトの名無しさん2008/12/21(日) 18:13:11
なにをもって「できなかった」と判断したのか
0751デフォルトの名無しさん2008/12/21(日) 19:14:24
まぁむちゃくちゃキャストしたんだろうな
構造体ないに文字列持ってたんだろうな、それを直接(char * )でキャストしようとしたんだろ?
0752デフォルトの名無しさん2008/12/21(日) 20:05:47
fopen_sなどのセキュアな関数が定義されている場合に定義される
マクロって何かありますか?
それが定義されていればセキュアな関数を使うようにしたいのです。
0753デフォルトの名無しさん2008/12/21(日) 20:05:57
>>749
kouzoutai の型が分からない限り答えようがない
0754デフォルトの名無しさん2008/12/21(日) 20:30:29
>>752
処理系名のマクロじゃないかな?
0755デフォルトの名無しさん2008/12/21(日) 21:17:43
>>752
一般的な方法はまだない。Open WatcomとVisual C++を個別にマクロで検出するしかない。
0756デフォルトの名無しさん2008/12/21(日) 21:55:04
VCのバージョンしかないんじゃないかな?
0757デフォルトの名無しさん2008/12/21(日) 22:23:21
ソースみたら

 _MSC_VER >= 1400

で判別してるものがあったのですが、これで大丈夫ですかね
0758デフォルトの名無しさん2008/12/21(日) 23:29:53
#if defined(_MSC_VER) && _MSC_VER >= 1400 か
0759デフォルトの名無しさん2008/12/21(日) 23:32:19
どもです
0760デフォルトの名無しさん2008/12/22(月) 15:54:01
べたのメモリ上に二分木などを構築するライブラリやサンプルソースを
ご存知の方いないでしょうか?
メモリマップトファイル上にツリーを作って、複数のプロセスから参照したいと思っています。
0761デフォルトの名無しさん2008/12/22(月) 16:23:15
>>760
意味がわからん
0762デフォルトの名無しさん2008/12/22(月) 16:29:33
「ヒープじゃなく、指定した領域 (メモリマップトファイル) を使う
 バイナリツリーが欲しい」
以外の解釈が可能か?
いや俺は見た事ないし、書くとしたら大変そうだが。
0763デフォルトの名無しさん2008/12/22(月) 16:34:49
そのmmapした領域からallocとfreeをする関数を書けば
いいだけじゃないの?

各データは固定長だろうから、それこそ配列にして
使用済みかどうかのフラグを持つだけでもいいし
0764デフォルトの名無しさん2008/12/22(月) 16:40:25
スレチならすんません

理解しているのはC言語の基礎だけです
DOS窓で動く、ジャンケンゲーム、数当て(BIGorSMALL)、石取りゲーム
くらいは作れるようになりました
この後一体どういう学習をすれば、Windows上で動く簡単なツールなんかを作れるようになりますか?
「GUI(?)をつくりたい」って言えばいいんですかね?

環境はWinXPhome/VC++2008
Windowsフォームアプリケーション?みたいなのもやってみたんですがさっぱりです
とりあえず、ウインドウを表示して、次に画像なんかを表示して〜
みたいなものはどうやってやればいいですか?
分かりにくかったらすいません宜しくお願いします
0765デフォルトの名無しさん2008/12/22(月) 17:03:09
ウィンドウはOSの環境に依存する
C言語でWindowsAPIを使えばいい
Win32API,ウィンドウメッセージなんかでぐぐるといいが、
長いし(書くときはコピペするかウィザードで生成すればいいが)、少しとっつきにくいかもしれない

VCを使っているのなら、新規プロジェクト作成のウィザードから
Windowsアプリケーションを使うのもいい
どういうものを作りたいかによって選ぶべきと思う
0766デフォルトの名無しさん2008/12/22(月) 17:05:05
>>764
あなたの気のおもむくままに
0767デフォルトの名無しさん2008/12/22(月) 17:05:59
>>760
分かるには分かるが
面倒くせぇ
0768デフォルトの名無しさん2008/12/22(月) 17:06:45
>>765
回答ありがとうございます
Win32API?と、VCの機能を調べてみます
0769デフォルトの名無しさん2008/12/22(月) 20:31:59
VC++2008EEでただのCプログラムを作るにはどうすればいいですか?新規プロジェクトにはC++しかありません。
0770デフォルトの名無しさん2008/12/22(月) 21:44:39
C++をやっとけばいいよ
CとC++は同じものだと考えてとりあえずは問題ない
というのも、C++はbetter Cという考えがあるから

「C++ではない純粋なC」でないといけないというのは
ちょっと特殊
0771デフォルトの名無しさん2008/12/22(月) 21:47:21
C++ でプロジェクト作っても、
ファイルの拡張子を .c にすれば C になるはず
0772デフォルトの名無しさん2008/12/22(月) 22:50:56
今、ポインターを学んでるんですけど・・
なんでアドレスとか表示する意味があるんだ?
どうして、ポインターで指す必要があるんだ?
間接的にオブジェクトに代入してなんの意味がある?
ビット数の表示に意味なんてあるんだろうか?
いまやってることに、意味がない気がして・・
今、すげー・・やる気を失ってるところです・・
だれか・・元気付けてください・・
0773デフォルトの名無しさん2008/12/22(月) 22:55:00
>>772
すごく使うことになるのでとりあえず使い方をマスターしておけ
0774デフォルトの名無しさん2008/12/22(月) 22:57:09
>>772
お前の家の住所に意味はないのか?
例えば、「お前の家が見たい」って言われたとして、家ごとコピーして渡さなくても住所教えればいいだろ。そういうことだ。
0775デフォルトの名無しさん2008/12/22(月) 22:57:30
>>773
どう使うのか・・こう・・具体的に説明してくれるとありがたいです・・
0776デフォルトの名無しさん2008/12/22(月) 22:58:01
>>774
そ・・そういうことか!!!!!!!!
0777デフォルトの名無しさん2008/12/22(月) 22:58:52
>>772
なんでかっていうとめんどくさいからググレ
でも必要だから絶対覚えろ

・・・これは流石にひどいか

http://www7b.biglobe.ne.jp/robe/cpphtml/
ここのポインタの部分だけでもみるといいよ
C言語だったとしても内容変わらんから
0778デフォルトの名無しさん2008/12/22(月) 23:23:27
int c;
c=getc();

これで合ってると思うんですが、printf("c=%d", c);で表示すると入力したものじゃなくて変なのが入るんですがなぜですか?
0779デフォルトの名無しさん2008/12/22(月) 23:25:02
>>778
%cだ。
それだと。文字コードが表示される。
■ このスレッドは過去ログ倉庫に格納されています