X



【初心者歓迎】C/C++室 Ver.103【環境依存OK】
レス数が900を超えています。1000を超えると表示できなくなるよ。
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
某本で読んだんだけど、クラスの中にポインタ変数もたせる場合って、コピー禁止にするのが一般的?
コピーコンストラクタを書くのがめんどそうだし、そもそもクラスを代入やコピーをあんましないよね?
0883はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/21(水) 12:44:01.50ID:5XDVWHjZ
>>882
そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話で、クラスの性質による。

コピーできない (コピーすると不整合が起こる) ようなデザインならコピーするなって言うだけじゃなくて
コピー禁止 (コピーコンストラクタの削除) にしておいたほうがうっかりコピーしなくて安全だねってだけの話。
0884デフォルトの名無しさん
垢版 |
2018/11/21(水) 22:50:19.46ID:QmHGv3o9
排他主義は当然
低学歴知恵遅れは板から排除するベキ
0885デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:19:14.19ID:xWgjQGqb
>>883
> そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話
これ、全く尤もだし大事な事だと思うんですけど、判断基準を学校や職場で教えてないんですかね?
メモリが少ない組み込み環境だと選択肢はあるけど、C++でアプリを組むような環境だと、
- シングルトンはコピーしない
- それ以外はコピアブル(ディープコピー)にする
一択だと思うんですが。
0887デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:42:08.80ID:yscr9wE/
>クラスの中にポインタ変数もつ
これは、pimpl (pointer implement)デザインパターンだろ

pimpl インスタンスの遅延初期化だろ。
こういうのは普通コピーしないし、コピーするとインスタンスを共有して危険になるとか

遅延初期化するようなものは、非同期読み込みとか、何か失敗する可能性が高い、ヤバイもの

1回目は、ファイルから読み込んで、2回目は、キャッシュから読み込むとか、挙動が変わったり

pimpl を使っていれば、普通と違うから、ヤバイと思っておいた方がよい。
pimpl を使うには、何か理由がある
0888はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/21(水) 23:50:56.39ID:5XDVWHjZ
>>885
原則としてはその意見は正しいと思う。
特別な理由がない限りコピーは出来るべきだ。

その上でコピー可能にするための手間と使い勝手のトレードオフ、
要するに「割に合うか」という判断は実務的なことだから、一律には言えないと思う。
コピー可能に出来るけど、コピーする箇所が一個もなかったわっていうような結末だって
有りうるだろうし。

そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
0889デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:57:54.13ID:xWgjQGqb
>>887
pimplはAPIと実装を切り離して抽象化するためのもんだから、遅延とかキャッシュとか
実装詳細が関係しちゃいけないんじゃないですかね。
例えばマルチエージェントシミュレーションとかで、個々のエンティティの実装をpimplで隠した上に、
エンティティの複製は普通にやりますし。
0891デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:03:02.39ID:hDud6tbH
>>888
> そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
私は古い教育しか受けてないので、過去については全く同感なんですが、
最近はもっと抽象化してるんじゃないかな、と思ったんですよ。
0892デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:06:21.53ID:LhS8U5R1
今はmoveがあるからとりあえずコピー禁止で作るな。
複製したオブジェクトが必要になる機会はあんまりない気がする。
vectorに突っ込んで連続したメモリに割り当てたいときとかかな。
0893デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:16:19.69ID:hDud6tbH
>>892
read-copy-updateとか、マルチスレッディングで使うんですよ。
(スレッド間で同じ領域にアクセスすると、誰かが書き込むときにロックが掛かるから、
ポインタの参照先もコピーしてしまった方が良い)
0895デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:35:05.56ID:hDud6tbH
>>892
私も>>888で言われるまで気付かなかったんですけど、個々のエンティティはコピーしても
シミュレーション系全体をコピーする、とか、大きなオブジェクトをコピーするときって確かに無いですよね。
むしろ万一コードが走ったらレスポンスが遅くなるから禁止すべき。
0896デフォルトの名無しさん
垢版 |
2018/11/23(金) 18:17:04.79ID:Fjl6cL2Z
でかいオブジェクトはコピーじゃなくてデータベースに入れてリビジョン管理するべきだよな
0898デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:15:24.82ID:CDKSSVF4
>>891
コピーコンストラクタって言語機能があるから勘違いしがちだけど
コピーってオブジェクト指向一般的に言えば全くもって汎用的な処理じゃないんだよね
むしろ無理にコピー可を要求するとおかしくなったりパフォーマンスに悪影響することの方が多いぐらいだ
だから、C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
なんでまあ、基本的にはコピーはサポートしなくていい
そのクラスの要件としてコピーのサポートが必須だとはっきり分かったときだけサポートすりゃいい
0899 ◆QZaw55cn4c
垢版 |
2018/11/24(土) 14:34:42.64ID:nrZVZwkF
>>898
>C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
それはクラスは問答無用でヒープに置くことに統一した結果なのでは?
0900デフォルトの名無しさん
垢版 |
2018/11/24(土) 15:11:34.85ID:CDKSSVF4
C#には構造体があるがそれもコピーコンストラクタなどサポートしてないね
オブジェクト指向にはほとんど不要だから
0903デフォルトの名無しさん
垢版 |
2018/11/25(日) 09:06:53.31ID:lehzCciN
コピーコンストラクタなんて使ったことないよ
関数の引数も構造体はポインタで渡すべきだし、関数からの返り値も構造体で返すべきではない
あんなのは使うべきではない
0906デフォルトの名無しさん
垢版 |
2018/11/26(月) 03:48:18.53ID:bwBfDzyf
あるクラスのオブジェクトを静的/動的に確保した場合の互いのメンバ関数処理速度の差ってどれくらいなもんですかね
処理の規模にもよるのですか?
0908デフォルトの名無しさん
垢版 |
2018/11/27(火) 09:16:27.15ID:SZiCwtOh
今プログラミング言語C++4第四版読んでるのですが、中級者なのですが1ページから読んでます
テンプレートはあまり使ったことがなく、テンプレートの章を読んでいるのですが理解出来ているのか出来ていないのか分かりません
皆さんこの本はどんな感じで読みましたか?
0909デフォルトの名無しさん
垢版 |
2018/11/27(火) 09:40:16.02ID:jIxWA8zR
テンプレートは大分前に読んだが、ぜんぜんスマートだとは思わんかったしプログラムもでかくなりそうだったし
くだらねえと思って、読むのやめたよ。 別に使わなくてもプログラム出来るしな
0911デフォルトの名無しさん
垢版 |
2018/11/27(火) 17:54:30.60ID:7Rl1V70s
テンプレートは書くのはちょっと難しいというかアレだが
使うのは簡単だから、まずstd::vectorとか使ってみれば?便利だから
使い方が分かれば作り方もわかるようになるだろう

あとコピーの話でもめてたようだが、オブジェクトのコピーはC++の特徴だからなぁ
C言語からのもので、構造体が値型と同じようにコピーできるっていう
そのおかげでスタックにオブジェクトを確保してRAIIが出来るまぁこれも特徴的だわ
一方で配列が=でコピーできないのもC言語からのもので
構造体より配列の方が他の言語で言うところのオブジェクトと似たような仕様になってるw
参照するとポインタに格下げになるのもJavaやC#のオブジェクトと一緒だね
0912デフォルトの名無しさん
垢版 |
2018/11/27(火) 18:01:09.09ID:7Rl1V70s
もしC言語の構造体が配列の仕様と同じように
アクセスしようとするとポインタに格下げになってコピーできない仕様だったのなら
C++のクラスはもうちょっとモダンな仕様になってたかもしれないよね
値渡し出来ないからコピーの事を考えなくてもよいし
GCないからキツイか
0913デフォルトの名無しさん
垢版 |
2018/11/27(火) 19:03:17.02ID:NSs5prW8
>>911
> 使い方が分かれば作り方もわかるようになるだろう
コンパイラの使い方が分かっても作り方が分かるやつはそんなに多くないが…
0914デフォルトの名無しさん
垢版 |
2018/11/27(火) 19:33:57.58ID:7Rl1V70s
その場合でも、例えばC言語のコンパイラを作りたいとき
C言語の使い方を理解せずにC言語のコンパイラを作るより
C言語の使い方を学習してからC言語のコンパイラを作る方が
賢明だろ
0915 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 20:17:27.09ID:X/MEoliS
>>906
性的・童貞的の差異よりも仮性・真性の差異を問題にすべきかと
0916 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 20:18:05.47ID:X/MEoliS
>>909
lisp のマクロとC++のテンプレートとは、どっちの方がイケてますか?
0917 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 20:18:59.91ID:X/MEoliS
>>911
>配列が=でコピーできないのもC言語からのもので
私はときどき夢想します、配列が=でコピーできたとしたら、どんな世界観がふりかかってくるのでしょうか?
0920 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 21:04:08.91ID:X/MEoliS
>>915
訂正します
静的・動的の差異よりも仮想か非仮想かを問題にすべきかと思います
0922デフォルトの名無しさん
垢版 |
2018/11/27(火) 22:10:55.41ID:F5dyxMID
>>910
ちょっとだ
まってて
0923デフォルトの名無しさん
垢版 |
2018/11/28(水) 14:52:38.77ID:SOoAorbX
>>918
実体化を明示すれば書けるよ
使う奴を全部列挙しなきゃならないけど、ロジックを共用できるのは大きい
0924デフォルトの名無しさん
垢版 |
2018/11/28(水) 23:40:54.22ID:eIhtGkxx
#include <stdi.h>
int main(void)
{
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
printf(" %2d", i * j);
}
printf("\n");
}
return 0;
}
あるサイトを参考に
簡単な九九の表を作ると
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15...
...
...
(略)
このようになると思いますが、
隣の数字を参照にして足して
3 5 7 9 11 13 15 17
6 10 14 18 22 26 30 34
9 15 21 27 33...
...
...
(略)
と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。
0926デフォルトの名無しさん
垢版 |
2018/11/29(木) 00:21:59.55ID:kX/wXhND
>>924
別スレにも書き込んでたけどそっちでは相手にされてなかったね。
上記サイトと書いておいて、そのサイトが抜け落ちてるよ。コピペしたなら推敲もしような。

やりたいことは i*j+i*(j+1)を出力するということか?
0931デフォルトの名無しさん
垢版 |
2018/11/29(木) 12:32:34.75ID:f12HiZt9
この手の表現はネット検索でも探しにくいからなぁ。
検索ワードに含めることができない文字を使ってるかも知れんし。

Wikipedia で「顔文字」の「欧米型の顔文字」に例示されてるね。
P は大文字が普通なのか。小文字 p だと思ってたわ(てへぺろ)。
0933デフォルトの名無しさん
垢版 |
2018/11/29(木) 14:47:03.14ID:xfZAdJ8f
こないだTWITTERで orz の話題が流れてたわ。

「絵文字があるのにそういうので遊んでたんですね!」 → 「無かったんだよ (#^ω^)ピキピキ」
レス数が900を超えています。1000を超えると表示できなくなるよ。

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