はきだめC/C++下級者の質問箱
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/08/17(水) 14:20:27ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。
0153デフォルトの名無しさん
2005/09/15(木) 17:59:42別に認められてないわけじゃなくて、C89の時から
「その他処理系依存のプロトタイプ」に分類されてて、規格違反というわけではない。
非推奨だから警告が出るけど。
0154デフォルトの名無しさん
2005/09/22(木) 13:56:480155デフォルトの名無しさん
2005/09/23(金) 04:44:340156デフォルトの名無しさん
2005/09/23(金) 05:05:28Windows上のC言語でお勧めの環境はどれですか?
いろんな前提要件抜きでバシッとマジレス希望。
或いは、各々の特徴を述べ立てて比較検討希望。
よろしくお願いします。マジでお願いします。
0157デフォルトの名無しさん
2005/09/23(金) 05:53:14#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);
main() {
printf("%s\n", opname);
}
これで
plus
が出力される理屈を教えてください。
OP -> plusはいつ変換されるんですか?
0158デフォルトの名無しさん
2005/09/23(金) 06:36:43char *opname = Xstr(OP);
↓ #define OP plus
char *opname = Xstr(plus);
↓ #define Xstr(x) Str(x)
char *opname = Str(plus);
↓ #define Str(x) #x
char *opname = "plus";
OPは一番最初に展開される
(ISO/IEC 14882 16.3.1 : 実引数を代入する前に、実引数中の全てのマクロを展開する)
ので、Xstr(OP); ではまずOPが展開される。
ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、
#define Str(x) #x
#define OP plus
char *opname = Str(OP);
としてしまうと、(Str(x)のxが先に展開されないでそのまま代入されるので)
"OP"が出力されてしまうはず。
それを避けるためにXstrマクロをワンクッション置いて使ってるのかと。
ていうか使い道のないコードだな。
0159デフォルトの名無しさん
2005/09/23(金) 07:00:22ので、Xstr(OP); ではまずOPが展開される。
ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、
うあw、酷い仕様ですね
0160デフォルトの名無しさん
2005/09/23(金) 07:05:07ありがとうございmさいた。
0161デフォルトの名無しさん
2005/09/23(金) 07:58:10実際、この展開規則をまともに実装するとなると骨だよ。
仮引数を見つつ、#に関係する引数については評価から外さなきゃいけない。
つまり2パス。
0162デフォルトの名無しさん
2005/09/23(金) 08:10:24教えて偉い人
0163デフォルトの名無しさん
2005/09/23(金) 08:26:44それがどんなものであれ、無いよりは有った方が良い。
それを不要だと主張する者は、それを使わなければ良い。
という考え方が根底にあるからw
0164デフォルトの名無しさん
2005/09/23(金) 08:31:03先に評価しておく必要性があるんでしょうか。
0165デフォルトの名無しさん
2005/09/23(金) 11:11:59ANSI C
0166デフォルトの名無しさん
2005/09/23(金) 11:56:15#のない頃のプリプロセッサとの互換性をなんとか維持しようとした苦肉の策だった気がするが、具体的なことは忘れた。
0167デフォルトの名無しさん
2005/09/23(金) 16:25:12ナンギな都合があるんですね(´・ω・`)
ありがとうございます。
0168デフォルトの名無しさん
2005/09/24(土) 20:38:01はじめてみて、やっぱりあきらめようかなと思った時は、
無料の方がふん切りがつきやすいんじゃないかな?
お試し版の C とかあったよね。
あと、DEVC++とかの日本語化がされてないやつとかはあきらめやすいんじゃ
ないかな?
0169デフォルトの名無しさん
2005/10/04(火) 18:06:46( ・(ェ)・) <クマー ( ;・ω・) アワワ
/J ▽J ⊂ O
し―-J ( /
≡ ⊂\_)
0170デフォルトの名無しさん
2005/10/04(火) 19:26:26無料だと、又やってみようかな?って思うぞ
金払ってるともう2度とこんな無駄金払ってられないってなるよ
0171デフォルトの名無しさん
2005/10/04(火) 20:35:04ということは、自分の時給換算ができる人は有償の C 言語を検討した方が、
身のほどを知った時無駄な時間を失わずに済むってことですね。
0172デフォルトの名無しさん
2005/10/04(火) 21:41:59&や、*のせいで挫折しそうです。
なんか、こうイメージ的にわかりやすく説明してください。宣言の時と使用時
0173デフォルトの名無しさん
2005/10/04(火) 21:51:17int *p;って宣言は「式の中で*pと書くとint型の値が得られる」と読む、っていうのはよく言われる。
0174デフォルトの名無しさん
2005/10/04(火) 22:43:46イテレータからコンテナの中身を取り出す時だけ?
& は関数宣言で引数におまじないで付ける位に考えておけばいいんじゃないの?
0175デフォルトの名無しさん
2005/10/04(火) 22:49:19あれで何人が壊れたことか。
0176デフォルトの名無しさん
2005/10/04(火) 22:53:08こらこら、余計混乱するようなことを書くな。
0177デフォルトの名無しさん
2005/10/05(水) 00:25:54DelphiでいうHaltみたいなやつです。
ググってみたところexit関数という物があるようなんですが、
C++では使うなといったような事が書いてあって、よくわからない状態です…。
0178デフォルトの名無しさん
2005/10/05(水) 01:33:380179デフォルトの名無しさん
2005/10/05(水) 07:39:330180デフォルトの名無しさん
2005/10/05(水) 08:33:47C++でもexitは使える。
ローカル変数のデストラクタが呼ばれるように気をつけて使えば全然問題ない。
0181デフォルトの名無しさん
2005/10/05(水) 08:53:370182デフォルトの名無しさん
2005/10/05(水) 10:31:070183デフォルトの名無しさん
2005/10/06(木) 21:06:480184デフォルトの名無しさん
2005/10/06(木) 21:24:43まぁ普通にva_start〜va_arg〜va_end使えばいい話だろうけど、
これって最後に末尾を示すコード(たとえば-1とか)入れる必要出てくるじゃん。
sprintfとか見るとそういうの一切ないけど、ああいう実装はどうやってやるんだろ?
0185デフォルトの名無しさん
2005/10/06(木) 21:33:20通常の実装であれば、formatに完全に依存してる。
formatを1文字ずつパースしていって、可変引数からの値が必要になるような
%dや%fといった文字列が出てきた時に逐一va_argで取り出すから、末端を識別する必要がない。
その代わり、可変引数の数より多く指定してしまったりすると暴走する。
0186デフォルトの名無しさん
2005/10/06(木) 21:48:160187デフォルトの名無しさん
2005/10/07(金) 16:26:23うまくスレッドが終了できてないのでしょうか?
0188デフォルトの名無しさん
2005/10/07(金) 16:50:24タスクマネージャのメニューの「表示」→「列の表示」→「スレッドの数」をチェック
して調べた方がいい、あと仮想メモリの方が事実上の使用されているメモリ使用量なんだっけ?
0189デフォルトの名無しさん
2005/10/07(金) 17:49:33スレッド終了して減る量なんて TLS の分くらいだべ?
0190189
2005/10/07(金) 17:50:12そりゃ減らんでしょ。
0191デフォルトの名無しさん
2005/10/07(金) 19:07:06タスクマネージャにこんな機能があったのかー。初めて知りました。
調べてみたら、スレッドは正しく終了してるみたいです。
>>190
beginthreadの方が良いのですか?
0192デフォルトの名無しさん
2005/10/08(土) 00:41:46Cランタイムをリンクしてるならbeginthreadex使わないとリークするぜ。
使わないだけじゃだめ。
CランタイムをリンクしないならCreateThreadでおけ。
0193デフォルトの名無しさん
2005/11/07(月) 16:16:380194デフォルトの名無しさん
2005/11/07(月) 16:29:10cat /proc/cpuinfo
直接cpuidで調べるのは面倒だな
OSサポートのチェックもあるしな
0195デフォルトの名無しさん
2005/11/07(月) 17:11:13バイナリファイルは読み込むとまずいのでしょうか?
バイナリpgmファイルを読み込みたいので1バイトづつで調度いいと思ったのですが他の関数にしたほうがいいのでしょうか?
winXP VC++6.0です
0196デフォルトの名無しさん
2005/11/07(月) 17:14:29バイナリモードで開いたか?
0197デフォルトの名無しさん
2005/11/08(火) 15:44:00してくれるクラスとしてくれないクラスがあり、どっちか分からないです。
してくれないクラスは、全て0xcdcdcdcdで埋まっています。
VCの初期化していない状態だったはずですが、ならば0で初期化されているクラスはどうしてされているのか謎です。
コンストラクタでZeroMemory(this, sizeof(クラス))したら一応通りましたが、どうも危険な気がしています。
classをnewで確保する場合、どう0に初期化するのが適切なのでしょうか?
ご教授よろしくお願いします
0198デフォルトの名無しさん
2005/11/08(火) 15:53:150199デフォルトの名無しさん
2005/11/08(火) 16:03:360200デフォルトの名無しさん
2005/11/08(火) 18:58:14そうすればどこでnewしても安心だし。
ZeroMemoryとかmemsetとかはヤバいって話を聞くな・・
0201デフォルトの名無しさん
2005/11/08(火) 19:19:55>>199
使わないのが当然。
0202デフォルトの名無しさん
2005/11/09(水) 07:31:080203デフォルトの名無しさん
2005/11/09(水) 13:52:090204デフォルトの名無しさん
2005/11/09(水) 13:56:200205197
2005/11/09(水) 14:20:29ZeroMemoryは止めました。
初期化しないと明らかにバグるものやポインタだけ初期化することにしました。
さすがに全部のメンバはやってられないです。
初期化していないとどうも気持ち悪いんですが、C++はそういうもんだと思っておきます。
0206デフォルトの名無しさん
2005/11/09(水) 14:47:08初期化してないとどうも気持ち悪いのは当然。
その感覚を欺いてはいけない。
方法(ZeroMemoryやmemsetで初期化すること)が間違っているだけ。
正しい方法はコンストラクタで
Class::Class()
: m_IntegralMember(0)
, m_FloatingPointMember(0.0)
, m_pObject(NULL)
{
}
このように初期化リストで逐一指定すること。
これがC++の作法であり流儀。
0207デフォルトの名無しさん
2005/11/09(水) 15:02:47俺イコールで代入してた
0208デフォルトの名無しさん
2005/11/09(水) 17:25:220209デフォルトの名無しさん
2005/11/09(水) 18:03:22コンストラクタ内部でイコールで代入すると
はデフォルトコンストラクタが走ってから
さらに代入演算子が走るから効率が良くない悪寒
POD型なら最適化で変わらないかもしれないけど
0210デフォルトの名無しさん
2005/11/10(木) 04:43:51仮令Cであっても0で埋めるのはナンセンス。
折角コンパイラがゴミ値を埋めてくれるのを邪魔してデバッグを却って困難にしかねない。
過去に私の周囲でバッファオーバランのバグを生み出した香具師に限って0埋めの習慣があったくらいだ。
0211デフォルトの名無しさん
2005/11/10(木) 16:53:20その方法で初期化で例外発生したやつを捕捉したい場合どうするんですか?
0212デフォルトの名無しさん
2005/11/10(木) 16:55:240213デフォルトの名無しさん
2005/11/10(木) 16:56:03単にクラスが巨大過ぎじゃ無いのか?
0214デフォルトの名無しさん
2005/11/10(木) 16:59:310215デフォルトの名無しさん
2005/11/10(木) 17:23:26A::A()
try
: mem(0)
{
}
catch(...)
{
throw something;
}
キャッチした例外を握りつぶそうとすると自動的に再投されるので注意。
0216デフォルトの名無しさん
2005/11/10(木) 17:30:040217デフォルトの名無しさん
2005/11/10(木) 17:39:56これやるぐらいならメンバにRAIIを徹底するか、例外安全なコンストラクタを持った
基底クラスの初期化に分割した方が良い気はするけれど。
0218デフォルトの名無しさん
2005/11/10(木) 17:40:22使わないなあ。
0219デフォルトの名無しさん
2005/11/10(木) 17:45:08クラスメンバのうち、0初期化したいメンバだけprivateな構造体にまとめれば、
コンストラクタの初期化ではその構造体をまとめて初期化できるようになる。
こんな感じ。
class hoge
{
public:
hoge() : data(), w(1)
{
}
private:
struct Data
{
int x, y, z;
};
Data data;
int w;
};
ほかにもboost::value_initializedなんて手もあるな。
0220デフォルトの名無しさん
2005/11/10(木) 19:59:13初期化で例外投げなきゃならない設計が糞。
さすがは掃き溜め。
0221デフォルトの名無しさん
2005/11/10(木) 20:31:27たとえば初期化でnewするときにはどうする?
std::nothrowを指定するとしても、そいつがヌルを返してきたらどうする?
0222デフォルトの名無しさん
2005/11/10(木) 20:57:26>>217
0223デフォルトの名無しさん
2005/11/11(金) 01:20:31例外なんかがまともに動作するのかねえ
0224デフォルトの名無しさん
2005/11/12(土) 11:19:15RAII って知ってる?
>>223
例外処理自体は追加でメモリを必要としないから大丈夫。
例外オブジェクトを保持するメモリが必要となるかもしれないが、
std::bad_alloc のインスタンスを静的に持つような実装も考えられる。
0225デフォルトの名無しさん
2005/11/12(土) 11:39:12知ってる。それが何か?
0226デフォルトの名無しさん
2005/11/12(土) 12:06:55ということはつまり、リソースの要求処理が失敗したときに例外を投げるのも設計が糞だと?
0227デフォルトの名無しさん
2005/11/12(土) 12:39:02コンストラクタの例外リークは面倒だぞ?
0228デフォルトの名無しさん
2005/11/12(土) 12:41:09はて?思い当たらないが、どんなところが面倒になるの?
0229デフォルトの名無しさん
2005/11/12(土) 13:12:58エラー コードを返したり、グローバル変数の設定したりすることと
同レベルだと思ってはいけません。例外は、それを取り巻くコードの
構造と意味を、根底から覆します。例外は、プログラムの実行時
セマンティックを一時的に繋ぎ変え、通常実行しているコードを迂回し、
こういう状況でなければ決して実行されないコードを動作させます。
例外は、エラー状態を認知させ、プログラムの死という罰則を用いて
その状態を改めようとします。
このように、例外には単純なエラー処理を超えた特性があります。
これらの特性を必要としない、理解しない、あるいは文書化したく
ないなら、例外をスローしてはいけません。
例外以外のエラー処理技法を探してください。
0230デフォルトの名無しさん
2005/11/12(土) 13:25:580231デフォルトの名無しさん
2005/11/12(土) 13:54:37本当に思い当たらないの?
0232デフォルトの名無しさん
2005/11/13(日) 06:13:04「コンストラクタの例外リーク」って何?
単純にコンストラクタから例外が飛んでくるだけなら、>>228
0233デフォルトの名無しさん
2005/11/15(火) 18:29:06「コンストラクタ内での初期化」の話になっているのは
ここがはきだめだからでしょうか?
0234デフォルトの名無しさん
2005/11/17(木) 00:26:090235デフォルトの名無しさん
2005/11/21(月) 00:28:05専用ソフトで作ると滑らかなのに
一応こんな感じで16bitで作ってるつもりなんだが
for(dwCount)
dwWave = (short)(100*sin(2*PI*100*dwCount/SamplingRate));
// PI = 2*atan(1)
0236デフォルトの名無しさん
2005/11/21(月) 00:51:320237デフォルトの名無しさん
2005/11/21(月) 00:55:18こっちへの書き込みだけヴォケましたプログラム上は4*atan(1)でした
0238デフォルトの名無しさん
2005/11/21(月) 01:03:5616ビット帯域から見ると振幅が非常に狭いし分解能も悪くなるわけだが。
#音として歪むかどうかまでは知らん。
0239デフォルトの名無しさん
2005/11/21(月) 01:30:07つか*2しただけでピークピーク値が500くらいって何だよこれ(;'A`)
0240デフォルトの名無しさん
2005/11/21(月) 07:31:270241デフォルトの名無しさん
2005/11/21(月) 12:26:06おまいらサンクスコ
0242デフォルトの名無しさん
2005/11/21(月) 12:56:46おいこら、PI = 4 * atan(1)って書いてあるから当然にdoubleになっていると思ったじゃねぇか。
0243デフォルトの名無しさん
2005/11/21(月) 12:56:560244243
2005/11/21(月) 12:57:310245デフォルトの名無しさん
2005/11/21(月) 13:08:56案外あたっているかも知らん。
0246デフォルトの名無しさん
2005/12/07(水) 22:04:39今調べた限りだと、メンバ関数ポインタ?のようなのを使うのかな?
もしくは使うべきじゃないのかな?
こうやるのがスマートみたいなのがあれば、教えて下さいー。
0247246
2005/12/07(水) 22:05:480248デフォルトの名無しさん
2005/12/07(水) 22:06:24メンバ関数ならメンバ関数ポインタを使う
そうでないなら関数ポインタを使う
0249デフォルトの名無しさん
2005/12/22(木) 12:28:39CADなどに図で出力することはできますか?
0250デフォルトの名無しさん
2005/12/22(木) 12:43:56出来ますよ。そう作れば。
0251249
2005/12/22(木) 12:54:21図々しいですがもしご存知でしたら
詳しいサイトなど教えて頂けませんでしょうか?
0252デフォルトの名無しさん
2005/12/22(木) 12:57:19CADじゃないけど、出力をExcelでグラフにするのはよくやってますよ。
ファイルにCSV形式で出力して、後はExcel側で読んでグラフにするだけ。
■ このスレッドは過去ログ倉庫に格納されています