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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/05/09(日) 10:31:46
スレを勃てるまでもない低俗な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/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
http://pc11.2ch.net/test/read.cgi/tech/1232983248/
スレを勃てるまでもないC/C++の質問はここで 8
http://pc12.2ch.net/test/read.cgi/tech/1235921779/
スレを勃てるまでもないC/C++の質問はここで 9
http://pc12.2ch.net/test/read.cgi/tech/1240022781/
スレを勃てるまでもないC/C++の質問はここで 10
http://pc12.2ch.net/test/read.cgi/tech/1242300936/
スレを勃てるまでもないC/C++の質問はここで 11
http://pc12.2ch.net/test/read.cgi/tech/1245059383/
スレを勃てるまでもないC/C++の質問はここで 12
http://pc12.2ch.net/test/read.cgi/tech/1248010352/
スレを勃てるまでもないC/C++の質問はここで 13
http://pc12.2ch.net/test/read.cgi/tech/1260842197/
スレを勃てるまでもないC/C++の質問はここで 14
http://pc12.2ch.net/test/read.cgi/tech/1269273471/
0232デフォルトの名無しさん2010/05/28(金) 17:58:46
質問はオープンの仕方だったのにね
0233デフォルトの名無しさん2010/05/28(金) 20:15:13
まあ、ファイルは開かないと読めないものという先入観があるのは
しょうがないだろう。 
0234デフォルトの名無しさん2010/05/28(金) 20:28:00
え?
02352332010/05/29(土) 01:02:34
いや、だからstdinというファイルハンドルが自動的に開いているという可能性を
知らなかったから
「標準入力をファイルとしてオープンする」という質問になっちゃったんでしょう。
>>231結果的に欲しかったのはファイルハンドルだったから。
0236デフォルトの名無しさん2010/05/29(土) 09:40:18
boostが使えない環境でスマポを自作しないといけないとして
どの程度のレベルまで仕様とか実装を練りこむ?
0237デフォルトの名無しさん2010/05/29(土) 09:45:09
>>236
理由が政治的かメモリサイズかによって違ってくるな。
0238デフォルトの名無しさん2010/05/29(土) 09:47:14
ハードウェア的な問題ではない
ただ、boostに不慣れな人がいてとりあえず今回はなしで、という感じ
0239デフォルトの名無しさん2010/05/29(土) 09:56:48
>>238
その判断は今回だけではすまないし後々後を引く。スマポは後から導入が面倒だから今後も見送りになりやすいぞ。
スマポ作るならboost::shared_ptrかstd::tr1::shared_ptrのインターフェース互換にして後にusingで切り替えられるようにすることを勧める。
0240デフォルトの名無しさん2010/05/29(土) 09:58:05
プロジェクトに必要なもの調べてそれだけ実装
0241デフォルトの名無しさん2010/05/29(土) 10:08:37
Googleみたいにboostの一部だけを厳選して使用すればいい
この場合の選定基準は理解が簡単でトレーニングの必要が少ないライブラリだけを許可することかな
shared_ptrやoptionalとか、その辺の解説サイトを流し読みすれば理解できるでしょ
0242デフォルトの名無しさん2010/05/29(土) 10:12:23
選定の結果、見事>>236の社内標準に採択されたprogress_displayであった。
0243デフォルトの名無しさん2010/05/29(土) 10:13:40
shared_ptrはヘッダだけだし、boost展開した箇所にincludeパス張るだけなんだからってPM説得したほうが良さげ
0244デフォルトの名無しさん2010/05/29(土) 17:16:50
shared_ptr使ってて修正を重ねるうちに
気が付かないうちに循環関係になっててメモリリークを引き起こしちゃって原因の判明に苦労したのだが
もうこれは気をつける以外に対応がないものなのか?
0245デフォルトの名無しさん2010/05/29(土) 17:55:19
>>244
デバッグ終了時にリークはレポートされるから、レポートされたときの版のコミットログ調べればすぐに特定できると思う。
循環参照が起きるパターンは限られてるんで、その場で対応すればいいと思うよ。
予想外の循環参照が起きるのは設計が悪いとしか言いようがない。たとえば参照の方向を一定にし、前方参照とshared_from_thisを使わない設計にすれば循環参照は自然に避けられる。
0246デフォルトの名無しさん2010/05/30(日) 10:57:28
stdio.hをインクルードしなくても
printf関数が使えるんですけどどういうことですか?
単なる警告なだけでエラーにならないのが不思議です。
本にはインクルードせよみたいに書いてあるのに
じゃあ何のためにインクルードするの?って感じなんですが・・・。
0247デフォルトの名無しさん2010/05/30(日) 11:04:15
Cの事なら、宣言されていない関数は
戻り値の型が int で、引数が (...) であるのと同じように解釈されて実行される。
だから、math.h をインクルードせずに sin(1) とかやると
変になる(int sin(int) であると解釈して実行されるので)など、
ちゃんとインクルードしないと意図しない動作を引き起こす恐れがあるので、
必ずインクルードすること。
(数学関数を特別視してちゃんとdoubleにしてくれるコンパイラもあるけど、
 それはそのコンパイラ独自の仕様)

C++なら文法エラー。
0248デフォルトの名無しさん2010/05/30(日) 11:34:35
googleのコーディング規約の整数型の項目についてなんだけど
これってコンテナのoperator[]の引数もintあるいはintN_tにしろってこと?
あとintは少なくとも32bitあると考えても良いって書いてあるけどそんな保証はないよね?
0249デフォルトの名無しさん2010/05/30(日) 11:58:15
グーグルの開発環境では最低32bitなだけだろ
0250デフォルトの名無しさん2010/05/30(日) 12:22:04
組み込みやらないなら最低32bitの過程が今時崩れることはないだろう
0251デフォルトの名無しさん2010/05/30(日) 12:29:44
社内規約をなんだと思ってるんだろうw
0252デフォルトの名無しさん2010/05/30(日) 16:10:26
float に100.123と入力して表示させると
100.123001となってしまうのは何故ですか?
0253デフォルトの名無しさん2010/05/30(日) 16:11:28
100.123が2進数では循環小数になるから
0254デフォルトの名無しさん2010/05/31(月) 03:48:08
VS2008のコンソールでスレッド使ったプログラムを作ってるんですが,
例外でデバッグが止まると時々,終了できなくなります.
デバッグ→すべて中止でも止まらない,タスクマネージャのプロセスにも表示されない...
プロセスIDを調べてPskillで指定しても終了できません.
コンソールwindowは残ったままなんですが….おかげでwindowsごとリセットしていますが,
何か止める方法orこうならないための対策ありますか.
0255デフォルトの名無しさん2010/05/31(月) 08:07:33
あ、俺も知りたい。
Windows自体再起動も終了も出来なくなるし、放置すると全体がフリーズしてすごく困る。
0256デフォルトの名無しさん2010/05/31(月) 12:29:22
>>254
>>255
CTFMONってプロセスがあったらキルしてからデバッグして味噌
0257デフォルトの名無しさん2010/05/31(月) 14:14:42
翻訳お願いします。英語版できいたら分からないといわれました。
The problem here is that our template was instantiated for the type char,
which turns out to be too by introducing an additional template parameter AccT
の英文は
「この問題はテンプレートは文字型についてインスタンス化されたことのことです。」
コンマまではこの訳であってますよね。その後は,
「witchはまた追加パラメーターACCTの導入によるもでであることがはんめいした」
であってますよね?
witchが指すものが前文に無いようにおもえて翻訳できません。
詳しく教えてください。
0258デフォルトの名無しさん2010/05/31(月) 14:28:02
whichはproblemにかかってるんじゃねーの?
0259デフォルトの名無しさん2010/05/31(月) 14:34:52
>>258
翻訳してください。
0260デフォルトの名無しさん2010/05/31(月) 15:17:53
>>258なら「この問題」
0261デフォルトの名無しさん2010/05/31(月) 15:19:39
>>256
ありがと。今度なったら試してみる。
0262デフォルトの名無しさん2010/05/31(月) 15:22:35
which turns out to be too がわからない。 この too は何だ?
0263デフォルトの名無しさん2010/05/31(月) 15:23:18
tooは 最後につけるところを真ん中につけただけ。
0264デフォルトの名無しさん2010/05/31(月) 15:24:18
>>263 じゃ、 be の補語は? exist の意味のbe?
0265デフォルトの名無しさん2010/05/31(月) 15:25:10
which turns out to be (instantiated) too かなあ。
0266デフォルトの名無しさん2010/05/31(月) 15:26:36
beの補語はby以下らしい。
0267デフォルトの名無しさん2010/05/31(月) 15:30:55
関係代名詞はbeの補語ではなくて主語になるらしい。
0268デフォルトの名無しさん2010/05/31(月) 15:34:23
この問題は追加テンプレートパラメーターAccTの導入からも、
存在することがが明らかになる
0269デフォルトの名無しさん2010/05/31(月) 15:37:29
まとめて訳すとこんな感じか?

ここでの問題は、追加テンプレートAccTの導入からもわかるように、
我々のテンプレートが文字型についてインスタンス化されてることです。
0270デフォルトの名無しさん2010/05/31(月) 15:40:13
ありがとうございました。
0271デフォルトの名無しさん2010/05/31(月) 17:22:57
質問です。C++2008には
#pragma ○○
・・・
#pragma end○○

と書けば横の+、−でコードを格納できたと思いますが、
忘れてしまったので教えてもらえませんか?
0272デフォルトの名無しさん2010/05/31(月) 17:58:12
region
0273デフォルトの名無しさん2010/06/01(火) 10:42:15
staticってどういう時に使うの? なんでグローバル変数じゃなくて静的変数を使うの?
0274デフォルトの名無しさん2010/06/01(火) 11:56:59
グローバル変数との比較だと
static変数はスコープがソースコード単位になるから
他のソースコードと名前が重複しても大丈夫
0275デフォルトの名無しさん2010/06/01(火) 12:06:55
Cにはnamespaceがないから。
0276デフォルトの名無しさん2010/06/01(火) 14:15:29
staticって意味が幾つも有ったような
0277デフォルトの名無しさん2010/06/01(火) 19:21:16
C#言語で言う#regionみたいなことがしたいのですが
何かいい方法はありませんか?
現在は
#define COM 1

#ifdef COM
~折りたたみたい部分~
#endif


といった使い方をしていますがスマートではなく、何かいい方法がないか探しています
0278デフォルトの名無しさん2010/06/01(火) 19:25:24
釣りかギャグかはたまたガチか
それが問題だ
0279デフォルトの名無しさん2010/06/01(火) 19:28:52
初心者すれに行くべきでしたね
すいません移動します
0280デフォルトの名無しさん2010/06/01(火) 20:00:34
数レス前に書いてあるだろw
0281デフォルトの名無しさん2010/06/01(火) 20:55:03
あれだ
灯台下暗し
0282デフォルトの名無しさん2010/06/02(水) 01:42:20
かなり初歩的な質問なのですが継承で
基本クラスのメンバ関数から派生クラスのデータメンバを変更するには
どういった操作がありますでしょうか?
基本クラスのメンバ関数に派生クラスのオブジェクトのアドレスを
渡してみたりしたのですがコンパイルエラーで上手くいきませんでした。
よろしくお願いします。
0283デフォルトの名無しさん2010/06/02(水) 02:40:09
普通に仮想関数でいいと思うが。
0284デフォルトの名無しさん2010/06/02(水) 07:44:39
そんな基本クラスが派生クラスの中身を知っているような設計は投げ捨てるかどうしてもというならCRTPを使いなさい
0285デフォルトの名無しさん2010/06/02(水) 17:11:03
>>283 >>284
参考になりました。ありがとう!
0286デフォルトの名無しさん2010/06/02(水) 17:13:54
1. 構造体のポインタ*tがある
2. 構造体の中にint型のポインタhogeがある
3. mallocを使って*tのメモリを確保
3. mallocを使ってhogeにint型x個分のメモリを確保
4. fwriteで構造体をファイルに書き込みたいが、二項目はどうやって指定すればいい?
0287デフォルトの名無しさん2010/06/02(水) 17:18:28
fwrite(t, sizeof *t, 1, fp);

構造体のサイズが増えるわけでもないし。
0288デフォルトの名無しさん2010/06/02(水) 17:27:25
>>287
上手くいかん

typedef struct test_t {
 int a,b,c,d,e;
 int *p;
} test_t;

test_t *t;
t = (test_t *)malloc(sizeof(test_t));
t->p = (int *)malloc(sizeof(int)*60);
printf("%d",sizeof(*t));

で、24って出る
0289デフォルトの名無しさん2010/06/02(水) 17:31:01
>>286
fwrite(t, sizeof(int), x, fp);
だろ

ただし、
>1. 構造体のポインタ*tがある
でなく、
>1. 構造体のポインタtがある
であるならということ。3.も同様。

もし原文通りなら
fwrite(*t, sizeof(int), x, fp);
となる
0290デフォルトの名無しさん2010/06/02(水) 17:32:28
>>288
pに確保した領域のサイズは構造体とは別。
0291デフォルトの名無しさん2010/06/02(水) 17:32:45
trivially copyable classに展開してまとめて読み書きすればいいよ
0292デフォルトの名無しさん2010/06/02(水) 17:34:55
>>288
構造体には他のメンバもあるのか。
それなら fwrite を2回する必要があるだろ。

fwrite(t, sizeof(test_t), 1, fp);
fwrite(t->p, sizeof(int), x, fp);
0293デフォルトの名無しさん2010/06/02(水) 17:42:39
>>290
知ってる。だから質問した

>>292
それが一番スマートかな
構造体からpをそもそも切り離しとくってのも一つの手か
thx
0294デフォルトの名無しさん2010/06/02(水) 17:47:00
知ってたら>>288で24が出ても上手くいかんなんて言わないだろw
0295デフォルトの名無しさん2010/06/02(水) 17:55:29
fwriteしたものを、そのままfreadしようっていう魂胆なの?
0296デフォルトの名無しさん2010/06/02(水) 17:59:17
定数じゃないならxもどっかに保存しとかないと読み込むとき困る。
0297デフォルトの名無しさん2010/06/02(水) 18:13:15
読み込みは t = malloc(sizeof *t) → fread(t) → t-> = malloc(int*x) -> fread(t->p) で。
0298デフォルトの名無しさん2010/06/02(水) 18:39:27
型変換を伴うコピーの時の参照カウンタのコピーをどうやってるのかと疑問に思って
shared_ptrの中身を覗いてみたらpublicメンバだった

こんなものなの
0299デフォルトの名無しさん2010/06/02(水) 18:49:20
>>298
public でないと参照できないじゃん
0300デフォルトの名無しさん2010/06/02(水) 18:54:47
>>299
まあそうなんですが
boostのことだからもっと複雑怪奇な方法で回避してる物かと思ったのでw
0301デフォルトの名無しさん2010/06/02(水) 19:25:24
template friend classにしないのはなんで?
0302デフォルトの名無しさん2010/06/02(水) 21:51:31
http://codepad.org/1ZyOAlyL
上は、はじめてのCという本に乗っていたコードを
少し書き換えたもの(printfをcoutに、など)です
結果が3→2→1→0→1→2→3と表示される内、
行きの3→2→1→0は分かるのですが、
帰りの0→1→2→3の部分がどうしてそうなるのか、さっぱり分かりません
tline(int x)に渡す引数を増加させる処理はないように見えるのですが、
どなたか教えていただけないでしょうか
0303デフォルトの名無しさん2010/06/02(水) 21:54:41
再帰関数で0以外は一つの関数で2回表示してるから。
0304デフォルトの名無しさん2010/06/02(水) 22:00:50
recfunc(3)を呼び出す
3を表示する
 recfunc(2)を呼び出す
 2を表示する
  recfunc(1)を呼び出す
  1を表示する
   recfunc(0)を呼び出す
   0を表示する
   recfunc(0)から抜ける
  1を表示する
  recfunc(1)を抜ける
 2を表示する
 recfunc(2)を抜ける
3を表示する
recfunc(3)を抜ける
0305デフォルトの名無しさん2010/06/02(水) 22:05:54
>>303
冷静になってみると仰る通り2回表示してますね
ifの中身だけ見て、その下を見てませんでした
ありがとうございます

>>304
詳しい説明ありがとうございます
小一時間も考え込んでた自分が恥ずかしいです

低レベルな質問にも関わらずお答えいただき、お二方に感謝します
ありがとうございました
0306デフォルトの名無しさん2010/06/02(水) 22:48:07
>>301
どうもコンパイラにより対応状況がまちまちらしい
boostのコードをみてみたら狡賢いコードになってたw

public:
/*
〜省略〜
*/

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
private:
template<class Y> friend class shared_ptr;
template<class Y> friend class weak_ptr;
#endif
T * px; // contained pointer
boost::detail::shared_count pn; // reference counter
0307デフォルトの名無しさん2010/06/02(水) 22:51:08
ポインタp,qがあって参照剥がしして一致、あるいは、両方NULLならtrueにしたいときって↓でおけ?

((p && q) && (*p == *q)) || (p || q)
0308デフォルトの名無しさん2010/06/02(水) 22:57:48
だめじゃね?
0309デフォルトの名無しさん2010/06/02(水) 23:01:27
だめだな
0310デフォルトの名無しさん2010/06/02(水) 23:06:08
どうして諦めるんだよ!
0311デフォルトの名無しさん2010/06/02(水) 23:07:30
((p&&q) && (*p==*q)) || (!(p || q))か?
0312デフォルトの名無しさん2010/06/02(水) 23:20:33
答え:(p && q && (*p == *q)) || !(p && q)
0313デフォルトの名無しさん2010/06/02(水) 23:25:48
X
0314デフォルトの名無しさん2010/06/02(水) 23:29:56
!p && !q || p && q && (*p == *q)
0315デフォルトの名無しさん2010/06/02(水) 23:58:39
答え。
p-q
0316デフォルトの名無しさん2010/06/03(木) 00:10:52
>>314が俺好み
0317デフォルトの名無しさん2010/06/03(木) 00:15:55
!p && !q と !(p || q) のどっちにするかは趣味の問題だな。
0318デフォルトの名無しさん2010/06/03(木) 06:52:18
p == q || p && q && *p == *q
0319デフォルトの名無しさん2010/06/03(木) 09:21:58
p == q || と || p == q のどっちにするかは趣味の問題だな。
0320デフォルトの名無しさん2010/06/03(木) 09:27:53
p == q を先にチェックするほうがいいにきまってるだろ。
0321デフォルトの名無しさん2010/06/03(木) 09:42:16
なんで?
0322デフォルトの名無しさん2010/06/03(木) 09:48:52
p と q が 0 でない事を先にチェックした方が良い
0だと以降が実行されない

p == q は p と q の両方が0でも真になってしまう
0323デフォルトの名無しさん2010/06/03(木) 09:50:42
> p == q は p と q の両方が0でも真になってしまう
それが >307 が求めていたものでしょ。
0324デフォルトの名無しさん2010/06/03(木) 09:55:05
>>32 参照はがしをしなくてすむなら、しないほうがはやいでしょ?
ポインタが同じところをさしているなら、ポインタの先を見るまでもない。
0325デフォルトの名無しさん2010/06/03(木) 10:46:05
>>324
大人になれば分かる
0326デフォルトの名無しさん2010/06/03(木) 11:09:17
>>324
ポインターの値が同じでも実体の値が違うことがある
0327デフォルトの名無しさん2010/06/03(木) 11:16:50
順序は実際のデータでプロファイリングして決めるのが一番
0328デフォルトの名無しさん2010/06/03(木) 11:19:07
>>326
PODとは限らんからね
>>324 はC++でプログラム組んだことがないんだと思う
0329デフォルトの名無しさん2010/06/03(木) 11:29:17
>ポインターの値が同じでも実体の値が違うことがある
そんなスマポは使いたくない。
0330デフォルトの名無しさん2010/06/03(木) 11:30:37
>>328
普通のポインタじゃなくて、スマートポインタの話をしていたの?
0331デフォルトの名無しさん2010/06/03(木) 11:31:47
p,qが生ポインタでp == qで*p != *qって例えばどういうケースよ?現実的な事例を教えてくれ
■ このスレッドは過去ログ倉庫に格納されています