【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/ >>772
C++は低レベルの処理に向いているのだから当然のように処理系のハードとの接点が多い。
処理系依存の部分はC++でフォローできないというだけで、だからといって処理系を意識しないでいい
ということにはならない。C++を使う場合には処理系を強く意識する必要がある。
>できる限り、const を使うべき! 使っても、マイナスにはならないから
処理系を強く意識するなら、こういう結論にはならないと思う。constは意に反してRAMに配置され得る。
組み込み系においては、RAMを多用すればすぐにRAMがパンクする。
constはいくつかのメリットがあることは解ったが、無条件に使えばやはり有害になる。少なくとも自分が使った
限りでは滅茶滅茶有害だった。
では被害を少なくするにはどうすればよいか? それに答えてほしい。
static const char* s_A; // -> BSS section
static const char* s_B = "b";// -> Data section
static const char* const s_C = "c";// -> Data section
static const char s_D[] = "d";// -> Read only Data section
static char s_E[] = "e";// -> Data section
static char s_F[128]; // -> BSS section
const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。 ID:mI2pOyKp = ID:p/77GMIT すいません、C++でゲームやGUIアプリなどを開発したいのですが
メソッド抽出やクラス設計といったプログラム設計に関する書籍って
どんなものを読めばいいんでしょうか?おすすめとかありますか?
ググっても、プログラム設計の本があまり見つかりませんでした・・
デザインパターンに関するものはあったんですが
もうすこし初歩的な内容のものがあれば教えてくださいm(__)m >>784
L'\0' はUnicodeだから、必ず2バイトなので、 0x0000 >>786
ワイド文字の内訳は未定義で、 Unicode になるとは限らないし、その大きさも決まってない。
2 バイトになって欲しいなら L ではなく u を使うと UTF-16 になることは保証されるよ。 >>782
挙げられた例でconstの付加によりRAM使用量が増えている例が見られなくて
「マイナスにはならない」が正しいように見えるんだけど、何を見て有害だと言ってるの? >>782
> const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。
s_Bはconst宣言されてない只の変数だからいいとして
"b"がconstだけど.bssに配置されるってこと? >>785
他の言語で造ったことあるか?
それがまだでいきなりC/C++ならやめとけ >>785
The Craft of Text Editing それ、C++でもないただのCでEmacs風エディタ作るっていう古臭い本だろ。
しかも一般的な設計論みたいなものはほとんどなくてエディタの実装テクニックがメイン。 >>793
普通はな、本を勧める状況ってな、
相手は読んだことがないのが当たり前なんだよ。
主題が違う本を挙げるからには、
どういう点で好ましいのかくらいは書いてくれ。 初心者です。
bool変数hogeの真偽で反対の代入をする場合につきまして、
int a, b;
if (hoge) { a=1; b=2; } else { a=2; a=1; }
と
int a=1, b=2;
if (! hoge) { a=2; a=1; }
はどちらのほうが好ましい書き方ですか?
完全に好みの問題ですか? >>797
偽(false)の時だけならif(!hoge){...}の方。 新スレを作りました。利用してください。
0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/
***********************************************************************
1 名前:デフォルトの名無しさん[] 投稿日:2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室
*********************************************************************** >>798
すみません
>>799
ありがとうございます
>>800
超初心者用の専スレがあったんですね。ありがとうございます >>791
ありがとうございました。読んでみます。
プログラミングの良書って絶版になること多い気がしますが気のせいですかね・・。 int a=1;
int b=2;
if (!hoge) {
const int c = a;
a=b;
b=c;
}
俺だったらこうかな。 >>797
int a, b = 2 - !!hoge, 1 + !!hoge; ここは、初心者を歓迎するスレ
初心者を虐めてどうする >>807
最近やたら気になるみたいだけど、なんで自分は初心者に回答してあげないの? >>797
多人数で開発する場合は、前者のほうが好まれると思います。
可読性が高いのでコードレビューしやすいですし、改修もしやすいです。
後者は、1行目と2行目の間で、aかbの値を変更する改修が入ってしまうと
2行目のif文に入らない場合に、望む結果が得られません。
プログラマになりたいとかでなければどっちでもいいと思いますが
難しい書き方をすると、時間経って読み返したときに、
自分でも何を書いたかわからなくなりますよw >>797
else を使わなくて済むのなら、そうしたほうがいい、とはよくききます >>797
状況によっても違ってくると思う。 一般的には前者だろうけど、
{ a=2; a=1; } が例外的な場合として特別扱いしてるってことを強調したい理由があるなら後者で書くこともあるかもしれん。 いや、効率を考えたら断然最初の else を使う方では?
後者のやり方では hoge が偽の場合、無駄な代入をすることになる
もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど すまん自己レス
> もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど
これはムリだった。てことでやっぱり前者 >>814
clangで試したらきちんと最適化されたぞ int a=1;
if(!hoge){
a=2;
}
のa=1は通常の代入じゃないからね。
これは基準値で初期化しんだからよ。
こっちのが効率は良いよ。 int a = hoge? 1 : 2;
はどう? 多分タイポでa,bの値を条件によって入れ替える処理だと思うぞ。 int a = 1 * (!hoge) + 2 * (!!hoge);
線型代数 >>815
どういう最適化?
初期化されても参照される前に代入が起こる可能性があるから
hoge の判定の後まで初期化を遅延させる、つまり実質 else を使ったのと
同じコードが生成されるということかな?
そこまで出来そうな気もしなかったのだけど 初期値として意味があるなら後者でいい気はするが
なんか例が微妙というか、プログラムの流れがなんか不自然 だよね。
だからやっぱタイプミス(タイポ)で条件によってa,bを入れ替える/入れ替えないを切り替える処理と見た方が自然。 >>822
797の後者のコードがLLVM IR 2命令に最適化される
%2 = select i1 %0, i32 1, i32 2
%3 = select i1 %0, i32 2, i32 1
%0がhoge、%2がa、%3がbにあたる >>825
ありがとう。なるほど、すばらしい
これをまんまC/C++に書き戻すと
int a = hoge ? 1 : 2;
int b = hoge ? 2 : 1;
ということかな
でもこれだとhoge を2回チェックしてるので却って非効率な気もするけど
まぁ LLVM はまだ中間形式だから、これをターゲットコードに落とすところで
hoge の判定を一回で済ませるようにさらに最適化するのは簡単そうではあるね とは言え C/C++は効率ファーストな言語なんで、最適化を当てにして
ユルいコードでOK、てのも如何なものかという気はする
最適化は所詮、処理系依存だし
まぁ >>823 の言うように、その値で初期化することに強い意味があるなら
その書き方を優先する、そういうトレードオフがあることは認めるけど hoge ? a = 1, b = 2 : a = 2, b = 1;
ができればな >>829
もちろん原則論に過ぎないよ
あと、原則論と言えば「変数は定義時点で必ず初期化せよ」というのもあるわけで
初期化忘れを防ぐためにそういうコーディングルールを設けている所も多いはず
その場合は後者の方が望ましいことになる
初心者はむしろ効率より堅牢性を重視した方がいいかもね inline void debug_pulse(int no){
#if(DEBUG == 1)
switch(mode){
case 0: pulse(A0); break;
case 1: pulse(A1); break;
case 2: pulse(C5); break;
case 3: pulse(F0); break;
}
#endif
}
1.この場合 debug_pulse(3);は pulse(F0)と同じになる。
2. #define DEBUG 0 にすると全て跡形もなく消える。
1,2は正しい? 1.は正しい。
2.この世の全てが無くなるとは思えない。質問が不適切。 >2.この世の全てが無くなるとは思えない。質問が不適切。
質問の意図は
inline void debug_pulse(int no){ }はコードを生成しない。これは正しいか?
である。
質問の理解が不適切。 >>841
エラーになるのでコードは生成されません mode の出所は? A)no の typo B)別途関数の外に居るし int mode;
void pulse(void);
int A0;
int A1;
int C5;
int F0; modeがどうかは質問の趣旨と関係ないのでどうでもいいが(modeがglobalとか適当に)
inline void debug_pulse(int no){
switch(mode){
case 0: pulse(A0); break;
case 1: pulse(A1); break;
case 2: pulse(C5); break;
case 3: pulse(F0); break;
}
}
か
inline void debug_pulse(int no){
}
か
にしかならないから
1.は「ならない」
2.は「消える」 ああ 2. で消える条件は
debug_pulse() を呼んでる部分が無いことが前提だから
2. 「消える」「消えない」どっちとも言えない
だな >>846
inlineなんで、消えるか消えないかはアドレス必要な操作をしてるかどうか inlineをどう扱うかなんてコンパイラ次第
どんなコードが吐かれるかが知りたければ
吐かれたコードを見るのが一番 inline void debug_pulse(int no){
#if(DEBUG == 1)
switch(no){
case 0: pulse(0xA0); break;
case 1: pulse(0xA1); break;
case 2: pulse(0xC5); break;
case 3: pulse(0xF0); break;
}
#endif
}
1.この場合 debug_pulse(3);は pulse(0xF0)と同じになる。
2. #define DEBUG 0 にすると全て跡形もなく消える。
1,2は共に正しい? そもそもpulseがなんなのかわからんから
なにが書いてあるのか意味不明 次スレからは、
【初心者歓迎】C/C++室 Ver.103【環境依存OK】 を、
【上級者用】C/C++室 Ver.104【環境依存OK】
にした方がいいな。 いいかお前ら、これから>>852が理解できないことは一切書いちゃだめだぞ。
ここが初心者専用でなく初心者歓迎であってもだ。
回答するのはお前らだからな。 >>852
@すでに上級者スレはありますが?
Aそもそも上級者と初心者の境目をどう定義しますか? >>857
それは>>855Aの答えだけですね、@はどうですか? くだらないないことを、グダグダ突っかかり続けるのが、5ch民のクセ。 >>859
>>852 の提案が一番くだらないのでは? >>852が初心者向けの回答すればそれで解決だろ。アホ草 そもそも論言っていい?w
なんで初心者でも上級者でも質問したらきちんと回答してくれるこのスレがあるのに、自分が気に入らないからって勝手に新スレ作るの?
そういうのを躊躇なくやれちゃう人が本当に怖い・・・ >>863
そうそう、そうですよね
初心者には初心者のための回答がつき、上級者には上級者にふさわしい回答がつけば、それで必要にして十分ですよね
なんでスレを分ける必要があるのですか?>>852 今までの、他者排除姿勢から、よくも>>866が書けたもんだ。 他者排除だって?誰が?QZが?
被害妄想激しすぎるんじゃないか? >>867
>他者排除姿勢
とても興味があるのであえてお聞きしてもいいですか?
私のどういう点に「他者排除姿勢」を感じたのでしょうか #include <stdio.h>
int main() {
float f = 262143.98;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
return 0;
}
// why 厚切り json >>875
規格では決まってなかったと思う
まあたいていIEEE754の単精度だけど 様々な処理系依存についてそれぞれ具体的に何に依存してるのかってどこで調べられますか?
ソフトを作って配布するにあたって、ユーザーの環境をwindows7以降のPCに限定するとして
ユーザー側の環境に依存するもの
ユーザー側の環境に依存するがwin7以降のPCでは共通なので実質非依存とみなせるもの
コンパイル側の環境に依存するのでコンパイルしてしまえば非依存とみなせるもの
に分けて調べたいです >>878
まとめて書いてある所なんか無いよ
普通はコンパイラの範疇なものは実行環境に依存しない
一緒に提供しない外部のコードを使う部分(DLL, API, ドライバ)は依存する
と思っておけば良いけど
環境を判断して動作を変えるコードもあるし
実行速度は当然環境に依存する
特定の環境の場合にタイミング依存で発生する問題もある
確実に実行環境に依存しないなんて確証を得られるコードなんてごく限られた範囲になるんで
そんなものに頼らず
出来るだけより多くの環境で評価するのが望ましい README (.txt) (.md) (.rst) 某本で読んだんだけど、クラスの中にポインタ変数もたせる場合って、コピー禁止にするのが一般的?
コピーコンストラクタを書くのがめんどそうだし、そもそもクラスを代入やコピーをあんましないよね? ■ このスレッドは過去ログ倉庫に格納されています