【初心者歓迎】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/
2017/02/19(日) 11:23:25.68ID:2DCCXMeS
C++の話題そのものではないのですが
バブルソートとか初歩的なアルゴリズム
を優しく解説している書籍はありませんか。

Amazon見てるのですがもう少し情報がほしいです。
2017/02/20(月) 01:05:36.35ID:aWzwD2VT
>>452
ピタゴラスイッチでバブルソートやクイックソートの概念をグラフィカルに紹介してたよ。
それはさておき、本屋の店頭でアルゴリズムとかデータ構造とかがタイトルに含まれる本をパラパラめくって分かり易いのを探すといいかと思う。
2017/02/21(火) 00:15:43.57ID:OFTvUoLj
とあるOSSをとあるシステムに移植していて、
Intel(2013)やGNU(4.9系)ではコンパイルできるのに
そのシステム専用コンパイラではコンパイルできずエラーになります。
ソースコードやヘッダファイルを修正すれば通るだろうというのは経験的にわかっているのですが
どこを修正したらよいかというのを見つけ方がわからないのですが見つけ方のコツみたいなのはあるのでしょうか?
2017/02/21(火) 00:32:08.81ID:fcoMqi2n
エラーメッセージの意味を考えろ
2017/02/21(火) 01:18:37.30ID:9fQxfYbZ
>>454
エラーメッセージを見ないことには回答のしようがないと思うぞ

まぁ、専用のコンパイラという言い回しから察するに、C++03程度しかサポートしていない古いコンパイラでも使ってるんじゃないか?
エラーが出ている行の周辺でC++11以降の言語機能か、ライブラリでも使ってんじゃね?
2017/02/21(火) 01:18:57.64ID:bFUDo/lz
>>454
ともかく、
そのシステム専用コンパイラ提供しているところに、世界標準のIntel(2013)やGNU(4.9系)ではコンパイル
出来るのにお前のものではできないから出来るようにしたコンパイラをよこせと激しくクレーム
2017/02/21(火) 01:32:37.44ID:bFUDo/lz
>>456
C++11いっぱいのコードをC++03に修正するって大変そうだな
2017/02/21(火) 06:31:57.51ID:OFTvUoLj
>>456
>>457
メッセージは
「オーバーロードされた関数"HOGE"のインスタンスが引数リストと一致しません。」
みたいな感じです
一応C++11準拠でGNU4.9一部互換とされてるコンパイラですが。。。
2017/02/21(火) 08:12:09.46ID:9fQxfYbZ
>>459
HOGEが想定している引数型と実際に渡している引数の型を確認
違うやつが犯人

これ以上は情報少なすぎてわからん
2017/02/21(火) 15:33:32.84ID:rWOcc73c
一般論としてどういうことに注意したらいいですかって質問じゃなくて、具体的に解決してもらいたいってことなのかよw
2017/02/21(火) 22:19:07.17ID:OFTvUoLj
>>460
intelコンパイラで作ったオブジェクトをnmコマンドで中見て
こうあるべきという形がわかったんであとは頑張ってみる
2017/02/21(火) 22:24:52.45ID:qEEiXXQS
HOGEの中にHAGEが紛れ込んでるんだな
2017/02/22(水) 07:28:41.35ID:F7TE97aZ
>>453
有難うございます。
田舎ですので大きな書店には距離があります
が、行ってみます。
2017/02/22(水) 11:11:49.24ID:T1tKwjPz
>>459
テンプレートが悪さしてるか const の取りこぼしかデフォルト引数のミスが起きているとエスパー
2017/02/22(水) 19:03:10.40ID:7bpb3LbA
printf("%s",buf);

fputs(buf,stdout);

どっちが好き?
2017/02/22(水) 19:20:15.64ID:JmFr9wbV
違う処理のコードを並べてどっちと言われても
2017/02/22(水) 19:49:35.49ID:OuXxGo6B
>>467みたいな人が居るのでprintfかな
2017/02/22(水) 20:00:39.94ID:G8P7P0/x
どっちも最後に使ったの20年ほど前かな
2017/02/22(水) 21:09:01.14ID:T1tKwjPz
puts とか使ったことないわ
2017/02/22(水) 21:30:22.88ID:Z0Pf8P/J
>>469
ログ出力・エラー出力がメインでstdoutはあんまり使わないよな
2017/02/22(水) 21:36:43.56ID:3nEefUGO
putsは改行してくれるんで好きだな。fputsも。
2017/02/22(水) 21:39:49.82ID:mKcPOHkg
>>472
fputsは改行を追加しない
2017/02/22(水) 21:51:09.45ID:3nEefUGO
>>473
あ そうだった。 すまん
2017/02/23(木) 00:12:45.93ID:oHheANLP
細かいのを大量に出したいときはprintfは遅い
476デフォルトの名無しさん
垢版 |
2017/02/23(木) 18:17:55.29ID:2nyak89s
class CL{
CL(int _d, string _s) : d(_d), s(_s)
{

}
public:
int d;
string s;

};
int _tmain(int argc, _TCHAR* argv[])
{
CL *cl = new CL(555, "a");←ここでエラー。なんで?
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 は教育的な配慮に優れた実装だと思うんだ‥
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。