X



【初心者歓迎】C/C++室 Ver.103【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0782デフォルトの名無しさん
垢版 |
2018/11/11(日) 09:46:34.66ID:mI2pOyKp
>>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に配置される。
0784デフォルトの名無しさん
垢版 |
2018/11/11(日) 13:40:16.62ID:96wp+TZd
'\0' と L'\0' って違うんだな
0785デフォルトの名無しさん
垢版 |
2018/11/11(日) 13:56:09.62ID:D6x0hMat
すいません、C++でゲームやGUIアプリなどを開発したいのですが
メソッド抽出やクラス設計といったプログラム設計に関する書籍って
どんなものを読めばいいんでしょうか?おすすめとかありますか?
ググっても、プログラム設計の本があまり見つかりませんでした・・
デザインパターンに関するものはあったんですが
もうすこし初歩的な内容のものがあれば教えてくださいm(__)m
0787はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/11(日) 14:45:39.68ID:u4gHMHSK
>>786
ワイド文字の内訳は未定義で、 Unicode になるとは限らないし、その大きさも決まってない。
2 バイトになって欲しいなら L ではなく u を使うと UTF-16 になることは保証されるよ。
0788デフォルトの名無しさん
垢版 |
2018/11/11(日) 14:47:19.00ID:FGv1lmue
>>782
挙げられた例でconstの付加によりRAM使用量が増えている例が見られなくて
「マイナスにはならない」が正しいように見えるんだけど、何を見て有害だと言ってるの?
0789デフォルトの名無しさん
垢版 |
2018/11/11(日) 16:46:50.89ID:FyMTXkCl
>>782
> const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。

s_Bはconst宣言されてない只の変数だからいいとして
"b"がconstだけど.bssに配置されるってこと?
0790デフォルトの名無しさん
垢版 |
2018/11/11(日) 17:54:46.45ID:96wp+TZd
>>785
他の言語で造ったことあるか?
それがまだでいきなりC/C++ならやめとけ
0792デフォルトの名無しさん
垢版 |
2018/11/11(日) 21:59:31.70ID:YkGULP39
それ、C++でもないただのCでEmacs風エディタ作るっていう古臭い本だろ。
しかも一般的な設計論みたいなものはほとんどなくてエディタの実装テクニックがメイン。
0794はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/12(月) 01:54:44.09ID:Y5bf1y1v
>>793
普通はな、本を勧める状況ってな、
相手は読んだことがないのが当たり前なんだよ。

主題が違う本を挙げるからには、
どういう点で好ましいのかくらいは書いてくれ。
0797デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:29:20.92ID:AHq3PbYw
初心者です。
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; }
はどちらのほうが好ましい書き方ですか?
完全に好みの問題ですか?
0799デフォルトの名無しさん
垢版 |
2018/11/12(月) 15:37:05.52ID:D6ILV7Jx
>>797
偽(false)の時だけならif(!hoge){...}の方。
0800デフォルトの名無しさん
垢版 |
2018/11/12(月) 15:38:56.82ID:Tf74ZWQr
新スレを作りました。利用してください。

0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/

***********************************************************************

1 名前:デフォルトの名無しさん[] 投稿日:2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室

***********************************************************************
0802785
垢版 |
2018/11/12(月) 18:39:23.46ID:x/TsFEZq
>>791
ありがとうございました。読んでみます。
プログラミングの良書って絶版になること多い気がしますが気のせいですかね・・。
0804デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:59:20.33ID:CbD+/v6g
int a=1;
int b=2;
if (!hoge) {
 const int c = a;
 a=b;
 b=c;
}

俺だったらこうかな。
0805デフォルトの名無しさん
垢版 |
2018/11/13(火) 18:27:28.63ID:90McxFB4
>>796
+1
0806デフォルトの名無しさん
垢版 |
2018/11/13(火) 18:30:06.08ID:90McxFB4
>>797
int a, b = 2 - !!hoge, 1 + !!hoge;
0809デフォルトの名無しさん
垢版 |
2018/11/13(火) 22:19:44.32ID:kE0CzrCg
>>797
多人数で開発する場合は、前者のほうが好まれると思います。
可読性が高いのでコードレビューしやすいですし、改修もしやすいです。
後者は、1行目と2行目の間で、aかbの値を変更する改修が入ってしまうと
2行目のif文に入らない場合に、望む結果が得られません。
プログラマになりたいとかでなければどっちでもいいと思いますが
難しい書き方をすると、時間経って読み返したときに、
自分でも何を書いたかわからなくなりますよw
0810 ◆QZaw55cn4c
垢版 |
2018/11/13(火) 23:35:32.38ID:q+gBL2L3
>>797
else を使わなくて済むのなら、そうしたほうがいい、とはよくききます
0812はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/14(水) 02:13:50.61ID:I7yQY6ax
>>797
状況によっても違ってくると思う。 一般的には前者だろうけど、
{ a=2; a=1; } が例外的な場合として特別扱いしてるってことを強調したい理由があるなら後者で書くこともあるかもしれん。
0813デフォルトの名無しさん
垢版 |
2018/11/14(水) 02:36:40.11ID:JMGKlnVy
いや、効率を考えたら断然最初の else を使う方では?
後者のやり方では hoge が偽の場合、無駄な代入をすることになる
もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど
0814デフォルトの名無しさん
垢版 |
2018/11/14(水) 02:38:54.17ID:JMGKlnVy
すまん自己レス
> もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど

これはムリだった。てことでやっぱり前者
0816デフォルトの名無しさん
垢版 |
2018/11/14(水) 11:29:46.12ID:Hh1ptiAj
設計者の意図が伝わりやすいのは前者
0817デフォルトの名無しさん
垢版 |
2018/11/14(水) 11:45:30.11ID:ND9bKuyE
int a=1;
if(!hoge){
a=2;
}

のa=1は通常の代入じゃないからね。
これは基準値で初期化しんだからよ。

こっちのが効率は良いよ。
0819デフォルトの名無しさん
垢版 |
2018/11/14(水) 12:07:57.04ID:XWwMTSMS
多分タイポでa,bの値を条件によって入れ替える処理だと思うぞ。
0820デフォルトの名無しさん
垢版 |
2018/11/14(水) 12:08:42.29ID:zVp4oIsl
int a = 1 * (!hoge) + 2 * (!!hoge);
線型代数
0822デフォルトの名無しさん
垢版 |
2018/11/14(水) 13:41:43.62ID:B+lK3N2V
>>815
どういう最適化?
初期化されても参照される前に代入が起こる可能性があるから
hoge の判定の後まで初期化を遅延させる、つまり実質 else を使ったのと
同じコードが生成されるということかな?
そこまで出来そうな気もしなかったのだけど
0823デフォルトの名無しさん
垢版 |
2018/11/14(水) 15:05:08.52ID:sW4kyFkZ
初期値として意味があるなら後者でいい気はするが
なんか例が微妙というか、プログラムの流れがなんか不自然
0824デフォルトの名無しさん
垢版 |
2018/11/14(水) 15:14:44.43ID:XWwMTSMS
だよね。
だからやっぱタイプミス(タイポ)で条件によってa,bを入れ替える/入れ替えないを切り替える処理と見た方が自然。
0825デフォルトの名無しさん
垢版 |
2018/11/14(水) 20:24:55.58ID:PBXirj6B
>>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にあたる
0826デフォルトの名無しさん
垢版 |
2018/11/14(水) 21:42:49.91ID:1o5yT6ol
>>825
ありがとう。なるほど、すばらしい
これをまんまC/C++に書き戻すと

int a = hoge ? 1 : 2;
int b = hoge ? 2 : 1;

ということかな
でもこれだとhoge を2回チェックしてるので却って非効率な気もするけど
まぁ LLVM はまだ中間形式だから、これをターゲットコードに落とすところで
hoge の判定を一回で済ませるようにさらに最適化するのは簡単そうではあるね
0827デフォルトの名無しさん
垢版 |
2018/11/14(水) 21:44:23.61ID:1o5yT6ol
とは言え C/C++は効率ファーストな言語なんで、最適化を当てにして
ユルいコードでOK、てのも如何なものかという気はする
最適化は所詮、処理系依存だし

まぁ >>823 の言うように、その値で初期化することに強い意味があるなら
その書き方を優先する、そういうトレードオフがあることは認めるけど
0833デフォルトの名無しさん
垢版 |
2018/11/15(木) 16:41:41.66ID:APQKN+QS
>>829
もちろん原則論に過ぎないよ
あと、原則論と言えば「変数は定義時点で必ず初期化せよ」というのもあるわけで
初期化忘れを防ぐためにそういうコーディングルールを設けている所も多いはず
その場合は後者の方が望ましいことになる
初心者はむしろ効率より堅牢性を重視した方がいいかもね
0834デフォルトの名無しさん
垢版 |
2018/11/15(木) 18:14:33.63ID:/yCJioVE
>>830-831
副作用でるやつ
0835デフォルトの名無しさん
垢版 |
2018/11/15(木) 22:00:21.20ID:cIF0PQeg
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は正しい?
0841デフォルトの名無しさん
垢版 |
2018/11/16(金) 05:03:45.34ID:qDPFPFK+
>2.この世の全てが無くなるとは思えない。質問が不適切。
質問の意図は
inline void debug_pulse(int no){ }はコードを生成しない。これは正しいか?
である。
質問の理解が不適切。
0845デフォルトの名無しさん
垢版 |
2018/11/17(土) 10:49:41.98ID:B4GISbTr
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.は「消える」
0846デフォルトの名無しさん
垢版 |
2018/11/17(土) 10:50:51.46ID:B4GISbTr
ああ 2. で消える条件は
debug_pulse() を呼んでる部分が無いことが前提だから

2. 「消える」「消えない」どっちとも言えない

だな
0848デフォルトの名無しさん
垢版 |
2018/11/17(土) 13:20:26.13ID:yMNF1uQT
inlineをどう扱うかなんてコンパイラ次第
どんなコードが吐かれるかが知りたければ
吐かれたコードを見るのが一番
0849デフォルトの名無しさん
垢版 |
2018/11/17(土) 22:18:09.47ID:PyYM1CbT
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は共に正しい?
0850デフォルトの名無しさん
垢版 |
2018/11/17(土) 22:20:38.34ID:/DEd7oJ8
そもそもpulseがなんなのかわからんから
なにが書いてあるのか意味不明
0852デフォルトの名無しさん
垢版 |
2018/11/18(日) 03:24:10.19ID:P3SzQi6N
次スレからは、

【初心者歓迎】C/C++室 Ver.103【環境依存OK】 を、
【上級者用】C/C++室 Ver.104【環境依存OK】

にした方がいいな。
0854デフォルトの名無しさん
垢版 |
2018/11/18(日) 13:06:07.95ID:OtDWWVpG
いいかお前ら、これから>>852が理解できないことは一切書いちゃだめだぞ。
ここが初心者専用でなく初心者歓迎であってもだ。
回答するのはお前らだからな。
0855 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 14:38:54.74ID:KS5/UdBT
>>852
@すでに上級者スレはありますが?
Aそもそも上級者と初心者の境目をどう定義しますか?
0857852
垢版 |
2018/11/18(日) 16:35:58.45ID:P3SzQi6N
>>855
過去レスから、自ずと答えが出るだろ。
0863デフォルトの名無しさん
垢版 |
2018/11/18(日) 21:35:53.00ID:2nMU53A+
そもそも論言っていい?w
なんで初心者でも上級者でも質問したらきちんと回答してくれるこのスレがあるのに、自分が気に入らないからって勝手に新スレ作るの?
そういうのを躊躇なくやれちゃう人が本当に怖い・・・
0866 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 22:09:26.83ID:KS5/UdBT
>>863
そうそう、そうですよね
初心者には初心者のための回答がつき、上級者には上級者にふさわしい回答がつけば、それで必要にして十分ですよね
なんでスレを分ける必要があるのですか?>>852
0869 ◆QZaw55cn4c
垢版 |
2018/11/19(月) 00:28:37.15ID:MufxDZB0
>>867
>他者排除姿勢
とても興味があるのであえてお聞きしてもいいですか?
私のどういう点に「他者排除姿勢」を感じたのでしょうか
0874デフォルトの名無しさん
垢版 |
2018/11/19(月) 15:26:04.17ID:3MOWhUti
#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
0876デフォルトの名無しさん
垢版 |
2018/11/19(月) 15:40:16.18ID:oi0OLObs
オーバーフローじゃなくて
マシンイプシロンの問題
0878デフォルトの名無しさん
垢版 |
2018/11/19(月) 22:43:09.35ID:dp3XdjsI
様々な処理系依存についてそれぞれ具体的に何に依存してるのかってどこで調べられますか?
ソフトを作って配布するにあたって、ユーザーの環境をwindows7以降のPCに限定するとして
ユーザー側の環境に依存するもの
ユーザー側の環境に依存するがwin7以降のPCでは共通なので実質非依存とみなせるもの
コンパイル側の環境に依存するのでコンパイルしてしまえば非依存とみなせるもの
に分けて調べたいです
0880デフォルトの名無しさん
垢版 |
2018/11/20(火) 06:11:07.08ID:N6+XqoZ1
>>878
まとめて書いてある所なんか無いよ

普通はコンパイラの範疇なものは実行環境に依存しない
一緒に提供しない外部のコードを使う部分(DLL, API, ドライバ)は依存する
と思っておけば良いけど
環境を判断して動作を変えるコードもあるし
実行速度は当然環境に依存する
特定の環境の場合にタイミング依存で発生する問題もある

確実に実行環境に依存しないなんて確証を得られるコードなんてごく限られた範囲になるんで
そんなものに頼らず
出来るだけより多くの環境で評価するのが望ましい
0881デフォルトの名無しさん
垢版 |
2018/11/20(火) 10:23:14.85ID:jmuJusIM
README (.txt) (.md) (.rst)
0882デフォルトの名無しさん
垢版 |
2018/11/21(水) 12:28:30.64ID:kLl3Gqvz
某本で読んだんだけど、クラスの中にポインタ変数もたせる場合って、コピー禁止にするのが一般的?
コピーコンストラクタを書くのがめんどそうだし、そもそもクラスを代入やコピーをあんましないよね?
■ このスレッドは過去ログ倉庫に格納されています

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