14/03/28 00:02:57.04 CsDGXoI3
BorlandっていまやWin最強のコンパイラーだろ?
Clangになって一番すごいWinのコンパイラーに進化したらしいよな
51:デフォルトの名無しさん
14/03/28 00:41:16.94 yDdY0uS3
VC++ EEじゃあかんのか
52:デフォルトの名無しさん
14/03/28 00:52:34.68 vM8zXvpO
次のように表示されます。
bcc -N -v -w -ml -ecalc1 calc1.c
'bcc'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
** error 1 ** deleting calc1.exe
53:デフォルトの名無しさん
14/03/28 01:08:29.53 a5++l4GP
>>52
じゃあパスが通ってないんだろう、環境変数のpathnの項を弄れ
やり方? bccの使い方を説明するサイトとか本にはだいたい載ってるだろと
54:デフォルトの名無しさん
14/03/28 01:09:57.34 CsDGXoI3
>>52
違う,いまのBorlandは
clang -o calc1.exe calc1.c
55:デフォルトの名無しさん
14/03/28 01:12:20.51 CsDGXoI3
>>53
Borlandにはbccなんてのはないから、当然>>52になる
56:デフォルトの名無しさん
14/03/28 01:15:11.69 CsDGXoI3
おそらく、bccってやってるぐらいだからコンパイラ・リンカーのcfg設定すら出来てないだろうな
57:デフォルトの名無しさん
14/03/28 01:21:27.24 ZLrJM0xQ
とりあえずフルパスでやってみろよ
58:デフォルトの名無しさん
14/03/28 01:27:34.35 vM8zXvpO
cfg設定はしてます。
makeを入力すると52のように表示されます。
59:デフォルトの名無しさん
14/03/28 01:29:03.46 vM8zXvpO
makefileは>>16のように記述したのですが間違っていますか?
60:デフォルトの名無しさん
14/03/28 02:01:11.81 vM8zXvpO
CC=bcc32
に書き換えたら行けました。
そしたら今度は
コマンドオプションの間違い -ml
というエラーが出ました。
-mlをとってmakeをしたら上手くいきました。ラージモデル-mlは認識されていないのでしょうか?
教科書通りにしてるのにおかしいですね。
61:デフォルトの名無しさん
14/03/28 02:34:35.65 Bi202b4z
>>60
俺Winの知識ないって自慢し過ぎ
bcc32に限らずwinのコマンドのオプションリスト表示すら出したことないだろ
winの経験が少しあれば普通はオプションリスト表示オプションを付けて起動して、
どんなオプション付けられ、それが何をするのか調べることぐらい出来ると思うが
winの場合のオプションリスト表示は /? ってのが普通(常識)
62:デフォルトの名無しさん
14/03/28 02:42:52.86 oiG2WFSt
スモールモデル、ラージモデルは、16ビットの時代
63:デフォルトの名無しさん
14/03/28 02:51:20.42 Bi202b4z
>>62
16bitとはおいおいすぎ><
16bitのプログラムを開発したいから、わざわざBorlandを選んだのかな
64:デフォルトの名無しさん
14/03/28 05:13:02.52 FWVtOBdw
つーか、おまえらバカにして遊んでるだけだろ
65:デフォルトの名無しさん
14/03/28 10:06:39.77 6uoLiniK
とんでもない。
馬鹿になんてしてないよ。
遊んでいることは否定しないけど。
66:デフォルトの名無しさん
14/03/28 11:40:09.31 dRXuKu/3
>>64
そりゃsizeofをプリプロセッサが処理するような処理系を好んで使うような奴だもの
67:デフォルトの名無しさん
14/03/28 11:52:19.86 WLy6H0qs
やっぱりねw
68:デフォルトの名無しさん
14/03/28 12:29:41.58 dy0OpFC/
>>64
bccに-mlでバージョン出さない時点で普通に古いコンパイラを前提にするだろ
69:デフォルトの名無しさん
14/03/28 13:04:27.64 RWL6RT/i
明示するだろ、JK
70:デフォルトの名無しさん
14/03/28 17:42:32.13 vM8zXvpO
>>61
オプションリスト表示はどのように開くのでしょうか?
コマンドプロンプトに/?を入力しても反映されません。
71:デフォルトの名無しさん
14/03/28 18:40:43.95 YNdMan3y
単に
bcc32
と入力してEnterをおします
むかしBorland C++Builder バージョン5か6のおまけとして
コマンドラインコンパイラのオプションの表が付属していました。
それと異なります。たぶん全部を表示しないと思われます
72:デフォルトの名無しさん
14/03/28 18:47:27.10 YNdMan3y
>>19
いいコンパイラだよ
73:デフォルトの名無しさん
14/03/28 18:50:58.97 YNdMan3y
calc1.cってなに?
74:デフォルトの名無しさん
14/03/28 21:02:05.81 vM8zXvpO
>>71
表示されました。ありがとうございます。
>>73
今、オライリーのC実践プログラミングという教科書を使用しているのですが、
その中に例として出ているプログラムです。
75: ◆QZaw55cn4c
14/03/28 21:16:01.34 oXAQt7Rw
>>72
そうそう、コードガードはわりと便利、評価版をダウンロードすればいいし
76:デフォルトの名無しさん
14/03/29 12:43:43.99 OMABeBxL
本が古いなら、それに環境をあわせないと。
煽られているように、とりまそれ最新じゃないよ
時代は便利になったんだ。
codepad, ideone もあるよ。 >>1
77:デフォルトの名無しさん
14/03/29 12:48:33.82 T0jzXlJE
>>76
いわゆる分割コンパイルにも対応してほしいな、makefile いれとけるとか
78:デフォルトの名無しさん
14/04/01 18:44:18.29 zkzJISd4
C++の基礎だけかじって、GUIプログラムも作ってみたいと思ってVisualStudioを触ってみると、様相がだいぶ違って困惑しています。
2つ教えてください。
1つ目
まず、MFCで自動作成されたソースファイルを見てもmain()?winmain()?_tmain()?すら見つかりません。
イベントドリブンだから、初期化とそれぞれのイベントに対応した部分以外は触る必要がないので隠されているのでしょうか?
なんとなくでも全体の流れを把握したいのでmain()にあたる部分を見たいのですが、どこに置いてあるのでしょうか?
2つ目
VisualStudioで作成したソースを、フリーで落とせる、C++の勉強に使っていたようなC++コンパイラでコンパイルすることはできるのでしょうか?
複数のファイルに分かれたようなプログラムを書いたことがないのでmakefileとかもよくわかってはいないし、目的があって他のコンパイラを使いたいわけでもないのですが、
VisualStudioで作成したソースはVisualStudioを使わないとコンパイルできない特殊な仕様なのか、
(ファイル間の関係を理解して正しくmakefileを書けば)あくまで普通のC++の仕様に従った、一般的なコンパイラが理解できるソースを作成しているのか知りたいと思っています。
79:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/01 19:06:36.07 28c8XDsv
1つめ。WinMain関数は自動リンクされるライブラリに含まれている。
有料VC++がインストールされているフォルダのどこかにMFCのソースがある。
初心者には膨大なのでgrepを使いこなさないと読めない。
WinMainとCWinAppを読めば動作がわかる。
2つめ。ソースプログラムやコンパイラによる。ソースがC++11なら
C++11に準拠したコンパイラでなければ使えない。
80:デフォルトの名無しさん
14/04/01 19:14:53.77 KWNjZyFY
1つめはステップインで開始すればいい
81:デフォルトの名無しさん
14/04/01 19:45:25.44 28c8XDsv
ヒント:C:\Program Files
82:デフォルトの名無しさん
14/04/01 19:53:07.99 CqvqfScs
>>78
とりあえずVC++ExpressEdition触ってみたらいいと思う
83:デフォルトの名無しさん
14/04/01 20:06:30.50 hppE64Hw
rc とか mc が無いとguiは難しいでしょうね
84:デフォルトの名無しさん
14/04/01 20:27:34.83 PR3x9no5
>>82
素で言っているのか
85:デフォルトの名無しさん
14/04/01 20:34:07.93 CqvqfScs
>>84
初期プロジェクトで既にウィンドウ生成までできてるから
流れ見るのならいけるんじゃね?
関数はもちろん調べながら
86:デフォルトの名無しさん
14/04/01 20:53:33.69 eefQLiAy
>>82
VCでGUIソフトとなるとMFC使えないExpressは苦行だろ
MFCじゃなくてQtなら良いが
87:デフォルトの名無しさん
14/04/01 20:58:12.28 eyBPHv5q
今時MFCとかMやな
88:デフォルトの名無しさん
14/04/01 21:00:40.54 zkzJISd4
レスありがとうございます。
ステップインで見てみると、appmodul.cppというファイルに_tWinMain()があり、そこからさらに
winmain.cppというファイル内のAfxWinMain()が呼ばれているようでした。
いきなり理解するのは難しそうですが、おいおい見ていこうかと思います。
ところで>>82でVC++ExpressEditionを薦めていただきましたが、製品版とは何か違うのでしょうか?
今使っているのはDreamSparkで手に入れたVisualStudio2013を使っていますが、旧版やExpressEditionのダウンロードも可能です。
VisualStudio2013の情報はぐぐった限りまだ少ないので旧版を使った方がいいような気もしてます。
89:デフォルトの名無しさん
14/04/01 21:02:18.77 28c8XDsv
製品版あるなら製品版だけでいいよ
90:デフォルトの名無しさん
14/04/01 21:03:43.90 28c8XDsv
expressは製品版に比べ機能が少ない
91:デフォルトの名無しさん
14/04/01 21:47:13.30 BTv6StGE
製品版よりちょっと動作が軽い
92:デフォルトの名無しさん
14/04/01 22:13:30.10 q8+ciQV2
MFCが付いてない
93:デフォルトの名無しさん
14/04/01 22:27:29.90 CqvqfScs
>>87
VS2013触った事ないからわからんけど
フォームアプリケーションじゃなくてwin32アプリケーションがあればそれでソース見れるんじゃない?
> なんとなくでも全体の流れを把握したいのでmain()にあたる部分を見たい
こういう事かな URLリンク(msdn.microsoft.com)
94:デフォルトの名無しさん
14/04/01 23:04:38.46 JvY411Bp
Expressに無料版MFCでいいじゃん。
ATLの方が簡単だけどな。
95:デフォルトの名無しさん
14/04/01 23:46:31.78 q8+ciQV2
無料MFCて何の事だよ
96:デフォルトの名無しさん
14/04/02 17:38:29.47 SfgYmxWg
それっぽい単語を並べただけなのでマジレスしないでください
97:デフォルトの名無しさん
14/04/02 19:39:44.52 aNx9C+Mf
>>95はモグリ
98:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/03 12:52:10.02 lJqirrU9
URLリンク(www.geocities.jp)
99:デフォルトの名無しさん
14/04/03 15:33:05.57 BFyxuILc
てっきりMZCが出てくる流れかと思ったがそうじゃなかったw
100:デフォルトの名無しさん
14/04/04 15:36:27.65 QN8rMztS
マルチコアへの対応って、AfxBeginThreadでマルチスレッドにしたらOSが勝手にコアごとに振り分けてくれるという認識であってる?
ググるとParallelクラスがあるけど、ネイティブでは使えないっぽい。
101:デフォルトの名無しさん
14/04/04 16:48:02.82 nM83ZP3Z
AfxBeginThreadはある関数を新しいスレッドで開始するだけだから、
parallel forみたいなことをしたい場合は、
自分で各スレッドのforの範囲を決めたり、
スレッドが終了するのを自分で待ったりする必要がある。
ネイティブで使えるパラレルライブラリはちゃんと入っているから探すべし。
102:デフォルトの名無しさん
14/04/04 19:59:43.18 ZtsQOPBg
マルチコアまともに扱いたいならMFCなんか使わんやろ
103:デフォルトの名無しさん
14/04/04 20:06:44.55 2QttofMo
OpenMPは楽して並列化させたい場合に威力を発揮するな
……OpenACCが使えるCompilerってフリーに無かったっけ?
104:デフォルトの名無しさん
14/04/04 20:41:28.03 DD5EG69p
マルチコアを真面目に使いたいときに
GUIフレームワークをわざわざ変える奴は
マトモな設計が出来ない奴
105:デフォルトの名無しさん
14/04/04 20:43:23.33 eu/rYsXw
MFC関係ないよね
106:デフォルトの名無しさん
14/04/04 20:59:32.67 UDPO/kAP
儂もそう思う。が、未だに世に知られていない新理論を
構築済みなのかも知れないのでもう少し語らせてみたいです。
107:デフォルトの名無しさん
14/04/04 23:36:48.04 QN8rMztS
>>101
OpenMPとかPPLとかBoostとかいろいろあるんだな
調べてみるよありがとう
108:デフォルトの名無しさん
14/04/05 00:52:05.63 Z9uNYFZQ
char なら printf
w_char なら wprintf
TCHAR なら _tprintf
だと思うのですが、どうして三番目のやつは先頭に _ が付くのでしょうか?
109:デフォルトの名無しさん
14/04/05 00:56:55.10 JxLvhIna
マクロって_MAX_PATHとか付くやん
110:デフォルトの名無しさん
14/04/05 01:50:54.62 EG+AV0eK
標準規格にはないWindows用の独自拡張だから
111:デフォルトの名無しさん
14/04/05 02:16:53.63 goifYp5b
コンパイラメーカーや、ライブラリの作者は、_を多用します
プログラマは、先頭に、_をつかわないようにします(おれは、そういわれた)
112:デフォルトの名無しさん
14/04/05 02:21:01.16 zHyV6h3a
>>111
俺もC言語辞典(古い)でそれ見た
113:デフォルトの名無しさん
14/04/05 02:47:32.13 oiRFlfhh
>>100だけど、とりあえず何もしないループ回してCPU使用率見たら、特にマルチスレッド処理してないのに複数コアが仕事してるみたいだった。
マルチスレッドを意識してプログラムしなくてもwindows8は賢いからある程度勝手に対応してくれるのか?
かといって全コアが100%に張り付くというわけでもなく、60%弱くらいでよくわからん。
これを回しただけなんだけど
for (int j = 0; j < 100000; j++){
for (int i = 0; i < 100000; i++){}
}
114:デフォルトの名無しさん
14/04/05 03:30:05.84 zHyV6h3a
>>113
空ループって最適化したら消えるんじゃねーの?
それ以前に裏で別のプロセス走ってるとか
コンパイラの自動並列化が効いちゃったとかのオチな気がする
115:デフォルトの名無しさん
14/04/05 03:59:45.28 JxLvhIna
>>113
1コアの100% =
2コアの50% =
4コアの25%
116:デフォルトの名無しさん
14/04/05 04:09:44.16 4p3tjfYN
よくわからないがシングルスレッド高負荷処理で
同一コアと思われるハイパースレッディングの
論理CPUペアが50%ずつ(たまに60+40の非対称)
になるのはWindowsでよくあること。
表示が間違ってるのではないかと思ってるけど
117:デフォルトの名無しさん
14/04/05 11:56:14.14 oiRFlfhh
コンパイラの自動並列化がそれっぽい、便利なんだな
もっと詳しくならないとマルチコアとか考えるだけ無駄ってことか……
118:デフォルトの名無しさん
14/04/05 12:06:18.53 Vwyio/wC
マルチコアとマルチスレッドはべつ。
シングルスレッド・プログラムでも、OSがマルチコア使うかもしれないし
マルチスレッド・プログラムでも、OSが1コアしか使わないかもしれない。
プログラマが出来るのは主にスレッド管理だけ。
119:デフォルトの名無しさん
14/04/05 12:07:27.06 zHyV6h3a
>>117
URLリンク(msdn.microsoft.com)
120:デフォルトの名無しさん
14/04/05 12:10:33.92 Vra9QIvI
にほんごでおk
121:デフォルトの名無しさん
14/04/05 12:59:48.48 zqI4wR1v
>>113
「マルチスレッドにすると勝手にコアごとに割り付けてくれる」ってのは正しい
正確には割り付けるんじゃなく、並列に実行される。
CPU使用率は、ツールやコマンドによって計算方法が違っている場合がある。
例えば4コアの場合、全CPUをフルで使った場合100%と表示するか、400%と表示するかはツール次第。
122:デフォルトの名無しさん
14/04/05 13:32:33.53 Gtcr4gqx
構造体を動的に生成したいのですが、このやりかたでよろしいでしょうか?
URLリンク(ideone.com)
123:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/05 13:35:36.03 pKk9GxNe
>>122
型名の始めは大文字にしたほうがいいね。
124:デフォルトの名無しさん
14/04/05 13:38:16.05 Gtcr4gqx
>>123
そうですね^^
型名以外には何か問題点とかありますか?
125:デフォルトの名無しさん
14/04/05 13:38:47.30 NnouwwX7
はい
126:デフォルトの名無しさん
14/04/05 13:39:59.09 Gtcr4gqx
>>125
具体的にはどのような?
127:デフォルトの名無しさん
14/04/05 13:42:36.52 30x58bFF
このやりかたでよろしいでしょうか?
はい
後何が必要なのか?
128:デフォルトの名無しさん
14/04/05 13:44:42.90 Gtcr4gqx
>>127
ポインタの扱いが苦手でして
一応コンパイラもエラー吐かなかったので大丈夫みたいですがなにぶん心配性なもんで・・・
129:デフォルトの名無しさん
14/04/05 13:50:24.60 /rC4NDRr
>>128
で?
130:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/05 14:03:30.11 pKk9GxNe
>>129
次のコード書いてみて。
131:デフォルトの名無しさん
14/04/05 15:18:00.60 N2+78ftB
>>108
願望
132:デフォルトの名無しさん
14/04/05 15:21:03.39 zHyV6h3a
>>122
そもそも構造体のメンバ変数が1つだけって……
動的確保してるのにその個数が定数値って……
例:URLリンク(codepad.org)
133:デフォルトの名無しさん
14/04/05 15:22:25.93 zHyV6h3a
おっとfreeを忘れてた……
URLリンク(codepad.org)
134:デフォルトの名無しさん
14/04/05 15:23:25.39 JxLvhIna
>>132
例だから別にいいだろ
135:デフォルトの名無しさん
14/04/05 15:53:12.52 Vra9QIvI
ライブラリとかで予め決まっている名前以外は _ をつけるべきじゃない
typedef struct ~ の書式で宣言するなら struct の後のタグ名は不要
おまじない気分でつけるものじゃない
何よりまず、obj001からobj002にコピーしている意味がわからない
この後 obj002を使おうとしていますというオチじゃないかと非常に気持ち悪い
136:デフォルトの名無しさん
14/04/05 15:55:30.71 Vra9QIvI
×ライブラリとかで予め決まっている名前以外は _ をつけるべきじゃない
○ライブラリとかで予め決まっている名前以外は 先頭に _ をつけるべきじゃない
137:デフォルトの名無しさん
14/04/05 15:55:38.93 PXTTIzjC
> 何よりまず、obj001からobj002にコピーしている意味がわからない
いや、その点はどうでもいだろw
ポインタの勉強するときそういう代入してみるのってよくあることだろ。
138:デフォルトの名無しさん
14/04/05 16:15:50.31 JxLvhIna
本題以外にケチつける奴はただ優越感に浸りたいだけ
浸れてないけど
139:デフォルトの名無しさん
14/04/05 16:21:18.84 LokGB3M7
×ライブラリとかで予め決まっている名前以外は 先頭に _ をつけるべきじゃない
○ライブラリとかで予め決まっている名前以外は 先頭に _ をつけるべきじゃない、というのが持論です
140:デフォルトの名無しさん
14/04/05 17:03:41.01 Vra9QIvI
改めて見直してみたらいろいろな慣習とか規約があるみたいだな
よし、今日のところは引き分けにしておいてやる
141:デフォルトの名無しさん
14/04/05 17:55:33.89 YrLzJmoN
sprt使わずにdistance名乗るか
142:デフォルトの名無しさん
14/04/05 18:38:06.46 zqI4wR1v
>>123
え?なんで型名を大文字で始めるの
定数と間違えてない?
143:デフォルトの名無しさん
14/04/05 19:04:31.24 zHyV6h3a
>>141
実用上はいちいちsqrtしないだろ?
……ごめんなさい忘れてただけです
144:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/05 19:22:03.80 kCbCwa1D
>>142
例えばDogという型名とdogという変数名が衝突しないから、分かりやすいコードが書ける。
145:デフォルトの名無しさん
14/04/05 19:35:59.53 zqI4wR1v
>>144
うん。そうです。自分が勘違いしていました・・・
146:デフォルトの名無しさん
14/04/05 22:27:29.57 pxBAHja5
型名と変数名が衝突しないルールなどこの世に無数にあるのに、
自分の使ってるルールがさも普遍的に良いものであるかのような
ミスリードをする奴の言うことなど真に受けてはいけない
147:デフォルトの名無しさん
14/04/05 22:45:29.81 JxLvhIna
char cszBuff
TCHAR tszBuff
int nCount
UINT unCount
typedef struct tagStructName{
} T_STRUCTNAME;
いろいろやってみて自分が納得行くの使ったらいいんや
148:デフォルトの名無しさん
14/04/05 23:56:57.72 d+kzfy0R
>>147
システムハンガリアンさんちーす
まだ絶滅してなかったんすね!
頑張ってくださいね!
149:デフォルトの名無しさん
14/04/06 03:16:28.05 PoyortF4
> 型名と変数名が衝突しないルールなどこの世に無数にあるのに、
ルール以前に、文法で型名と集成体タグ名と変数名は衝突し得ないんじゃね?
URLリンク(ideone.com)
あと、typedefされた型名って_tってサフィックスつけるのが一般的だと思うんだけど
これもローカルなルールなんやろか
150:デフォルトの名無しさん
14/04/06 03:33:10.66 v5F7vKVc
>>149
そのとおりだねえ
ISO/IEC 9899:1999 6.2.1p1
An identifier can denote an object; a function; a tag or a member of a structure, union, or
enumeration; a typedef name; a label name; a macro name; or a macro parameter.
集成体タグと typedef 名と変数は異なる名前空間だね
151:デフォルトの名無しさん
14/04/06 03:39:44.68 lcQBK2Mz
>>149
URLリンク(en.wikipedia.org)
によると、POSIXでは _t サフィックスは typedef の名前にリザーブされていて、それゆえ
名前が衝突しないようにユーザが定義する typedef には _t を使わないほうがいいらしい
152:デフォルトの名無しさん
14/04/06 03:53:44.87 PoyortF4
>>150
規約での確認、㌧です
>>151
> Such type names are reserved by POSIX for future extensions and should generally be avoided for user defined types.
…マジっすか orz
153:デフォルトの名無しさん
14/04/06 04:43:31.25 7TI60JXf
衝突ってのはコンパイルエラーではなくて
人が目で見て区別がつきやすいよう
同じ綴りを避けるって話だろうに
アスペなおまいらは
154:デフォルトの名無しさん
14/04/06 07:44:06.37 AUPUS+0I
>>153
人の目で区別する必要があるシチュエーションってどんなの?
155:デフォルトの名無しさん
14/04/06 11:01:21.41 Gd53X1PX
>>153
よほど糞な開発環境なんだなお前
156:デフォルトの名無しさん
14/04/06 11:52:04.47 gdJCg3c2
あえて言おう
処理系指定で組めばおk
初心者なんだろ、何か組みあがった快感って大事だぞ
157:デフォルトの名無しさん
14/04/06 12:09:44.18 BmjYK//+
別のものには違う名前を使うもので
名前を使い回すなって当たり前のことだろ
どんだけ馬鹿なんだおまえら
158:デフォルトの名無しさん
14/04/06 12:18:02.39 PoyortF4
流れぶったぎりでスマソ
_tサフィックスのことは、下にも書かれてたよorz
URLリンク(pubs.opengroup.org)
159:デフォルトの名無しさん
14/04/06 13:36:30.63 9b0FkJFr
>Such type names are reserved by POSIX
本当にWikiは嘘だらけだな
byだと適用範囲がPOSIXでなくC全般と読めてしまう
160:デフォルトの名無しさん
14/04/06 15:47:59.42 PoyortF4
byよりinの方が良いかもね…スレチだけど
161:デフォルトの名無しさん
14/04/06 16:35:16.36 5rOAt6qX
>>159-160
Wikiなんだから編集できるんじゃねーの?
162:デフォルトの名無しさん
14/04/06 16:39:48.19 Pw+vYT2x
A「こんな説明みつけたよ!
B「間違ってるねそれ。
やっぱりWikipediaはこらだから
A「直せるんだから直せよ
B「えっ、何で俺が?
A「えっ?
163:デフォルトの名無しさん
14/04/06 16:46:07.08 YqB/fCSo
byの方がいいだろ
164:デフォルトの名無しさん
14/04/06 16:56:24.24 k991ba7o
A「byだとPOSIX以外にもルールが適用されると読める
B「byの方がいいだろ
せめて意見するときは
そう考える根拠ぐらい書きたいものだ
165:デフォルトの名無しさん
14/04/06 16:57:56.33 PoyortF4
byの方が良いのかorz
Wiki編集するところだったよorz
166:デフォルトの名無しさん
14/04/06 19:15:29.97 X8q2hYwd
そもそもその後の for 以下を読めば C 全般に適用とかの変な解釈するわけないと思うんだが...
167:デフォルトの名無しさん
14/04/06 19:22:56.79 714kpsax
>Such type names are reserved by POSIX for future extensions and should generally be avoided for user defined types.
→
POSIXによって予約されているため
ユーザー定義型での使用は避けるべきである
POSIX準拠システムでのアプリケーションプログラムを超えて
POSIXと関係ないオペレーティングシステムのアプリケーションにまで言及しとりますがな
168:デフォルトの名無しさん
14/04/06 19:41:42.06 YqB/fCSo
避けるべきということに変わりはないだろ
お前は移植性の事全く考えないの?
POSIXでないシステムの方が圧倒的に少ないというのに
169:デフォルトの名無しさん
14/04/06 19:47:23.97 X8q2hYwd
で、どこに C 全般とか書いてあるんだ?
170:デフォルトの名無しさん
14/04/06 19:54:26.32 PoyortF4
>>167
"by ISO/IEC"でなく"by POSIX"という時点でお察し(ry
171:デフォルトの名無しさん
14/04/06 19:56:17.95 k991ba7o
なんでこんなに揉めるんだ?
Cのtypedefの説明に「_tはPOSIXで予約済」
って書いてあったら
POSIX系以外も従う必用性がある
ように読めるだろ。
>避けるべきということに変わりはないだろ
それは書いた人の主観であって
百科事典の説明に書くべきじゃないぞ。
技術文書書いたこと無いの?
172:デフォルトの名無しさん
14/04/06 19:58:14.20 k991ba7o
「POSIXではオペレーティングシステムの為に予約」
という表現にすれば問題なくなると思うのだが
173:デフォルトの名無しさん
14/04/06 19:59:31.29 14wt57ia
>>158
いっぱいあるんだな……
174:デフォルトの名無しさん
14/04/06 20:13:54.33 IsEOtgMD
_t はタグのtなのかtypedefのtなのかどっちですか?
175:デフォルトの名無しさん
14/04/06 20:16:44.81 YqB/fCSo
>>171
読めないよ
俺C言語で新しいOS書いたわー
そのOSでは大文字で始まる型名予約してるから使うなよ!って書いて、誰がC言語全般に影響あると思うんだ?
176:デフォルトの名無しさん
14/04/06 20:22:32.03 YqB/fCSo
POSIXが何かわかってるやつはC言語全般に影響が~なんて誤解しない。
POSIXが何かわかってない奴は(圧倒的多数であるPOSIXシステムで動かされる可能性を考慮して)無条件に従っておいた方がいい
なんの問題もない。
177:デフォルトの名無しさん
14/04/06 20:22:37.76 ZIQhn8PO
Wikipediaの内容についての議論はWikipediaのTalkページでやれよ
178:デフォルトの名無しさん
14/04/06 20:24:58.76 X8q2hYwd
>>171
> なんでこんなに揉めるんだ?
単なるしきたりを
> POSIX系以外も従う必用性がある
> ように読めるだろ。
なんて言うアホがいるからだろ。
179:デフォルトの名無しさん
14/04/06 20:29:09.78 k991ba7o
>>178
説明の文面が妥当かどうかの話をするときに
どうしてシキタリが出てくるんだよアホですか?
180:デフォルトの名無しさん
14/04/06 20:30:38.36 8z3KlCR7
もうここで議論するべき内容ではないどっか行け
181:デフォルトの名無しさん
14/04/06 20:34:13.86 X8q2hYwd
convention も読めないアホは口挟むなよ (w
182:デフォルトの名無しさん
14/04/06 20:36:21.69 PoyortF4
なかなか面白かった
>>174
型名(type name)のtらしい…俺はtypedefのtって思い込んでたけど
URLリンク(stackoverflow.com)
183:デフォルトの名無しさん
14/04/06 20:44:57.82 k991ba7o
>>181
「Cのsize_t(しきたりでtypedefには_tを付けたもの)は
POSIXによって予約されている」
などと言っている出鱈目なWikipediaの説明が
妥当だと思うアホはすっこんでろ
184:デフォルトの名無しさん
14/04/06 20:57:23.37 6fUxN2Jx
All rights are reserved by POSIX.
185:デフォルトの名無しさん
14/04/06 20:57:26.93 X8q2hYwd
>>183
誰が妥当って言ってるんだ?
俺は単にそう書いてると言ってるだけだぞ。
まあ、しきたりで自爆したからごまかしたいんだろうけど (w
186:デフォルトの名無しさん
14/04/06 21:05:47.20 frwmbROr
NG推奨ワード:
Qz
STL
ヘッダ
POSIX ←new
片山
hoge
187:デフォルトの名無しさん
14/04/06 21:23:14.93 YqB/fCSo
CがNGワードになる日も近いな
188:デフォルトの名無しさん
14/04/06 21:28:22.80 5rOAt6qX
>>186
え、いつの間にかSTLとヘッダもアウトになってたのかw
ここは酷いインターネッツですね
189:デフォルトの名無しさん
14/04/06 21:39:32.30 uqLF0x8H
>>186
ついでに
スレが荒れるのでCやC++に関することはすべて厳禁
190:デフォルトの名無しさん
14/04/06 21:52:35.54 EzHv0eI8
まどろっこしいな
ようは2ちゃんねるの禁止が落としどころだよね
191:デフォルトの名無しさん
14/04/06 22:19:16.09 2m7iHXEE
p2使えないから2ch廃止でいいよもう
出先で書き込めなくてもどかしいったらありゃしない
192:デフォルトの名無しさん
14/04/06 22:35:34.44 yUhKfMaZ
●は使えるだろ
●が無いとスレ立てできない
193:デフォルトの名無しさん
14/04/06 23:14:43.66 2m7iHXEE
浪人ってやつ?
買う気ないからひろゆきの新しい方に期待するわ
194:デフォルトの名無しさん
14/04/07 01:28:14.02 AB68SSs6
SYSTEMTIMEの引き算をしたくて
URLリンク(stackoverflow.com)
の回答4にある
SYSTEMTIME operator-(const SYSTEMTIME& pSr,const SYSTEMTIME& pSl)
をそのまま使って、
SYSTEMTIME ts,te,tdif;
GetSystemTime(&ts);
Sleep(1000);
GetSystemTime(&te);
tdif = te - ts;
としたら、最後の引き算の行で、
エラー 1 error C2676: 二項演算子 '-' : 'SYSTEMTIME' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
と出るのですが、解決方法がわかりません。どうしたらよいでしょうか?
195:デフォルトの名無しさん
14/04/07 02:54:37.57 LXdO3Noc
>>194
teのアドレス - tsのアドレスをtdifに入れるというおかしな事してる
196:デフォルトの名無しさん
14/04/07 04:02:36.25 Yfheg34z
>>194
operator-()の定義かプロトタイプ宣言を
WinMain()だかtmain()だかの前でやれば解決する、と予想
197:デフォルトの名無しさん
14/04/07 04:21:05.28 AB68SSs6
皆さん
アドバイスありがとうございました。
>>196
その通りでした。プロトタイプ宣言忘れていました。
無事に動いたのですが、実行結果がおかしいのです。
約1秒の差が計測できると思ったのですが、
tdifの中身を見ると、
wYear 1601 unsigned short
wMonth 1 unsigned short
wDayOfWeek 1 unsigned short
wDay 1 unsigned short
wHour 0 unsigned short
wMinute 0 unsigned short
wSecond 1 unsigned short
wMilliseconds 515 unsigned short
となっていますので
1601年1月1日0時間0分1.515秒
の差ということでしょうか?どういうことでしょうか?
198:デフォルトの名無しさん
14/04/07 04:29:51.17 Yfheg34z
>>197
URLリンク(msdn.microsoft.com)
199:デフォルトの名無しさん
14/04/07 06:08:42.83 NjqqbTFI
>>197
SYSTEMTIME ってカレンダーの年月日時間みたいなもの。
それらの引き算をカレンダーの年月日時間にするってへんだろ。
結果のカレンダー年月日時間は0年0月0日0時0分1.515秒ですって、カレンダーではありえないだろ
期待する結果は年月日時間で表せる差じゃないか(1年2ヶ月3時間4分5秒違うとか)
200:デフォルトの名無しさん
14/04/07 11:35:54.05 uM+gajuN
>>197
SYSTEMTIMEの起点は1601年1月1日0時0分0秒
つまり、ゼロをSYSTEMTIMEとして解釈すると「1601/01/01 0:00:00」になる
201:デフォルトの名無しさん
14/04/07 13:13:30.33 8ZhLD5KA
どうでもいいけど、>199は説明が下手だな。
202:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/07 14:25:12.80 nfj7Xkns
SystemTimeToFileTimeを使ってSYSTEMTIMEをFILETIMEに変換して、
ULARGE_INTEGERを使って64ビット整数に変換して、引き算をする。
203:デフォルトの名無しさん
14/04/07 15:40:44.16 4PSeJxmH
時刻と時間の違いが分かってないタイプ?
204:デフォルトの名無しさん
14/04/07 18:59:37.11 iQnUI2e5
>>202
194がやっているのがまさにそれなんだけど、問題は戻り値の型が時間間隔ではなく
時刻を表す型になっていることだから、
>>194 の operator-() の戻り値を __int64 にして v_res=v_right-v_left; 以下を
return v_res; に変えれば100ナノ秒単位の経過時間が得られるようになる。
100ナノ秒じゃ細かすぎるというなら、戻り値を double にして return v_res / 10000.0;
に変えるとか工夫しろ。
205:デフォルトの名無しさん
14/04/07 19:23:33.56 BajMmze5
>>202
時間差(経過時間)を秒単位ではなくて、年月..秒で表すものにしたいから、
SYSTEMTIMEを戻り型にしているんじゃないのか
Winで経過時間を求めるのにSYSYEMTIMEを使うって普通なのか?
違うなら何を使うのが多い?
206:デフォルトの名無しさん
14/04/07 19:29:45.40 4vTqmZSq
よく分からんがC++なら<chrono>使えばいいんじゃね?
Win依存でいいならtimeGetTimeとかQueryPerformanceCounterとかがあるし
207:デフォルトの名無しさん
14/04/07 20:26:10.88 Y4utMABq
「時間差(経過時間)を秒単位ではなくて、年月..秒で表すものにしたい」
という要求下で "年" の計算にうるう年の考慮は必要だろうか?
208:デフォルトの名無しさん
14/04/07 20:35:46.78 4vTqmZSq
>>207
その辺難しいよね
365日とするか365.2425日とするか365.2422日とするか……
表示を日までに済ませておくのが無難かと
209:デフォルトの名無しさん
14/04/07 21:01:58.18 iQnUI2e5
>>208
.NETのTimeSpanクラスはそうなってるね。
内部表現は100ナノ秒刻みの整数値で、ミリ秒、秒、分、時間、日への変換はするが
月、年への変換はしない。
210:デフォルトの名無しさん
14/04/07 21:27:01.61 dmj0DO96
>>207
それ以前に月が 30日でいいのかと...
211:デフォルトの名無しさん
14/04/07 21:32:53.82 Y4utMABq
>>210
あああああーーーーー
考えるほどマンドクサイっすな
212:デフォルトの名無しさん
14/04/07 21:49:28.54 wQYu7k63
>>186
なんでQZが筆頭なんだ?
213:デフォルトの名無しさん
14/04/07 21:52:25.42 pviM0T4Q
どう考えても一番の荒らしです
214:デフォルトの名無しさん
14/04/07 22:31:32.85 tNhu6rzw
片山やhogeよりPOSIXが上なのかw
215:デフォルトの名無しさん
14/04/07 22:33:46.15 4vTqmZSq
質問いい?
switch構文のcase内で変数宣言したら、それについて
「'変数' の初期化が 'case' ラベルによって行われませんでした。」
って言われたんだけどどういうことなの……?
ついでにswitch部分に赤波線が付いて、「制御の転送は次の初期化をバイパスします」
って言われたんだけど何故エラーになるのか意味が分からない。誰か分かる人教えて下さい
(VS2013でコンパイルしている時に発生)
216:デフォルトの名無しさん
14/04/07 22:35:47.03 2mFu56Lz
caseだけだとスコープが同じになる
ブロックをつければいい
217:デフォルトの名無しさん
14/04/07 22:40:02.07 Y4utMABq
switch () {
case A:
{ // ローカルスコープにしちまう
int a;
} break;
case B:
…
default:
…
}
218:デフォルトの名無しさん
14/04/07 22:41:30.01 4vTqmZSq
>>216
ブロックを付けるって、要するに
case test:
~
break;
を
case test:{
~
break;
}
にするってことでいいの?
219:デフォルトの名無しさん
14/04/07 22:47:22.50 2mFu56Lz
Yes
220:デフォルトの名無しさん
14/04/07 23:30:25.89 H5+AU72d
個人的にはbreakは外に出したいな
221:デフォルトの名無しさん
14/04/08 00:20:22.54 lvT6VRY6
case test:としたときに
testにおけるのは何?
int a,b,c;
...
switch()
case (b=a+1, c++, C): なんてのでもOK(試してないけど)?
222:デフォルトの名無しさん
14/04/08 00:23:17.09 lXmRpq/E
>>221
試せ
223:デフォルトの名無しさん
14/04/08 00:32:19.53 zX8m8ach
>>221
ラベルだけだよ
224:デフォルトの名無しさん
14/04/08 00:32:44.67 4GqgTU2E
>>221
定数の整数式とscoped enumの値だけ
switch (a) case std::integral_constant<int, 6>::value:;
225:デフォルトの名無しさん
14/04/08 13:44:22.59 J+Ne3rG0
最近、よその板で、"「"だけで右を閉じてないのが流行ってるのか
すんげーむずむずするんだが
226:デフォルトの名無しさん
14/04/08 14:02:26.18 M2I5N33k
>>225
在日のおまえは知らないだろうが、明治時代からある用法だぞ。
227:デフォルトの名無しさん
14/04/08 16:39:02.94 9nnVwB+Q
>>226
(正直鬼物語で見たのが最初だなんて言えない)
228:デフォルトの名無しさん
14/04/08 17:27:19.75 DhHmBmSp
エロゲーでは普通じゃないのか?
229:デフォルトの名無しさん
14/04/08 18:01:46.09 Agmut9XT
どんな使い方なんだ?
(ry なんかはときどき見るな
閉じていない括弧に違和感を持つのはある意味プログラマらしいか
230:デフォルトの名無しさん
14/04/08 18:31:11.83 Bi2RyCEo
カッコつけてんじゃね~よ
231:デフォルトの名無しさん
14/04/08 18:50:35.55 C0aY6nOj
つけてねーよ
232:デフォルトの名無しさん
14/04/08 19:05:43.04 Ge61TJlR
case 1+1;
goto 2;
goto 1+1;
goto 2*1;
各環境でナニがドコまで許されるのか興味はあるな
233:デフォルトの名無しさん
14/04/08 22:58:16.49 5xZMJR+X
>>229
プログラマは、半開区間が大好きさ!
[0, 4)
234:デフォルトの名無しさん
14/04/08 23:04:52.46 9wIzdaaz
>>233
ワロタ
235:デフォルトの名無しさん
14/04/09 00:10:02.38 dDyddEcZ
もう全て半角にして英語圏顔文字でも使っとけよ:D
236:デフォルトの名無しさん
14/04/09 04:45:08.14 GDCkrjSs
roffとか気持ち悪いよな
237:デフォルトの名無しさん
14/04/09 13:15:17.74 /wyRfLaC
>>236
UN*XやるまえにDOSでTeXやってたからあれは意外になんとも
かつては汗でパーサ書いてたっていうから、まあそういうことなら。
238:デフォルトの名無しさん
14/04/13 08:17:37.43 7/oWURrR
time関数は1970年からの秒数らしいですが
long型で格納するとなると、68年くらいで限界が来ませんか?
2038年くらいにいろんなプログラムやばいっすか?
239:デフォルトの名無しさん
14/04/13 08:24:54.58 2iqAA/H6
2000年問題の時に話題にあがりました 「2038年問題」でぐぐれぇ
240:デフォルトの名無しさん
14/04/13 08:30:51.23 7/oWURrR
おーやべえ
でも今からプログラムつくろうとするとtime_tは64bitで定義されてるっぽいですね
3000億年まで安心か
241:デフォルトの名無しさん
14/04/13 09:06:00.54 olete8aZ
炎上学習法は要りません
242:デフォルトの名無しさん
14/04/13 09:33:49.42 m7xM1FWF
どこが炎上してんだよ
243:デフォルトの名無しさん
14/04/13 15:21:37.00 qnyX9I3J
2000年の頃は見えないほど先の話だと思っていたが
既に3分の1消化してるんだな
244:デフォルトの名無しさん
14/04/13 18:18:53.37 CtgsENNt
1000年以上先の問題ならまだしも、38年だと分野によっては平気で使われ続けるからな
245:デフォルトの名無しさん
14/04/13 18:50:58.03 Am7dEU9n
言わんとしてることはわかるからいいんだけど、64bitでコンパイルしてlongが32bitなのMSのコンパイラぐらいだぞ
246:デフォルトの名無しさん
14/04/13 18:52:32.07 P3Ox4abS
互換性を優先したんだろうね
247:デフォルトの名無しさん
14/04/13 18:55:12.72 N2UMgO6H
time_tは64bitになってるから許してやれ
248:デフォルトの名無しさん
14/04/14 07:18:41.20 CAt5QB21
URLリンク(ja.wikipedia.org)
同じソースでlongが32bitになったり64bitになったりする方が混乱するわ
昔intが16bitになったり32bitになったりで難儀した
249:デフォルトの名無しさん
14/04/14 08:17:35.70 XwQYiHbH
typedefせずソースに直接intとかlongとか書いてるの?
250:デフォルトの名無しさん
14/04/14 08:28:42.62 iMQET/ga
>>248
つstdint.h(cstdint)
規格仕様上複数マシンで動作できることを重視したから型ごとの制約が緩いのよね
と言うか既出の話題だったわw
スレリンク(tech板:61-69番)
251:デフォルトの名無しさん
14/04/14 11:00:15.74 fXV0vjOD
vectorにクラスを格納するのって
#include <iostream>
#include <vector>
class c_myclass
{
public:
void myfunc(int num)
{
std::cout << "myfunc" << num << " が呼び出されました \n";
}
};
int main()
{
c_myclass temp;
std::vector<c_myclass> vec;
for(int i=0; i<10; ++i)
vec.push_back(temp);
for(int i=0; i<vec.size(); ++i)
vec[i].myfunc(i);
return 0;
}
このような感じでよろしいでしょうか?
ちなみに
サイズを指定する場合は
std::vector<c_myclass> vec(10);でしょうか?
252:デフォルトの名無しさん
14/04/14 11:15:14.08 Kn6UHMuG
よろしいです
しいて言えば
vec.push_back(temp);
より
vec.emplace_back();
の方がよろしいかと思われます
253:デフォルトの名無しさん
14/04/14 11:22:23.22 fXV0vjOD
>>252
ありがとうございます
もしよろしければemplace_back()について解説お願いします
リファレンスを見てもよくわからなかったので
254:デフォルトの名無しさん
14/04/14 11:23:47.56 Kn6UHMuG
コンストラクタを直接呼び出してくれるpush_backでございます
コピーが発生しないので多少効率的になります
255:デフォルトの名無しさん
14/04/14 11:25:50.80 fXV0vjOD
>>254
なるほど
256:KUSO KOTE ◆unko./w.Osri
14/04/14 12:36:29.24 8ev4IZFy
>>253
もしc_myclassにc_myclass(bool,double)みたいなコンストラクターがあったら、
emplace_back(true,1.23)とすることが出来て
かつvectorの中の格納領域上に直接c_myclassを作成できる。
と思う(想像)。
257:デフォルトの名無しさん
14/04/14 15:28:45.80 MAoTOR9V
emplace*()はいいね。巨大なクラスを連想配列に放り込む時に重宝だよ。
258:デフォルトの名無しさん
14/04/14 16:17:06.14 /qNJTuFi
open(2)したディレクトリを直接read(2)する方法ってあります?
259:デフォルトの名無しさん
14/04/14 16:37:16.17 oIWmwaCC
日本語でおk
260:デフォルトの名無しさん
14/04/14 17:29:53.33 aQsMBHRD
↓ちなみにひろゆきサイドの開発者はめちゃくちゃ臭い
4095 :名無しさん@13周年 :2014/04/14(月) 04:46:02.73 ID:wJLzpOd2P(4)
jimがさくらのクローラを遮断したみたいだな
迂回しても迂回→遮断のイタチごっこは目に見えてるので遮断できない方法でdatを引っこ抜くまでだ
具体的には専ブラっぽい挙動でnetからdat引っこ抜いてscに投げるスクリプト書いてやるからお前らそれブン回せ
たらこにはリクエスト+受け取り+改ざんチェック用のスクリプト書いてやるよ
あー久しぶりにemacs起動するわ
3時間で書いてやる
4209 :名無しさん@13周年 :2014/04/14(月) 09:22:21.15 ID:wJLzpOd2P(4)
あとちょっと書き足してバグとったらexeで配るよ
さしあたりdatの回収は俺がやっとく
C++で書きなおして独自の難読化施してるからnetの奴らにREできるかな?マカフィーでも無理なんじゃないかな
4210 :名無しさん@13周年 :2014/04/14(月) 09:24:13.59 ID:wJLzpOd2P(4)
今の時点で一つ言えるとしたら不特定多数を舐めるなってこと
あー久しぶりにemacs起動するわ()
3時間で書いてやる()
C++で書きなおして独自の難読化施してるからnetの奴らにREできるかな?マカフィーでも無理なんじゃないかな()
不特定多数を舐めるなってこと()
261:デフォルトの名無しさん
14/04/14 18:01:44.00 0/p4fR0J
いちいち持ってくるお前も臭い
262:デフォルトの名無しさん
14/04/14 19:15:32.34 yacO1o/C
>>258
できるでしょ?readdir(3C)とかは内部ではreadを呼んでる
263:デフォルトの名無しさん
14/04/14 20:02:57.67 g31zNjzu
>>262
read(2) の manには
EISDIR fd refers to a directory.
Other errors may occur, depending on the object connected to fd.
POSIX allows a read() that is interrupted after reading some data to
return -1 (with errno set to EINTR) or to return the number of bytes
とある
264:デフォルトの名無しさん
14/04/14 20:41:55.55 DVvt3Ia1
最近C++勉強始めたんですが、質問があります。(Cは良く分っているつもりです)。
C++には参照渡しという記述方法があることを知ったのですが、Cのポインタ渡しに
慣れている私としては、参照渡しを使わずにすべてポインタ渡しでコードを記述する
ほうが見易いので、そうしようかと思うのですが、何かデメリットありますか?
参照渡しを使うほうがよい点などありましたら教えてください。
265:デフォルトの名無しさん
14/04/14 20:51:36.33 UPYb5gKr
(個人的に思う)一般的に
ポインタで渡す=ヌルが渡ってくる可能性がある、つまり、常にヌルチェックが必要
ポインタで渡す=ヌルが渡せる、この引数はオプション的である
参照で渡す=なんかしらわたってくる、ヌルチェック不要
参照で渡す=この引数は必ず必要である
あと一時変数オブジェクトの寿命の関係とかあった気がするが忘れたw
266:デフォルトの名無しさん
14/04/14 21:14:47.05 iMQET/ga
>>264
ポインタ渡しと違い、参照渡しの場合、
・絶対に実体があるので、適当なアドレスが渡って
不正なメモリアクセスを行うことがない
また、参照する中身は変更できないので紛れがない
・普通の変数と同じように記述できる。構造体のメンバ関数にも
アロー演算子ではなくドット演算子でアクセスできる
また、関数の引数に使った際、呼び出す側としてはいちいち
アドレスを渡すということを意識せず使用できる
・ポインタと違い参照自体にはメモリ消費がない
こんなところか
267:デフォルトの名無しさん
14/04/14 21:17:29.88 lcY87dee
返り値の話ではないとして。
参照渡しの一番のメリットは渡したオブジェクトの所有権が移動しない事がわかる事かな。
268:デフォルトの名無しさん
14/04/14 21:21:57.27 lEZQ3TFl
メモリ消費がないというのは不適切だろ
インラインで消えたりするが
269:デフォルトの名無しさん
14/04/14 21:46:00.21 iMQET/ga
>>268
いや、俺の持ってる本では
「ポインタと違って独自にメモリ領域が割り当てられない」
的なことが書いてあるんだが……違うの?
270:デフォルトの名無しさん
14/04/14 21:49:58.13 7APDnn3f
(お前が)(malloc/new等で)と読めなくもないが大丈夫か
271:デフォルトの名無しさん
14/04/14 21:55:35.64 buURFUek
初期のC++はC言語へのコンバータで実現してたろ。
参照も内部的にはポインタ動作と変わらないかと。
272:デフォルトの名無しさん
14/04/14 22:00:06.15 iMQET/ga
>>271
それって「参照がポインタで実装されてる(ことが多い)」って話じゃなかった?
273:264
14/04/14 22:02:44.39 DVvt3Ia1
みなさん解説ありがとうございます。
大変参考になります。
>参照渡しの一番のメリットは渡したオブジェクトの所有権が移動しない事がわかる事かな。
もう少し詳しく解説お願いします。
274:デフォルトの名無しさん
14/04/14 22:04:37.96 iMQET/ga
あとこんなページも見つけた
URLリンク(detail.chiebukuro.yahoo.co.jp)
URLリンク(www.osak.jp)
275:デフォルトの名無しさん
14/04/14 22:18:22.93 msrdBAHC
>>269
通常の実装では、呼び出し側ではスタックにアドレスを積むという点で全く同じだし、
呼ばれる側でもそこを参照するのに違いはないよ。
まぁ、インライン展開で消えれば話は別だけど。
一番のメリットは、(参照先ではなく)参照自体を書きかえられないことだね。
それもまた、ポインタでもconstにすればできるわけだけど。
276:デフォルトの名無しさん
14/04/14 22:54:29.26 CAt5QB21
URLリンク(codepad.org)
この例ではポインタで渡す気が起きない
277:デフォルトの名無しさん
14/04/14 23:06:35.99 lcY87dee
>>276
const付けような。
278:264
14/04/14 23:14:28.51 DVvt3Ia1
>276
サンプルコードありがとうございます。
>この例ではポインタで渡す気が起きない
すみません、まだよく分らないのですが、ポインタで
void WriteLine(const string *pstr)
{
printf("%s\n", pstr->c_str());
}
のようにすると何か問題があるのでしょうか?
279:デフォルトの名無しさん
14/04/14 23:17:14.74 lcY87dee
URLリンク(codepad.org)
参照にするとこうかける
280:デフォルトの名無しさん
14/04/14 23:20:11.44 i+D5B13r
>>273
++や--の挙動がポインタと参照で違うんじゃね?
281:デフォルトの名無しさん
14/04/14 23:32:46.57 lcY87dee
>>273
ポインタでオブジェクト返されると誰がdeleteすべきなのかドキュメント見るか返す関数の中身見るまでわからないよね?
参照にすると返したやつが所有している物の中身を見させて貰ってるってことがわかるからdeleteしなくていいって事がドキュメント見なくてもわかる。
引数でもポインタだと引数で渡されたポインタを内部で保持しておくから呼び出し側でdeleteや中身の変更をしてはだめになるのかとかわからない。
282:デフォルトの名無しさん
14/04/14 23:41:59.74 CAt5QB21
>>278
URLリンク(codepad.org)
ポインタでも書けるしこの例では問題はない
が、やっぱり人に見せると「何で参照使わないの?」と言われそう
283:デフォルトの名無しさん
14/04/14 23:54:52.78 73GA0vhp
string *str = new string("hello");
....
delte str;
....
WriteLine(str); //deleteしてるけど、、、ポインタ値は生きてるから アッー
結局、コンテナをうまく使って生ポ(生new)は極力排除しようぜって流れ
284:デフォルトの名無しさん
14/04/14 23:59:10.65 lcY87dee
>>282
なんで「何で参照使わないの?」と言われるのかその理由を書かないと意味ないだろ。
たとえば
URLリンク(codepad.org)
文字列を返す関数と文字列を引数にとる関数があるとする。
参照だったら文字列を返す関数を文字列を引数にとる関数の引数に直接書ける
ポインタだったら一度ローカル変数で受け取ってそのポインタを書かないとだめ
285:デフォルトの名無しさん
14/04/15 00:13:55.46 MOmoi8a1
int& a = *(int*)0;
a = 0;
286:デフォルトの名無しさん
14/04/15 00:17:57.06 lShoPitp
ポインター操作が目的でなく
null許可を表現させたいわけでもなく
読み取り用途限定の時に
わざわざポインターを使う方が不自然
287:デフォルトの名無しさん
14/04/15 00:21:36.20 jMxUSFKT
>>285
一行目がダメコードって一目瞭然じゃないか。
ポインタだったらnullを渡すのが悪いのか?nullチェックせずに代入するほうが悪いのか?になる
>>286
ポインタしかない世界から来た人には多分通じないよ。
288:デフォルトの名無しさん
14/04/15 00:25:16.54 hh7KqCRP
生ポ引数/戻り値なんて特別理由がある場合以外は使うなってこった
289:264
14/04/15 00:28:56.87 7FIahpja
私なりに結論を出してみたのですが、
参照渡しをするのは、
void WriteLine(const string &str);
みたいに、その関数に値を読み取り限定で渡す場合に主に使う。
ただし、必ずconstを付けておく。
上記以外はポインタ渡しを使う。
で良いでしょうか?
290:デフォルトの名無しさん
14/04/15 00:35:43.12 8L+RgIaL
参照はポインタの初心者版みたいなもの。
使い方が分からないのがあえて使わなくていい。
291:デフォルトの名無しさん
14/04/15 00:36:31.44 c0zlhsuS
>上記以外はポインタ渡しを使う
いいえ。
その他にもムーブセマンティクスを達成
したいときにも参照を使います。
292:デフォルトの名無しさん
14/04/15 00:45:18.87 jMxUSFKT
>>290 っていうC++初心者が書くコードはひどく読みづらいので真に受けたらだめ
293:デフォルトの名無しさん
14/04/15 01:27:44.04 PjplhgrG
ageる奴は碌なこと喋んねーな
294:デフォルトの名無しさん
14/04/15 03:06:53.30 2JpOUwgl
>>289
漏れも俺様ルールで、const参照は読み取り用、
ポインタは値を変更する時と、使い分けている
295:デフォルトの名無しさん
14/04/15 06:05:04.19 sGkhMKKa
>>289
URLリンク(ideone.com)
なかなかいい例が思い浮かばないが
この例ではconstを付けられないが参照が相応しいと思う
全てに当てはまる使い分けの条件は提示できないので
個人やチームの判断で使い分けするしか
296:デフォルトの名無しさん
14/04/15 07:52:53.60 AA0ZYDWw
格納場所という意味で>289が作った関数仕様を実装する場合も、自衛はするべき。
void readSome(Type * const result)
{
// ++result; // これがエラーになってくれる。
}
297:デフォルトの名無しさん
14/04/15 08:09:35.12 6lm4j3zL
俺はしないな。
意味的にはそうなのだけれど
C++のconstは真面目に付けると可読性を著しく損なう
298:デフォルトの名無しさん
14/04/15 08:59:58.71 Byz6doxp
>>263
うん。262は間違いでした。
調べたらreaddirはgetdents(2)を呼んでた
そりゃそうか。ファイルシステムで構造違うしな
299:デフォルトの名無しさん
14/04/15 10:42:12.48 ZiuccpsX
>>296
そのレベルは冗長
300:デフォルトの名無しさん
14/04/15 12:47:22.14 tCJ2yelK
参照なら要らないのにね。
301:デフォルトの名無しさん
14/04/15 12:54:41.51 dDf7e/l1
値渡しの引数にconstをつけるのはやりすぎな気がする
void f(const int x) なんてしないでしょ
302:デフォルトの名無しさん
14/04/15 13:09:58.76 tCJ2yelK
する奴いるよ。きっと>296も同じタイプ。
303:KAC
14/04/15 13:26:56.79 OYr23JgA
>>296
なんか違う事書いてるぞ。>289の仕様満たすならconstは*の左。
>>297
どんな所で可読性が落ちるって?
お前がまともに使えないだけじゃないの?
304:デフォルトの名無しさん
14/04/15 14:19:33.38 SFbbbO6x
流れぶった切って悪いんですが
>>251の
c_myclassがインターフェースクラスを継承している場合は
継承元メンバ(インターフェースクラス)に仮想デストラクタを書いておけば良いのですか?
305:デフォルトの名無しさん
14/04/15 14:41:39.21 tCJ2yelK
>>303
>296が言いたいことは、>289の仕様ならconst * string const strだろ。
306:デフォルトの名無しさん
14/04/15 14:42:44.92 tCJ2yelK
いけね、Typo。
string const * const strね。
307:デフォルトの名無しさん
14/04/15 14:59:38.52 JmWJ8ekL
>>304
違いが分かればよいのだが…
URLリンク(ideone.com)
308:デフォルトの名無しさん
14/04/15 15:09:29.49 SFbbbO6x
>>307
さらっと確認したので怪しいのですがたぶん
クラスAには仮想デストラクタが無い為に
newしたオブジェクトがデリートされる際、継承元のデストラクタが呼び出されていませんが、
クラスBは仮想デストラクタがメンバにあるので
deleteされる際に継承元のデストラクタが呼び出される訳ですよね
そこで、ベクターにオブジェクトを格納する話につながる訳ですが
>>251のc_myclassがインターフェースクラスを継承しているときには
やはり継承元のクラスに仮想デストラクタを記述しておかないと危険だという事ですよね?
309:デフォルトの名無しさん
14/04/15 15:27:23.32 JmWJ8ekL
だーね
310:デフォルトの名無しさん
14/04/15 15:32:30.40 SFbbbO6x
確認しつこくてすいませんが
まとめると>>307のdlvBを
dlvB temp
std::vector<dlvB> obj;
obj.push_back(temp);
みたいにしちゃっておkってことですよね
311:デフォルトの名無しさん
14/04/15 18:05:27.38 ef3kTbvB
>>310
そうしたいなら仮想デストラクタとか仮想関数とか関係ない。
コピーコンストラクタを作ればいいだけ。
312:デフォルトの名無しさん
14/04/15 18:37:17.89 u428dFct
std::vector<clsB>にdlvB型のオブジェクトを突っ込むとスライシングでダメになるから気をつけるように
多態をコンテナ内で実現したいならstd::shared_ptrやunique_ptrを入れるのがよい
313:デフォルトの名無しさん
14/04/15 20:01:11.81 Nbqron3B
仮想デストラクタが必須なのは当然として
vectorに突っ込むケースを考えると
難易度としては
vetcor<Base>
vetcor<Base*>
vetcor<shared_ptr<Base>>
ptr_vector<Base>
こんな感じじゃね?
それぞれ注意点はあるが
一見簡単そうに見える
vetcor<Base>
が一番きつい
314:デフォルトの名無しさん
14/04/15 20:12:18.40 MU2KfTCa
>vetcor<Base>
そもそも派生クラスを突っ込めない。
>vetcor<Base*>
所有権がどこにあるのか分からないので論外。
>vetcor<shared_ptr<Base>>
virtualデストラクタ不要で便利。
>ptr_vector<Base>
今更ptr_vector?unique_ptrでいい。
315:デフォルトの名無しさん
14/04/15 20:33:50.00 O7xBtcGx
make_uniqueが標準に入らないと、記述量がちょっと面倒
316:デフォルトの名無しさん
14/04/15 20:42:49.07 Nbqron3B
>>314
たしかに
デザパタで
知らんかった
流行り廃りとかあるの?デザパタで
317:デフォルトの名無しさん
14/04/15 20:49:25.61 aOtL598m
std::unique_ptrはvectorに突っ込めるのにboost::scoped_ptrは出来ないのはなんで?
318:デフォルトの名無しさん
14/04/15 20:54:50.82 tBkVUf7m
moveできないから
319:デフォルトの名無しさん
14/04/15 23:53:29.68 hh7KqCRP
noncopyableだからだろ
320:デフォルトの名無しさん
14/04/15 23:56:04.64 of9IS0B8
ユニポもそうだけど
321:デフォルトの名無しさん
14/04/16 00:00:41.11 cUKcFdx2
>>320
すまん、そうだね、copyかmoveが出来ないとコンテナには入れられないということで