2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2014/05/13(火) 01:12:47.46 ID:BZ1B9xOm.net
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/
20 http://toro.2ch.net/test/read.cgi/tech/1316013463/
21 http://toro.2ch.net/test/read.cgi/tech/1342285511/

2 :デフォルトの名無しさん:2014/05/13(火) 01:21:53.71 ID:BK7bod/g.net
< `∀´>ニダー

3 :デフォルトの名無しさん:2014/05/13(火) 18:18:10.74 ID:A9K77IIM.net
さんだーぼるとー

4 :デフォルトの名無しさん:2014/05/14(水) 05:50:20.23 ID:Xzsp2rfd.net
CでUnixコマンドと同じ機能を持ったプログラムを作りたいんですけど
何か良い解説が載ってある本かサイトはないでしょうか?

5 :デフォルトの名無しさん:2014/05/14(水) 08:15:17.76 ID:+P9aBJqU.net
該当するUnixコマンドのGnu実装のソース読めば?
Cで書かれてるの多いし。

6 :デフォルトの名無しさん:2014/05/14(水) 11:48:07.31 ID:mJzoB0fa.net
system();関数でコールするとかw

7 :デフォルトの名無しさん:2014/05/14(水) 18:42:46.24 ID:Nzt71bWa.net
C++11ではnullptrというものが追加されたそうですが
null_ptrではないのには何か理由があるのですか?
どうでもよいことですが気になってしまいます

8 :デフォルトの名無しさん:2014/05/14(水) 20:16:13.60 ID:2QlwcCvG.net
タイプする文字数が少ない

9 :デフォルトの名無しさん:2014/05/15(木) 18:22:05.94 ID:5sMFAW9N.net
素直に null にしとけっちゅうねん

10 :デフォルトの名無しさん:2014/05/16(金) 15:43:55.66 ID:vCeiEc1O.net
ポインタは全て動的っで
最終的に解放が必ず必要って解釈して良い?
動的じゃないポインタってある?

11 :デフォルトの名無しさん:2014/05/16(金) 16:14:28.33 ID:wig+3ePF.net
ある。
int a;
int *p = &a;

12 :デフォルトの名無しさん:2014/05/16(金) 16:16:44.29 ID:WW/l1jAv.net
ポインタは宇宙なので単一に矮小化してとらえることはできない

13 :7:2014/05/16(金) 19:44:41.34 ID:ZlViVWqR.net
やっぱりタイプくらいしかないんですね…
文化の違いなんでしょうか?
ありがとうございました!

14 :デフォルトの名無しさん:2014/05/16(金) 19:53:39.11 ID:iSjldn++.net
質問です
/*
 整数15と37の和を表示する
*/
#include<stdio.h>

int main(void)
{
printf("%d",15+17); /*整数15と37の和を10進数で表示*/

return(0);
}



とhspスクリプトエディタにうちこんだのですが

#HSP script preprocessor ver3.32 / onion software 1997-2013(c)
#Use file [hspdef.as]
#Error:invalid include suffix in line 4 [???]
#Fatal error reported.

となってしまいます よかったらだれかおしえてください
return(0);

15 :デフォルトの名無しさん:2014/05/16(金) 20:16:19.66 ID:WW/l1jAv.net
HSP総合スレ【part 7】
http://toro.2ch.net/test/read.cgi/tech/1393282298/l50

16 :デフォルトの名無しさん:2014/05/16(金) 20:43:46.63 ID:wig+3ePF.net
>>14
C言語とHSPを混同するな

17 :デフォルトの名無しさん:2014/05/16(金) 22:48:00.00 ID:TJX0UH9b.net
分母が0かどうかを判定するのに==0で等値比較をするのは、
==0でtrueでにならない限り計算ではエラーにならないと思うので
問題ないですよね?

18 :デフォルトの名無しさん:2014/05/16(金) 23:01:56.31 ID:ZLut8i0j.net
>>17
型が double で、非常に小さな値のときに、
==0 は false だけど、演算結果が無限大になることはあるけど大丈夫?

19 :デフォルトの名無しさん:2014/05/17(土) 00:16:34.85 ID:V4dexxPJ.net
プログラムとあんまり関係ないけど、
シミュレーションプログラムでの命名について
アイデアください

時間を無次元化したら
stepって単位にするのが一般的だと思うけど
長さを無次元化したら
なんて名前にしたらいいと思う?

20 :デフォルトの名無しさん:2014/05/17(土) 00:21:01.02 ID:R4olBPWV.net
>>19
それぞれtとlでええんとちゃう?
lが嫌ならmとかで

21 :デフォルトの名無しさん:2014/05/17(土) 00:21:24.12 ID:YyEzaSn4.net
hex

22 :デフォルトの名無しさん:2014/05/17(土) 22:48:54.63 ID:Twx7r9t2.net
無次元と無名数は違うんじゃないだろうか?

23 :デフォルトの名無しさん:2014/05/17(土) 23:35:50.73 ID:jvmVGTrf.net
かなり初歩的な質問でごめんなさい。
vectorに配列型を指定した場合の挙動が分からなくて困っています。

正確には
std::vector< double[2] > vec1;
みたいなコードを書いたんですが、これはやってはいけないコードなのでしょうか?
push_backやresizeを呼ぼうとするとどうやってもエラーで進まないです。引数有りコンストラクタも呼べません。

素直に
vector<double> vec1[2];
とやるべきなのでしょうか?
また、テンプレートに配列型を指定できないのはvector特有の性質なのでしょうか?

24 :デフォルトの名無しさん:2014/05/17(土) 23:50:44.42 ID:R4olBPWV.net
>>23
<>を使うってことはtemplateを使ってるんだから、型名以外はダメだったような……
 vector<double> vec1[2];
とやると、vectorな変数が2個できるから、使える添字の範囲は
vec1[0〜1][0〜?]となる(?はvectorなので不定数)。一方、
 vector< vector<double> > vec1; //コンパイラの解釈的に空白は必須だったはず
と二段重ねにすると、resize()でサイズを弄れるから、例えば
 vec1.resize(3);
 for(int i = 0; i < 3; ++i){
  vec1[i].resize(2);
 }
とすると、使える添字の範囲はvec1[0〜2][0〜1]となる

25 :デフォルトの名無しさん:2014/05/18(日) 02:00:23.39 ID:3fQTMrTl.net
>>24
ありがとうございます
template自体が配列使っちゃいけないんですか
現在newを使ってるんですが、ソースの書き換えができない段階に来ており
添え字の問題を解決するために結局operator[]を定義したクラスを作ることにしました

26 :デフォルトの名無しさん:2014/05/18(日) 03:51:33.54 ID:nSMECTwp.net
最近C++の勉強を始めました。開発にVisualStudio2008を使っています。
普段はJavaを使用しており、開発環境もEclipseを使っているのですが
どうにもVisualStudioの使い方が判らず困っています。

VisualStudioの設定や便利な使い方を学ぶのにお勧めのWebサイトや書籍などありませんか?

27 :デフォルトの名無しさん:2014/05/18(日) 04:28:14.54 ID:+bye9+6c.net
Visual Studioのスレがあるじゃないか
なぜここで訊く

28 :デフォルトの名無しさん:2014/05/18(日) 08:22:30.19 ID:Uw9b9LOt.net
つまり、そもそもヘルプやドキュメントの検索ができない(これはスレタイトルの検索が
できなかった時点で確定している事実)のだから、机を並べて事細かにアドバイスして
くれるような人間がいない状況で新しいものに手を出すのは無謀なレベルの人間>>26

29 :デフォルトの名無しさん:2014/05/18(日) 10:17:46.15 ID:cA8A9s6T.net
>>23
良く分からんけどstd::arrayがあるからこんな風に書いたらどうかな?
わざわざoperator[]があるクラスを作るのは面倒だし、vectorを入れ子にするとコード膨らむし

typedef std::array<double, 2> Ad2;

int main()
{
std::vector<Ad2> vad;
Ad2 ad;

ad[0] = 0.0; ad[1] = 1.0;
vad.emplace_back(ad);
ad[0] = 2.0; ad[1] = 3.0;
vad.emplace_back(ad);

for (auto a : vad)
std::cout << a[0] << ' ' << a[1] << std::endl;
}

30 :デフォルトの名無しさん:2014/05/18(日) 14:27:07.69 ID:geSLm+s7.net
Cで実体にはconstありの引数を持った関数のプロトタイプ宣言の引数に
constを付けても付けなくても違反でないのですが、どちらがよいのでしょうか?

31 :デフォルトの名無しさん:2014/05/18(日) 15:18:49.21 ID:MO8Dtd0g.net
linux環境下でc言語を用いて動画を再生する方法は無いでしょうか?
x11ウィンドウ内に表示したいです

32 :デフォルトの名無しさん:2014/05/18(日) 16:00:30.80 ID:P2EXL/Ge.net
>>30
なぜconstを付けるのかということを考えると
プロトタイプ宣言に付けないと価値が半減する

33 :デフォルトの名無しさん:2014/05/18(日) 16:16:35.52 ID:oqaXJcpo.net
>>29
arrayのことは知りませんでした。その方がずっと簡単にできますね。

こちらの状況は、これまでnewで
int n = XXX;
double (*vecters)[2] = new double[n][2]
のようにしていたのですが、当初想定してなかったメモリ解放のケースが大量に出てきてしまいました
そこでvectorで解決しようと思ったのですが、vectorにvector入れ子だと添え字の順番が逆で
しかしもう書き換えができないほど利用数が多かったので、vectorに自分で定義したクラスを入れようとしてました
ですがarray使えば済む話でしたね。今までSTLにあまり触れてこなかったのですが、これを機に勉強しようと思います
ありがとうございました

34 :デフォルトの名無しさん:2014/05/18(日) 16:27:08.12 ID:gVgdo/dn.net
>>31
system("vlc moviefile.mp4");

35 :デフォルトの名無しさん:2014/05/18(日) 17:10:22.13 ID:DIHfwpMS.net
>>3
それだったらスマポに入れればいいぞ
もっと簡単になる

int main()
{
int n = 10;
std::unique_ptr<double [][2]> ud(new double[n][2]);

int i = 0;
std::for_each(ud.get(), ud.get() + n, [&i](double* p){ p[0] = i + 1.0; p[1] = i + 2.0; i++; });

for (int i = 0; i < n; i++)
std::cout << ud[i][0] << ' ' << ud[i][1] << std::endl;
}

36 :デフォルトの名無しさん:2014/05/18(日) 17:14:24.57 ID:DIHfwpMS.net
まちごた
×>>3
>>33

37 :デフォルトの名無しさん:2014/05/19(月) 20:38:58.41 ID:u0kYoYP8.net
委譲を使いクラスを生成した場合
委譲をした元クラスを解放すれば
委譲されたクラスは自動で解放される?
委譲されたクラスのデストラクタはちゃんと呼ばれる?

38 :デフォルトの名無しさん:2014/05/19(月) 21:02:29.78 ID:FaLSmftQ.net
試せば?

39 :デフォルトの名無しさん:2014/05/19(月) 22:38:02.91 ID:mLyDgbnZ.net
>>35
このスマポという奴を使う場合
ud[n][2]の2のほうも変数にする方法は有りますか?

40 :デフォルトの名無しさん:2014/05/19(月) 23:04:05.15 ID:Yfo7RAeE.net
>>39
constexpr int を使えば行ける
但し行毎に列の長さを変えるような使い方は出来ない
そういう時はvectorを使う

41 :デフォルトの名無しさん:2014/05/19(月) 23:45:45.38 ID:Bw7LBrUS.net
c言語を学びたいとおもうんですが開発環境でつまずいてしまっています
パソコンに入っている microsoft visual studio professonal 2013
でc言語を入力したいと思っているのですがなかなかうまくいきません
どうすればいいですか?
あとおすすめのc言語開発環境などがあったらおしえてほしいです

42 :デフォルトの名無しさん:2014/05/20(火) 00:02:52.05 ID:mxK7K6eG.net
>>41
>microsoft visual studio professonal 2013
初心者なのにExpressじゃなくていきなりProfessional版かよ……
まあそれはともかく、とりあえずC言語のプログラムを動かしたかったら、
・ソースコードをメモ帳等のエディタで書いて保存。拡張子は「.c」を推奨
 (Visual Studio内にもエディタはあるけど使い方を覚えるのはちょっと手間かも)
  http://i.imgur.com/CTRzqgR.png
・スタートメニューから、「Visual Studio 2013」→「Visual Studio ツール」で
 出てくる画面から、「VS2013 x64 Cross Tools コマンド プロンプト」か
 「VS2013 x86 Native Tools コマンド プロンプト」をクリック
  http://i.imgur.com/nwFfURk.png
・するとコマンドプロンプトが出現するので、ごく普通にソースコードが置いてある
 フォルダまでCDコマンドで移動
  http://i.imgur.com/lvOBxVb.png
・後はclコマンドで、「cl xxxx.c」と入力してエンターするだけ!
 (xxxx.cは、自分が保存したソースコードのファイル名を入力)
  http://i.imgur.com/3mOXHRP.png
・出来たexeを実行すれば結果が出てくるはず。お疲れ様でした
  http://i.imgur.com/U5FNBNp.png

ちなみにC言語開発環境としては素直にVisual Studioを勧めておく
(いまどきBorland C++ Compiler 5.5を使う意味はあまりないので)

43 :デフォルトの名無しさん:2014/05/20(火) 00:03:29.79 ID:Yfo7RAeE.net
constexpr size_t の方がいいかな・・・
でも64bit環境でそんな大きな配列使わないよね・・・

44 :デフォルトの名無しさん:2014/05/20(火) 00:11:29.08 ID:KXJMtxo4.net
>>41
素のCならTiny C Compilerを--runで動かすのがトライアンドエラーが早くて便利で、
コマンドプロンプトで「tcc.exe --run ソースコード.c」で実行ファイル作らずにコンパイルして動かせる。
Visual Studio使うならVisual Studio コマンドプロンプトってのがメニューに有るだろうからそれ使う。
「CL ソースコード.c」でコンパイルして作られた実行ファイルを実行すればいい。
ソースコードはメモ帳でも何でも適当なテキストエディタで拡張子を.cにしたファイルとして作ればいい。
Visual StudioのIDE使って開発してもいいけど、上手く行かなかったらしいから取り敢えず省略。

でもまずは取り敢えず適当なCの入門手引をWebサイトでも書籍でもいいから手に入れるべき。
あとはその手引に合わせた環境を用意するなり、使い方を読み替えて使う。

そもそも、なんでVSのProが入ってんだそのパソコン…
誰かが入れてくれたなら入れてくれた奴に聞くのが一番手っ取り早い気がする。

45 :デフォルトの名無しさん:2014/05/20(火) 00:17:47.05 ID:zlaxDiQa.net
>>44
それ同じこと既に言ってるんだけど

……いっそこれ使った方が楽ちんな気がする(中身はTiny C Compiler)
http://9cguide.appspot.com/p_9cide.html

46 :デフォルトの名無しさん:2014/05/20(火) 00:21:02.90 ID:KXJMtxo4.net
>>45
全部が全部同じじゃないし、投稿時間だって10分も違わないし、レスが被るくらいでみみっちいこと言うなよ

47 :デフォルトの名無しさん:2014/05/20(火) 01:14:46.12 ID:2A54L/7+.net
constexpr知らない人がいるから一応書いておくか

constexpr std::size_t m = 2;
struct mydeleter1 {
void operator()(double (*p)[m]) {
std::cout << "delete double*[" << m << "]" << std::endl;
delete[] p;
}
};

int main()
{
int n = 10;
{
std::unique_ptr<double [][m], mydeleter1> ud(new double[n][m]);

int i = 0;
std::for_each(ud.get(), ud.get() + n, [&i](double* p){ p[0] = i + 1.0; p[1] = i + 2.0; i++; });

for (int i = 0; i < n; i++)
std::cout << ud[i][0] << ' ' << ud[i][1] << std::endl;
}
std::cout << "unique_ptr was deleted." << std::endl;
}

カスタムデリータで確実に解放されている事を確認した
本当はconstexprはmain()の中に書くとすっきりするんだけど、classの前方宣言を
行ってしまうとmの値が不明になってコンパイル出来なくなるので外に出した

48 :デフォルトの名無しさん:2014/05/20(火) 02:32:30.63 ID:OAGGaPxS.net
デリータをラムダにしたらいかんのけ

49 :デフォルトの名無しさん:2014/05/20(火) 06:55:45.27 ID:HULE9c20.net
ディリータがラムザだって?

50 :デフォルトの名無しさん:2014/05/20(火) 10:31:47.12 ID:jnRMRVPU.net
>>48
無理じゃ

http://d.hatena.ne.jp/nagoya313/20100305/1267758837

std::shared_ptrならカスタムデリータにラムダ式を使えるが、std::unique_ptrはダメ

51 :デフォルトの名無しさん:2014/05/20(火) 12:34:49.57 ID:UR0HXhEB.net
>>50
autoに代入してからなら入るはずだけど

52 :デフォルトの名無しさん:2014/05/20(火) 14:37:47.10 ID:U8Xj8N/D.net
auto mydeleter2 = [](double (*p)[m]){ std::cout << "delete double*[" << m << "]" << std::endl; delete[] p; };
std::unique_ptr<double [][m], decltype(mydeleter2)> ud(new double[n][m], mydeleter2);

こんなのか
変態過ぎるwww

53 :デフォルトの名無しさん:2014/05/20(火) 15:32:16.32 ID:PibgqYJG.net
A *a, *b;
a = new A;
b=a;
delete a;
a=new A;
b!=a
という保証なんてどこにもないですよね?

54 :デフォルトの名無しさん:2014/05/20(火) 17:05:17.57 ID:mSiEAm6Z.net
一度開放した領域が再度割り当てられることはないという保証なら、ありませんね。

55 :デフォルトの名無しさん:2014/05/20(火) 17:06:36.99 ID:y0AQP6Vn.net
え?

56 :デフォルトの名無しさん:2014/05/20(火) 18:38:43.12 ID:KXJMtxo4.net
delete a;を一行後ろに回さない限り、b!=aもb==aもありうる。

57 :デフォルトの名無しさん:2014/05/20(火) 20:58:24.17 ID:eMXV5lE3.net
派生クラスのデストラクタには
とりあえず virtual つけとけば問題ない?

58 :デフォルトの名無しさん:2014/05/20(火) 21:10:48.34 ID:fbMM1sIr.net
基底クラスの方に付けろ

59 :デフォルトの名無しさん:2014/05/20(火) 21:17:17.03 ID:XZ8PbsoH.net
>>57
基底クラスの方じゃないかい?

60 :57:2014/05/21(水) 21:12:40.05 ID:Rtlj0b94.net
間違えた
基底クラスのデストラクタには
とりあえず virtual つけとけば問題ない?

あと、派生クラスのデストラクタに
virtual つけとくとなにか問題ある?

61 :デフォルトの名無しさん:2014/05/21(水) 23:10:48.52 ID:QpxSOORZ.net
基底クラスのデストラクタにvirtual付けないと基底クラスのデストラクタが呼ばれずメモリリークする
派生クラスのデストラクタは基底クラスのデストラクタにvirtualが付いている場合デフォルトでvirtualと
みなされる

http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja

ここら辺読んでよ

finalつけるとどうなるんだっけ?コンパイルエラー?警告だけ?やってみればいい話だけど

62 :デフォルトの名無しさん:2014/05/22(木) 00:58:34.82 ID:ZWGxuBLk.net
>>61
×基底クラスのデストラクタが呼ばれず
○派生クラスのデストラクタが呼ばれず
あと、それが起きるのは基底クラスにキャストした状態でdeleteした場合などで、
デストラクタが呼ばれない事が問題だから起きるのはメモリリークだけじゃない。
ハンドルがリークする場合もあれば終了処理が行われない場合もある。

だったはず。

63 :デフォルトの名無しさん:2014/05/22(木) 08:14:19.27 ID:B1HhBS7N.net
http://cpplover.blogspot.jp/2011/05/c0xfinaloverride.html?m=1

64 :60:2014/05/22(木) 20:57:36.89 ID:m4yPgbOU.net
ぶっちゃけ
クラスのデストラクタ全てにvirtualつけとけば
問題なくない?

65 :デフォルトの名無しさん:2014/05/22(木) 21:14:59.60 ID:2g4glAhM.net
>>64「パフォーマンスは投げ捨てるもの」

66 :デフォルトの名無しさん:2014/05/22(木) 22:10:33.87 ID:5c02VcX7.net
C++にてSwitch文を使った相性占いプログラムのソースを書いてほしいです

まず最初に二人の情報(5桁の数字ID、生年月日)入力をして、
そこから演算を行い、占い結果を表示するプログラムのソースを書いていただけないでしょうか

演算方法は何でもいいですし、結果は何通りでもいいです
簡単なものでも全然構いませんので、お願いしますm(_ _)m

67 :デフォルトの名無しさん:2014/05/22(木) 22:18:23.05 ID:33euSJkO.net
>>66
占い結果で分岐するのをswitch使ってって事でいいのか

68 :デフォルトの名無しさん:2014/05/22(木) 22:21:18.26 ID:2g4glAhM.net
>>66
何もかも丸投げしてんじゃねーよw
せめてIDと生年月日から占う部分だけでも作れ
(もちろんコード化できるぐらいキッチリ仕様をまとめること)

69 :デフォルトの名無しさん:2014/05/22(木) 22:22:03.03 ID:5c02VcX7.net
>>67
そうです><

70 :デフォルトの名無しさん:2014/05/22(木) 22:37:32.88 ID:33euSJkO.net
>>69
switch(占い結果){
結果1:
printf("結果1です");
break;
結果2:
printf("結果2です");
break;
}

71 :デフォルトの名無しさん:2014/05/22(木) 22:59:28.62 ID:2g4glAhM.net
とりあえず>>66の要望に沿ったものを作ってみた。
流石に入力部分ぐらいstd::cin使えば楽勝だろうから、
サンプルデータとしては適当な人物のものを使っている。
http://codepad.org/Fx7dtDlo

72 :デフォルトの名無しさん:2014/05/22(木) 23:11:03.08 ID:5c02VcX7.net
>>71
まさか答えてくださるとは……涙が出てきました、本当にありがとうございます!!!TT
まだ何もかも初心者で分からないですがあなたのような人を目指して勉強がんばっていきたいですっ!

73 :デフォルトの名無しさん:2014/05/22(木) 23:16:16.25 ID:2g4glAhM.net
>>72
入門書片手にゆっくり学んでいけばいいんじゃないかな

「C++で」と書いてあったからワザとclassとかfriend関数とか使ったけど、
本来なら小細工無しでmain関数だけでも書ける内容だしね……
流石にやりすぎた感が否めない(^_^;)
(そもそも剰余取るならswitch使わず最初からstd::stringの配列として
結果を用意した方が良いと思うけど)

74 :デフォルトの名無しさん:2014/05/23(金) 05:17:43.44 ID:OduXPSlz.net
>>65
vtbl参照するポインタ一つとdeleteする時の参照コストは増えるけど…
ポインタ一つのメモリ量気にする場所でクラス使うなやって感じだし、
パフォーマンス気にする処理の中でnew/delete連発もしちゃ駄目でしょ。

75 :デフォルトの名無しさん:2014/05/23(金) 05:20:51.66 ID:3swX9AII.net
アホか。
泣くなら、こんなことを丸投げにする自分の浅ましさを悔やんで泣け。

76 :デフォルトの名無しさん:2014/05/23(金) 05:37:42.03 ID:eY132h5h.net
x64プログラムのサイズが大きい傾向にあるのは、REXプリフィックスによる物が大半だと思うけど、
ポインタサイズや定数が64bit幅以上の物が多くなっている事もあると思う

それとSSE2〜AVXを使うとアライメントも厳しくしないと速度出ないしな

逆アセンブルリストを見る事は今はほとんどなくなったけど、たまに見るとやたらと長い
CPUのデコーダは大変な仕事をしているんだろうなと思う

77 :デフォルトの名無しさん:2014/05/23(金) 07:12:56.06 ID:qF1hJOqS.net
>>71
オラクルが沢山あって何何だと思ったら、oracleってそういう意味だったのか…

78 :デフォルトの名無しさん:2014/05/23(金) 12:47:11.51 ID:7i/ye9Ui.net
>>77
うん。ぼったくりとかそういう意味

79 :デフォルトの名無しさん:2014/05/24(土) 21:46:37.05 ID:jba60f72.net
>>77,78
ありがとうございます!!
無事動きました。C++勉強中なので大変勉強になりました。
関連してもう一つ教えてください。
教えていただいた方法を、vectorに対して、
vector<string> result = myVect.startWith("ABC");
みたいに自分でstartWith()というメソッドを作りたいのですがC++では
そういうことが出来るのではないかと思っているのですが、
どういうキーワードでググればよいでしょうか?

80 :片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/05/24(土) 22:16:43.35 ID:cV3HOdor.net
それは簡単にはできない。次のように派生クラスを作れば何とかできる。

class MyVector : public vector<string>
{
MyVector(){}
MyVector(const MyVector& v):vector<string>(v){}
MyVector& operator=(const MyVector& v){
this->assign(v);
return *this;
}
~MyVector(){}
vector<string> startWith(const string& str){
...
}
};

81 :デフォルトの名無しさん:2014/05/25(日) 04:47:21.43 ID:Nr3u6HQ6.net
>>80
サンプルありがとうございます。
これを参考に作ってみます。
>それは簡単にはできない。
簡単には出来ないということですが、何か難しい手法を使うと実現できるのでしょうか?
C#だと既存のクラスに拡張メソッドを追加できたので、C++でも出来るのではと思ったのですが。

82 :デフォルトの名無しさん:2014/05/25(日) 11:24:05.95 ID:CXANs0iQ.net
>>81
C#でできることがC++でできるわけでなはい、逆も然り

簡単には追加できないので、ある種のライブラリセットでは、
myVect|startWith("ABC"); みたいな書式で関数を追加する方法を採用している。

なお >>80 で作ったクラスは、vector として使うとスライシングやリークを起こすので、
MyVector というクラスそのものとして使うこと。

83 :デフォルトの名無しさん:2014/05/25(日) 11:29:56.00 ID:J7hNFDCP.net
言語レベルでできるできないというのは、標準装備の記述が使えるか否かだけだろうね。
特にC/C++システム記述用に設計された経緯があるからC++で簡単に「できない」という
のは、かなり危険な知識レベルの表れだね。

84 :デフォルトの名無しさん:2014/05/25(日) 11:35:03.11 ID:JrQwFRNG.net
#include<stdio.h>#include<string.h>#include<stdlib.h>
void f(char*,int);
int main(void){
char hoge[10];
scanf("%9s",hoge);
f( hoge,strlen(hoge) );//文字列と \0を除く文字数
return 0;
}
void f(char* hoge,int len){
char** pp = (char**)malloc(sizeof(char*) *(len+1) );
int i;
char b='\0';
if( *pp == NULL ){
printf("memoryerror");
}else{
*(pp+len)=&b;
for(i=0;i<len;i++){
*(pp+i)=&hoge[i];
}
printf("%s\n",*pp);
}
free(pp);
}

これ学校のサーバ(詳細不明)上gccで実行するとmemoryerror
VisualC++2010Expressで実行すると入力と出力が一致するのですが
こういうことってよくあることなのでしょうか
またメモリ確保できなかった理由わかりますか?

85 :デフォルトの名無しさん:2014/05/25(日) 11:46:43.77 ID:gWmYYtrq.net
そんなわけのわからないのはどうでもいい。
まともに見れるやつに書きなおしたら動くだろ。

86 : ◆QZaw55cn4c :2014/05/25(日) 11:50:15.35 ID:NeNyrW9A.net
>>84
何をやりたいのかよくわからないので形式的な点だけを指摘するのだが

>char** pp = (char**)malloc(sizeof(char*) *(len+1) );
ここでメモリを確保できなかった場合は pp == 0 となるのだから

>if( *pp == NULL ){
ここは pp == NULL となるべき

87 :デフォルトの名無しさん:2014/05/25(日) 12:05:13.32 ID:JrQwFRNG.net
可読性は悪くて申し訳ない
他のコードをコンパクトにしたら意味のないものになってしまいました
>>86 直してみましたが visualC++で思い通り gcc でmemoryerrorです

ポインタの動的配列を作って要素にアクセスしたいのですがあってますか?

88 :デフォルトの名無しさん:2014/05/25(日) 12:10:49.45 ID:EMg57a+q.net
if( pp == NULL )
じゃないのか
*ppに何入ってるかなんてわからんだろ

89 :デフォルトの名無しさん:2014/05/25(日) 12:16:15.52 ID:mGonMRxn.net
>>84をとりあえず清書してみる
http://codepad.org/0LJCCffh

90 :デフォルトの名無しさん:2014/05/25(日) 12:19:00.66 ID:JrQwFRNG.net
申し訳ない!
>>86 >>88 修正でgcc直りました
修正前visualC++ 動いてたのはなぞだが
お騒がせしました

91 :デフォルトの名無しさん:2014/05/25(日) 12:21:02.58 ID:JrQwFRNG.net
codepadいいですね
もうお騒がせしたくないのですが
レベル上がってまともな議論できるようになったらまた来ます

92 :デフォルトの名無しさん:2014/05/25(日) 12:22:00.93 ID:JrQwFRNG.net
visualC++はミスを勝手に補っていたと認識すればいいのかな

93 :デフォルトの名無しさん:2014/05/25(日) 12:24:16.59 ID:EMg57a+q.net
たまたま確保したメモリが0クリアされてただけでしょ

94 :デフォルトの名無しさん:2014/05/25(日) 12:52:26.41 ID:2Bb1jnf+.net
>>76
regexとか

95 :デフォルトの名無しさん:2014/05/25(日) 12:58:54.95 ID:2XYWcL+D.net
>>92
修正前と修正後レスしたらわかるんじゃないかな

96 :デフォルトの名無しさん:2014/05/25(日) 13:14:26.31 ID:vrjD7GQR.net
この手のやつは Debugでは動いたけど Releaseでは動かないというよくある罠

97 :デフォルトの名無しさん:2014/05/25(日) 15:20:30.86 ID:VdGWzfNy.net
>>84
やりたいのはこういうこと?
http://ideone.com/x2YbQK

98 :デフォルトの名無しさん:2014/05/25(日) 18:15:23.75 ID:JrQwFRNG.net
>>97 secretで見れませんね

99 :デフォルトの名無しさん:2014/05/25(日) 18:52:04.50 ID:VdGWzfNy.net
>>98
http://codepad.org/cRoDAq0S
をideoneに貼ったつもりだった。

ideoneのコードがなぜか消えている。。

100 :デフォルトの名無しさん:2014/05/25(日) 19:18:05.82 ID:JrQwFRNG.net
>>99 29行目 hoge[i]は&つけないといけないと思う

101 :デフォルトの名無しさん:2014/05/25(日) 22:28:26.35 ID:VdGWzfNy.net
いや、つけてはいけません。

102 :デフォルトの名無しさん:2014/05/25(日) 22:38:14.80 ID:JrQwFRNG.net
ああ pp宣言*1個になってるし意図が伝わってなかった
ポインタ型の動的配列を作りたかったんです
ポインタの配列なら*p[定数]で済むのに...

103 :デフォルトの名無しさん:2014/05/26(月) 00:14:02.77 ID:1AGAnN0M.net
>>102
> ポインタ型の動的配列を作りたかったんです

なるほど。では>>99はあなたの「やりたいこと」とは違いましたね。失礼

104 :デフォルトの名無しさん:2014/05/26(月) 03:02:25.50 ID:8DsryLB1.net
これこのまんまじゃ期待してる動作してないんじゃないの
結果的に出力が同じになってるだけで、おそらくやらせたいだろうことはしてないぞ

105 :デフォルトの名無しさん:2014/05/26(月) 03:27:06.87 ID:8DsryLB1.net
いや、mainのhoge変数の各要素のポインタが欲しいだけならこれでいいのか
一部期待した動作をしてないであろう箇所があるってのが正しかったな

今のままだと>>89のコードでいう31行目の確認は意味のないコードになってる
正しくは

for( i=0; i < len; ++i )
{
printf( "%c", **(pp+i) ); // もしくはprintf( "%c", *pp[i] );
}
printf( "\n" );
だと思う

あと将来的に関数fを、ppのアドレスを返すように改造する場合は
bが一時オブジェクトだからこのまま返すわけにはいかないんじゃないかな

106 :デフォルトの名無しさん:2014/05/26(月) 03:37:33.44 ID:UJEeKjCa.net
まちがいさがし
http://codepad.org/hGzuz6di

107 :デフォルトの名無しさん:2014/05/26(月) 03:42:29.23 ID:8DsryLB1.net
>>106
これ見て思ったけどfor文++iじゃなくてi++にするべきだったわすまん
突然書く人変わってるって疑われるわ

108 :デフォルトの名無しさん:2014/05/26(月) 03:45:34.13 ID:Pt2kiZ/o.net
ぶっちゃけfor文の中のは大差無いらしいけど俺は前置派>インクリメント

109 :デフォルトの名無しさん:2014/05/26(月) 03:48:06.77 ID:8DsryLB1.net
>>108
今どきのコンパイラならどうせどっちで書いたって最適化してくれるんじゃねって思うしな

110 :デフォルトの名無しさん:2014/05/26(月) 05:14:13.42 ID:UJEeKjCa.net
Cが来た時にC++になるから後ろに置きたい

111 :デフォルトの名無しさん:2014/05/26(月) 07:04:07.96 ID:FZT5gfTQ.net
C++ では後置インクリメントは悪の根源並に嫌われるが

112 :デフォルトの名無しさん:2014/05/26(月) 07:14:41.63 ID:fNjo4Ias.net
前置にしろ後置にしろ
1行にそれしか書かないようにしてる

113 :デフォルトの名無しさん:2014/05/26(月) 10:44:45.62 ID:jXHZxPTV.net
>>111
ポインタとかでない限り問題なかろう

114 :デフォルトの名無しさん:2014/05/26(月) 12:33:31.87 ID:LnM16LwK.net
>>113
クラスだと、前置インクリメントオペレータしか作らないことが多い。
後置だとコピーしないといけないからね。

115 :デフォルトの名無しさん:2014/05/26(月) 16:08:00.12 ID:4UfKpyVP.net
後置インクリメントは副作用でかいよ

116 :デフォルトの名無しさん:2014/05/26(月) 19:31:29.48 ID:BEet9unM.net
助けてください
pathfileexistsを使ってサーバーの共有フォルダ内のファイルの存在をチェックしているんですが、
自分のPCだと問題なくファイルを確認できるのに、ほかのPCに持っていくと
ファイルは存在しているのにfalseが返ってきてしまいます…
パスワードもないしエクスプローラから問題なく見えるのですが何が原因分かりませんか?

117 :デフォルトの名無しさん:2014/05/26(月) 20:15:22.36 ID:fNjo4Ias.net
シェルから辿ってみれば

118 :デフォルトの名無しさん:2014/05/26(月) 21:15:31.18 ID:yHJImmyi.net
当然GetLastErrorは見たのか

119 :デフォルトの名無しさん:2014/05/27(火) 08:10:02.80 ID:VBK+BNJs.net
>>115
副作用がでかい?
用語はちゃんと理解した方がいいぞ。

120 :デフォルトの名無しさん:2014/05/27(火) 08:41:05.45 ID:zuChiLjA.net
>>119
最近聞きかじって使いたくなったんだろ。

121 :デフォルトの名無しさん:2014/05/28(水) 01:39:04.87 ID:1069+ikW.net
static変数をメンバーに持つクラスって
そのクラスを生成しなくても
そのstatic変数はプログラム実行時に生成されるの?

122 :64:2014/05/28(水) 01:45:41.29 ID:1069+ikW.net
>>65
どういうこと?
詳しく説明してほしい

123 :デフォルトの名無しさん:2014/05/28(水) 01:54:43.56 ID:m/PVkgzF.net
FileInfo fi = new FileInfo("ファイルのパス");
fi.Delete ();

StreamWriter sw = fi.AppendText();
sw.Write("テキスト");
sw.Flush();
sw.Close();


このように書いて作成されたファイルの文字コードが、
UTF-8 になってしまいます。

調べたら、そもそも StreamWriter は UTF-8 で書きこむ、とありました。
記録するときのエンコードをシフトjisにするにはどうしたらいいでしょうか。

new するときに文字コードを指定する方法はありましたが、
上記のような流れのときにエンコードを指定する方法がわかりません。

124 :デフォルトの名無しさん:2014/05/28(水) 02:06:07.33 ID:KYfVKk6v.net
>>123
http://dobon.net/vb/dotnet/file/writefile.html

125 :デフォルトの名無しさん:2014/05/28(水) 02:10:40.08 ID:a7wYHcWS.net
>>122
virtualつけると関数コール時に仮想関数テーブル参照することになって遅くなるしインスタンスのサイズも少しでかくなる
10回や100回程度ならそんなにだが1万回呼ぶとかになると結構でかい
詳しく知りたいなら仮想関数テーブルでググればいっぱい出てくるんじゃね

>>123
そもそもFileInfo通す必要あるのか
ファイルのパスが分かってるならそれをもとにStreamWriterを新しく作ればいいと思うんだが
StreamWriter^ writer = gcnew StreamWriter( ファイルパス, true, Encoding);
あとこれ本当にC++/CLIか?gcnewじゃなくてnewなあたりC#くさいんだが

126 :デフォルトの名無しさん:2014/05/28(水) 02:18:23.46 ID:KYfVKk6v.net
>>121
定義した時だね
struct A { static int a; }
なら
int A::a;
とかで定義するのでグローバル変数と同じ扱い

127 :デフォルトの名無しさん:2014/05/28(水) 02:24:40.32 ID:7s/YdHrO.net
>>121
Java ならクラスのstatic な変数は実行時に "自動的に" に生成されるが
C++ はクラス定義とは別にプログラマが自分で実体を定義してやらねばならない = >>126

128 :デフォルトの名無しさん:2014/05/28(水) 03:31:40.55 ID:1yf3kB3k.net
>>122
移転のあおりで消えたレス
> >>65
> vtbl参照するポインタ一つとdeleteする時の参照コストは増えるけど…
> ポインタ一つのメモリ量気にする場所でクラス使うなやって感じだし、
> パフォーマンス気にする処理の中でnew/delete連発もしちゃ駄目でしょ。

>>125
仮想関数テーブルを経由するのはvirtual付いてるメソッドだけだから、
デストラクタだけに付けててそれが乱発されるって設計の時点でパフォーマンスは投げ捨て済み。
あと仮想関数テーブルは同一クラスのインスタンス間で共有してたりするから、
その場合インスタンスあたりのメモリ消費の増加はポインタ1個とかのオーダになる。
これが問題になるケースというのもやはりその時点でパフォーマンスは投げ捨て終わってると思う。

129 :デフォルトの名無しさん:2014/05/28(水) 04:29:03.02 ID:a7wYHcWS.net
>>128
数千単位のデストラクタ呼び出しを毎フレーム乱発することなんてまずないけど
数千を何セットか確保した結果の数万をあるタイミングで一気に解放するってケースは稀ではあるもののなくはないと思うが
そういう時にvirtualしてなきゃ速度をずいぶん改善できることはあるだろ。まあ大抵そもそもテンプレートでの実装とか代替案がでるとは思うが
あと大きくなるってのはまさにそのポインタ1個分だからな。これも圧迫されうるのは積もり積もったときだけで数百程度だったら気にするだけ無駄だが

130 :デフォルトの名無しさん:2014/05/28(水) 04:43:24.82 ID:1yf3kB3k.net
>>129
何処でロスが出るか完全に制御してクラス使う人は「デストラクタ全てvirtual」なんて選択肢は端から無いだろうし、
数万単位の情報を速度重視で扱うなんて状況で1個1個クラスにして欲しくねぇわ…ってのは贅沢な願いなのかな?

131 :デフォルトの名無しさん:2014/05/28(水) 08:37:08.02 ID:m/PVkgzF.net
>>124
それは試しました。
ユニティ上ではエラーなくビルドできるのですが、
StreamWriter sw の部分で何故かこけてしまいます。

ファイルのパスなどは、UTF-8でちゃんと動いているので問題ないかと思ってます。

>>125
確認しました、ご明察のとおり、C++ ではなく C# のようです。
あと、ユニティとアンドロイドで開発してます。

FileInfo をなぜ使っているのか解らないのですが、
124 の方も教えてくれたサンプル通りにやっても実機で動きませんでした。


C# なら、別のスレッドに質問した方がいいですか?

132 :デフォルトの名無しさん:2014/05/28(水) 08:50:12.08 ID:1yf3kB3k.net
C++/CLIですらこのスレでいいのか迷うレベルなのにC#をここで良いかって聞かれてもな…

133 :デフォルトの名無しさん:2014/05/28(水) 10:25:12.68 ID:a7wYHcWS.net
>>130
それだから>>65だろ

134 :デフォルトの名無しさん:2014/05/28(水) 10:38:41.31 ID:36F+cvJj.net
shared_ptrに入れとけばデストラクタがついてるかついてないかなんて関係なくなる

135 :デフォルトの名無しさん:2014/05/28(水) 13:15:04.06 ID:mspF09G9.net
>>131
JavaかVBスレの方がまだマシ

136 :デフォルトの名無しさん:2014/05/29(木) 07:59:14.44 ID:82BFXyhl.net
#pragma once
ってヘッダーの先頭に一回書くだけでいいんですよね?
下に示すような書き方しているのを見たことがあります。
何か意味があるのでしょうか?

-----あるヘッダファイル-----------
#pragma once
class A{
  ...
};
#pragma once

class B{
  ...
};
#pragma once

class C{
  ...
};
#pragma once
...

137 :デフォルトの名無しさん:2014/05/29(木) 07:59:44.46 ID:QaxywJR9.net
ただのアホ

138 :デフォルトの名無しさん:2014/05/29(木) 10:44:05.16 ID:GJ6Azonc.net
バラバラのファイルを連結しただけならギリギリセーフ

139 :デフォルトの名無しさん:2014/05/29(木) 11:52:52.99 ID:hGrR3Csk.net
無意味
知らない人を惑わせたという点で有害

140 :デフォルトの名無しさん:2014/05/29(木) 12:28:05.73 ID:zblOCN9G.net
全クラスのデストラクタに
とりあえず virtual つけとけば問題なくない?
これでエラーが出ることある?

141 :デフォルトの名無しさん:2014/05/29(木) 12:38:42.20 ID:QaxywJR9.net
付けるのは多態性を使うクラスだけで十分

142 :デフォルトの名無しさん:2014/05/29(木) 13:14:28.94 ID:hGrR3Csk.net
無駄につけると遅くなるから嫌われる
個人製作に限るならあえて止める理由はない

143 :デフォルトの名無しさん:2014/05/29(木) 14:35:59.19 ID:GJ6Azonc.net
嫌われるけど、デストラクタをvirtualにして明らかに遅くなるようなケースはあんまりない気が
それで遅くなるような状態ならどうせそれ以外にも遅くなる要因が山ほどあるだろうし

144 :121:2014/05/29(木) 15:52:06.88 ID:zblOCN9G.net
static変数をメンバーに持つクラスを解放したら
static変数でも解放されて使えなくなるよね?

145 :デフォルトの名無しさん:2014/05/29(木) 16:01:21.88 ID:EFZu1tJU.net
クラスの解放って?

146 :デフォルトの名無しさん:2014/05/29(木) 16:12:04.91 ID:hGrR3Csk.net
>>126 を受けてなおそんな世迷言を

147 :デフォルトの名無しさん:2014/05/29(木) 16:55:56.41 ID:ZPfW7Hu7.net
staticメンバーのコンストラクタはプログラム開始時に呼ばれる。
staticメンバーのデストラクタはプログラム終了時にatexitみたいな仕掛けで呼ばれる。

148 :121:2014/05/29(木) 18:00:10.69 ID:zblOCN9G.net
class Ctest
{
public:
static int abc;
};


このCtestを動的に生成した場合
変数 abc は static だからグローバルになり
生成したCtestが解放された時に abc も解放されて使えなくなる?

149 :デフォルトの名無しさん:2014/05/29(木) 18:52:26.84 ID:zEmhoXcP.net
んなわけない
abcはCtestのインスタンスと無関係

150 :デフォルトの名無しさん:2014/05/29(木) 22:26:40.17 ID:lsho9ypK.net
使えなくなったらstaticにした意味ないしね・_・

151 :デフォルトの名無しさん:2014/05/30(金) 00:38:38.09 ID:iU8Ve7Yv.net
>>148
>>127

class Ctest
{
public:
static int abc;
};
だけでなく、
int Ctest::abc;
をC++ならば必ずどこかに書く
これはグローバル変数だから Ctest::abc は解放されることはない

実際の使用例
http://peace.2ch.net/test/read.cgi/tech/1313183984/449

152 :デフォルトの名無しさん:2014/05/30(金) 04:22:02.59 ID:p0YChy7B.net
超初心者の質問で申し訳ありません。
forを使って1^m+2^m+3^m+......+n^mを求めたいんですがこれのどの部分に問題がありますか?
ご教授お願いします。
http://codepad.org/ZibSLvWH

153 :デフォルトの名無しさん:2014/05/30(金) 04:44:42.16 ID:nHre9iMg.net
>どの部分に問題がありますか?
あんたの頭。
変数mの振る舞いに注意。

154 :デフォルトの名無しさん:2014/05/30(金) 09:01:09.24 ID:/LPGh+78.net
簡単にオーバーフローしそうな計算式だな

155 :デフォルトの名無しさん:2014/05/30(金) 14:52:39.25 ID:tQtZpcuA.net
>>152
http://ideone.com/Elx3J3

156 :148:2014/05/30(金) 15:37:30.61 ID:9ztPnSR9.net
///// test.h /////

class Ctest
{
public:
static int abc;
};

///// test.cpp /////

int Ctest::abc = 100;


staticメンバーの変数はこういうことで
Ctestクラスの生成、解放関係なしに
プロプラム実行時から終了時までグローバルで使えるってことでOK?

157 :デフォルトの名無しさん:2014/05/30(金) 16:32:06.84 ID:lPnoVdIE.net
ただのグローバル変数と同じ

158 :デフォルトの名無しさん:2014/05/30(金) 18:23:18.60 ID:VP4sRqxG.net
スコープはあるだろ

159 :デフォルトの名無しさん:2014/05/30(金) 21:38:27.59 ID:I46UGUDy.net
static変数abcがあるのにそのクラスをdeleteした場合
new Ctest
delete Ctest
ここでどうやって使うん

160 :デフォルトの名無しさん:2014/05/30(金) 21:43:22.93 ID:BLHBUUhB.net
日本語でおk

161 :デフォルトの名無しさん:2014/05/30(金) 21:44:38.26 ID:2FpmCful.net
Ctest::abc

162 :デフォルトの名無しさん:2014/05/30(金) 22:20:18.99 ID:I46UGUDy.net
deleteした後にどうやって使うん
Ctestはもう死んでるやん?

163 :デフォルトの名無しさん:2014/05/30(金) 22:27:13.46 ID:BLHBUUhB.net
static変数はインスタンスと無関係だと言っただろ

164 :デフォルトの名無しさん:2014/05/31(土) 06:08:17.29 ID:DtdLdmhz.net
多分クラスとインスタンスの区別が付いてない人だろう

165 :デフォルトの名無しさん:2014/05/31(土) 15:40:42.88 ID:6LzyMI+6.net
>delete Ctest

166 :デフォルトの名無しさん:2014/05/31(土) 16:06:10.51 ID:A8nmKroG.net
特定の時間にタスクを実行したのですが
無限ループの中に何か処理を入れるようなものを作るのでしょうか

167 :デフォルトの名無しさん:2014/05/31(土) 17:21:00.95 ID:Udt15ViO.net
>>166
日本語でOK。
環境も合わせて書いとくれ。

168 :デフォルトの名無しさん:2014/05/31(土) 17:43:02.08 ID:zlcjKUg4.net
>>166
タスクって言い方からすると組込か

169 :デフォルトの名無しさん:2014/05/31(土) 17:53:59.88 ID:WaVhhm58.net
C#かもしれん

170 :デフォルトの名無しさん:2014/05/31(土) 17:59:10.71 ID:A8nmKroG.net
設定した時間で実行する処理を作りたいのですが、そういうものを作ったことがありません。

C++MFCのプログラムで無限ループしているところがあります。

ここに時間が来たかどうかの判断を入れるのが普通なのかどうなのかと思いまして

171 :デフォルトの名無しさん:2014/05/31(土) 18:27:46.99 ID:6LzyMI+6.net
つ タスクスケジューラ

172 :デフォルトの名無しさん:2014/05/31(土) 18:41:44.06 ID:zlcjKUg4.net
ある時刻なのか
ある時間経過後なのか

173 :デフォルトの名無しさん:2014/05/31(土) 19:00:40.55 ID:A8nmKroG.net
毎日23:30に実行したいです。

WINAPIのCreateWaitableTimerを使うという記事をネットで見つけましたが
これは使っていいんでしょうか

174 :デフォルトの名無しさん:2014/05/31(土) 20:25:19.56 ID:odnG7Cix.net
>>171 でいいよ

175 :デフォルトの名無しさん:2014/05/31(土) 20:39:16.31 ID:WaVhhm58.net
>>173
夏時間はどうする?

176 :デフォルトの名無しさん:2014/05/31(土) 20:52:34.96 ID:TLo1GTQA.net
なんとなくわかりました
スレッド立てて指定時間まで待機
指定時間を過ぎたら実行
終了時に次の実行時間を指定ですね

177 :デフォルトの名無しさん:2014/05/31(土) 22:53:07.90 ID:Km8CFKFD.net
>ls
a.txt b.txt
>patch <x.patch

>ls
a.txt b.txt c.txt


こんなx.patchって作成できる?

178 :デフォルトの名無しさん:2014/05/31(土) 23:12:31.07 ID:Udt15ViO.net
そりゃ作れるだろ。
例えば、こんなの。
--
#!/bin/sh
touch c.txt
--
こいつをどこか、パスの通るカレント以外の場所に置けばいい。

179 :デフォルトの名無しさん:2014/05/31(土) 23:25:17.31 ID:zlcjKUg4.net
そういう意味じゃないだろ
だったら円周率を10桁まで計算して表示するプログラムは
printf("3.1415926535\n");
でいいのか

180 :デフォルトの名無しさん:2014/05/31(土) 23:37:41.77 ID:Udt15ViO.net
>>179
その例だと、「計算して」の題意を満たしていないな。
せめて、こんなもんだろ。
--
#include <stdio.h>
#include <math.h>
int main()
{
printf("%.10f\n", atan(1) * 4);
return 0;
}

181 :デフォルトの名無しさん:2014/05/31(土) 23:47:30.16 ID:Km8CFKFD.net
diff -uN c.txt.org c.txt >x.patch
たぶんできたわ

182 :デフォルトの名無しさん:2014/06/01(日) 20:21:39.15 ID:EoOyig9q.net
Makefile で、
%.o : %.cpp
(rule)
のように汎用的に書いておき、ある特定のソースコードはコンパイルオプションを変えたい場合
Makefileはどのように書けば良いでしょうか?
上記の記述に加えて、そのソースコードのコンパイルルールを加えただけだと無視されてしまいました。

183 :デフォルトの名無しさん:2014/06/01(日) 23:25:25.96 ID:NTS0Pzbx.net
VC++6.0 で作成したDLLの中身のソースをデバッグしたいんですが、
上手くいきません。

DLLの中の関数呼び出し自体は別プロジェクトでmain作ってDLLインポートして・・
で、出来るんですが。呼び出し先のソースを見れません。何か良い方法は
ないでしょうか?

184 :デフォルトの名無しさん:2014/06/01(日) 23:31:47.86 ID:gjlX7ty8.net
DLLのプロジェクトにデバッグ用メインを登録して、DLLのプロジェクトをRunするです。

185 :デフォルトの名無しさん:2014/06/01(日) 23:32:16.49 ID:+IEDdSur.net
どううまくいかないのか

186 :デフォルトの名無しさん:2014/06/01(日) 23:35:11.99 ID:+IEDdSur.net
main側で目的のファイルを開いてブレークポイント設定(開くだけでプロジェクトへ追加は必要無い)
→mainでデバッグ開始
→mainでLoadLibrary
→DLLの関数を呼び出す
→ブレークポイントで止まる

どこまでやってどうなるのか

187 :デフォルトの名無しさん:2014/06/01(日) 23:37:26.91 ID:NTS0Pzbx.net
>> 184 とりあえずそれで試してみます。どうもありがとうございました(__)

>> 185 DLL内部のソースをSTEP実行できないんです。

188 :デフォルトの名無しさん:2014/06/01(日) 23:51:02.96 ID:Vdytlm3J.net
DLLソースの検索先パスを登録する設定があったはず

189 :デフォルトの名無しさん:2014/06/02(月) 22:59:40.91 ID:9EWfIjsq.net
EXEプロジェクトからでもデバッグできるけどソースパスの問題とかあるので、DLLプロジェクト側から親EXEを指定してデバッグするのが王道

190 :156:2014/06/09(月) 01:16:03.43 ID:YH45DqQS.net
>>156に書いたように
staticメンバーはCtestの生成、解放関係なしにグローバルで使えて
static以外のメンバーは、普段通りCtestを生成すると使える
ってことで良いんだよね?

191 :デフォルトの名無しさん:2014/06/09(月) 14:31:57.02 ID:CV1N0NlN.net
テンプレートのファンクタの動的なバージョンが
std::functionという理解であってますか?

192 :デフォルトの名無しさん:2014/06/09(月) 22:14:19.25 ID:2baEZhQu.net
>>190
「グローバルで使える」ってのが微妙だが、その通りです
記憶クラス的に

>>191
ちょっと捉え方が間違ってるような

テンプレートで指定した戻り値、シグネチャで呼び
出せるのものであれば、なんでも入れられるのがfunction
静的な関数、関数オブジェクトが該当する

ラムダもコンパイル時に関数オブジェクトを生成ので同じように使える
インスタンス関数の場合、mem_fn+bindで、関数オブジェクト化、
インスタンスへの参照固定で入れられる

193 :デフォルトの名無しさん:2014/06/09(月) 22:48:16.12 ID:2baEZhQu.net
Cで型の問題は厄介だよね
これがあるから安全で生産性も高くなるんだろうけど、
ちょっとでも違えば許してもらえない

たとえばObserverパターンとかで、コールバックを登録したいとする
ここでも型が問題になる
functionは型を消してしまえるんだな
ただし若干、オーバーヘッドがある

単純に関数に渡すファンクタが必要なのであれば、ラムダで
書いた方がよい
高速です

194 :デフォルトの名無しさん:2014/06/10(火) 18:33:14.20 ID:ExSiC/cX.net
複数のファイルが圧縮されているZIPファイルを解凍せずに、
その中身の特定のファイルを指定して読み出したり、あるいは、
その特定のファイルを上書きしてZIPファイルを書き換えたり
したいのですが、どうすれば出来ますか?

195 :デフォルトの名無しさん:2014/06/10(火) 18:38:38.30 ID:hzZkSFog.net
そういうプログラムを書けばできるんじゃないですか

196 :デフォルトの名無しさん:2014/06/10(火) 20:09:14.96 ID:nP1d3r8O.net
1/2000000と1/1999999を区別比較できるような型はありませんよね 実装案とかいただけませんか?
D/T(1<=T<=2百万,1<=D<=100)を何個か比較演算したいです

197 :デフォルトの名無しさん:2014/06/10(火) 20:43:52.27 ID:Q6yCJgce.net
有理数型を作りゃいいじゃん

198 :デフォルトの名無しさん:2014/06/10(火) 20:59:52.84 ID:p3jSqJSc.net
>>196
文字列なら簡単だ。

199 :デフォルトの名無しさん:2014/06/10(火) 21:03:49.73 ID:hzZkSFog.net
std::ratioとか

200 :デフォルトの名無しさん:2014/06/10(火) 21:14:10.96 ID:nP1d3r8O.net
>>197-199 ありがとうございます! >>199が手軽でよさそうですね

201 :デフォルトの名無しさん:2014/06/10(火) 23:00:55.72 ID:nP1d3r8O.net
先程よりもレベルの低い質問なのですがratio配列は作れるのでしょうか

202 :デフォルトの名無しさん:2014/06/10(火) 23:06:04.53 ID:hzZkSFog.net
boost::rationalなら

203 :デフォルトの名無しさん:2014/06/10(火) 23:11:03.68 ID:nP1d3r8O.net
あー残念ながらboostは使えない環境なのです 前もって書き忘れてました

204 :デフォルトの名無しさん:2014/06/10(火) 23:15:13.67 ID:j8iOZPUp.net
>>203
自分で作りなよ、ゆー

205 :デフォルトの名無しさん:2014/06/12(木) 19:54:09.97 ID:ZrIHv0PN.net
>>197 >>204 気長に作ってみますありがとうございます

http://codepad.org/ZTZs3nU4
POJなんですけど このコードがg++だと通ってc++だとコンパイルエラーでます
g++ってどんな補完あるんでしょうか

206 :デフォルトの名無しさん:2014/06/13(金) 23:22:35.20 ID:OcgplV8Y.net
>>205 解決しました ありがとうございます
sqrt()の中身int型整数を少数型にキャストしなければならないようで

207 :デフォルトの名無しさん:2014/06/14(土) 00:31:06.98 ID:bcTe5xiu.net
わからない、、オブジェクト指向とクラスがわからない、、、、
例えば、、、四角形を親とするクラスがあってその子どもが長方形と台形を持つとします。
四角形
メンバ変数
上辺、下辺、左辺、右辺、角度
機能
面積計算
周りの長さ計算
対角線を計算
台形のメンバ変数、高さ:長方形のメンバ変数なし、機能:面積計算
台形のコンストラクタで四角形
のメンバ変数を初期化?する、四角形の機能で計算、、四角形で辺だけをreturnする関数
を作り、台形の面積計算に必要な辺をうけとる
その後また長方形のコンストラクタで四角形を初期化?
こんな感じの考え方でよいのでしょうか、、、

もう自分で書いてて意味わからないのですが、エスパーの方教えてください。
もしくは四角形継承台形長方形、長方形の継承正方形のプログラムを教えてください。


main


コンストラクタで
長方形(double 辺、double 辺、、、):四角形(辺、辺){}
といった書き方でよいのでしょうか

208 :デフォルトの名無しさん:2014/06/14(土) 10:28:53.72 ID:h7hlzhCn.net
>>206
>少数型
そんなもの(二重の意味で)ない。

209 :デフォルトの名無しさん:2014/06/14(土) 10:46:35.46 ID:ghLFWdur.net
>>208 私の拙い頭では 二重のというのが理解しかねます 浮動小数点型等言葉の定義の問題でしょうか

210 :デフォルトの名無しさん:2014/06/14(土) 12:04:18.29 ID:vn/Wi9/b.net
固定小数点ってのがあるから浮動を省略しちゃいかんのと
少と小

この二点じゃないかなぁたぶん

211 :デフォルトの名無しさん:2014/06/14(土) 12:47:48.04 ID:9xl6N+lz.net
>>208
クラスはCの構造体に次の二つの性質を追加した新しいデータ型
・ メンバー変数のアクセス制御できる
・ メンバーとして変数の他に関数も持つことが出来る
基本、メンバー変数はメソッド(関数)を通じてのみアクセスして、呼び出し側が意識する必要がないように
するのがオブジェクト指向…というかカプセル化かな?

基底クラス(親クラス)をベースにして、メンバー変数・関数を追加して新しいクラス(子クラス)を定義するのが継承

四角形・台形の比喩は‥ ごめん、わからん

212 :デフォルトの名無しさん:2014/06/14(土) 12:52:23.31 ID:7sAVuJQO.net
>>207
図形なら、まずは、大きさと描画関数だけあればいいんじゃね
オブジェクトをどう利用したいのかによって、完成形は異なるんだから、
まずは「拡張できる」ように作ることを考える

ゲームを想定して、図形がキャラクタだと思って全体を構成してみたら?

なお、オブジェクト指向なんて、その方が使いやすい場面で使えば十分だ
無理に教科書的な例から学ばなくても、現実ではよく出会う

213 :デフォルトの名無しさん:2014/06/14(土) 13:18:44.42 ID:9xl6N+lz.net
継承の例

たとえば、すべての【人間】に共通で、最低限の情報は「名前」「年齢」「性別」くらい?かな
これらをメンバー変数に、変数をR/Wする関数をメンバー関数として(人間)クラスが定義できますよね

新しく【学生】を定義する必要があるとして
一から作ってもいいけど、せっかく(人間)クラスがあるんだから、これに必要な情報(変数)やメソッド(関数)を追加してやれば手抜きできると‥
(人間)クラスに、たとえば「学校名」「学部」「学科」「学年」「学位」を示す変数と、これらにR/Wするメンバー関数を追加してやれば
(学生)クラスが定義できるわけです
【学生】も【人間】だから、人間の属性を継承するということ

わかりにくかったらすまん

214 :デフォルトの名無しさん:2014/06/14(土) 13:28:08.28 ID:BuWNtkHZ.net
>>213
人間クラス専用のファイルがあったとする
人間クラスに学生情報を追加した学生クラスにしたとする

別の機会に人間クラスに人種情報を追加して人種クラスを作成する必要が出たとする
この時既に人間クラスは学生クラスに置き換わってる

こんな衝突を経験して頭がおかしくなる

215 :デフォルトの名無しさん:2014/06/14(土) 13:31:24.42 ID:RWrtwXRC.net
>>208
SQL-Server の smallint 型とか (w

216 :デフォルトの名無しさん:2014/06/14(土) 13:57:40.90 ID:hFdfnZbt.net
学生とか犬猫とかでオブジェクト指向を分かった気になってはいけない(戒め)

217 :デフォルトの名無しさん:2014/06/15(日) 00:26:42.99 ID:T2fwcVku.net
>>210 誤字気づきませんでしたthx

218 :デフォルトの名無しさん:2014/06/16(月) 15:25:13.12 ID:kM7IOeM2.net
char a[4] = "ABC";
char *b = a;

プログラムの一部に↑というのがありました。
先頭のアドレスを*bに代入?とよく分からなかったのですが、

char *b;
b=a;

としても同じ結果になって、省略できるのかな?と思いました。

他のサイトでは、
char *b="ABC";みたいな記述もあったような。

char *b;
b="ABC";
で、文字列の先頭のアドレスをbに代入してるということでしょうか?

219 :デフォルトの名無しさん:2014/06/16(月) 15:30:51.00 ID:H3LgDS+r.net
char *b = a;と

char *b;
b = a;はやってる事は一緒

char *b = "ABC";はできるが

char *b;
b = "ABC";はできない

220 :デフォルトの名無しさん:2014/06/16(月) 15:36:17.89 ID:kM7IOeM2.net
>>219
ありがとうございます。
今書いてて、エラーは出ずに実行できたのですが、
書式は間違ってる(サポートされてない)ということでしょうか。

#include <stdio.h>
int main(){
char *b;
b="ABC";
printf("%s %s\n",&b[0],b); //どちらも先頭のアドレスを渡して文字列を表示

printf("%c %c %c %c\n",*b,b[0],b[1],b[2]); //*bに%sではエラー。*bとb[0]はどちらも1文字目を表示。

printf("%p %p %p %p %p\n",b,b+1,b+2,b+3,b+4); //アドレスに配列が格納されていない部分も表示できる。
return (0);
}

221 :デフォルトの名無しさん:2014/06/16(月) 15:41:16.55 ID:kM7IOeM2.net
http://homepage1.nifty.com/toshio-k/prog/c/string.html
ちなみにここでした。
>char *s;
>s = "ABC";
一応サポートはされているんですかね。

222 :デフォルトの名無しさん:2014/06/16(月) 15:48:06.37 ID:wXHrgiMz.net
>>220-221
もうやめて、>>219のライフはゼロよ

223 :デフォルトの名無しさん:2014/06/16(月) 21:22:50.87 ID:9t16BPS6.net
>>207
もうおらんかな?
エスパーでない初学者ですが、自分の練習も兼ねて書いてみました。
メンバ変数を辺で持ったり、対角線を求めるのは出来なかったので
頂点座標を使って面積と周囲長だけ適当に書いてます。
http://codepad.org/mykX2VDE
余計かもだけど親クラスを四角形クラスにしない場合も貼っときます。
http://codepad.org/lm2cxeEM
これだと座標データは派生クラスで持つ必要があるけど、丸や三角形でも
扱えるから使い方によっては楽かも。

224 :デフォルトの名無しさん:2014/06/16(月) 23:07:32.01 ID:FBqd5r20.net
>>223
なるほど、ありがとうございます

225 :デフォルトの名無しさん:2014/06/16(月) 23:24:56.12 ID:FBqd5r20.net
>>223
なるほど、ありがとうございます

仮想関数について
http://codepad.org/IDh8dIdP
これなのですが上の派生クラスSUPERのポインタを宣言とありますが、TEST
とかいてあるのでTESTのポインタではないのですか??
また、下のほうの
test[0] = new TEST;
test[1] = new SUPER;
はオブジェクト的にはどっちのオブジェクトになっているのでしょうか?
私の考えは、両方TEST型で
test[1] = new SUPER;
は派生も入っているので基底クラスに行った後virtual関数が基底の
をオーバイライド?したのだと思っています。この考え方でよいのでしょうか

226 :デフォルトの名無しさん:2014/06/17(火) 00:06:29.07 ID:x7Tm4gn4.net
>>225
virtual関数をメンバーに持つクラスは、仮想テーブルが作られる
virtual関数と同型と見なせる関数を派生クラスで定義するのが、オーバーライド

オブジェクトは、new した方の型だから、test[1] は SUPER
ポインタや参照経由で TEST クラスへのアクセスする場合、
仮想テーブルを辿って本来の型SUPERの関数を呼び出すようになっている

227 :デフォルトの名無しさん:2014/06/17(火) 02:48:13.60 ID:jLYVWX8U.net
>>225
コメントは基底クラスTESTだと思います。
オブジェクトの型については>>226が書かれたようにnewした方の型なので
・test[0] : TEST型
・test[1] : SUPER型の内、TEST型で定義の範囲だけ
をポインタから扱えるのだと思います。
TEST型なのにSUPER型の関数が呼ばれるのは仮想関数テーブル(VMT)の為で、
virtual がつくとoutput関数はVMTを介して呼び出されるので
・TESTクラスのコンストラクタ実行時->VMTにはTEST::output()へのアドレス
・SUPERクラスのコンストラクタ実行時->VMTにはSUPER::output()へのアドレス
へ書き換えられた為だと思います。
http://codepad.org/CKXyaOCe
自分の解釈だけで書いたので、詳しい方、訂正お願いします。

228 :デフォルトの名無しさん:2014/06/17(火) 04:16:51.11 ID:v9u3KVJs.net
super と test のネーミングが真逆だよ‥
http://codepad.org/I8IPVZCh

229 :227:2014/06/17(火) 08:50:38.31 ID:jLYVWX8U.net
>>228
あ、ほんとだ。言われるまで気づきませんでした。
ありがとうごさいます。

230 :デフォルトの名無しさん:2014/06/17(火) 17:18:19.72 ID:zLfMxzQt.net
printf("%*s", 3 * (i - 1) + 5, "");

参考書に↑のようなprintf文が載ってました
%*sってどういう意味ですか?
また、3 * (i - 1) + 5で計算してる理由って何ですか?
iはint型変数です

231 :デフォルトの名無しさん:2014/06/17(火) 17:35:18.74 ID:LnB6vTqT.net
iが1とする
3 * (1 - 1) + 5 = 5
printf("%5s", "");になる

*に計算結果が入る

232 :デフォルトの名無しさん:2014/06/17(火) 17:45:36.12 ID:zLfMxzQt.net
ありがとうございます
理解できました

233 :デフォルトの名無しさん:2014/06/17(火) 22:10:15.29 ID:uAI2OXqB.net
MSXMLが使いこなせません><
IXMLDOMDocument2Ptr で CreateInstanceを呼び出してもfailしてしまいます><
助けてください… ソースは↓みたうな感じです
#include <stdio.h>
#include "stdafx.h"
#include <afxdisp.h>
#import "MSXML6.dll" rename_namespace(_T("MSXML"))
#include <msxml6.h>
#include <iostream>
#include <sstream>
#include <fstream>
// 共通プロパティ 全般 共通DLLでMFCを使う
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
AfxOleInit()
//Create the XML
MSXML::IXMLDOMDocument2Ptr pXMLDoc;
HRESULT hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument60));
if(FAILED(hr))
{
AfxMessageBox(_T("Failed to create the XML class instance")); //これが呼び出される
return 0;
}
return 0;}

234 :デフォルトの名無しさん:2014/06/17(火) 23:37:15.63 ID:UREG7bnw.net
×__uuidof(DOMDocument60)
○MSXML::CLSID_DOMDocument

235 :デフォルトの名無しさん:2014/06/17(火) 23:47:33.92 ID:ZnAix8mp.net
GCC 4.4.7

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>

typedef base64_from_binary<transform_width<std::vector<unsigned char>::const_iterator,6,8> > base64_text;

「virtual memory exhausted: メモリを確保できません」ってでるんだけど、なんで?

236 :デフォルトの名無しさん:2014/06/17(火) 23:59:29.90 ID:MCvb+eCN.net
c++初心者です。
読んで勉強になる、ライブラリ以外のソースコードが知りたいのですが、何かオススメはあるでしょうか?
できれば比較的最近のもので、コンパクトだとありがたいです。

237 :デフォルトの名無しさん:2014/06/18(水) 02:50:39.05 ID:OD7nApX3.net
>>234
コンパイルエラーで弾かれてしまいます…

>エラー 1 error C2039: 'CLSID_DOMDocument' : 'MSXML' のメンバーではありません。 d:\cloud\bp\xmltest\xmltest\xmltest.cpp 37 1 xmltest

238 :デフォルトの名無しさん:2014/06/18(水) 12:33:25.00 ID:/jpL5mxU.net
目から鱗
ttp://faithandbrave.hateblo.jp/entry/2014/06/16/155156

239 :デフォルトの名無しさん:2014/06/18(水) 14:40:05.21 ID:2sj5eCvL.net
C#とC++を両方やっていると、やっぱりC#のほうが、
作業効率が良いように感じるんですが、みなさんどうですか?

240 :デフォルトの名無しさん:2014/06/18(水) 16:19:47.82 ID:LAmx7968.net
>>238
面白いけど、実務では
switch (something) {
case FOO: x = 1; break;
case BAR: x = 2; break;
default: x = 3; break;
}
と書いて欲しい

241 :デフォルトの名無しさん:2014/06/18(水) 16:40:59.04 ID:c0sLB5UF.net
>>238
その鱗ははめたままにしておきなされ

242 :デフォルトの名無しさん:2014/06/18(水) 18:12:14.70 ID:EaENCaWf.net
multi_arrayはbool型に使えますか?

243 :デフォルトの名無しさん:2014/06/18(水) 22:51:57.76 ID:b95ka0Af.net
よくC++はCの上位互換て書いてあるけど、たまにCの方が使いやすいって言うけど結局どっち?

244 :デフォルトの名無しさん:2014/06/18(水) 22:54:18.49 ID:pJdwjV3r.net
慣れ

245 :デフォルトの名無しさん:2014/06/18(水) 23:03:22.67 ID:cO7v6OhK.net
Cのやり方でやるならCの方が使い易い
C++のやり方でやるならC++の方が使い易い

246 :デフォルトの名無しさん:2014/06/18(水) 23:07:29.00 ID:Uko284+o.net
>>243
上位互換だからって使いやすいとは限らないだろ?

247 :デフォルトの名無しさん:2014/06/19(木) 07:57:19.73 ID:s8Zw40ia.net
今から勉強するやつはCやんないでC++やればいいの?

248 :デフォルトの名無しさん:2014/06/19(木) 08:13:27.08 ID:nGqFEu9y.net
>>247
C++言語の設計者は、C++をシステム言語(OS、共通ライブラリなど)向けとして作ったと言ってる。
つまりそれ以外の用途だと、Cより苦労する。
まあ大抵の個人・組織は何故かシステムレベルの車輪の再発明からやってるんで、Cを使って更に苦労する訳だが。

249 :デフォルトの名無しさん:2014/06/19(木) 10:06:54.74 ID:uVoak4lN.net
すみません
CはC++のサブセットだと思ってました
規格の改訂世代にもよるかと思いますが、C++にはなくてCに存在する仕様(機能)って例えば何がありましたっけ?

250 :デフォルトの名無しさん:2014/06/19(木) 12:51:00.94 ID:gmSqBbFa.net
可変長配列。

251 :デフォルトの名無しさん:2014/06/19(木) 14:15:33.09 ID:uVoak4lN.net
なるほど。std::vectorよりも簡単そうですよね。

252 :デフォルトの名無しさん:2014/06/19(木) 16:30:13.57 ID:ANGbOwOf.net
ゲームだとC++で組んでもC++的な機能は使われないな

253 :デフォルトの名無しさん:2014/06/19(木) 17:24:03.27 ID:SJ+Smgsh.net
多態性とか使うだろ?

254 :デフォルトの名無しさん:2014/06/19(木) 17:33:00.68 ID:Brdb8B0I.net
登場キャラをclassで実装すると固有/共有の属性の扱いがとてもラクになると思うが

255 :デフォルトの名無しさん:2014/06/21(土) 15:34:10.84 ID:KMvjaKi+.net
>>239
ちょっとしたものなら C# の方が楽と感じるけど、それなりの規模だとあまり変わらないかな

256 :デフォルトの名無しさん:2014/06/21(土) 16:50:10.62 ID:+tlHdBiN.net
>>253-254
そんな、凝ったの書かしてもらってない。そう言えば自分のではC++機能使いまくりだった

257 :デフォルトの名無しさん:2014/06/22(日) 03:46:49.39 ID:n/T6EZNW.net
それなりの規模だとコンパイルが遅いんじゃクソボケェ・・・ってなるんじゃないの

258 :デフォルトの名無しさん:2014/06/22(日) 12:07:54.36 ID:fKkjonsJ.net
ぴんぴんぷるぷるぴんぷるぷる
テンプレートは遅いね・_・

259 :デフォルトの名無しさん:2014/06/28(土) 12:52:17.26 ID:Z5Hu91SB.net
thisの値はオブジェクトが作られて無くなるまで変わりませんよね?

260 :デフォルトの名無しさん:2014/06/28(土) 23:53:51.23 ID:E/3TLq27.net
>>259
変わらない

261 :デフォルトの名無しさん:2014/06/29(日) 08:55:20.94 ID:KFRMJvcV.net
>>259
変わらないシステムが圧倒的に多いだろうね。
但し、変わった事でプログラムの動作に支障が出るようなら、それはプログラムの
作りがおかしいという事である。

262 :デフォルトの名無しさん:2014/06/29(日) 12:23:59.35 ID:XFCViuqu.net
ありがとうございます

263 :デフォルトの名無しさん:2014/06/29(日) 12:38:08.93 ID:K5dqtKQ7.net
マルチだとどっちに解答すりゃいいんだか

264 :デフォルトの名無しさん:2014/06/29(日) 12:51:05.82 ID:KFRMJvcV.net
>>263
全部に
マルチすんな!ヴォケ!
とレスするのが2chの作法、K&Rに書いてある。

265 :デフォルトの名無しさん:2014/06/29(日) 12:56:09.95 ID:d4tnsDO5.net
>>261
> 変わらないシステムが圧倒的に多いだろうね。

変わるシステムなんてあるの?
そのオブジェクト参照されてる場合、勝手に変わられると困ると思うが。

266 :デフォルトの名無しさん:2014/06/29(日) 13:20:20.11 ID:XFCViuqu.net
変わるとマジで困るんで、
変わらない証拠おしえてください。

267 :デフォルトの名無しさん:2014/06/29(日) 13:49:04.09 ID:kMofjRV8.net
>>266
文脈では仕様の話なんだが?

268 :デフォルトの名無しさん:2014/06/29(日) 14:10:16.72 ID:XFCViuqu.net
仕様として変わってもいいという風にC++の仕様書には書いてあるということか?

269 :デフォルトの名無しさん:2014/06/29(日) 21:44:12.38 ID:vXcDBpcb.net
マジレスして損した。

270 :デフォルトの名無しさん:2014/06/29(日) 22:32:21.70 ID:KFRMJvcV.net
>>265
winのAPIにもあるGlobalLockやGlobalUnlockは、そういう用途に使ってたよ。
今はheapを使うのが普通だけど別にオブジェクトをここに作る事が絶対禁止な
訳じゃない、まあオブジェクトの参照をどう保持するかの問題だな。

システムというかCPUが不自由だとメモリの仮想化が不十分でプログラムが
「実行中に何度も別のアドレスに勝手にリロケートされる」なんてことも起こり
得たんだよ。

271 :デフォルトの名無しさん:2014/06/29(日) 22:44:24.39 ID:Hir1ALDw.net
GCを使うと、thisも変わるんじゃね?

272 :デフォルトの名無しさん:2014/06/30(月) 07:16:38.00 ID:RRSpyW++.net
>>270
GlobalAlloc とかのだとアクセスはメモリーハンドル使う訳で、普通の heap と違うでしょ?
そんなもんどや顔で出されても困るわ (w

273 :デフォルトの名無しさん:2014/06/30(月) 16:39:38.34 ID:OoeeUvmn.net
顔が見えるのか

274 :デフォルトの名無しさん:2014/06/30(月) 19:51:06.53 ID:K5zrSJWB.net
>>272
君は理解の仕方が中途半端だね。
> アクセスはメモリーハンドル使う
真っ赤な嘘を広めてはいけない。
アクセスする為のポインタを得る為にメモリーハンドルを使うんだ。
君のようにメモリーハンドルでアクセスしたら例外で吹っ飛ぶよ?

275 :デフォルトの名無しさん:2014/06/30(月) 20:32:11.67 ID:S8arh0g0.net
>>274
そんな当たり前の事を知らないなかとでも言うように説明する人が居るとはな

276 :デフォルトの名無しさん:2014/06/30(月) 21:32:07.01 ID:K5zrSJWB.net
よかったな、一つ賢くなったじゃないか

277 :デフォルトの名無しさん:2014/07/01(火) 02:31:23.23 ID:aHhEQ2XO.net
>>1
VS2010で int が long int と同じになってた。

278 :デフォルトの名無しさん:2014/07/01(火) 07:13:49.59 ID:uMb52dFR.net
>>274
ハンドルとポインタの区別もつかんのか (w

279 :デフォルトの名無しさん:2014/07/03(木) 23:02:29.48 ID:2beLGnBn.net
最近、プログラマの仕事ってマーシャリングばっかりだな…
そうでないのは力仕事だし

(ネイティブに限る)コンパイラって何なんだろうって思う

280 :デフォルトの名無しさん:2014/07/08(火) 21:18:40.46 ID:JvR/NBCs.net
C言語からC++にステップアップしようかと思うんだけど
最新のC++11まで含めて浅くでいいから広範囲に扱ってるサイトとかないかな

281 :デフォルトの名無しさん:2014/07/08(火) 23:26:58.23 ID:KPHElX/P.net
>>280
cplusplus.com

282 :デフォルトの名無しさん:2014/07/09(水) 03:19:15.41 ID:oP2kEIS8.net
>>281
ありがとう。一瞬躊躇してしまったが比較的平易な英語で書かれていて
これなら翻訳サイトと併せてなんとか読めそうなのでがんばってみる

283 :デフォルトの名無しさん:2014/07/09(水) 08:23:29.93 ID:QPl72qxT.net
いちいち翻訳通すくらいなら日本語のリファレンス本買った方がいいよ
英語サイトへ行くのはその次だ

284 :デフォルトの名無しさん:2014/07/09(水) 14:41:27.65 ID:eczUeSs+.net
全角文字のアルファベットをtoupper()したいのですが、
標準関数でそういうの無いですか?

285 :デフォルトの名無しさん:2014/07/09(水) 15:30:20.52 ID:aj4O2jpl.net
>>284
先ず始めにお聞きしたいのですが、お使いの言語は何でしょうか。
Cでしたら、ありません。

286 :デフォルトの名無しさん:2014/07/09(水) 16:32:23.48 ID:sSBu2vKy.net
>>282-283
つttps://sites.google.com/site/cpprefjp/

287 :デフォルトの名無しさん:2014/07/09(水) 21:05:24.47 ID:lRyDFvzO.net
CでS-JISなら
http://www.ncad.co.jp/~komata/c-kouza23.htm
などを参考にしてみるとか

288 :デフォルトの名無しさん:2014/07/09(水) 21:56:20.52 ID:75kwCoC7.net
http://codepad.org/JuKVmyrc
このコードを3つに分けてコンパイルすると メンバ関数未定義とコンパイルエラーでます
ggった通りにインクルードしてると思うのですがなにを間違えているのでしょうか
アドバイス頂けませんか

289 :デフォルトの名無しさん:2014/07/09(水) 22:08:53.21 ID:nVe34nkn.net
rational.cppがリンクされてないんだろう
使ってるコンパイラとエラーの内容がないから何とも言えん

290 :デフォルトの名無しさん:2014/07/09(水) 23:12:26.78 ID:75kwCoC7.net
>>289 リンクを頼りにggったら出てきましたありがとうございます
結構な時間ggってるのに見つけられない情弱さ嫌になるね

291 :デフォルトの名無しさん:2014/07/10(木) 14:11:27.79 ID:YR8w5b7e.net
string array[] = { "abc", "edfg", "AB" };
みたいに初期値を代入した配列の要素数3を
求める方法ありますか?

292 :デフォルトの名無しさん:2014/07/10(木) 14:47:40.07 ID:+wVx4yYh.net
>>291

sizeof(array) / sizeof(* array)

293 :デフォルトの名無しさん:2014/07/10(木) 14:53:22.59 ID:YR8w5b7e.net
>292
ありがとうございました。

294 :デフォルトの名無しさん:2014/07/10(木) 16:28:49.65 ID:TeSkcnCY.net
_countof()

295 :デフォルトの名無しさん:2014/07/12(土) 22:48:46.26 ID:MTjCae/M.net
ネットで、以下のようなマクロ見たんですが
#ifdef NDEBUG
#define dbgprintf 1 ? (void)0 : (void) //(1)
#else // #ifdef NDEBUG
#define dbgprintf printf
#endif // #ifdef NDEBUG
よくわかりません。(1)の行はNDEBUGの時に出力しないようにしているようですが、
#define dbgprintf
としても同じじゃないですか?(1)の意味を教えて下さい。

296 :デフォルトの名無しさん:2014/07/12(土) 22:58:05.24 ID:m5S9HQxE.net
それだと
dbgprintf("%d", func());

("%d", func());
になってしまう

297 :デフォルトの名無しさん:2014/07/12(土) 22:59:07.97 ID:wXyVo6GR.net
条件 ? 真の時 : 偽の時

298 :デフォルトの名無しさん:2014/07/12(土) 22:59:49.53 ID:wXyVo6GR.net
くあしくはサンコン演算子かなんかでggrks

299 :デフォルトの名無しさん:2014/07/12(土) 23:14:44.12 ID:MTjCae/M.net
Visual Studioならビルドも実行も問題なくできるですが。

300 :デフォルトの名無しさん:2014/07/12(土) 23:57:52.87 ID:NSx3oKmy.net
その例だとfunc()が呼ばれちゃうだろ。それも含めて、無害化したいんだろ。

301 :デフォルトの名無しさん:2014/07/13(日) 00:04:12.05 ID:SsDCNXiH.net
visual studio だと、これで行けるんですが。何でかな?
#include "stdafx.h"
#define dbgprintf 1 ? (void)0 : (void) //(1)
int func(){
  return 1;
}

int _tmain(int argc, _TCHAR* argv[]){
  dbgprintf("%d", func());
  return 0;
}

302 :デフォルトの名無しさん:2014/07/13(日) 00:06:25.36 ID:b0K+GMLz.net
ifdefの切り方のが気になる

303 :デフォルトの名無しさん:2014/07/13(日) 00:07:03.38 ID:SsDCNXiH.net
↑のは間違いでした。↓こっちでも行ける理由が分りません。
それが知りたいのですが。

#include "stdafx.h"
#define dbgprintf
int func(){
  return 1;
}

int _tmain(int argc, _TCHAR* argv[]){
  dbgprintf("%d", func());
  return 0;
}

304 :デフォルトの名無しさん:2014/07/13(日) 00:08:43.08 ID:G9QhDNfC.net
だからfunc()が呼ばれるって言ってるだろ。

305 :デフォルトの名無しさん:2014/07/13(日) 00:09:06.82 ID:b0K+GMLz.net
>>303
define展開後のソースをベタで書いて動かせばいーじゃない

306 :デフォルトの名無しさん:2014/07/13(日) 00:11:43.83 ID:SsDCNXiH.net
>>304
なるほど。そうすると、funcの戻り値はどうなるんですか?
("%d", func());

("1");
になって、この後どうなるんですか?

307 :デフォルトの名無しさん:2014/07/13(日) 00:15:05.28 ID:SsDCNXiH.net
>>305
int _tmain(int argc, _TCHAR* argv[]){
  ("1");
  return 0;
}
で動きました。 ("1"); の行は、実行に影響ないんでしょうか?

308 :デフォルトの名無しさん:2014/07/13(日) 00:29:57.79 ID:b0K+GMLz.net
>>307
ない
voidキャストされる
無駄処理なだけ

309 :デフォルトの名無しさん:2014/07/13(日) 00:37:10.72 ID:G9QhDNfC.net
そもそもそんな評価されねぇよ。あんた、「人間じゃなくて人だな」って言われない?
どこから"1"が出てくるんだよ、この間抜け。

310 :デフォルトの名無しさん:2014/07/13(日) 00:43:29.81 ID:G76Sa1hj.net
>>303
はfuncは呼ばれません。

311 :名無しさん@0新周年:2014/07/13(日) 01:31:07.42 ID:nrxOtUVn.net
int a=(123,func());

312 :デフォルトの名無しさん:2014/07/13(日) 01:33:03.22 ID:7UphRhX9.net
まず忌まわしきカンマ演算子を知るべき
話はそれからだ

313 :デフォルトの名無しさん:2014/07/13(日) 02:03:15.70 ID:psjBpgTU.net
for(i=0,j=100;i<5;i++,j-=20)

314 :デフォルトの名無しさん:2014/07/13(日) 07:29:50.12 ID:psjBpgTU.net
1, 連続した配列を2次元配列のように扱いたいのですがどうすればうまくいきますか?
 今の所は値が書き変わっていません
2, VC++2010EEではコメントのようにキャストしないとエラーになるのですがどこを直せばいいですか?

ttp://ideone.com/2cbjRj

315 :デフォルトの名無しさん:2014/07/13(日) 08:02:48.70 ID:fGnnU/OX.net
>>314
質問内容とソースとが対応していない、に1票。

316 :デフォルトの名無しさん:2014/07/13(日) 08:57:51.52 ID:0Iul1EJe.net
1. ideoneの出力を見る限り、1, 2, 3, ...が10, 20, 30, に書き換わっている
2. エラーメッセージを書く。常識

317 :デフォルトの名無しさん:2014/07/13(日) 10:39:54.60 ID:SsDCNXiH.net
カンマ演算子ググッようやくdbgprintfマクロの挙動わかりました。
有難うございました。
マクロ勉強中で、もう一つ教えてください。こんなマクロ見つけたのですが、
#define eqstr(a, b) (*(a) == *(b) && strcmp(a, b) == 0)
文字列が等しいかどうか調べるだけなら、
#define eqstr(a, b) (strcmp(a, b) == 0)
でいいと思うのですが、*(a) == *(b)は何ですか?

318 :デフォルトの名無しさん:2014/07/13(日) 10:48:19.01 ID:nn2UNRM4.net
(a)の中身が a + 1 だったりしたらどうする

319 :デフォルトの名無しさん:2014/07/13(日) 11:04:10.62 ID:SsDCNXiH.net
その時は、例えば
char a[]="1234";
char b[]="234";
とすると、
eqstr(a+1,b)は
strcmp(a+1, b)==0で
strcmp("234","234")==0で
等しいと判断されると思います。

320 :デフォルトの名無しさん:2014/07/13(日) 11:34:51.98 ID:iBUseW7g.net
2次元配列の動的確保なんですが、例えば2*3の2次元配列の場合

int **a = (int**)malloc( sizeof(int*) * 2); (@)
a[ 0 ] = (int*)malloc( sizeof(int) * 2 * 3 ); (A)

のように確保するといろいろなサイトで見かけました。

 そこで行数列数未定の2次元配列を動的確保したいのですが、
@とAの部分をreallocを使って再確保していこうとして失敗しました。
@で最初に必要な行数を与えればうまくいくのですが、行数を1つずつ増やしていく方法はありませんか?

321 :デフォルトの名無しさん:2014/07/13(日) 11:49:18.37 ID:psjBpgTU.net
>>315,316
ideone用に書き換えてる間に直ったのかもしれません
お騒がせしました

>>320
リスト構造?

322 :デフォルトの名無しさん:2014/07/13(日) 12:11:30.17 ID:mc+PMj3L.net
>>320
Aはそんなにタップリ確保しなくていいよ。
aがどんな変数か考えると簡単かも。
↓この例だと、
一行分のデータへのポインタを、最初二個持ってて、
realloc後は三つもつことになる。

#include <stdio.h>
#include <stdlib.h>
int main(){
int i, j, **a = malloc(sizeof (int *) * 2);
a[0] = malloc(sizeof (int) * 3); // 一行割り当て
a[1] = malloc(sizeof (int) * 3); // 一行割り当て
for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) a[i][j] = i * 10 + j;
for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) printf("%d:%d %d\n", i, j, a[i][j]);
puts("");
a = realloc(a, sizeof (int *) * 3); // 行数を増やす
a[2] = malloc(sizeof (int) * 3); // 一行割り当て
for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) a[i][j] = i * 10 + j;
for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) printf("%d:%d %d\n", i, j, a[i][j]);
return 0;
}

323 :デフォルトの名無しさん:2014/07/13(日) 12:23:37.32 ID:iBUseW7g.net
>>322
解答ありがとうございます
>>320に書いた確保の仕方は、メモリ領域に連続して確保するためのものでした分かりづらくすみません
なのでAの後には、
for (i = 1; i < 2; i++) a[ i ] = c[ i-1 ] + 3;
このような処理が入り、全体のサイズを確保した後に、行を割り当てることになります。

おっしゃる通りの行ごとに列のサイズを確保し、メモリ領域が連続になっていない確保の仕方では、
プログラムはエラーをはかずに動作しました。

324 :デフォルトの名無しさん:2014/07/13(日) 12:25:16.99 ID:iBUseW7g.net
>>323
×c[i-1]
○a[i-1]

でした

325 :デフォルトの名無しさん:2014/07/13(日) 15:40:25.69 ID:7UphRhX9.net
>>317
多分ほんのちょっぴりでも高速化したいんだろ
普通のコーディングならそもそもマクロじゃなく関数にすべき

326 :デフォルトの名無しさん:2014/07/13(日) 16:16:05.62 ID:0Iul1EJe.net
高速化のつもりだろうね
関数コールのオーバーヘッドがよほど気になる状況でも無い限り、
効果は薄いと思う。>>317 が興味があるなら、短絡評価を調べるといい。
マクロ自体は、strcmpのa,bの方は括弧でくくってないし、なんか中途半端

327 :デフォルトの名無しさん:2014/07/13(日) 18:34:21.87 ID:25pakNK6.net
strcmpの方はカンマ演算子をオーバーライドしてない限り大丈夫じゃね?
優先順位低いし

328 :名無しさん@0新周年:2014/07/13(日) 19:38:19.95 ID:XpdRKiat.net
(j-1)[a]

329 :デフォルトの名無しさん:2014/07/14(月) 03:16:13.60 ID:v6rlvCBe.net
>>317
高速化のつもりだろう。しかし、最近のコンパイラではstrcmpはストリング命令に
インライン展開される(ことが多い)ので、かえって低速化を招く。

330 :デフォルトの名無しさん:2014/07/14(月) 06:11:18.36 ID:PQHLBfsn.net
gccの最新バージョンではSSE4.2命令まで使ってるよ
-marchオプションで使える時はそちらをリンクするようになっている

331 :デフォルトの名無しさん:2014/07/14(月) 21:15:27.78 ID:QdFaiwl3.net
IO速くするにはどうすればいい?
バッファリング?

332 :デフォルトの名無しさん:2014/07/14(月) 21:53:25.57 ID:dxRw1V7C.net
SSDを買う

333 :デフォルトの名無しさん:2014/07/14(月) 22:52:44.27 ID:kVP5lF+/.net
>>329
最適化という機能があるよ

334 :デフォルトの名無しさん:2014/07/15(火) 00:07:32.82 ID:/VWMpkMO.net
>>331
なんでもかんでもオンメモリー

335 :デフォルトの名無しさん:2014/07/15(火) 12:25:59.43 ID:zrHbAgn8.net
繰り返し書き込むファイルの断片化対策
読込量・回数を減らす…インデックスやハッシュの活用
予算が余ってるならRAIDを組む
メモリが余ってるならRAMディスクもあり

336 :デフォルトの名無しさん:2014/07/15(火) 16:12:20.00 ID:eA5jv2Nf.net
I/Oそのものの高速化は手間なので、データ圧縮し転送時間を減らす。
とか言ってみる

337 :デフォルトの名無しさん:2014/07/16(水) 09:34:20.91 ID:b0IB8P33.net
リングバッファとセマフォ(2つ)とスレッドを使って先読みする

338 :デフォルトの名無しさん:2014/07/17(木) 00:36:59.90 ID:OBbzwXpO.net
HDDとか圧縮したまま記録すれば早いんじゃ?

339 :デフォルトの名無しさん:2014/07/17(木) 01:09:36.88 ID:bej3WA57.net
ZFSというLZ4圧縮を使えるファイルシステムがあってな

340 :デフォルトの名無しさん:2014/07/17(木) 15:07:58.26 ID:STDuRs09.net
初心者です。
ソースをすっきりさせたいので、
ウィンドウプロシージャとかWinMainとか、
include以外の全部をDLLに投げ込んじゃってもいいんでしょうか?

341 :デフォルトの名無しさん:2014/07/17(木) 15:17:12.77 ID:to24R3x/.net
なぜDLLに投げ込めばソースがすっきりするんだ?

342 :デフォルトの名無しさん:2014/07/17(木) 15:46:04.62 ID:en/jF64V.net
ソースファイルを分割するのとごっちゃになっているのではないか

343 :デフォルトの名無しさん:2014/07/17(木) 17:58:00.24 ID:wKNmXy3y.net
DLLにWinMainは無理だ
鶏が先か卵が先かになってまう

344 :340:2014/07/17(木) 19:43:39.87 ID:STDuRs09.net
ありがとうございました。

345 :デフォルトの名無しさん:2014/07/18(金) 10:30:44.47 ID:vLbu0UtM.net
C++って何を作るのに優れてるの?ゲーム以外で

346 :デフォルトの名無しさん:2014/07/18(金) 12:14:53.84 ID:exI1hoJs.net
Web系以外なら何でも

347 :デフォルトの名無しさん:2014/07/19(土) 00:19:29.13 ID:AQ8sn0hT.net
手軽にパフォーマンスが必要なものを作るのに

348 :デフォルトの名無しさん:2014/07/20(日) 10:26:23.66 ID:ErUz0FQn.net
作りにくさ・使いにくさに逆に価値が宿ることもある

349 :デフォルトの名無しさん:2014/07/22(火) 14:33:49.20 ID:wIMHt4xr.net
★2ch勢いランキングサイトリスト★

◎ +ニュース板
・ 2NN
・ 2chTimes
◎ +ニュース板新着
・ 2NN新着
・ Headline BBY
・ unker Headline
◎ +ニュース板他
・ Desktop2ch
・ 記者別一覧
◎ 全板
・ 全板縦断勢いランキング
・ スレッドランキング総合ランキング
・ ログ速
◎ 全板実況込み
・ 2勢
・ READ2CH
・ i-ikioi

※ 要サイト名検索

350 :デフォルトの名無しさん:2014/07/26(土) 09:25:01.15 ID:7jJs6tm2.net
初心者です。

とあるソースコードに(Qtの一番上のサンプルです)

class MainWindow : public QMainWindow
{
private slots:
void newFile();
};

みたいな記述がありました。
private slots:
の、slotsとはなんでしょうか。
ググろうにも「C++ アクセス修飾子 付加」とやってもダメですし、打つ手がございません。
よろしくお願いいたします。
またこれがわからない人が学習しとくべき、関連した範囲へのキーワードがありましたら、1つか2つだけ教えて頂けると嬉しいです。

よろしくお願いします。

351 :デフォルトの名無しさん:2014/07/26(土) 09:28:01.05 ID:DTo922cR.net
Qt方の拡張だ
Qtのチュートリアルなりリファレンスなりに解説あるだろ

352 :デフォルトの名無しさん:2014/07/26(土) 09:31:02.23 ID:1dyiAST7.net
そのまま private slots でググればいいんじゃね?
>>351 の言うように Qt の拡張みたい

353 :デフォルトの名無しさん:2014/07/26(土) 09:45:43.76 ID:7jJs6tm2.net
>>351, 352
迅速な回答ありがとうございます!!

拡張でそんなことが出来るものなのですね。驚きました。
知らない言葉の仕様かと思っていました。
private slots でググらせて頂きます。
合わせてチュートリアルも読むことにします(面倒臭がって、サンプルをざっと見て弄りたがったのが身の程知らずでした。)

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

354 :デフォルトの名無しさん:2014/07/28(月) 20:40:15.62 ID:XrTiyw31.net
http://codepad.org/ZcK1V5rO

出力
asdf6
jkl;2
361208

sizeofで期待したメモリサイズが帰って来ない 私が知らない知識をお教え願う

355 :デフォルトの名無しさん:2014/07/28(月) 20:44:14.15 ID:dfMBLDBO.net
>void asmerge_rec(int[], int, int);
引数で[]は使うな
int[]はint*と同じだ
sizeof(ar)したところで配列の大きさは返ってこない

356 :デフォルトの名無しさん:2014/07/28(月) 23:22:53.84 ID:XrTiyw31.net
>>355 c言語の初心者用サイトで学んで以来
可読性のために配列渡すときは[]を使用していました

今*に書き直して試したところ出力結果変わりませんでした
このsizeof(ar)はなにを返しているのでしょうか

357 :デフォルトの名無しさん:2014/07/28(月) 23:30:36.36 ID:CSMUGygm.net
sizeof(int*)と同じ

358 :デフォルトの名無しさん:2014/07/28(月) 23:37:46.60 ID:XrTiyw31.net
>>357 この環境では(?) int*が8バイトでintが4バイト????

wikipediaでヒントらしきもの見つけました
http://ja.m.wikipedia.org/wiki/Sizeof
完全型とかいう概念

359 :デフォルトの名無しさん:2014/07/28(月) 23:42:27.60 ID:nv6YBJ31.net
>>356
ま、template関数使えば似たような事が出来なくは無いけどね。

360 :デフォルトの名無しさん:2014/07/28(月) 23:43:07.48 ID:XrTiyw31.net
ありがとうございますおそらく解決しました
不完全型:オブジェクトを規定する型で,その大きさを確保するのに必要な情報が欠けたもの。

stdlibのqsortの引数がややこしいのは同じような理由でしょうね

361 :デフォルトの名無しさん:2014/07/29(火) 00:42:38.49 ID:bQIMdul6.net
逆に配列宣言したスコープ内の場合 どこにサイズ情報を持ってるのか疑問が沸いた

362 :デフォルトの名無しさん:2014/07/29(火) 01:06:14.11 ID:s+4NszZe.net
>>361
型情報と一緒にコンパイラが持ってんじゃねぇの
出力されたコード上では定数
C++だとさらに名前の中にマングリングして突っ込む

だけど、引数としての配列って不完全型云々じゃなくて暗黙のうちにポインタに変換されてたりしないか?
Cの仕様書持ってないからそのへんは知らんけど、不完全型へのsizeofならエラーじゃないのかと。

363 :デフォルトの名無しさん:2014/07/29(火) 02:22:03.19 ID:bQIMdul6.net
>>362 有益な情報ありがとうございます

不完全型については http://www.c-tipsref.com/words/incomplete_type.html
ここにそのものズバリ書いてあったので書きました このページが正しいのかはもう少しggってみます

364 :デフォルトの名無しさん:2014/07/29(火) 18:40:51.49 ID:s+4NszZe.net
>>363
不完全型の説明が間違ってるって言ってる訳じゃないよ。
配列を引数に取ると不完全型の配列になるんじゃなくて、
完全型のポインタになるんじゃないのかって話。

これはC++になるけど、http://ideone.com/nMMdX1
ってコードで型情報を見てみるとbarとbazの型は同じになる。
VisualStudio2010のCL16.00だと
foo=4,type=int [1]
bar=4,type=int *
baz=4,type=int *
となる。
そしてfoo[]に変えて不完全型にするとどちらもエラーになる。
foo[]だけがsizeofがエラーになるのはTCCでも再現するよ。

365 :デフォルトの名無しさん:2014/07/30(水) 00:56:26.47 ID:rvJq7ZUr.net
>>364 ニュアンスの指摘、正確な情報ありがとうございます

366 :デフォルトの名無しさん:2014/08/03(日) 18:44:38.25 ID:hnYydWpXP
std::array<std::array<int, M>, N> arr;は
&arr[i][j] == &arr[0][0] + N * i + jが
成り立つという意味で連続性を持ちますか?
パディングがないと思うので成り立つと思うのですが。

367 :デフォルトの名無しさん:2014/08/09(土) 11:52:42.47
スレはここでいいのかな?
入力した文字列をスタック領域に入れるのってどうやるの?

368 :デフォルトの名無しさん:2014/08/11(月) 12:26:15.10 ID:DM9hqsto.net
B::C
D::C
とやりたいのだけどBとD両方で定義しないと駄目
Bだけで定義して両方使うにはどうしたらいいですか?


Bの派生がD
Cは定数

369 :デフォルトの名無しさん:2014/08/11(月) 12:35:00.77 ID:c42QUAia.net
class B { public: static const int C=100; };
class D : public B {}

370 :デフォルトの名無しさん:2014/08/11(月) 12:52:18.57 ID:DM9hqsto.net
D::Cが無理

371 :デフォルトの名無しさん:2014/08/11(月) 12:54:43.75 ID:4YE8xGEJ.net
using B::C;

372 :デフォルトの名無しさん:2014/08/11(月) 13:52:12.20 ID:DM9hqsto.net
別の方法で
using B::Cはメンテがかかるので

373 :デフォルトの名無しさん:2014/08/11(月) 14:43:03.41 ID:xLVZtjTF.net
>>370
意味が分かんない
http://codepad.org/ilLpprw1

374 :デフォルトの名無しさん:2014/08/11(月) 15:00:35.00 ID:DM9hqsto.net
>>373
基底クラスをテンプレートクラスにして
Cの型をlong longにして
100を静的関数にするとできないのかも

375 :デフォルトの名無しさん:2014/08/11(月) 15:47:23.53 ID:/6BMCSKz.net
fputcで書きだしたバイナリデータを読み込みしたいのですがアドバイスをよろしくお願いします。

書き出しの部分
int nx=256;
int ny=256;
int nz=256;
int A[256][256][256];
FILE *fptr;
if((fptr = fopen("output.bin","w")) == NULL){ exit(1); }
fputc( (nx >> 8) &amp; 0xFF, fptr);
fputc( nx &amp; 0xFF, fptr);
for (int k=0;k<nz;k++) {
for (int j=0;j<ny;j++) {
for (int i=0;i<nx;i++) {
fputc( (A[i][j][k] >> 24) &amp; 0xFF, fptr);
fputc( (A[i][j][k] >> 16) &amp; 0xFF, fptr);
fputc( (A[i][j][k] >> 8) &amp; 0xFF, fptr);
fputc( A[i][j][k] &amp; 0xFF, fptr);
}

読み込みの部分(自分で考えてみましたがこれではだめでした)
int A_[256][256][256];
fin.open("output.bin", ios::binary);
fin.read((char*)&amp;nx,sizeof(int));
fin.read((char*)A_,sizeof(int)*nx*ny*nz);

376 :デフォルトの名無しさん:2014/08/11(月) 17:46:47.63 ID:xLVZtjTF.net
>>374
意味が分かんない、条件変わってるし。

>>375
未初期化変数をDumpしたいのかな?
int *p = &A[0][0][0];
でp++した時に指すのアドレスは
A[1][0][0]ではなくA[0][0][1]なので
ループが順番が逆
それと24,16,8,0順番だとビッグエンディアン固定になので
エンディアン判別の処理を入れるか普通にfwriteで書き込めばいい

377 :デフォルトの名無しさん:2014/08/11(月) 20:22:59.15 ID:PLjHWys5.net
>>376
ありがとうございます。
事情があって書き出しのほうのソースは変更できないんです。
読み込みのソースをうまく修正して読むことができるようにはできませんでしょうか。

378 :デフォルトの名無しさん:2014/08/11(月) 22:07:52.71 ID:xLVZtjTF.net
>>377
ループを逆にしてntohlで変換するだけ
書き込み時と逆にやればいいだけでしょ?

379 :デフォルトの名無しさん:2014/08/12(火) 01:54:38.79 ID:sSgdt4Yu.net
>>375
書き出し
・バイナリファイルをfopenするなら"w"じゃなくて"wb"とかにしといたほうが無難
・nxの上位16ビットおよびはny、nzの値は保存していないが問題ないのか
・Aの多次元配列がnx、ny、nzに無関係な固定値だけど問題ないのか
読み込み
・書き込みが"w"なのでios::binaryを付けて"rb"相当にしていると対称にならない
・nxの読み込みがsizeof(int)となっているが、intが16ビット以外だと正常動作しない
・書き込み側でnx、ny、nzが256以外に変更されてから出力されていた場合にサイズが一致しない
・書き込み側はビッグエンディアンで出力しているので、リトルエンディアンな環境では値が一致しない

素直に書き込みの逆をやったほうが簡単だし手っ取り早いと思うよ。

380 :デフォルトの名無しさん:2014/08/12(火) 02:28:45.65 ID:FJHkQfgs.net
エンディアンの問題を気にしないで済むようにするにはシリアライズ/デシリアライズかXMLかJSONか
テキスト入出力かその辺か

381 :デフォルトの名無しさん:2014/08/12(火) 05:50:37.85 ID:sSgdt4Yu.net
>>380
フレームワークや明確な作法に従ってないってだけで、
これはシリアライズ・デシリアライズそのものだぞ。

382 :デフォルトの名無しさん:2014/08/12(火) 09:55:16.44 ID:rfzbAqAv.net
>>378 >>379
ありがとうございます。
理解力が低くて申し訳ないですが、ビックエンディアンで書き出されたバイナリデータを
リトルエンディアンの環境(今読み込みをしようとしているPCの環境)で読み込むというこ
とでよかったですか。
nx,ny,nzは可変にしたいと思っています。とりあえず読み込みが成功したら取り組みます。
配列intXのほうはちょっとおいておいてnxがとりあえず読めるようにしたいです。

ifstream fin("input.bin");
if(!fin.good()) { cerr << "Couldn't open file.\n"; exit(0); }
else{
fin >> ntmp;
}
//nx=htonl(ntmp);
BiteSwapCalc B;
 nx=B.biteswap(ntmp)
cerr << nx << endl; //256となっていることを期待しています。

linuxの今使っている環境でhtonlの関数が使えないので以下を使ってみました。

383 :デフォルトの名無しさん:2014/08/12(火) 09:55:54.45 ID:rfzbAqAv.net
class BiteSwapCalc{
public:
int biteswap(int val){
//cerr <<"int"<< endl;
return ((val<<24) & 0xff000000) |
((val<<8) & 0x00ff0000) |
((val>>8) & 0x0000ff00) |
((val>>24) & 0x000000ff) ;
};
void ByteReverse(void *data, size_t nBytes)
{
unsigned char *low = (unsigned char*)data;
unsigned char *high = low + nBytes;
unsigned char temp;
while(--high > low) {
// *low と *high を交換する.
temp = *low;
*low++ = *high;
*high = temp;
}
};

384 :デフォルトの名無しさん:2014/08/12(火) 13:48:26.60 ID:46iLrj52.net
どうでもいいが、なんで「Bite」なんだ。
しかも、クラスになっている意味がないし。

385 :デフォルトの名無しさん:2014/08/13(水) 03:18:36.39 ID:qwKsatq9.net
OS Xのアプリケーションを作りたいんだけど、
そこでおすすめのGUIライブラリ教えてください。

今までWinAPIで色々作ってたけど、最近Macに乗り換えて、
大好きなCで何らかのアプリケーションを作ってみたいと思った。
出来れば色々便利なライブラリも教えてくれるとうれしいです。

386 :デフォルトの名無しさん:2014/08/13(水) 03:29:30.48 ID:9jHt6nG8.net
>>379
補足、MS-DOSやWindowsではbを付けてバイナリモードにしないと0x1Aが操作できなくて死ぬ。

>>382
だーかーらー!C++でもCの関数使えるんだから、
わざわざC++で書きなおしたりせずに元の処理をそのまんま反転させろ!
http://codepad.org/XuyonTpI
Windowsだとrbにしておかないと0x1AがEOF扱いになってそれ以降が読めないし、
読み込みがrbで書き込みがwだと0x0Aが0x0D 0x0Aに変化してしまう。
Unixしか触りませんって宗教じゃないなら、保存の側をwbに変更させとけ。
Windows上でwで書いたファイルをrbで読んでCRLFをLFに変換するコード書いてもいいけど、
本題全く関係ないバッドノウハウだからどう考えてもwb-rbにした方がいい。

nxに関してだが、readで読んでたところよりも悪化してる。それは文字列の読み込みだ。
そもそも、int(恐らく32bit=4byte)を16bit=2byteで保存してるんだから普通にintとして読めるわけがない。
shortで読んでからintにキャストしつつバイトオーダを修正するか、元と同じようにバイト単位で読んどけ。

387 :デフォルトの名無しさん:2014/08/13(水) 04:31:24.23 ID:0qU1zyd8.net
hashmapのキーとしてアドレスを入れるのってやっていいんですか?

388 :デフォルトの名無しさん:2014/08/13(水) 04:37:11.79 ID:gAzc5rgf.net
いいけど意味あんのか

389 :デフォルトの名無しさん:2014/08/13(水) 04:37:50.22 ID:R+B95mq6.net
いいよ
size_tと同じ、中身がアドレスってだけ

390 :デフォルトの名無しさん:2014/08/13(水) 15:46:15.69 ID:TZPZmb+y.net
格納時と参照時でアドレスがズレていないことを保証するのは
もちろん開発者の責任

391 :デフォルトの名無しさん:2014/08/13(水) 15:55:54.87 ID:6MzZRjgo.net
class CSamp;
CSamp *samp[5]; // グローバル
samp = new CSamp[5];
CSamp[0]->func();
とした時に

func()
{
this[0] == samp[0]
this[1] == samp[1]
this[2] == samp[2]
this[3] == samp[3]
this[4] == samp[4]
}

これは保証されてる?

392 :デフォルトの名無しさん:2014/08/13(水) 17:29:44.55 ID:dKOZ273e.net
>>391
そもそもsampの型がおかしい。遣り直し。

393 :デフォルトの名無しさん:2014/08/13(水) 19:00:46.39 ID:KGiYCuxo.net
>>386
非常に丁寧にありがとうございました。とても参考になりました。

394 :デフォルトの名無しさん:2014/08/13(水) 22:49:39.78 ID:yUu6IlV+.net
>>385
OS X で C で GUI はあんまりいいのないと思う。
C++ なら Qt あたりかなぁ。あとは wxWidgets とか。
どっちもマルチプラットフォームだから、Windows とかでも動かせる。
でも多分素直に Objective-C + Cocoa で作った方が Mac 色に染まれると思う。

395 :デフォルトの名無しさん:2014/08/14(木) 00:42:33.74 ID:KTikXAiC.net
Visual StudioのC++で
プラットフォーム=Win32でビルドしていたWin32コンソールアプリを
プラットフォーム=x64でビルドして実行したら、ある関数のint型の引数
の受け渡しで、全然違う値に化けてしまう症状が出ています。
具体的には、こんな感じです。
呼び出した     関数で受け取った 
時点の値      時点での値
149     -->  1707222240
11     -->  -442583168
原因が分からないのですが、どのあたりを疑うべきでしょうか?

396 :デフォルトの名無しさん:2014/08/14(木) 00:51:32.99 ID:wROGfWf+.net
32->64
int

397 :デフォルトの名無しさん:2014/08/14(木) 01:06:02.76 ID:KTikXAiC.net
>>396
コメントありがとうございます。
でも、32でも64でもintは4バイトで同じだと思うのですが。

398 :デフォルトの名無しさん:2014/08/14(木) 01:42:03.02 ID:BE82x3v5.net
a.cpp #include "hoge.h" <iostream>
hoge.h #pragma once

hoge.cpp #include "hoge.h" <ncurses.h> <string> ncursesの関数使用とstring変数の宣言

をコンパイルしたところ
ncurses.hは問題ないのですがstringが未定義となります
何故でしょうか

399 :デフォルトの名無しさん:2014/08/14(木) 09:26:04.99 ID:xlLN/xxE.net
>>395
引数にポインタが入っていない?

400 :デフォルトの名無しさん:2014/08/14(木) 09:52:30.31 ID:mYwSdCAJ.net
>>397
コンパイラが採用しているモデルによってintのサイズは異なる。
http://ja.wikipedia.org/wiki/64%E3%83%93%E3%83%83%E3%83%88#64.E3.83.93.E3.83.83.E3.83.88.E3.83.87.E3.83.BC.E3.82.BF.E3.83.A2.E3.83.87.E3.83.AB
C++標準 short:16bit int:16bit long:32bit long long:64bit (全て最低ビット数。これ以上でも良い)
..LLP64 short:16bit int:32bit long:32bit long long:64bit pointer:64bit 例:64bit VC++
.....LP64 short:16bit int:32bit long:64bit long long:64bit pointer:64bit 例:64bit GCC
...ILP64 short:16bit int:64bit long:64bit long long:64bit pointer:64bit 例:HAL
...ILP32 short:16bit int:32bit long:32bit long long:64bit pointer:32bit 例:32bit
.....16bit short:16bit int:16bit long:32bit long long:..---- pointer:16bit 例:16bit

ただ、VCはILP64ではないはずだしint以外のところでミスしてる気がするなぁ…
取り敢えずクリーンしてリビルド。
型の不一致とキャストおよびポインタの類(ハンドル含む)の周辺を再確認。
引数に入ってる構造体や別の引数でそういうのがあるならよく確認すること。

それと、現象を再現できる範囲で関係ない部分を消していって、最小限のコードを絞り込む。
この作業すれば貼るまでもなく自力で原因が判る気もするけど、分からなければそれを貼る。

401 :デフォルトの名無しさん:2014/08/14(木) 12:11:21.48 ID:BE82x3v5.net
>>398
詳細載せましたよろしくお願いします
http://codepad.org/5ozwCQpB

402 :デフォルトの名無しさん:2014/08/14(木) 12:17:16.25 ID:BE82x3v5.net
>>401
リモートとローカル間違えました
エラーログは同じで
環境は以下です
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

403 :デフォルトの名無しさん:2014/08/14(木) 12:37:13.80 ID:KTikXAiC.net
>>399,398
アドバイスありがとうございました。
原因分かりました。私の勘違いでした。
VSのデバッガの、変数の値を見るウインドウの
使い方に慣れていないのが原因でした。申し訳ないです。

404 :デフォルトの名無しさん:2014/08/14(木) 14:16:53.95 ID:5fFoKeBH.net
初心者です。環境はVisualStudio2013です。
グローバル配列をexeと複数のDLL間で共有したいのですが
exeとDLL一対一だと__declspec(dllexport)を使ってできたんですが、
複数のDLLだとできませんでした。externも使ってみたんですがこれもできませんでした。
どうすればグローバル配列を共有できるんでしょうか。宜しくお願いします。

405 :デフォルトの名無しさん:2014/08/14(木) 14:20:15.22 ID:MeOL7pvQ.net
dllのどれか一つでエクスポートして、他のdll,exeでインポートする。

406 :デフォルトの名無しさん:2014/08/14(木) 14:21:20.45 ID:7UqN+IkX.net
>>404
ここらへんで

*.cpp
#pragma data_seg("COMMONDATA")

*.def
SECTIONS
COMMONDATA READ WRITE SHARED

407 :402:2014/08/14(木) 14:23:02.79 ID:5fFoKeBH.net
素早い回答ありがとうございます。やってみます。

408 :402:2014/08/14(木) 14:46:40.88 ID:5fFoKeBH.net
>>405のやり方でできました。ありがとうございました。

409 :デフォルトの名無しさん:2014/08/15(金) 00:58:10.02 ID:lVSvlh9k.net
VisualStudio2012を使用しています。
文字を16進数として扱いたいと考え、_stprintf_sに突っ込んでみました。
するとアルファベットや記号は想定通りに21〜7dとして表示されるのですが、
それ以外、たとえば'あ'(82a0になると想定)を入れると、ffffffa0と予想外の値が表示されました。
shift-jisは1バイトだったり2バイトだったりするのでこの方法ではダメなのでしょうか?
それ以前に%xにcharを突っ込むのが不適切でしょうか。
もしくは他に適切な方法があれば教えてください。

char ch = _T('あ');
char s[9];
_stprintf_s(s,_T("%x"),ch);

410 :デフォルトの名無しさん:2014/08/15(金) 01:26:00.14 ID:l1bBLjmZ.net
>>409
文字コードの問題では?
_T()マクロは、_UNICODE(だっけな?)が定義されていると、wchar_tとして処理される。
wchar_tは確かUTF-16なので、charで受けるとおかしくなる。

charをTCHARにしてみたら?

ただ、ワイド文字を使うと英数字も2バイトになるけど

411 :デフォルトの名無しさん:2014/08/15(金) 01:26:34.19 ID:cLr8J/Qn.net
>>409
char ch = _T('あ');
の時点で理解不足
http://msdn.microsoft.com/ja-jp/library/c426s321.aspx
_TだのTEXTだののジェネリックは速いんじゃないの?

412 :デフォルトの名無しさん:2014/08/15(金) 07:36:59.01 ID:sObSMUrm.net
>>409
char ch[2] = 'あ';
char s[9];
sprintf_s(s, _countof(s), "%x%x", ch[0], ch[1]);

413 :デフォルトの名無しさん:2014/08/15(金) 14:23:34.12 ID:ADzFYem4.net
>>401
mainframe.cppの中ではstd::stringとしておくか、using namespace std;等で、
std::stringをmainframe.cppの中の名前空間でも使えるようにしておく。

けど、名前が衝突したりするしusing namespace std;はおすすめしない。

414 :デフォルトの名無しさん:2014/08/15(金) 14:28:27.37 ID:ADzFYem4.net
>>409
ShiftJISでは全角文字は2バイト(2文字)で構成されている。
これは文字列として扱って1バイトづつ読むとか、
wchar_tなどを使ってUnicode化して対処できる。

あと0x80以上の値だからsigned charだと負数になる。
printfの引数に突っ込むとintにキャストされたりするから、
「ffffff」などのような余計なfが出力されたりもする。
こっちはunsigned charで扱うか、キャストするときにunsignedにしたり&0xFFしたりとか。

415 :デフォルトの名無しさん:2014/08/15(金) 17:10:22.07 ID:sR5x+ET8.net
>>413
あぁなるほど 名前空間の存在を失念してました ありがとうございます!

416 :407:2014/08/15(金) 21:10:18.95 ID:lVSvlh9k.net
返答ありがとうございます。
charをTCHARにする方法、>>414>>414で勧められた2バイト文字を文字列として扱う方法の両方でうまくいきました。
お察しの通りこれまで「おまじない」として_Tマクロを使っていたので、ちゃんと理解を進めるよう努力します。

417 :デフォルトの名無しさん:2014/08/18(月) 07:20:53.47 ID:cR2JPW/A.net
cocos2dやunityを使って何か制作してみたいと思いC++勉強しはじめたのですが
ポインタ変数はようはjavaでの参照型変数みたいな認識でいいんですかね?

418 :デフォルトの名無しさん:2014/08/18(月) 07:34:15.21 ID:BFPWuSMs.net
ええで

419 :デフォルトの名無しさん:2014/08/18(月) 07:34:21.69 ID:ArWtLEqw.net
ある意味ではそうだけど…動的確保したもの入れてる場合、自分で開放しないと消えないって点は大きく違うし、
配列とかはポインタがメモリ上の何処を指してて自分が何処を操作したいのか意識できないと途中でハマるかも。
C++ならスマートポインタとかstd::vector他のコンテナとか使ったほうが楽できるが、リークは起こさないようにね。

420 :デフォルトの名無しさん:2014/08/18(月) 07:35:37.07 ID:9zqJA8S0.net
javaは知らないが、javaの参照型変数は、c++の参照相当でないか?
c++の参照とc++のポインタは別だぞ。

421 :デフォルトの名無しさん:2014/08/18(月) 07:47:36.13 ID:2iJxkFC+.net
本当に無知で悪いが、

CとC++とC#の3つの違いって何?

422 :デフォルトの名無しさん:2014/08/18(月) 07:53:10.82 ID:WADX0cbT.net
それがわからないのは無知っていうんじゃない
バカっていうんだよ

423 :デフォルトの名無しさん:2014/08/18(月) 08:23:03.11 ID:DekYufYJ.net
>>420
C++の参照とは違い、nullを参照することを前提とした仕様になってる
んでリファレンスカウントなどを行うことを考えると
C++で言えばshared_ptrが一番近いんじゃないかと

424 :デフォルトの名無しさん:2014/08/18(月) 08:35:38.75 ID:DekYufYJ.net
>>421
C言語はOOPLでは無いので、class文などが無くOOPがしづらいが、その分他2者と比べて仕様が少なめ
低いレイヤー向けのプログラムによく使われる

C++はC言語のコードがほぼそのまま動くように作られた、Cとは別の言語
全部の仕様を把握するのは大変なので分かってる部分だけで組む人も多い

現在はC++環境の互換機能でC言語環境の代用とすることも多くなったが、一応別言語なので
それに慣れてると純粋なC言語の環境に触ったときつまづいたりする

C#は似たところもあるが、根本的に別の言語でC/C++のコードがそのまま動くなんてことはまず無いと思っていい

425 :デフォルトの名無しさん:2014/08/18(月) 08:42:55.69 ID:2iJxkFC+.net
>>424
なるほど。俺は馬鹿だったのか

>>424
ありがとう

426 :デフォルトの名無しさん:2014/08/18(月) 13:22:40.71 ID:OdlWZdI3.net
今頃気づいたか

427 :デフォルトの名無しさん:2014/08/18(月) 19:08:57.93 ID:0GH1txVb.net
なんてこった…こういう相手には

究極呪文「馬鹿には無理」は通用しない!!

428 :デフォルトの名無しさん:2014/08/19(火) 00:25:54.48 ID:Ihvi0tCP.net
二つのVectorを連結する場合、
http://stackoverflow.com/questions/3177241/best-way-to-concatenate-two-vectors
に有る@とAのどっちがよいのでしょうか?

@
AB.reserve( A.size() + B.size() );
AB.insert( AB.end(), A.begin(), A.end() );
AB.insert( AB.end(), B.begin(), B.end() );

A
std::vector<int> AB = A;
AB.insert(AB.end(), B.begin(), B.end());

429 :デフォルトの名無しさん:2014/08/19(火) 01:32:19.20 ID:DnbUByEk.net
1だよ

430 :デフォルトの名無しさん:2014/08/19(火) 19:55:40.06 ID:mxmpwOEU.net
なんでVectorに連結演算子を実装しないの?

431 :デフォルトの名無しさん:2014/08/19(火) 22:58:45.34 ID:MNYlxzwL.net
ここにもQZが潜伏してたか
ほんとCが好きだな

432 :デフォルトの名無しさん:2014/08/20(水) 00:48:36.69 ID:fMATK+WF.net
VisualStudio 2013 C++で
関数を再帰呼び出ししたら
warning C4717: すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。
って出るんですが、スタックを多めに取って実行すれば問題なく実行出来るのですが、
場合によっては、そのスタックでも足りない可能性はあります。
とは言っても再帰を使わない方式に書き換えるのは難しいのですが、こういう場合、
どういう対策が良いでしょうか?

433 :デフォルトの名無しさん:2014/08/20(水) 02:08:22.86 ID:7ZTzP0p/.net
>>432
アルゴリズムを見直して、出来るだけ再起を減らす。ループに出来る所は、ループに直す
例えば、自分で自分を呼び出す関数は、予め確保したメモリに、計算結果を書きこんで、関数は抜けるようにする。
その関数を呼び出す所をループにして、計算結果を元に条件分岐して、渡す引数を変更するなどの処理をつけるとか。
あと計算する順番を工夫するとか。(再起で最後に計算するものがわかっていたら、それから計算するなど)

もしくは再起に強そうなschemeを使うとかw

434 :デフォルトの名無しさん:2014/08/20(水) 02:41:35.41 ID:tVLOfqvxo
VC 6.0について質問なんですが

(1) CString に 数字を代入してもエラーにならないのは何故でしょうか?

(2) _tcsstr の戻り値がconstではないのですが、何故でしょうか?


VC 6.0について記載された資料が少ないため、ネットで調べても
中々わかりません。お手数ですがご回答のほどお願いします。

435 :デフォルトの名無しさん:2014/08/20(水) 07:44:24.11 ID:hY37C+OW.net
>>432
二分木を使っているなら平衡二分木に切り替えるとか

436 :デフォルトの名無しさん:2014/08/20(水) 11:27:40.36 ID:8EAQY78n.net
>>432
再起の時に関数呼び出しでコールスタックを積み上げる代わりに、
再起の時に自前のスタックにローカル変数を積み上げればループに書き換えれる。

437 :デフォルトの名無しさん:2014/08/20(水) 16:51:06.48 ID:fMATK+WF.net
>>433,432,433
みなさんアドバイス有難うございました。
>ループに出来る所は、ループに直す
この方式に変更できました。
意外と簡単に出来ました。助かりました。
>平衡二分木に切り替えるとか
普通の二分木しか知らないので勉強します。

438 :デフォルトの名無しさん:2014/08/20(水) 17:12:14.82 ID:rntLD2SQ.net
main.cpp クラス.h クラスメソッド定義.cppと分けた場合
ヘッダを正しくincludeすればヘッダファイルでプロトタイプ宣言する時STLコンテナ等includeする必要はありませんよね
色々ためしてヘッダを正しくとはincludeの順番も関係あると気づいたのですが
どうにもCE外れなくて 知識をください

439 :デフォルトの名無しさん:2014/08/20(水) 17:16:19.85 ID:m9TNP3mu.net
そんなincludeの順番でコンパイルエラーになるとかならないとかやめてくれよ
ヘッダで使ってるならちゃんとincludeしてくれ

440 :デフォルトの名無しさん:2014/08/20(水) 17:31:17.86 ID:rntLD2SQ.net
>>439
標準ライブラリなら衝突しないしそうするべきですかね
一発でCE解決するんですがどうにも納得いかなくて

441 :デフォルトの名無しさん:2014/08/20(水) 17:57:28.58 ID:YTuxoJAp.net
>>440
的外れな事言ってたらスルーしてくれ

-----クラス.h
#include "Main.h"

#ifndef I_クラス_I
#define I_クラス_I
・・・
#endif /* I_クラス_I */

-----クラス.cpp
#include "クラス.h"
・・・

-----main.h
#ifndef I_MAIN_I
#define I_MAIN_I

#include <先に標準系>
・・・
#include "クラス.h"

#endif /* I_MAIN_I */

-----main.cpp
#include "main.h"
・・・

これじゃだめなん?

442 :デフォルトの名無しさん:2014/08/20(水) 18:00:14.34 ID:lf2AdZUe.net
CEってなに?

443 :デフォルトの名無しさん:2014/08/20(水) 18:10:12.42 ID:rntLD2SQ.net
>>442 すみませんコンパイルエラーです
浸透してるものかと思い怠けました

444 :デフォルトの名無しさん:2014/08/20(水) 18:21:45.98 ID:rntLD2SQ.net
>>441 曖昧な質問にありがとうございます
STLコンテナを使うプロトタイプ宣言においてincludeをする必要がないと聞いたので疑問を感じました
--main.cpp
using namespace std;
int main(){
hoge hogehoge;
return 0;}

--hoge.h
#pragma once
class hoge{
public: void test(std::queue<int>);
};

--hoge.cpp
#include<queue>#include"hoge.h"
//ここの順序でエラーが出たり出なかったり
void hoge::test(std::queue<int> foo){}

445 :デフォルトの名無しさん:2014/08/20(水) 18:29:36.36 ID:xEVixHuY.net
>>444
> STLコンテナを使うプロトタイプ宣言においてincludeをする必要がないと聞いたので疑問を感じました
それが間違い。

> #include<queue>#include"hoge.h"
> //ここの順序でエラーが出たり出なかったり
そもそも、#include <queue>はhoge.hで記述すべき。
そうじゃないと、hoge.hやfuga.hを使うユーザは、そのヘッダファイルが必要としている他のヘッダファイルをいちいち探して自分でインクルードしなければならなくなる。

そしてその上で、全体としてpragma onceやインクルードガードを駆使して、複数回インクルードしても大丈夫なようにすべき。

446 :デフォルトの名無しさん:2014/08/20(水) 18:30:05.99 ID:fMATK+WF.net
横から失礼しますが、
I_MAIN_I
I_クラス_I
という書き方は、業界の標準的な記法なんですか?

447 :デフォルトの名無しさん:2014/08/20(水) 18:30:42.19 ID:lf2AdZUe.net
何業界だ

448 :デフォルトの名無しさん:2014/08/20(水) 18:39:08.76 ID:fMATK+WF.net
C/C++業界です

449 :デフォルトの名無しさん:2014/08/20(水) 18:43:20.13 ID:YTuxoJAp.net
>>446
違うよごめんね
アンダーバー1つや2つで挟んだのは使用しない方がいいからIつけただけ

450 :デフォルトの名無しさん:2014/08/20(水) 19:11:02.35 ID:rntLD2SQ.net
>>445 なるほど 合理的ですね そうします
どうもありがとうございました

451 :デフォルトの名無しさん:2014/08/20(水) 19:46:10.64 ID:RXWpuYSN.net
俺は INCLGRD ってプリフィクス付けてる

452 :デフォルトの名無しさん:2014/08/20(水) 22:33:57.06 ID:fMATK+WF.net
>>449
ああ、そうですか。
私の場合、いい用語が思いつかなかったので、

#ifndef ClassAのヘッダはインクルードされた

みたいな変な名前にしているので、I_クラス_I が業界標準なら真似しようかなと
思ったのですが。

>>451
#ifndef INCLGRD_ClassA

こんな感じですか。この方式を私も使わせてもらおうかな。

453 :デフォルトの名無しさん:2014/08/20(水) 23:43:01.23 ID:g2oSYh4j.net
Cなら大体ファイル名のドットと両端をあんだばにしたものが定番じゃないの?
main.hなら
#ifndef _MAIN_H_
みたいな

454 :デフォルトの名無しさん:2014/08/21(木) 00:04:31.22 ID:cKYAbYCX.net
グローバルスコープを持ち_で始まる名前は実装系のために予約されているので使うべきではない

455 :デフォルトの名無しさん:2014/08/21(木) 00:07:38.16 ID:yvxtVK3I.net
何故か定番だけど、本来アンダースコアで始まる識別子は処理系が使うためのものだからなあ
ユーザ(この場合は、処理系のユーザ=一般のプログラマ)としては、あまり勧められん

456 :デフォルトの名無しさん:2014/08/21(木) 00:12:41.20 ID:8LHCWH/J.net
>>452
非標準だけど、VSでもg++でもclangでも使える#pragma onceでいいんじゃない?

457 :デフォルトの名無しさん:2014/08/21(木) 00:28:02.42 ID:hIdRF2P5.net
>>456
ああ、なるほど。
でも、ヘッダーの多重インクルードに何度も悩まされたので(今も)、
#ifndef

#pragma once
の両方を使っているのですが、それは無駄ですね。pragmaだけにするかな。

458 :デフォルトの名無しさん:2014/08/21(木) 01:38:39.48 ID:ftoiqPr5.net
VC++でメンバ配列の初期化をしようとしたら
クラス、構造体、共用体のメンバーは、初期化できません。
とエラーが出るのですがplacement newを使う以外に回避方法はないんでしょうか

459 :デフォルトの名無しさん:2014/08/21(木) 01:47:07.64 ID:bEzT5YFt.net
>>458
ソースは?

460 :デフォルトの名無しさん:2014/08/21(木) 02:15:49.74 ID:hY3kzjbp.net
g++で-std=c++11つけろって言われるやつかな

461 :デフォルトの名無しさん:2014/08/21(木) 06:10:15.31 ID:ImdJ7Vgv.net
>>458
ふつうにコンストラクタで自前で好きな値にセットすればいいと思うんだけれども‥
そもそも配列の初期化(を = {0} とかでお手軽に記述するの)はプログラムの最初での初期化の場合にのみ、別の記述として意味があるのであって、
スタック上とかヒープ上の不定領域を初期化したいのなら、そのようにコードを書くのが、そしてそっちのほうがわかりやすいのでは?

>>460
C99 とかみていると、世の中おかしくない?とか思ってしまう

462 :デフォルトの名無しさん:2014/08/21(木) 08:12:43.96 ID:wIaa1KaJ.net
>>456
#pragma onceだとインクルードガードみたいに範囲指定できなくね?

463 :デフォルトの名無しさん:2014/08/21(木) 08:33:19.66 ID:lr9MxyFk.net
>>462
俺は >>456 じゃないけど範囲指定いらなくね?
まあ、個人的には環境を選ぶ pragma は好きになれないから、結局インクルードガードで全体を囲ってしまうんだが。

ところで、ヘッダファイルにインクルードガードもしくは pragma once って、もはや必須じゃね?
このスレのテンプレ化したいくらいだ。

464 :デフォルトの名無しさん:2014/08/21(木) 08:41:01.70 ID:hozPYr3C.net
インクルードガード一択

465 :デフォルトの名無しさん:2014/08/21(木) 09:02:16.47 ID:KDaiW863.net
むかしばっちゃがpragma onceは違うパスで参照されると効かないからincludeガード一択だって言ってた

466 :デフォルトの名無しさん:2014/08/21(木) 09:33:01.41 ID:QQWyFLQR.net
違うパスにおいてある同一ファイルを混ぜてビルドとかトラブル怖い。

467 :デフォルトの名無しさん:2014/08/21(木) 11:07:18.52 ID:wLVq0/GL.net
文字列char* lineの処理方法で、次のようなものが解説されていました。

while (*line) {
 /*処理*/
 line++;
}
あるいは
while (line[i]) {
 /*処理*/
 i++;
}

文字列末尾に\0がある前提のプログラムだと思うんですが、もし末尾の\0が無い文字列(?)を意図的に与えたら、\0をどこかに発見するまで与えた文字列(?)のメモリ範囲を超えてどこまでも処理を続けてしまうのでしょうか?

468 :デフォルトの名無しさん:2014/08/21(木) 11:08:20.98 ID:hozPYr3C.net
メモリ範囲を超えてどこまでも処理を続けてしまう

469 :デフォルトの名無しさん:2014/08/21(木) 11:09:31.02 ID:Rf32jxet.net
違うパスに置いてある同一ファイルとか本当にずっと同一だったらいいけどね。

470 :デフォルトの名無しさん:2014/08/21(木) 11:15:24.56 ID:wLVq0/GL.net
あ、後者の方はメモリエラーで強制終了かも?

471 :デフォルトの名無しさん:2014/08/21(木) 11:17:44.17 ID:baeu0mZS.net
>>469
そうならないようにアクセス違反的なエラーを出すのがOSの役目

472 :デフォルトの名無しさん:2014/08/21(木) 11:20:53.86 ID:Rf32jxet.net
>>470
どっちもいっしょ

>>471
両方書き込み専用にしておくってこと?
そんなことする前に一つの場所においてパス通すべきだとおもうんだが

473 :デフォルトの名無しさん:2014/08/21(木) 11:21:19.13 ID:Rf32jxet.net
書き込み専用ってなんだ読み込み専用だ

474 :デフォルトの名無しさん:2014/08/21(木) 12:15:13.79 ID:wIaa1KaJ.net
>>472
>>471>>470あてじゃね?

475 :ID:baeu0mZS:2014/08/21(木) 13:47:44.14 ID:baeu0mZS.net
すまない
俺の書き込みは、ID:hozPYr3C氏の11:08:20.98へレス番指定したんだが‥
Jane Style 3.75を使ってるけど、ブラウザで見たらレス番号がずれる現象が発生してるわ
大方、ファイルでも壊れたんじゃろうとて、一度消してリロードしてみる

476 :デフォルトの名無しさん:2014/08/21(木) 14:03:06.58 ID:wIaa1KaJ.net
スレ名右クリック再読み込みでok

477 :デフォルトの名無しさん:2014/08/21(木) 14:58:36.33 ID:baeu0mZS.net
>>476
thx 憶えておくわ

478 :デフォルトの名無しさん:2014/08/21(木) 17:41:56.75 ID:QQWyFLQR.net
>>467
Yes。ただし、どこかでメモリアクセス違反などすれば止まる事もある。
コンパイラ等がアクセス違反検出用の処理を追加した場合も止まる。
>>475
NUL文字終端が無い固定長配列って可能性の話かもしれん。
>>475-473
どのレスが消えたのか分からないけど、未だに独断透明削除が続いてんのかよこの板・・・

479 :デフォルトの名無しさん:2014/08/22(金) 00:33:59.73 ID:l//fiCSE.net
VisualStudio 2013 C++を使ってプログラムを描いているのですが、
一部クラスの使い方がわからないので教えていただけると幸いです。

//コンストラクタ
Ex)Move::Move(int shape_id) : X(x),Y(y){}

というプログラムがあったとして、
Move::Move(int shape_id)の後のX(x),Y(y)は
何をしているのでしょうか?参考書に書いてあったのですが、
説明がなくて頓挫しております・・・

480 :デフォルトの名無しさん:2014/08/22(金) 00:45:37.33 ID:8lh3zAq8.net
>>479
初期化しているだけ
初期化子リストでググると幸せになれるかも

481 :デフォルトの名無しさん:2014/08/22(金) 01:10:55.70 ID:bnST7d3s.net
> Ex)Move::Move(int shape_id) : X(x),Y(y){}
>
> というプログラムがあったとして、
ないでしょ。

482 :デフォルトの名無しさん:2014/08/23(土) 20:22:17.27 ID:+lV5UoHo.net
std::difftimeが秒単位の差を整数値なのにdoubleで返すのは、古い仕様のC言語にはlong long intがないから?
time_tってただの__int64みたいだし、単に引き算してintにキャストしてもおk?

483 :デフォルトの名無しさん:2014/08/23(土) 21:59:53.82 ID:++Jtu7HW.net
>>482
パフォーマンスを要求されるなら、64ビット整数の引き算の結果をintにキャストすればいい。
そうでないなら、difftime()の戻り値をintにキャストすればいい。

484 :デフォルトの名無しさん:2014/08/23(土) 22:48:22.43 ID:+VQeeysP.net
>>482
> time_tってただの__int64みたいだし、単に引き算してintにキャストしてもおk?
標準Cの規格の範囲ではだめ
標準Cではtime_t型の値の精度は実装依存
つまりtime_t型の値1は1秒を意味するかもしれないし、1ミリ秒かもしれないし、10秒とかでも規格違反ではない

といっても実際のところPOSIXでもwindowsでもtime_tは1秒単位なんでその範囲でのプログラムならokといえる

485 :デフォルトの名無しさん:2014/08/24(日) 09:26:54.81 ID:PkG6bn0Z.net
time_t2int() みたいな関数作って 念のため条件コンパイルでくくっとけ

486 :デフォルトの名無しさん:2014/08/24(日) 13:24:36.26 ID:EYMdVqe7.net
西アフリカで、アウトブレイクした潜伏期間延長型エボラの死者・罹患者の数を散布図にし近似曲線を出してみたら
片対数グラフで直線だから既に指数関数的増加だった

2014年に、西アフリカでアウトブレイクした潜伏期間延長型エボラの死者は、2014年8月半ばで1000人。←今ココ
2014年12月上旬で1万人。
この時点で世界規模で空路シャットダウン開始、世界経済大混乱

2015年5月で10万人。
2015年9月で100万人。
この時点で、第二次世界大恐慌発生

2015年大晦日で1000万人。

ちなみに
http://ja.wikipedia.org/wiki/2014%E5%B9%B4%E3%81%AE%E8%A5%BF%E3%82%A2%E3%83%95%E3%83%AA%E3%82%AB%E3%82%A8%E3%83%9C%E3%83%A9%E5%A4%A7%E6%B5%81%E8%A1%8C
:カナダ保健省のサイトでは体内に数個のエボラウィルスエアロゾルが侵入しただけでも発症するとしている
:ハマダラカが、吸血したての人の新鮮血を媒介しているという学説が浮上している

エボラ出血熱は蚊やアブに刺されただけで感染する。

:「この地域には内戦、政府による搾取、テロが長い間続いており、それによって生まれた恐怖、貧困、猜疑心などがある。エボラは耐え難い騒音に付け加えられた一つのざわめきに過ぎない」
現地では

や る 気 は 皆 無

487 :デフォルトの名無しさん:2014/08/24(日) 13:25:55.04 ID:zZu98MZL.net
>>482
参考URL
http://okwave.jp/qa/q5584845.html

> time_tってただの__int64みたいだし、単に引き算してintにキャストしてもおk?
用意されているライブラリ関数を使わず、プログラマ自身が自分でコーディングするという
リスク・テイキングに見合うメリットが得られるのかな

488 :484:2014/08/24(日) 13:51:28.91 ID:zZu98MZL.net
下記の部分を撤回します。すまない。
; 用意されているライブラリ関数を使わず、プログラマ自身が自分でコーディングするという
; リスク・テイキングに見合うメリットが得られるのかな

489 :デフォルトの名無しさん:2014/08/24(日) 18:51:21.87 ID:h7b5TqwT.net
>>480
ありがとうございました、理解しました

490 :デフォルトの名無しさん:2014/08/28(木) 17:09:19.37 ID:qW74C0E4.net
同クラスの違うメソッドから構造体にアクセスすると、2つ目のメソッドからアクセスした瞬間、thread 1 exc_bad_accessで落ちます。
かなり初心者のためよくわかりませんが、ポインタのアクセスによるメモリ関係のような気もするのですが、、
どのように対応すればいいのでしょうか?対応方法がわからず、困っています。。

void layer::settingA()
{
//正常に動作する
const charaData* param = static_cast<const charaData*>(chara->getUserData());
int a = param->charaHp
}

void layer::settingB()
{
//落ちる
const charaData* param = static_cast<const charaData*>(chara->getUserData());
int a = param->charaHp
}

491 :デフォルトの名無しさん:2014/08/28(木) 17:11:16.45 ID:wVJDe5T1.net
問題はあんたの書いてないところにある

492 :デフォルトの名無しさん:2014/08/29(金) 07:16:07.73 ID:5ncU7wKD.net
C言語で配列の初期化について以下って同じですか?
char aaa[5]="";
char bbb[5]={0};

493 :デフォルトの名無しさん:2014/08/29(金) 07:26:13.24 ID:rM6G6SCh.net
いいえ

494 :デフォルトの名無しさん:2014/08/29(金) 08:04:00.30 ID:xp2wSl6N.net
>>493
すみません、質問の仕方が悪かったです
どうちがうのでしょうか?
前者はすべての要素に\0は入らない、保証されないということでしょうか?

495 :デフォルトの名無しさん:2014/08/29(金) 08:07:07.38 ID:rM6G6SCh.net
はい

496 :デフォルトの名無しさん:2014/08/29(金) 09:21:41.66 ID:ed/IJtRD.net
aaa[1]以降は不定だね。

497 :デフォルトの名無しさん:2014/08/29(金) 11:07:47.50 ID:TaMHNcEK.net
規格表眺めてみたけど該当箇所が見当たらないなぁどこだろ?

ところで新発見があったけど
char aaa[3] = "abc";
がアリな事に驚いたよ

char aaa[3]; // == {?,?,?};
char aaa[3] = ""; // == {'\0','\0','\0'};
char aaa[3] = "a"; // == {'a','\0','\0'};
char aaa[3] = "ab"; // == {'a','b','\0'};
char aaa[3] = "abc"; // == {'a','b','c'};
// char aaa[3] = "abcd"; // error
なところを見ると
必要があればzerofill->memcpyしてるようにしか思えないから
等価なんじゃね?
そもそもchar配列内の'\0'以降はオマケだから気にする必要がないけど。

498 :デフォルトの名無しさん:2014/08/29(金) 12:50:49.16 ID:bxnhpnUI.net
>>495
>>496
本当?

初期化リストで配列を初期化する時の、部分指定のルールから考えると、未指定部分はゼロ初期化される方が自然な気がする。

もちろん規格は未確認だが。

499 :デフォルトの名無しさん:2014/08/29(金) 12:55:35.34 ID:nIzdonyc.net
初期化リストが足りない部分は0が指定されていると解釈される。

500 :デフォルトの名無しさん:2014/08/29(金) 13:41:19.97 ID:P5dHkx7D.net
サイズ指定の配列の場合は残りも初期化、つまり>>492の場合はどっちも同じだな
6.7.8
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate,
or fewer characters in a string literal used to initialize an array of known size than there are elements in the array,
the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

501 :487:2014/08/29(金) 18:05:43.82 ID:5WqPiw0s.net
>>491
ありがとうございます。
問題はそこじゃないという指摘のため、間のソースを全部削ったんですが症状は変わらず、ハマっています。。
構造体自体にはアクセスできているんで、そこではないでしょうし。。

メモリやポインタは関係ないということですか?

502 :デフォルトの名無しさん:2014/08/30(土) 01:50:13.00 ID:X4lcw1AT.net
>>490
settingAとsettingBが同じ内容なんだけど…。

2度目にアクセスした時
・charaは有効なのか?
・chara->getUserData();で得たparamは有効なのか?

503 :デフォルトの名無しさん:2014/08/30(土) 04:32:00.31 ID:3Iv0NAQx.net
>>501
全部削ったならmain無いから動くわけねぇだろ
貼ってないところに問題が有るんじゃねって話かと

504 :デフォルトの名無しさん:2014/08/30(土) 12:03:50.32 ID:ZWIpt6n5.net
しまいには書いてるソースと実行ファイルはきちんと同期してるのかという話に

505 :デフォルトの名無しさん:2014/08/30(土) 15:56:39.08 ID:Bqq2YL4t.net
forとイテレータと範囲forでループ回すと
範囲for≧for>>イテレータって感じになるんですけど、イテレータは鈍足って事でいいんですか?
コンパイラはgcc49で最適化オプションは-O2のみです

506 :デフォルトの名無しさん:2014/08/30(土) 16:09:58.71 ID:FDr4RXqe.net
イテレータの速度は実装、コンパイラ依存だろ。
速度的にはポインタ操作同等になるかもしれないし測ってみないとわからん。

507 :デフォルトの名無しさん:2014/08/30(土) 18:20:24.36 ID:Bqq2YL4t.net
>>506
なるほど
速度を重視するなら動かしてみて確認する他なさそうですね
ありがとうございます

508 :デフォルトの名無しさん:2014/08/30(土) 21:46:42.81 ID:Ec2+uw3j.net
後置にしてるとか

509 :487:2014/08/31(日) 03:12:32.73 ID:O5SWMn7c.net
>>503
mainは削っていません。。
問題はたしかにそこじゃなかったです。。

>>502
同じコードでアクセスしていました。
おかげさまでヒントになり、解決しました。
2つ目がsetUserDataの値がうまくsetされておらず。。
getしたら落ちたというオチみたいでした。。


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

510 :デフォルトの名無しさん:2014/09/02(火) 08:15:24.42 ID:V1YjyPxko
コマンドプロンプトでCのプログラムに他のプログラムの戻り値を渡したいけど
Keisan.exe Hyouzi.exeみたいにプログラム名を入れてもプログラム名のままの文字列として渡されてしまいます
多分コマンドプロンプトの方でプログラムを実行後に引数にする書き方があると思うのだけど見つからないので教えてほしいです

511 :デフォルトの名無しさん:2014/09/02(火) 08:32:01.44 ID:V1YjyPxko
Hyouzi.exe Keisan.exeですね名前的に
それとスレ違いだったらごめんなさい

512 :デフォルトの名無しさん:2014/09/02(火) 17:04:51.71 ID:zpKHOJEXe
コマンドプロンプトのclコマンドで
テキストファイルをコンパイルしようとしたんだけど、

hello.c
hello.c(7) : error C2509: 構文エラー : 'return'

て出て出来ない・・・
cdでカレントは移動してあるし、
dirでファイルの存在も確認したけど分からぬ


PCはWin7

コマンドプロンプトは
開発者コマンド プロンプト for VS2013
っていうショートカットから起動

テキストファイルは、renameコマンドで直して
ファイルの種類がC Sourceになってる

一応ここを参考にしてた
http://www.asahi-net.or.jp/~yf8k-kbys/c1.html

ヽ(´・ω・`)/タスケテクレー

513 :デフォルトの名無しさん:2014/09/02(火) 19:48:08.09 ID:V1YjyPxko
>>512
ソースファイルに間違いがあるときに出るエラーです
return 0;の前の辺りをよく見てください
;などを書き忘れていませんか?

514 :デフォルトの名無しさん:2014/09/02(火) 20:00:35.11 ID:zpKHOJEXe
>>513
うっかりミスでしたー
助かりましたありがとう

515 :デフォルトの名無しさん:2014/09/09(火) 12:50:40.41 ID:fY2rmFRQ.net
http://blog.livedoor.jp/k_yon/archives/52145222.html
このページの最初のコードをg++でコンパイルするとsymbols not foundになるのですが,追加が必要なライブラリディレクトリやインクルードディレクトリはあるのでしょうか?
一応-Lでboostのlibディレクトリを追加しています.

516 :デフォルトの名無しさん:2014/09/09(火) 13:52:35.93 ID:LhYKCGJX.net
>>515
エラーメッセージを丸ごと貼ってみてくれ。

517 :デフォルトの名無しさん:2014/09/09(火) 14:17:05.62 ID:fY2rmFRQ.net
>>516
ありがとうございます。
2パターン貼ってみます
パターン1
----
g++ source.cpp
Undefined symbols for architecture x86_64:
"boost::system::system_category()", referenced from:
__static_initialization_and_destruction_0(int, int) in cc6cpb0x.o
boost::system::error_code::error_code() in cc6cpb0x.o
boost::asio::error::get_system_category() in cc6cpb0x.o
"boost::system::generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int) in cc6cpb0x.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
パターン2
----
g++ source.cpp -L/usr/local/Cellar/boost/1.55.0_2/lib/
Undefined symbols for architecture x86_64:
"boost::system::system_category()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccucepDw.o
boost::system::error_code::error_code() in ccucepDw.o
boost::asio::error::get_system_category() in ccucepDw.o
"boost::system::generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccucepDw.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
----

518 :デフォルトの名無しさん:2014/09/10(水) 19:34:03.03 ID:8YG7t37E.net
C++関数の戻り値を参照で受け取るとき、以下のようにした場合、get の return で
作成されたオブジェクトを参照で受け取っても事故が起こらないと保障されていますか?

const std::string &amp; get() {
return std::string("ABC");
}

void main() {
const std::string &amp;s = get();
printf("%s", s.c_str()); // ←どうなる?
}

519 :デフォルトの名無しさん:2014/09/10(水) 19:35:59.76 ID:8YG7t37E.net
すみません、間違えました。実際には以下のコードです

const std::string get() {
 return std::string("ABC");
}

void main() {
 const std::string &s = get();
 printf("%s", s.c_str()); // ←どうなる?
}

520 :デフォルトの名無しさん:2014/09/10(水) 20:20:13.24 ID:oypds7bC.net
>>519
確か大丈夫だったはず

521 :デフォルトの名無しさん:2014/09/10(水) 20:37:32.22 ID:AEk8bFgU.net
保証されています。
一時オブジェクトを参照で受け取ったら一時オブジェクトの生存期間は参照の生存期間と同じになります。

522 :デフォルトの名無しさん:2014/09/11(木) 23:18:49.66 ID:NV7aTG5j.net
すみません、質問です

typedef struct _str{
unsigned char *a1;
unsigned char *a2;
unsigned char **a3;
}str;


この構造体のa3には要素数不明のデータを収めるための可変配列を扱いたく
関数内でreallocして拡張しようと思っているのですが
どうもうまく行きません。
上記構造体の型を利用してa3を可変配列として扱うにはどのように記述すればよいかサンプル作っていただけませんか?

523 :デフォルトの名無しさん:2014/09/12(金) 00:10:39.54 ID:ZJPIaP/+.net
>>522
うまく行かないサンプルうpしてみろ
問題点を指摘してやる

524 :デフォルトの名無しさん:2014/09/12(金) 00:11:45.57 ID:qRf/kDN5.net
なんでポインタのポインタ?
unsigned char * a3;
...
void * tmp = realloc(strvar.a3, newsize);
if (!tmp) strvar.a3 = (unsigned char *)tmp;

525 :デフォルトの名無しさん:2014/09/12(金) 00:12:56.60 ID:qRf/kDN5.net
まちがった if (tmp) だ

526 :デフォルトの名無しさん:2014/09/12(金) 12:55:55.73 ID:+9CMXkcE.net
>>524
ありがとうございます

a3は可変配列にしたいのでダブルポインタを使いました
普通のポインタで使うとreallocしたあとの可変配列参照はa3[n]でいけますか?

527 :デフォルトの名無しさん:2014/09/12(金) 13:44:49.23 ID:AGOnRFED.net
>>522
こういう事がしたいん?
C++ならvector使うに限るけどな
Cならポインタの配列をreallocすればいい

528 :デフォルトの名無しさん:2014/09/12(金) 13:45:08.52 ID:AGOnRFED.net
あ、ごめん

http://ideone.com/yeMzyV

529 :デフォルトの名無しさん:2014/09/12(金) 19:47:46.99 ID:em+uIfWX.net
>>528
このサンプルソースってc++ですか?
newってcで使えるんですか?
素人ですみません

530 :デフォルトの名無しさん:2014/09/12(金) 21:41:43.02 ID:pvIGOvd5.net
>>522
お前のいっている可変配列ってどういうものだよ?
(mallocで確保した領域は配列的に使えるけど配列ではない、ってところは置いとくとしても)
char**なら可変配列だけどchar*なら可変配列ではないっていうものがお前のいう可変配列なら他人には通じない定義だぞ

531 :デフォルトの名無しさん:2014/09/12(金) 22:19:14.01 ID:DhkuCj0a.net
ダブルポインタっていう人まだ出てくるか
どこでそんな言葉覚えて来るんだろうな

532 :デフォルトの名無しさん:2014/09/13(土) 01:31:31.63 ID:bfbBE48o.net
>>531
入門書や入門サイト。リトマス紙になるね。

533 :デフォルトの名無しさん:2014/09/13(土) 03:42:25.04 ID:3jc89SS7.net
普通は何て言うの?
ポインタのポインタ?

534 :デフォルトの名無しさん:2014/09/13(土) 03:43:16.80 ID:XWWKFUhS.net
ポポインタ

535 :デフォルトの名無しさん:2014/09/13(土) 08:12:26.61 ID:71yOysF2.net
ぽいぽい

536 :デフォルトの名無しさん:2014/09/13(土) 08:51:51.73 ID:zuv4PMvj.net
*** ポポイのポイ

537 :デフォルトの名無しさん:2014/09/13(土) 09:17:36.52 ID:KASpJfW1.net
>>533
ポインタへのポインタ

規格の文面でのポインタの表現は pointer to xxx が基本なので直訳なら xxxへのポインタ が普通

538 :デフォルトの名無しさん:2014/09/13(土) 09:48:50.06 ID:SFutnRUx.net
(〜への)ポインタへのポインタと呼ぶことが多いけど、
二重ポインタとか多重ポインタと呼ぶ時もあるかなぁ…

539 :デフォルトの名無しさん:2014/09/13(土) 09:53:56.51 ID:cLSZnlBg.net
二重ポインタはダブルポインタと同じ程度臭い
多重ポインタはさらに酷い

540 :デフォルトの名無しさん:2014/09/13(土) 10:21:44.32 ID:GGHDqJ+4.net
個人の感想だろ?

541 :デフォルトの名無しさん:2014/09/13(土) 10:48:30.10 ID:33zq3RAT.net
>>537の「規格の表現にならう」が、客観的な落としどころだとおもう
だけど、ちょっと揚げ足取りみたいになってきたな

542 :デフォルトの名無しさん:2014/09/13(土) 11:05:28.56 ID:KASpJfW1.net
日本語でのダブルポインタならそうでもないけど英語での double pointer は
pointer to pointer の意味ではなく pointer to double、double(型)へのポインタ
の意味にとられることがあって紛らわしいので使わないようにしろと言う話もある

543 :デフォルトの名無しさん:2014/09/13(土) 11:45:37.70 ID:7Nr6UObN.net
>>529
http://ideone.com/dZN6kw

memcpy_sはMinGW4.9.1ならあるんだけどな
memcpyにすれば動くはず

544 :デフォルトの名無しさん:2014/09/13(土) 11:46:34.75 ID:7Nr6UObN.net
それにしても最適化かけるとひでえwwww
memcpyが単なるレジスタのmovになってる
64bitは幅が広いから何でも簡単にできちゃうんだな

545 :デフォルトの名無しさん:2014/09/13(土) 14:45:34.57 ID:SFutnRUx.net
>>522>>543
つか、http://ideone.com/yZmqYD こういう話じゃねぇの?
構造体を値渡しするならポインタへのポインタでないと困る。
失敗例→http://ideone.com/9TPH24

>>544
下手すりゃprintf呼び出し以外消えてたかもね。

546 :デフォルトの名無しさん:2014/09/13(土) 22:32:48.07 ID:wiUC0aE7.net
値渡ししたのに実引数に影響が出るような設計を前提にするなよ…

>>522
int read_string(char ** ppbuf) // 関数内で必要なサイズのバッファが確保される
みたいな関数を似たような関数を参考に自作しようとしたけど引数がポインタへのポインタである意味を理解できてなくて
char**型の変数をそのまま実引数として渡すとかいろいろ失敗しているんだろう

547 :デフォルトの名無しさん:2014/09/13(土) 23:56:21.95 ID:TL8s1y53.net
すいません、教えてください。
クラスを既存型に代入する際の代入演算子を定義したいのです。
どうすればよいのでしょうか。
int a ;
MyClass b ;
a = b ;
とする際の代入演算子を定義する方法です。

548 :デフォルトの名無しさん:2014/09/14(日) 00:08:48.95 ID:N78ccrO0.net
諦める

549 :デフォルトの名無しさん:2014/09/14(日) 00:14:22.61 ID:mkcFGBUS.net
>>547
operator int() なりを定義する
ただし、暗黙変換になるので、止めた方がいいと思う

550 :デフォルトの名無しさん:2014/09/14(日) 00:28:31.12 ID:pYL8ChvE.net
ポインタのポインタはバグの温床だからC++ならポインタのリファレンスが使えるようになってるから
悩むよりもC++使った方が楽な場合が多いな

551 :539:2014/09/14(日) 09:49:32.98 ID:tidiM7B+.net
>>549
やっぱ、やめたほうがいいんですかね。
キャスト演算子定義は、試しましたが、
既に書いたコードのいろんなところで、
オーバーロード関数があいまいだというエラーが出てしまいました。
なので、代入演算子自体を定義したかったのですが。

552 :デフォルトの名無しさん:2014/09/14(日) 12:34:26.03 ID:SUA5E3Us.net
>>550
使いこなせてないだけなんじゃ

553 :デフォルトの名無しさん:2014/09/14(日) 12:47:36.87 ID:THGvpi5T.net
プロセスIDを受け取り PostMessage(hwnd WM_CLOSE, 0, 0)で該当するものを
終了させたいのですが、IEが終了したりしなかったりします。
Process Explorerを起動してみると iexplore.exe が
ツリー形式になっているのが原因かなと思っています。

 iexplore.exe
  └iexplore.exe

下の iexplore.exe のプロセスIDが指定された場合のみ、
上の iexplore.exe のプロセスIDを取得する方法を
教えていただけないでしょうか。

554 :デフォルトの名無しさん:2014/09/14(日) 13:22:44.93 ID:3ZBHn29x.net
ポインタのポインタ、例えば
char **buff;
などを扱えない人がプロジェクトにいてバグの心配があるのなら、
typedef char * BUFF;
typedef BUFF * BUFF_ARRAY;
としてBUFF, BUFF_ARRAYを使うようにすれば良い
ようなことを思いついた。

555 :デフォルトの名無しさん:2014/09/14(日) 17:02:06.25 ID:1D8XKbcv.net
>>554
そういうのは却ってわかりにくくなるだけ
思い付いた本人だけはいいアイデアだと思うけど

556 :デフォルトの名無しさん:2014/09/14(日) 18:23:09.41 ID:GiyK3reg.net
なぜ型名にBUFFなどというもんを思いつき、
ましてや、それを掲示板で皆に読ませようとレスしたのか。

そのことが釣りでなければ本当に恐ろしい。
生粋の糞コード量産マシンでもないと書けないレスだ。

557 :デフォルトの名無しさん:2014/09/14(日) 18:28:32.79 ID:s+BV7Cb9.net
好かんな

558 :デフォルトの名無しさん:2014/09/14(日) 19:07:50.80 ID:P8BkuFbg.net
>>554
Win32APIがそんな感じだね
generic向けのTはありだけど
Pのtypedefはいらねー

559 :デフォルトの名無しさん:2014/09/15(月) 00:14:23.35 ID:A5qiBZ0X.net
>>558
そうだ、Win32APIの作法に慣らされただけだな俺は。
しかも自分で思いついたと勘違いするとか、もう、これは、糞製造機だなw

560 :546:2014/09/15(月) 00:14:56.04 ID:A5qiBZ0X.net
 

561 :デフォルトの名無しさん:2014/09/15(月) 00:19:58.20 ID:NURXBSEx.net
>>545
ああ構造体を値渡ししてんのか
いつも構造体をポインタ渡ししてるからそういうシチュエーションに出会った事がなかった

562 :デフォルトの名無しさん:2014/09/15(月) 10:27:15.23 ID:PW8m4k3j.net
構造体のポインタ渡しするならクラスにしてメンバ参照でよくね

563 :デフォルトの名無しさん:2014/09/15(月) 10:39:22.00 ID:8dgxuMjV.net
えっ?

564 :デフォルトの名無しさん:2014/09/22(月) 20:52:34.82 ID:XE8gOusZ.net
経験言語c、Rubyです。バイトでc++やることになったのでロベール入門講座の途中から(c言語でないところから)読みすすめてます。
ただの予想なのですが、この言語ほかの言語に比べて複雑過ぎませんか?労力に見合ったパフォーマンスを得られるのでしょうか?
もちろん労力に合わなくても言語習得くらいやりますが

565 :デフォルトの名無しさん:2014/09/22(月) 20:57:25.69 ID:UZeuYMIm.net
C++の機能は複雑というより基礎的なだけ。
JavaとかC#のほうが物量はある。
Rubyも公式外のライブラリを含めたら物量はある。
最近のC++の拡張は別にして、スタンダーテンプレートライブラリというのを実装するための仕組みを最低限取り入れたのがCからC++への変化。

566 :デフォルトの名無しさん:2014/09/22(月) 21:05:07.96 ID:UZeuYMIm.net
C++より先にスタンダードテンプレートライブラリが存在していて、それを実装するための言語としてC++が作られた。
スタンダードテンプレートライブラリが扱えれば、内部の部品まで詳しく知る必要はないかもしれない。




Standard Template Library - Wikipedia
STLのアーキテクチャの多くはアレクサンドル・ステパノフという一人の人物の手によって作られた。
1979年に彼はジェネリックプログラミングの初期アイデアを練り始め、そしてソフトウェア開発に革命をもたらす可能性を探究し始めた。

ステパノフはジェネリックプログラミングの大きな可能性に気づき、ゼネラル・エレクトリックのR&D部門の仲間たちに対し、
ジェネリックプログラミングがソフトウェア開発の広範囲に渡る基礎として研究されるべきだということを説得した。

当時はジェネリックプログラミングを実際にサポートしているプログラミング言語がまだなかった。
それをサポートする最初のメジャーな言語はジェネリックユニット(汎用体)の機能があるAdaであった。
1987年までにステパノフとマッサーはジェネリックプログラミングの研究成果としてAdaのリスト処理ライブラリを開発してリリースしていた。

しかしながらAdaは軍需産業以外ではあまり普及しておらず、C++は当時まだ言語として未成熟ではあった(テンプレートはまだなく後から実装された)。
ステパノフはC言語で(後にC++で)数多くのアーキテクチャとアルゴリズムの実装法を検証した。

ベル研究所のアンドリュー・コーニグ(Andrew Koenig)がこの動きを察知して、1993年11月のANSI/ISOのC++標準化委員会にアイデアを提出するように求めるようなことがもしなければ、
この作業は間違いなく、研究プロジェクトとして、あるいはHPのプロプライエタリなライブラリとして継続されたであろう。
提案は委員会で全面的に賛同を得て、すぐさま1994年3月のミーティングでのコーニグからの正式なリクエストへとつながった。

567 :デフォルトの名無しさん:2014/09/23(火) 02:04:53.44 ID:y6lNWyJt.net
C++触ったことないやつが答えてるみたいな印象。
公式外のライブラリとかライブラリの物量基準にしてどうすんだっていうか、
C/C++で作られたライブラリが幾つあると思ってるんだよ…

>>564
コードの実行性能的な意味のパフォーマンスにあまり貢献しない機能もままあるね。
自分で設計して書くだけなら知らなくてもどうとでもなるって機能は多いというか、
CになくてC++にある機能はほぼすべてがそういう機能と言えなくもない。
ただ、多くの機能は無いと困るとかあると便利だとか、理由があって存在している。
コードの実行性能的な意味のパフォーマンスはC由来の部分でわりと完結しているが、
「あったほうが便利だから」等の機能にどんな価値を見出すかは君次第だろう。

568 :デフォルトの名無しさん:2014/09/23(火) 03:38:41.23 ID:dVlUahkv.net
言語を網羅しようとすれば、物量と学習困難さは比例するだろ。
JavaやC#と比べ、C++の物量は少ない。

569 :デフォルトの名無しさん:2014/09/23(火) 04:59:39.32 ID:RW747lS9.net
>>564
メモリ管理はC/C++ の方が複雑だが、C を知っておれば C++ もその延長戦上で、大きく悩まない、ときどき止まることはあったにしても。
C++ の STL を俯瞰できるようになったら、一山超えただろうか、この場合テンプレートの細部まで知る必要はなく、パターンで認識して使っている、というのでかまわない。
物量として少ないのは事実であるが、学習困難性は‥問者はCを知っているので学習困難性も低いだろう‥ >>568 はわりとあたっているな

570 :556:2014/09/23(火) 05:31:47.36 ID:x8kHQGOE.net
返信ありがとうございます
c++が基礎的というのはなかなかしっくり来る表現ですね
これでも物量はJavaやC#より少ないんですか・・・びっくりしました
テンプレートについて全部しる必要がない、と言うのは希望が持てそうです。ありがとうございました
ネストされたテンプレートを見て細かい仕様に思いを馳せてウッってなっていたところだったので・・・あちらこちらの命名がしっくりこないのは仕方なしで目をつぶりましょう. 覚えてしまえば関係なし!

571 :デフォルトの名無しさん:2014/09/23(火) 11:09:21.73 ID:RZgQ8Ezi.net
CにしろC++にしろ細かな部分まで正確に把握してないとすぐ罠にはまるという点で
学習困難性は高い
ライブラリの物量なんて使う部分しか覚えなくて平気だろ
嘘つきどもめ

572 :デフォルトの名無しさん:2014/09/23(火) 15:14:32.71 ID:Y91BvWUL.net
ライブラリにバグがあればソース無い限り修正不可

573 :デフォルトの名無しさん:2014/09/23(火) 15:53:24.78 ID:+21wRmlf.net
>>570
C++の言語仕様は、JavaやC#より膨大だよ。
後者は、言語仕様がすっきりしていたのが人気が出た理由の一つだから。

574 :デフォルトの名無しさん:2014/09/23(火) 16:12:29.55 ID:+21wRmlf.net
>>568
C++の物量は JavaやC#の3倍くらい多いよ。

575 :デフォルトの名無しさん:2014/09/23(火) 16:27:09.71 ID:+21wRmlf.net
感覚としては、templateの複雑さ、xxxx_cast<yyy> の理解のしづらさ、
new(*p)CPerson() 的なコンストラクタ、new演算子の多重定義、
多重継承時の仮想基底クラス、右辺値参照、move、可変長引数の
仕様の複雑さ、#include <xxxx.h>から#include <xxxx> への変更、
static修飾の意味の不安定さ(translation localの意味とスタック変数でない、
という意味の二重性)、namespace, using, alias, typedef など似た物が
沢山あること、C/C++言語使用とは異質なものとしてプリプロセス処理があること
などなどとても複雑で実際は、3倍では済まない。

C++11,14まで正確に理解するための学習時間は、Javaなどの20倍くらいは必要。
ただし、JavaはJavaでGenericsなどで仕様拡張が行われているのでこの倍数の
数値は変わりうる。

576 :デフォルトの名無しさん:2014/09/23(火) 16:42:59.75 ID:+21wRmlf.net
C++には昔から正しく理解するのが難しい事柄として、コンストラクタと代入演算子の
違いが分かりにくいという問題がある。

CPerson person1 = CPerson(xxx);
CPerson person2;
CPerson person3();

↑はどれもコンストラクタが呼び出され、代入演算子は一度も呼び出されない。

CPerson person4;

person4 = CPerson(xxx);

↑見た目は似ているが、こちらはコンストラクタが呼び出された後、代入演算子が呼び出される。


また、引数なしのコンストラクタを「デフォルト・コンストラクタ」と呼ぶが、
それを自分で定義しない場合は、「デフォルト・デフォルト・コンストラクタ」が自動生成される。
こういった用語の理解が必要なのも、仕様の膨大さを感じさせる原因となっている。

577 :デフォルトの名無しさん:2014/09/23(火) 17:40:35.81 ID:ZstUR7eg.net
>>564
> もちろん労力に合わなくても言語習得くらいやりますが

なら、グダグタ言わずに習得してから文句垂れろよ

578 :デフォルトの名無しさん:2014/09/23(火) 17:41:25.84 ID:M/bHE28r.net
デフォルトデフォルトなんて規格のどこに書いてあるの?

579 :デフォルトの名無しさん:2014/09/23(火) 17:45:27.22 ID:+21wRmlf.net
>>578
Googleで、言語を英語にして、「defaulted default constructor」で
検索してみるべし。

580 :デフォルトの名無しさん:2014/09/23(火) 17:50:40.14 ID:rMNwwcoj.net
年老いた、ボケた爺さんプログラマが「プリンタ、プリンタ」言ってるので、
なんのことかと思ったら、ポインタのことでした。

581 :デフォルトの名無しさん:2014/09/23(火) 17:53:16.65 ID:M/bHE28r.net
デフォルテッドじゃねーか

582 :デフォルトの名無しさん:2014/09/23(火) 17:56:26.11 ID:ot8dc/K+.net
>>581
「デフォルト・デフォルト・コンストラクタ」の日本語訳で書かれた
本を見たことがある。

583 :デフォルトの名無しさん:2014/09/23(火) 18:10:55.26 ID:ot8dc/K+.net
>>580
やっぱり、この辺の人は性格悪いな。

584 :デフォルトの名無しさん:2014/09/23(火) 18:41:17.04 ID:ZstUR7eg.net
>>582
そりゃその本の著者/翻訳者がバカなだけでしょ

585 :デフォルトの名無しさん:2014/09/23(火) 18:44:49.10 ID:ot8dc/K+.net
>>584
C++ for Dummies「C++のからくり」SOFTBANK
スティーブン・R・デイビス著
瀬谷啓介訳

586 :デフォルトの名無しさん:2014/09/24(水) 10:28:43.04 ID:3Cm2Nqvi.net
>>575
キャスト、4つと言わずもうちょい分けても良かったのにと思う。
特にstatic_castとreinterpret_castのそれぞれの範囲が分かりづらい。

587 :デフォルトの名無しさん:2014/09/24(水) 10:36:13.63 ID:cwxDUbr2.net
static_castは、

1. 整数<--->浮動小数
2. 整数のビット数が狭くなる方向への変換
3. 浮動小数点の精度や指数が狭くなる方向への変換
4. 整数の符号の有り無しの変換

が全部合わさっている。

reinterpret_cast は、内部表現のビット列をそのまま維持して、解釈(意味)
だけを変える。その意味では、上記2,4とは同じと言えるかもしれない。
やってみた事がないが、reinterpret_cast でも、2,4 は可能かもしれない。
つまり、static_cast と reinterpret_cast は共通部分を持っているのかも。

588 :デフォルトの名無しさん:2014/09/24(水) 12:41:39.16 ID:YNAXKA8k.net
>>576
person3 の形式は存在しないでしょ。

589 :デフォルトの名無しさん:2014/09/24(水) 13:47:08.95 ID:oTUae3YU.net
>>588
CPerson person5(xxx);

の形式は存在する。この形式で、引数のxxxが存在しない場合がperson3だ。

590 :デフォルトの名無しさん:2014/09/24(水) 18:20:37.32 ID:ZWvFC4Uz.net
>>589
試してないでしょ?

591 :デフォルトの名無しさん:2014/09/24(水) 22:39:04.34 ID:Gby0THyI.net
CPerson person5(xxx);
CPerson person6=CPerson();
CPerson *person7=new CPerson();
なら問題なく許されるけど、
CPerson person3();
だとwarning C4930: 'CPerson person3(void)': プロトタイプされている関数が呼び出されませんでした(変数の定義が意図されていますか?)
とか(Visual Studio 2010)の場合は警告が出るな。コンパイルは通る。
http://ideone.com/319tnv ideoneのC++ 4.8.1の場合警告なしで通る。
http://ideone.com/kOXiUR ideoneのC++11の場合も警告なしで通る。
>>590
お前もな。
というか試した場合だと、独自拡張で受け入れられてしまう場合もある。
正しいかどうかを論じるなら規格文書を引いてこい。面倒なので俺はやらんがな!

592 :デフォルトの名無しさん:2014/09/25(木) 05:19:22.31 ID:Y/FZoDJC.net
>>591

593 :デフォルトの名無しさん:2014/09/25(木) 07:39:45.04 ID:C75VVLj1.net
>>591
もう何て言うか。。。
偉そうな事言うなら間違いは素直に認めないと。。。

594 :568:2014/09/25(木) 08:55:09.18 ID:gq4fP5ox.net
>>593
オイラは>>591ではないが、そもそも話の本質はそこじゃないからな。

595 :デフォルトの名無しさん:2014/09/25(木) 10:15:54.79 ID:gq4fP5ox.net
スマン。

CPerson person5("xxx"); // CPerson クラスの person オブジェクトを生成
CPerson person3(); // CPerson オブジェクトを返す関数を宣言

のようだ:

The syntax T object(); does not initialize an object;
it declares a function that takes no arguments and returns T.
The way to value-initialize a named variable before C++11 was T object = T();,
which value-initializes a temporary and then copy-initializes the object:

596 :デフォルトの名無しさん:2014/09/25(木) 10:21:56.07 ID:gq4fP5ox.net
最後、

: most compilers optimize out the copy in this case.

が抜けていた。ここは大事。

>which value-initializes a temporary and then copy-initializes the object:

は、テンポラリオブエジュクトを作ってから、それをコピーコンストラクタでコピーする
という意味だが、実際のコンパイラはそんなことはせずに一気にデフォルト・コンストラクタを
呼び出す事が多い。それが、「: most」以下の部分が指摘していることだと思われる。

597 :デフォルトの名無しさん:2014/09/25(木) 10:25:13.40 ID:gq4fP5ox.net
>>590 >>593
一応言っておくと、あなたは言葉が少なすぎるからそうなるんだよ。

知っているなら言葉で説明すべきなのに、人を馬鹿にしたような言葉だけを
書いて、内容は全く書いてない。

日本語が不自由な人が外国からアクセスしているのかも知れんが。

598 :デフォルトの名無しさん:2014/09/25(木) 10:36:24.13 ID:gq4fP5ox.net
>>593
>偉そうな事言うなら

そもそも、どこに偉そうなことを書いたのか、具体的に書いてくれ:
(かなり腹立つから。)

599 :デフォルトの名無しさん:2014/09/25(木) 11:05:48.34 ID:FkhkjqOZ.net
>>576
> C++には昔から正しく理解するのが難しい事柄として、コンストラクタと代入演算子の
> 違いが分かりにくいという問題がある。

Cだって
int a[] = {1,2,3,4};
の=は代入演算子じゃない。

C++の問題じゃない。おまえが無知なだけ。

600 :デフォルトの名無しさん:2014/09/25(木) 12:54:24.76 ID:gq4fP5ox.net
>>599
C++処理系を自分で作ろうとした時などに、代入演算子とどちらが呼び出されるか
明確にしたい時があるんだよ。

使うに徹すればどちらでも同じ結果になるので大した問題にならない。

601 :デフォルトの名無しさん:2014/09/25(木) 13:44:45.53 ID:p4SXJv8d.net
>>599
> Cだって
> int a[] = {1,2,3,4};
> の=は代入演算子じゃない。
無知なので尋ねますが、この場合(配列の初期化に限定?)の「=」は何演算子と呼ばれてるんでしょうか。

602 :デフォルトの名無しさん:2014/09/25(木) 13:52:59.40 ID:gq4fP5ox.net
>>601
自分が答えていいのか分からんが、={・・・}の部分全体で「初期化子」
と命名されていて、=自体は演算子とは言われない。

603 :デフォルトの名無しさん:2014/09/25(木) 15:21:13.91 ID:p4SXJv8d.net
>>602
ありがとうございました。なるほど、C99で拡張されてからの命名なんですね。

604 :デフォルトの名無しさん:2014/09/25(木) 15:26:55.86 ID:9dnJaqAQ.net
>>603
いや、だいぶ昔のANSI Cの定義でも「初期化子」という呼び方は変わって
ないはず。

605 :デフォルトの名無しさん:2014/09/25(木) 16:16:34.07 ID:FkhkjqOZ.net
>>600
知ったかぶりもいい加減にしたらどうだ。
構文上、初期化子(の=)と代入演算子(の=)は明らかに異なる。

明確にするもクソもない。

606 :デフォルトの名無しさん:2014/09/25(木) 17:02:36.73 ID:uEhi6Lrs.net
ID:gq4fP5oxはQZ

607 :デフォルトの名無しさん:2014/09/25(木) 18:07:39.07 ID:yDHAaJNV.net
>>599
それ、分かりにくくないじゃん

608 :デフォルトの名無しさん:2014/09/25(木) 19:28:54.76 ID:IK+pLUz6.net
>>606
それはQZを買いかぶりすぎ、QZにそこまで議論する能力はない

609 :デフォルトの名無しさん:2014/09/25(木) 21:31:00.88 ID:C75VVLj1.net
>>598
>正しいかどうかを論じるなら規格文書を引いてこい。面倒なので俺はやらんがな!

これは偉そうではないのかい?
言葉少ないと思うなら聞き直してくれれば答えたよ。

610 :デフォルトの名無しさん:2014/09/25(木) 23:24:10.15 ID:9dnJaqAQ.net
>>609
それを書いたのは自分ではない。

611 :デフォルトの名無しさん:2014/09/26(金) 00:04:30.42 ID:uohd10wm.net
>>605
あなたは
「知ったかぶり」
という言葉の意味、誤解してない?

612 :デフォルトの名無しさん:2014/09/26(金) 01:07:01.59 ID:A85zS2F0.net
>>610
えー???
じゃあ何で>>593へのレスに対して反応したの???
ちょっと、、、君も何と言うか。。。もう。。。

613 :デフォルトの名無しさん:2014/09/26(金) 02:58:00.10 ID:AYYTDtXl.net
>>612
> オイラは>>591ではないが
ブーメラン乙

614 :デフォルトの名無しさん:2014/09/26(金) 07:50:16.55 ID:A85zS2F0.net
>>613
あはは。
間違えた。

>>610
えー???
じゃあ何で>>591へのレス( >>591 )に対して反応したの???
ちょっと、、、君も何と言うか。。。もう。。。

だね。

615 :デフォルトの名無しさん:2014/09/26(金) 09:54:05.53 ID:qY859vRI.net
>>614
意味不明。引っ込んでろ。バカ。

616 :583:2014/09/26(金) 20:38:20.93 ID:Hu/y6U8m.net
>>592-594>>609>>613
>>591は横から来てコンパイル試したがperson3が関数になってることに気づかなかった野次馬だよ?
//丁度person3の後ろでperson4が生成されてるからオブジェクトの生成回数は7になるんだよなぁ…

>>593>>609
「CPerson person3();」関数宣言としては正しいし存在するじゃないか!(「試せば通る」し、>>595らしいし)
・・・そういう問題では無いですね、ごめんなさい。

617 :デフォルトの名無しさん:2014/09/27(土) 07:47:41.57 ID:7QDc7G/V.net
誤 野次馬
正 野次馬鹿

618 :デフォルトの名無しさん:2014/09/27(土) 09:47:35.95 ID:aElzcEyC.net
>>616
もうそれ以上傷口を広げ無くても良いのでは?
またもな人は面倒くさいから口出ししてないだけだと思うぞ
スレ発端は>>576だろうけど、好意的に見てもperson3の例をその文脈で持ってくるのはおかしい
そこに軽く突っ込んだ人がいて、真っ赤になって逆ギレ自演の嵐

619 :デフォルトの名無しさん:2014/09/27(土) 16:53:57.34 ID:Es6Y0cNh.net
そのくだらないプライド捨てた方がいいのでは?

620 :デフォルトの名無しさん:2014/09/27(土) 17:58:36.18 ID:DE3jcZJu.net
荒れてるなー
C/C++スレには自分がスゲーな奴で、行間読めない奴が住み付いてるから気をつけな
またお前かって感じ
言葉多く発狂してる方な

621 :デフォルトの名無しさん:2014/09/27(土) 18:48:44.72 ID:0z93SAz9.net
567を書いたものだが、「alias」の部分は知ったかぶりといえば知ったかぶり。
英語圏で「alias」と呼ばれている仕様がある時期から導入されたらしい事を耳に
入れたが、まだ学んでない。typedef aaa=bbb; みたいなやつの事かな・・・。
using namespace xxx; みたいなのも勘で理解しているだけで厳密な仕様書は読んでない。

622 :デフォルトの名無しさん:2014/09/27(土) 18:59:06.74 ID:0z93SAz9.net
http://en.cppreference.com/w/cpp/language/type_alias

↑ここに書いてあるね。
1. using aaa=bbb; と
2. template<xxx> using aaa=bbb<xxx>;
みたいなやつのことだったのか。
2番目の形式は、インスタンス化時にはaaa<xxx>と書かくのに、定義時には
aaaとだけでaaa<xxx>とは書かないんだね。class templateの場合もそうだ
けど。

623 :デフォルトの名無しさん:2014/10/10(金) 22:06:36.37 ID:LJYiMxQ9.net
例外とassertどう使い分けてる?

624 :片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/10/10(金) 22:14:36.53 ID:naOIlr8a.net
デバッグ時のみ、プログラムが正常に動作しているか確認したいときはassertを使う。
#define NDEBUGしているときはassertは取り除かれるので、
リリース時の性能には影響しない。

625 :片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/10/10(金) 22:18:18.16 ID:naOIlr8a.net
メモリー不足のとき、単純なnewは、bad_alloc例外を投げる。
処理全体に影響する状態を処理の外側に伝えるのに例外を使う。

626 :片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/10/10(金) 22:29:29.93 ID:naOIlr8a.net
例外は投げられるとcatchされるまで制御構造を飛び越えることができる。

627 :デフォルトの名無しさん:2014/10/11(土) 00:08:46.31 ID:FL6g2QAm.net
質問です
main()の中に関数A()があり、その中にB()があります
main()で定義したvector1,vector2を参照渡しでB()内まで持って行くにはA()とB()の二段階で渡せば良いのでしょうか?

628 :デフォルトの名無しさん:2014/10/11(土) 00:13:03.12 ID:bs/sFubV.net
肺、爽です

629 :デフォルトの名無しさん:2014/10/11(土) 00:17:26.95 ID:37xXCw5p.net
実際に書いてみればいいんやで

630 :デフォルトの名無しさん:2014/10/11(土) 00:21:52.21 ID:OlHZdekY.net
>>628
ありがとう

>>629
書いてみる

631 :デフォルトの名無しさん:2014/10/14(火) 09:18:48.40 ID:2DjoFVlO.net
cppファイルはsrcフォルダー
hファイルはincludeフォルダー
ではcppunitで作ったユニットテストのhとcppファイルは
どこに入れたらよいですか?

632 :デフォルトの名無しさん:2014/10/14(火) 09:41:55.90 ID:GdT+JZRZ.net
testフォルダ以下にご自由にどうぞ
個人的にはsrcとincludeに分ける必要もないと思う

633 :デフォルトの名無しさん:2014/10/14(火) 10:15:05.74 ID:A0D4+krR.net
メインのフォルダ
プロジェクト名のファイルを入れるフォルダ
機能毎に分けたファイルを入れるフォルダ
にしてるわ

634 :デフォルトの名無しさん:2014/10/14(火) 10:50:39.94 ID:OGTpBG0C.net
>>632
ありがとうございます。
>>633
機能ごとというとプログラム名のフォルダーということですか?
linuxだとプログラムに拡張子をつけないしきたりで
大文字と小文字を区別するしきたりじゃないですか。
windowsの場合は大文字と小文字を区別しませんから
linux環境で
フォルダ名を大文字のプログラム名、プログラムを小文字のプログラム名に
してwindowsに輸入するとコピーできない問題があります。

635 :デフォルトの名無しさん:2014/10/14(火) 10:56:53.46 ID:PgFOtI12.net
マングリングってなんかエロいよね

636 :デフォルトの名無しさん:2014/10/14(火) 11:36:29.63 ID:zT0VwE4n.net
>>634
完成したプログラムを収めるフォルダ作るとか出力先を考えれば良いんじゃないの?
プログラムをプロジェクトフォルダのトップ直下に持ってきたいなら、
プログラム実行時に不要なフォルダやファイルはsrcとかbuildの中に詰め込んで隠すとか。

637 :デフォルトの名無しさん:2014/10/14(火) 12:28:43.13 ID:A0D4+krR.net
>>634
機能毎に分けたファイルを1つのフォルダへって意味ね
メイン + 自身 + オプションみたいな感じ

プロジェクトフォルダ
->メインフォルダ
->プロジェクトフォルダ
->機能毎フォルダ
->Debug
 ->実行ファイル
->Release
 ->実行ファイル
じゃあかんの?

638 :デフォルトの名無しさん:2014/10/14(火) 14:21:37.63 ID:OGTpBG0C.net
>>637
それでいいです。

639 :デフォルトの名無しさん:2014/10/14(火) 19:12:43.81 ID:Xm+aC3qM.net
>>635
まんぐり返しか

640 :デフォルトの名無しさん:2014/10/15(水) 20:35:47.20 ID:EiiFXnTi.net
質問です

OSSのソース眺めてたら、
いわゆる普通の
ヘッダーにクラスやメソッドの宣言を書いて、
.cppに実装を書いて、ってやり方ではなく、

.hにも実装を書くし、
.cppにはテストコードとか書いてるし、

それで、hoge.cpp
に必要なすべてをincludeでつめこんで
hoge.cppをコンパイル&ビルドしてるんだけど、
こういうビルドの仕方ってなんて言うの?
なんか、こういう方式って名前付いてますか?

まあ、確かに、ソースコードの量が多くなると
リンク時に指定するオブジェクトファイルの数が多くなり過ぎるから、
必要なコードをすべてincludeしたファイルをコンパイルー>リンクした方が楽ってことなんだと思うけど.

ちなみにsconsでビルドしてます。

よろしくお願いします。

641 :デフォルトの名無しさん:2014/10/16(木) 00:07:48.71 ID:ngphL2uD.net
何見てるかわからんがヘッダファイルが本体なプロジェクトだろ
boostなんかがそう
一部.cpp必要なコンポーネントあるが

642 :デフォルトの名無しさん:2014/10/16(木) 00:35:35.47 ID:v/vdzyZm.net
.hにclassのメンバ変数が書かれているのかな。
include先の.cppをコンパイルするたびに毎度毎度
その.hに書かれた処理がコンパイルされるんだろうか。。

643 :デフォルトの名無しさん:2014/10/16(木) 01:32:31.88 ID:UUyeR/ZQ.net
>>642
pimplイディオムとか特殊な事しないかぎりclassのメンバー変数は.hに書くだろ…

644 :デフォルトの名無しさん:2014/10/16(木) 01:56:51.82 ID:jyM9qn0X.net
名前はしらないが完成品のソースで全体のビルドにかかる時間を短縮する手法だ

645 :デフォルトの名無しさん:2014/10/16(木) 04:20:29.46 ID:fYyW3P4N.net
VC++の、Afx ヘッダーみたいに、
プリコンパイル済みヘッダーでも作る、やり方なのかな?

646 :デフォルトの名無しさん:2014/10/16(木) 21:29:14.55 ID:prpAHb+A.net
>>623
assertは*.hに#define NDEBUGと書くと全滅する

647 :デフォルトの名無しさん:2014/10/16(木) 21:46:59.52 ID:6zTGqYum.net
>>623
assert はバグ(=起きてはならないこと)を引っ掛けるため
例外はバグ以外の環境や操作ミスで起きる不都合(=避けられないこと)を回避するため

648 :デフォルトの名無しさん:2014/10/17(金) 00:06:36.79 ID:xsdfhOV6.net
exchangeサーバってcmdから操作できる?
フォルダ構成とか

649 :デフォルトの名無しさん:2014/10/18(土) 22:41:02.04 ID:olwWpAy+.net
ベクターから配列に変えたら速すぎなんだが
何故だ?

650 :デフォルトの名無しさん:2014/10/18(土) 22:56:36.20 ID:jXLG/4NX.net
最適化を有効にしていないかvectorの正しい使い方をしていないか

651 :デフォルトの名無しさん:2014/10/18(土) 23:58:56.82 ID:olwWpAy+.net
>>650
forのなかで要素を取り出したり書き込んだりしてるだけなんだが最適化とかあるのか?
5倍くらい速くなった、ベクターが配列を基に作られてるのが原因?

652 :デフォルトの名無しさん:2014/10/19(日) 00:03:01.26 ID:c/fNN/TF.net
[]でもデバッグじゃ配列の範囲外にアクセスしてないか見てるぞ

653 :デフォルトの名無しさん:2014/10/19(日) 00:43:55.56 ID:2zyUx+2N.net
コンパイラの最適化が有効だとたいていのクラスのメンバ関数はインライン展開されて関数呼び出しのオーバーヘッドが消える

654 :デフォルトの名無しさん:2014/10/19(日) 01:55:35.58 ID:NJ9o05Xa.net
・デバッグビルドしている、最適化なしにしている
・配列はスタックに取っていて確保を何度も行ってかつその部分まで計測している。

何にせよその5倍速くなったというコードを晒さないと何とも言えん

655 :デフォルトの名無しさん:2014/10/19(日) 02:54:14.71 ID:cw5JQu3z.net
サイズが既知で領域がスタック上に確保されるなら普通の配列のほうが早くなりそうだけど数倍はない

656 :デフォルトの名無しさん:2014/10/19(日) 03:15:49.52 ID:NJ9o05Xa.net
>>655
計測してみた?
コンストラクタの無い型ならスタックから確保するのはスタックポインタ進めるだけだからヒープから取るより数倍どころじゃなく速いぞ

657 :デフォルトの名無しさん:2014/10/19(日) 03:50:12.58 ID:c/fNN/TF.net
スタックには限りがあるしなぁ

658 :デフォルトの名無しさん:2014/10/19(日) 05:39:14.13 ID:QL0HQqvq.net
>>651
そのvectorと配列は本当に同じ処理をしてるコードなのか気になる
まさかvectorはサイズ指定もresize(),reserve()もせずに大量にpush_back()してて、
配列は最初に一括で確保してる…なんてオチじゃないよな

659 :デフォルトの名無しさん:2014/10/19(日) 06:34:16.03 ID:B5OPr43G.net
operator[]じゃなくてイテレータ使うとか
サイズが決まってんならstd::arrayの方がいいかと

660 :デフォルトの名無しさん:2014/10/19(日) 16:52:49.49 ID:nWUCBVo3.net
などとエスパー合戦になるのでコードはよ

661 :デフォルトの名無しさん:2014/10/19(日) 17:16:06.78 ID:M9SKsKvj.net
>>640です
セルフ回答ですが、
調べたところ、Unity Build という名前が付いています。

すべての.hと.cppを上手い順序でひとつの.cppにインクルードして、このファイルだけビルド。
どこか1ヶ所変更するだけでも、全コンパイルし直す落ち度はあるが、ディスクIOが減るので高速にビルドできるらしい。

ちなみに、見ていたOSSでは、Unity .cpp でのみコンパイルが通ればいいから、各.hや.cppには必要なincludeが入っていない。
そのため、各.cpp単体ではコンパイルできないが、includeが無い分、ソースがすっきりしている感じだった。
(その代わり、IDEでソースを開くと真っ赤っかになる)

そして、モジュール単位にUnity.cppを用意して、アプリ全体のビルドでは10個程度のUnity.cppでビルドされていた。
これなら、コード修正の再ビルドが1つのモジュールの範囲に限定されるから賢いやり方かもしれないと思う。

662 :デフォルトの名無しさん:2014/10/19(日) 19:38:43.86 ID:Me0fGpTz.net
>>651です
vector http://codepad.org/oeUREsic
約0.0010秒

配列 http://codepad.org/EslbtY9s
約0.00011秒

ふぇぇぇなんでだよぅ自分のPCより差が出てるよぉ

663 :デフォルトの名無しさん:2014/10/19(日) 21:46:18.06 ID:cPpgakZM.net
>>662
今試しに私のPCで動かしたんだが、殆んど変らないな。
--
$ g++ -O3 pow.V.cpp ; ./a |head -10000 |tail -1
0.0001107 10000


$ g++ -O3 pow.a.cpp ; ./a |head -10000 |tail -1
0.0001139 10000

664 :デフォルトの名無しさん:2014/10/19(日) 22:16:52.45 ID:cPpgakZM.net
つーか、根本的にもっと早くなるコードなんだがこれ以上差が出せないな。そもそもなんでl/mなんだか。
clock()使わないで、gettimeofday()でも使って、ループ回数を固定して実測してみたらどうだ?

それはさて、二乗を乗算に書き換えてCPUがx86なら実数演算をsseにやらせるようにすると目に見えて速くなるぞw

665 :デフォルトの名無しさん:2014/10/19(日) 22:47:01.78 ID:Me0fGpTz.net
>>664
l/mなのはnを増やした時の計算時間を知りたかったからなんだ
あと、Linux使ってる?
調べてみたが
clock()はwinとlinuxでは何かが違うらしい
あとgettimeofday()はlinux専用みたいだ

666 :デフォルトの名無しさん:2014/10/19(日) 22:50:24.78 ID:Me0fGpTz.net
>>664
sseはちょっと調べてみる

ちなみにvisual studio使ってるから裏で何かやってくれてるのかも

667 :デフォルトの名無しさん:2014/10/19(日) 23:30:58.51 ID:B5OPr43G.net
std::chronoを使おう

668 :デフォルトの名無しさん:2014/10/19(日) 23:54:18.00 ID:c/fNN/TF.net
ttp://codepad.org/VlCY6qM4
vector 0.068
配列 0.070
VS2013 32bit Releaseバイナリ
Corei5 4460
当たり前だけど余り差は出なかったな

669 :デフォルトの名無しさん:2014/10/20(月) 00:05:25.32 ID:KSjZih3d.net
>>666
VC++なら設定によってはコンテナのイテレータの範囲チェックを行うのでそのときはその分遅くなる
ttp://msdn.microsoft.com/ja-jp/library/aa985965.aspx

670 :デフォルトの名無しさん:2014/10/20(月) 00:24:56.19 ID:KSjZih3d.net
それと言っとくと>>662の配列版の
delete[] data1,data2;

(delete[] data1) , (data2);
であって解放されるのはdata1だけだからな

ttp://ideone.com/FFgcy5

671 :デフォルトの名無しさん:2014/10/20(月) 00:48:30.18 ID:ue6UcWSy.net
http://codepad.org/about
codepadの最適化レベルは-O1
…ってかコンパイラ古すぎじゃね?

672 :デフォルトの名無しさん:2014/10/20(月) 09:00:37.21 ID:nHn9rVxH.net
最適化されてるはずだけどdata1[ij],data2[i]はリファレンスにしたら

673 :デフォルトの名無しさん:2014/10/20(月) 19:04:12.00 ID:cRmJ92uN.net
CentOS5の頃の奴だな
手元の5.5が4.1.2だ

674 :デフォルトの名無しさん:2014/10/20(月) 19:06:55.40 ID:w1uJ+QLu.net
つまり配列が速いのではなくベクターが遅いというわけで、ベクターを速くするにはコンパイルにも気を使わないといけないということですね

コンパイルや組み込みについて詳しく解説してあるサイトやおすすめの書籍などがあれば教えてください
手持ちのc++の本にはそこまで載っていない様で。。。

675 :デフォルトの名無しさん:2014/10/20(月) 20:05:31.25 ID:iwN/f8er.net
コンパイルオプションに-O3付けるのとメモリ管理を自分でやるのでてんびんにかけて楽な方を選択すればいいんじゃない?

676 :デフォルトの名無しさん:2014/10/20(月) 21:18:41.31 ID:e1ZIgcc9.net
>>674
逆に考えるんだ。
コンパイラが勝手に速くしてくれるんだから、人間は楽な方を使うんだ。

677 :デフォルトの名無しさん:2014/10/20(月) 21:49:25.94 ID:xbA0pS9k.net
高価なインテルコンパイラだと速くなるのかな?

678 :デフォルトの名無しさん:2014/10/21(火) 03:40:13.94 ID:spR4uLWz.net
>>674
やりたい事を明記しなさい

679 :デフォルトの名無しさん:2014/10/21(火) 05:44:41.14 ID:w5FgyNfx.net
>>677
結構凄いコードを吐くよ。
特に、avx対応コードで4並列に超越関数を演算しちゃうとか。

680 :デフォルトの名無しさん:2014/10/21(火) 19:11:03.84 ID:9kJQNkb/.net
>>678
Visual studioで数値計算を高速化したいけどどんなテクニックがあるのかも知らないし、そもそもコンパイルについての知識もないから勉強したいなぁと
あと最適化、SSEについても

681 :デフォルトの名無しさん:2014/10/22(水) 11:37:27.80 ID:L59YbXQz.net
>>679
レス、サンクス
最近のCPUはそれ自体が小さなベクトル型スパコンみたいなものですね
コンパイラのユーザーズ・ガイドを少し眺めてみたけど、最適化オプションはかなり奥が深そう‥
将来インテルの石でPCを組んだら無償お試し版で遊んでみたいなぁ

682 :デフォルトの名無しさん:2014/10/22(水) 13:25:18.21 ID:f7evsStm.net
>>681
iccに頼らなくても、gccでも並列演算できなくはないよ。
コンパイラが勝手にやってくれるのと、自分でちまちま書くのとでは勝手が全く違うけどね。

683 :デフォルトの名無しさん:2014/10/24(金) 12:34:54.94 ID:+Tkev7fd.net
http://openframeworks.jp/tutorials/firstSteps/003_ooops_object_oriented_programming.html
このサイトの「クラスからオブジェクトを生成する - パート3」
で「*」ポインタをつける必要が出てきたとあるんですが、
理屈がよくわかりません。
納得はいかないですがそういうものとして覚えておけばいいんでしょうか、、。

684 :デフォルトの名無しさん:2014/10/24(金) 12:55:30.23 ID:JJZzpP2b.net
>>683
どこにそんな文がある?意訳?

685 :デフォルトの名無しさん:2014/10/24(金) 13:00:21.51 ID:2cfKwGQJ.net
>>683
パート3で突然インスタンスをnewで生成するようにしたから突然現れたと思われ。
それまではコンストラクタに引き数がなかったからnewしてなかったのだろう。
newでインスタンスを確保するからには、ポインタで保持する必要があるのは道理。
それならそれで、スマートポインタを使えと思わなくはないが。

686 :デフォルトの名無しさん:2014/10/24(金) 13:03:18.04 ID:2cfKwGQJ.net
--
この実装の変更によって、これらのオブジェクトを生成する際に、メモリー内に領域を作成する必要がでてきました。それぞれのオブジェクトに対してポインター(メモリの参照)を作成することで、この操作が可能となります。

testApp.h(定義)に戻って、新規のオブジェクトを以下ように宣言するようにしましょう。
--
この星印(*)は、オブジェクトのためのメモリーの領域を作成したことを意味しています。
--
最初の行と最後の行の意訳だろ。

687 :デフォルトの名無しさん:2014/10/24(金) 13:10:11.41 ID:bzRiGdHm.net
初心者むけとして不完全だったり厳密には正しいとは言えない説明をすることはあるけど
>>683のリンク先はいきなりnewを使用するようにしたりとか初心者向けにしては教え方のバランスが変
個人的にはそこを見て勉強することはおすすめしないな

688 :デフォルトの名無しさん:2014/10/24(金) 13:11:11.21 ID:+Tkev7fd.net
>>685
なるほどそういうことか〜あざざっす。
newでインスタンス→ポインタ保持ってところ、
わかりやすいサイト探してみます。

689 :デフォルトの名無しさん:2014/10/24(金) 13:16:28.28 ID:+Tkev7fd.net
>>686
フォローありがとございます〜

>>688
アドバイスありがとうございます。


変数もメモリに領域つくってるんでは?って思ってしまうんですが違うんですかね。
なんか必要性ってところで???となってしまいます。

690 :デフォルトの名無しさん:2014/10/24(金) 13:18:23.81 ID:SG4ZH+p9.net
>>683
コンストラクタの変更とnewで生成する事は何の関係もない。

> このチュートリアルは、openFrameworksでオブジェクト指向プログラミングをするための簡単なイントロダクションと、自分のクラスを作成するためのHowToガイドです。
とあるので、openFrameworksではオブジェクトはnewして生成する流儀なのかも知れない。
openFrameworksつかってプログラミングする目的でない(OOPS入門として読む)ならば、そのページはうんこと断言して良い。
見なかった事にして忘れてしまえ。

691 :デフォルトの名無しさん:2014/10/24(金) 14:19:17.13 ID:2cfKwGQJ.net
>>683=681
私も>690に同意。
C++のプログラミングとOOPの入門は別と思った方がいいと思う。

692 :デフォルトの名無しさん:2014/10/24(金) 14:23:53.88 ID:7uisWKAt.net
>>691
そう?
デザパタ本なんか見ると
言語問わず似たりよったりだけどねぇ

693 :デフォルトの名無しさん:2014/10/25(土) 04:55:43.73 ID:b4QQd40Z.net
C++で日本語対応ってどうやってるの?
文字コードや文字セットはシステム側が提供するものを利用するか、
ttfファイルとかをパースする(?)のかと思うんだけど。具体的な方法がわからん(´・ω・`)

694 :デフォルトの名無しさん:2014/10/25(土) 06:05:25.04 ID:dFV7jCVh.net
std::cout << "日本語" << std::endl;ってやったら日本語が出るだろ

695 :デフォルトの名無しさん:2014/10/25(土) 06:41:17.06 ID:BH5UYxje.net
アプリ内部でつかうエンコーディングはプラットフォームに依存せずに決めといた方がいいぞ、UTF-8とかUTF-16とかに。
プラットフォーム固有のAPIに渡す直前に必要に応じて変換

696 :デフォルトの名無しさん:2014/10/25(土) 06:42:36.98 ID:s5oEimPT.net
>>693
ttfとか言う辺りGUIでの日本語のことだと思うけど、C++にはGUI関連の機能自体が存在しない。
GUI関連は環境に合わせてライブラリなりAPIなりを持ってきて使うのでそちらの対応状況次第。
日本語非対応のAPI上で日本語扱う場合は、別途フォントエンジンを用意したりする。FreeType等。

只の文字データとしてなら、ロケールの対応範囲内でマルチバイト文字もワイド文字も扱える。
使用可能ロケールは環境依存なので、それ以外も扱う場合は別途ライブラリを用意したりする。libiconv等。

697 :デフォルトの名無しさん:2014/10/25(土) 06:54:35.09 ID:b4QQd40Z.net
>>695
アプリケーションでエンコーディングするのに確立した方法があれば教えて(人・∀・)
あとそのAPI(システム・コール)とかある?

698 :デフォルトの名無しさん:2014/10/25(土) 06:55:32.80 ID:b4QQd40Z.net
>>696
ありがとうm(__)m
そのlibiconvとやらを漁ってみます。

699 :デフォルトの名無しさん:2014/10/25(土) 09:38:59.85 ID:s5oEimPT.net
>>698
C99準拠のsetlocale、wcstombs、mbstowcsでも一応は変換できるよ。

文字コードの方でよかったのか…なんでttfが関係すると思ったんだw

700 :デフォルトの名無しさん:2014/10/25(土) 12:31:43.72 ID:Dq9yc316.net
書き込み時刻から察しろ

701 :デフォルトの名無しさん:2014/10/25(土) 13:53:07.26 ID:zmlgvAXz.net
I/Oの時に変換するかな
ファイルI/O、ネットワークI/O
MBCSはいろいろと問題起こるから、基本wchar_t、wstring

702 :デフォルトの名無しさん:2014/10/25(土) 14:36:05.45 ID:B/NlI7do.net
MBCSがUTF8だったら良かったのにね

703 :デフォルトの名無しさん:2014/10/25(土) 15:48:14.08 ID:pojaJUJ1.net
Visual Studio Express 2013でコンパイルした時、実行すると代入のところでアクセス違反と出てクラッシュします
が、このコードのどこが悪いのでしょうか
http://codepad.org/8z4kZV7q

704 :デフォルトの名無しさん:2014/10/25(土) 17:13:33.60 ID:Gk5MgQ3X.net
C言語でつまずいたのでご教授ください。
#include <stdio.h>
int main(){
int num[]={0},i=0,j=0;
while(1){
scanf("%d", &num[i]);
if(num[i]==100) break;
i++;
}
return 0;
}

上のような入力を受け取るプログラムなのですが、100と入力してもプログラムが終了しないことがあります。一桁の数値だとうまく終了してくれるのですが、なぜでしょうか?

705 :デフォルトの名無しさん:2014/10/25(土) 17:15:53.51 ID:USuaOmn0.net
>>703
よく分からんけど、とりあえずアクセスしているアドレスを
確認してみては?
http://codepad.org/fvM6zFXS

706 :デフォルトの名無しさん:2014/10/25(土) 17:16:50.14 ID:FadhVfwr.net
>>704
> int num[]={0}
100?
あふれちゃう

707 :デフォルトの名無しさん:2014/10/25(土) 17:20:12.82 ID:USuaOmn0.net
>>704
一周目でも終了しないことがある?
よくわからんが、3行目を int num[10000]={0}; i=0; j=0; として解決するなら
buffer overflow だろう

708 :デフォルトの名無しさん:2014/10/25(土) 17:24:17.75 ID:Gk5MgQ3X.net
>>706
ありがとうございます。初歩的なミスでしたね、申し訳ない

709 :デフォルトの名無しさん:2014/10/25(土) 17:27:55.97 ID:FadhVfwr.net
ま、それでも
101回めに100を入力しなければ抜けないから
問題あるんだけどね

710 :デフォルトの名無しさん:2014/10/25(土) 17:29:20.54 ID:FadhVfwr.net
100回めに100か
すまん

711 :デフォルトの名無しさん:2014/10/25(土) 17:30:36.92 ID:YY79eQIk.net
101回目のプログラマー

712 :デフォルトの名無しさん:2014/10/25(土) 19:16:47.25 ID:RdqY+Ee3.net
101回目のコンパイル(´・ω・`)

713 :デフォルトの名無しさん:2014/10/25(土) 19:47:32.79 ID:zmlgvAXz.net
普通に100入力したらすぐ抜けるやん
なんで>>709-710と思ったのか興味ある

714 :デフォルトの名無しさん:2014/10/25(土) 19:54:04.48 ID:TLDzyjRn.net
101回目のプラグマ

715 :デフォルトの名無しさん:2014/10/25(土) 19:59:41.81 ID:PupOMkEO.net
>>713
いやいや、範囲外アクセスする可能性の残る
プログラムという話だろう

716 :デフォルトの名無しさん:2014/10/25(土) 22:19:28.90 ID:pojaJUJ1.net
>>705のコードで出力した結果は

&v=0030fc08
ref=0030fc08
cast=3f800000
v.x = 1.000000

となって問題のある方のアドレスが3F800000(1.0F == v.x)になるんですよね
つまりどこかで間接レベルがずれているように見えるんですが
それだけだと一度参に受ければアクセスできるようになるという理由がわかりません

そもそもcodepadとこちらの環境で出力が違うということは、元のコードに環境依存の未定義な要素が含まれていたりするんでしょうか

717 :デフォルトの名無しさん:2014/10/26(日) 04:54:56.99 ID:fx3FFnF6.net
>>706>>709-710
溢れたってのは合ってるだろうけど、「値が100個」じゃなくて「100という値」だぞ。
>>713
「100という値」を「値が100個」と誤解したっぽいところまではわかるけどその先が謎くて興味深いね。
>>716
コンパイラのバグな可能性もあるけど俺にはわからないのでC++の偉い人にお任せしたい。

718 :デフォルトの名無しさん:2014/10/26(日) 05:43:50.40 ID:9iGJ9Vz2.net
>>713
誤解しただけだよ
何故誤解したのかといえば
分からないとしか言いようがない

719 :デフォルトの名無しさん:2014/10/26(日) 11:48:15.55 ID:OKY31X3r.net
モダンC言語プログラミングという本の、stateパターンの実装のところで

typedef struct _State {
const struct _State *(*stop)(const struct _State *pThis);
const struct _State *(*playOrPause)(const struct _State *This);
} State;

というふうに構造体を定義してるんだけど
*(*stop)(const struct _State *pThis)
これなんなのですか? 関数ポインタのポインタ?

教えてください

720 :デフォルトの名無しさん:2014/10/26(日) 11:55:37.68 ID:NHig/W5N.net
_State*を返す関数ポインタ

721 :デフォルトの名無しさん:2014/10/26(日) 12:45:51.44 ID:OKY31X3r.net
>>720
返り値がポインタってことか。ありがとうございます

722 :デフォルトの名無しさん:2014/10/26(日) 13:15:25.63 ID:IyPNYi4j.net
モダンC言語プログラミングってタイトルの本にまず突っ込みたくなるな

723 :デフォルトの名無しさん:2014/10/26(日) 13:30:50.51 ID:eoLX8RNk.net
>>719
そこでちょん切るな、その頭のアスタリスクは struct _State * の * だから
const struct _State *(*stop)(const struct _State *pThis);
全体で
stop は関数のポインタ、その引数は struct _State *、返り値は struct _State * 。

724 :デフォルトの名無しさん:2014/10/26(日) 22:41:16.50 ID:2UzQ9MnU.net
visual studio でのビルドについて質問です
boostを使ったコードをコード生成の設定をマルチスレッドにしてビルドしたいのですが、リンクエラーになってしまいます

マルチスレッドdllだとビルドは成功しますが、他のpcでもプログラムを使用したいのでマルチスレッドに設定してビルドしたいのです
どうすればいいでしょうか?

725 :デフォルトの名無しさん:2014/10/26(日) 22:44:30.13 ID:NHig/W5N.net
boostのビルドで runtime-link=static を付ける

726 :デフォルトの名無しさん:2014/10/26(日) 22:44:52.32 ID:USY7r1W5.net
boost自体望みの設定でビルドし直してみれ
たしかバイナリ配布では全部のビルド設定網羅しているわけではなかったはず

727 :デフォルトの名無しさん:2014/10/27(月) 19:48:59.26 ID:+HXmgeNl.net
さっそくaddress-model=64 runtime-link=staticでビルドし直しましたが、リンクエラーがたくさん出てきました
静的リンクの場合はどのライブラリディレクトリを使えば良いのでしょう?

728 :デフォルトの名無しさん:2014/10/27(月) 19:53:41.77 ID:SHa9u56N.net
エラーの内容を張れよ
内容でどの設定のライブラリとリンクしようとしているかわかるだろうに
なんでどいつもこいつもエラーの内容を隠したがるんだ

729 :デフォルトの名無しさん:2014/10/27(月) 20:00:32.39 ID:OMJ9cTFb.net
坊やだからさ。

730 :デフォルトの名無しさん:2014/10/27(月) 20:36:55.38 ID:USt2EpFv.net
ソースファイル名はtest.cppです
エラーが多すぎて全ては貼れそうにないのでエラーの一部です

1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libcpmtd.lib(wlocale.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "char * __cdecl std::_Allocate<char>(unsigned int,char *)" (??$_Allocate@D@std@@YAPADIPAD@Z) で参照されました。
1>libcpmtd.lib(xlocale.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
1>libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
1>test.obj : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
1>libcpmtd.lib(stdthrow.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
1>libcpmtd.lib(cin.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
1>libcpmtd.lib(cout.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
1>libcpmtd.lib(xwcsxfrm.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。
1>libcpmtd.lib(cout.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。
1>libcpmtd.lib(locale.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。

731 :デフォルトの名無しさん:2014/10/27(月) 20:40:43.75 ID:USt2EpFv.net
調べてみたところ静的にしたからといってライブラリディレクトリの変更は特にないようですね
どうしてエラーになるのでしょう?

732 :デフォルトの名無しさん:2014/10/27(月) 20:49:09.62 ID:jqalzcj4.net
使ってるライブラリはboostだけか?
boostでデバッグ版のlibも作ったか?

733 :デフォルトの名無しさん:2014/10/27(月) 20:50:09.36 ID:USt2EpFv.net
一部だと分からないかもしれないのでアップローダにアップしました
http://codepad.org/jP3gQ9dp

734 :デフォルトの名無しさん:2014/10/27(月) 20:51:41.63 ID:USt2EpFv.net
>>732
eigenも使っています
デバッグ版はオプションで指定するのでしょうか?

735 :デフォルトの名無しさん:2014/10/27(月) 20:53:52.42 ID:jqalzcj4.net
/MTdを指定しているか?

736 :デフォルトの名無しさん:2014/10/27(月) 20:56:50.75 ID:USt2EpFv.net
>>735
/MTになっていたので/MTdにしたところエラーが27個から22個に減りました!
デバッグ版はデフォルトで作成されるそうです

737 :デフォルトの名無しさん:2014/10/27(月) 21:11:58.39 ID:USt2EpFv.net
お騒がせしました、ビルドする際クリーンしていなかった事に気付きました
どうやら上手くいってしまったようです

738 :デフォルトの名無しさん:2014/10/27(月) 21:19:48.23 ID:qqJqOOtJ.net
ライブラリの競合の問題だろうな、と思っていたらやっぱりライブラリ関連のエラーだった
たしか、/MTと/MDを混在させると、この手のエラーが出てきたように思う
プロジェクトの設定を全部見直した方がいいよ

739 :デフォルトの名無しさん:2014/10/27(月) 21:26:36.69 ID:USt2EpFv.net
>>738
クリームしてなかったので混在してしまいあの競合エラーという分けですか、なるほど

740 :デフォルトの名無しさん:2014/10/28(火) 07:20:08.73 ID:4+xiP14a.net
混在クリームうまそう w

741 :デフォルトの名無しさん:2014/10/28(火) 09:49:40.37 ID:XK3wSZjJ.net
ぐちゃぐちゃだな
libc/msvcrt、release/debug
全部統一しろよボケ

742 :デフォルトの名無しさん:2014/10/30(木) 22:08:36.92 ID:xQhnjzo9.net
ターゲットがWindows、出力ソースがC++の字句/構文解析器を探しているのですが、何かお勧めがありましたら、教えてください。
(取り敢えず調べた結果)
ANTLR 3 → 出力してもコンパイルが通らないソースが吐き出される
ANTLR 4 → まだC++がサポートされていません。(Wikipediaだと対応しているような事が書いてあるけど、英文だと「まだだよ」と明記)
flex/YACC → 現状の最終候補。 LALRで書きやすいけど、エントリポイントから始まるマクロ周りが面倒くさい
Kareidoscope → よくよく調べたらC++の自作構文解析器(clangのチュートリアル)
なんで市販品もないんだろう、と昔から思うんだ。

もうxmlliteとか、自作構文解析器とか、もう嫌なんだ。

743 :デフォルトの名無しさん:2014/10/30(木) 22:11:07.19 ID:P+CVnAvq.net
parser generator caper

744 :デフォルトの名無しさん:2014/10/30(木) 22:29:15.01 ID:yXSIxH7q.net
boost::spirit::qiは?

745 :デフォルトの名無しさん:2014/10/30(木) 22:42:06.30 ID:P+CVnAvq.net
初心者にはムズすぎ

746 :デフォルトの名無しさん:2014/10/31(金) 15:26:37.90 ID:zWE6Wm7I.net
boost::xpressive
BNF完璧に実現できる
自己参照再帰、相互参照

747 :デフォルトの名無しさん:2014/10/31(金) 15:29:35.46 ID:zWE6Wm7I.net
自分で作るのがいやなんか
そりゃ気にいるの探せ

748 :デフォルトの名無しさん:2014/11/01(土) 16:49:44.50 ID:K52d2Agm.net
右辺値参照がよくわからんのですが、
// int X(){return 0;} があるとして、
int&amp; a = X(); // コンパイルエラー
int&amp;&amp; b = X(); // OK (ここまでは納得)
int&amp; c = b; // これがOKなのは、どういう理屈なんでしょうか?

749 :デフォルトの名無しさん:2014/11/01(土) 16:55:32.29 ID:kactCSG0.net
右辺値参照は作った後は左辺値になってしまうんじゃよ

750 :デフォルトの名無しさん:2014/11/01(土) 17:17:08.40 ID:K52d2Agm.net
なんと!超納得しました。
右辺値参照で渡された引数を他の関数に渡すときに move なり forward が明示的に要るのもそのためなんすね。

751 :734:2014/11/02(日) 11:41:23.60 ID:e1EY+Kds.net
ブーストは構文規則をc++で書くからキツイ。bnfで書かせて欲しい
カペルはまだ使ってないから試してみます
といいながら、構文解析器生成系を自作し始めた

取り敢えずLL(k)、字句に縛りを入れて作っている
車輪を作るために、金型を作り始めている気分

752 :デフォルトの名無しさん:2014/11/03(月) 09:01:52.06 ID:9+SOrZDL.net
配列ってメモリに連続的に配置されるそうですね
メモリ2枚刺しのpcで、配列をメモリ2枚にわたって使う時何か影響はありますか?

753 :デフォルトの名無しさん:2014/11/03(月) 09:04:49.19 ID:wj4A8VFW.net
いいえ

754 :デフォルトの名無しさん:2014/11/03(月) 09:50:58.64 ID:9+SOrZDL.net
ありがとう

755 :デフォルトの名無しさん:2014/11/03(月) 12:25:08.27 ID:TUb68F1+.net
>>752
>配列ってメモリに連続的に配置されるそうですね
論理的(プログラムから見たアドレス空間上)は連続して格納されますが
物理的(チップやメモリ・モジュール上)は連続して格納されるとは限りません。
インターリーブと呼ばれるメモリへのアクセスを高速化する技術があるためです。
というか最近のPCでデュアルチャネル以上のメモリ刺しを行う場合は、大抵、これです。
http://www.sophia-it.com/content/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%BC%E3%83%96

C/C++でプログラムを組む上では気にすることは殆どないとおもうけど
メモリ2枚刺しで影響があり得るとすれば、両方のメモリの特性を揃えておかないと
フルパフォーマンスを引き出せない事とか、かな。

756 :デフォルトの名無しさん:2014/11/03(月) 14:00:28.80 ID:9+SOrZDL.net
>>755
物理的に連続とは限らないのか、ふむふむ

757 :名前は開発中のものです。:2014/11/03(月) 15:15:46.09 ID:Ln7zQd5e.net
配列の要素数を求めるのに良く使う定番のマクロって
なんか落とし穴があるんだっけ?
どこかで読んだ記憶があるのだが具体的な内容を忘れてしまった

758 :デフォルトの名無しさん:2014/11/03(月) 15:19:40.73 ID:f1DnjkKs.net
_countof()の事?

759 :デフォルトの名無しさん:2014/11/03(月) 15:35:58.10 ID:TUb68F1+.net
>>756
で、さらにさらに言いますと。
もし仮想アドレス空間を提供するOSを使っていて、OSがページング方式を採用していれば
ページサイズを超える(仮想アドレス上の)連続データが、物理アドレス上で連続するとは限りません。
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6
これはメモリモジュール「何枚刺し」に関係しませんが。

760 :デフォルトの名無しさん:2014/11/03(月) 15:36:38.92 ID:L63Nb35F.net
>>756
プログラムから見て連続したアドレスに配置されればいい
大抵仮想メモリをサポートしているから仮想アドレスが連続してればOK
747が書いた技術とはな〜んも関係無い
仮想メモリと高速化を一緒にしちゃいかん

761 :デフォルトの名無しさん:2014/11/03(月) 15:50:15.48 ID:L63Nb35F.net
>>757
落とし穴ではないけど、たまに見かけるこれとか?

関数(int a[10])
{
… _countof(a) …
}

762 :デフォルトの名無しさん:2014/11/03(月) 16:17:41.46 ID:vIAe3tjG.net
>>757
_countofマクロの落とし穴といえばポインタのことだろう。
_countofマクロに配列ではなくポインタを渡すと誤った値が生成される

763 :デフォルトの名無しさん:2014/11/03(月) 16:19:51.78 ID:wj4A8VFW.net
VSの_countofならポインタ突っ込んだらコンパイルエラーになる

764 :デフォルトの名無しさん:2014/11/03(月) 17:07:01.24 ID:gzxZLKcA.net
cやc++の配列は使っていて未だに混乱する。今では殆どvectorを使うように
している。

765 :名前は開発中のものです。:2014/11/03(月) 20:11:02.59 ID:Ln7zQd5e.net
ポインタだったかな
構造体のパディングの都合で sizeof(array[0])が正しく
サイズを返さないことがあるとかだったような

勘違いしてるかも

766 :デフォルトの名無しさん:2014/11/03(月) 20:20:59.49 ID:vLChkxGX.net
>>766
std::arrayもいいぞ

767 :デフォルトの名無しさん:2014/11/03(月) 21:26:14.62 ID:hEttahKL.net
なに自分に言い聞かせてんだw

768 :デフォルトの名無しさん:2014/11/03(月) 22:56:26.18 ID:hJid5R30.net
>>765
勘違いと言うか、思い違いだろ。

769 :デフォルトの名無しさん:2014/11/05(水) 20:58:27.04 ID:zDHq5aQC.net
最近は高速化や低電力化のために
あえて計算ミスをする(許容する)演算器やプログラムの開発トレンドなんですってな
非可逆圧縮とかなら多少ミスってても大した問題にならないという発想らしい

770 :デフォルトの名無しさん:2014/11/05(水) 21:58:10.04 ID:exu9r2/K.net
ID:L63Nb35F
オッサン、ついて行けないんだったら 知ッタカでレスすんなや

771 :デフォルトの名無しさん:2014/11/05(水) 22:01:56.22 ID:TObpxnP7.net
errorと誤差の違いも分からないとは……

772 :デフォルトの名無しさん:2014/11/05(水) 23:19:09.09 ID:+x9XCqU/.net
error を訳すると「誤差」

773 :デフォルトの名無しさん:2014/11/06(木) 09:50:18.54 ID:guGhfN8S.net
>>770
何に対して突っ込んでいるのか全く分からんのだが…

774 :デフォルトの名無しさん:2014/11/08(土) 17:46:00.86 ID:j3tDfl0T.net
知ったかというよりは、長文をうまく読めずに明後日の方向に突っ込みを入れてるだけだしな

775 :デフォルトの名無しさん:2014/11/08(土) 20:09:04.23 ID:qgntwRxe.net
仮想アドレスでデータが連続していれば物理メモリ上でも連続と確信してるみたいだからな ページングの考えを知らないんだろう

776 :デフォルトの名無しさん:2014/11/08(土) 20:33:33.98 ID:om46DDyf.net
仮想アドレスで連続してれば「実用上はOK」って言ってるだけなら問題ないんじゃないの?
そして単一の配列は仮想アドレスで連続するのでOK、物理配置とか知ったこっちゃねぇ、と。

777 :デフォルトの名無しさん:2014/11/08(土) 20:47:10.43 ID:LpI+962Hc
0からC++勉強したいんですがお勧めのサイト、本などありますか?
ミジンコゼミナールいってもあまり分からない程度の能力です‥

778 :デフォルトの名無しさん:2014/11/08(土) 21:14:40.24 ID:qgntwRxe.net
744は物理デバイス上のデータの連続性に関わる質問だろ
自分勝手に「実用上」とか前提条件をすり替えていちゃ回答にならない

779 :デフォルトの名無しさん:2014/11/08(土) 22:57:32.68 ID:/FoPAlKV.net
勝手に前提条件作っててワロタ

780 :デフォルトの名無しさん:2014/11/09(日) 01:41:14.23 ID:Xu5ysykw.net
>>778
いまどきのメモリではどっちみち、連続配置しないけどな。

781 :デフォルトの名無しさん:2014/11/09(日) 09:38:16.91 ID:4XuJgnqb.net
だな。
ハードでインプリしとるのに、仮想アドレスが連続してればOK、とかワケ分からんわw
何がOKなんだ!と小1時間(ry

782 :デフォルトの名無しさん:2014/11/09(日) 10:52:55.54 ID:q0q68Vhk.net
>>778
752(念のため言うけど俺じゃないよ)が全く回答になってねぇってのは同感だけど、
それで767みたいな解釈はもっと斜め上だろ。回答になってない奴に変な濡れ衣着せてるだけにしか見えん。
>>779
そもそも質問の時点で連続配置って前提がおかしいからな、これ。

783 :デフォルトの名無しさん:2014/11/09(日) 11:50:33.60 ID:xhFguqYP.net
744は初心者が、単なるc言語の配列が仮想アドレス上に連続して確保されると言う話で、
pcにメモリモジュール2つさしたら、容量的に2枚に跨がるような大きい配列を作ることができるかと確認しているだけな気がするが。

784 :デフォルトの名無しさん:2014/11/09(日) 13:12:23.62 ID:T8NGFKFe.net
動的計画法で計算するときに使う変数名をよくdpにしているのを見ますが
入っているデータがなんなのかが全く分からない変数名で気持ち悪くないんでしょうか

785 :デフォルトの名無しさん:2014/11/09(日) 14:07:52.70 ID:dwdWovit.net
いちいち長い変数を名づけるのも書くのもめんどくさいし、長ければいいというものでもないし

786 :デフォルトの名無しさん:2014/11/09(日) 14:14:36.44 ID:T8NGFKFe.net
なぜ長いという前提になるのでしょう
それとも3文字以上の変数名は長いということ?

787 :デフォルトの名無しさん:2014/11/09(日) 14:22:06.61 ID:J7KzW8BR.net
クラスのメンバー変数名とそれ以外の変数名は区別する派?しない派?
しない人はどう区別してるん?

788 :デフォルトの名無しさん:2014/11/09(日) 14:36:28.96 ID:dwdWovit.net
this->つければいいだけだし‥

789 :デフォルトの名無しさん:2014/11/09(日) 15:46:02.44 ID:Bt9f9JFw.net
コンストラクタの引数名とメンバー変数名
が全く同じでもビルド出来るので実害は無いけれど、何と無く嫌なので
this->hensu=hensu_
みたいな余分な_を付ける私は心配性
ですか?本当は付けたく無いんですが。
_付きの変数って見た目が変ですよね。
髭が生えているというか鼻毛が伸びているというか不潔な感じ。

790 :デフォルトの名無しさん:2014/11/09(日) 20:55:17.16 ID:a0MM04w4.net
class Hoge; // operator new が定義されているクラス
Hoge* p = static_cast<Hoge*>(Hoge::new(sizeof(Hoge))); // 領域だけ確保
// 色々やる
::new(p) new Hoge(); // placement newでコンストラクタ呼び出し
// 色々やる
delete p; // deleteで普通に削除

ってやるのってNGなんすかね?
通常のnewで取得していないものを通常のdeleteに渡す辺りとか。
領域確保した上でコンストラクタの呼び出しを遅延させたいんですが…。

791 :デフォルトの名無しさん:2014/11/09(日) 20:56:52.03 ID:a0MM04w4.net
あ、delete から呼び出される operator delete は operator new と当然対応しているとして。

792 :デフォルトの名無しさん:2014/11/09(日) 21:21:00.60 ID:cg8/k+y/.net
>>790
boost::in_placeとか使えば

793 :デフォルトの名無しさん:2014/11/09(日) 21:36:43.66 ID:tM1v0fJH.net
>>790
> 領域確保した上でコンストラクタの呼び出しを遅延させたいんですが…。
そういうことをやりたければC++でもmalloc/freeで領域確保する

> 通常のnewで取得していないものを通常のdeleteに渡す辺りとか。
まわりまわって最終的にメモリ確保と解放の対応が正しければ問題にならなかったりするけど
基本的には問題ありでNG

794 :デフォルトの名無しさん:2014/11/09(日) 22:12:05.36 ID:a0MM04w4.net
>>792 調べてみます。
>>793 通常のdeleteで削除する部分が諸事情で変更できないので、難しそうっすね。ともあれNGコードは避けときます。
あざーす

795 :デフォルトの名無しさん:2014/11/10(月) 03:46:28.21 ID:x8aX3rE8.net
>>793
>基本的には問題ありでNG
この部分よくわからない、new と delete が対になっておればなんら問題ないはず?
なんで NG なんだ?

796 :デフォルトの名無しさん:2014/11/10(月) 09:59:35.70 ID:e6eP1AW5.net
スマポ使おうってことじゃ

797 :デフォルトの名無しさん:2014/11/10(月) 10:21:56.54 ID:5fw2t1kv.net
そもそも規格レベルで厳密にいうならnew式で確保したわけではないポインタをdelete式で使えば未定義動作

5.3.5 Delete
> (略) In the first alternative (delete object), the value of the operand of delete may be a null pointer value,
> a pointer to a non-array object created by a previous new-expression,
> or a pointer to a subobject (1.8) representing a base class of such an object (Clause 10).
> If not, the behavior is undefined. (略)

798 :デフォルトの名無しさん:2014/11/10(月) 12:52:28.73 ID:zRrCT9U7.net
>>797
>>790 の Hoge::new の中に new があれば、規格に合致しているわけだよね
結局、ふつうにnewしてplacement new を被せれば OK ということか?

799 :デフォルトの名無しさん:2014/11/10(月) 13:23:46.80 ID:ADaLq/i0.net
訳の分からん解釈してる奴がいるから書いとく。

> 論理的(プログラムから見たアドレス空間上)は連続して格納されますが
> 物理的(チップやメモリ・モジュール上)は連続して格納されるとは限りません。
> インターリーブと呼ばれるメモリへのアクセスを高速化する技術があるためです。
↑は2枚刺しは「インターリーブ」のために物理的に連続しないよって言ってるんでしょ?

連続性で考えた場合、
・論理(仮想)アドレスの連続性
・物理アドレスの連続性
・物理的な連続性
があり、上記の回答では「論理(仮想)アドレスの連続性」と「物理的な連続性」について
言っているように見える。
しかし、「物理的な連続性」について言うなら、通常チップ単位でみたら1つの
チップでは1ビットが連続しているだけであって、バイト単位で保持されている
わけじゃない。
だから、インターリーブの話以前に(1枚であっても)物理的に連続しているとは
言えないわけだ。
(物理的な話が「メモリ・モジュール」だけならそんなに気にしなかったんだけど、
「チップ」まで書いているから、「物理的な連続性」の話として解釈した)
でも、質問者の意図を(想定されるスキルから)考えて、そこには無いと考え
(物理的なことは気にせず)仮想アドレスが連続していればいいと書いた。

800 :デフォルトの名無しさん:2014/11/10(月) 16:46:12.24 ID:8QediavH.net
おい、バイト単位なんてどこのだれが言い出したんだ!

801 :デフォルトの名無しさん:2014/11/10(月) 18:06:53.74 ID:tFlOeqoP.net
質問です:

void f (void (A::*)() const &amp;) {}

は、関数f の定義らしいのですが、引数の型が良く分かりません。
どういうことでしょう。

そもそも、定義だとすると、引数には型だけでなく、仮引数名が必要のはずですが、
それも省略されているように思えます。コンパイラによっては、関数定義内部で使わ
ない引数は、仮引数名を書いておくと警告が出てしまうので、仮引数名を省略することに
よって回避できるようですが。

A::* は、メンバへのポインタのようです。

const &amp; の部分が一番分かりません。(A::*) の部分は、関数へのポインタのように思え、
その次の()は、その関数の引数の括弧で引数が無い場合のもののようです。その次に
const だけなら理解可能ですが、さらに &amp; となるとこんなものは無い様に思えます。

802 :デフォルトの名無しさん:2014/11/10(月) 18:09:51.53 ID:tFlOeqoP.net
「&amp;」の部分は、単に半角の「&」です。
単に「&」を書いたのですが、投稿時にこうなってしまったようです。

803 :デフォルトの名無しさん:2014/11/10(月) 18:16:10.85 ID:tFlOeqoP.net
もしかすると、

void (*&rpFunc)() const を
void (*)() const &rpFunc

と書く記法でもありましたでしょうか??

804 :デフォルトの名無しさん:2014/11/10(月) 18:22:12.55 ID:H0dF1SvN.net
constメンバ関数なんじゃね

805 :デフォルトの名無しさん:2014/11/10(月) 18:26:18.54 ID:tFlOeqoP.net
>>804
void (A::*)() const
であればそうでしょうが、実際は、
void (A::*)() const &

のように、最後に&が付いてます。

806 :デフォルトの名無しさん:2014/11/10(月) 18:30:58.08 ID:hfbf+gmf.net
揚げ足取りというか重箱の隅を突きまくって、後付け講釈で粘着する奴がいるな
いい加減に他所でやれ

807 :デフォルトの名無しさん:2014/11/10(月) 18:37:05.73 ID:tFlOeqoP.net
最近のC++の仕様で、

class A {
 void func1() const &;
};

というようなメンバ関数 func1() を記述できるとすれば理解可能ですが。

808 :デフォルトの名無しさん:2014/11/10(月) 18:44:07.22 ID:tFlOeqoP.net
>>807 で正しいようです。

「Ref-qualified member functions」

なる仕様がC++11で追加されてたようです:

http://en.cppreference.com/w/cpp/language/function
http://stackoverflow.com/questions/19474374/what-is-the-purpose-of-ref-qualified-member-functions

809 :デフォルトの名無しさん:2014/11/10(月) 23:19:51.02 ID:I2gnUofF.net
>>800
仮想アドレス以外連続する保障がなくて、連続しないものを全部数え上げたらバイトも入ったってだけじゃね?
ビット単位、バイト単位、チップ単位、モジュール単位、物理アドレス、仮想アドレス、連続するのは仮想だけ。

810 :デフォルトの名無しさん:2014/11/11(火) 10:08:04.62 ID:6g8qZa7F.net
これが駄目なのはどうして
http://codepad.org/OkeujLvX
this->が付いた時点で関数ポインタにはもう戻せないんですか

811 :デフォルトの名無しさん:2014/11/11(火) 10:12:02.23 ID:6g8qZa7F.net
ごめん関数ポインタのtypedefが間違えてた...

812 :デフォルトの名無しさん:2014/11/12(水) 09:26:17.12 ID:+hAxVh0F.net
仮想関数テーブルについてですが:
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB

class B2
{
public:
 virtual void f2() {}
 int int_in_b2;
};

class D : public B1, public B2
{
public:
 virtual void d() {}
 virtual void f2() {} // B2::f2() をオーバーライド
 int int_in_d;
};

virtual method table of B2:
+0: B2::f2()
+4: B2::~B2()

virtual method table of D (for B2):
+0: D::d()
+4: D::f2() // B2::f2() is overridden by D::f2()
+8: D::~D()

の部分、B2::f2() と D::f2() の位置(エントリー)がずれていませんか?

813 :デフォルトの名無しさん:2014/11/12(水) 09:30:08.28 ID:+hAxVh0F.net
補足:
「D *d = new D();
 B1 *b1 = dynamic_cast<B1*>(d);
 B2 *b2 = dynamic_cast<B2*>(d);
 
 d と b1 が実行時に同じメモリ位置を参照するが、 b2 は d+8 (d のメモリ配置
 の 8バイト後方)を示す。 そのため、b2 は d 内の B2 らしく見える領域、
 すなわち B2 のインスタンスと同じメモリレイアウトを持つ部分を示す。」

英語版Wikipediaでは:

d:
+0: pointer to virtual method table of D (for B1)
+4: value of int_in_b1
+8: pointer to virtual method table of D (for B2)
+12: value of int_in_b2
+16: value of int_in_d

Total size: 20 Bytes.

virtual method table of D (for B1):
+0: B1::f1() // B1::f1() is not overridden

virtual method table of D (for B2):
+8: D::f2() // B2::f2() is overridden by D::f2()

となっており、DのB2用のvtableの D:f2() の位置がまた違っている。

日本語版では、+4の位置なのに、英語版では+8の位置。
自分の考えでは、「+0」が正しい位置のように思えます。

814 :デフォルトの名無しさん:2014/11/12(水) 09:44:44.73 ID:F2eOZHeQ.net
そんな実装によって変わるものをいちいち調べてどうしたいんだ?

815 :デフォルトの名無しさん:2014/11/12(水) 10:02:55.65 ID:+hAxVh0F.net
コンパイラ関係ツールを作成するため。

816 :デフォルトの名無しさん:2014/11/12(水) 12:10:45.75 ID:Z7AJFaDD.net
自分でコンパイラを作るのなら自分で決めればいい。
既存のコンパイラの出力結果に何かしたいのなら
それに合わせないといけない。

Wikipediaは履歴を見れば分かるけど日本語版は英語版の
2008年前半頃のままっぽい。
英語版でも過去には「+0」と記述されている。
結局は自分で調べるしかないと思う。

817 :デフォルトの名無しさん:2014/11/12(水) 13:10:18.81 ID:XEt4RGec.net
Bのポインタに対してBのvtblを見て
Dのポインタに対してDのvtblを見るならそれで足りるんじゃないの

818 :デフォルトの名無しさん:2014/11/13(木) 21:05:08.87 ID:5RyPxF5Z.net
>>817


819 :デフォルトの名無しさん:2014/11/14(金) 16:38:56.33 ID:y3t1ubsg.net
>>816
やはり何かの間違いかもしれませんね。

狂いが生じている理由について、
「vtable全体 [virtual method table of D (for B2)]」の先頭アドレス
とオブジェクトに書かれている
「vtable へのポインタ」 // +8: pointer to virtual method table of D (for B2)
とがずれている可能性があることです。

「vtable全体」には、「RTTI情報へのポインタ」と、「オブジェクト全体の先頭アドレスへの
オフセット」のようなものが先頭付近にあり、その後に仮想メンバ関数のアドレス・テーブルが
あるようで、オブジェクトに書かれている vtable へのポインタは、後者のアドレス・テーブル
の先頭アドレスをさしている可能性があります。

vtable 全体:
+0 オブジェクト全体の先頭アドレスへのオフセット
+4 RTTI情報へのポインタ
----仮想メンバ関数のアドレス・テーブルの先頭----
+8 仮想関数1のアドレス
+12 仮想関数2のアドレス
・・・

これがWikipediaの記述がおかしくなっている理由ではないでしょうか。

820 :デフォルトの名無しさん:2014/11/14(金) 21:17:02.31 ID:UbygtGe4.net
英語版でもInvocationでは+0で扱ってるんだから素直に記事修正のミス・不徹底だろ

821 :デフォルトの名無しさん:2014/11/14(金) 23:20:09.48 ID:vEy7KEZr.net
「Invocation」って何のことですか?

辞書的にはいくつか意味がありますが、そのうちの

「〔権威あるものに対する〕嘆願、訴え」

のこと、つまり、「修正要請」のことですか?

822 :デフォルトの名無しさん:2014/11/15(土) 00:20:36.40 ID:jAtUM3ml.net
英語版での話も出てるのに英語版の仮想関数テーブルのページ読んでないのか

823 :デフォルトの名無しさん:2014/11/15(土) 17:09:11.92 ID:EFct/v5k.net
>>821
呼び出すとか起動する、の invoke 名詞化
ttp://codic.jp/entries/invoke

824 :デフォルトの名無しさん:2014/11/17(月) 23:42:34.25 ID:LwbKAExF.net
>>822-823 なるほど。そっちの事でしたか。

>>820
そういえば、そのinvocationの部分を読んでみると、英語版では、
ちゃんと:

(*((*d)[0]))(d)

(*(*(d[+0]/*pointer to virtual method table of D (for B1)*/)[0]))(d) /* Call d->f1() */
(*(*(d[+8]/*pointer to virtual method table of D (for B2)*/)[0]))(d+8) /* Call d->f2() */

となっているのに、日本語版では:

*((*d)[0])(d)

*((d->/* Dの(B1用の)仮想関数テーブルへのポインタ*/)[0])(d)
*((d->/* Dの(B1用の)仮想関数テーブルへのポインタ*/)[12])(d)
*((d->/* Dの(B2用の)仮想関数テーブルへのポインタ*/)[0])(d+8)

となっていて、わけ分からんことになってますね。

* を囲う() がないと、関数呼び出しだとわからない。
最初見たとき関数呼び出しっぽいが、よく理解できないと思ったんですが、
英語版だとちゃんと理解できる(正しい)表記になっていますね。

825 :デフォルトの名無しさん:2014/11/18(火) 00:40:09.64 ID:dTS5KRdo.net
gdgdと
他人任せにせず自分で改訂しろよ
そのためにwikipediaだろ

826 :デフォルトの名無しさん:2014/11/18(火) 23:23:49.07 ID:AfINYphq.net
>>825
Wikipediaがなければ、今頃 gcc の vtable について書かれた書籍でもあった
かも知れないのに、Wikipediaがあることによって書籍を出版することが出来
なくなってしまっている可能性がある。
つまり、Wikipediaに書く人がいればいるほど、良質の情報源が減る可能性
がある。

827 :デフォルトの名無しさん:2014/11/18(火) 23:27:30.77 ID:oZpUE+lI.net
wikipedia以下の書籍なんて存在する価値ないから
問題ない

828 :デフォルトの名無しさん:2014/11/19(水) 00:38:36.69 ID:lnFQGeQL.net
>>826
wikipedia無かったら質が下がると思うが

829 :デフォルトの名無しさん:2014/11/19(水) 01:10:00.51 ID:Z4qTxOUt.net
>>828
心配しなくても、Wikipediaが存在しなかったはるか昔から、書籍の質は
高かった。

>>827
質が高くても、現実には売り上げが減るかも知れないんだよ。

830 :デフォルトの名無しさん:2014/11/19(水) 02:50:47.75 ID:uIresU5p.net
gccのソース読めよ。なんのためのオープンソースだよ。

831 :デフォルトの名無しさん:2014/11/19(水) 21:23:57.97 ID:dkgYBCwc.net
>>829
糞みたいな本多いじゃん

832 :デフォルトの名無しさん:2014/11/19(水) 22:53:15.93 ID:QB/q/+7G.net
wikipediaって、そんなに良質でもないじゃん。
更新されない集合知は、腐るのも早い。

833 :デフォルトの名無しさん:2014/11/19(水) 22:59:52.26 ID:QB/q/+7G.net
ごめん。 もう一言だけスレを汚させて。

ビューロクラットだか、記事評論家だか知らないが、
荒しの如くに「要出典」のコメントだけ付けて訂正編集しない連中が、選挙で利権を争う姿を見ていると、吐き気がするんだ。
【お前らの方が荒しだろ】って言いたかった。

スレ汚しすまん。

834 :デフォルトの名無しさん:2014/11/20(木) 00:24:36.16 ID:TrsJQyqJ.net
>>833
ウィキペディアは独自研究を発表する場ではありません。

835 :デフォルトの名無しさん:2014/11/20(木) 08:29:57.39 ID:MP59TUjQ.net
>>834
いやいや
そこを否定したらwiki全否定だから

836 :デフォルトの名無しさん:2014/11/20(木) 08:46:57.29 ID:TrsJQyqJ.net
>>835
そこ?
ウィキペディアは何ではないか を読んで出直してこい

837 :デフォルトの名無しさん:2014/11/20(木) 10:24:21.11 ID:pjiqM021.net
>>835
ウィキペディアの記事によっては、冒頭で、
「独自の研究と思われる文章が‥云々 出典を明示して下さい」みたいな注意書きが入る

838 :デフォルトの名無しさん:2014/11/20(木) 10:30:25.85 ID:R6MHdiw+.net
wikiぺは、ちまたにころがってる「判明・確定していること」を一括してタグ付きにすることで事典にする、っていう感じだよね?

839 :デフォルトの名無しさん:2014/11/20(木) 11:10:06.13 ID:3nar01e/.net
好き勝手書いていいのはアンサイクロペディアやで
ユーモアがないと怒られるが

840 :デフォルトの名無しさん:2014/11/20(木) 15:15:38.65 ID:OMlJz/ud.net
テスト

841 :デフォルトの名無しさん:2014/11/20(木) 21:58:39.73 ID:pv69b1+R.net
cuda c/c++についての質問です
syncthreadsとthreadfence_blockの違いが分かりません
syncthreadsだけで十分な気がします

842 :デフォルトの名無しさん:2014/11/21(金) 08:32:39.90 ID:iFQePu0O.net
>>841
CUDAスレへどうぞ。
あなたがそれで充分だと思ったのなら、あなたには必要のない違いなのでしょう。

843 :デフォルトの名無しさん:2014/11/23(日) 02:13:40.97 ID:ZuX0TPwi.net
>>839
和んだ

844 :デフォルトの名無しさん:2014/11/24(月) 21:44:10.26 ID:2E7YTyCe.net
オリジナルのクラス配列を持つクラスを作ったのですが、
その配列のメンバ変数にアクセスしようとすると
NullReference が出てしまいます。

クラス1
 public クラス2[] array = new クラス2[3];

クラス2
 public int number = 0;

使う時(エラーになる)
 クラス1.クラス2[0].number = 999;


こんな感じです。
ビルドエラーは出てないのですが、
999 を入れるときに
Null Reference になります。

原因がわかる人いたら教えて下さい。

845 :デフォルトの名無しさん:2014/11/24(月) 21:46:01.72 ID:2E7YTyCe.net
大事なところを間違えました

使う時(エラーになる)
 クラス1.array[0].number = 999;

846 :デフォルトの名無しさん:2014/11/24(月) 21:47:37.74 ID:t3vESlZp.net
スレチ
C++/CLIのスレに行きなさい

847 :デフォルトの名無しさん:2014/11/24(月) 21:48:28.69 ID:U0unJI5C.net
クラス2用の配列作っただけじゃダメで、array[0]=new クラス2()がいる

848 :デフォルトの名無しさん:2014/11/24(月) 22:05:59.29 ID:2E7YTyCe.net
>>847
出来ました!
ありがとうございます、ありがとうございます!

>>846
ごめんなさい、その区分けすらわからんのです。
ちなみに unity です。
unity スレで聞くと初歩的過ぎて怒られそうだったので。

849 :デフォルトの名無しさん:2014/11/24(月) 22:16:33.93 ID:ZSGM05eV.net
>>14
ん…?Unityって確か

・UnityScript: JavaScriptをベースに拡張
・Boo: Pythonをベースに(ry
・C#

の3言語じゃないっけ?ここはC/C++のスレだよ?
C#スレの誤爆?

850 :デフォルトの名無しさん:2014/11/24(月) 22:17:28.08 ID:ZSGM05eV.net
ごめんアンカミス、>>848
14ってどこだ俺…?

851 :デフォルトの名無しさん:2014/11/24(月) 22:40:50.39 ID:ALHBj7yp.net
>>849
>>846が言ってるのはそういうことだと思うぞ

852 :デフォルトの名無しさん:2014/11/24(月) 23:42:17.40 ID:ZSGM05eV.net
>>851
/CLIのスレでもスレチじゃね…って話でもあるよ

853 :デフォルトの名無しさん:2014/11/30(日) 21:05:49.36 ID:1fWIVRzv.net
VS2012expressで
C++をやっていたらいつの間にか
C++/CLIの領域に踏み込んでいました。
これはMSの罠ですか?

854 :デフォルトの名無しさん:2014/11/30(日) 21:29:21.63 ID:CJTIqzdj.net
>>853
そう、おっちょこちょいトラップだよ
はまった奴は君が初めてだけど w

855 :デフォルトの名無しさん:2014/12/03(水) 19:52:09.05 ID:+vZq9aBDp
ファイル操作で開いたファイルの中身を一部削除するにはどんな関数を使えばいいのでしょうか
上書きや追記と違い中々見つからないので質問します

856 :デフォルトの名無しさん:2014/12/03(水) 20:04:59.05 ID:tn8Qtf24.net
うっかりscの方に書いてしまったのでこちらに書き直します

ファイル操作で開いたファイルの中身を一部削除するにはどんな関数を使えばいいのでしょうか
上書きや追記と違い中々見つからないので質問します

857 :デフォルトの名無しさん:2014/12/03(水) 20:14:52.34 ID:U2a4HdIu.net
>>856
自分で読み込んで自分で加工し自分で上書きするしかない

858 :デフォルトの名無しさん:2014/12/03(水) 20:15:20.42 ID:U2a4HdIu.net
ああ、メモリマップドファイルという手はあるな‥

859 :デフォルトの名無しさん:2014/12/03(水) 20:20:33.13 ID:GXUScfW3.net
メモリマップドファイルって削除した部分詰めれたりするの?

860 :デフォルトの名無しさん:2014/12/03(水) 20:21:29.03 ID:U2a4HdIu.net
いや、それはないな‥

861 :846:2014/12/03(水) 20:25:58.02 ID:tn8Qtf24.net
>>857
一度増えたビットは変更は出来ても新規で作り直さない限り減らせないのでしょうか

862 :デフォルトの名無しさん:2014/12/03(水) 20:34:35.50 ID:o987ZOaf.net
Unixならtruncate
WindowsならSetEndOfFile

863 :846:2014/12/03(水) 20:39:45.34 ID:tn8Qtf24.net
>>862
truncate、まさに探していたものです!ありがとうございます

864 :デフォルトの名無しさん:2014/12/03(水) 21:25:20.86 ID:5dbPIVbA.net
それは一部削除じゃなくてファイルサイズを縮めるだけだから
途中のデータを消して詰めたいのなら、やっぱり読み直して
書きなおした後で縮めないといかんです。

865 :846:2014/12/04(木) 00:16:00.50 ID:247S7oEQ.net
自分の環境ではtruncateは使えなかったのでfilenoとchsizeを使ったらうまく行きました
truncateを知らなければ見つけられなかったと思います。ありがとうございました

866 :デフォルトの名無しさん:2014/12/06(土) 00:05:51.34 ID:q7blqefO.net
intが戻るlog_a関数ってありませんか
やりたいことは

const int SIZE=4;
int a[SIZE]; //4
int b[log_2(SIZE)]; //2

のように配列を確保することです

867 :デフォルトの名無しさん:2014/12/06(土) 00:10:43.84 ID:iExVqmns.net
キャストすれば

868 :デフォルトの名無しさん:2014/12/06(土) 00:22:43.82 ID:tAcOC+EO.net
>>866
http://stackoverflow.com/questions/2255177/finding-the-exponent-of-n-2x-using-bitwise-operations-logarithm-in-base-2-o

869 :デフォルトの名無しさん:2014/12/06(土) 01:33:34.59 ID:q7blqefO.net
>>867
キャストじゃlogの出力が3.99999みたいになったとき3になるじゃないですか
>>868
ありがとうございます
まだよく読んでないですが参考にしてみます

870 :デフォルトの名無しさん:2014/12/06(土) 01:59:18.66 ID:K1bvfHJP.net
自分でconstexpr関数書けばいい
その用途向けならたいして難しくないだろう

871 :デフォルトの名無しさん:2014/12/06(土) 02:07:36.09 ID:q7blqefO.net
constexprは避けて通ってきてましたがループ使えるようならそれやってみます

872 :デフォルトの名無しさん:2014/12/06(土) 11:49:32.16 ID:u7jjfD/c.net
intが戻るlog_a関数を探してるのに戻りが3.99999から3になるのが嫌?とんちですか?

873 :デフォルトの名無しさん:2014/12/06(土) 12:15:07.99 ID:pl1CQQsq.net
四捨五入して欲しいんじゃね?

874 :デフォルトの名無しさん:2014/12/06(土) 13:17:45.73 ID:SX3gYLWG.net
領域確保に使うんだから切り上げでないとダメだろ

875 :デフォルトの名無しさん:2014/12/06(土) 13:42:50.79 ID:BM1MQEaE.net
四捨五入なら0.5切り上げなら1足してintにすればええやん…

876 :デフォルトの名無しさん:2014/12/06(土) 13:54:13.87 ID:pl1CQQsq.net
○○したらいいってのは女の子が嫌がる言い方やで

877 :デフォルトの名無しさん:2014/12/06(土) 15:54:32.51 ID:s2cU1r59.net
>>868でlog_2はビットカウントだと指摘されてるのに延々と何を議論しているのだ?

878 :デフォルトの名無しさん:2014/12/06(土) 16:00:43.05 ID:FWmjRtxd.net
>>872
その例通りだとすると、log2(16)で3が返ってきたらいやだろう

879 :デフォルトの名無しさん:2014/12/06(土) 19:51:04.38 ID:0URk8sf5.net
>>876
なんでやねんどういえばいいねん?

880 :デフォルトの名無しさん:2014/12/06(土) 22:39:06.28 ID:FKpX6QxP.net
それって「キミの好きなほうでいいと思うよ」的なことやろ?

881 :デフォルトの名無しさん:2014/12/07(日) 06:56:34.45 ID:8JlYHdxZ.net
この子ならこうするだろうなってのを予測して当てに行って当たれば好印象やで

882 :デフォルトの名無しさん:2014/12/07(日) 08:31:29.57 ID:68yN0EBG.net
>>879
○○が君にはふさわしいねって言えばいんじゃね?

883 :デフォルトの名無しさん:2014/12/07(日) 09:39:40.27 ID:bfkTF4nN.net
>>872
そもそもcmathのlogって領域確保に使えなくね?

884 :デフォルトの名無しさん:2014/12/07(日) 13:06:03.34 ID:yTMn9VdC.net
>>883
理由書かないと単なるバカに見えるぞ
書いてもバカのままかもしれないけど

885 :デフォルトの名無しさん:2014/12/07(日) 18:56:30.56 ID:68yN0EBG.net
>>883
戻り値をどう使いたいかに依るね。
だから、「使えない」という判断は明らかな誤りだな。
明白な誤謬を犯すような人間は自分で自分を馬鹿だ
と証明したことになる。

886 :デフォルトの名無しさん:2014/12/08(月) 00:18:54.52 ID:DldRzckq.net
そういう馬鹿っぽい口調も不快だからやめて欲しいです。

887 :デフォルトの名無しさん:2014/12/08(月) 21:41:30.45 ID:g1yYihY2.net
C++/cli からC++のプロジェクトに定義している関数を呼び出したいんです。
C++プロジェクトのlibファイルを参照し、includeファイルをC++/cli側に
持ってきて#include すると、物凄い数のエラーがでます。

(C2011:C2079:C2504:C3395:C3699)

[1] C++/cliで参照できるよう、ビルドエラーを直すしかない

[2] 別の方法でC++の関数をビルドエラー無しに参照できる。

ちなみに、C++の関数を参照しないで自作・・・という回答は無しでお願いします。

888 :デフォルトの名無しさん:2014/12/08(月) 23:38:12.56 ID:2IK4zUKL.net
くだすれC++/CLI(初心者用)part2
http://peace.2ch.net/test/read.cgi/tech/1268613679/

889 :877:2014/12/09(火) 00:21:33.60 ID:xpR1dfQS.net
>>888
ありがとうございます。ではそちらのスレで質問させていただきます。

890 :デフォルトの名無しさん:2014/12/21(日) 12:53:52.93 ID:+qwmhbzu.net
どなたかwinでhttps://github.com/pornel/giflossyうまく作れるか試してもらえませんか
当方環境(vista 32bit)ではgifwrite.cに問題があるようでVC、bcc共にダメでした
適切なスレがあればご誘導下さい

891 :デフォルトの名無しさん:2014/12/21(日) 13:05:34.28 ID:HpxqpUIE.net
>>890
http://ja.stackoverflow.com/

892 :デフォルトの名無しさん:2014/12/21(日) 14:14:34.29 ID:S+pWOghM.net
日本語あったのか

893 :デフォルトの名無しさん:2014/12/25(木) 20:48:16.11 ID:/j+MCuLw.net
すみません、この問題の答え大至急教えてください><

現在の地域時間から15時間後の日時を表示するプログラムを作成しなさい。
表示形式は日付と時間が表示されれば、自由とする。

894 :デフォルトの名無しさん:2014/12/25(木) 20:59:19.24 ID:PIT60xPK.net
宿題スレにいけ

895 :片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 21:03:12.54 ID:gEw73of1.net
>>893
#include <stdio.h>
#include <time.h>
main(){
time_t t = time(NULL);
t *= 15*60*60;
puts(ctime(&t));
}

896 :デフォルトの名無しさん:2014/12/25(木) 21:07:20.41 ID:/j+MCuLw.net
>>895
ありがとうございました!

897 :片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 21:38:58.78 ID:gEw73of1.net
>>895 訂正。
×t *= 15*60*60;
○t += 15*60*60;

898 :デフォルトの名無しさん:2014/12/25(木) 23:08:26.83 ID:2tgECDMq.net
>>897
いまideoneで試したんだけど…

t += 15*60*60; だと
http://ideone.com/nYtNBt
Sat May 13 11:57:08 2000 ← 2000年 ???

t += (time_t)15*60*60; だと
http://ideone.com/MHmlGA
Fri Dec 26 06:13:18 2014

になります。
ideoneのコンパイラのバグ?

899 :デフォルトの名無しさん:2014/12/26(金) 00:10:39.23 ID:qv+SuoRH.net
if文の処理の重さについて質問です。入れ子状にif文を書くパターンと1行で書くパターン
if(a==1){
 if(b==1)}
  if・・・{
   〜
  }
 }
}

if((a==1)&&(b==1)&&(・・・{
 〜
}
って条件が2,3個だったら大して違いはなさそうな気はしますが
条件の数が多ければ多いほど上の方が軽いように思ってますけどあってますか?

900 :デフォルトの名無しさん:2014/12/26(金) 00:23:53.69 ID:rmtyj285.net
time_tの実装が違うのかも。

901 :デフォルトの名無しさん:2014/12/26(金) 00:30:09.80 ID:0K0HmtAp.net
>>899
環境(コンパイラ)によると思われるが(おそらく)同じ。

入れ子の場合、aが0以外なら一番外側の if(...){} の次の命令にジャンプするわけだが
1行で書いた場合も、その書き方なら a を判定し偽だったら if(...){} の次の命令にジャンプする。

つまりどちらでも偽判定になった時点で if を抜けるので結果は同じ。

902 :デフォルトの名無しさん:2014/12/26(金) 00:36:15.23 ID:qv+SuoRH.net
>>901
下の方は途中の結果関係なく全部参照して真偽を見ると勝手に思っていました
ありがとうございました

903 :デフォルトの名無しさん:2014/12/26(金) 01:53:43.48 ID:EqAHHrNc.net
C言語の&&,|| は短絡評価だから、使うと危ないぞ!

A && B、A || B
で、後ろの文のBに、副作用がある場合、
その副作用が実行されるかどうかわからないから、
こういうプログラミングをすると危ないぞ。使うなよ

904 :888:2014/12/26(金) 02:09:02.52 ID:hkDjJ4P3.net
>>900
ideoneのコンパイラのバグでしょうね…

何度か確認したら、>>898
> http://ideone.com/nYtNBt
> http://ideone.com/MHmlGA
両方共、実行するたびに2000年だったり2014年だったりバラバラでした。

https://paiza.io/projects/Syg0Sx2VaGtnliDMaAkBiw
の方は、ちゃんと2014年だけ出ますが。

905 :デフォルトの名無しさん:2014/12/26(金) 02:12:25.35 ID:nS4v0Az9.net
>>903
副作用って何だよ?
A && B、A || B
って書いても問題ないだろ。

906 :デフォルトの名無しさん:2014/12/26(金) 02:28:00.48 ID:hkDjJ4P3.net
>>905
例えば
 int f1 = func1(), f2 = func2(); // 必ず実行すべき処理 1, 2
 if(f1 || f2)
 {
  //…
 }
ならば必ず func2() が実行されるけど、

 if(func1() || func2())
 {
  //…
 }
だと func2() が実行されなくて問題だ。ということでしょう。

907 :デフォルトの名無しさん:2014/12/26(金) 02:32:02.65 ID:hkDjJ4P3.net
付け加えると、>>906の例で || ではなく && の時、
後者の判定式だと func1() の結果がゼロ(偽)だったら
func2() が実行されない

908 :デフォルトの名無しさん:2014/12/26(金) 02:34:02.11 ID:hkDjJ4P3.net
訂正
>>906
× > だと func2() が実行されなくて問題だ。ということでしょう。
○ > だと func1() が真だったとき func2() が実行されないので問題だ。ということでしょう。

909 :893:2014/12/26(金) 02:48:04.42 ID:EqAHHrNc.net
A && B、A || B

副作用とは、何かの状態が変わってしまうこと。
変数を更新してもいけない

MISRA-C 2004 ルール12.4 で、
&&,||の右側のオペランドに、
副作用があってはならないと規定されている

短絡評価で、Bが実行されたりされなかったりするが、
それを知らないプログラマーもいて、
Bが常に実行されると勘違いしている人もいるから、
この書き方を使うなと

910 :デフォルトの名無しさん:2014/12/26(金) 03:58:33.04 ID:D07w3ybz.net
短絡評価を知らないプログラマーは排除すべきだろ。
そうでないと、if (pointer != NULL && * pointer != 0)みたいなコードも書けなくなる。

911 :デフォルトの名無しさん:2014/12/26(金) 10:44:30.12 ID:mKbPINot.net
初心者相手に抽象的な専門用語並べるなよ
未定義エラーなんて出ないんだから
どう解釈されるか分からなくて危ないぞ

912 :デフォルトの名無しさん:2014/12/26(金) 12:27:57.01 ID:nS4v0Az9.net
>>910
書けるだろ。

913 :デフォルトの名無しさん:2014/12/26(金) 12:44:53.88 ID:9UUmCfg5.net
ここは低俗な質問スレだけど、初心者向けじゃないぞ

914 :デフォルトの名無しさん:2014/12/26(金) 12:59:16.28 ID:oTq4KPQc.net
>>912
短絡評価を知らないプログラマは>910のコードをどう解釈すると思っているんだ?

915 :デフォルトの名無しさん:2014/12/26(金) 13:01:46.63 ID:qv+SuoRH.net
889ですが>>906は関数の結果を判定するのはいいけど、関数を呼び出して判定するのは危険って事ですかね
普通に変数の比較でも&& ||を使うのもやめた方がいいんですかね?

916 :デフォルトの名無しさん:2014/12/26(金) 13:05:14.66 ID:y3Oe54D2.net
場合によって呼ばれないことがあるってだけだ

917 :デフォルトの名無しさん:2014/12/26(金) 13:06:43.68 ID:oTq4KPQc.net
>>915
「短絡評価」を理解できていれば、どんどん使えばいいよ。
尤も、関数に見えるものが本当に関数かそれとも関数型マクロなのか分からないケースもあるから、
そもそも条件判断の中で関数呼ぶのは避けた方がいいと言うこともあるね。

918 :デフォルトの名無しさん:2014/12/26(金) 13:10:31.94 ID:/tniFmZf.net
それに「短絡評価」という単語を知っていれば、そういう解釈がされるのかどうかも調べられるしな

919 :デフォルトの名無しさん:2014/12/26(金) 13:23:10.85 ID:5vBQJBUk.net
なんで短絡評価が危ないってことになってんの
MISRA-Cでも短絡評価自体は警告対象じゃない
短絡評価の右オペランドに副作用ありの式を入れるなって言ってるだけ

920 :デフォルトの名無しさん:2014/12/26(金) 13:27:58.14 ID:qv+SuoRH.net
ぐぐってみたら論理演算子に標準演算子と短絡演算子ってのがあるのを初めて知りました
一般的なC言語入門サイトだと& |ではなくて&& ||を教えてますよね…
& |の存在自体知らなかったので覚えておきます

921 :デフォルトの名無しさん:2014/12/26(金) 13:30:34.73 ID:oTq4KPQc.net
いや、それはビット演算子だから使うな。

922 :デフォルトの名無しさん:2014/12/26(金) 13:37:15.92 ID:qv+SuoRH.net
あれま、完全に意味分かんなくなって来たw
つまり if( A && B && C )があった時、Aが0だったらそれ以降は判定(実行)されないってのを覚えておけば問題ないって事ですか?
で& | は別モンだから今は気にするなって事でしょうか?

923 :デフォルトの名無しさん:2014/12/26(金) 13:57:07.38 ID:nS4v0Az9.net
>>919
その通りだ

924 :デフォルトの名無しさん:2014/12/26(金) 13:58:10.39 ID:y5Wm5xR7.net
そうだ

925 :デフォルトの名無しさん:2014/12/26(金) 14:16:46.54 ID:PAH/8l9T.net
>>920
&amp; や | はビット(2進法での各桁)ごとに論理演算した結果を計算するものだから別物だね

int a = 24482; // = 101111110100010
int b = 255; // = 11111111
int c = a &amp; b; // = 10100010
int d = a | b; // = 101111111111111

まあ、初心者のうちはあまり使うものでも無いだろうな
強いて言えば、ライブラリとかで色んなフラグが指定できるとき
各フラグが 1(=001), 2(=010), 4(=100) みたいな数値になってたりするんだが
そういうのは FLAG1 | FLAG2 | FLAG3 みたいに合成するを前提にしてる、くらいか

926 :デフォルトの名無しさん:2014/12/26(金) 14:19:45.08 ID:PAH/8l9T.net
ぎゃああ、しまった
久々にブラウザから投稿したもんだから、&に注意してなかった

927 :デフォルトの名無しさん:2014/12/26(金) 15:57:54.06 ID:PUSaAK8w.net
if(struct_ptr && struct_ptr->next)
なか?

928 :デフォルトの名無しさん:2014/12/26(金) 17:09:07.74 ID:0K0HmtAp.net
891だけどさ

aが0以外なら のところ誰も突っ込まなかったね
脳内変換してくれていたんだろうけどw

もし脳内変換していない人がいたら aが1以外なら に修正でwww

>>922
&& や || ってのは論理演算子
& や | はビット演算子
演算子には優先順位があるので覚えておいたほうがいいよ
身近な例だと2項演算子の + や - より × や ÷ のほうが優先とかね

http://ja.wikipedia.org/wiki/%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D
http://ja.wikipedia.org/wiki/演算子の優先順位)

929 :デフォルトの名無しさん:2014/12/26(金) 17:15:27.36 ID:t6BjXhwG.net
そんなものに頼ってるからバグるんだ!
読みにくいだのスマートじゃないだの言われても俺は全部括弧を付けるぜ…

930 :デフォルトの名無しさん:2014/12/26(金) 18:09:31.16 ID:oTq4KPQc.net
かっこわるい……

931 :デフォルトの名無しさん:2014/12/26(金) 18:31:41.94 ID:mKbPINot.net
>>929 がマクロ関数を()で括ってなくて殴られる姿が目に浮かぶ

932 :デフォルトの名無しさん:2014/12/26(金) 20:42:37.13 ID:qv+SuoRH.net
遅くなりましたが889関連のレス&補足くれた方々ありがとうございました

933 : ◆QZaw55cn4c :2014/12/26(金) 21:02:11.82 ID:v5yuSvEQ.net
>>931
マクロを括弧で括る?

934 :デフォルトの名無しさん:2014/12/27(土) 01:22:14.02 ID:Pwz5s1xQ.net
>>931
(fputs("a"))ってこと?

935 :デフォルトの名無しさん:2014/12/27(土) 11:14:16.24 ID:miqkgc9t.net
>>899
に関連して質問なのですが、複数の条件をパスした場合に目的の処理を行いたい場合、

if(a){
 if(b)}
  if(・・・){
   目的の処理
  }
 }
}



if(!a)
 return;
if(!b)
 return;
if(!・・・)
 return;

目的の処理

のどちらの書き方がお勧めでしょうか?私はなんとなく後者派です。

936 :デフォルトの名無しさん:2014/12/27(土) 11:35:38.42 ID:Xe8/BGM1.net
好きにすればいい

937 :デフォルトの名無しさん:2014/12/27(土) 11:56:57.64 ID:W6COMWk1.net
>>899
今時は、if文の書き方で重いとか軽いとか気にする必要は無い。
最適化で全然違うコードに変わったりするし。

一番重要なのは、そのソースコードが人間にとって解り易いかどうか。
それを一番気にすべき。

>>935
なので、後者の方が、不要な条件のケースを先に除外していくことで、
if文のネストという判り難さが排除出来て、シンプルに目的の処理が記述出来るので、
俺もこっちで書くことが多い。
念の為。関数の出だしからの記述という場合な。
ifとelseでそれぞれ処理する場合は、前者+elseという書き方をする。

938 :デフォルトの名無しさん:2014/12/27(土) 13:55:38.06 ID:BFg2jdzp.net
>>935
俺はネストが嫌いなので後者、例えば

if(NULL == (p = malloc(…)))
 goto ERR;
if(NULL == (fp = fopen(…)))
 goto ERR;
…; // 処理
ERR:;
 if(fp) { fclose(fp); fp = NULL; }
 if(p) { free(p); p = NULL; }

みたいに goto 使う

939 :デフォルトの名無しさん:2014/12/27(土) 14:04:08.01 ID:Cc0RXd7d.net
コンビニ強盗

940 :デフォルトの名無しさん:2014/12/27(土) 14:05:26.34 ID:w8NvplaU.net
ネストのためにgotoまで持ち出すのは何だかなぁ

941 :デフォルトの名無しさん:2014/12/27(土) 15:01:59.23 ID:ixHwaiS6.net
うむ。
if文 自体を無くす知恵を働かせろ

942 :デフォルトの名無しさん:2014/12/27(土) 15:10:19.33 ID:E3T7edZM.net
最近は
if(a && b && (・・・)){
  目的の処理
}
って書くと読みずらいって言われるの?

943 :デフォルトの名無しさん:2014/12/27(土) 15:29:54.00 ID:ixHwaiS6.net
ショートカットも同類
分岐は甘え

944 :デフォルトの名無しさん:2014/12/27(土) 16:54:13.21 ID:Pwz5s1xQ.net
gotoはないわ
C言語でエラー処理でもするなら別だが

945 :デフォルトの名無しさん:2014/12/27(土) 17:49:35.38 ID:PS8qPAgg.net
>>944
どうみても >>938 はエラー処理な訳だが

946 :デフォルトの名無しさん:2014/12/27(土) 19:02:31.13 ID:NUsNeTE6.net
俺は使い分けてるなぁ

if (!a) return; // ここで戻るとエラー
目的の処理 // 正しい処理
return; // 正しい終了

if (a) {
目的の処理 // 正しい処理
return; // 正しい終了
}
特別な場合の処理
return; // エラーではなく、正しいが、ここに来るのはまれなケース

947 :デフォルトの名無しさん:2014/12/27(土) 21:27:56.41 ID:u+dBZrZs.net
>>935
MISRA-C 2004 ルール14.7 で、
関数の出口は、関数の最後に一つのみとする

出口が複数だと、制御フローが中断され、読み手が混乱する。
また修正時、各出口に修正しなければならない場合もある

948 :デフォルトの名無しさん:2014/12/27(土) 22:21:05.60 ID:xmcSSpEW.net
> 出口が複数だと、制御フローが中断され、読み手が混乱する。
本当に読み手のことを考えるなら、それは読み手が決めることだから勝手に決めるなよーと思うけどな。

949 :デフォルトの名無しさん:2014/12/27(土) 22:30:28.48 ID:mX32OpPY.net
大企業であるほど天才だけがプログラムを書いてるわけじゃないから低レベルを底上げするためのルールが必要になる

950 :デフォルトの名無しさん:2014/12/27(土) 22:31:21.97 ID:fbt+Aslf.net
個人的にはC言語の話だったら勝手にしてって感じだな。
C++にまで持ってきたら許さん。

951 :デフォルトの名無しさん:2014/12/27(土) 22:32:20.60 ID:w8NvplaU.net
俺は関数の入り口付近に複数+出口ってのが一番読みやすいと思う
チェック部分に掛かると処理がちょろっとで終わっちゃうって場合に
最後までネスト追わないと「処理がない」ことが分からないのは却って読みづらいよ
中途半端な位置の return は読みにくいとは思うが、先頭はむしろ欲しい

952 :デフォルトの名無しさん:2014/12/27(土) 23:44:23.62 ID:7SjtB6Lq.net
MISRA-Cはバカが生命にかかわるプログラムを作る事を想定したルールだから。

953 :デフォルトの名無しさん:2014/12/27(土) 23:55:24.50 ID:xmcSSpEW.net
>>949
それなら大企業が自分たち用にルール作ればいいんじゃね?って思うけど
大企業の(お偉いさんが)作るルールだと的外れな可能性もあるのかね
まぁ自分たちでルール作って守らせるより天才にルール作ってもらったほうが説得力はあるのかもしれないが

>>952
果たしてバカがルールを守ってくれるのだろうか・・・

954 :デフォルトの名無しさん:2014/12/28(日) 00:20:50.01 ID:YvmGoXLm.net
ルールも共用することで開発環境がよくなったり(MISRA-Cチェッカとか)説明責任を果たしやすかったり利点がある
個別にルール作ったってどうせノウハウは同じだし
MISRA-Cを基準にルール増減させてることはあるけど(何が増減してるか明確にしてる)

守れてなきゃ受け入れテスト不合格で納品できないから嫌でも守らざるを得ない

955 :デフォルトの名無しさん:2014/12/28(日) 00:37:09.43 ID:/YZxn3dB.net
IEC 61508,ISO/WD 26262 では、
コーディングルール + 静的チェックが必須

ルールを守らない場合は、ルールからの逸脱手続きが必要。
また個人で勝手に判断して、逸脱してはいけない

これをしないと、すぐに人が死ぬから、MISRA-Cができた

956 :デフォルトの名無しさん:2014/12/28(日) 07:21:54.00 ID:27cHdU7j.net
誤 これをしないと、すぐに人が死ぬから、MISRA-Cができた
正 これをしないと、バカが人を殺すから、MISRA-Cができた

957 :デフォルトの名無しさん:2014/12/28(日) 11:00:33.24 ID:I/+kANbX.net
>>951
>中途半端な位置の return は読みにくいとは思うが、先頭はむしろ欲しい
関数の先頭付近で、受け取った引数の有効性をチェックして無効ならすぐにreturnでお引き取り願う
というケースとか得るよね
returnが関数最後に一カ所でgotoの使用がダメなら、処理無効フラグでも設けて途中をスキップさせることになるのかな

958 : ◆QZaw55cn4c :2014/12/28(日) 12:18:59.28 ID:uZelGoi1.net
ま、その goto が setjmp/longjmp に進化したんだが

959 :デフォルトの名無しさん:2014/12/28(日) 15:32:44.25 ID:27cHdU7j.net
ちげーよ。アホウ。

960 : ◆QZaw55cn4c :2014/12/28(日) 18:31:58.17 ID:6Z3FAnif.net
SjLjでググレ

961 :デフォルトの名無しさん:2014/12/28(日) 19:45:13.15 ID:AQDitcxr.net
まあ、MISRA を守ったからと言ってバグが "0" になるわけじゃない
あくまでもポカ避けだよ

962 :デフォルトの名無しさん:2014/12/28(日) 20:39:26.11 ID:tSKpZ2So.net
ちげーよ。setjmp/longjmpの始祖はLisp1.5のERRSETだ。死ね、アホウ。

963 :デフォルトの名無しさん:2014/12/28(日) 20:42:42.51 ID:SJYHrnZm.net
えっ?setjmp/longjmpの始祖はドラえもんのどこでもドアに決まってんじゃん(キリッ

964 : ◆QZaw55cn4c :2014/12/28(日) 21:18:16.03 ID:ea/rzsF3.net
>>963
あまり強調されていないようだがlongjmp が飛べる setjump には制限があってどこでもではない云々かんぬん

>>962
確認した、LISP1.5 ですでに例外があったわけだね、感謝する
http://lawker.googlecode.com/svn/fridge/share/pdf/languagesTheory.pdf 3.3章 "exceptions"

965 :デフォルトの名無しさん:2014/12/28(日) 21:22:56.70 ID:fHqPGp2q.net
どこでもドアだってどこでもと言っているけど制限はあるんじゃね?

966 :デフォルトの名無しさん:2014/12/28(日) 21:24:40.05 ID:SJYHrnZm.net
>>964
22世紀のテクノロジーを20世紀に実現しようとしたんだから制約があって当然(キリッ

967 :デフォルトの名無しさん:2014/12/28(日) 21:28:04.38 ID:kIpimFnn.net
>>965
まあ、無対策であんなもん売り出したらプライバシーもないし、犯罪の温床になるわな

968 :デフォルトの名無しさん:2014/12/28(日) 22:23:52.21 ID:ea/rzsF3.net
>>965
その場所自身に開いている、というのはどうだろうか?
一方は扉を引く、一方は扉を押す、ということになり対称性が崩れる
スライド式の上に巻き上がるか地面にずぶずぶ入っていく形だとうまくいくか?

969 :デフォルトの名無しさん:2014/12/28(日) 23:29:25.01 ID:a2va3SXh.net
>>957
if{
 if{}else{}
}else{
}

たぶん、こういう感じで、ネストが深くなるんだろう

970 :デフォルトの名無しさん:2014/12/29(月) 00:22:36.25 ID:Gl2B1r0m.net
無効ならすぐにreturnでお引き取り願う んだから else はいらないんじゃね。
{
 if(ptr==NULL) return;
 ・・・;
}

これなら
{
 if(ptr!=NULL)
 {
  ・・・;
 }
}

こうなるわけだし。

>>951が言っているのはこういうことだろうね。
{
 if(ptr!=NULL)
 {
  if(a)
  {
   ・・・;
  }
  ・・・;  //←ここの存在の有無が分かりにくい
 }
}

971 :デフォルトの名無しさん:2014/12/29(月) 01:29:39.14 ID:w4v+nC+a.net
その次の行の閉じブレースの次の行じゃね

972 :デフォルトの名無しさん:2014/12/29(月) 08:58:29.73 ID:GU9lRZUk.net
>>970
たしかに「構造的」ではあるんだけどねぇ...
ptr が NULL ならすぐに呼び出し元へ戻る、という単純な流れでも、わざわざ if ブロックの外側を回り込まないとわからないんだよね
「if(ptr==NULL) return;」なら、眺めただけで直感的に理解できる

それならむしろ俺は928氏に同調するな

{
 if(ptr==NULL) goto ERR;
 ・・・;
 ERR: ;
 return;
}

この処理がスパゲティとは思えないけど、まぁ主観によると言われれば"それまで"か?

973 :デフォルトの名無しさん:2014/12/29(月) 09:53:34.43 ID:R9uwHG6j.net
>>970
> 無効ならすぐにreturnでお引き取り願う

それしちゃいかんと言う話
>>947 辺りから読み直しなよ

974 :デフォルトの名無しさん:2014/12/29(月) 10:53:50.17 ID:w4v+nC+a.net
>>973
MISRA-Cではそうなってるけど、却って分かりにくくね?という話だろ今は

975 :デフォルトの名無しさん:2014/12/29(月) 11:27:17.28 ID:S6a2iGl8.net
>>974
そうだよ。

976 :928:2014/12/29(月) 12:09:22.53 ID:88bYnTsn.net
なんかgotoでスレが伸びてるw
>>972
後始末処理が煩雑になるならgoto ERR;、ならないなら即return;でやってます。

977 :デフォルトの名無しさん:2014/12/29(月) 12:31:14.75 ID:90FPncP0.net
MISRA-Cを使用するようなところでは、関数の戻り値、エラーの返しかたも
統一した方法が規定されているので
if (hoge) return;
等という事はあり得ないのだよ。

978 :デフォルトの名無しさん:2014/12/29(月) 12:40:24.54 ID:9Etq4Oht.net
なんかレス番飛んでる

979 :デフォルトの名無しさん:2014/12/29(月) 18:15:19.55 ID:Gl2B1r0m.net
>>972
正常処理した場合でも ERR: ; を通るのがちょっと嫌だなと思う。
昔なんかでgoto は使うなってのがあったと思うんだが、
そのためかgotoは避ける習性がついてる。
自分もifの中が長くなるか、ネストが深くなりそうなら 「if(ptr==NULL) return;」 って返しちゃうけど。

>>973
>>935あたりから読み直しなよw

>>978
goto の仕業です

980 :デフォルトの名無しさん:2014/12/30(火) 11:43:34.75 ID:oELHqRa9.net
C言語で特性要因図を描きたいのですが、直線や傾線の描き方がわかりません。
参考になる書籍やサイトを教えて下さい。

981 :デフォルトの名無しさん:2014/12/30(火) 15:30:14.23 ID:4OrPIxQI.net
C言語には絵を描く機能はありません

一応、WindowsであればWin32APIを使えばいいし、
他のOSならその環境で提供されて居るライブラリを使えば可能です

でも、絵を描く系のアプリは、描画ライブラリが標準で提供されている言語
を使った方がよろしいかと

982 :デフォルトの名無しさん:2014/12/30(火) 16:57:21.27 ID:oELHqRa9.net
ありがとうございます。

983 :デフォルトの名無しさん:2014/12/31(水) 10:03:42.26 ID:BzIgpzQu.net
>>947
switch使ってreturnが複数あるのはいかんのかえ

984 :デフォルトの名無しさん:2014/12/31(水) 21:22:22.92 ID:JDflDXLg.net
misraじゃダメだろ、breakで一旦絞ってからじゃないと。

985 :デフォルトの名無しさん:2014/12/31(水) 21:23:15.11 ID:MAv4eoG4.net
あかん

986 :デフォルトの名無しさん:2014/12/31(水) 21:36:55.32 ID:sJPMMaom.net
>>929
これからは、カッコマンと名乗りなさい

987 :デフォルトの名無しさん:2015/01/01(木) 18:44:24.90 ID:5u2mylLc.net
cやc++などでも使うpow()関数の中身を見たいのですがどこで見れるのですか?
調べてみても使い方しか見つかりませんでした
中身が気になって年も越せません、どなたかお願いします

988 :デフォルトの名無しさん:2015/01/01(木) 18:48:22.95 ID:AdVpW5lB.net
ビルド済みでなくソースコードを配布しているコンパイラ。

989 :デフォルトの名無しさん:2015/01/01(木) 20:40:47.43 ID:kAzVMxFU.net
>>987
年越してんだろ
glibc

990 :デフォルトの名無しさん:2015/01/01(木) 21:06:51.24 ID:3W20v7ol.net
あと364日

991 :デフォルトの名無しさん:2015/01/02(金) 07:53:25.54 ID:Kr2J2p4W.net
double pow(double x, double y) {return exp(log(x) * y);}
// 但し、xが負の場合などのケアはしてないw

992 :デフォルトの名無しさん:2015/01/02(金) 08:54:44.09 ID:7UbCEqjn.net
glibcならこの辺り

https://sourceware.org/git/?p=glibc.git;a=blob;f=math/w_pow.c

https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/ieee754/dbl-64/e_pow.c

993 :デフォルトの名無しさん:2015/01/02(金) 20:27:25.41 ID:bUqHV81T.net


994 :デフォルトの名無しさん:2015/01/02(金) 20:39:22.13 ID:olFjF83r.net
すごく複雑ですね
ゆっくりと読んでみます
ありがとうございました

995 :デフォルトの名無しさん:2015/01/02(金) 23:04:31.55 ID:wsXrG2FF.net
>>994
基本は>991だよ。それに負数の時の処理などが付け加えられて>992のようになっている。

996 :デフォルトの名無しさん:2015/01/03(土) 17:10:20.99 ID:KCWAqhUR.net
https://sites.google.com/site/alcon2013prmu/development
上のサイトの開発手順を参考にして画像処理を行えるプログラムを書きたいのですが、
サンプルソースプログラムのどこをどのように変えればいいのか、
そもそも何から始めればいいのかすら分からず困っています
もし何か分かる方いたら教えて下さるとありがたいです

997 :デフォルトの名無しさん:2015/01/03(土) 17:14:14.23 ID:Cj8CgFQv.net
こんなところで聞くんじゃなくて
ちゃんとわかる人に教えてもらえ

998 :デフォルトの名無しさん:2015/01/03(土) 17:15:47.86 ID:KCWAqhUR.net
>>997
どこで聞けばいいですかね?
分かる人がいる場所が分からなくて困ってます……

999 :デフォルトの名無しさん:2015/01/03(土) 17:53:09.91 ID:evDYmhLz.net
>>998
書かれていることが分からないなら
書かれていることを理解する勉強から始めればいいと思うよ。

1000 :デフォルトの名無しさん:2015/01/03(土) 17:56:11.07 ID:zYvZyTAZ.net
>>998
http://ja.stackoverflow.com/

1001 :デフォルトの名無しさん:2015/01/03(土) 18:05:12.55 ID:KCWAqhUR.net
>>999
了解です!

>>1000
ここで聞けば良い感じですかね
ありがとうございます!

1002 :デフォルトの名無しさん:2015/01/04(日) 00:38:53.48 ID:Wz/5DFfo.net
MISRA-Cでは、goto,continueなどは禁止だけど、

Linuxでは、goto ERR;で関数の最後に、
エラー処理をまとめる。
Linusもそれを推奨している

1003 :デフォルトの名無しさん:2015/01/04(日) 01:31:27.96 ID:EO5g9rYs.net
http://www.nurs.or.jp/~sug/soft/super/goto.htm
によると
「Linux デバイスドライバ」(Alessandro Rubini 著、O'Reilly ジャパン刊)
で推奨されているみたいだね。

デバドラとかカーネルとか書く人はアセンブラにも通じていて
goto(jump)には抵抗ないのだろう

1004 :デフォルトの名無しさん:2015/01/04(日) 10:51:52.71 ID:YFWQwx9h.net
まあ教条主義者はgotoを絶対悪と決めつけて無条件に排斥するからね
使い方次第で、分かりやすいプログラムにも、分かりにくいプログラムにも、どちらにもなる、ということを理解できないんだろう
K&Rですら、gotoの有効な例をあげて、慎重に使えば問題ない、という姿勢だったとおもう

1005 :デフォルトの名無しさん:2015/01/04(日) 11:10:52.14 ID:EjbbMTMU.net
>>1004
> K&Rですら、gotoの有効な例をあげて、慎重に使えば問題ない、という姿勢だったとおもう

当たり前だろ、常に有効でないと思ってたなら、goto 文実装してないだろ

1006 :デフォルトの名無しさん:2015/01/04(日) 18:33:37.63 ID:jxWL1hkj.net
>使い方次第で、
その使い方に問題があったりするから、
gotoばかり使うスパゲッティとか
そういうコードを排除しようと誰かが提唱する
それを聞いた誰かがすばらしいと崇拝して
おそらく最初に提唱した人の意図とは違う意図で他の人らに広める

MISRA-Cだって慎重にすれば問題ないものでも、慎重に使えない人がいるからそういうルールを作るわけだろ
まぁそういう禁止事項はお仕事ならば慎重さよりスピード重視だろうし
スピード重視した結果スパゲッティになることを防ぐ目的もあるだろう

1007 :デフォルトの名無しさん:2015/01/04(日) 22:31:04.11 ID:AZoVKcHR.net
教えてください。
基底クラスのコンストラクタによって生成されるメンバを
継承したクラスで使うことは可能でしょうか。


例:
class A{
int a; // このaはAのコンストラクタで設定される
A( HOGE Data); // あるデータによってaの値が変わる
}

class B : public A{
B( A A::a ); // Aのメンバをコンストラクタで使いたい
}

よろしくお願いします。

1008 :デフォルトの名無しさん:2015/01/04(日) 22:34:28.49 ID:AZoVKcHR.net
コンストラクタでやろうと考える時点でおかしいんですかね・・・

1009 :デフォルトの名無しさん:2015/01/04(日) 22:47:01.26 ID:kU4tFNpU.net
>>1007
こういうのならば出来そう‥
http://codepad.org/mWOdu8b7

1010 :デフォルトの名無しさん:2015/01/04(日) 22:47:16.34 ID:jxWL1hkj.net
Bのコンストラクタでは基底クラスAのメンバは存在している。

1011 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1011
279 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★