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

はきだめC/C++下級者の質問箱

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/17(水) 14:20:27
はきだめのスレへようこそ

ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。
0153デフォルトの名無しさん2005/09/15(木) 17:59:42
>>152
別に認められてないわけじゃなくて、C89の時から
「その他処理系依存のプロトタイプ」に分類されてて、規格違反というわけではない。
非推奨だから警告が出るけど。
0154デフォルトの名無しさん2005/09/22(木) 13:56:48

0155デフォルトの名無しさん2005/09/23(金) 04:44:34
いまだに>12の意味がわからない
0156デフォルトの名無しさん2005/09/23(金) 05:05:28
有識者の人へ。
Windows上のC言語でお勧めの環境はどれですか?
いろんな前提要件抜きでバシッとマジレス希望。
或いは、各々の特徴を述べ立てて比較検討希望。
よろしくお願いします。マジでお願いします。
0157デフォルトの名無しさん2005/09/23(金) 05:53:14
#define Str(x) #x
#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:43
>>157

char *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
(ISO/IEC 14882 16.3.1 : 実引数を代入する前に、実引数中の全てのマクロを展開する)
ので、Xstr(OP); ではまずOPが展開される。
ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、

うあw、酷い仕様ですね
0160デフォルトの名無しさん2005/09/23(金) 07:05:07
>>158
ありがとうございmさいた。
0161デフォルトの名無しさん2005/09/23(金) 07:58:10
>>159
実際、この展開規則をまともに実装するとなると骨だよ。
仮引数を見つつ、#に関係する引数については評価から外さなきゃいけない。
つまり2パス。
0162デフォルトの名無しさん2005/09/23(金) 08:10:24
何のためにそういう仕様になってるのだろう?
教えて偉い人
0163デフォルトの名無しさん2005/09/23(金) 08:26:44
>>162
それがどんなものであれ、無いよりは有った方が良い。
それを不要だと主張する者は、それを使わなければ良い。
という考え方が根底にあるからw
0164デフォルトの名無しさん2005/09/23(金) 08:31:03
不要とかではなくて、なぜ1パスで処理してしまわないのか疑問だなぁと。
先に評価しておく必要性があるんでしょうか。
0165デフォルトの名無しさん2005/09/23(金) 11:11:59
>>156
ANSI C
0166デフォルトの名無しさん2005/09/23(金) 11:56:15
>>164
#のない頃のプリプロセッサとの互換性をなんとか維持しようとした苦肉の策だった気がするが、具体的なことは忘れた。
0167デフォルトの名無しさん2005/09/23(金) 16:25:12
>>166
ナンギな都合があるんですね(´・ω・`)
ありがとうございます。
0168デフォルトの名無しさん2005/09/24(土) 20:38:01
>>156
はじめてみて、やっぱりあきらめようかなと思った時は、
無料の方がふん切りがつきやすいんじゃないかな?
お試し版の C とかあったよね。
あと、DEVC++とかの日本語化がされてないやつとかはあきらめやすいんじゃ
ないかな?
0169デフォルトの名無しさん2005/10/04(火) 18:06:46
   〇_〇             ヘ⌒ヽフ
   ( ・(ェ)・)  <クマー       ( ;・ω・) アワワ
  /J ▽J             ⊂   O
  し―-J              (   /
                 ≡ ⊂\_)
0170デフォルトの名無しさん2005/10/04(火) 19:26:26
>>168
無料だと、又やってみようかな?って思うぞ
金払ってるともう2度とこんな無駄金払ってられないってなるよ
0171デフォルトの名無しさん2005/10/04(火) 20:35:04
>>170
ということは、自分の時給換算ができる人は有償の C 言語を検討した方が、
身のほどを知った時無駄な時間を失わずに済むってことですね。
0172デフォルトの名無しさん2005/10/04(火) 21:41:59
ただいま独学でC++勉強してますが、
&や、*のせいで挫折しそうです。
なんか、こうイメージ的にわかりやすく説明してください。宣言の時と使用時
0173デフォルトの名無しさん2005/10/04(火) 21:51:17
>>172
int *p;って宣言は「式の中で*pと書くとint型の値が得られる」と読む、っていうのはよく言われる。
0174デフォルトの名無しさん2005/10/04(火) 22:43:46
C++ って * はあんまりいらないんじゃないの?
イテレータからコンテナの中身を取り出す時だけ?
& は関数宣言で引数におまじないで付ける位に考えておけばいいんじゃないの?
0175デフォルトの名無しさん2005/10/04(火) 22:49:19
頼むから参照使う時はconstと非constを使い分けてくれ。
あれで何人が壊れたことか。
0176デフォルトの名無しさん2005/10/04(火) 22:53:08
>>174
こらこら、余計混乱するようなことを書くな。
0177デフォルトの名無しさん2005/10/05(水) 00:25:54
C++で自プログラムを強制終了させるにはどうやるんですか?
DelphiでいうHaltみたいなやつです。
ググってみたところexit関数という物があるようなんですが、
C++では使うなといったような事が書いてあって、よくわからない状態です…。
0178デフォルトの名無しさん2005/10/05(水) 01:33:38
main 関数の最後にラベルを定義しておいて goto で飛ばすとか。
0179デフォルトの名無しさん2005/10/05(水) 07:39:33
ローカル変数のデストラクタを自分で走らせてやればいいんじゃないの?
0180デフォルトの名無しさん2005/10/05(水) 08:33:47
>>177
C++でもexitは使える。
ローカル変数のデストラクタが呼ばれるように気をつけて使えば全然問題ない。
0181デフォルトの名無しさん2005/10/05(水) 08:53:37
責任放棄でassert。
0182デフォルトの名無しさん2005/10/05(水) 10:31:07
なにか例外を投げつけてそれをmainでキャッチする。
0183デフォルトの名無しさん2005/10/06(木) 21:06:48
MacOSX使ってるんだけどmath.hのfmodlって使えないのか?
0184デフォルトの名無しさん2005/10/06(木) 21:24:43
int f( int x, ... )みたいな可変数の引数とる関数作りたいんだけど、
まぁ普通にva_start〜va_arg〜va_end使えばいい話だろうけど、
これって最後に末尾を示すコード(たとえば-1とか)入れる必要出てくるじゃん。

sprintfとか見るとそういうの一切ないけど、ああいう実装はどうやってやるんだろ?
0185デフォルトの名無しさん2005/10/06(木) 21:33:20
>>184
通常の実装であれば、formatに完全に依存してる。
formatを1文字ずつパースしていって、可変引数からの値が必要になるような
%dや%fといった文字列が出てきた時に逐一va_argで取り出すから、末端を識別する必要がない。
その代わり、可変引数の数より多く指定してしまったりすると暴走する。
0186デフォルトの名無しさん2005/10/06(木) 21:48:16
あぁ、そう言うトリックだったか。サンクスコ
0187デフォルトの名無しさん2005/10/07(金) 16:26:23
CreateThreadでスレッドを生成すると、スレッドが終了してもメモリの使用量が減りません・・・
うまくスレッドが終了できてないのでしょうか?
0188デフォルトの名無しさん2005/10/07(金) 16:50:24
スレッドが終了されてるかはメモリ使用量を見るより、
タスクマネージャのメニューの「表示」→「列の表示」→「スレッドの数」をチェック
して調べた方がいい、あと仮想メモリの方が事実上の使用されているメモリ使用量なんだっけ?
0189デフォルトの名無しさん2005/10/07(金) 17:49:33
>>187
スレッド終了して減る量なんて TLS の分くらいだべ?
01901892005/10/07(金) 17:50:12
あ、違。CreateThread か。
そりゃ減らんでしょ。
0191デフォルトの名無しさん2005/10/07(金) 19:07:06
>>188
タスクマネージャにこんな機能があったのかー。初めて知りました。
調べてみたら、スレッドは正しく終了してるみたいです。

>>190
beginthreadの方が良いのですか?
0192デフォルトの名無しさん2005/10/08(土) 00:41:46
>>191
Cランタイムをリンクしてるならbeginthreadex使わないとリークするぜ。
使わないだけじゃだめ。
CランタイムをリンクしないならCreateThreadでおけ。
0193デフォルトの名無しさん2005/11/07(月) 16:16:38
SSEが使えるかどうかを判別するにはどうしたらよいのでしょうか?環境はgcc4.0.2、Fedora core4です。
0194デフォルトの名無しさん2005/11/07(月) 16:29:10
>>193
cat /proc/cpuinfo
直接cpuidで調べるのは面倒だな
OSサポートのチェックもあるしな
0195デフォルトの名無しさん2005/11/07(月) 17:11:13
istream::readでバイナリファイルを読み込むと最大文字数も指定しているのに途中までしか読み込まれないのですが
バイナリファイルは読み込むとまずいのでしょうか?
バイナリpgmファイルを読み込みたいので1バイトづつで調度いいと思ったのですが他の関数にしたほうがいいのでしょうか?

winXP VC++6.0です
0196デフォルトの名無しさん2005/11/07(月) 17:14:29
>>195
バイナリモードで開いたか?
0197デフォルトの名無しさん2005/11/08(火) 15:44:00
classをnewで確保しているのですが、newって0で初期化してくれるんですか?
してくれるクラスとしてくれないクラスがあり、どっちか分からないです。

してくれないクラスは、全て0xcdcdcdcdで埋まっています。
VCの初期化していない状態だったはずですが、ならば0で初期化されているクラスはどうしてされているのか謎です。

コンストラクタでZeroMemory(this, sizeof(クラス))したら一応通りましたが、どうも危険な気がしています。
classをnewで確保する場合、どう0に初期化するのが適切なのでしょうか?
ご教授よろしくお願いします
0198デフォルトの名無しさん2005/11/08(火) 15:53:15
面倒臭がらず変数1コ1コ愛情込めて初期化してやれ
0199デフォルトの名無しさん2005/11/08(火) 16:03:36
仮想関数テーブルポインタまで真っ白けな悪寒
0200デフォルトの名無しさん2005/11/08(火) 18:58:14
私は怖いので初期化必要なのはコンストラクタで一個一個初期化する。
そうすればどこでnewしても安心だし。
ZeroMemoryとかmemsetとかはヤバいって話を聞くな・・
0201デフォルトの名無しさん2005/11/08(火) 19:19:55
>>200
>>199
使わないのが当然。
0202デフォルトの名無しさん2005/11/09(水) 07:31:08
というか「使ってはいけない」。
0203デフォルトの名無しさん2005/11/09(水) 13:52:09
一律ダメと言われても。struct でもダメなのか?
0204デフォルトの名無しさん2005/11/09(水) 13:56:20
重要なのはstructであるかどうかではなくPODであるか否か
02051972005/11/09(水) 14:20:29
意見ありがとうございます。

ZeroMemoryは止めました。
初期化しないと明らかにバグるものやポインタだけ初期化することにしました。
さすがに全部のメンバはやってられないです。
初期化していないとどうも気持ち悪いんですが、C++はそういうもんだと思っておきます。
0206デフォルトの名無しさん2005/11/09(水) 14:47:08
>>205
初期化してないとどうも気持ち悪いのは当然。
その感覚を欺いてはいけない。
方法(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:22
初期化テンプレートをつくって、変数タイプネームを囲んでしまえばいい。
0209デフォルトの名無しさん2005/11/09(水) 18:03:22
>207
コンストラクタ内部でイコールで代入すると
はデフォルトコンストラクタが走ってから
さらに代入演算子が走るから効率が良くない悪寒
POD型なら最適化で変わらないかもしれないけど
0210デフォルトの名無しさん2005/11/10(木) 04:43:51
>>205
仮令Cであっても0で埋めるのはナンセンス。
折角コンパイラがゴミ値を埋めてくれるのを邪魔してデバッグを却って困難にしかねない。
過去に私の周囲でバッファオーバランのバグを生み出した香具師に限って0埋めの習慣があったくらいだ。
0211デフォルトの名無しさん2005/11/10(木) 16:53:20
>>206
その方法で初期化で例外発生したやつを捕捉したい場合どうするんですか?
0212デフォルトの名無しさん2005/11/10(木) 16:55:24
どうにもC++のコンストラクタって穴だらけな気がするんですがage
0213デフォルトの名無しさん2005/11/10(木) 16:56:03
>さすがに全部のメンバはやってられないです。
単にクラスが巨大過ぎじゃ無いのか?
0214デフォルトの名無しさん2005/11/10(木) 16:59:31
C++ってクソだね^^
0215デフォルトの名無しさん2005/11/10(木) 17:23:26
>>211
A::A()
try
  : mem(0)
{
}
catch(...)
{
  throw something;
}
キャッチした例外を握りつぶそうとすると自動的に再投されるので注意。
0216デフォルトの名無しさん2005/11/10(木) 17:30:04
テラキモスww
0217デフォルトの名無しさん2005/11/10(木) 17:39:56
>>215
これやるぐらいならメンバにRAIIを徹底するか、例外安全なコンストラクタを持った
基底クラスの初期化に分割した方が良い気はするけれど。
0218デフォルトの名無しさん2005/11/10(木) 17:40:22
初期化リストは、そうじゃないと初期化できないメンバにしか
使わないなあ。
0219デフォルトの名無しさん2005/11/10(木) 17:45:08
>>205
クラスメンバのうち、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
>>211
初期化で例外投げなきゃならない設計が糞。
さすがは掃き溜め。
0221デフォルトの名無しさん2005/11/10(木) 20:31:27
>>220
たとえば初期化でnewするときにはどうする?
std::nothrowを指定するとしても、そいつがヌルを返してきたらどうする?
0222デフォルトの名無しさん2005/11/10(木) 20:57:26
>>221
>>217
0223デフォルトの名無しさん2005/11/11(金) 01:20:31
newが失敗するような末期的状態で
例外なんかがまともに動作するのかねえ
0224デフォルトの名無しさん2005/11/12(土) 11:19:15
>>220
RAII って知ってる?

>>223
例外処理自体は追加でメモリを必要としないから大丈夫。
例外オブジェクトを保持するメモリが必要となるかもしれないが、
std::bad_alloc のインスタンスを静的に持つような実装も考えられる。
0225デフォルトの名無しさん2005/11/12(土) 11:39:12
>>224
知ってる。それが何か?
0226デフォルトの名無しさん2005/11/12(土) 12:06:55
>>225
ということはつまり、リソースの要求処理が失敗したときに例外を投げるのも設計が糞だと?
0227デフォルトの名無しさん2005/11/12(土) 12:39:02
>>226
コンストラクタの例外リークは面倒だぞ?
0228デフォルトの名無しさん2005/11/12(土) 12:41:09
>>227
はて?思い当たらないが、どんなところが面倒になるの?
0229デフォルトの名無しさん2005/11/12(土) 13:12:58
例外を、単なる別のエラー処理技法のように扱ってはいけません。
エラー コードを返したり、グローバル変数の設定したりすることと
同レベルだと思ってはいけません。例外は、それを取り巻くコードの
構造と意味を、根底から覆します。例外は、プログラムの実行時
セマンティックを一時的に繋ぎ変え、通常実行しているコードを迂回し、
こういう状況でなければ決して実行されないコードを動作させます。
例外は、エラー状態を認知させ、プログラムの死という罰則を用いて
その状態を改めようとします。

このように、例外には単純なエラー処理を超えた特性があります。
これらの特性を必要としない、理解しない、あるいは文書化したく
ないなら、例外をスローしてはいけません。
例外以外のエラー処理技法を探してください。
0230デフォルトの名無しさん2005/11/12(土) 13:25:58
>>229 そんな古い文書コピペして、なんのつもりだ?
0231デフォルトの名無しさん2005/11/12(土) 13:54:37
>>228
本当に思い当たらないの?
0232デフォルトの名無しさん2005/11/13(日) 06:13:04
>>227
「コンストラクタの例外リーク」って何?
単純にコンストラクタから例外が飛んでくるだけなら、>>228
0233デフォルトの名無しさん2005/11/15(火) 18:29:06
「コンストラクタの初期化リスト」の話が、いつの間にか
「コンストラクタ内での初期化」の話になっているのは
ここがはきだめだからでしょうか?
0234デフォルトの名無しさん2005/11/17(木) 00:26:09
>>233 どこがそんな話になっている?
0235デフォルトの名無しさん2005/11/21(月) 00:28:05
なあ適当に作らせたsin波がやけに歪んでるんだけどなんでだろう
専用ソフトで作ると滑らかなのに

一応こんな感じで16bitで作ってるつもりなんだが
for(dwCount)
dwWave = (short)(100*sin(2*PI*100*dwCount/SamplingRate));

// PI = 2*atan(1)
0236デフォルトの名無しさん2005/11/21(月) 00:51:32
いつからPIは2 * atan(1)になったんだ?
0237デフォルトの名無しさん2005/11/21(月) 00:55:18
あすみません
こっちへの書き込みだけヴォケましたプログラム上は4*atan(1)でした
0238デフォルトの名無しさん2005/11/21(月) 01:03:56
sin()の結果に100を掛けたくらいだと、高々±100しか振れないから
16ビット帯域から見ると振幅が非常に狭いし分解能も悪くなるわけだが。
#音として歪むかどうかまでは知らん。
0239デフォルトの名無しさん2005/11/21(月) 01:30:07
その辺も大丈夫っぽいんです
つか*2しただけでピークピーク値が500くらいって何だよこれ(;'A`)
0240デフォルトの名無しさん2005/11/21(月) 07:31:27
いつからsin()は1〜-1以外の値を返すようになったんだ?
0241デフォルトの名無しさん2005/11/21(月) 12:26:06
うはwwww結局sinにdoubleで値渡したらうまくいきましたwwwww
おまいらサンクスコ
0242デフォルトの名無しさん2005/11/21(月) 12:56:46
>>241
おいこら、PI = 4 * atan(1)って書いてあるから当然にdoubleになっていると思ったじゃねぇか。
0243デフォルトの名無しさん2005/11/21(月) 12:56:56
ちゃんと<math.h>をincludeしろよ
02442432005/11/21(月) 12:57:31
ごめん。勘違い。
0245デフォルトの名無しさん2005/11/21(月) 13:08:56
>>244
案外あたっているかも知らん。
0246デフォルトの名無しさん2005/12/07(水) 22:04:39
C++で関数ポインタってどうやるんですか?
今調べた限りだと、メンバ関数ポインタ?のようなのを使うのかな?
もしくは使うべきじゃないのかな?
こうやるのがスマートみたいなのがあれば、教えて下さいー。
02472462005/12/07(水) 22:05:48
使うべきじゃないというのは、関数ポインタよりもっと良い方法があるから、C++だったらそっちを使うのべきって意味です。
0248デフォルトの名無しさん2005/12/07(水) 22:06:24
>>246
メンバ関数ならメンバ関数ポインタを使う
そうでないなら関数ポインタを使う
0249デフォルトの名無しさん2005/12/22(木) 12:28:39
c/c++を使ったプログラムの計算結果を
CADなどに図で出力することはできますか?
0250デフォルトの名無しさん2005/12/22(木) 12:43:56
>>249
出来ますよ。そう作れば。
02512492005/12/22(木) 12:54:21
即レスありがとうございます。
図々しいですがもしご存知でしたら
詳しいサイトなど教えて頂けませんでしょうか?
0252デフォルトの名無しさん2005/12/22(木) 12:57:19
>>249
CADじゃないけど、出力をExcelでグラフにするのはよくやってますよ。
ファイルにCSV形式で出力して、後はExcel側で読んでグラフにするだけ。
■ このスレッドは過去ログ倉庫に格納されています