【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2016/11/06(日) 22:58:02.60ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
477デフォルトの名無しさん
垢版 |
2017/02/23(木) 18:23:14.57ID:sZtROie8
>>476
こんすとらくたがprivateだから
478デフォルトの名無しさん
垢版 |
2017/02/23(木) 18:23:56.57ID:2nyak89s
そういうことかあ
あざす
2017/02/23(木) 21:15:37.70ID:JF3nU8GT
生成出来ないクラスってやつね。
2017/02/23(木) 21:50:10.15ID:33+Wu0JT
>>479
friend なクラスからしか生成しないようにするとかはあるね
2017/02/23(木) 21:52:15.77ID:JF3nU8GT
はい そゆ事。
2017/02/23(木) 21:53:15.53ID:0FbQfq3V
staticメソッドで生成するって形の時に使うことが多い
singletonとか
2017/02/23(木) 22:20:39.38ID:v0zRNZ3l
ctorはpri.でメンバーはpub.って
どういうことなんだ?
2017/02/23(木) 22:26:42.14ID:I6Uc1mEc
一つ前のレスも読めない文盲
2017/02/23(木) 22:44:21.27ID:SD8t1ALL
質問
C/C++でランタイムで現在のメモリの状態
とくにプロセスが使える余っているメモリの量って調べ方はありますか?
2017/02/24(金) 08:45:12.70ID:SswDvM4l
環境すら書かないと言うことは
(実質)環境非依存での方法を聞いてるんだろうな?
487デフォルトの名無しさん
垢版 |
2017/02/24(金) 08:54:02.15ID:See/JzpM
そんなもん無いけどな
2017/02/24(金) 09:53:13.79ID:0sr6h+Re
失敗するまでmallocやnewを繰り返せばええんや
489デフォルトの名無しさん
垢版 |
2017/02/24(金) 10:43:32.63ID:See/JzpM
>>488
Linuxじゃ失敗しないよ
490デフォルトの名無しさん
垢版 |
2017/02/24(金) 10:53:37.11ID:See/JzpM
もたろん割り当てるアドレス空間自体が足りなくなったとか、予め上限を設定しておいたとかいうケースは覗いてな
2017/02/24(金) 11:09:14.16ID:9xRtAprE
16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。

それはわかる。

逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
2017/02/24(金) 11:41:21.86ID:KhjrQy0g
基本的にでっかくメモリ確保というプログラムは作った事がないな。
今はSTLでほげほげ追加してくイメージ。
493デフォルトの名無しさん
垢版 |
2017/02/24(金) 11:47:17.85ID:See/JzpM
>>491
>16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。
そうとは限らない。一般的なLnuxの環境依存ではmallocを搭載メモリ以上行っても失敗しない
swap含めて1GBしか積んでいない環境で2GB分malloc可能。確保した領域に書き込んだタイミングで記憶する領域が足りなくなったら色々なプロセスが殺される。oom killerと言われてるもの。
>
逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
実装による。現代的なコンピューターではページ単位(4KB)とかでカーネルからプロセスへすきなアドレスへメモリを割り当てられるから物理的なアドレスが連続している必要はない。
プロセス内に連続したアドレス空間が残っていない場合は失敗する
2017/02/24(金) 11:52:16.13ID:NAh96dM2
仮想メモリというしくみで色々やってくれるようになって
キャパの限界付近ではややこしくなった印象
2017/02/24(金) 12:48:55.46ID:KhjrQy0g
家鯖は6G積んでるけどそれぐらいは行けるね。
てかkvmやってると、9Gコミットされてるもん。
2017/02/24(金) 15:10:06.50ID:CcmE3pWB
>>488
それスワップエリアのサイズ計ってるだけ
2017/02/24(金) 15:25:25.94ID:nwaeFCKh
winならGetProcessMemoryInfoなど
2017/02/24(金) 17:26:32.84ID:9xRtAprE
>>493
> 物理的なアドレスが連続している必要はない
なるほど、長年の疑問が解消した。
493の読解力に感謝。
499デフォルトの名無しさん
垢版 |
2017/02/24(金) 18:02:34.91ID:See/JzpM
>>498
望む答えだったみたいで良かったわ
熱があって若干朦朧とした頭で読み返さずに書き込んだから今読み返すと誤字とか予測変換で要らない単語入ってたり(一般的なLinux環境)とか、カッコの位置が違う(4KBとかの部分)とかあったけど。
2017/02/24(金) 18:52:48.08ID:dfRROZm/
環境依存ならPostMessageのエラーコードかな
俺はあんま理解してないけど
2017/02/24(金) 19:06:57.61ID:+aOqx8nq
Win32なら信頼のPostMessageだな
2017/02/24(金) 22:16:12.34ID:4ewDjGBZ
またその話題ですか‥
2017/02/24(金) 23:03:49.77ID:TLhS+9k8
はよ10年前のソース出せよ
2017/02/24(金) 23:06:00.45ID:nwaeFCKh
http://i.imgur.com/OwlfgGw.jpg
2017/02/25(土) 07:21:27.70ID:98TUEskp
なんで2分ちょいで出てくるかね。
2017/02/25(土) 08:14:13.74ID:QoR/O5Qa
自演
507504
垢版 |
2017/02/25(土) 08:21:08.89ID:Jm21gNIW
>>503>>504 だ。すまんなw
2017/02/26(日) 18:42:59.30ID:stmjd5mD
味噌県のクセにコーミソース以外のソースを使う非国民は去れ
2017/03/06(月) 07:57:48.79ID:NqblWJNK
#define ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255))))
このマクロの
(2*((A>>1)+64))
この部分なんですが
なんで(A+128)じゃないんですかね?
2017/03/06(月) 08:21:33.22ID:1XvIZqGa
最初の人がコピペで作ったんでしょ。+128に定義し直してるのもあるよ
2017/03/06(月) 08:30:32.82ID:cJfBjMIV
Aが奇数のときの動作が違うね
2017/03/06(月) 10:33:08.69ID:NqblWJNK
A、Bにはuint8を想定してますから、一瞬オーバーフローの関係かなとも思いましたが
そんなことはなく、特に深い意味はなさそうですね
ありがとうございます
2017/03/13(月) 00:19:03.26ID:ZWBqluXH
仮想関数をオーバーライドするときはどう書くのがいい作法?
void vf()
virtual void vf()
virtual void vf() override
void vf() override
2017/03/13(月) 06:06:33.92ID:IkDDkkqX
ハゲ先生によると最後の void vf() override が良いみたい。
『プログラミング言語C++ 第4版』p.592

加えてoverride指定の不整合をチェックするコンパイラオプションだね。
GCCのVersion 5から使える -Wsuggest-override とか。
他のコンパイラについては知らん。
2017/03/13(月) 10:43:38.74ID:Kr7xjXLG
デストラクターに付けてる人はあんま見たこと無いな
class Derived : Base {
public:
 ~Derived() override {}
};
2017/03/13(月) 20:30:08.38ID:VNPYsRzK
Bcc55でtypeofを実現するのは不可能なのかな?
2017/03/13(月) 20:57:04.03ID:VNPYsRzK
古いコンパイラを使ってる人居る?
コンパイラの名前教えて下さい。
2017/03/14(火) 23:30:09.48ID:wzywZVIy
老人がカセットテープデッキ求めたり
熟女モノのエロ本()を求めるような感じ?
2017/03/15(水) 01:04:07.22ID:R2Ueow1p
古いコンパイラと自覚しつつも使ってるような人はこのスレには来ないだろ
時代遅れの遺物の話じゃ通じないし
2017/03/17(金) 11:46:00.03ID:pwo5j4El
何でA、Bを()しないんだ?
2017/03/25(土) 21:37:15.77ID:IRaGixDk
いまだに関数マクロ使ってるようでは
()したところで五十歩百歩
2017/03/25(土) 22:37:56.47ID:9zWIhzFx
>>460
>>465
宣言とかいろいろ確認してやっぱソースはおかしくないよねってことで
サポートに調べてもらったら理由はわからないけど正しく動作する修正方法がわかったって連絡があって
最終的には詳細は書けないけどコンパイラのバグだった
2017/03/26(日) 08:58:38.45ID:4rESVRzB
ここはお前の日記を垂れる場所じゃない
「サポートによるとコンパイラのバグだった」で済むのに
アレやってコレやってを書くな低能
2017/03/27(月) 10:03:34.57ID:wSWIgauQ
事後報告あると参考になっていいんだけどな
今回は本人以外に状況がわからないから事後報告されてもw
2017/03/30(木) 03:06:01.35ID:6sTQLdA2
http://codepad.org/KMQH3TsZ

ポインタをメンバに持たせた場合のget/setの書き方が分かりません
getの方は、ポインタを返すときに返した先で値を変えられないようにconstを付けたのですが、
sizePlus10のような関数を呼びたい場合に、const_castを付けて呼ぶことになってしまいました
値の変更をするのでsetを通してやるのが良いと思うのですが、何か良い書き方ありますか?

また、setの方は、一括で設定させることはできるのですが、
data->id、data->sizeの値を個別に設定したい場合、何か良い書き方はありますか?
コメントの部分のようにsetメンバ関数を何個も書く方法しか思いつきません
2017/03/30(木) 07:50:43.79ID:GtG5BmiK
getDataの結果を修正したいのだから
杓子定規にgetDataの戻りにconst付けるのを止めればいいのではないか

そう言えばC++17(ドラフト)もstring::dataの戻りが非constに修正されたような
2017/03/30(木) 08:08:59.00ID:KJlpKUaR
memcpy w
2017/03/30(木) 10:48:22.67ID:JHpE2Dpf
>>525
一般論として形でただ覚えるのではなくて意味を理解しよう
理解があやしいから設計の一貫性がなく混乱してるようにみえる
・Dataをポインタで所有するのはなぜ
・ゲッター/セッターを使ってアクセスするのはなぜ
・ゲッターで返す値にconstをつけるのはなぜ
・sizePlus10がData*を受けとるのはなぜ

MyClassの設計方針にあわせるならsizePlus10をDataではなくMyClassを受けとるようにして
void sizePlus10(MyClass & mc)
{
Data newdata = { mc.getData()->id, mc.getData()->size + 10 };
mc.setData(newdata);
}
あるいは別の関数を作って
void MyClassSizePlus10(MyClass & mc)
{
Data newdata = *mc.getData();
sizePLus10(&newdata);
mc.setData(newdata);
}

これが変だとか非効率だとか思うなら
MyClassの設計が要求にあってないのでそっちを変更する
2017/03/30(木) 20:11:34.52ID:irpIFLVN
>>528
おまえは質問の意図を理解しよう

>>525
そのsetgetでいいんじゃない?ただそのgetは俺だったらreferにするな
ついでにsetget両方使えるようにdata* operator->()みたいなの実装かな。というかむしろそっちでアクセスする方向にするな
あとはattachdetach作っておいてm_dataを置換できるにようにしちゃうな
その手のスマートポインタは至るとこで使われてるからこんなとこで聞かずにどっかのライブラリの参考にしたら?

メンバのコピーはpragma pack1でstructしておいてmemcpy
2017/03/30(木) 23:27:09.74ID:O3+3nsIM
>>529
>メンバのコピーはpragma pack1でstructしておいてmemcpy

それをすると何がいいことあるのか?
531デフォルトの名無しさん
垢版 |
2017/03/30(木) 23:45:25.72ID:s+CP+YQd
こういえクソみたいな方法を自慢気に語り出す奴が居るところかC++の最もクソな所だよね
2017/03/30(木) 23:51:55.55ID:2hi+y029
デフォルトコピーコンストラクターとか構造体代入とか知らないんだろう。
2017/03/31(金) 00:14:17.76ID:5j4NF4+Z
>>532
>構造体代入とか知らないんだろう
ほうほう、それは何ですか?
2017/03/31(金) 01:59:49.12ID:OFYzpq31
やべえなおい糞コードの臭いがプンプンしやがるぜ
2017/03/31(金) 02:09:29.70ID:DQgqVTGo
>>526-529
ありがとうございます

今まではとりあえずget/setを書いてgetにはconstを付けとけば良いみたいな認識でしたが、
想定されるクラスの使われ方に合わせて適宜変更するべきでした

MyClassのようなget/setの分け方をすると、
sizePlus10のような関数やsetで不便になってしまうので、
constを付けないget/set共用のものにしてそれを通してアクセスさせるのが適切でした
( getData()でアクセスする場合、Data * const getData() const { /**/ } みたいな )
とても参考になりました
2017/03/31(金) 11:52:48.85ID:xItn/dk+
>>531
くそじゃない方法をおしえて
2017/03/31(金) 12:09:56.69ID:c13jjk6+
C#じゃないからないでしょ
538デフォルトの名無しさん
垢版 |
2017/03/31(金) 13:26:56.75ID:CbPadW0u
>>536
コピーは=使え
というだけの話
2017/03/31(金) 13:38:11.94ID:2wgHKgmk
>>529
> メンバのコピーはpragma pack1でstructしておいてmemcpy
これ俺も理由知りたい
2017/03/31(金) 17:24:06.64ID:tvggMnLQ
typedef struct MY_STRUCT
{
int ch;
} MY_STRUCT;

MY_STRUCT a,b;
a.ch = 0;
b = a; //代入できる
2017/03/31(金) 19:17:35.19ID:Xv9Etv1i
>>529
> おまえは質問の意図を理解しよう

なんか無駄に上から目線だなぁ
って思ったら

> メンバのコピーはpragma pack1でstructしておいてmemcpy

単なる老害だったでござる
2017/03/31(金) 19:19:25.80ID:tvggMnLQ
構造体の代入ができなかったのは大昔のことだ。
2017/03/31(金) 19:35:02.95ID:BClOXWeK
>>540
それ,K&R1 から堕落したよね
2017/03/31(金) 19:40:25.86ID:tvggMnLQ
構造体定義を#include <pshpack1.h>と#include <poppack.h>で囲むのは、スピードよりもメモリー効率を優先するときにする。
2017/03/31(金) 19:44:56.93ID:tvggMnLQ
あるいは構造体のレイアウトを分かりやすくするときにパッキングを指定する。
2017/03/31(金) 19:46:22.60ID:tvggMnLQ
>>543
堕落ではない。進歩だ。
2017/03/31(金) 19:49:13.63ID:RKtYGe+y
> スピードよりもメモリー効率を優先するときにする
20年くらい前まではそういう老人もいたね
今はメモリレイアウトを固定したい時にしか使わないけど
2017/03/31(金) 19:58:28.84ID:tvggMnLQ
#pragma 直接指定は礼儀が悪い、昔のやり方だ。
549デフォルトの名無しさん
垢版 |
2017/04/01(土) 02:25:44.35ID:m99QLuku
メモリ効率だけの問題なら大抵の場合は順番入れ替えるだけで問題ないしな
2017/04/01(土) 07:47:47.79ID:1ZzXEpHO
>>546
サイズが無限にのびるかもしれないものをコピーするなんてだめだよ
昔はね,構造体はポインタを介してしかつかえなかったんだよ
2017/04/01(土) 08:31:33.23ID:AOt54aKT
そうそう
スタックに自動変数とかも言語道断
全部staticじゃなきゃね
2017/04/01(土) 13:26:49.84ID:1ZzXEpHO
>>551
スタックに自動変数はあたりまえだよ‥static おじさん,じゃないつもりなんだが‥
構造体はポインタで扱うべきもので,実体をコピーするのはなるたけ避けたいね
C++ では void f(const C &arg) って,可能ならば const と参照の縛りをできるだけいれるよね,余計なコンストラクタを走らせないために

K&R1 は教育的な配慮に優れた実装だと思うんだ‥
2017/04/02(日) 14:13:23.32ID:SQNmFUeK
SOCKADDRが一言
2017/04/02(日) 17:06:04.34ID:XkKG9LQx
>>553
手元のソースをみると
clientSocket = accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen);
とか
if (connect(destSocket, (LPSOCKADDR)&destSockAddr, sizeof(destSockAddr)) == SOCKET_ERROR) {
とか,構造体のポインタを渡しているね
由緒正しき Berkeley socket では,構造体をコピーするなんて教育的ではない書き方は許していないよ
2017/04/02(日) 17:31:42.61ID:QFdfGGyb
つまり>>553はK&Rおじさんにも劣る存在
2017/04/02(日) 18:21:59.15ID:XkKG9LQx
K&R1 おじさん,と
K&R2 おじさん
は区別したまえ,若造
2017/04/02(日) 19:26:19.28ID:QFdfGGyb
どっちも時代遅れの老人でしょ
K&Rなんて昔存在したという噂でしか知らない
万葉集とか古事記みたいなもの?
558デフォルトの名無しさん
垢版 |
2017/04/02(日) 20:22:15.39ID:II71H9Zi
func1(a, b)
  int a;
  long b;
{
}
2017/04/02(日) 22:22:37.63ID:JMz4l+Qd
> &destSockAddr,
> sizeof(destSockAddr)

由緒正しきBerkeley Socketも昔はこういう書き方したな
コイツは進歩が20年前で止まってるのか
今この書き方する奴は死刑でいい
2017/04/02(日) 23:11:21.74ID:zmcqSa2a
便乗で申し訳ないが、値渡し、参照渡し、ポインタ渡し、の話で
ポインタ渡しといっても、C++の場合はナマポは嫌われて、スマポを使いましょう
ってことになっていると思うんだけど、これはどう渡すのが普通?
スマポを値渡しするのか、参照渡しするのか
はたまたスマポを剥いで、ナマポで渡すのか
個人的に統一しきれないっつーか
所有権やら生存期間やらリソース管理やらが関係してくるなら
スマポで渡すI/Fじゃないとまずいだろうし
逆にそういうのが関係ないなら、スタック上の自動変数を渡したいとかも考えると
ナマポで渡すI/Fのほうが都合が良かったり、どーなんだろ
一度ナマポに戻すと二度とshared_ptrに変換できないって制限がね
言語側でなんとかせずに、ライブラリで解決しようとした弊害かな
ちょうどよいバカよけなんかも知らんが
2017/04/02(日) 23:13:25.39ID:6tq4Ne3Z
参照一択
2017/04/02(日) 23:24:57.32ID:xNqaI0VS
>スマポを値渡しするのか、参照渡しするのか
>はたまたスマポを剥いで、ナマポで渡すのか
スマポの値渡しと生保は使い分けが必要だが、スマポの参照渡しだけはアホの所業。
とスコットメイヤーが言っていたような
563デフォルトの名無しさん
垢版 |
2017/04/02(日) 23:43:46.05ID:yhAnz0vw
>>560
shared_ptrはその名の通り所有権を共有する場合のみ使うもの
で、そういう場合は値渡しでもいいよ。中でmoveすれば
所有権を共有しないなら、nullptrを許容するならナマポそうじゃないなら参照
あんまり無いけど所有権を渡した先に移動させるならunique_ptr
2017/04/02(日) 23:58:32.77ID:TsXu0WT4
所有権渡したくないならunique_ptrで持っている呼び出し元がgetでナマポを渡すかdereferenceして参照渡すかだな
2017/04/03(月) 00:00:55.90ID:Jbp2gIKE
ナマポで渡してもshared_ptrを再取得する方法はあるだろ
まあ前提がいるが
2017/04/03(月) 00:34:15.74ID:qQvnlfYK
うむむ、なるほど
ポインタらしき物にこれだけ多くの種類があってI/Fで縛ってしまうのは
一見面倒そうで、最近の流行というか静的型言語的には
型安全と見るべきなんだろうかしら
安易なGC言語より良いかもしれん、単純に情報量は多い
また一つC++が好きになった
うっかり循環参照したら怖いとか
コンパイラのバージョン違いでSTLやmallocの実装に
差異が有ることを前提に組まなきゃならないとか、玉にキズもあるけれど
2017/04/03(月) 06:55:53.48ID:VwtRd/3a
>>559
C/C++ で生書きするなら今もおなじだよ
2017/04/03(月) 07:40:50.83ID:dyU+EMvQ
型に対してじゃないのに括弧つけるの?
2017/04/03(月) 08:48:24.23ID:WaUkCV9r
そこはインデントや{}の位置が人によって違ったりするアレだろ
2017/04/03(月) 19:32:41.84ID:VwtRd/3a
>>557
K&R2 は C89 準拠だよ‥C89 が時代遅れだというけれども,いろんなことは C89 のときからやってきていて,C99 で追認された,というだけだよ
2017/04/03(月) 20:29:22.04ID:5hra1L5C
>>570
あいわかった
お前は今後「K&R1おじさん」(略して「K&Rおじさん」)な
どうせ定数defineや関数マクロまみれなんでそ
2017/04/03(月) 21:53:46.44ID:VwtRd/3a
>>571
略しないほうがいいよ‥
K&R2 おじさん=C89 はまっとうなCer, K&R1 おじさんは時代遅れ,この二つは全然違うよ
573571
垢版 |
2017/04/03(月) 22:02:42.26ID:ldINtwle
>>572
つまりお主(K&R1おじさん)は
K&R2おじさんが自分と一緒くたにされることを
申し訳ないと感じてるのだな!?

(>543)
> それ,K&R1 から堕落したよね

(>550)
> サイズが無限にのびるかもしれないものをコピーするなんてだめだよ

(>552)
> K&R1 は教育的な配慮に優れた実装だと思うんだ‥
2017/04/03(月) 22:14:40.64ID:Vb9tETQW
voidを返す関数には感心したな

生成されるコードは大して変わらないかも知れんけど
2017/04/04(火) 01:00:11.73ID:jC2xfRDP
関数プロトタイプを除けば、K&R1で十分かもしれないな
voidを返す関数? int でいいんだよ
2017/04/04(火) 15:11:19.04ID:AeH3x9f/
戻り値をどうするかはcallerの勝手だからな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況