X

C言語なら俺に聞け 142 [無断転載禁止]©2ch.net

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
垢版 |
2017/08/10(木) 20:21:23.44ID:hEocmkh50
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


http://mevius.2ch.net/test/read.cgi/tech/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/08/10(木) 20:44:11.22ID:aWUdy/dyM
だめ意見にはけなしたり煽るんじゃなくて具体的な反論ができるといいね
2017/08/10(木) 21:39:10.50ID:Wh1e+mJZM
帰ったらお勉強だぜ!!
2017/08/10(木) 21:51:00.72ID:LT6YffV+0
>>1 乙です
2017/08/11(金) 01:27:59.65ID:DcjyhNkl0
乙っ乙
6デフォルトの名無しさん (ワッチョイ 3323-hZ6b)
垢版 |
2017/08/11(金) 03:16:23.49ID:suC9gTdR0
7デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/11(金) 08:28:05.03ID:8TW1by1n0
>>2
煽りコントで笑いをとってたコメディアンのこと?
2017/08/11(金) 11:41:11.10ID:JIMcqw5z0
最近はPythonやっとけみたいな意見が多いんですが、
今、Cをやるメリットは何かありますか?
2017/08/11(金) 12:00:57.14ID:Ca8C76qb0
両方やればいい
10デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/11(金) 12:14:58.92ID:8TW1by1n0
ハード・ソフト両利きになるには絶好の近道
2017/08/12(土) 10:34:20.89ID:mpXbTRP+d
IYHスレのかほりがするw
12デフォルトの名無しさん (ワッチョイ 3323-aEKd)
垢版 |
2017/08/12(土) 16:57:37.18ID:6AXlD0eu0
>>8
それはあなたが今後何をやりたいかによる。
2017/08/13(日) 15:57:24.74ID:m4Rk+6os0
>>8
結局のところ C は基本中の基本で、避けて通れない、いずれやらないと仕方ない、という状況に追い込まれる
14デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 16:07:14.55ID:2GAXDCvV0
そういう意味では、あと英語な
マニュアルや規格票といえばまず英語
日本語版はないか、あっても10年遅れとか
そればかりか自分のコードのマニュアルやコメントも
英語で書けとだいたい言われる
2017/08/13(日) 17:01:50.43ID:aXXBQeA80
え?そんな所あるの?外資系とか?

まあ最初から英語できることを前提に雇っているならわかるけど、そうでない会社で
それやったらネイティブが忍耐をもってしても解読困難な英語モドキの文書の山に
なってしまうのではないか?
16デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 17:33:10.24ID:2GAXDCvV0
解読困難な英語モドキすっげええ、うんざりするほどあるよ
ずーずー弁しぇからしかこんだらず、なんて次元じゃねえ訛り方
・・・まあ恥ずかしながら日本人の訛り方はトップグループなんだが
2017/08/13(日) 17:59:59.41ID:aXXBQeA80
omg
2017/08/13(日) 18:13:02.46ID:WSSr83j30
>>14
英語の鍛え方として王道はないものか‥
今構文の教科書(昔の受験用,今の時代には難しすぎるかな‥)をさらっている.https://www.amazon.co.jp/dp/4828501134
19デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 18:29:50.42ID:2GAXDCvV0
技術英語を憶えるのに一般英語は邪魔
技術英語独特のボキャ貧はマニュアルや論文でしか学べない
2017/08/13(日) 18:34:17.87ID:8MgVlazH0
brother と sister は習っても、sibling を学校で習った覚えは無いな
2017/08/13(日) 18:39:03.83ID:o1ygPh5l0
>>18
自分がある程度詳しい分野のちゃんとした英語のドキュメントを読んでると、ここはこういう意味か、こんな時はこんな表現するのか、と言うのがある程度身についてくると思う。
22デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 18:54:33.40ID:2GAXDCvV0
>>20
2017/08/14(月) 00:49:40.57ID:FXoIQaW20
RFC読んだ後は、プログラム関係の文書だけは、英語でも何となくわかるようになったなぁ
人の和訳みながらよんだだけだけど
2017/08/14(月) 23:14:42.24ID:G751meAI0
苦手意識がなくなるだけでもかなりの前進かと
2017/08/16(水) 03:13:15.44ID:J8ft/v5zd
C言語の勉強をするためのおすすめのIDEを教えてください
2017/08/16(水) 06:06:58.39ID:g+tkU2cqd
Visual Studio
2017/08/16(水) 08:20:25.87ID:0Vt0rye20
Vim Emacs
2017/08/16(水) 09:23:43.88ID:zAUipZYH0
猫こそ至高
2017/08/16(水) 10:15:56.42ID:xWmu06fM0
VisualStudioに一票
30デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 11:07:32.90ID:J2krMHFz0
エディタで充分
IDEいらね
2017/08/16(水) 11:12:04.39ID:79/XacN36
Cの文法だけ知りたいんならIDEで身につくと思うけど、CのUNIX的な使い方とかMakefileの作り方まで含むならやっぱりターミナルでVimかEmacsが一番身につくと思うな
2017/08/16(水) 11:17:42.10ID:Xm1ENLXg0
ほんのさわりだけの話なら >>1
https://paiza.io/
https://ideone.com/
http://codepad.org/
2017/08/16(水) 11:42:34.56ID:CBEVrlMza
覚えるだけとか編集するにはPlumaで良かった
34デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 12:30:21.85ID:J2krMHFz0
IDEであろうがなかろうが
複数の環境を使ったほうがいい
1つの環境だけ使っていると
間違った知識をたっぷり吹き込まれる
その環境が悪いわけじゃなく
Cには処理系定義だの未規定だのがたくさんあるからだ
2017/08/16(水) 12:58:54.66ID:MtMWIb12M
汎用機でトライグラフとワードアドレッシングな奴をやっておけば完璧だね
36デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 17:14:38.09ID:J2krMHFz0
関数を呼び出すたびごとにいちいちGETMAINするのかと思ったら違った
2017/08/16(水) 18:42:31.13ID:eXMOwWIc0
実際のところトライグラフの環境ってあるのかね
汎用機のEBCDIC(英字)も記号は一通りあるよね
38デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 21:24:11.17ID:J2krMHFz0
カード穿孔機くらいかな
トライグラフの必要性を感じたデバイスは
2017/08/17(木) 00:56:17.97ID:ugZ0fkzt0
NEC MSコンピューターとかかな
シリーズで言うと MS120,MS140,MS190
2017/08/17(木) 06:39:42.32ID:3FDT79Ua0
ヨーロッパとかで英語以外の国で、C言語で使う記号のところに別の文字が割り当てられてるケースとか。文字コードまたはキーボードのキーとして。
2017/08/17(木) 06:59:39.42ID:qA/UZuuOM
どうでもいいことばかりだな
2017/08/17(木) 07:30:42.82ID:5FUl5JPE0
バックスラッシュがあるべき文字コードの場所が
現地の通貨記号に置き換わってる環境でトライグラフ使わね?
2017/08/17(木) 07:50:53.84ID:wL10pSGX0
>>42
そもそもそんな環境で開発なんてしたことないし
2017/08/17(木) 08:03:54.42ID:zzoRHhsR0
>>42
どこの国だよ
糞だなwww
2017/08/17(木) 08:26:01.37ID:NamoDwZf0
ノーマークでトライグラフになっちまってたことは過去に何度か・・・
(s)printf 中の format 文字列で
2017/08/17(木) 09:31:58.57ID:3IL/r6zdM
>>42
半角の¥は廃止すべき
2017/08/17(木) 10:45:25.58ID:ugZ0fkzt0
>>45
MJD?
48デフォルトの名無しさん (ワッチョイ 110d-JJVS)
垢版 |
2017/08/17(木) 10:55:11.53ID:NamoDwZf0
>>47
最近のコンパイラはデフォでトライグラフを抑制してくれてるようだけど
古いコンパイラは、そんな気がきいてないから

警告文 "warning??!" ってやって実際の出力が warning| で なんじゃこりゃ?と
2017/08/17(木) 10:59:46.51ID:NamoDwZf0
それでも ??/ → \ で
次の文字をエスケープして大事故にというのは無かったかな
2017/08/17(木) 11:00:52.21ID:OslnP8rdM
>>47
>>45じゃないけど "不正な値です: ??(10)" ってやったら "不正な値です: [10)" ってなって
はあ?ってなったことあるわ
2017/08/17(木) 12:36:35.61ID:kQ6hfaFr0
CとC++は馬鹿には使えない
惨事が起きるから
使わせてはいけないと聞いた
2017/08/17(木) 13:57:01.69ID:ylZytAyh0
いくつかのコンパイラはトライグラフがデフォルトで無効になっていたと思う
2017/08/17(木) 16:57:48.81ID:ZvDESEOS0
clとclangとgccはデフォルトで無効だし、今じゃ有効な環境のほうが珍しいんじゃないの
54デフォルトの名無しさん (エーイモ SEf3-Ufa9)
垢版 |
2017/08/17(木) 21:30:33.60ID:2RZZpZadE
char s[3] = "abc";
printf("%s %lu", s, strlen(s));

これの出力がabc 3にならず
abc 9abc 9とか
abcea 9abcea 9みたいに毎回不定で文字列が出力されるんですけど何でですか?
2017/08/17(木) 21:37:39.45ID:XnqHf7Mqd
>>54
ヌル文字が足りない。
改行がない。
2017/08/17(木) 21:39:34.19ID:XnqHf7Mqd
s[4]か、サイズ未指定のs[]にする。
\nを追加する。
2017/08/17(木) 21:40:55.02ID:XnqHf7Mqd
strlenの返却値はsize_tだから、%luは間違い。
2017/08/17(木) 23:15:30.23ID:zzoRHhsR0
>>57
正解は?
2017/08/17(木) 23:27:33.59ID:XnqHf7Mqd
>>58
http://qiita.com/7of9/items/ca5ebf9b7861acbcf656
%zuのようだな。
2017/08/17(木) 23:35:38.09ID:zzoRHhsR0
組み込みのショボいライブラリじゃ使えなかったりするから
unsigned intにキャストして%u
でいいや
61デフォルトの名無しさん (ブーイモ MMc5-gUFl)
垢版 |
2017/08/18(金) 03:59:52.12ID:URLOh4DLM
キャスト毛嫌いしてたんだけど、size_t や int*_t シリーズを printf 書式で使う時のベストプラクティスだと気付いてしまったよ。
2017/08/18(金) 04:18:35.01ID:sjvn+N2bd
サイズの変わる型キャストは、(通常無視できる程度の)少しだけコストがかかることに言及しておこう。
2017/08/18(金) 04:20:02.39ID:sjvn+N2bd
わずかに時間と計算量がかかるという意味のコストね。
2017/08/18(金) 07:04:19.91ID:R7MrN97k0
printf使ってるときなら、無視できるレベルだな
2017/08/18(金) 07:10:44.43ID:RGoxPD09M
大抵の場合、暗黙でintに変換されるので%dで問題ない
2017/08/18(金) 07:50:44.76ID:cQGhZEXD0
>>63
64ビットで渡すより32ビットで渡す方が普通は速い
2017/08/18(金) 07:51:44.71ID:cQGhZEXD0
>>65
intより大きいサイズはintに変換されない
68デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 09:48:31.67ID:+zi/zXZ30
>>65
問題大ありだよ
64bit 環境では、sizeof sizeof 1 == 8 だぞ
69デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 10:03:06.56ID:+zi/zXZ30
脇道に逸れるが整数のサイズってどいつもこいつもイマイチだね
char 8
short 16
int 32
long 64
long long 128
と、せっかく5階級あるのを無駄なく使えるようになってない
2017/08/18(金) 11:07:14.63ID:cQGhZEXD0
どこの環境だよ
71デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 11:55:29.20ID:+zi/zXZ30
いや、そういう環境があったらなあと
2017/08/18(金) 12:41:24.28ID:8ZqVNhGud
そんなに細かく分ける意味あんのかね。
64bitだけでいいだろ。
73デフォルトの名無しさん (ワッチョイ 4b6c-oL0b)
垢版 |
2017/08/18(金) 12:46:10.63ID:K+PXWISB0
Makefileの書き方なんだけど

makeが実行されているときに 今何を実行してるか表示されるけど
「なんでこれが実行されているんか」の理由も表示したい
依存関係の hoge: fuga を表示したい


.c.o:
@echo $@:$^
$(CC) $(CFLAGS) -c $<
みたいに書いたりしてんだけど、全部に書くのもダサい気がするし
良い方法はないでしょうか
74デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 15:25:50.71ID:+zi/zXZ30
>>72
128が標準にあれば使い途いろいろあるぞ
2017/08/18(金) 15:40:25.23ID:RRX5RBja0
>>73
GNU make なら -d (デバグ表示)とかは?

ただ「なぜこれが実行される」って、ファイルの更新日時ぐらいしか
ないと思うけど
2017/08/18(金) 16:57:07.47ID:UodSk1FQ0
>>75
このコマンドを実行したのは○○より△△が古いから
って言うのを知りたいんでしょ
$^ の意味も知らないならROMってなよ

>>73
make コマンド自体に手を入れた方が早いかも
2017/08/18(金) 18:57:47.45ID:aoGOUUu+0
C関係ないんだから、別スレでやれよ
2017/08/18(金) 20:41:27.26ID:2qfgYUHL0
すみません初歩的なことですが・・
前置インクリメントa++
後置インクリメント++a
がありますが、a=a+1は後置になりますよね?
2017/08/18(金) 20:44:00.68ID:m74Y+4jlM
b=a++ と b= a= a+1 は違う気がする。
2017/08/18(金) 20:47:26.76ID:sjvn+N2bd
どちらでもない。
2017/08/18(金) 20:49:13.42ID:5LpMFucB0
加算と代入
2017/08/18(金) 20:51:16.52ID:2qfgYUHL0
回答有難うございます
実験してみたのですが、a=a+1は前置(a++)にも後置(++a)にもなるのですね
http://i.imgur.com/teLsUGY.jpg
83デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 23:11:42.85ID:+zi/zXZ30
違う! 前置だ
b = (a = a + 1);
2017/08/18(金) 23:21:22.94ID:5LpMFucB0
a[i++] = i; は悪魔召還だけど
インクリメント演算子なしのこれ
 a[i =i+1] = i;
も鼻から悪魔になるのかな
2017/08/18(金) 23:57:54.41ID:nSj4GkNd0
>>78
>前置インクリメントa++
>後置インクリメント++a

考え方が逆
変数を基準に考えるのではなく演算子を基準に考える
前置インクリメント++a : 演算子を’前’置した場合、変数(式)の評価’前’に演算子が適用される
後置インクリメントa++ : 演算子を’後’置した場合、変数(式)の評価’後’に演算子が適用される
2017/08/19(土) 00:03:09.07ID:0xgPi4RO0
>>84
なるでしょ
iの変更と最後のiの評価の間に順序性がない事に変わりはない
87デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/19(土) 09:44:47.22ID:CpINIl4e0
i = i + 1;
の、iの変更と最後のiの評価の間の順序性は?
88C言語ますたー《ますたー軍団(常時募集)の長》 ◆oa6k//3vOQ (ラクッペ MMed-UZV0)
垢版 |
2017/08/19(土) 09:54:20.36ID:6ANTyB1VM
>>87
i+1のiは変更前のiでしょ
2017/08/19(土) 10:03:42.32ID:cD3Bg7W9d
>>30
デバッグしないのか?
2017/08/19(土) 10:37:04.42ID:opyN89fo0
デバッガはデバッガで起動すればいいし、printf があるし。
2017/08/19(土) 11:26:43.49ID:0xgPi4RO0
>>87
6.5.16 Assignment operators
「The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.」
左オペランドの変更は、左右オペランドの評価の後
2017/08/19(土) 12:19:31.20ID:9KU7ntuJ0
>>84
MISRA-C で、禁止されている

a[式]
この式に、副作用があったら、ダメ。
バグるから
93デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/19(土) 15:28:05.17ID:CpINIl4e0
>>91
thx
だよな、そこは断り書きが必要な箇所
2017/08/19(土) 23:53:05.68ID:HeBiuDVT0
>>92
バグが入りやすい書き方ってだけでバグるわけじゃない
2017/08/20(日) 00:16:58.16ID:856Qy56L0
a[i++]= b; は問題ないしな。
96デフォルトの名無しさん (ワッチョイ 6123-WxsM)
垢版 |
2017/08/20(日) 03:47:32.99ID:+c5k6kJk0
右辺の結果を出してから左辺の計算やってるようだな。
https://paiza.io/projects/G_durt7YVnR55npMvUcKwg
2017/08/20(日) 06:41:37.88ID:6XW1JaY/0
http://i.imgur.com/BmPLoWb.png
98デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 09:25:38.38ID:sGdhnhOm0
事実上どうなっているという話ではなく
理屈の上でどうなのかという話
ちゃんと断り書きがあったからめでたしだが
そうでなかったら大変だった
2017/08/20(日) 09:58:54.27ID:SbUj3AhWM
>>76
ありがとう
ちょっとmake読んでくる
2017/08/22(火) 11:22:32.57ID:chgkyZKA0
defineした定数を文字列定数にいれるにはどうしたらいいの?

#define EOL 0x0d

const char version_message[] = "Version 1.0\x0d"

↑この文字列の改行コードに定数EOLを展開した値を入れたいです。
2017/08/22(火) 11:44:36.20ID:xXPB4eWM0
>>100
https://ideone.com/LeNUGK
102デフォルトの名無しさん (エーイモ SEf3-Ufa9)
垢版 |
2017/08/22(火) 11:47:40.32ID:przmPyd7E
typedef struct hoge {
int a;
int b;
} hoge;

hoge h = {1, 2};

構造体に含まれるメンバ名と値を全て出力する方法を教えてください
上の構造体なら
a,1
b,2
と出力したいです
2017/08/22(火) 11:59:42.09ID:GCxyf0Da0
>>100
小さな部品を繋いで大きなものを得るのはとても簡単にできるけど
部分を削って小さな部品を得るのはとても大変なのよ
だから本来は改行文字は機能的にレイアウトなのでデータとは分離しておいて
表示なりなんなりするときに結合して使うのが望ましいもちろんVersionと数字もね

その上で既存コードのメンテ等でどうしても必要なら>>101がベスト
2017/08/22(火) 12:08:53.86ID:R9ds2cCvH
>>100
#define EOLSTR "\x0d"
const char version_message[] = "Version 1.0" EOLSTR;
2017/08/22(火) 12:11:18.37ID:xXPB4eWM0
>>104
それは迷ったんだよねー
次点でその文字列をマクロで作ることも考えたけどあかんかったw
2017/08/22(火) 12:14:35.93ID:GCxyf0Da0
>>102
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a);
107デフォルトの名無しさん (エーイモ SEf3-Ufa9)
垢版 |
2017/08/22(火) 12:52:42.46ID:przmPyd7E
>>106
そうなんですか・・・
全部直書きするのキツイのであだ名がなくてもかまわないのでこの場合の方法ないでしょうか?
2017/08/22(火) 13:00:37.52ID:u9fcDp43H
デバッグ目的ならデバッガで
2017/08/22(火) 13:20:20.96ID:chgkyZKA0
>>101,104、ありがとうございます、

PCとUSBシリアルで通信する組み込み機器のドライバをメンテしていて
受信したテキストの終端検出にEOLはキャラクタで扱っているし
送信する固定テキストは改行含めてリテラルにしたく
プリプロセッサの#か##で連結でなんとかできないか悩んでました。
2017/08/22(火) 13:21:07.96ID:bF0tRsYk0
コンパイルしたらメンバー名と型の情報は消える
111C言語ますたー《ますたー軍団(常時募集)の長》 ◆Cmaster.sY (ラクッペ MMed-UZV0)
垢版 |
2017/08/22(火) 15:44:32.04ID:tfXVsICTM
メモリアドレスを出力させればいいんじゃない?
%pで&aを表示できるはず
2017/08/22(火) 16:43:27.00ID:xXPB4eWM0
与えられた変数から、メンバ名とその値を再帰的に列挙して欲しいんだろうけど
そんな都合の良い言語じゃないから自分で並べるしかない

必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか
113デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 17:44:12.68ID:NIldwpVs0
再帰的に列挙は自動だととんでもない情報量になったりするからな
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ
2017/08/22(火) 22:53:39.27ID:YwU2BQ/U0
>>100

#include <stdio.h>

#define EOL x0a
#define _STRING(s) # s
#define STRING(s) _STRING(s)
#define _VALUE(s) 0 ## s
#define VALUE(s) _VALUE(s)

char a[] = "Hello" STRING(\EOL);

void main(void) {
int n;

n = VALUE(EOL);
printf("%02x [%s] \n", n, a);
}
115デフォルトの名無しさん (ワッチョイ 6123-oL0b)
垢版 |
2017/08/22(火) 22:53:45.07ID:hpqXPKX70
>>107
マクロでちょっと簡略化することはできる。ちょっとだけな。
https://paiza.io/projects/dRqn0XFnjDUUmr5_5AzF2A
2017/08/22(火) 22:56:32.37ID:hpqXPKX70
あ。もうちょっとできたので今修正した。
2017/08/22(火) 23:26:16.15ID:bF0tRsYk0
>>115
これってさ、メンバ名をconst char*にするんだよね?
2017/08/22(火) 23:41:21.22ID:D8nSL4rC0
>>115でいいと思うけど、
そもそもこれがしたい場合にC言語を使うのが間違いでしょ。
動的言語かリクレクションがある言語を使えばいいだけ。

ちなみにVC++/CLIでよければリフレクションが使えるけどね。
質問者には無理だろうけど。
レベルからいって>>108が当たりだろうね。
2017/08/23(水) 00:06:55.83ID:b0JJUPNx0
>>117
#x の所? そうじゃないかな。gcc -E とかやって見てみるとわかると思うが、 h.a は単純に "h.a" になっている。

>>118
C使わなきゃいいってのはその通りだが、それを言っちゃあお終いよ。
2017/08/23(水) 00:14:59.00ID:PJzK0CC4M
構造体のメンバ名がほしいとかデバッグ以外に何があるの
2017/08/23(水) 00:22:23.00ID:CuDbJhab0
>>120
有名どころはGUIのバインディング。
例えばWPFは自動的にリクレクションを使ってこれをやってくれる。詳細は以下参照。
http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html

ただ、Cのアプリでこれは要らんし、今時生CでGUIもないよな?
2017/08/23(水) 06:05:17.73ID:x0fRL5lg0
テキストベースで構造体の値のファイルへの保存と読み込みをしたいのかな
123デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/25(金) 05:26:20.30ID:vC6ff47f0
マクロでどうにかできるかとも考えたが壊れる対処のし様がない

#define pr(a,b) printf(pr_##a(b))
#define pr_test_t(b) "#b{i:%d,s:%s}", (b).i, (b).s
typedef strct{int i; char *s;}test_t;

pr((test_t){.i=999; .s="abc"});
2017/08/25(金) 05:30:42.91ID:hNG5yKqv0
Cはウンコ言語なのでリフレクションはありませんの一言で終わる質問
2017/08/25(金) 08:26:26.12ID:degYWVoy0
C言語はもう 気ままにリフレクション
2017/08/25(金) 08:28:37.56ID:+VfvF6y6d
>>124
うんこじゃない言語もコンパイラはうんこ言語(お前に言わせるとC言語)でつくられてるけどな
2017/08/25(金) 08:31:15.05ID:mWX/padLd
本当にうんこならとっくの昔に消えてるよ
128デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 15:42:32.73ID:RGmsOxnq0
Cはうんことかほざくやつ
まさかLinuxなんか使ってねえだろな
2017/08/25(金) 17:02:40.42ID:mWX/padLd
linuxはうんこ
2017/08/25(金) 17:44:02.80ID:GY4pXB3S0
Cがウンコとか言ってる奴に限ってRubyでしか書けないとかいうオチだったら笑えるんだけどな
2017/08/25(金) 21:36:12.81ID:BZOsNf+t0
高級アセンブラ最高じゃん
2017/08/25(金) 22:36:16.04ID:+VfvF6y6d
>>131
ほんそれ
2017/08/25(金) 22:45:39.22ID:IHFV3+gX0
むしろ Ruby で自由にコードを書ける人を尊敬する今日この頃。
最近やってるんだけど、どうしても馴染めない。普通には組めるけど、違和感が残るというか抵抗があるというか。
2017/08/26(土) 00:06:54.39ID:F7j6CSPU0
リフレクションを使う気がなければリフレクション自体がウンコだよ。
・ソースコードがだだ漏れ
・実行体が無駄に膨らむ(ソースコード情報を含むため)
・リクレクションが必要な用途なら、動的言語でついでに型無しの方が断然楽

GUIとかね。
ウンコと言われ続けたJavaScriptを誰も殺せず、
ついにはElectronとか言い出してデスクトップ側にも進出してきてるだろ。
やれば分かるがGUIに関しては動的型無しHTML(=JavaScript)は最強。

C言語はC言語が目指した範囲での仕様は美しいよ。
ただそこには今後ともリクレクションは必要ないね。
唯一引っかかるのは>>122か。

>>133
どの辺が?
俺はRuby使いではないが、それよりも酷いとされるJavaScriptには馴染んでしまったから、
ある程度は答えられるかも。
135デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/26(土) 00:48:52.34ID:acOQPPj10
lua等の組込み言語とやり取りする container生成用補助構文群が有ってもいい
関数では前方宣言とか scopeが邪魔して対処しきれないだろうから
うまくすれば文字列操作表示も標準libraryから追い出せる
136デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/26(土) 00:52:27.30ID:acOQPPj10
pr(test_t, (test_t){.i=999; .s="abc";});
2017/08/26(土) 14:20:33.57ID:rkE5GYva0
>>134
javaでアノテーションいじり始めるとリフレクションまじ便利で欲しくなるけど、c系にはなくてもいいかなというのも思う。

テバグ目的ならgdbでいいしな。
2017/08/29(火) 00:26:03.40ID:+Y8D6iZy0
>>134
規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
TypeScriptとかFlowとか
速度を稼ぐ目的でwasmも今後主流になっていくだろう

巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
2017/08/29(火) 02:58:14.41ID:Uz0lh6nE0
>>138
> 規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
違うね。今の流れは「選べる」だ。つまり、
・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
どっちも出来ることはほぼ同じ。ほぼ全ての言語がここを目指してるでしょ。(Cを除く)
要するにいいとこ取りを目指しているわけで、自然な流れだ。
型があった方が助かるのなら書け、煩わしいだけなら書かなくて済む、という方向に進化しつつある。
なお、GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。

> 速度を稼ぐ目的でwasmも今後主流になっていくだろう
ならんと思うし、C使いにとってはなったとしてもああそうですか、でしかないと思うが。

> 巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
OSSについては歪んでいて、本来は選べるべきだよ。
JavaScriptのようにソース曝露必須というのは問題ではある。

富豪どころか大富豪プログラミングを自由に出来る時代ではあるが、
何だかんだで速度=バッテリの持ち/快適さなので、実際は、「気にしなくていい環境も増えた」だよ。
とはいえCレベルでのチューニングが必要なこともそうないが。
2017/08/29(火) 07:49:01.20ID:pPJ906sN0
>・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
>・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java

後者は型を明示的に書かなくてもいというだけで最初からすべて型検査してるぞ。
型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
2017/08/29(火) 08:29:00.57ID:E7mhir0G0
動かす前にバグが見つかる仕掛けがちゃんとあるなら
動的型付けでも構わんよ
2017/08/29(火) 14:42:19.23ID:/UmWkn6m0
無理ゲーっぽくね?
2017/08/29(火) 14:47:49.09ID:/UmWkn6m0
んなことはないみたいだぬ
2017/08/29(火) 18:55:09.32ID:qEt/+AkhM
100%は無理
そこそこなら行ける
2017/08/29(火) 20:04:11.09ID://zGX0GI0
option explicit +中間言語コンパイル,なら使えそうだ
2017/08/29(火) 22:43:29.12ID:Uz0lh6nE0
>>140
> 型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
これは事実としてはその通りだが、理由はこれが型あり言語の正義だからであって、
現実は型検査がウザイだけの時も多いだろ。
C++のtemplateとか、varで書いたら勝手にtemplate化してくれ、という場合も多い。
込み入ったことをやるとコンパイルを通すだけの為に苦労したりするが、
あんなのは完全に時間と手間の無駄だ。
また、他でもよく言われているが、確かに関数ポインタを常用し始めた場合、
型あり『しか出来ない』言語は壮絶にウザイ。どうでもいい型が氾濫するだけだし。

言語として出来る/出来ないではなく、
ユーザーがやりたい時には出来る/やりたくない時には切れる、が正解なんだよ。
型無し言語はこれを認めていて、欠点を修正し始めてる。
型あり言語はこれを認められず、まだ自分たちの正義(型検査は必須)を押し売りしてるだけ。

C(と言うかC++)ではconstがこの状況に近いのではないかな?
通説ではconstは付けるべき、となっているが、俺は付けてない。理由は、
・そもそも俺はconstで苦労したことがない(必要性を感じない)
・中途半端に付けてると余計に面倒になるだけ
・const_castとか、ただの馬鹿としか思えない
なんだが、同様の意見の奴もある程度はいるだろ。
過剰な型検査ってのはあるんだよ。それが人によって異なるってだけで。
やればいいって物ではない。
2017/08/29(火) 22:56:30.74ID:pPJ906sN0
なんだ?>>139の「違うね」ってのは現状認識が違うって話じゃなくてあんたの理想と違うってことか?
そりゃ正解はあんたにしかわからんわ。
2017/08/29(火) 23:14:00.57ID:Uz0lh6nE0
>>147
現状認識も間違っていると思うけど。
日本語が不自由ならさようなら。

そもそも「型検査」が欲しいわけではなくて、静的チェックが欲しいだけなんだよ。
君は最初からずれている。>>141が正しい。
149デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/29(火) 23:17:01.52ID:/SLQJmZn0
> コンパイルを通すだけの為に苦労したりするが、
> あんなのは完全に時間と手間の無駄だ。

そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
2017/08/29(火) 23:31:56.37ID:pPJ906sN0
「今の流れってこうだよね」
「俺の欲しいものは違う」

会話にならねぇ。
2017/08/29(火) 23:53:00.65ID:Uz0lh6nE0
>>150
そうとしか取れないのは君が未熟だからだね。

「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。
2017/08/29(火) 23:57:29.58ID:+Y8D6iZy0
>>139,146
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね

>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ

>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?

あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
2017/08/30(水) 00:01:54.97ID:3iEZIBUv0
>>151
俺も>>150と同じように読めた。
自分の希望を大多数の希望だと決め付けるのは止めろよ。
2017/08/30(水) 00:53:26.35ID:F1WQhw000
>>152
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。

> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。

要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
http://ufcpp.net/study/csharp/sp4_dynamic.html#what
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。

俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。

> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。

> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
2017/08/30(水) 00:58:09.18ID:ry+Kms2n0
>>141
こういうやつってユニットテストしらないのか?

Cでも今時は書くだろ
2017/08/30(水) 01:17:46.58ID:ry+Kms2n0
型どうこうで考えるべきは依存関係なんだが

静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん

しかもデザパタで実現できる疎結合は完全じゃないからね
2017/08/30(水) 01:56:29.11ID:F1WQhw000
>>156
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。

しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。
2017/08/30(水) 02:00:40.60ID:vF4qFgfn0
>>154
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ

>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが

>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ

>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし

新しい言語はそこら辺かなり解決されてる
2017/08/30(水) 02:07:48.34ID:ry+Kms2n0
>>157
酔ってんのか?Java?意味不明だ

レス付けるなら何を話してんのか特定しろ
2017/08/30(水) 02:25:01.52ID:vF4qFgfn0
>>154
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか

根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ
2017/08/30(水) 06:22:36.60ID:dAnuHQ8p0
早く夏休み終わらないかな…
2017/08/30(水) 07:01:40.06ID:AqkMSzAW0
いや終わらなくていいよ
電車混むし
2017/08/30(水) 08:10:07.81ID:Li+Lo8rKd
大学生のは未だ続くで
164デフォルトの名無しさん (エーイモ SEb2-dmBu)
垢版 |
2017/08/30(水) 13:51:14.27ID:AB0hyKA3E
すいません
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
2017/08/30(水) 13:58:51.95ID:1qHN72hha
GUIないならgccでも問題ない
166デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 14:33:39.82ID:BJd10UjW0
GUIあってもgcc使えるぞ
gcc your_program.c -luser32 -mwindows

-luser32ってのがインポートライブラリuser32.libを使う指定な
他に色々kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.libなんかがいるんで適宜追加しる
2017/08/30(水) 18:06:52.31ID:S+MvNVsbM
Windows版のgccある?
168デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 18:24:32.41ID:BJd10UjW0
たとえばこんなのか?
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/
2017/08/30(水) 18:31:00.76ID:S+MvNVsbM
mingw 入ってない環境だとバイナリ使えないよね。
コンパイルして実行したいだけなのに。
2017/08/30(水) 18:43:05.43ID:LRl1+/WB0
実行ファイルの配布の意図?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
2017/08/30(水) 19:17:06.22ID:58Rp2mqQ0
>>169
よくごっちゃにしてる人がいるけどそれはcygwinを使う場合
mingwはランタイムにmsvcrtを使うのでcygwin1.dllは不要
172デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 19:17:51.85ID:BJd10UjW0
あのなー・・・
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
173デフォルトの名無しさん (ワッチョイ 0951-TBjh)
垢版 |
2017/08/30(水) 19:21:14.37ID:qx/wlZ6S0
https://www.youtube.com/watch?v=VzylWELlUy4
2017/08/30(水) 20:36:36.61ID:ViOUv0iA0
>>167
The Perl for MS Windowsって言うのがある。
これインストールすると、gccも入る
普通にコマンドラインで使える

http://strawberryperl.com/
175デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 20:41:41.90ID:BJd10UjW0
>>168だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
2017/08/30(水) 20:52:42.57ID:t1uAI5x90
こういう枝葉でゴチャゴチャやるぐらいなら、さっさとVC入れたほうが良い
windowsで開発するなら、VCさえあれば十分
2017/08/30(水) 21:46:54.45ID:1xtdX2a20
コンソールアプリくらいならgccでコンパイルできても良さそうなもんだけどな。

関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
2017/08/30(水) 22:05:25.61ID:AIW55pOFM
>>168 >>171
知らなかったです。
いいですね、MinGW
2017/08/30(水) 23:02:07.68ID:F1WQhw000
>>158
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。

ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。

C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
2017/08/30(水) 23:03:09.90ID:F1WQhw000
async/awaitはJavaScriptにもあるが、あれはC#とかで必要なのであって、JavaScriptでは要らないね。
理由は、
・外側関数(上位階層)の変数は全部クロージャになっていて読み出せる。
・関数はどこにでも書ける。
から。C的に関数毎に変数が完全に分離している時にはasync/awaitでないと変数が共有出来ないけど、
JavaScriptの文法だとcallbackでも変数共有出来るから、要らん。具体的には、文法は適当だが、
function someTask {
var x = xxx;
var a = await funcA(x);
var b = await funcB(a,x);
}
みたいなのを、
function someTask {
var x = xxx;
var a, b; // 共有変数は上位で宣言しておく。これでクロージャから捕捉出来る。;
function funcA(){}
funcA(funcB); // funcBはcallback、funcA内でxは使える、aにも書ける
function funcB(){} // funcB内でa,xは使える、bにも書ける
}
だからawait毎にぶった切ってcallbackしても、上から順に実行するだけの単純ソースにしかならない。
JavaScriptなら、どっちでもいいや位でしかないんだよ。
C#ではこれができないから、async/awaitが必要だってだけで。

ただ俺もcallbackと言ったがこれは間違いだった。VC++では非同期のcallbackはやってないわ。
ウザイと思ったのは関数ポインタを差し込む時に型チェックがあることだった。
上記の通り、JavaScriptでは関数ポインタでさえあれば引数の型と個数は関係なく呼んでくるので、
関数ポインタを差し込む時にいちいち考える必要がないんだよ。
そして機能追加は追加パスだけの変更で済む。
C++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
2017/08/30(水) 23:04:03.99ID:F1WQhw000
> コールバックの処理が適切なことはテストとかで保証するとか考えると
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。

「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。

>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。

自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)
2017/08/30(水) 23:14:59.21ID:58Rp2mqQ0
ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
2017/08/30(水) 23:55:33.72ID:FdjUx67gd
最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
2017/08/31(木) 00:01:55.43ID:B2+zi4Baa
最後に¥0を付けてないとか
2017/08/31(木) 00:06:31.32ID:M/UQy7Jt0
>>183
malloc/free使ってる?
2017/08/31(木) 00:15:15.17ID:AFctto/wd
>>185
一切使ってないっす……
引数で配列の大きさ渡してるのがまずいのかもしれない
2017/08/31(木) 00:22:21.25ID:Mr6ZzHeH0
配列サイズを越えて代入しているとか
2017/08/31(木) 00:28:32.21ID:K0ByhO+S0
つかソース晒せないの?
2017/08/31(木) 00:28:58.33ID:AFctto/wd
配列の代入とは関係ないところで死んでるっぽいこともあるんだけど、それでも配列の範囲外アクセスとかあるものかなあ……
2017/08/31(木) 00:31:52.88ID:AFctto/wd
>>188
そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです
2017/08/31(木) 00:32:55.14ID:AFctto/wd
よく考えたらそんな状態で相談することが間違いか
やっぱり撤回します。スレ汚しすいませんでした
2017/08/31(木) 00:34:49.91ID:M/UQy7Jt0
>>190
メモリリークをチェックしてみたら
193デフォルトの名無しさん (ワッチョイ a323-X0kF)
垢版 |
2017/08/31(木) 02:33:47.40ID:KfXpPD/x0
最適化の有無で変わった事と言うと、この前こんなことがあった。
(以下の A, B は typedef された構造体)

A *p = NULL;
B *q = NULL;

if (...) {
 A x;

/* x の初期化などをする。 */

 p = &x;
}

if (...) {
 B y;

/* y の初期化などをする。 */

 q = &y;
}

この後で p が NULL でなければ p の指す先を使おうとして死亡。

まあ、ブロック(というかスコープ)から外れた所で使ってるんだから当然と言えば当然ではあるが、
最適化しない場合は x, y はその他のブロック外の自動変数と同じようにスタックに領域が取られ
ていて変化する事がなかった。そのため内容は保たれた。
しかし最適化したら A の領域は A のあるブロックから外に出たら破棄されたと解釈され、そして
B のあるブロックの B の領域として上の A の領域を使用するようになっていた。そのため x と y
の指す先は union のように重なってしまっておかしくなったと。
2017/08/31(木) 03:22:36.47ID:IR3nOS0l0
>>179
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
2017/08/31(木) 03:58:43.17ID:IR3nOS0l0
>>180,181
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず

コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな

>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ

コンパイルエラーじゃなくてテストで保証するとになればなおさら変
2017/08/31(木) 04:15:22.77ID:IR3nOS0l0
>>181
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ

コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
2017/08/31(木) 05:12:55.38ID:egwbmqN8M
スタックフレームの破壊は明白なんだから関数内で宣言してる配列全部の
範囲チェック入れてみな
2017/08/31(木) 11:26:29.57ID:e5ym4hpC0
やりそうなこと

□ 要素数 n=10 の配列 int array[10];
アクセス可能なのは array[0] 〜 array[n-1] まで
なのに array[n] を利用してる

□ 文字列による配列の初期化で 終端記号(\0)含んだ分の領域を用意してない
× char text[3] = "123"; // 終端記号含めると 4要素の空間が必要なのに 3要素にしてる
○ char text[] = "123";  // コンパイラにおまかせで

□ 要素数を求めるのに sizeof(a) / sizeof(a[0]) を使ってるけど
そもそも論で a が配列ではなくポインタだった為
処理したい要素数が渡っていない
2017/08/31(木) 13:55:57.05ID:wUqC2S3T0
>>183
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
2017/08/31(木) 16:11:13.20ID:aZ9Rj489d
創業当時から継ぎ足した秘伝のソース
201デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 16:17:00.98ID:JYM1pg890
半分使って、半分継ぎ足しを繰り返すと79回目あたりで
アボガドロ定数の逆数くらいに薄まるよね
2017/08/31(木) 16:47:29.73ID:aZ9Rj489d
何か、酵母とか菌糸とか入ってて熟成されるんよ。ただ混ざるだけじゃないんよ。
2017/08/31(木) 22:53:34.07ID:F9uWTtxD0
>>194
> 型あったほうが便利派
半分くらいはインテリセンス目当てだと思うぞ。
そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。
だからconstは使ってないし、関数ポインタの型検査もウザイ。
つーか、型を間違えること自体がほぼ無いだろ?
引数の順番を間違えたりした場合に型検査で引っかかるってだけで。
2017/08/31(木) 22:54:02.64ID:F9uWTtxD0
>>195
> ローカル関数で変数をキャプチャできるぞ
ローカル変数しかできんだろ。しかも明示しなければならない。(全指定も出来るが)
JavaScriptの場合は上位関数の変数をどこまでも辿れるので、(レキシカルスコープ)
入れ子になっていても破綻せずに分解して展開出来るんだよ。
C++方式の場合はawait内にawaitが入れ子になっていると、展開出来ないだろ。

> コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
> それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
これは通説だが、俺はこれが嘘だと思ってるんだよね。
JavaScriptで言われているcallback地獄ってのは、非同期処理をその場で入れ子で書いている。
それよりawaitの方が見やすいってのは、上から順に読める形式だから。
でも>>180に書いたとおり、JavaScriptの文法ではcallbackを常に展開して書けるので、
その気になればawaitと同じ順で処理を書けるんだよ。(非同期がネストしない)
つまり、レキシカルスコープ+クロージャなら、awaitが無くてもawaitと同じ順で処理を書けるわけ。
C#やC++はレキシカルスコープがないからawaitが必要なだけ。
だからここら辺は実は文法との相性もあるんだよ。
C++はそんなのお構いなしに何でもかんでも入れてる感じだが。
(とはいえ、選択肢が増えること自体は悪いことではない)

> char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
そりゃconstの有無をテストで落とすのは無理だろうさ。
まあ、俺はconst自体が意味無い(無駄な手間が増えるだけ)という認識だが。
(ただし本当の意味でのconst(「定数」)の場合は使う。Cならマクロで与えていたケースとか)

そもそも君はどこまでconstを使っているんだ?
C++のconstは「定数」ではなく「再代入禁止」だ。
現実的には無駄に再代入することもないので、ローカル変数の大半にconstを付けられるはず。
これをやっているのか?
やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。
2017/08/31(木) 22:54:22.15ID:F9uWTtxD0
>>196
コードを流用するとね、
void test(a,b)
{
// (A)
hoge(&a,&b); // (B)
piyo(a+b); // (C)
}
で、(B)をconst指定にした時のみ(C)で大胆な最適化を行えるケースは、
・(B)が(C)に影響する副作用を持っていないと「const指定した時のみ」分かる
場合だけだが、これはconst指定ではどうにもならんだろ。

これはプログラマが上位の仕様(test関数の仕様)として規定するものであって。
例えば構造体配列で、(B)は[i]への書き込み、(C)は[j]からの読み出しで、i!=jが上位で保証されているとか。
この場合は、プログラマが最初から(A)(C)(B)の順に書けるんだよ。
そうではなくて、(B)が(C)に対しての副作用を持つ可能性がある場合、つまりi!=jが保証されていない場合、
当然(B)(C)の順にする必要があるけど、
これをconst指定で最適化(=(B)が(C)に対しての副作用を持たないことを保証)することは出来ないでしょ。
206デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 02:04:57.35ID:2msaHTP30
>>204
ん、C++のconstは、Cのconstよりも「定数」だぞ
int const a = 1;
switch(1) [
case a: ; //valid in C++, invalid in C
}
2017/09/01(金) 08:48:03.58ID:5GGRc0nid
>>206
すまん、そのコードの意味がわからん
208デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 09:06:42.83ID:2msaHTP30
typoしとるな
[は{
2017/09/01(金) 09:55:02.84ID:kxCoop1y0
case ラベルに const な変数の変数名

C++ ならばリテラルと等価となりセーフ
C は変数のままの扱いでアウト
210デフォルトの名無しさん (ワッチョイ 53db-aQR2)
垢版 |
2017/09/01(金) 11:36:56.59ID:IGPoCkp90
Cのconstは変更不可なオブジェクトだからな
2017/09/01(金) 13:20:08.84ID:JSZHio/AM
C++は使える範囲を広くしただけでconstの意味はCといっしょ
constによる最適化の話には関係しない
212デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 15:37:25.51ID:2msaHTP30
違う
constはもともとC++発祥のもので、
Cでパクるにあたり微妙に改変した
constは最適化に関係するが
今この流れでは最適化とは全く無関係の話をしている
2017/09/01(金) 16:51:03.36ID:dkwAUCjz0
volatileについてもkwsk
2017/09/01(金) 17:40:42.98ID:XJwe5Q/Z0
ttps://regmedia.co.uk/2011/02/18/dennis-richie-and-brian-kernighan-pdp-11.jpg
こういう時代の揮発性のメモリ
揮発しないメモリもあるんですよ
215デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 18:43:10.50ID:2msaHTP30
ビットフェードとvolatileは関係ないぞ
2017/09/01(金) 18:59:13.16ID:dXFBhBz10
コード中の文意では変わってなくても、他の要因で変わる可能性あるような
割り込みやマルチスレッド等で共有してる変数とか
2017/09/03(日) 03:14:53.65ID:GCfgdhr+0
> C++のconstは「定数」ではなく「再代入禁止」だ

代入と初期化を混同してませんか
2017/09/03(日) 08:56:24.33ID:72Px+h1e0
staticについてもkwsk
219デフォルトの名無しさん (ワッチョイ a323-wVzx)
垢版 |
2017/09/03(日) 11:44:42.91ID:jl0cf3RS0
性的な
2017/09/03(日) 12:14:41.26ID:9dM4T0NO0
外からは見えないように、そして、なくさないようにするエロ本
221デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:40:32.30ID:jXGwZqzU0
一口にstaticと言っても、そのキーワードは用法で意味が変わるからなあ
2017/09/03(日) 17:45:54.60ID:5WRYI1ZX0
static に背負わせすぎな気がする
関数内変数の static
関数スコープ外の static
C++ ならばクラスメソッドのstatic
クラス変数の static もあったかな‥多すぎだ‥
2017/09/03(日) 18:29:43.87ID:fyDk5FSQ0
予約語を減らす涙ぐましい努力
224デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 18:47:29.02ID:jXGwZqzU0
C99以後、仮引数のstaticもあるしな
225デフォルトの名無しさん (ワッチョイ ffea-pNuo)
垢版 |
2017/09/04(月) 00:43:28.93ID:QxIkVb9z0
ポインタ関連で*と&の記号を使っているのも
初心者を遠ざけているよな
素直にpointerとかrefとかの予約語作ればよかったのに
2017/09/04(月) 01:05:35.63ID:IeE+YITL0
>>225
もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。
2017/09/04(月) 01:17:41.88ID:rnM3x3Xp0
>>225
C# の ref 宣言のように,宣言だけでなく呼び出し側でも ref が必要だという文法はあってもよかったかな
2017/09/04(月) 02:45:48.86ID:tVodzhFi0
>>224
え?そんなのあった?
229デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 08:55:10.34ID:pd3pCmCq0
>>228
ISO/IEC9899:1999
6.7.5.3 Function declarators (including prototypes)
21 EXAMPLE 5
void f(double a[restrict static 3][5]);
230デフォルトの名無しさん (ワッチョイ a323-wVzx)
垢版 |
2017/09/05(火) 00:59:51.51ID:2RdPD3ce0
>>229
ああ。そういう使い方か。
2017/09/07(木) 15:42:36.42ID:zsD50ajta
以下の三つの操作に違いはありますか
NはMと比べて十分大きいとします

char s[M];
wchar_t ws[N];
mbstate_t state = {0};
// 1
scanf("%s", s);
wbsrtowcs(ws, &s, N, &state);
// 2
scanf("%ls", ws);
// 3
wscanf(L"%ls", ws);
232デフォルトの名無しさん (ワッチョイ b323-QlH+)
垢版 |
2017/09/08(金) 04:19:51.29ID:LlnxN/9E0
>>231
1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。
例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。
233デフォルトの名無しさん (エーイモ SE5a-w7pF)
垢版 |
2017/09/08(金) 22:13:19.23ID:Hco6il2OE
兄貴すいません
アロー演算子の使い方を学びたいのですがどこを直せば動くのか教えてください

#include <stdio.h>

struct User {
char name[5];
int age;
};

int main()
{
struct User *u = { "hoge", 10 };
if (u->hoge != NULL) {
printf("%d\n", 1);
} else {
printf("%d\n", 0);
}

return 0;
}
2017/09/08(金) 22:41:39.10ID:R6JsR04N0
>>233
*uじゃなくてsにてもしてuに&sを入れてhogeをnameに変えれば動くけど
これnameが実体だから100% 1が出るよね
2017/09/09(土) 01:43:06.63ID:DK1wXlQ90
struct User {
char *name;
int age;
};

int main()
{
struct User st = { "hoge", 10 };
struct User *u = &st;
if (u->name != NULL) {
 ......
2017/09/09(土) 12:01:06.79ID:KEHxH6tI0
>>233
mallocして中身を詰める

#include <stdio.h>
#include <stdlib.h>

typedef struct{
char name[5];
int age;
}User;

User* new_user(const char* const name, const int age){
User* u = (User*)malloc(sizeof(User));

strcpy(u->name, name);
u->age = age;

return u;
}

int main(){
User* u = new_user("hoge", 10);

if (u->name != NULL) {
printf("%d\n", 1);
} else {
printf("%d\n", 0);
}

return 0;
}
2017/09/09(土) 12:54:39.58ID:Ii5yjdZLa
>>232
なるほど
ありがとうございます

fgets(s, M, stdin);
const char *p = s;
mbsrtowcs(ws, &p, N, &state);
でも1と同様の問題が起こりますか

>>231は関数名と実引数の型を間違えてました
238デフォルトの名無しさん (ワッチョイ b7e4-hwHx)
垢版 |
2017/09/09(土) 16:17:54.34ID:qJRB74Th0
>233
int main(){
return !printf("%d\n",strlen( (&(struct User){.[0]name=0, .age=10, .name={'h','o','g','e'}})->name) 1: 0), 0;
}
char[5] nameとNULLの比較じゃ意味ねーと思うんだわ
239デフォルトの名無しさん (ワッチョイ b323-xkdj)
垢版 |
2017/09/10(日) 04:20:42.87ID:3lFSiHDa0
>>237
大丈夫だと思う。
2017/09/10(日) 09:19:13.64ID:bduAIVLIa
>>238
なんか色々間違ってねーか?
2017/09/10(日) 10:12:13.09ID:3KJHgwTr0
>>238
>>233のような初学者にそんな解読しにくいコードを提示しても意味ねーと思うんだわ
242デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 11:46:48.72ID:uI7cAZFMa
暇すぎたので昨日からC言語の勉強始めましたプログラミング初心者です。
これって趣味にできる?
2017/09/10(日) 11:52:24.67ID:igLJE8zId
できる
2017/09/10(日) 13:39:43.37ID:3lFSiHDa0
そして趣味が高じて仕事にw
245デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:42:12.95ID:uI7cAZFMa
今本屋なんだけどどの本で学ぶのがいい?
てかphytonとか他の言語の方が良かったりする?
246デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:45:14.25ID:uI7cAZFMa
ちなみに本職は監査法人の公認会計士で監査してるんだけど仕事に役立つならそれに越したことはない
2017/09/10(日) 13:50:00.90ID:SyCSejr00
幅広くエロエロやると上達早いで
もしノイマン型コンピュータの基本知識が
無いのならどこかで学習する必要がある
メモリ、アキュムレーター、インデックスレジスタ…etc
2017/09/10(日) 13:53:38.31ID:rGvjr77j0
>>246
公認会計士の仕事にはなかなか結びつかないだろうけれども…ガンバレ
C/C++ はどちらかというと原始的
python AI/機械学習で今はやり

ゴルフでもなんでも最初は大変だから一定の覚悟が必要
249デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:56:43.80ID:uI7cAZFMa
あんま知識は無い。
じゃあC言語とphytonを並行して学ぼうかしら。
250デフォルトの名無しさん (ワッチョイ b323-QlH+)
垢版 |
2017/09/10(日) 14:35:30.74ID:3lFSiHDa0
会計ねえ。Excelとかの本のほうがいいかも知れんな。その方が仕事に結び付けられる事が多くて覚えは早いのではないかと思う。
マクロも一応プログラムだしな。Excelにくっついた形のものではあるが結構色々な事ができる。
で、それがある程度できるようになったらプログラムというものがだいたいどういうものかわかるようになってるだろうから次はVBのように似ているものをやる。
似ているのでこれの習得はかなり早いと思う。それから他の言語を色々やって幅を広げる。
2017/09/10(日) 14:52:01.58ID:SyCSejr00
Excelマクロ…
組むと疲れる、悪い癖が付く等良い所が無い言語
252デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 15:07:37.65ID:uI7cAZFMa
まあ別に趣味だから仕事に役立たなくてもいいぞ
253デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 15:12:20.15ID:uI7cAZFMa
苦しんで覚えるC言語っての買った
2017/09/10(日) 15:23:52.77ID:GVNmgcdo6
苦しめ
2017/09/10(日) 15:29:50.37ID:7And7Hgf0
俺なら楽しんで覚えるけどね
2017/09/10(日) 16:30:29.97ID:TxU3QtzA0
苦Cは買わなくてもネットで読めるのに・・・
2017/09/10(日) 16:52:57.48ID:3KJHgwTr0
見易さではいまだ紙媒体の方が上だと思うし、惜しむほどの額でもないだろう
2017/09/10(日) 17:48:30.86ID:eDTlLPEV0
神聖言語COBOL
259デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 17:58:39.08ID:Z8XrRGDBa
受信したメールの中身を理解して必要なメールと不必要なメールを分け、必要なメールの情報を分かりやすい文章に要約して表示するプログラムC言語で作れる?
ついでに簡単な返信なら自動でしてくれたらありがたいんだが。
260デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 18:04:27.57ID:Z8XrRGDBa
返信が必要なメールと判断した場合は、返信メール本文の例を1万種類ぐらい自動で作成して、その中からより最適なものを3種類ぐらい提示してきてこっちはそれを選ぶだけで良いという機能も欲しいぞ
2017/09/10(日) 18:16:25.18ID:/r+wfg1UM
レス乞食
2017/09/10(日) 18:24:18.77ID:TxU3QtzA0
>>257
それがついこの間デザインがリニューアルされたんだよ
内容は同じだけどw
前よりは見やすくなったかな
2017/09/10(日) 18:26:26.80ID:VNZjd7Zj0
りんなとやり取りするプログラム作って、りんなに判断してもらえ。返信内容も一緒に
2017/09/10(日) 18:40:04.78ID:m2l+DHFcd
SMTP, POP3などのメールプロトコルで、メールサーバとソケット通信。
メールを分類するなら、自然言語処理とベイズ推定が必要。
2017/09/10(日) 18:57:20.96ID:m2l+DHFcd
単純な分類なら、振り分けルールが使えるメーラーを使えば簡単。
2017/09/10(日) 19:00:07.53ID:Fa46oRS50
ヘッダーに書いてあるエンコードが嘘いってて中身は別コードを
なんとか帳尻合わして可視化する部分が厄介 (nkf で大分楽にはなるらしいけど)
267デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/10(日) 19:00:48.08ID:BxaTac1G0
>>259
「必要なメール」とそれ以外の境界を
おまえさんが明確化できるか否かにかかっている
何言語を使おうが同じことだ
Cは推論エンジンそのものを作れる言語で
通信アプリやドライバを作れる言語でもあるので
諦めねばならないアイディアはまずないはず
268デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 19:38:42.01ID:Z8XrRGDBa
>>267
「必要なメール」とそれ以外の境界線はこれまで私自身が行ってきたメールへの対応を見てプログラム自ら学習して欲しい。
また分類や要約は高度な文脈、ニュアンス判断も伴うレベルで行わせたい。
それも様々な小説や文献を通してコンピュータ自ら学習して欲しい。

ちなみにこれ外注したらいくらぐらい?
10万円ぐらいするかな?
2017/09/10(日) 19:44:06.14ID:jwBfW/fF0
10倍ぐらい出せば良いんじゃねーの
2017/09/10(日) 19:46:11.33ID:+BHhCGE8a
linuxでpop/smtpサーバー立てればよくね
スクリプトで特定のワードが見つかったら処理すればいいし
送信はmailコマンドがあるし
2017/09/10(日) 19:47:08.66ID:m2l+DHFcd
>>268
自ら学習するにしても、教師なしでは低品質になる。効率よく学習するためには、コンピュータとの対話(ダイアログ)が必要になる。
2017/09/10(日) 19:52:13.40ID:m2l+DHFcd
深層学習させるにしても、タグ付けの作業が必要になる。
273デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/10(日) 20:10:47.20ID:BxaTac1G0
>>268
267だが、Cは推論エンジンを作れると言ったはず
おまえさん自身はそこから学習しなかったのか?

10万ねえ
支那の国家プロジェクトがどうなっているか知っているか?
支那からのSPAMに「天安門」と書いて返信すると我々にとって
ありがたい動作をしてくれるというアレだ
国家ではないが大企業のAIが共産党は無能とか言い出して
ひと騒ぎにもなったよなあ
おまえさんの10万円のソフトはおまえさんを無能とか
言い出さないか?
274デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 20:26:02.78ID:Z8XrRGDBa
あとC言語でタイムマシン作れる?
といっても未来のインターネット閲覧できる程度でいいんだが。
作れる人いたら10万円までなら出すぜ。
2017/09/10(日) 20:32:37.81ID:m2l+DHFcd
>>274
予測・予想が届く範囲でないと、予知はできない。できたとしても、競馬の予想や天気予報くらいだ。物理法則を超えることはできない。
2017/09/10(日) 20:39:00.76ID:rIACWFTk0
アホなことを書いてしまったと気付いて、ネタだったことにしてごまかそうとしている?
277デフォルトの名無しさん (ワッチョイ 576c-+qdT)
垢版 |
2017/09/10(日) 20:42:41.68ID:I7ZEh6pU0
物理法則なんて人間が考えたものに過ぎないからどうせ間違いだらけでしょ?
2017/09/10(日) 20:50:00.29ID:m2l+DHFcd
深層学習で美少女の画像を大量に生成するという技術はある。未来の人が書きそうな絵を生成することはできる。
279デフォルトの名無しさん (ワッチョイ 3b97-oRRO)
垢版 |
2017/09/10(日) 21:11:06.17ID:n6o1Bnrv0
物理は、むずかしい
2017/09/10(日) 21:39:16.69ID:m2l+DHFcd
へ へ
の の
 も
 へ
2017/09/11(月) 03:08:03.91ID:byfRWwJtM
div B = 0
rot E = -(∂B/∂t)
div D = ρ
rot H = ∂D/∂t + j
2017/09/12(火) 18:24:02.20ID:zVhRA/dD0
C言語覚えればCIAのパソコン
ハッキングできたりするの?
2017/09/12(火) 19:21:49.41ID:8ybhBsXfM
なんでこんなアホがプログラム板にいるんだ?
2017/09/12(火) 19:35:17.20ID:8gurLWtqd
だって、コーダーって大概馬鹿じゃん
2017/09/12(火) 19:59:12.99ID:C09YrKwT0
夏休みはもう終わったぞ
2017/09/12(火) 20:22:37.24ID:E3lbzyXMM
ずっと休みの奴が張り付いてるんじゃね?
2017/09/12(火) 20:40:18.98ID:oYtiliiD0
printf("Hello, work!");
288デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/12(火) 22:47:32.51ID:CGKPtYms0
>>284
馬鹿つっても、少なくともおまえみたいな自宅警備員より1ペタくらいマシだよ
コーダーでやってけてるやつナメてんだろ、おまえ ボケ!
2017/09/13(水) 00:05:26.05ID:iyeBQ3Kc0
コーダーだから馬鹿だとは思わないが、>>288みたいなレスをするのは馬鹿だなと思いました。
2017/09/13(水) 10:49:46.10ID:gIW5dRYoa
>>239
ありがとうございました
2017/09/13(水) 10:57:10.59ID:E2QlRAh70
>>287
puts("Hell 'o work?");
2017/09/13(水) 11:29:24.17ID:tSE5B5Al0
printf("HALO world!");
293デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 12:41:46.69ID:cFJcbLHs0
>>289
いいこぶってろクズ
現業がいなきゃ自分じゃ何もできないやつが
現業をバカにするのを見ると虫酸が走るんだよ
2017/09/13(水) 13:17:09.64ID:z6o40qKf0
>>293
安価に取り替えがきくので、低く見られるのはしょうがないと諦めろ
295デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 13:33:05.82ID:cFJcbLHs0
人件費のダンピングは国が国民を保護する義務の対象だが
真面目にやってくれなくて我々はその被害を受けているのだ
本来、能力に応じた収入があるべきという感覚そのものを
捨てちまったブタはいいねえ悩みがなくて
2017/09/13(水) 14:36:38.24ID:GgkwnlJN0
>>295
本来能力に応じた報酬を受け取るべきと考えて、それが受け取れない事に不満を持った連中はとっくに逃げ出してる
残ってるお前らは不満を持ちながら逃げ出す事さえ出来ないゴミ
下に見られてもしょうがない
2017/09/13(水) 14:42:45.38ID:yshNp3B/a
確かに馬鹿な奴もいるけどレベルの高い奴もいる。コーダーに限った話じゃないだろ。
日本に馬鹿が多いんだよ。たぶん。
298デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 15:31:18.76ID:cFJcbLHs0
>>296
俺より年収1桁少ないやつにだけは言われたくねえぜ
なに、2桁? そりゃ失礼したw
2017/09/13(水) 15:43:10.20ID:lgdTeqni0
3桁ってことか
2017/09/13(水) 16:11:37.47ID:PJsF5JPod
時給だろ。
301デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 16:18:46.88ID:cFJcbLHs0
妻子持ちがどのくら金いるか
童貞にはわからんようだな
2017/09/13(水) 16:31:08.86ID:J/ZU3q6K0
板違いが分からないよりマシ
303デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 16:42:40.48ID:cFJcbLHs0
284にぬかせボケ
304デフォルトの名無しさん (ワッチョイ 3b00-xkdj)
垢版 |
2017/09/13(水) 17:15:26.17ID:7kZqRPKj0
クソスレ過ぎ笑う
2017/09/13(水) 19:04:55.78ID:FmzSjQYZ0
>>298
奴隷的労働しか選択肢が無いのに妻子持ち
妻子が哀れすぎる
306デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 19:25:13.27ID:cFJcbLHs0
>>305
奴隷? 俺は領主の立場だ
おまえと一緒にするな無礼な
2017/09/13(水) 19:29:03.36ID:E/jL69iKd
複雑な立場だなww
2017/09/13(水) 19:36:56.55ID:FmzSjQYZ0
>>306
僕のお父さんは奴隷のリーダーですってか?
2017/09/13(水) 20:24:58.56ID:ruF3Cq7F0
実際のところそれでも結構なもんだ
2017/09/13(水) 21:33:37.15ID:qtzqYGs4M
馬鹿な奴隷に指示、管理する者の気苦労が分からんのか
2017/09/13(水) 21:35:35.97ID:PcFMQESFM
>>301
妻はまだ自分の食いぶちの一部でも稼がせばいいけど子の方はマジで金かかる
国は学資保険なんてものがあることをちょっと恥じるべき
2017/09/13(水) 21:50:53.77ID:ruF3Cq7F0
金持ちしか子供作らせないのは国策

やつらに恥などない
怒れ
313デフォルトの名無しさん (ワッチョイ 9a6f-vOdE)
垢版 |
2017/09/13(水) 21:56:29.09ID:dVC5ajCT0
マ板でやれ
314デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 22:36:54.70ID:cFJcbLHs0
>>312
俺は金持ちじゃねえ
単年度で8桁いっても次年以後で気を抜けばボコボコだ
一生遊んで暮らせる金があるやつにしか子供を作らせないなんて国策はねえ
童貞がイソップの葡萄こいてろ、こちとら稼いでみせると必死こいてんだ
2017/09/13(水) 23:29:23.30ID:ruF3Cq7F0
ポッキリと折れて周囲に生暖かい目で見られるところまで見えた
316デフォルトの名無しさん (ワッチョイ d3f7-sU5l)
垢版 |
2017/09/14(木) 17:55:25.19ID:r9C1TnUx0
まんこ
317デフォルトの名無しさん (ワッチョイ 6123-pAdv)
垢版 |
2017/09/14(木) 21:35:54.73ID:Ng+6QcSm0
>>299
3桁って、10進数だと999円が限界だぞ
2017/09/14(木) 22:14:40.48ID:vjSz//mI0
>>300
2017/09/14(木) 23:45:34.67ID:lhu0Z/PJ0
ジンバブエドルで3桁か?
2017/09/15(金) 11:30:59.37ID:EItFo4370
>>317
頭いいなおまえ
2017/09/19(火) 16:22:54.12ID:SXimL5kTp
昔"c言語をダイエットさせる本"みたいなタイトルの本読んだと思うんだが分かるやついる?
見つからなくて探してる
322デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/21(木) 20:42:10.28ID:x8dEnzes0
for(;~scanf("%d",&a);)とかwhile(~scanf("%d", &a))とかで~がないだけで永遠に入力ループするんだけど
~ってなにを宣言してるんだ教えてくれ
2017/09/21(木) 20:48:43.32ID:BDILGhdI0
~はビット単位のNOT演算子じゃないの?
2017/09/21(木) 21:03:53.86ID:N1EOCCyb0
~なしでよくね?
2017/09/21(木) 21:23:35.16ID:kYTPFpbC0
本来なら 変数a に格納されるまでループしたい意図だろうけど・・・・・

scanf の戻り値は 代入操作できた変数の数で
0 だと入力のフォーマットに合致しなかったわけなんだが (ここまでは素直)

一旦 その状態になると、次に正しく入力しても拾ってくれない scanf 独特の挙動があって
正しく入力しようが 0 のままというkuso

件の場合
 最初の入力で数値ではない o を与えると (%d で受けれないので失敗)
次のループの入力で 1 を与えても やはり変数に格納ざれずに失敗したまま

これがあるので scanf は使うな、と良く言われてる所以
326デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/21(木) 21:54:22.20ID:x8dEnzes0
一行読み込みで同じ処理を数値なくなるまでしたいんだけどどう読み込んだ方がいい?
2017/09/21(木) 22:19:34.61ID:kYTPFpbC0
fgets で行単位で読み込み
その行バッファに対して sscanf で変数に拾い上げするなり、11文字ずずつ字句解析するなり

char buf[512];
int a;
while (fgets(buf, 512, stdin)) {
 /* 1行読んだよ */
 
if (sscanf(buf, "%d", &a) != 1) {
  /* 数値じゃないのが来たのは無視する */
continue;
 }
/* a に値が格納されたよ */
:

}
2017/09/21(木) 22:26:26.69ID:kYTPFpbC0
日本語でおけ
× 11文字ずずつ字句解析するなり
○ 1文字づつ字句解析するなり
2017/09/21(木) 23:44:09.55ID:Xpxn9Za50
>>327
strtolとかstrspn?系つかったほうがよくね?
2017/09/22(金) 00:16:23.70ID:zbqUBjYs0
>>325
まじかよ..
scanf呼び出して戻ってきたあとも何かしらのscanf内部変数が残ってるってこと?
だとしたらクソ過ぎるだろ
331デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/22(金) 01:03:58.95ID:IvB4cJv30
こんなのどうかな
https://paiza.io/projects/zRvzIskw3zMy3HVdD7NsHA
2017/09/22(金) 01:11:24.08ID:exEqzPdX0
>>330
標準入力を勝手に読み捨てないってこと
数値以外が来たら"何もせずに"失敗で終わるから
ループするとまた失敗以前の場所からそれを繰り返すだけ
333デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/22(金) 01:39:40.49ID:BRiVyzo00
forの継続条件がどう動いてるのかわからないな読み込めた時はループして読み込めなかったときはループ抜けるってのがどう判定されてるのか見えないな
2017/09/22(金) 02:12:21.25ID:exEqzPdX0
>>333
scanf("%d",&a);
で、数値が来れば取り込みに成功した個数、つまり1を返し、失敗なら0を返す
それを~でビットNOT、つまり各ビットを反転させるので
成功なら0x00000001を反転で0xFFFFFFFE、失敗なら0x00000000を反転で0xFFFFFFFF

ようするにどうやってもループを抜けないので、結論としては「そもそもループ条件として間違ってる」
>>324の言う通り~は不要
2017/09/22(金) 02:35:57.85ID:dUE2o1PV0
もっとシンプルに使える入力関数を
誰かが作ってくれれば良いのに
336デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/22(金) 03:10:18.60ID:IvB4cJv30
>>335
簡単なので多分もう世界中に山ほどあると思うが、標準化されてないだけだろうな。
337デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/22(金) 05:10:39.06ID:BRiVyzo00
while((a=Console.ReadLine())!=null)こうゆうので入力がなかったら終了するって簡単にできればC言語も楽なんだけどな
338デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/22(金) 14:57:26.19ID:8MJCwgYc0
int *get_int(int *dst, jmp_buf err)
{
if (scanf("%d", dst) != 1)
{
if (err) longjmp(err, 1);
else return NULL;
}
return dst;
}
こんなしょーもないのでいいのに標準化委員会は斜め上なことばかり・・・
339デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/22(金) 20:47:03.45ID:dtN6vQMf0
>>334
でもscanfの前に~あるだけで入力なくっても無限ループしないで抜けるのはNOTと戻り値がNOTでtureだから抜けるの?
340デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/22(金) 22:06:16.56ID:IvB4cJv30
チルダ付けたのは失敗した時に-1が返されると思ったからかな?
てか、チルダ付けた場合はそれ以外で0にならんよな。
まあでもこれも整数値の内部表現の違う特殊な環境だったりしたらダメかも知れないが。
2017/09/22(金) 22:16:43.87ID:JX9ZYj2p0
組込み以外で~使ってんの初めて見た
2017/09/22(金) 22:21:06.44ID:FtjqsiSd0
普通にビット処理だと使うよね
ビット処理なんかしないって?
2017/09/22(金) 22:25:08.34ID:exEqzPdX0
ごめんウソ書いたわ
一つも変換されないで入力エラーになったらscanf()は0ではなくEOFを返すらしい

>>339
よって多くの環境ではEOF==-1(0xFFFFFFFF)だからその反転で0になってループ抜けるということだね
2017/09/22(金) 23:25:37.12ID:TihxA+yD0
>>338 ゼロオーバーヘッドは正義。
2017/09/23(土) 07:38:02.97ID:9QRg4G5c0
>>343
入力ストリームが閉じてて変換できなかったら EOF
入力ストリームは開いてるけど変換できなかったら 0
でないのけ?
346デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/23(土) 11:43:39.39ID:8bsZ0VcP0
>>345
どうやらそのようだな。Linuxのmanで見てみたらそんな風に書いてあった。
とすると入力が閉じないで変換失敗した場合は0が返されて無限ループになるな。
347デフォルトの名無しさん (ワッチョイ 0f23-7Jrl)
垢版 |
2017/09/23(土) 14:50:28.05ID:IblrvTVf0
Win32環境なのですが
_beginthread関数で、thread1, thread2を回し
グローバル変数g_nをthread1の中で変更しても
thread2から正しい値が参照できません。参照できないというよりthread2が機能しなくなるように見えます。変数表示がカットされる。
VisualC++でプログラムしてるのですがデバッグモードだと普通に動いて
リリースモードだと動かなくなります。グローバル変数にvolatileをつけてみてもダメでした。
何が原因でしょうか?
2017/09/23(土) 15:16:24.27ID:PasvkTo90
具体的なコードもなく原因を聞かれても、どうしようもないと思うぞ

VCの拡張機能で相応の機能が追加されてたような気もするが
本来volatileにスレッド間での排他やメモリバリアの機能はないからな
2017/09/23(土) 15:34:39.04ID:oO/4QkxId
>>347
デバッガ側で例外をキャッチして、呼び出し履歴を調べると何かわかるかもしれない。おそらくゼロ除算かアクセス違反かスタックオーバーフロー。
2017/09/23(土) 16:05:08.45ID:IblrvTVf0
>>348-349
thread2の中身を以下みたいにtry〜catchで囲むと何故か直りました…
でもcatchの中は実行されてないです… 少しcatchの中身を書き足すとまたダメ…
どういうことだろう…
void thread2(void*)
{
try{

} catch (...) {

}
}
2017/09/23(土) 16:06:48.32ID:oO/4QkxId
スタックを破壊してる可能性
2017/09/23(土) 16:07:30.45ID:oO/4QkxId
呼び出し規約が間違い
2017/09/23(土) 16:14:51.44ID:IblrvTVf0
>>352
>呼び出し規約が間違い
これはどういう事ですか?
宜しければご教示をm(__)m
2017/09/23(土) 16:23:43.62ID:oO/4QkxId
https://msdn.microsoft.com/ja-jp/library/kdzttdcb.aspx
_beginthreadexの場合は、__stdcallを関数名の前につける。_beginthreadの場合は、__cdeclを。
__cdeclはデフォルトでは省略可能だから、間違ってはいない。
ということは、ポインターかなんかでスタック破壊している可能性が高い。
2017/09/23(土) 16:28:26.72ID:oO/4QkxId
配列の添字がオーバーしてないか?
2017/09/23(土) 16:50:48.86ID:oO/4QkxId
ideone.com に貼れ
2017/09/23(土) 19:47:03.99ID:IblrvTVf0
>>356
もう少し深く調べてみます!ありがとうございます!
2017/09/23(土) 21:54:35.77ID:IblrvTVf0
>>356
たぶん原因が分かりました。
現在は標準関数をやめてWINAPIのCreateThreadを使ってますが標準関数と原因は同じです。
CreateThreadでThread1,Thread2を作成して監視してるとあるタイミングでThread2が消失してたのですが
どうやらThread1で変更があった他のグローバル変数の値がThread2で上手く読めずに終了判定されて消えてたようです。
ようするに他のグローバル変数の書き換えが原因でした。
ロック処理をしたりしたのですが上手く行かずグローバル変数すべてにvolatileをつけると上手く動いてるようです。
でもこの回避作で良いんでしょうか?CriticalSectionを使ったりして処理してもうまく他スレッドでグローバル変数が
参照出来なかったのでvolatileをつけてみたら完璧に動作するようにはなったんですが……
2017/09/23(土) 22:09:28.20ID:9QRg4G5c0
排他制御の問題ではなく
最適化の作業で、変数を不変値と判断し、変数参照を追い出した翻訳をしたパターン

int a; // グローバル変数
void foo() { a = 1; while (a) { /* */ } }

a は文意から不変の定数として扱えるので
while (1) { /* */ }
に翻訳しちゃえるわけさ
2017/09/23(土) 22:20:31.54ID:IblrvTVf0
>>359
その変数達の最適化を無効にしたということですね。
ということはこの回避方法で大丈夫だということですか?
2017/09/23(土) 22:28:00.05ID:9QRg4G5c0
volatile つけるのは1つの手ではあるが 100% 回避してくれるかは、コンパイラ次第
スレッドで共有するフラグ関係はOS側が用意してる機構を使うほうが良いんだけどねー
2017/09/23(土) 22:50:44.07ID:IblrvTVf0
>>361
一旦コンパイルして普通に動作してるなら大丈夫ですか?
他の環境でいきなり動かなくなるとかもありますか?
2017/09/23(土) 22:58:35.90ID:PasvkTo90
何の変数を使ってるか知らんが、排他取ってねーんだから書き換え途中の変数を読み取ってバグることもあるだろ
最近のVCはvolatileだけでマルチプロセッサ対応のメモリバリアになるらしいから、古いVCでビルドしてもアウトだな

まあ滅多に起らないからローカルでそれっぽく動けばいいのなら、十分じゃねーの
2017/09/23(土) 23:10:54.21ID:Z1NsXN0c0
>>358
いや、359ではなくて、363の言うとおり、
> ロック処理をしたりしたのですが上手く行かずグローバル変数すべてにvolatileをつけると上手く動いてるようです。
これが問題だと思うぞ。つか、ロックしろよ。
volatileの意味分かってるか?
それ多分他スレッドから書き換えられたときに自スレッドのその値が更新されておらず、バグるのだと思うぞ。
ただしこの場合は、
> 最近のVCはvolatileだけでマルチプロセッサ対応のメモリバリアになるらしい (>>363) ←コマ?
が正しいのならvolatileでも確かに治りそうな気はするが。で、これってマジなん?

つかね、マルチスレッドでグローバル変数を使いまくること自体がだね、、、
2017/09/23(土) 23:20:05.48ID:Z1NsXN0c0
>>363
調べてみたんだが、これか?
> Microsoft 固有の仕様 → /volatile:ms の項目
> ・volatile オブジェクトへの書き込み (volatile 書き込み) は、解放セマンティクスを持っています。
>  つまり、命令シーケンスで volatile オブジェクトへの書き込み前に発生するグローバル オブジェクトまたは静的オブジェクトへの参照は、
>  コンパイルされたバイナリでの volatile 書き込みの前に発生します。
> ・volatile オブジェクトの読み取り (volatile 読み取り) は、取得セマンティクスを持っています。
>  つまり、命令シーケンスで volatile メモリの読み取り後に発生するグローバル オブジェクトまたは静的オブジェクトへの参照は、
>  コンパイルされたバイナリでの volatile 読み取りの後に発生します。
https://msdn.microsoft.com/ja-jp/library/12a04hfd.aspx
これならロックではなくフェンスだね。volatileでは直らないはず。
2017/09/23(土) 23:22:23.90ID:PasvkTo90
>>365
自分も見かけただけでちゃんと調べたわけじゃないけど、それだね
フェンス+ロックが必要ってのは当然として、最近のVCならフェンスのほうが保証してくれてるってだけ
2017/09/23(土) 23:26:59.26ID:IblrvTVf0
>>361-365
CriticalSectionつかってグローバル変数の書き込み時にはロックをするのも試してみたんですが
やっぱりthread2が途中で死んで(内部のループで終了判定になってしまって)、ダメだったんですよね。
それがグローバルにvolatileをつけると普通に動作するようになってるんです……
2017/09/23(土) 23:29:48.18ID:IblrvTVf0
こういう事ですか?
CriticalSectionによるロックもやる必要がある。理由はロックしてない時固有の問題もあるから。
今回の不具合はコンパイラの最適化が原因だったのでvolatileで回避できただけ。
ロック処理もvolatileも両方やる必要がある。ということですか?
2017/09/23(土) 23:33:50.34ID:9QRg4G5c0
書き込み時だけロックして 読み込み側のほうはロックせずに読み込んでる
片手落ちのように受けとれる文章だけど・・・ 排他制御をちゃんとやってたうえでの話?
370デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/23(土) 23:49:15.83ID:8bsZ0VcP0
volatileにしてロックして読み書きするのが普通では?
2017/09/23(土) 23:55:28.48ID:IblrvTVf0
>>369-370
volatileにして読み書きロックして厳密にやります!
2017/09/23(土) 23:57:26.40ID:Z1NsXN0c0
>>368
× > 今回の不具合はコンパイラの最適化が原因だったのでvolatileで回避できただけ。
○ コンパイラの不具合ではなく、君のコードの問題で、
 volatileで動いているように見えるのはバグに当たる確率が低くなっただけで、直ってはいない。

ただ、366の通り、全部ロック+フェンスすれば直りそうな気はする。
つか、そもそもフェンスが大量に要るような使い方でマルチスレッドするのが問題なんだが。
2017/09/24(日) 00:00:33.14ID:jg2xx4vD0
posixだとロックAPIにメモリ同期の効果があるから、普通はvolatileいらんけどな
CriticalSectionも共有リソースへのアクセス制御用の関数なんだから、同じはずだと思うけども
2017/09/24(日) 00:22:34.33ID:AOwUcJWDd
>>372
コードの不具合って意味だろ?
やっぱり最適化が問題だったんじゃないか?
2017/09/24(日) 01:04:50.76ID:R8lp94JX0
>>374
> どうやらThread1で変更があった他のグローバル変数の値がThread2で上手く読めずに終了判定されて消えてたようです。(>>358)
この場合はvolatileをつけないと話にならない。(ただし本来の使い方ではない)
コンパイラのバグではなく、多分デバッグビルド時には毎回読み出しだっただけ。(最適化なし、なおフェンスもなし)

データ同期する気がなければフェンスは本来は要らない。
ロックはしないと書きかけの値を掴んだりしてバグる。

ここら辺分かってなくてグローバルで同期ってのはマルチスレッド初心者なのだろうけど、
バグったらsync入れまくってデバッグはセオリーではあるし、まあがんばれ、と。
ただ、おそらく同期の仕方を根本的に間違ってるから、知ってる人に見てもらったほうがいいとは思うが、
コード内のグローバルは常に「最新」を期待しているのであれば、ロック+volatile+フェンスで動くはずでもある。
2017/09/24(日) 05:58:29.08ID:jg2xx4vD0
ロック中の読み出しが最適化で消えるなら、それはロックとコンパイラが腐ってる
2017/09/24(日) 08:32:31.64ID:LX+6AD0qM
>>372
> ○ コンパイラの不具合ではなく
誰もコンパイラの不具合なんて言ってない
偉そうに頓珍漢な講釈たれる前に日本語勉強し直してこい
2017/09/24(日) 08:36:33.73ID:LX+6AD0qM
>>373
メモリー同期と最適化は別の話
Posix は知らんけど CreateSection にはロック対象を知るすべはない
2017/09/24(日) 10:21:22.00ID:jg2xx4vD0
はあ、そうですか
共有リソースの排他アクセスのためのAPIなのに、ロック対象がわからないからロック無視して最適化しますと
それが真実ならWinAPIとVCが腐ってるんじゃないですか
2017/09/24(日) 10:22:36.14ID:gFeQddMX0
バカには使えないだけ
2017/09/24(日) 11:32:55.30ID:070pAcfa0
test
382デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/24(日) 13:57:54.86ID:c233uqnI0
腐っているのでしょう
2017/09/24(日) 14:40:58.49ID:jg2xx4vD0
メモリバリアを跨いでオブジェクトへのアクセス命令を最適化するとか
そんな頓珍漢なことを言う腐った奴がいるとは思わなかったわ
volatileを何だと思ってんだか
2017/09/24(日) 15:53:44.93ID:gFeQddMX0
CreateSection の使い方ぐらい調べてから書けばいいのに...
まあ他人事だしどうでもいいけど w
2017/09/24(日) 16:31:41.65ID:jg2xx4vD0
CriticalSectionの話のつもりだったんだけど、CreateSectionに変わったの?
それならごめんだわ、>>378で唐突に出てきて誤字だとばかり
さすがにそんなアホな話題転換があるとは思わなかった
2017/09/24(日) 16:59:33.91ID:gFeQddMX0
>>385
ああすまん、予測変換で間違えてたわ
で、CriticalSection について調べたのかな?
2017/09/24(日) 17:30:54.77ID:jg2xx4vD0
>The following synchronization functions use the appropriate barriers to ensure memory ordering:
>Functions that enter or leave critical sections
>Functions that signal synchronization objects
>Wait functions
>Interlocked functions
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686355(v=vs.85).aspx
調べたけどCriticalSectionだけで十分そうだよ
Internallockedとかのほうが手軽そうだけどね
2017/09/25(月) 02:44:46.68ID:glvYaQMb0
https://teratail.com/questions/39986
これの投稿 2016/07/04 10:48の例にあるように
最適化で変数の効果が消えてしまう場合でも
volatileじゃなく変数書き込みや参照の部分に
CriticalSectionでロックしておけば最適化で消える事はないということ?
2017/09/25(月) 03:09:32.37ID:eX6e3GbIr
Cのコンパイラはクリティカルセクションなんて知らない。単なる構造体かなんかのtypedefとして実直にコンパイルするだけ。
スレッド関連の関数についても単に関数の一種として扱うだけ。

従ってスレッドやクリティカルセクションを扱っているかどうかが最適化の結果に影響することはない。
一方volatile指定はコンパイラが認識するキーワードで最適化に影響する。
2017/09/25(月) 04:54:33.75ID:glvYaQMb0
ということは今回の事例だと排他制御しても不具合は解消できなかったという事かな?
volatile付けて最適化を無効にすることが正しい解決策だったということになる?
2017/09/25(月) 06:45:40.93ID:/OvZrhVRM
>>387
だからそれはメモリーバリアの話で最適化の話とは別だよ
繰り返しになるけど CriticalSection は排他制御するリソースを知ることはできないしコンパイラも CriticalSection のことを知らない
2017/09/25(月) 06:49:50.09ID:/OvZrhVRM
>>390
どう言うことをやりたいのかよく見てないけど排他制御と最適化の話は別だから必要なら両方やらないとダメ
2017/09/25(月) 08:38:06.32ID:5M6SeBxY0
eieio()
2017/09/25(月) 09:41:28.46ID:Eov43usf0
>>389
それ、スレッドまわりが規格化されてなかった C99 までの話だよね?
2017/09/25(月) 09:53:00.17ID:eS71dZMPM
最近のは規格化されてんの?
2017/09/25(月) 09:58:09.00ID:Tp6H3jwU0
規格化されてるのはPOSIXでじゃね?
2017/09/25(月) 09:59:34.82ID:Eov43usf0
こんな感じ。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
5.1.2.4/5
"The library defines a number of atomic operations (7.17) and operations on
mutexes (7.26.4) that are specially identified as synchronization operations.
These operations play a special role in making assignments in one thread visible
to another. ..."
2017/09/25(月) 12:40:04.95ID:uoxmxxDAr
>>394
おおごめん、規格自体には詳しくない

しかし…
pthread関連の標準関数や定義を仮にコンパイラが特別扱いしたとすると、標準関数をラップしたり自作ライブラリで代替した場合に最適化の結果が変わるのかな?
そんな風にコンパイラ作るものなんだろうか。
2017/09/25(月) 20:34:55.44ID:6/+o0Gkh0
posix-thread 関係については C++11 で追加されたが,
あくまでも言語処理系の中で定義された識別子(関数とかクラスとか)を使わないと,コンパイラには分かりえないよ.
CreateThread() とか CriticalSection とかの W32API の用語を,無指定でコンパイラが理解できるわけがない.
2017/09/25(月) 20:47:31.93ID:LPAVGpvK0
>>390
コンパイラは基本的に問答無用で最適化するけど、それだとマルチスレッドではプログラマの意図しない最適化が起こってしまう
だから、メモリバリアを挟んだアクセス命令を入れ替えないことにしている
言い換えると、メモリバリア前に読み込んだ値をメモリバリア後も使うような最適化はしない
よって、バリア+ロックで十分

共有リソースは全部volatile付けるなんてしてたら、kernelのソースとかvolatileまみれになるでしょ
2017/09/25(月) 21:45:53.20ID:LPAVGpvK0
当然、ローカル変数とか他から変更されないことが明らかなオブジェクトであれば最適化が起こる可能性は否定しない
グローバル変数の場合は、最適化されない

やってみればわかるけど、CriticalSecltionの有無でアセンブル結果が違う
2017/09/25(月) 21:46:58.74ID:LPAVGpvK0
アホなこと書いた、コンパイル結果だな。。。
2017/09/25(月) 23:03:28.51ID:LPAVGpvK0
CriticalSectionに限らず未知の関数が呼ばれたのであれば、その中でグローバル変数やらが変更される可能性を考慮しなければならない
他にも、ある関数の引数にローカル変数のアドレスを渡すと、以降の別関数内でそのアドレス経由でローカル変数を変更される可能性がある
よって、場合によってはローカル変数であっても関数呼び出しを跨いで最適化できなくなることがある

わからないからこそ、最適化してはならないんだよ
2017/09/25(月) 23:26:04.50ID:3XblncDf0
>>390
ならない。君のソースコードだけの問題だ。同期機構の使い方が悪いだけ。

スレッドなんてここ20年間バリバリに使われてる。
VC等の小慣れているコンパイラなら、最適化ありで全く問題なく動く。
(マルチスレッド向けのデバッグは完了している)
Debugでは動くがReleaseでは動かないケースに遭遇した初心者は、君のように
「最適化の問題であり今回はDebugを使うこと」を正当化したがるが、これは間違いだ。
ただしDebugビルドでもバイナリは出来るから、問題ないのならそれを使う手もある。
405デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/26(火) 00:33:15.50ID:8E9hjYW60
ちゃんと排他処理が出来ていないことに気付かず、デバッグオプション付きとか
遅いマシンとかで正常動作してしまい、何年後かに速いマシンにリプレイスしたら
丁度良くバグが顕在化するようなタイミングになってしまった、

なんてことが以前本当に起きた。

サーバ用とかでソフトが長期間使われる場合は要注意だ。
2017/09/26(火) 00:35:55.65ID:piJXswiP0
歯痛制御のバグ
珍しくない

発見しづらく、再現性も乏しく、解析に手間がかかりがち

レベルの低い開発者が混ざると大変
2017/09/26(火) 01:21:21.88ID:mvSUAuA/0
マルチスレッドは、たまたま動いているだけで、
ちょっとしたタイミングで、バグる

初心者は、たいてい、コンパイラのバグのせいにする。
それか、リリースビルドの最適化がおかしいと言う

プロは、Elixir などの関数型を使う
408デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/26(火) 02:12:13.37ID:8E9hjYW60
いや、ちゃんとロックすりゃなんとかなるってw
もちろん最初から考慮されてる言語は何も考える必要ないからうまく行って当然。
2017/09/26(火) 07:38:51.81ID:hxYjIs4i0
>>406
痛そうだな。
2017/09/26(火) 10:15:02.85ID:IHENDkWx0
>>406
つらそうなバグだ
2017/09/26(火) 12:32:55.96ID:Ue/ou9XsK
>>406
ウンコだなw
2017/09/27(水) 16:40:21.40ID:zCHNwx740
初心者です。エラーでまくりでコンパイルすら出来ません。アドバイスお願いします。

■やりたいこと。
マウス入力にrawinputを用いるアプリのWndProcをフックし、rawinput(WM_INPUT)を強制オフにし、DirectInputを使用するように指定。

↓ソース


// FuckRawInput.c

#include <windows.h>

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_CREATE:
{
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x02;
Rid[0].dwFlags = RIDEV_NOLEGACY;
Rid[0].hwndTarget = hWnd;
RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) ;
break;
}

-----
また、この方法が最適なのかも不明です。ほかの方法等もあったら教えてください
2017/09/27(水) 18:30:09.48ID:Ep3hxvTm0
C言語の問題?
2017/09/27(水) 21:09:13.07ID:kxaL/Pai0
初心者とは
2017/09/27(水) 21:51:08.08ID:zCHNwx740
>>414
そのままの意味でC言語初心者ですけど?
rawinputを消し去りたいがためにプログラム未経験ながらC言語入門書を読み、
Visual studio2013でハローワールドのコンパイルに成功した所です。

他スレで聞いたら、
DLLインジェクションでAPI関数を置き換えといわれたんですが、
まぁ、それと同じような事をしようとして書いたソースが>>412

目的達成するためにどこが悪いのか教えてくださいよ
2017/09/27(水) 22:01:39.03ID:htvdQyi40
日頃の行い
2017/09/27(水) 22:08:30.48ID:6Zcxzpoi0
エラーのせろハゲ!
2017/09/27(水) 22:35:55.70ID:MZoqRzWL0
どうやってWndProcをフックするつもりなのか知らんが、初心者のやることじゃない
2017/09/27(水) 22:46:41.34ID:Ep3hxvTm0
スレチ
420デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/28(木) 00:13:55.27ID:LEgoP/Tm0
>>412
本当にそれがソースの全てか?
2017/09/28(木) 06:54:14.40ID:0QfR7+YkM
>>412
とりあえず文法エラーのないソースを出せよ
2017/09/28(木) 08:22:53.76ID:veeq8lRB0
>>415
windowsプログラムでFuckファックは初心者がやるものではない
何故かと言うとFuckファックは非常に拙いからで、これはご存じの通りにFuckファックつまりはセクロスとかセックスを意味する
FuckRawInputなどと書かれると非常に面食らうので、動作には全く関係ないがFuckファックの箇所をHookフックとする
Fookという間違いならまだしもFuckが出てくるのは途轍もなく拙い

windowsプログラムは入門書を一通り終えた後にようやく手を出せる程度に面倒くさい
2017/09/28(木) 12:17:20.62ID:wLxR5weia
最近勉強始めたんだがループ動作めんどくさ
2017/09/28(木) 16:28:25.85ID:p7vLxmpX0
C++の標準でWindowsのCOMみたいなのはできるの?
モジュールがあれば動的リンクできて、向こう側の関数の形式とエントリポイントがわかるような。
2017/09/28(木) 18:20:04.96ID:klqlvKrNM
>>424
IUnknown::QueryInterfaceを実装するとかの話?
https://msdn.microsoft.com/ja-jp/library/cc351695.aspx
2017/09/28(木) 19:27:04.11ID:te0QQW2V0
>>418-422

WndProcフックでは目的の動作できなくて、APIフックしか手がないと分かりましたので、
MSのdetourとかいうの使ったAPIフックに変更されました。改めて、見てください。
@やりたいこと
Rawinputマウス関数が呼び出させられる代わりDirectInputマウス関数を呼び出し、強制的にマウス操作をDirectInputにする
ソース↓
// APIhook_RawInput.c
#include <windows.h>
#include "detours.h"
hoge target = NULL;  // ターゲットポインタ
hoge tp = NULL; //トランポリンポインタ

// 関数生成
BOOL WINAPI Direct_Input(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
return tp(hWnd, Msg, wParam, lParam);
}
// user32インスタンス
HINSTANCE xxxxx;
case WM_CREATE:
//user32.DLLをロード
xxxxx = LoadLibrary("user32.dll");
//Raw Inputポインタ取得
target = (hoge) GetProcAddress(xxxxx, "WM_INPUT");
// WM_INPUTフック、"WM_INPUT"→"Direct_Input"置き換え
tp = (hoge) DetourFunction((PBYTE) target, (PBYTE) Direct_Input);
break;
// 終了時の処理
case WM_DESTROY:
// フック削除
DetourRemove((PBYTE) tp, (PBYTE) Direct_Input);
2017/09/28(木) 21:05:11.91ID:9JTfqDLya
>>426
で、お前が聞きたいのは「C言語」に関するどんな質問なんだ?
2017/09/28(木) 22:00:23.65ID:kmv+HSxh0
>>421が悪い
責任もって相手しろ
2017/09/28(木) 22:01:12.32ID:kmv+HSxh0
>>419が正しい対応
2017/09/28(木) 23:13:22.30ID:hENZyM/7a
会話にすらなってないな。
こういうのホントにいるんだよなあ。、。
2017/09/28(木) 23:59:03.21ID:mJZoGNOM0
http://mevius.2ch.net/test/read.cgi/tech/1475897582/925
2017/09/29(金) 01:12:28.71ID:tjqo0EG60
>>415
> どこが悪いのか教えてくださいよ
頭と態度。
APIスレも見たけど、君には無理。
433デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/29(金) 01:17:32.92ID:EHQhOpQV0
>>426
本当にそれがソースの全てなのか?
434デフォルトの名無しさん (ワッチョイ 9baa-iHa+)
垢版 |
2017/09/30(土) 05:35:50.31ID:/O3sxKWS0
これ無理だろうWindowsプログラムの言語を理解してないと直せないっしょ
2017/10/02(月) 09:21:38.64ID:SGi8KvwU0
勘所がすぐつかめる人ならそうでもない
知らんOS知らん言語知らん環境でもデバッグできちゃうんだぜ
あいつら宇宙人だろ
2017/10/02(月) 13:06:27.14ID:6IbuGwAs0
>16 :デフォルトの名無しさん:2006/03/10(金) 22:15:19
>>>10
>> こんな変数名があちこちに散らばっているのがPerl
>
>大学の研究室のボスは、特殊変数の表をふ〜んと2分ほど眺めて完全に暗記した。
>
>そういうレベルの人たちのための言語なんだなと思って、トイレで血の涙を流した。
2017/10/03(火) 03:00:19.61ID:TSZxzm0B0
お助けください。
自作コードにおいて、以下の部分でmemsetの際にsegmentation faultになってしまいます。

int n = 2;
char charList[n+1][32]; // 32文字の文字列をn+1確保・・・@
func(charList); // charListに書き込む関数
for (int i = 0; i < n; ++i) memset(charList[i], ' ', 32); // 空白で埋めたい

funcを省いたりmemsetの前に適当にcharListをプリントしたりすると何故か問題なく動きます。
この部分だけ切り出したテストコードでは全く再現しませんでした。
この手のエラーでよくあるのは未初期化領域へのアクセスだと思いますが、
@で領域の確保はできているからこれは原因ではないですよね?
どこがエラーの原因でしょうか・・・?
2017/10/03(火) 06:29:26.41ID:TvjHrbVD0
funcがnを壊してる
とか
439デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 06:57:44.74ID:ZkSEHHAS0
うん、funcが怪しい
440デフォルトの名無しさん (ワッチョイ e59f-Txnz)
垢版 |
2017/10/03(火) 08:24:29.85ID:759fwjeu0
うん
2017/10/03(火) 11:40:15.04ID:QFI8P6tG0
配列サイズ 32要素で 32個 空白で生めてるが
文字列 という用語を使ってるあたり func は一般の文字列操作してそうだけど
終端記号 '\0' の分の考慮が落ちてるんでないの?
2017/10/03(火) 11:59:57.12ID:QFI8P6tG0
「文字列」で32文字を取り扱いたいのなら 33要素の器が必要ってことで
文字の配列なら問題ないけどねー
2017/10/03(火) 12:44:46.02ID:mP+8qDfMd
そもそも再現しないコードを提示されてもなあ
2017/10/03(火) 14:52:11.00ID:YUFfLdQY0
>>437
処理系は何じゃらほい
2017/10/03(火) 15:25:21.73ID:rugh+s9w0
>>437
>char charList[10000][10000]; // 32文字の文字列をn+1確保・・・@
くらい確保して実行すれば動くだろ
2017/10/03(火) 15:27:20.07ID:xmgx6pPY0
int n = 2;
char charList[n+1][32];

C言語的に、これってOKだっけ?
447デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/03(火) 15:39:40.20ID:2Eoq+Ro56
>>446
だめ
448デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 16:18:15.22ID:9r7sfmBO0
char charList[n+1,32]こうしないとダメだよね?なにかっこ二つ使ってんだよ読み込めねえよって昔2次元配列で怒られたな
2017/10/03(火) 16:39:41.13ID:uTLw0mNj0
>>446
最近は大丈夫になった
450デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:45:08.36ID:ZkSEHHAS0
うん、今の1回生が生まれた頃から
451デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:25:07.16ID:9r7sfmBO0
>>449
なったのか少しは便利になったのか
2017/10/03(火) 18:27:21.85ID:eHwxQvGT0
最近どころか、20年近く前からだし
>>448みたいな文法は存在しないんだけど、どこの世界のC言語なんだろ
2017/10/03(火) 18:32:06.89ID:HgW0fxVo6
>>448みたいな文法欲しかった
2017/10/03(火) 18:48:25.91ID:9KgPFlPY0
>>449
最近、ダメかもしれなくなったんだが
455デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:53:27.85ID:9r7sfmBO0
>>448
これダメだC#だった、エラーになるわ
2017/10/03(火) 19:11:20.28ID:XytTuyvU0
LLVMの作者に物凄い勢いで嫌われたから…
457デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:39:06.25ID:djTGgeKPp
iOS11にしたらまともに入力できない

このクソOS
458デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:39:07.29ID:djTGgeKPp
iOS11にしたらまともに入力できない

このクソOS
459デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:23.61ID:djTGgeKPp
このクソOS死ね
460デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:56.99ID:djTGgeKPp
まともに入力できないって
461デフォルトの名無しさん (ワッチョイ e59f-d/1N)
垢版 |
2017/10/04(水) 00:38:32.06ID:JPTWWYYO0
>>446
http://www.buildinsider.net/language/clang/01
2017/10/04(水) 01:30:41.39ID:+TP/cS/R0
返事が遅れてすみません。レスありがとうございます。
再現性の乏しい質問で申し訳ないです。

>>438
nは変わらないです。

>>441
文字列操作ではあるんですが終端記号は書き込みません(全部文字だけ)

>>444
OSはCentOS 6.9、言語はc++、コンパイラはgcc7.1.0です。

さっぱり原因が想像できないのですが、考えられる可能性としては、funcの中でメモリがずたずたに壊れたものの
偶然エラーにならずに戻ってきてmemsetでやっと死んだ、というパターンでしょうか?
463デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/04(水) 06:19:36.24ID:Sd/env2d0
>>452
存在するだろ
char charList[32]と等価になるぞ
2017/10/04(水) 06:24:24.64ID:dCjKMF950
二次元配列の宣言についての話で合って
コンパイルが通るかどうかだけの話なんてしてねーぞ
2017/10/04(水) 07:22:39.57ID:zhlDARQmM
>>462
func何やってんの?
2017/10/04(水) 08:10:59.64ID:F93q6j3ba
*charList=0とかやってんじゃない?
2017/10/04(水) 08:22:11.58ID:F93q6j3ba
ってか二次元配列と二重配列間違ってねーか?
それとfunc呼んでからmemsetしたらfunc呼ぶ意味あるの?
memsetもループさせるんじゃなく一回で全部fillした方がよくない?
とかとか。
2017/10/04(水) 11:24:36.83ID:hBVSLcAId
>>467
1行目 イミフ
2行目 意味があるから呼んでるんだろ
3行目 明確な利点があるならそれを書け
2017/10/04(水) 13:29:31.00ID:ugGBRoRga
>>468
ポインタの配列と二次元配列を間違ってるのではないかってこと。
書き込んだあと空白で埋めたら意味なくないか?funcが何してるか知らんけど
2017/10/04(水) 13:49:31.85ID:hBVSLcAId
>>469
funcの中身を知らないのに「意味無い」とか「意味あるの?」とかっていう書き込み、意味あるの?
それを聞けば問題の解決になるの?

少なくとも空白を埋めてない部分があるし
問題が発生する範囲で簡略化したのかもしれないし
当然意味があるから呼んでるんだろうと思うのが普通
2017/10/04(水) 14:20:16.63ID:Ot6iICCz0
C言語は俺に訊くなスレになってるな
2017/10/04(水) 14:30:40.85ID:eeE5kOTG0
最近オブジェクト指向が入り口で、C言語がわからんっていう子が多いからなあ
2017/10/04(水) 14:50:53.16ID:38WTG0/g0
再現する最小限のコードに削ってるうちに問題点を自ら発見して終了
2017/10/04(水) 14:54:54.68ID:PNa+p1hk0
つーかfunc()以外の部分で特に問題が見当たらないならfunc()のせいで確定という単純明快な話
自作コードならfunc()もうpできるっしょ
2017/10/04(水) 14:56:07.21ID:6Zs0a9ZSa
>>470
出されたソースのコメント見ると、配列の考え方が間違ってるように感じるけどね。それを示唆したかっただけだよ。
2017/10/04(水) 15:12:09.84ID:f7rOF4qk0
>>462
ふと疑問に思ったんだが、

>func(charList); // charListに書き込む関数

関数を呼び出す際に、nの値を教えなくて良いのか?
2017/10/04(水) 16:34:23.23ID:hBVSLcAId
>>475
例外とは関係ない
合コンじゃないんだから無駄に話を広げる必要はない
問題の解決が遅くなるだけ
2017/10/04(水) 16:35:46.39ID:hBVSLcAId
あとはfuncの中身を見ないとなんとも

組み込みのショボい環境だとスタックオーバーフローって可能性も無いことは無いが
479デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:51:26.35ID:+admsRHQ0
struct I2C_MEM //構造体の型宣言
{
char DEV_ADR ;
char REG_ADR ;
char DATA[0x03] ;
};



struct I2C_MEM I2C_MEM[3] =//構造体の型宣言
{
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x01 , 0x00000000 }
} ;
480デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:56:16.34ID:+admsRHQ0
↑構造体の初期化で
charを連続4byte設定するときの書き方
0x00000000はたぶん違いますよね?
どう書けば良いんですか?

初心者過ぎてすいません
481デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:59:03.20ID:+admsRHQ0
struct I2C_MEM      //構造体の型宣言
{
char DEV_ADR ;
char REG_ADR ;
char DATA[0x03] ;
};

struct I2C_MEM I2C_MEM[3] =     //構造体の初期化
{
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x02 , 0x00000000 }
{ 0x7C , 0x03 , 0x00000000 }
} ;
2017/10/04(水) 17:01:20.64ID:HMkkIXOid
>>479
> struct I2C_MEM
> {
> char DEV_ADR ;
> char REG_ADR ;
> char DATA[0x03] ;
> };
struct I2C_MEM I2C_MEM[3] =
{
{ 0x7C , 0x01 , {0} }
{ 0x7C , 0x01 , {0} }
{ 0x7C , 0x01 , {0} }
} ;
483デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 17:04:07.51ID:+admsRHQ0
>>482

回答ありがとうございます!
ちなみにこれだったらどうかくんでしょうか?



struct I2C_MEM I2C_MEM[3] =     //構造体の初期化
{
{ 0x7C , 0x01 , 0x12345678 },
{ 0x7C , 0x02 , 0x12345678 },
{ 0x7C , 0x03 , 0x12345678 },
} ;
2017/10/04(水) 17:19:18.44ID:HMkkIXOid
>>483
struct I2C_MEM I2C_MEM[3] =
{
#ifdef BIG_ENDIAN //ビッグエンディアンの場合
{ 0x7C , 0x01 , {0x12, 0x34, 0x56, 0x78} },
{ 0x7C , 0x02 , {0x12, 0x34, 0x56, 0x78} },
{ 0x7C , 0x03 , {0x12, 0x34, 0x56, 0x78} },
#else // リトルエンディアンの場合
{ 0x7C , 0x01 , {0x78, 0x56, 0x34, 0x12} },
{ 0x7C , 0x02 , {0x78, 0x56, 0x34, 0x12} },
{ 0x7C , 0x03 , {0x78, 0x56, 0x34, 0x12} },
#endif
} ;
2017/10/04(水) 17:21:40.35ID:HMkkIXOid
>>484
> char DATA[0x03] ;
おっと、これじゃあ4バイト入らないぜ。
char DATA[4];
にしないと。
2017/10/04(水) 17:27:10.52ID:PA2rRcfg0
全くどうでもいいことだが最近の若いモンはスマホに合わせて上矢印なのな
一つ勉強になった
487デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/04(水) 17:28:20.90ID:VznoOWf36
PCでも上じゃね?
2017/10/04(水) 17:40:04.96ID:HMkkIXOid
>>484

#ifdef BIG_ENDIAN
# define ENDIAN_FIX(a,b,c,d) a,b,c,d
#else
# define ENDIAN_FIX(a,b,c,d) d,c,b,a
#endif

struct I2C_MEM I2C_MEM[3] =
{
{ 0x7C , 0x01 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
{ 0x7C , 0x02 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
{ 0x7C , 0x03 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
} ;
2017/10/04(水) 18:04:30.94ID:9y3nqzOw0
構造体の中身から推測すると、
書く順番はエンディアンに依存しないと思う
単純に配列の頭から1バイトずつ送信するだけ

仮にエンディアンで順番が変わるとしても
どうせガッツリ環境依存なコードなんだから
依存しちゃえばいい
環境依存が無いコードを書くつもりなら、
charが1バイトかどうかにも依存しないようにしないとね
2017/10/04(水) 18:10:15.78ID:9y3nqzOw0
>>488みたいなマクロは最悪
エンディアンていう言葉を覚えたばっかりの初心者が作る糞コード
491デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/04(水) 18:48:35.51ID:VznoOWf36
もちつけよw
2017/10/04(水) 19:22:55.76ID:HMkkIXOid
エンディアンについて解説が必要ですか?
はい/いいえ
2017/10/04(水) 20:07:04.96ID:V7FXDajl0
いいえ
2017/10/04(水) 20:09:03.80ID:V7FXDajl0
Definitely no.
2017/10/04(水) 20:18:42.31ID:38WTG0/g0
struct I2C_MEM //構造体の型宣言
struct I2C_MEM I2C_MEM[3] =//構造体の型宣言

この手の文法で自明なことをコメントにする文化はなくならないのかな
2017/10/04(水) 20:46:10.64ID:hBVSLcAId
俺のコードはその対極
大きな流れしかコメントをかかない
2017/10/04(水) 21:20:04.88ID:azmmV5/P0
I2Cか。データは8ビットで受けて、8ビットシフトしてビットORだな。
data = hi<<16 | mid<<8 | lo
2017/10/04(水) 21:27:53.34ID:hBVSLcAId
どう見ても送信
2017/10/04(水) 21:31:39.40ID:hBVSLcAId
>>492
お前の糞マクロ、どの辺が糞か解説が必要?
2017/10/04(水) 21:32:35.25ID:hBVSLcAId
ちなみに、ゆで玉子は輪切り派
501デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/05(木) 01:23:13.38ID:ioWgBjMx0
>>483
やってみな。
2017/10/05(木) 01:24:28.79ID:ioWgBjMx0
やってみなじゃない。どう動くかじゃなくてどう書くかか。
どうなって欲しいのかが書かれてないから答えられないな。
2017/10/05(木) 03:25:02.16ID:JVwY/YZa0
>>465
全体のコードは自作というか(自社製)ですが、funcは他社のライブラリなんです。
ソースがあればなんとかなったのかもですが・・・。

>>467
実際はfunc呼んだ後にcharListの値を呼んで色々作業しています。

>>469
普通の2次元char配列のつもりです。2次元配列というのはC言語的にはシンタックスシュガーにすぎず、
char a[m][n]もchar a[m*n]も等価なのですよね。なので、先頭ポインタから(m*n-1)個先までの
アドレスの範囲内なら範囲外アクセスエラーは起こり得ないと理解しています。



>>474の結論に至る前に、何かC言語で致命的な勘違いや思い込みをしているのかと
思って質問した次第です。今思うとエスパー回答を強いてしまって大変申し訳ありませんでした。

ひとまずはfuncを一切呼ばない形に直して事なきを得ました。
>>437で言った、「charListをプリントしたりすると何故か問題なく動く」からそれで一時凌ぎする考えも
頭をよぎりましたが、思いとどまりました。

ひとまずこれで終えます。回答くださった方々、本当にありがとうございました。
2017/10/05(木) 03:26:43.92ID:JVwY/YZa0
>>503
×charListの値を呼んで
○charListの内容をstringに変換して(charListは不変)
2017/10/05(木) 05:32:30.50ID:PdAAtG4s0
>>503
>char a[m][n]もchar a[m*n]も等価なのですよね

そうだっけ?
2017/10/05(木) 05:39:44.88ID:+DJIpzmcM
char[m][n]はchar**、char[m*n]はchar*、データ型は違う
2017/10/05(木) 08:10:49.48ID:2SMjslBqM
funcに与える引数の条件がちゃんと理解できてないとか
2017/10/05(木) 08:15:39.56ID:Nh1QNpvaF
char[m*n]って何?
結局ただの一次元配列でしょ?
509デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/05(木) 10:10:50.98ID:6niZC7Nf0
>>506
堂々と嘘つくんじゃねえ
sizeof(char[m][n]) != sizeof(char**)
2017/10/05(木) 10:11:07.83ID:TrTYAooo0
>>503
> 2次元配列というのはC言語的にはシンタックスシュガーにすぎず、
> char a[m][n]もchar a[m*n]も等価なのですよね。なので、先頭ポインタから(m*n-1)個先までの
> アドレスの範囲内なら範囲外アクセスエラーは起こり得ないと理解しています。

だいたいの実装では、特に char 類なら、動作上問題が起こることは考えにくいものの、
言語規格上の保証は無いよ。
https://www.jpcert.or.jp/m/sc-rules/c-arr30-c.html
511デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/05(木) 12:14:43.27ID:6niZC7Nf0
そういう保証は紙っきれの条文より自分で確認・検証することが最重要だ
いくら「保証されている」ことでもコンパイラがバグったり中には確信的に違反するケースまである

空想論の域を出ないくだらんことのために
現実的なアイディアを諦めていては生産性が上がらない
512デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/05(木) 12:51:26.83ID:TRdRMfhC0
struct I2C_MEM
{
char DEV_ADR ;
char REG_ADR ;
char DATA[4] ;
} static I2C_MEM0 ;


I2C_MEM0.DEV_ADR = 0x7C ;
I2C_MEM0.REG_ADR = 0x01 ;
I2C_MEM0.DATA[4] = { 0x11,0x12,0x13,0x14 } ;  ←これはエラーになる
//I2C_MEM0.DATA[0] = 0x11 ;            ←こちらのパターンはエラーにならない
//I2C_MEM0.DATA[1] = 0x12 ;
//I2C_MEM0.DATA[2] = 0x13 ;
//I2C_MEM0.DATA[3] = 0x14 ;

4バイト一気に設定の書き方はどうすればいいんでしょうか?
2017/10/05(木) 12:51:30.07ID:/OlbfMDH0
コメント邪魔
2017/10/05(木) 12:52:03.70ID:/OlbfMDH0
誤爆m(_'_)m
2017/10/05(木) 12:59:34.91ID:/OlbfMDH0
>>512
一気に初期化する必要性がわからんが

糞コード
assert( 4 == sizeof ( unsigned long ) );

*( unsigned long* )I2C_MEM0.DATA = *( unsigned long* )"\x11\x12\x13\x14";
2017/10/05(木) 13:01:44.78ID:gOaVCYiad
>>512
配列の複数の要素を一気に代入する記述はない
そういう風にひとつひとつ代入するか
memcpy使ったり構造体にして代入したりする
517デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/05(木) 13:04:36.67ID:TRdRMfhC0
なるほどー ありがとうございました
2017/10/05(木) 13:06:18.55ID:/OlbfMDH0
ARMだと1バイトづつ初期化した方が小さくなるような気がする
519デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/05(木) 13:13:39.58ID:/W/G46pt6
無名配列のリテラルは初期化時には使えるけど代入には使えないってこと?
520デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/05(木) 13:16:53.65ID:/W/G46pt6
初期化時というか宣言時
2017/10/05(木) 19:51:18.71ID:72rIdNeW0
ビッグエンディアンの環境を教えてください
2017/10/05(木) 20:02:42.15ID:Xv32D2hUd
HP-UX、MOTOROLA、AIX、Solaris
2017/10/05(木) 20:09:22.11ID:Xv32D2hUd
Apple PowerPC Mac、Sun Blade、SGI O2??
2017/10/05(木) 20:14:07.63ID:Xv32D2hUd
ビッグエンディアンの仮想環境はQEMU以外にないから、エミュレータを作れば有名になれるよ。
2017/10/05(木) 20:29:07.01ID:Xv32D2hUd
>>524
ごめん、PowerPCのエミュレータにPearPCがあった。
2017/10/05(木) 20:30:19.57ID:3IfCpLlr0
SH
2017/10/05(木) 20:32:46.00ID:Xv32D2hUd
SolarisエミュレータにCHARONがある(有料)。ビッグエンディアンの環境はお金がかかるよ。
2017/10/05(木) 20:34:21.70ID:3IfCpLlr0
整数の負の数に1の補数を用いる環境
整数の負の数に絶対値と符号ビットを用いる環境
整数にトラップ表現がある環境
charが8の倍数ビットでない環境

を教えてください
529デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/05(木) 20:34:53.22ID:olaqz/S6p
ARMは選択出来たっけ?
まあ、みんなリトルで使ってるがな。
地味にMicroBlazeがビッグだな。
2017/10/05(木) 20:39:08.91ID:3IfCpLlr0
MIPSもバイ

ミドルエンディアンの環境を教えて下さい
2017/10/05(木) 20:41:19.68ID:3IfCpLlr0
おれはリトル
わざわざお尻から食べないよね普通
2017/10/05(木) 20:42:01.73ID:Xv32D2hUd
博物館に所蔵されてるようなコンピュータ調べて何の意味があるんだろう。。。
2017/10/05(木) 20:44:02.75ID:3IfCpLlr0
>>522 >>523 のこと?
2017/10/05(木) 20:46:00.84ID:Xv32D2hUd
>>528
絶滅したコンピュータアーキテクチャの話はしたくない。
535デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/05(木) 20:46:52.00ID:olaqz/S6p
6502とか、地味に生きてるやん?
あ、あれはエミュレータか。
2017/10/05(木) 21:04:49.44ID:Xv32D2hUd
ほとんどの環境のcharが8ビットなのは、基本ASCIIが7ビットで表現できることと、7ビットより8ビットの方が切りが良くてパリティビットなどに使えて便利だったことによる。
537デフォルトの名無しさん (ワッチョイ 054b-5Ff0)
垢版 |
2017/10/05(木) 21:09:26.31ID:PAHxl06e0
最近C言語ハマってる
言語がシンプルなのと直にコンピュータを操ってる感
2017/10/05(木) 21:16:28.12ID:Xv32D2hUd
charが7ビットだったら、パックトBCDもなかった。
2017/10/05(木) 21:25:12.02ID:Xv32D2hUd
7ビットだったら1バイトの16進表示で1ビット無駄になるところだった。
2017/10/05(木) 21:44:27.38ID:Xv32D2hUd
GCCかLLVMを使えば、適当なアーキテクチャのC言語コンパイラーを自由に作ることができるらしい。
2017/10/05(木) 21:54:15.38ID:Xv32D2hUd
まあ、例えばNintendo SwitchのアーキテクチャをGCCかLLVMで定義すれば、そのアーキテクチャのコンパイラーが作れる訳だ。
2017/10/05(木) 22:04:36.58ID:dkgh60ez0
そういう用途なら「高位合成」でggrと幸せになれるぞ
LLVMは多分出番なしだ
2017/10/05(木) 23:19:53.46ID:G8RM0vBkM
スイッチはテグラじゃないの?
2017/10/05(木) 23:34:31.98ID:Xv32D2hUd
うん、NVIDIA Tegra のカスタムだね。例えが悪かったか。
2017/10/05(木) 23:36:35.55ID:3IfCpLlr0
>>536
charが16bitなら最近使ったけど
546デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/05(木) 23:58:01.04ID:ioWgBjMx0
>>512
strncpy(I2C_MEM0.DATA, "\x11\x12\x13\x14", 4);
547デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/06(金) 00:05:52.06ID:L6h7mNkA0
実行時間の長い再帰関数(ハノイの塔)を実行しながら過程をglutというOpenGLライブラリで開いたウィンドウに描画させたいのですが方法ありませんか?
ステップ毎に再帰関数を最初から実行するしかないですか?
2017/10/06(金) 01:40:53.41ID:tqIbkLAn0
再帰して、関数を無限に呼ばない。
答えをメモ化しろ

「メモ化」で検索!
549デフォルトの名無しさん (ワッチョイ 558d-wbjw)
垢版 |
2017/10/06(金) 01:51:40.09ID:FhOeSxdK0
-1.400000e+01 2.043459e+01 1.738866e-15
-1.398525e+01 2.029842e+01 3.900652e-01
-1.399008e+01 2.029842e+01 -1.300367e-01

3DデータのSTLと言う形式で使われてるこの様な数字の型は
printfで出力する場合どの型フィールドになるのでしょうか
%e %gだけでは何だか違います
550デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/06(金) 02:18:01.36ID:x0C9073k0
>>549
いやずばり %e だと思うが?
2017/10/06(金) 03:03:00.77ID:RA0YJgv70
>>546
最近出来た関数かな?
552デフォルトの名無しさん (ワッチョイ 059f-TYR1)
垢版 |
2017/10/06(金) 03:37:10.08ID:x0C9073k0
>>551
最近って・・・うーん。
2017/10/06(金) 03:40:43.51ID:aYA4G4wj0
>>547
ハノイの塔の実行スレッド(A)と描画スレッド(B)を別にする
Bは計算過程を変数Cに書き込む
Aは画面リフレッシュのタイミングでCを描画
2017/10/06(金) 03:41:39.90ID:aYA4G4wj0
逆だw
Aは計算過程を変数Cに逐次書き込む
Bは画面リフレッシュのタイミングでCを描画
2017/10/06(金) 04:15:34.73ID:RA0YJgv70
>>552
memcpyとか、strcpyとか、strncpyは知っているし、_s付き
なんてのも知っているけど、これは初めてかな
2017/10/06(金) 06:22:04.70ID:RySAjNni0
スペルミスかと思ったけど合ってるよな
間違い探し難しい

どこが変?
2017/10/06(金) 07:43:06.02ID:p4va+yl10
検索でちゃんと 555 と 546 がヒットするし何か見間違えたんだろうか
2017/10/06(金) 07:45:29.75ID:iQ5MtuBR0
目を細めて見るとstmcpyに… いや無理があるな
2017/10/06(金) 08:33:19.91ID:4Iec6HYc0
老眼がすすんで字が読めなくなったジジイだろ
>>546が本当にスペルミスだったとしても全然面白くないツッコミだし

老害は早く死ねば良いのに
2017/10/06(金) 09:47:31.52ID:RA0YJgv70
str[n]cpyが最後に0を書く条件は?
memcpyを使わない理由は?
561デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/06(金) 10:38:12.40ID:EDz06gtM6
自分のミスはスルー
2017/10/06(金) 10:39:45.78ID:d6jfQR1X0
strncpyは0で終端される条件が毎回わからなくて敬遠していたんです。
でも、strlcpyを使うようになってから肌年齢が10歳若返りました!
今は毎日がとっても楽しいです。
563デフォルトの名無しさん (ワッチョイ 0502-5Ff0)
垢版 |
2017/10/06(金) 10:54:46.60ID:U5/7Dlcy0
>>548
おお!センクス!
564デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 13:16:11.88ID:qH0Ei3hn0
>>559
おまえさんが言わなくても老いた者は死にゆくように自然はできている
それを妨げるなという主張なら医療業界に言え
565デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/06(金) 14:05:32.93ID:UT/zOTNDp
何の為にサイズ指定があるか、考えりゃわかるじゃん?
2017/10/06(金) 14:53:14.89ID:4Iec6HYc0
>>564
「早く」の意味を調べてからほざきなさい
567デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 15:16:39.88ID:qH0Ei3hn0
>>566
形容詞には比較をつけろ
一年目でおぼえる初歩だろうがボケ
568デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/06(金) 15:20:28.76ID:B4vVDMXU0
うんち!
2017/10/06(金) 17:45:14.09ID:4Iec6HYc0
>>567
朝鮮語ではそう言うルールがあるのか?
日本語にはないぞ
2017/10/06(金) 18:41:01.91ID:fZ4i0/3ka
>>567
>>559のレスの中の「早く」の使い方は自然だと思うが…。
日本語学校の1年目に、どう教わったの?
571デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 20:42:56.05ID:qH0Ei3hn0
>>569
朝鮮語か日本語かには関係ない
電気屋のルールだ
572デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/07(土) 14:47:24.49ID:f9dDdlSq0
>>555
>>546にはそのstrncpy()が書かれているが?
573デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 10:02:50.14ID:iaWD4MFGE
PHPしかできないザコだったけどC言語が楽しい
Cのスタンダードなコーディングスタイルってないですか?
インデントにタブ使ってたりifに{}使ってなかったりするコードをよく見かけますけど
2017/10/08(日) 10:09:18.29ID:+nfO/L5n0
戦争でも起こす気か?
2017/10/08(日) 11:30:23.33ID:HosRocIl0
>>573
C言語 コーディングスタイル
でググれ
あと結果の報告は要らん
と言うか報告するな
理由は>>574に書いてある
2017/10/08(日) 11:56:53.58ID:SX/6L99bd
戦いの火蓋は切って落とされた
2017/10/08(日) 13:00:43.13ID:FR3ELF64M
インデントは空白4個だね
578デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/08(日) 13:04:33.16ID:SXbZ1Yc30
>>573
ほんまC言語楽しいよな
俺もC#かWeb系スクリプト言語しか使ったことなかったんだが
2017/10/08(日) 13:04:53.34ID:e96mZsST0
>>577
2つで十分ですよ
580デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/08(日) 13:05:13.53ID:SXbZ1Yc30
C++はゴミ
581デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/08(日) 14:51:03.41ID:c+/m9riq0
>>579
いやタブ1つにして表示幅はスペース4つ分だ。
582デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/08(日) 14:54:49.62ID:c+/m9riq0
>>576
ああ。もうこのスレはスペース開けるか開けないか改行するかしないか何文字にするか中括弧はどうするか行末にバックスラッシュ入れて次行に書くか書かないかgotoどうするか等の話で延々と10年ぐらい費やされるんだろうな。
もちろんエディタの話に飛び火してviがvimがemacsがとなる。
2017/10/08(日) 14:55:08.52ID:bhcsmcAx0
スペース一つで充分
2017/10/08(日) 15:03:04.04ID:Eg4i3QFB0
プログラム終了前にfree()が必要かどうかを忘れちゃいかん。
585デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/08(日) 16:00:19.88ID:tULmhvm40
ちょっと教えてくださいとあるHPから抜粋
意味が分からないので解説お願いします
私が負荷した文は<<  >>で囲みます

struct Person {
char name[20];
int sex;
// char sex;
int age;
double height;
double weight;
} person_s;               <<←今までの自分の認識:Person構造体のインスタンスperson_sを生成 しかしこの認識は後述@でpがインスタンスであると推定できることから間違っていると推定できる>>
                      << person_sは構造体宣言の為の鋳型と推定 しかし様々なプログラムをチェックするとここでインスタンス宣言している例も見受けられる >>
                      << 変数が構造体宣言の為の鋳型なのかインスタンスなのかはコンパイラが記述から自動判断???>>
person_s p;               << ←pがPerson構造体のインスタンスであることは後述@のメンバ呼び出しで推定できる >> 

とかけば、不要な宣言を減らすことができます。
構造体メンバの初期化
各メンバの初期化方法として次のようなものがあります

person_s p = {"Tom", 0, 20, 175.2, 66.5};  <<←構造体宣言鋳型person_sを使用しpをインスタンス宣言??>>

// または

person_s p;         << 構造体宣言鋳型person_sを使用しpをインスタンス宣言?? >>
p.name = "Tom";     << この記述でpが構造体Personのインスタンスであると推定できる ・・・@ >>
p.sex = 0;

<< person_sは構造体宣言の鋳型 pはインスタンスであると推定できるが >>
<< 何故ダイレクトにPersonを使ってpを宣言しないのか? >>
<< 何故person_sなどという変数を使って間接的に宣言するのか? >>
<< うんちくきぼんぬ >>
2017/10/08(日) 16:03:19.22ID:dE95R3nJ0
struct Person の前に typedef がありそうな雰囲気
2017/10/08(日) 16:13:28.90ID:yi/NbOiJ0
ここかな
https://qiita.com/nomunomu/items/1a72b0150ea0fcf442b0
typedef の書き漏れだろうね
2017/10/08(日) 16:38:19.39ID:HosRocIl0
>>584
exit() の前にだろ
2017/10/08(日) 17:08:17.03ID:F9J/pQ0V0
C++ならtypedefなくても可
多分.cppでビルド通したんだろうね
2017/10/08(日) 17:13:11.77ID:dE95R3nJ0
>>589
後の句 person_s を型名として使ってるんで typedef は必須じゃない?
(strust 省略の Person で宣言してるのとは違う)
591デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/08(日) 17:16:54.10ID:tULmhvm40
なるほどー ありがとうございました
2017/10/08(日) 17:26:51.19ID:F9J/pQ0V0
>>590
C++ではtypedefは不要だよ(別にあっても構わないけど)
structとclassはメンバーのデフォルト設定がpublicかprivateかという違いを除けば構文的には全く同じように使える
structで継承することすら出来る
2017/10/08(日) 17:32:00.82ID:dE95R3nJ0
>>592
論点はそこじゃなくて
 struct Person { };
 Person p;
が C++ では文法として通るのは指摘の通り

質問元の記述では
 struct Person { } person_s;
 person_s p;

こうなってるから、これじゃ C++ の文法でも通らないでしょうよ ってことで
2017/10/08(日) 17:37:28.39ID:F9J/pQ0V0
通るよ
class宣言ではいちいちtypedefなど使わないのと同じように構造体でもtypedefは省略するのが一般的
むしろ先頭の構造体テンプレート名を省略して最後の型名だけ宣言する場合も多い
2017/10/08(日) 17:42:06.58ID:dE95R3nJ0
https://ideone.com/e1pLf2
通ったっけ? って確認コード
インスタンスとtypedef の区別つく?
2017/10/08(日) 18:04:45.47ID:PUMPETat0
structが省略可能になってtypedefしなくなったのを
typedefが省略可能と間違って覚えてるんじゃないだろうか
2017/10/08(日) 18:08:10.27ID:dlDwfjxk0
>>594
>>595 を見る限り通らないようだね
2017/10/08(日) 18:14:58.26ID:ALuk3l/eM
あれ?
通らないのかこれ?
2017/10/08(日) 18:20:47.85ID:dE95R3nJ0
型名のエイリアス宣言と  その型のインスタンスの生成
typedef を省略した場合には、全く同じ記述になるんだけど
後者のインスタンスの生成で翻訳してるぜ
2017/10/08(日) 18:29:26.73ID:HosRocIl0
通ると思う方がどうかしてるわ
2017/10/08(日) 18:32:58.84ID:LFQQ2ZHvd
なぜ通ると思ったのか
602デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 19:03:56.08ID:uO7C8UFXE
コーディングスタイルってたくさんあるんですね
とりあえず検索したらエリートの人達が使ってそうなものを集めてみました

C Coding Standard - CMU (ECE)
https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html
GNU Coding Standards
https://www.gnu.org/prep/standards/html_node/Writing-C.html
NASA C Style Guide
http://homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
C Coding Style - GNOME Developer Center
https://developer.gnome.org/programming-guidelines/stable/c-coding-style.html.en
CERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
Linux kernel coding style
https://www.kernel.org/doc/html/v4.10/process/coding-style.html

どれも難しそうなのでコーディングスタイル見るのやめようと思います。
githubで適当に見ても全然統一されてないし
とりあえずインデントは空白8個で{}を省略しないルールだけにしたいと思います。
603デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 19:04:57.70ID:uO7C8UFXE
空白8個なのはメモ帳で見た時にこのくらいだから合わせてるだけです
2017/10/08(日) 19:18:41.81ID:PUMPETat0
また戦争がしたいのか、アンタは
2017/10/08(日) 19:26:45.12ID:+nfO/L5n0
戦闘民族
2017/10/08(日) 19:30:12.30ID:HosRocIl0
書いてりゃわかると思うけど8は多すぎ
単に昔のシステムがそうだったと言うだけのことだから4とか2でいいと思う
2017/10/08(日) 19:36:28.95ID:+nfO/L5n0
あーあ
2017/10/08(日) 21:11:10.70ID:bhcsmcAx0
>>573
会社や複数人作業ならそれにあわせる
一人で書く分には何でもいいだろ
なんなら、PHPで使ってたスタイルでいいだろ
ってか、PHPの時はどうしてたんだよ
609デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/09(月) 01:05:37.72ID:6VRPxojV0
マンデルブロの描画がうまくいきません。ズームするとすぐに単調になってしまいます。

動画
https://youtu.be/Ompp_YwrLPw

ソースコード
http://codepad.org/mlm33eRT
2017/10/09(月) 01:30:56.68ID:vdfcSFiBd
>>609
クリックしたら画面の中心を移動させる。
2017/10/09(月) 01:32:01.57ID:vdfcSFiBd
ドラッグされたらずらす。
612デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/09(月) 01:53:40.87ID:6VRPxojV0
>>610
一応クリックするとある境界線付近を拡大するようにプログラムに書いてるのですが...
2017/10/09(月) 03:32:25.69ID:vdfcSFiBd
>>612
環境によって座標系が違うのかも知れない。ずらす値を変えてみては?
2017/10/09(月) 03:39:59.55ID:69HXGpsc0
>>609
単調になるのは k のループ回数が少ないせいでは
2017/10/09(月) 06:38:40.98ID:hRP3P7r40
そうだね k=1000くらいで
616デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/09(月) 08:53:44.75ID:IXUwPWpS6
>>613
変えても同じでした
>>614
>>615
なるほど!家に帰ったらやって見ます!
2017/10/09(月) 09:35:07.86ID:IkImbMA7a
>>594
変数宣言が全てtypedefになるなんて狂気な言語
実例を教えてくれ
2017/10/09(月) 09:51:45.98ID:UMVukllE0
俺はこの書き方
if (condition) {
}
else {
}
2017/10/09(月) 09:55:27.10ID:pMEz2IHg0
コーディングスタイルにこだわる奴は素人。
620デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/09(月) 12:12:59.35ID:9ioWbZDx6
Linuxのソースコードは?
2017/10/09(月) 13:24:11.42ID:N3YX2Zf80
ソース整形ツールの動作オプションの数で眩暈がするぜw
622デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:12:40.72ID:98rFBdXp0
■■たびたびお世話になります なにが悪いのかご指摘おねがいします■■

struct I2C_MEM 
{
char DEV_ADR ;
char REG_ADR ;
char DATA[4] ;
} static I2C_MEM[2] ;

task02_tst ( struct I2C_MEM *aaa )
{
char i,a[2],b[2],c[2];
i = 0 ;

while ( i <= 1 )
{
aaa -> DEV_ADR ;
a[i] = *aaa ;         // データタイプがインコンパチでエラーになる char DEV_ADR を参照してくれない?
aaa -> REG_ADR ;
b[i] = *aaa ;        // データタイプがインコンパチでエラーになる char REG_ADR を参照してくれない?
aaa -> DATA ;
c[i] = *aaa         // データタイプがインコンパチでエラーになる char DATA を参照してくれない?
p += 1 ;

i += 1 ;
}
}
623デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:22:20.38ID:98rFBdXp0
↑単純に関数内で構造体のデータにポインタ+インデックスでアクセスしたい
624デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:26:06.29ID:98rFBdXp0
間違い発見
p += 1 ; は aaa += 1 ; に置き換えてください
2017/10/09(月) 14:39:31.76ID:vdfcSFiBd
>>622
何がしたいのかわからない。
代入の左辺は右辺と互換性のある型じゃないといけないし、配列まるごとの代入はできない。
まずは代入の型をそろえないと。
2017/10/09(月) 15:09:21.54ID:vdfcSFiBd
char型のデータを代入したいのなら、両辺の型をcharにしないといけないよ。
2017/10/09(月) 15:26:29.02ID:G+wiEnLh0
>>622
> aaa -> DEV_ADR ;
> a[i] = *aaa ;

例えばこの部分は a[i] = aaa->DEV_ADR; という処理を意図してるのではないかと思う
ただし aaa->DATA のところは char* 型になるので char 型の c[i] に代入できない
2017/10/09(月) 15:56:12.50ID:of8Vs49yM
>>622
エスパーするとたぶんこう言うことだと思う
task02_tst ( struct I2C_MEM *aaa ){
int i;
char a[2],b[2],c[2];
for(i = 0; i < 2; i++){
a[i] = aaa[i].DEV_ADR;
b[i] = aaa[i].REG_ADR;
c[i] = aaa[i].DATA; // ここは >>627 の言う通りなにをしたいのかよくわからん
}
}
2017/10/09(月) 17:01:40.23ID:u+Z6y4O20
初心者相手に表記法を変えると理解しにくいかも。
本質から外れた部分が目についてしまうからね。

int i = 0;

while ( i <= 1 )
{
a[i] = aaa -> DEV_ADR ; // ポインタaaaが指す構造体の DEV_ADR メンバの値
b[i] = aaa -> REG_ADR ; // ポインタaaaが指す構造体の REG_ADR メンバの値
c[i] = aaa -> DATA ; // c[i] の型と DATA メンバの型が違うからエラー
aaa += 1 ;

i += 1 ;
}

てな感じかと。
>>627-628 をまとめただけ、だけど。
630デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/09(月) 17:19:35.64ID:tFlwnlNI0
>>629
c を char *c[2] で宣言しておけばなんとかなるね。
631デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 17:34:38.15ID:98rFBdXp0
皆様 どうもありがとうございます
とりあえず代入の書き方が知りたかっただけでありまして
ちなみにインデックスを使用した配列メンバーのアクセスなんだけど
c[i] = aaa -> DATA +0 ;
d[i] = aaa -> DATA +1 ;
e[i] = aaa -> DATA +2 ;
f[i] = aaa -> DATA +3 ;
こんな書き方ってできるの?
2017/10/09(月) 17:44:30.12ID:N3YX2Zf80
ポインタを返す場合はそういう書き方
aaa->DATA+3
ポインタの指してる先を求めたい場合は
aaa->DATA[3]

左辺が何を要求しているのか(どういうものを操作したいのか)を頭の中で整理せずに
記述法だけを即物的にトレースするのはとてもまずい
2017/10/09(月) 18:00:40.01ID:tNKVEDsJ0
task02_tst()の呼び出しが
task02_tst(I2C_MEM)なのか
task02_tst(&I2C_MEM[1])なのかわからん

前者と仮定するとDEV_ADRにアクセスする方法は
1. (*(aaa + i)).DEV_ADR
2. aaa[i].DEV_ADR
3. (aaa + i)->DEV_ADR
なんかが考えられるけど(2は1の糖衣構文)、ドットとアローそれぞれの
左側の違いを理解しないと先には進めないよ
2017/10/09(月) 18:02:21.36ID:tda6mQVw0
>>631
意図が分からないからマトモに答えられない
実際に数字入れて教えてくれ
例えば>>622はI2C_MEM = {4, 8, {0, 1, 2, 3}} でa,b,cはどうなるの?
635デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 10:23:33.14ID:jY+yK3vs6
過疎ってるな
636デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 11:18:46.53ID:mQ4S5/8+0
ちょっと質問です
↓下記のようなwhileの中身を複製するために使う実体化されない変数iをコンパイラ制御のための変数と明示する書き方ってあるんですか?

task02_tst ( I2C_MEM_typ *p , char i)
{
char i ;
i = 0 ;
while ( i < 2 )
{
p = p + i ;
a[i] = p -> DEV_ADR ;
b[i] = p -> REG_ADR ;
c[i][0] = p -> DATA[0] ;
c[i][1] = p -> DATA[1] ;
c[i][2] = p -> DATA[2] ;
c[i][3] = p -> DATA[3] ;
}
}
637デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 11:24:19.55ID:mQ4S5/8+0
task02_tst ( I2C_MEM_typ *p )
{
char i ;
i = 0 ;
while ( i < 2 )
{
p = p + i ;
a[i] = p -> DEV_ADR ;
b[i] = p -> REG_ADR ;
c[i][0] = p -> DATA[0] ;
c[i][1] = p -> DATA[1] ;
c[i][2] = p -> DATA[2] ;
c[i][3] = p -> DATA[3] ;
}
}

に修正します
638デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 11:26:34.34ID:mQ4S5/8+0
task02_tst ( I2C_MEM_typ *p )
{
char i ;
i = 0 ;
while ( i < 2 )
{
p = p + i ;
a[i] = p -> DEV_ADR ;
b[i] = p -> REG_ADR ;
c[i][0] = p -> DATA[0] ;
c[i][1] = p -> DATA[1] ;
c[i][2] = p -> DATA[2] ;
c[i][3] = p -> DATA[3] ;

i += 1 ;
}
}

に修正します
2017/10/12(木) 11:50:40.24ID:z+R5CP9n0
>>636
先ず日本語をなんとかした方がいい
『whileの中身を複製する』とはどういうことか?
『実体化されない変数』とは何か?
『コンパイラ制御のための変数』とは何か?
640デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 12:32:35.60ID:mQ4S5/8+0
こんな感じで構造体をインデックスで指定した転送命令にコンパイルする意図で書いています

p = p + i ;                            //*実体化されない(マシンコード化されない)コード
mov a[0] ,  [構造体I2C_MEMの基底番地+0]
mov b[0] ,  [構造体I2C_MEMの基底番地+1]
mov c[0][0] ,  [構造体I2C_MEMの基底番地+2]
          :
mov c[0][3] ,  [構造体I2C_MEMの基底番地+5]
i += 1 ;                              //*実体化されない(マシンコード化されない)コード


p = p + i ;                            //*実体化されない(マシンコード化されない)コード
mov a[1] ,  [構造体I2C_MEMの基底番地+6]
mov b[1] ,  [構造体I2C_MEMの基底番地+7]
mov c[1][0] ,  [構造体I2C_MEMの基底番地+8]
          :
mov c[1][3] ,  [構造体I2C_MEMの基底番地+11]
i += 1 ;                              //*実体化されない(マシンコード化されない)コード

・・・で意図通りコンパイルしてくれるわけですが

実体化されない(メモリー空間またはレジスタファイルにアサインされない)char iの意味が
希薄になるのでコンパイラに対する変数だよと明示(コンパイラ&設計者に)したいのだが
そんな書き方ある?ということでありまして
2017/10/12(木) 12:41:11.33ID:Z8zboj8V0
多少は意図した記述に沿って機械語出力するだろうけど、
保障されてるわけでもないし、最適化他でどうなるかもわからん

「機械語でこうなって欲しい」という目的を達成させるならその部分を機械語で書くか、
(環境によるだろうけど)その部分だけをインラインアセンブラにする
2017/10/12(木) 12:42:56.26ID:cscfLNVP0
memcpy使ったらいいんじゃないの?
2017/10/12(木) 12:52:32.73ID:loBt1/dEd
volatile
644デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 13:04:26.04ID:mQ4S5/8+0
うーーん・・・

volatileは最適化抑止(消すなー!)のための記述と認識しているんですが
volatileの逆の機能が欲しいんですよね 実体化するなー!ってやつです
2017/10/12(木) 13:37:51.69ID:jX4dlPv10
volatile揮発性の当初の意図は
70年代コンピュータでの磁気コアメモリに置いておく、程度なんじゃあねえの
2017/10/12(木) 13:45:28.14ID:Z8zboj8V0
実体化するな=機械語としてコードにおくな
ということは、言語上での変数を一切使わずに繰り返し展開するような
テンプレートやマクロでメタプログラミングしたい って話になるが・・・

#define IMP(idx) do { \
a[idx] = p[idx].DEV_ADR; \
b[idx] = p[idx].REG_ADR; \
:
: 以下同じ様に記述
:
c[idx][3] = p[idx].DATA[3] ; } whle(0)

IMP(0);
IMP(1);
IMP(2);

変数を使ってループできないから 繰り返し分リテラルを手で並べる必要あるしー
正直ほめられたやりかたじゃないと思うわ
647デフォルトの名無しさん (ササクッテロレ Sp45-NqOW)
垢版 |
2017/10/12(木) 14:25:00.48ID:1sF6m3D2p
実体化させたく無いものを記述?
…スラ二本じゃダメなのか?
648デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:30:09.97ID:9bJ1Vwh10
そういう話ではないでしょ
そもそもループによるコードのキャストは
記述を短縮化するのが目的なんだから

キャストのためのループであることをコンパイラに
推論させるための変数指定の仕組みがあるのかな?ってはなし
649デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:32:07.54ID:9bJ1Vwh10
まあ 指定しなくても現状でコンパイラは推論してるけれどもねw
なんかキモチ悪いといえばキモチ悪いんで指定できればうれしいってだけです
650デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 14:36:32.09ID:OhN0e73F6
死ねゴミ
651デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:37:45.66ID:9bJ1Vwh10
なんかすぐ出てこないところをみると
そこらへんはコンパイラまかせなのね
652デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 14:38:53.90ID:OhN0e73F6
クッサ
2017/10/12(木) 14:45:29.40ID:Z8zboj8V0
結局 >>639 だったのか・・・
2017/10/12(木) 14:46:41.92ID:z+R5CP9n0
返答が幾つもついてるのに出てこないとか言っちゃうのは見たいものしか見ない人の典型だね
2017/10/12(木) 14:48:17.07ID:XqOCC09Fd
とりあえずお前には無理だ
諦めな
656デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 15:03:43.28ID:9bJ1Vwh10
大体わかりました
ありがとうございました
657デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 15:06:24.03ID:OhN0e73F6
一から10まで足し合わせるプログラムを教えてください。
2017/10/12(木) 15:10:29.76ID:loBt1/dEd
>>657
#include <stdio.h>
int main(void) {
int i, n = 0;
for (i = 1; i <= 10; ++i) n += i;
printf("%d\n", n);
return 0;
}
659デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 15:18:14.51ID:OhN0e73F6
>>658
ありがとうございます!
2017/10/12(木) 18:50:09.63ID:7bIAw6590
人に思いを正しく伝えられない奴がうまくプログラミングできるとは思えないけど大丈夫なんだろう
661デフォルトの名無しさん (ササクッテロレ Sp45-NqOW)
垢版 |
2017/10/12(木) 20:36:00.66ID:1sF6m3D2p
俺は逆だと思っている。
人に上手く思いを伝えられないからこそ、
表現手段を駆使して伝えようと努力するんだよな。
絵とか音楽とか、クリエイターってそんな生き物。
2017/10/12(木) 21:49:52.42ID:wn8w1zGC0
>>661
> 絵とか音楽とか、クリエイターってそんな生き物。
全然違う
あいつらは自分の思いを伝えられるのは自分の表現法方だけだと思ってる
絵を描く奴で説明文を書いて思いを伝えるやつなんていないだろ
663デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/12(木) 23:57:59.88ID:5ILt7KpA0
>>645
メモリマップドI/Oに使える。特定のアドレスを読むとキーボードで入力した文字が読めるとか、そういうやつ。
読んだ直後に内容が変わる可能性があるので volatile でないとまずい。
664デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/13(金) 00:30:38.46ID:neFZx4WS0
共有メモリとか mmap() して複数のプロセスまたはスレッドがアクセスする領域も同じか。
あれ? こんなのちょっと前に話題にならなかったか?
2017/10/13(金) 06:51:32.49ID:txebgbcNM
DMAとかもあるわな
666デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:09:21.29ID:UePpwGnn0
ちょっとお尋ねします

char *a ;  と記述すると
 ↓
char a ; 実体化
int (&a) ; 非実体化(コンパイラが使用する変数)

が生成される
*の概念が無いと

char a ;    実体化
int a_point ; 実体化(アドレス長=intとする)
a_point = &a ; 実体化

例えばこう書くことになる


ポインタは関数内で宣言できる
その場合そのポインタの寿命は関数内に限定される


こんな感じの認識であってますか?
667デフォルトの名無しさん (アウーイモ MM1d-1+gY)
垢版 |
2017/10/13(金) 12:21:34.93ID:ZC5rLpvkM
ポインタの寿命はプログラム内じゃないん?
2017/10/13(金) 12:24:24.54ID:y6HLA65k0
実体化とか 非実体化とかの オレオレ用語は何を意図してるのかわからん
669デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:29:00.47ID:UePpwGnn0
>>667
ということはプログラム内でユニークな名前をつけなければならないということですね?
2017/10/13(金) 12:29:33.87ID:x6piWjtI0
>>666
言ってる意味がわからない
何の言語やってたの?
2017/10/13(金) 12:30:40.15ID:KnON5zi30
>>666
>char a ; 実体化
>int (&a) ; 非実体化(コンパイラが使用する変数)
ポインタを定義したからといって,即応して実体が生成されることはない
ポインタがさす実体は自分で生成しないといけない
672デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:31:44.24ID:UePpwGnn0
C言語です
実体/非実体とは機械語に変換されるかどうかということです
2017/10/13(金) 12:33:52.57ID:piAojqU/0
実体化とか非実体化とか、オブジェクト指向の概念でしょ。
Cではリテラルに対応するエリアがあって、それをデータの入れ物にするか、アドレスの入れ物にするか、だけでしょ。
いずれにしろ変数の寿命はグローバルスコープに定義するか、静的(static)に定義しないかぎり、
使われる関数のスコープ内に限られるでしょ。
674デフォルトの名無しさん (ワッチョイ 0b3f-MWTH)
垢版 |
2017/10/13(金) 12:33:53.32ID:/fw1jTt60
>>666
> char a; 実体化
というのを除き、だいたい合ってる
char *a;ではcharの実体は作られずに
int(&a);だけが作られる

Cの前身のBでは、*3 = 1;で
メモリの3番地に1を書き込むようになっていた

アドレス演算子もあって
auto a, b; /* 型の概念がないので記憶クラスだけ */
a = &b; /* bとして使っているメモリのアドレスを取得 */
*a = 1; /* bに1を代入 */

つまり、おまえさんの言うように整数変数を
そのままアドレスの表現に使っていた
675デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:42:43.01ID:UePpwGnn0
なるほど ありがとうございました
2017/10/13(金) 12:46:55.16ID:DPD6/A6xM
>>672
そんなものはコンパイラ次第で変わる
定数でアドレス取ってなきゃ実体を生成しないとか普通にあるし
2017/10/13(金) 12:48:21.81ID:y6HLA65k0
機械語に翻訳されるかどうかは
それまでの文意や環境(特に最適化)次第だもんな
678デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:49:08.21ID:UePpwGnn0
ちょっとお尋ねします
ベテランとお見受けする方は

/*    */ 
↑コメントにこれつかいますけど

//
↑何故これつかわないんですか?
なにかしらトラブルの元になったりするんですか?
679デフォルトの名無しさん (ワッチョイ 79be-HijE)
垢版 |
2017/10/13(金) 12:49:26.38ID:Xi3f71oh0
すげえややこしいな
コンパイラ作りたくなってきた
2017/10/13(金) 13:06:01.52ID:QZe0YwYUM
>>678
C99準拠を仮定できないなら前者を使わざるをえない
複数行をコメントする場合や文の途中をコメントする場合は基本的に前者を使う
行の後半にコメントを書く場合は両方使う
681デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 13:09:27.27ID:UePpwGnn0
おおおおおお
ありがとうございます
なるほどねー
そういうことですか
682デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/13(金) 14:53:58.16ID:yVfJQeWEp
//は、文字コード特有のバグがあってだな。
683デフォルトの名無しさん (ワッチョイ 0b3f-MWTH)
垢版 |
2017/10/13(金) 15:14:34.29ID:/fw1jTt60
>>678
1行コメントならもちろん//を使うが
コメントが2行以上になる可能性が否定できない場合、
毎行いちいち//が必要なのは面倒なので
/*
*/
と折り返す恰好にする

それと1行コメントは内容的に馬鹿っぽくなりやすい
なんて気持ちもちょっとある
684デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 16:31:54.32ID:UePpwGnn0
C99非準拠の環境って工場のメンテとかそんな感じっすかね
685デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 16:50:15.81ID:UePpwGnn0
>>682
も気になるな

アスキーコード "2F2F"って何かあるんですか?
2017/10/13(金) 17:10:14.68ID:51NkmwHu0
emacsだとコメントリージョンは/*になるからだろうな。
2017/10/13(金) 17:23:15.84ID:kwktlkZb0
>>682 の話は行の最後に \ があると次の行に継続するってやつかな。
その言語仕様と Shift-JIS の特定文字との組み合わせで問題が起きる。
「表」や「能」は文末に来る可能性が高い字でしょ。
2017/10/13(金) 17:26:39.84ID:KnON5zi30
いまどき shift jis ですか?
2017/10/13(金) 17:37:27.25ID:nzA1z5Pk0
苦Cで勉強してるけど文字列がよくわからん
あれいる?
2017/10/13(金) 17:43:15.33ID:KnON5zi30
>>689
どれだ?
2017/10/13(金) 17:43:35.67ID:z3X0WVAY0
ただの\0終端の文字型の配列を便宜的に文字列と呼んでいるだけ
2017/10/13(金) 17:52:09.39ID:nzA1z5Pk0
文字列処理関数
わざわざ配列に文字列入れる意味あるのか?
2017/10/13(金) 17:56:53.82ID:KnON5zi30
>>692
https://9cguide.appspot.com/14-03.html
か?
入力に scanf() 系を薦めているのは古い(fgets() を使うべき)とか問題はあるが、
内容は基本的で絶対に必要なものだ
C には「文字列型」はなく文字型の配列で扱うのは基本的な了解事項だ
2017/10/13(金) 18:02:19.89ID:nzA1z5Pk0
>>693
それ
結構重要なんだな
atoi型とかもよくわからんが
2017/10/13(金) 18:05:48.92ID:1QR3MvqoM
>>692
入れないと文字処理何もできないよ
2017/10/13(金) 18:06:49.21ID:KnON5zi30
>>694
atoi() は文字列の表現からint型に収まる表現に変換するもの
C では "123" と 123 を厳密に区別する
2017/10/13(金) 18:07:38.35ID:nzA1z5Pk0
わざわざ配列でやるのってprintfじゃ上書きできないから?
2017/10/13(金) 18:09:43.61ID:KnON5zi30
sprintf() というものはある
2017/10/13(金) 18:26:23.09ID:D1RCmTnA0
atoi は 文字列から数値へ変換する方向
(s)printf は 数値から文字列に変換する方向
2017/10/13(金) 18:46:00.32ID:nzA1z5Pk0
すまんよくわからん
まぁ配列の重要性はわかったけどさ
2017/10/13(金) 19:47:45.81ID:9FeTZoAH0
入力して下さい ?
? の二倍は---
っての作りたい
702デフォルトの名無しさん (ワッチョイ 0b3f-MWTH)
垢版 |
2017/10/13(金) 19:53:08.82ID:/fw1jTt60
またfgets厨が湧いたか
Cスレには付きものだが
誰が吹き込んでるんだかしつこさが異常なんだよな
まったく
703デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/13(金) 20:16:18.00ID:qDJA92iZ6
>>701
/* -*- C -*- */

#include <stdio.h>

int main()
{
int input;
scanf("入力して下さい:%d", &input);
printf("%dの二倍は%d\n", input, input * 2);
return 0;
}
2017/10/13(金) 20:21:21.47ID:KnON5zi30
>>702
fgets() の方が総合的にすぐれていると思うのだが
705デフォルトの名無しさん (ワッチョイ 0b3f-MWTH)
垢版 |
2017/10/13(金) 21:08:48.11ID:/fw1jTt60
何がどのように何に対して優れているんだ?
腐っても工学者たるもの客観的で再検証可能な主張をしてみな
2017/10/13(金) 21:11:50.63ID:D1RCmTnA0
>>703
scanf はメッセージを出力したうえで値を受け取る関数じゃないんだ 残念ながら
707デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/13(金) 21:17:30.86ID:yVfJQeWEp
え?scanfは、この通り打ち込まないと認識しないよって事だろ?
2017/10/13(金) 21:20:10.60ID:D1RCmTnA0
>>701 のは 入力して下さい も含めて入力を要求してたのか
こりゃ失礼
709デフォルトの名無しさん (ワッチョイ 5975-HijE)
垢版 |
2017/10/13(金) 21:31:55.79ID:DZqiVJRN0
>>706
dクス
2017/10/13(金) 21:37:13.63ID:aO55acrud
>>701
#include <stdio.h>
int main(void)
{
int n;
char buf[32];
printf("入力して下さい:");
fgets(buf, sizeof(buf), stdin);
n = atoi(buf);
printf("%dの二倍は%d\n", n, n * 2);
return 0;
}
2017/10/13(金) 21:39:30.87ID:KnON5zi30
>>705
scanf() はバッファオーバーランの温床
scanf("%s"); と何気なく書いてしまうとアウト
最初からバッファサイズを意識しなければならない fgets() の方が教育的
2017/10/13(金) 22:15:45.85ID:xDZ8VANT0
それ都市伝説だから、単に使い方間違えてるだけだから!
フィールド幅をちゃんと指定すればscanf系でも安全だよ?

まぁ、エラーメッセージの都合上fgets使うかもだけど。。。
2017/10/13(金) 22:16:23.56ID:HDAg9FRW0
gets_s()やscanf_s()を使えば済む話に思えるが
2017/10/13(金) 22:20:11.49ID:vlU7OwXLM
言いたいことは分かるなぁ
printfだって使い方間違えればフォーマットストリングで死ぬしな
2017/10/13(金) 22:28:05.05ID:KnON5zi30
>>712
そのフィールド幅の設定にマクロを使って指定できない,ハードコーディングの形になってしまう
これでは確保側との連携が取れない
716デフォルトの名無しさん (ワッチョイ 1387-NqOW)
垢版 |
2017/10/13(金) 22:31:22.01ID:KDt3KwS+0
C言語はアセンブラのラッパー言語だから、そう言うもんは各自が気を付ければいいのであって、へんな関数量産すんな。
717デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/14(土) 04:50:34.97ID:rkGKts9o0
scanf() は POSIX.1-2008 で m という修飾子が規定されてだな・・・
https://paiza.io/projects/que1l9qus5fMStBgkGgF9w
2017/10/14(土) 05:25:15.07ID:G4fIdpwa0
m修飾子はscanf()の中でバッファの確保とポインタ代入をしてくれる、か。
使用者側がバッファを用意して容量はこれだけ、と言明するのとはちと違うね。

実用だと書式文字列をsnprintf()か何かで生成する手かなぁ。
2017/10/14(土) 06:38:32.00ID:qjmLCkqj0
実用なら動的確保で問題ねーだろ
720デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/14(土) 06:44:41.93ID:YpZiBRe40
>>718
文字数制限したい場合は %3mc のように c を使うとできる。メモリ確保は相変わらず scanf() 側でやるので後で free() が必要であることには変わりがないが。
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/scanf.3.html
721デフォルトの名無しさん (ワッチョイ 0bf0-MWTH)
垢版 |
2017/10/14(土) 07:16:53.80ID:F19RwFTi0
>>711
くだらんなあ
%sのためにわざわざscanfなんぞ使う珍獣の話しかできんのかおまえは
2017/10/14(土) 09:37:54.97ID:wj7CJkun0
>>721
この話の発端のとあるC教育サイト
https://9cguide.appspot.com/14-03.html
では
scanf("%s");
を使っちまっている
珍獣というほどのものではないのでは?
禁じ手をやってしまう scanf() は悪
2017/10/14(土) 12:38:59.99ID:wj7CJkun0
>>720
所有権をうんぬんするようなところ、たとえば malloc() したところで free() する、という教義のもとでは使うのに抵抗があるかもしれない、
win32api などはそんなかんじ
2017/10/14(土) 12:40:09.00ID:kY4tNrcHd
>>723
教義という表現に込められたいやらしさ
2017/10/14(土) 12:41:35.66ID:qjmLCkqj0
>>723
windowsならscanf_s使え、posixならm修飾使えで解決ってことだな
726デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/14(土) 13:41:17.27ID:YpZiBRe40
windowsの方でもscanf()のmあるのでは?
2017/10/14(土) 14:15:25.78ID:qjmLCkqj0
なんでposix拡張があると思うの?
2017/10/14(土) 14:56:12.00ID:VRAn8B+V0
配列って[]だったら自力でEOS入れなきゃいけないけど[]の中に数字入れると自動で入るの?
2017/10/14(土) 15:53:03.38ID:wj7CJkun0
>>728
逆だ
数字いれると自分で \0 を入れないといけない
数字がない場合は、\0 を自力で書かなくとも良い
2017/10/14(土) 15:58:39.20ID:pEkiZp92a
[迷信] scanf ではバッファオーバーランを防げない
http://www.kijineko.co.jp/tech/superstitions/buffer-overrun-of-scanf.html
[迷信] scanf でキーボードから入力
http://www.kijineko.co.jp/tech/superstitions/input-from-keyboard-by-scanf.html
731デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 15:59:02.19ID:bKRFV+pB0
はい ちょっとお邪魔しますよ
ISR() signal() の違いについて
どちらを使うべきなのか うんちくきぼんぬですよ
732デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 16:17:48.14ID:bKRFV+pB0
↑割り込みハンドラで使う関数についての質問です
733デフォルトの名無しさん (ワッチョイ 1387-NqOW)
垢版 |
2017/10/14(土) 16:24:17.93ID:J5VLsuMb0
組み込み系だとmallocなんか初期化関数ん中でしか使わない。
2017/10/14(土) 16:32:11.89ID:qjmLCkqj0
>>731
AVR libc独自か、規格で定められているかの違い
環境が限定されるならISRで良い
735デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 16:42:09.10ID:bKRFV+pB0
なるほど! ありがとうございました
2017/10/14(土) 16:57:24.91ID:/3exgnU7M
>>731
環境わからんけどavrならISR()推奨
http://avrwiki.osdn.jp/cgi-bin/wiki.cgi?page=%B3%E4%A4%EA%B9%FE%A4%DF
737デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 17:13:04.55ID:bKRFV+pB0
割り込みにまさかの独自ライブラリがあるとは思わなかった
>>736の参照先見ると色々なアトリビュートが設定できるようになっとるわw
その内容をみると自前で割り込み関係のレジスタ叩けば実現可能な機能ばかり
##pop/push/reti自動付加禁止だけはsignal()では実現不能?
signalでよさそうな気が。。。
2017/10/14(土) 17:25:11.34ID:qjmLCkqj0
ANSI Cのsignalじゃなくて、AVR拡張のSIGNALのこと言ってたの?
なら、manualでSIGNALじゃなくてISR使えってなってるよ
違いも、属性指定できるかどうかだけ

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html#ga67cd0dea412157775c2f2a3ffe9fb8ff
739デフォルトの名無しさん (ワッチョイ 0bf0-MWTH)
垢版 |
2017/10/14(土) 19:42:35.98ID:F19RwFTi0
>>722
他には?
珍獣でないと主張するにはnが小さすぎるぜ
その小さすぎるnでどうたら言っちゃうおまえ
自らへの死刑宣告を読み上げている自覚はあるのか?
740デフォルトの名無しさん (ワッチョイ 79b3-dPak)
垢版 |
2017/10/14(土) 19:59:48.25ID:4XKuJznc0
クッサ
2017/10/15(日) 02:10:37.75ID:12RNBD+40
>>739
https://qiita.com/Tsutajiro/items/a5620b17ac530cc96e87
https://ja.wikipedia.org/wiki/Scanf
http://www9.plala.or.jp/sgwr-t/c/sec05.html
http://rainbow.pc.uec.ac.jp/edu/program/b1/Ex2-1b.htm
https://stackoverflow.com/questions/2155518/what-is-scanfs-and-scanfd-format-identifiers

「scanf("%s"」とグルるだけで、バッファオーバーランの危険がある注記のない上記記事が山のようにでてくる。
おすきなだけどうぞ、このように説明の手間を省きおざなりに scanf("%s") としてその場をとりつくろい、
読んだ人間は経験が少ないため、これでもいいのか、と勘違いしてしまう例は多々ある

scanf() は悪
やるんなら、fgets() してから sscanf() だの atoi() だの strtol() だので処理するのが定石
742デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/15(日) 04:40:36.84ID:aLoOQk2A0
>>727
てか、C言語のライブラリの問題なのであるともないとも言えるよな。
POSIX準拠でないCコンパイラでも同じ動きをするライブラリをリンク時または実行時にリンクするならそう動くわけだし。
WindowsでもGCCでコンパイルするならそうなるわけだし。Cygwinの中ならなおのことそうだ。
743デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/15(日) 05:29:35.87ID:ZgJv24or0
そう言えば fgets() も1行の長さが指定した長さ以上になった場合に入力に残るよな。
で、だいたいは妙に長いバッファ用意して誤魔化す(またはそういう仕様にするw)わけだが、
そういうのが通用しない場合はそれを上回る入力をされた時にエラーにするかまたは入力に
残った不要な文字列を捨てる処理はあった方が良い。そうでないなら GCC の getline() を
使うかまたは自作するかだ。
2017/10/15(日) 06:22:39.79ID:12RNBD+40
>>743
昔宿題スレで作ったけれども忘れてしまった,まあ誰しも一回はつくるものじゃないかな
2017/10/15(日) 07:05:24.20ID:KCBqed/H0
>>743
> そう言えば fgets() も1行の長さが指定した長さ以上になった場合に入力に残るよな。
当たり前だろ
より長い入力が想定されるなら普通に改行がでてくるまで続けて読めばいいだけだし
妙に長いバッファとかアホすぎる w
746名無し@キムチ (ワッチョイ 09b3-Qarq)
垢版 |
2017/10/15(日) 08:51:39.88ID:kjrLb6gv0
フィギュアスケートアニメーション作成ソフト「振付王」公開!!

ダウンロード↓
http://www.vector.co.jp/soft/winnt/game/se516681.html
デモ動画↓
http://youtu.be/j8KjRXr7zGs
747デフォルトの名無しさん (ワッチョイ 0102-MWTH)
垢版 |
2017/10/15(日) 09:47:59.48ID:J//jr+AC0
はははは、やっとn=6か
で、%sさえ使わなきゃscanfは安全なのか?
748デフォルトの名無しさん (ワッチョイ 0102-MWTH)
垢版 |
2017/10/15(日) 09:48:32.63ID:J//jr+AC0
>>741
>>747
2017/10/15(日) 10:01:56.35ID:12RNBD+40
>>747
>はははは、やっとn=6か
いくらでも増やせますが

>で、%sさえ使わなきゃscanfは安全なのか?
fgets() 推しの俺にきかれても,そんなことはわからない‥(困惑)
2017/10/15(日) 10:17:19.28ID:2VM8B8DT0
%sの危険性を長々と説明しているwikipediaを挙げてるんだからギャグのつもりだろ
stackoverflowも%sではなく%*sだし、scanf使ったことないのかな?
751デフォルトの名無しさん (ワッチョイ d1c7-MWTH)
垢版 |
2017/10/15(日) 13:38:38.59ID:R4tP3Q0h0
>>749
わからないだと?
おまえシッタカこいてただけか

まあそうだろうな、%s以外に言及できないようだから
2017/10/15(日) 14:19:43.64ID:12RNBD+40
>>751
fgets()でとりあえず読み込むのは有力な方針だからね、まあsscanf() を後段で使うことはあるね
scanf() のチマチマした書式は必要時に追いかければいい、今調べる必要はないと思うね

>シッタカ
大局観といってほしいね
753デフォルトの名無しさん (ワッチョイ 794b-dPak)
垢版 |
2017/10/15(日) 17:10:16.88ID:/ln1Xcyy0
scanf vs fgets
もう終わり?
754デフォルトの名無しさん (ワッチョイ e9c6-BSx0)
垢版 |
2017/10/15(日) 17:14:39.09ID:Yk/ODCzd0
くだらん戦いだ
2017/10/15(日) 17:27:36.97ID:12RNBD+40
あおりネタがなくてごめん…
756デフォルトの名無しさん (ワッチョイ d108-MWTH)
垢版 |
2017/10/15(日) 19:51:17.65ID:DZC0OlhV0
>>753
終わりつーか始まってない
そもそもscanfを把握してない御仁とでは話にならなくて
2017/10/15(日) 20:51:34.80ID:12RNBD+40
scanf() の詳細仕様を把握しないと判断できない、というのはどうかな?
scanf() が初期のころから建て増し建て増しでどんどん増えていったあの方向性は、正しくない複雑化のしかただと思うよ
scanf() を書く側にたってみると、おぞましい
758デフォルトの名無しさん (ワッチョイ e9c6-BSx0)
垢版 |
2017/10/15(日) 21:09:03.11ID:Yk/ODCzd0
scanf()
scanf()
scanf()
scanf()
scanf()
759デフォルトの名無しさん (ワッチョイ 530f-GDEj)
垢版 |
2017/10/15(日) 21:13:13.74ID:Y+x8OcED0
超ド級初心者なんだけどおすすめの開発環境とかある?
2017/10/15(日) 21:14:17.56ID:3VVV/TO4d
>>759
Visual Studio 2017。デバッグが簡単で分かりやすい。
761デフォルトの名無しさん (ワッチョイ 530f-GDEj)
垢版 |
2017/10/15(日) 21:17:59.72ID:Y+x8OcED0
vs2017コンパイルの仕方がわからなかった(´・ω:;.:...
2017/10/15(日) 21:20:39.95ID:3VVV/TO4d
>>761
プロジェクトにソースファイルを追加して、デバッグメニューからビルドを選ぶだけだぜ。
763デフォルトの名無しさん (ワッチョイ 530f-GDEj)
垢版 |
2017/10/15(日) 21:22:30.69ID:Y+x8OcED0
ビルド押したんだけど反応がなかったんだ・・・
もっかい調べなおしてみる
ありがとう
764デフォルトの名無しさん (ワッチョイ d108-MWTH)
垢版 |
2017/10/15(日) 21:51:37.18ID:DZC0OlhV0
>>757
建て増しする前の単純な仕様のscanfでさえ
%sしか攻撃できない空っぽ脳みそと
どうやってコミュしろというのか教えてくれ
765デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/15(日) 21:56:59.72ID:kn6M0KEM0
>>763
プロジェクト作成しないとビルドできない
2017/10/15(日) 22:38:21.05ID:kUtdNYE20
開発環境はvim+gccだろ?
767デフォルトの名無しさん (ワッチョイ fbe7-ceAT)
垢版 |
2017/10/16(月) 05:28:44.80ID:6Nh3McCV0
C言語知ってたらC++簡単に扱える?
2017/10/16(月) 05:48:39.32ID:imM7X4iq0
基本的に別の言語
2017/10/16(月) 06:10:08.45ID:00rzJKO2d
vs2017ならフォルダを開くで
勝手にプロジェクトが作られるんじゃなかったかな
2017/10/16(月) 06:35:40.79ID:IzFutT5/0
開発環境はvim+gcc、そしてmakeだな。

人に勧めようとは思わないけどね。
771デフォルトの名無しさん (ワッチョイ fbe7-ceAT)
垢版 |
2017/10/16(月) 06:42:19.28ID:6Nh3McCV0
まあ入出力でCとC++で違うのは解ってたけど本読んで書いてあったのはC++で書いて動かなかったら
最悪Cで書けば動かせるということは書いてあったな
772デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/16(月) 11:15:45.26ID:tZR41NVXp
つか、コマンドラインアプリで文字列受け取るのは、実行時引数だけで充分だろ。
2017/10/16(月) 13:10:18.09ID:IgMp2p2X0
パイプやリダイレクト
774デフォルトの名無しさん (ワッチョイ 09b3-NqOW)
垢版 |
2017/10/16(月) 14:21:36.48ID:JrEYnkdn0
対話型ツールなら、きちんと入力解析エンジン載せれや。
なんだよscanfってw
2017/10/16(月) 14:22:15.72ID:QsDGIdoW0
gccのワーニングで、「declared inside parameter list」これを無視したいです。
-Wではじまるオプションはなにを指定すればよろしいですか?

#pragma GCC diagnostic ignored "-W???
2017/10/16(月) 14:30:52.70ID:XYyvKIYbd
>>775
[enabled by default]と書いてあるだろ? この警告はフラグで消せない。アホなコードを直すしかない。
2017/10/16(月) 14:47:20.37ID:QsDGIdoW0
>>776
フラグ以外での除去方法もないのでしょうか?
大量にでるために困っています
2017/10/16(月) 14:50:42.52ID:XYyvKIYbd
>>777
警告は、引数リストの外側で必要なものを宣言すべきという意味だ。
2017/10/16(月) 14:55:55.53ID:IgMp2p2X0
https://ideone.com/91sohX
へぇ 構造体のポインタだし通しそうだけど警告出す仕様なのか
(3行目 実体は不明だけど構造体のポインタを受け取るぞ宣言で警告)
2017/10/16(月) 14:58:01.40ID:rvbv2fod0
>>775
gcc -w
2017/10/16(月) 14:58:20.84ID:XYyvKIYbd
関数の前にstruct aho;とでも書いておけ。
782デフォルトの名無しさん (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 15:04:51.05ID:QsDGIdoW0
>>778
原因はわかっています。
構造体宣言を別のヘッダーで行っているにもかかわらず、
プロトタイプ宣言しているヘッダーより上に定義がないのが原因です

>>780
gcc -w ?
#pragma GCC diagnostic ignored "-w" でしょうか?
2017/10/16(月) 15:09:07.34ID:IgMp2p2X0
本当の定義じゃなくて 仮定義を前に置くだけで消えるのな
struct foo;
void func(struct foo* arg);
784sage (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 15:25:30.24ID:QsDGIdoW0
>>783
やはりそのように潰していくしかないのでしょうね。
2017/10/16(月) 15:43:34.17ID:rvbv2fod0
>>782
-Wで始まるオプション名は無いので無視するにはコマンドラインで-wを指定するしかない
786デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/16(月) 22:46:04.81ID:snZUUJVe0
>>784
いや、てか、そのヘッダ書き換えられないのか?
787デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/16(月) 22:49:48.00ID:tZR41NVXp
自身のポインタを構造体に宣言するのと同じ様に書けよ。
2017/10/16(月) 23:21:23.22ID:7Byc8Q4r0
>>767
C 高級アセンブラ
++ ハナモゲラ
789デフォルトの名無しさん (ワッチョイ 09b3-XdBn)
垢版 |
2017/10/17(火) 20:18:22.83ID:Q3d5MYhb0
とりあえず勉強の成果として作ってみたら失敗した
なんでだ

#include <stdio.h>

int main(void)
{
int hyoji;
int kakikomi;
printf("階乗の表示:");
scanf("%d\n",&kakikomi);
for (hyoji = 1;kakikomi > 0;kakikomi--) {
hyoji = hyoji * kakikomi;
}
printf("結果は%dです", hyoji);

fflush(stdin);
getchar();

return 0;

}
790デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/17(火) 20:29:18.04ID:FJCAd6676
>>789
scanfのところの\nって要らなくね
791デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/17(火) 20:54:03.89ID:Usq7nzejp
こんなすぐに桁溢れしちまう様なサンプル作ったら、何を試したいのかわからんだろ。
2017/10/17(火) 21:06:51.02ID:BSHBGdow0
しかしてfor文の中身を見るに全くの素人じゃあないな
793デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 21:08:48.81ID:Q3d5MYhb0
>>790
消したら動いた
ありがとう
2017/10/17(火) 21:24:15.93ID:0jVjcAN80
>>792
どのあたりが?
795デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/17(火) 21:33:12.55ID:Usq7nzejp
初期化をあんなとこに書いたらコーディング規約で叩かれるしなぁ〜
2017/10/17(火) 21:46:54.15ID:fHKaWaxJM
>>794
forのカッコ内には同じ変数しか書いちゃダメって思ってる初心者はいるかも
個人的には変数名からCOBOLer疑惑の方が強い気がする
797デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 21:57:54.65ID:Q3d5MYhb0
VS2017でやってるんだがさっき作ったプログラムを保存して別のファイルで勉強を再開しようとして新しくファイルを作ったんだ
そしてテストも兼ねてさっきのプログラムコピペしたら
プリコンパイルヘッダーを検索中に不明なEOFが見つかりました。
'#include"stdafx.h"をソースに追加しましたか?
と出た
さっきは何もなかったのに
798デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 22:19:31.03ID:PpmRGT3a0
>>797
それな
よく分からんけど空のプロジェクトってやつでプロジェクト作って自分でソースファイル作成すれば出てこない
まあ詳しい人が教えてくれるかも
2017/10/17(火) 22:26:24.33ID:/2LkUivAd
>>797
プリコンパイルヘッダーというのは、プロジェクト内のヘッダーを事前にまとめてコンパイルしてビルドを早くする仕組みのことだ。
通常、stdafx.hというヘッダーにプロジェクトで使うヘッダーをまとめる。
一つ一つのソースファイルごとのプロパティでプリコンパイルヘッダーを作成するか、使用するかを設定できる。
800デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:30:05.39ID:Q3d5MYhb0
>>799
つまり…どういうことだってばよ
801デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:35:56.33ID:Q3d5MYhb0
ソースコード関係の知識は苦Cやらで積めるけどソフトやらの知識はどこで積むんだ
2017/10/17(火) 22:36:28.37ID:/2LkUivAd
プリコンパイルヘッダーを使用するのであれば、プロジェクト内のどこかのソースファイル(例えばstdafx.cpp)を使って、プリコンパイルヘッダーを作成しないといけない。
あるソースファイルにおいてプリコンパイルヘッダーを使用するのであれば、プリコンパイル対象のヘッダーを#includeして、そのソースファイルがプリコンパイルヘッダーを使用することを設定する。
プリコンパイルヘッダーを使用しないなら、すべてのソースのプロパティでプリコンパイルヘッダーを使用しないように設定する(空のプロジェクトの規定値)。
2017/10/17(火) 22:39:12.15ID:/2LkUivAd
ソースファイルが二、三個なら、とくにプリコンパイルヘッダーは、必要ない。
2017/10/17(火) 22:43:34.43ID:kMB04QqG0
>>800
おとなしく>>798の言う通りにしろってこと
2017/10/17(火) 22:44:21.68ID:/2LkUivAd
ソースファイルのプロパティは、IDE内のソースファイルのアイコンを右クリックして「プロパティ」を選ぶと設定できる。
806デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:59:14.26ID:Q3d5MYhb0
>>804
とりあえず空のファイルは作れたけどソースが書けん
807デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:01:36.30ID:PpmRGT3a0
新しいプロジェクト

空のプロジェクトを作成

空のソースコードファイルを追加

>>789をコピペ

実行
808デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 23:02:26.49ID:Q3d5MYhb0
>>807
空のソースコードファイルどうやって作るんだ
809デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:08:36.86ID:PpmRGT3a0
>>808
プロジェクト開いたときの右にあるソリューションエクスプローラの中のソースファイルというフォルダを右クリックして「追加」から「新しい項目」をクリック。
「C++ファイル」を選択した状態でファイル名の拡張子を.cに変えて「追加」ボタンを押す。
810デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 23:15:28.33ID:Q3d5MYhb0
>>809
できた
もしこれから新しくファイルを作る場合はこれを一からやるのか?
2017/10/17(火) 23:17:42.23ID:nwT4mK5H0
そろそろ適切なスレに移動しようか
812デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:18:59.07ID:PpmRGT3a0
>>810
うん。
簡単なプログラムならVSでプロジェクト作るよりもスタートメニューのVSのフォルダの中にある開発者コマンドプロンプト使ってclコマンドでコンパイルした方が手軽だな
813デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 23:21:25.70ID:Q3d5MYhb0
>>812
ありがとう
これ以上はスレチだからやめておこう
814デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:46:56.11ID:PpmRGT3a0
スレチかもしれないけどVS2017でANSI C(C99/98, ブロック先頭でしか宣言できないやつ)だけしかかけないようにできますか?
815デフォルトの名無しさん (ワッチョイ 7985-BSx0)
垢版 |
2017/10/18(水) 18:18:50.69ID:oOtBC3bP0
みなさんは関数名の後に続く中括弧の前に改行を入れますか?入れませんか?

例えば、
int main(void) {
  /* 処理 */
}
のようにするか、

int main(void)
{
  /* 処理 */
}
のように書くのか、どちらが多いのか気になります。
816デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/18(水) 18:20:58.46ID:M3PcmRrI6
入れます
2017/10/18(水) 19:40:16.86ID:3bYwz/rX0
if ()
{
}
ならいいけど
for () {
}
だと整合性無いじゃん
って話なら気にするな
だな
818デフォルトの名無しさん (ササクッテロラ Sp45-NqOW)
垢版 |
2017/10/18(水) 21:12:51.09ID:QINtBhkfp
各社のコーディング規約に合わせます。
2017/10/18(水) 21:18:46.08ID:lHCL+31VM
>>815
>>604
820デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/18(水) 23:24:47.06ID:bG8m3FQp0
>>815
改行入れるね。

なんでそうなったかというと、C言語は昔は引数の型をカッコ内に書けなかった。つまり

int main(argc, argv)
int argc;
char *argv[];
{
 ・
 ・
 ・

 return 0;
}

のようにしか書けなかった。その当時から覚え始めたというのと、K&R もそれで書いて
あったのでそのまま何も考えず俺の中で改行入れるのが定着した。
821デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/19(木) 01:30:41.79ID:gvKdwGxW0
for()
{

}
こうしたときに一行増えるから嫌だだっていう人が多そうだな
2017/10/19(木) 07:54:32.06ID:b5KBJ9M60
それは宗教問題なので決着は付きません。
2017/10/19(木) 09:08:44.46ID:TosC+FXp0
関数では改行して、制御構文では改行しない
みたいなオレルールにしてる
824デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/19(木) 10:07:41.47ID:+lKpulfRp
c#みたいにメソッドを直接鉤括弧内にベタ書き出来る言語でもなけりゃ先行改行一択なんだがなあ
825デフォルトの名無しさん (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/19(木) 10:25:15.32ID:r/pcyA6+0
貴重な一行
826デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/19(木) 10:27:21.64ID:SxBqlyg46
>>824
どういう意味?
2017/10/19(木) 11:44:04.67ID:zAbDVwTYM
今みたいに時間単価での清算が主流になる前は、
ステップ単価清算ってのもあって、K&R以外で書くと
増量しているって言われていたの。

cb とか indent なんてコマンドはその名残かな
2017/10/19(木) 12:07:16.71ID:TosC+FXp0
>>826
無名関数が書けると最初の { 前の改行がおかしい気になるので
自動的に改行入れない派になるという話では?
2017/10/19(木) 12:17:59.77ID:rxi99hG50
>>823
俺もそれで落ち着いた
830デフォルトの名無しさん (ブーイモ MM71-v1IO)
垢版 |
2017/10/19(木) 12:34:12.75ID:LAmWAPnYM
>>815
統計取る方法がないから、確実な答えはわからないと思うよ。
で、戦争のたびに出る結論が「気にするな」「仕事環境に従え」なんだよねー。

で、俺はどうかと言うと、俺も不思議と>>823に落ち着いた。
2017/10/19(木) 14:41:51.95ID:cxE3kH8I0
https://ja.wikipedia.org/wiki/字下げスタイル
戦争だ
832デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:33:33.89ID:PsgLgPWo0
http://9cguide.appspot.com/15-05.html
これのモードの切り替えってところで判定結果違うんだが俺だけ?
pがでたらめな数字になる
コピペしても変わらなかったから多分タイプミスとかじゃないと思う
2017/10/19(木) 15:40:34.18ID:cxE3kH8I0
下の[実行結果] のように出力されるためには

× printf("p = %d\n",p);
○ printf("*p = %d\n",*p);

でないとな
834デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:50:26.60ID:PsgLgPWo0
できた
ありがとう
835デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/19(木) 22:50:52.77ID:4jVxr5CI0
10 1
scanf("%d%d", a, b);
こう読み込んだ時に空白を飛び越えて読み込んでくれるん?
10,1
この時はエラーになっちゃう?
836デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/19(木) 22:53:39.25ID:Y4NllfOF0
多分空白はできる
,を入れたかったら%d,%dすれば多分できる
2017/10/19(木) 23:25:36.20ID:6TDKNKTM0
scanfのフォーマット指定は面倒だぞ
正直使いこなす気すらない
2017/10/19(木) 23:26:22.86ID:6TDKNKTM0
if ()
{
}
else
{
}
無いわな
2017/10/19(木) 23:41:36.02ID:c1L92+Tr0
if () {

}
else {

}

このフォーマットだと心が平和
2017/10/19(木) 23:52:20.12ID:vx5pXf0B0
>>828
うん、さっぱり分からん
そもそも鉤括弧って「」だし。
841デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/20(金) 00:41:34.11ID:Wby94Fq80
>>837
入力が決められてなかったらscanfじゃあできないからわかるわー
2017/10/20(金) 01:19:37.06ID:l11teSHI0
>>839
俺もそれ
2017/10/20(金) 04:37:42.47ID:yDlUYSKqd
>>827
バージョン管理、コーティング規約対応用だろ

空白文字の使い方に無頓着なカスが存在する限り必須
844デフォルトの名無しさん (エーイモ SE7a-5x7G)
垢版 |
2017/10/20(金) 09:24:11.93ID:NCAWbF0uE
本買うお金がないのですが公式なドキュメントってどこで見れますかね?
845デフォルトの名無しさん (ワッチョイ ddb3-0MKJ)
垢版 |
2017/10/20(金) 09:53:04.65ID:VprmOZRL0
>>1に書いてあるのではだめなん。
2017/10/20(金) 09:58:32.79ID:rxHA3C970
質問が漠然としすぎてる。
847デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:55:02.73ID:7oD3lqB2p
C言語の仕様は規格が決まってるから、調べれば幾らでもネットに落ちてるんだがなぁ〜
848デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:56:41.44ID:7oD3lqB2p
ランタイムライブラリやプラグマやデファインの事なら使ってるコンパイラにドキュメントがあるだろ?
849デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:36:54.91ID:XMzxe3/+0
ネスティングを気にするかどうかは各自のスタイルによる
気にならない書き方はいくらでもできるし
ファイル分割がいやでべた書きする奴はネスティング気にするだろ
850デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/20(金) 12:40:39.31ID:3KJGg1dF6
どう思う?


#include <stdio.h>

void test(a, b, c)
int *a;
int *b;
int *c;
{
*c = *a + *b;
}

int main(void)
{
auto register int a;
auto register int b;
auto register int result;

a = 10;
b = 32;
test(&a, &b, &result);

printf("%d + %d = %d\n", a, b, result);
return 0;
}
851デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:43:18.91ID:XMzxe3/+0
ネスティングが浅い記述しか書かない奴にとってはどうでも良い案件なんですよ
技術計算を多用するコード例だとネスティングちゃんとしないと分けがわからなくなる
852デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 17:02:28.07ID:Hcn/q6HeM
なんで配列の要素数って省略してもいいのですか?
2017/10/20(金) 17:49:45.76ID:vESwnO6R0
>>852 どの場面での話かな?
2017/10/20(金) 17:51:51.23ID:w9jbL0YF0
>>852
コンパイラは要素数を数えられるから
(要素数を数えられない場合は省略できない)
855デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 17:57:17.39ID:7oD3lqB2p
配列は何次元でも扱える代わりに中身の管理は利用者に一任されたんだ。
856デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 18:16:01.46ID:Hcn/q6HeM
>>853
配列の宣言の時です。
省略してはいけないのはどういう場面ですか?
857デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/20(金) 18:42:47.35ID:3KJGg1dF6
>>856
初期化無しの宣言とか?
2017/10/20(金) 20:01:48.14ID:l11teSHI0
>>856
× int ary[];
○ int ary[] = {1,2,3};
2017/10/21(土) 02:37:55.69ID:xu+p9cdr0
>>850
どうも思わない。

ま、 register はコンパイラが無視するんだろうな。
2017/10/21(土) 07:38:47.06ID:KIdTQfIK0
>>850 すごく… 古くさいです…

それはともかく register 宣言した変数は
アドレス取ろうとした時点でコンパイルエラーじゃなかったかな?
あと俺の環境では auto と register の同時指定がダメと言われる。

古いコンパイラだとどっちも許されるんだっけ。
2017/10/21(土) 08:06:44.87ID:Q5TWqxQz0
実装は知らんが、言語仕様だと昔からstorage classの指定は1つだけ
2017/10/21(土) 08:49:05.01ID:TZDyO3Kt0
registerは可能ならばレジスタに割り当てると言う意味なので、アドレス演算子を使えばレジスタに割り当てられない
利用可能なレジスタ数を超えてregisterが使われうる可能性を考えれば明らか
autoとも併用できないし、半可通としか言いようがない
2017/10/21(土) 09:07:38.36ID:1UmE9CdHM
>>862
それC++限定じゃね?
2017/10/21(土) 09:44:36.79ID:TZDyO3Kt0
>>863
言いがかりをつけたいなら「規格書のxxにこう書いてある」と調べてからつけろ
2017/10/21(土) 09:55:57.60ID:fkuXV6f/0
C++のautoは別の話
2017/10/21(土) 10:41:15.21ID:1UmE9CdHM
>>862
の前半、register変数のアドレスを取ろうとすると
gccもclangもエラーになるけど、これは規格違反と?
2017/10/21(土) 10:46:45.41ID:KlHNvq3I0
仕事で5年くらいMATLABやってたけど来月からC言語やらなあかん
難しそうで、もうイヤイヤ期よ

C なんて10年くらい前に大学の講義でチョロチョロってやっただけ

応援メッセージ待ってます!
(´;ω;`)
2017/10/21(土) 10:51:19.46ID:sVexF7NP0
がんぱれ
2017/10/21(土) 11:33:55.75ID:fkuXV6f/0
>>866
Visual Studioでもエラーになる
まあ当然だわな
2017/10/21(土) 11:38:57.68ID:Q5TWqxQz0
>>864
規格書の
6.5.3.2 Address and indirection operators

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
こう書いてある
2017/10/21(土) 11:53:08.06ID:Q5TWqxQz0
K&Rの1stでも
the address-of operator & cannot be applied to them.
って書いてあるよ
872デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:04:46.13ID:VJktQUPlp
俺にはレジスタ変数に割り当てた変数を関数のアドレス渡し引数にする意図が想像できない。
そんなにオーバーヘッド気になるなら、グローバル変数でレジスタ変数宣言してしまえって思う。
2017/10/21(土) 12:12:52.67ID:Q5TWqxQz0
>>872
外部宣言にregisterは使えないぞ
2017/10/21(土) 12:18:48.95ID:Hb3Ud/Wn0
オーバーヘッド気にしてたらコンテキストスイッチングとかどうすんだ?
875デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:43:51.25ID:VJktQUPlp
じゃあそんなクリティカルな問題無い様に、関数化する事自体を諦めた方がいいのでは?
876デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:46:37.26ID:VJktQUPlp
ヘッダーファイルにインライン宣言した関数を記述してしまうって解決方法もあるよな?
2017/10/21(土) 12:55:25.34ID:fkuXV6f/0
>>873
さすがにネタだろ
2017/10/21(土) 18:44:07.64ID:KlHNvq3I0
>>868
ありがとう

このスレに書いている単語が全然分からんw
何を話してるのかも分からんw
みんな凄すぎやわ…
2017/10/21(土) 20:20:57.18ID:fkuXV6f/0
>>878
register関係は爺の昔話だから無視していい
880デフォルトの名無しさん (ワッチョイ f9d6-1OZr)
垢版 |
2017/10/21(土) 20:38:07.37ID:LO7dvffl0
グローバル変数をregister指定できたり楽しかったなあ
881デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/21(土) 20:48:45.74ID:S+Fuo4jD0
いや、指定しても実際効果あるか無いかってだけだからなぁ
2017/10/21(土) 21:14:54.66ID:sahtjmhqM
>>878
ネットのプログラミング自習動画見てみたら?
883デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/21(土) 23:00:30.68ID:qfiVibk/0
10年前にC言語覚えたなC#もないopenGL作る時も基礎が出来てない白紙から打ち込んでたから凄い大変だったのを思い出したわ
2017/10/22(日) 05:28:16.50ID:m20yJ7cw0
register宣言とアドレス演算子の話だけど、
Cではエラー、C++だとアドレスを取れる(register指定は無視される)、みたいね。
望洋さんのファックとWikipediaのC++に出てたわ。

…実は逆に覚えててね。
レジスタに割り当てた変数の変数のアドレスが欲しいってのは矛盾してるから、
C++は厳格にチェックするかと。
885名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ a127-1OZr)
垢版 |
2017/10/22(日) 07:11:33.28ID:dj2Vz85u0
>>884
俺もそう思う
registerはprvalueであるべき
2017/10/22(日) 11:32:38.17ID:r2h/pPG10
レジスタってメモリ番地をもってるのか?
持ってない番外地なんじゃねえの?
2017/10/22(日) 11:38:07.26ID:rLWliBun0
>>886
そうだよ。そこは誰も疑問に思ってない。
888名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 12:31:48.51ID:NaoIEEjs0
世の中には、レジスタがメモリーの先頭と同じ位置にマッピングされてるCPUだってあるけどな。
2017/10/22(日) 13:39:13.59ID:f5TzHp7R0
質問です。ポインタ変数を用いてキーボードから入力された5つの整数を配列xに保存し、その要素の列挙と合計値を求めるプログラムを作ったのですが、
#include <stdio.h>
#include <stdlib.h>

int main (void){
int *p,x[4],sum=0,i,j;
p=&x[0];
for(i=0;i<=4;i++){
printf("%dつ目の整数を入力してください ",i+1);
scanf("%d",p);
sum=sum+*p; }
for(j=0;j<=4;j++){
printf("%d ",*(p+j));} /*配列の要素を列挙*/
printf("\n和=%d",sum); /*配列の要素の和*/
return 0;}
で、結果が
1つ目の整数を入力してください 1
2つ目の整数を入力してください 2
3つ目の整数を入力してください 3
4つ目の整数を入力してください 4
5つ目の整数を入力してください 5
5 4200864 6422368 4200955 6422288
和=15
となり、要素の列挙がうまくいかないので対策を教えていただきたいです。
2017/10/22(日) 13:49:53.88ID:rI45lLhS0
そりゃ最初に p に代入した同じ入れ物に入力値を保存してるからね。
++p とかしてみたら?
891名無しさん@そうだ選挙に行こう! Go to vote! (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/22(日) 13:55:57.90ID:pqhboyRRp
素直に配列使え。
2017/10/22(日) 14:15:34.40ID:m20yJ7cw0
scanf() での値の格納先 (== sumに加える値の参照先) である p を
初期化時の &x[0] のまま進めてないから入力した値が上書きされるんだよ。
もちろん x[1], x[2], ... には値が入らない。


質問の趣旨と関係ない部分を指摘して混乱させるつもりはないんだけど、
配列 x[] の要素数が足りないのがオジさん気になるなぁ。
2017/10/22(日) 15:12:18.96ID:2+N8xzsVa
>>889
既に>>890-892が指摘済みだけど

#include <stdio.h>
#include <stdlib.h>

int main (void){
int *p,x[5],sum=0,i,j; /* x[5] */
p = x;
for(i = 0;i <= 4; i++, p++){
printf("%dつ目の整数を入力してください ",i+1);
scanf("%d", p);
sum += *p;
}
p = x; /* ポインタの参照位置を配列先頭へ */
for(j = 0; j <= 4; j++){
printf("x[%d]=%d, ", j, *(p+j) );
}/*配列の要素を列挙*/
printf("\n和=%d\n ",sum); /*配列の要素の和*/
return 0;
}
2017/10/22(日) 15:20:05.53ID:f5TzHp7R0
大学で勉強し始めたばかりなので全然で…
みなさんありがとうございました。
895名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 15:27:37.67ID:NaoIEEjs0
まあ、なんでポインタに拘るのかわからんが、
つうか、書きと読みでアクセス方法は合わせた方がいいと思うが、
動きゃいいかw
2017/10/22(日) 15:34:28.08ID:rLWliBun0
学習をし始めた頃は敢えてポインタを使っていろんな書き方を試してみるのもいいと思う。
数をこなすうちに自然とよい書き方に気づくと思う。
897名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/22(日) 16:41:26.75ID:iiKpFSsu0
起動の度に外部ファイルで変数の初期値を変えて起動したいんだけどどうすんの?
2017/10/22(日) 16:53:41.42ID:utzmEkdP0
外部ファイルを読んで変数に代入する
899名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/22(日) 17:06:30.45ID:iiKpFSsu0
外部ファイルに変数名と初期値を書いておきたい
2017/10/22(日) 17:11:49.57ID:Qdw/5tAf0
環境依存だし基本的に無理
バッチなりシェルスクリプトに記述しといてコマンドライン引数で渡す方が建設的
2017/10/22(日) 18:05:00.75ID:m20yJ7cw0
ソースに書いてない変数を実行時に導入したいってのとは違うんでないか?
あらかじめ外部ファイルで値を設定できる変数は決まっていて、
要するにリソースファイルみたいな使い方をしたいのかも知れん。

fscanf(fp, "%s=%d\n", varname, &varval);
if (strcmp(varname, "width") == 0) {
 width = varval;
} else if (strcmp(varname, "height") == 0) {
 height = varval;
} else {
 fprintf(stderr, "cannot use variable '%s'\n", varname);
}

みたいな感じ?
この場で書いてるから洗練されてないし、動くか怪しいけど。
902名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 18:08:18.57ID:NaoIEEjs0
人が読み書きしない前提なら、構造体の領域をまるまんま読み書きしてしまえば楽だぜ。
2017/10/22(日) 18:09:51.31ID:4HKeVMJe0
動作時に殆ど変えない値ならファイルで良いかもしれないが
起動の都度値を変化させたいなら、コマンドラインの方が良いぞ
2017/10/22(日) 18:29:59.97ID:m20yJ7cw0
>>901 で使った「リソースファイル」って言葉は曖昧だったね。
「設定ファイル」の方が通りがよかったかも。

皆さん文脈から分かってくれると思うけど、
VisualStudio なんかで別の意味で使う言葉だし。
2017/10/22(日) 18:44:14.78ID:IdeA6XVs0
「鶏を割くに焉んぞ牛刀を用いん」とも言えるけど
json,yaml,tomlなんかの読み込みライブラリ使うとか
Lua,Pythonを組み込むとかも一応回答としてはありかもね
2017/10/22(日) 20:27:33.99ID:Cn2ZDyn4d
>>888
つーか全部レジスタの方面の話じゃね?
大分前の話だが、DSPでそういうのがあった
2017/10/22(日) 20:32:16.01ID:EROQgIiX0
>>906
ファミコンとかで使われていた6502のゼロページレジスタ
がそうだよ
MELPS7700とか名前を変えて長いこと使われた
908デフォルトの名無しさん (ワッチョイ a108-1OZr)
垢版 |
2017/10/22(日) 21:19:51.70ID:bXoG3HvV0
メインフレームでDIAGNOSEを使うときなんか
WCSのアドレスを指定とかね
909デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/23(月) 01:07:16.21ID:mBA7Qm4F0
スタック変数いらねえな
グローバル変数で性能追求しようぜ
2017/10/23(月) 01:22:42.10ID:gdiUlDLR0
6502のゼロページが全部レジスタだと思い込んでるような記述がたまにあるけど
普通にメモリだよ
911デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/23(月) 01:37:37.69ID:mBA7Qm4F0
オペランドを8bitに限定してコード効率上げるってのがゼロページの発想でしょ
メモリ素子が高価な時代の涙ぐましい仕組みのひとつ
2017/10/23(月) 01:46:50.56ID:EhEnOqp90
CPUの一時キャッシュメモリをレジスタ変数に割り当てる方が速いんじゃないか?
2017/10/23(月) 05:14:49.57ID:u4PJ0rqa0
>>911 アドレス値のフェッチが1byteだけで済むから
16bit(2byte)の絶対アドレスより速い、てメリットもあるしね。

>>912 これはアリかも。
CPUにデカいキャッシュが載る時代のゼロページ的な使い方だな。
914デフォルトの名無しさん (ワッチョイ ddb3-0GSP)
垢版 |
2017/10/23(月) 05:45:57.83ID:iFI38Dlw0
%%%%1000%%%%

000-[HUM%58*73.1\%]/2I/3NM/61.3SNMK%?%3%51.22222222222221%
001-[[[%6/4$17.6135412α3]]]]+DOM+SIL+7%
002-UML7%[61.2[31.5[!%32∂LM17.36%!16.3!%<<<%!HSTOL7%!Q!S!=3m=<2TOL<3Q9A<2.1GHz%,DOK,HAOARA,
003-[[[HEMLOT47[<\41.2%Q,===>[MLS<DPNO<\2.3>#ESOLA!5%!3MLA!>LTOSA>7TONSA>%>%end
2017/10/23(月) 17:06:19.86ID:WoZMAj8B0
ルネサスRXなんかもレジスタがメモリマップされてるな
アクセス禁止領域だけど
2017/10/23(月) 19:08:39.57ID:Ob3tZ8JSM
SFRと汎用レジスタの区別が出来ない奴
917デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 19:25:26.97ID:nagTo3YF0
>>915
そこって、デバッガがCPUレジスタ参照する為の窓だから、プログラムがその領域指すと、デバッグが困難になるから禁止してるんじゃね?
918デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 19:29:22.87ID:nagTo3YF0
デバッガー専用の作業メモリー領域もプログラムから使用禁止だったりするだろ?
919デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/23(月) 19:30:14.37ID:HemzWECS0
レクサスRXに見えた
2017/10/23(月) 20:21:25.70ID:WoZMAj8B0
>>917
その通りだと思うよ
2017/10/23(月) 20:22:52.11ID:WoZMAj8B0
>>916
sfrをアクセス禁止領域に置いてどーすんだよw
922デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 20:30:23.77ID:nagTo3YF0
>>921
アクセス禁止じゃねーよw
使用禁止だ。
デバッガー使わないなら好きに使えばいい。
923デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 20:37:44.96ID:nagTo3YF0
あ、レス間違えたわw
2017/10/24(火) 03:02:06.36ID:75BFZUbG0
int i=1,n
n=i/2*2

n=0になる理由教えてください
2017/10/24(火) 03:50:48.19ID:senjN+vb0
int型は小数が扱えないので0方向に丸められる
2017/10/24(火) 05:57:30.66ID:2rmlfNW20
>>924 https://ideone.com/HQ4Zos
2017/10/24(火) 06:48:50.75ID:kt50Dt6N0
負の除算の丸め方は処理系依存
2017/10/24(火) 07:33:37.46ID:VjHIGh6G0
左結合で i/2 の後に *2 が処理される

整数どおしの除算なので丸めが発生
丸めた値に 乗算が行われる
2017/10/24(火) 07:45:07.35ID:75BFZUbG0
おおおお!
なるほど!ありがとうございます!
2017/10/24(火) 12:07:36.73ID:SPAXueit0
int func(int) は、引数が int 型で、int 型の値を返す関数
int func(void) は、引数が無しで、int 型の値を返す関数

というのは分かったのですが

int func() のように () の中が空の場合は、どうゆう意味になりますか?
int func(void) と同じ?
931デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/24(火) 12:12:42.21ID:b8RDVE7X6
https://i.imgur.com/DWw6T08.png
2017/10/24(火) 12:24:20.33ID:SPAXueit0
わかりました、ありがとうございます
2017/10/24(火) 12:51:09.78ID:k+hUXLmG0
>>931
包茎手術じゃなくて脱毛で良かったな
934デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/24(火) 13:44:26.08ID:/a/Ldfbw0
DMAでも使うならともかく
レジスタをメモリ空間にマッピングする利点なんてないだろ
2017/10/24(火) 13:58:10.44ID:48RRVnNoM
PCI以降DMAでデータ転送なんてのは無い。
あるのはバースト転送モードだ。

当然、転送に必要なレジスタはメモリにマッピングされている。
936デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/24(火) 14:14:56.50ID:gWGoT/ywp
>>934
むしろデメリットさえあるな。だからデバッガが使う以外は利用されてないだろ?
937デフォルトの名無しさん (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/24(火) 14:24:36.56ID:fybDUnFS0
ふふ、トヨ〇の要求。今は知らん。
938デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/24(火) 16:20:50.45ID:b8RDVE7X6
まだやってたのかよレジスタ
939デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/24(火) 18:07:58.27ID:gWGoT/ywp
内部レジスタと外部レジスタは意味がまるっきり違うんだがなぁ
2017/10/24(火) 18:48:56.59ID:ffssQfLj0
>>939
二重帳簿やっているように聞こえる
2017/10/25(水) 01:31:11.21ID:a9TiLHl10
>>930
同じなんだけどコンパイル時の引数チェックをしなくなる。
int func(void) の関数に対して func(123) みたいにして呼ぶとコンパイルエラーだが
int func() の関数に対して func(123) で呼び出す記述があってもエラーにならない。

なんでこうなっているのかというと、昔のCにはvoidがなくて引数なしの関数は
int func() のように書くしか方法がなく、尚且つ昔のC言語は引数のチェックを
していなかったため。つまり過去のC言語ソースをコンパイルできるようにする
ためにこのような記述が残されている。今となっては余程の事がない限りこんな
書き方はしない方が良い。バグの元だ。
942デフォルトの名無しさん (ワッチョイ cee7-LaKm)
垢版 |
2017/10/25(水) 15:47:29.67ID:Ls3qnFv30
ヤフー知恵袋って色んな奴がC言語勉強してるやつがいるな、素人みたいな質問やら専門的な質問や大学の問題の質問やらのプログラミング質問が
943デフォルトの名無しさん (ワッチョイ 51c9-aYWJ)
垢版 |
2017/10/25(水) 17:13:54.92ID:3egWGIK90
>>941

へーへー
2017/10/25(水) 18:14:39.48ID:2J1yyAIT0
https://ideone.com/0GCZnF
がエラーになるのですが、
どうすればいいでしょうか?
2017/10/25(水) 18:15:57.84ID:16XMr+7o0
DDOS攻撃してサイト毎潰す
946デフォルトの名無しさん (ワッチョイ cee7-LaKm)
垢版 |
2017/10/25(水) 18:20:37.33ID:Ls3qnFv30
>>944
まず何のプログラミングか言わなきゃダメでしょうみんなプロだから挙動で読めちゃう人いるけどさ
947デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/25(水) 18:28:36.51ID:Ho4Id2OA0
>>944
printfでNULL->valueをしてるから
2017/10/25(水) 18:35:07.38ID:2J1yyAIT0
>>946
>>947
hoge()でdata->valueに値をセットしたいです。
10を表示したいです。
2017/10/25(水) 19:06:17.58ID:N2zX2Cru0
void hoge(data_t **data, int value) {
 *data = NULL;
 *data = malloc(sizeof(data_t));
 if (data == NULL) return;
 (*data)->value = value;
}

呼び出しを
 hoge(&data,10);

これではどうか
2017/10/25(水) 19:07:10.40ID:N2zX2Cru0
if (*data == NULL) return;

ここ間違えた、訂正
2017/10/25(水) 19:12:01.89ID:2J1yyAIT0
>>949
ありがとうございます。
できました!超天才!
952デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/25(水) 19:16:50.46ID:Ho4Id2OA0
そういうことか
全然分からんかった
引数に受け渡されたポインタ変数のコピーに新しく確保したメモリのアドレス入れても呼び出し元のポインタ変数はなんも変化しないのか
2017/10/25(水) 19:21:03.77ID:BohOgQqE0
引数で int の変数を書き換えても 呼び出し元には伝わらない それの延長線
int を data_t* に読み替えれば同じ理屈よ
954デフォルトの名無しさん (ワッチョイ cee7-LaKm)
垢版 |
2017/10/25(水) 20:39:40.86ID:Ls3qnFv30
俺の頭じゃあ理解できなかったわアロー関数は苦手だ、ここには天才がやっぱいるわ
2017/10/25(水) 22:59:11.01ID:SHE9E59e0
この程度でプロとか天才とかw レベル低っ
2017/10/25(水) 23:31:22.55ID:A9sEwxck0
追い詰められてる時って、ちょっとしたことを見落としたりしがちだし。
そういうときにちょっとしたつまらない問題点を指摘してくれる人が神様に思えることはある。
本当に何でこれに気づかない?って問題に延々と気づかないことあるから。
2017/10/26(木) 01:05:20.57ID:WmOJzpQL0
実務の世界だと、開発リーダーにとっては、この程度はさらさらと書いて欲しいと思うだろうな
この辺の考え方が理解できてないと、構造体を使ったリスト構造、木構造が作れないと思う
958デフォルトの名無しさん (ワッチョイ 7102-rVGZ)
垢版 |
2017/10/26(木) 01:22:11.08ID:FPgm8C1h0
急に語り出したぞ、おい
959デフォルトの名無しさん (ワッチョイ 719f-a4mA)
垢版 |
2017/10/26(木) 03:22:11.49ID:kwyo2eDl0
リスト構造、木構造という言葉がわからなかったのかな?
2017/10/26(木) 03:35:02.17ID:ByFyiJTd0
分からなくてもググれば速攻定義出ますがな
2017/10/26(木) 06:24:41.35ID:8UQnYlEC0
>>944 からの流れだとすると、実務で使う人とは感じなかったな。
専門外の学生さんが単位を取るために四苦ハック、
進級できたら思い出しもしない、という立場からの質問だろうと。
962デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/26(木) 10:26:24.17ID:Z8IKw2VS6
リスト構造木構造とか理系大学の情報系科目で誰でもやるがな
こんなところ見てる奴が知らんわけないだらアホ
963デフォルトの名無しさん (ササクッテロラ Sp9d-aRZk)
垢版 |
2017/10/26(木) 10:46:18.77ID:DmfMCHFwp
リストもツリーも基本の構造は一緒だろ。
ただ、鎖ね繋がってる数が違うから、
扱いが違うだけでな。
2017/10/26(木) 12:26:11.84ID:nuX2FTeTa
文系経済学部ですわ
2017/10/26(木) 12:46:06.22ID:oyaJ8gC3M
>>962
> こんなところ見てる奴が知らんわけないだらアホ
>>952みたいな奴もいるのに何を言ってるんだよ w
966デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/26(木) 12:51:34.13ID:jbwuNtau6
>>965
リスト構造とか知ってるからってポインタ受け渡しのトリックに気付くとは限らんだろ
2017/10/26(木) 13:41:10.56ID:VaLFaSbf0
怪しくなったら戻り値で返せ
2017/10/26(木) 14:50:55.37ID:ujDNQjK/M
そういうときに限って二つ返したくなる
969デフォルトの名無しさん (ワッチョイ 1be7-J/p5)
垢版 |
2017/10/26(木) 18:29:14.01ID:l+WAoJAx0
自分の知ってる関数解ってる宣言の仕方ならわかるけどさ解らない奴使ってたらもう変数が動いてるかわからんだろう
そうなったらもう謎でコードなんか読めないだろ?
2017/10/26(木) 18:40:00.02ID:6866r+hk0
んなこたぁ、ない
2017/10/26(木) 18:44:09.81ID:AI1MxGuX0
引数の書き戻し系は 渡すときに値を必要としてるのかどうかは仕様次第なので 少し気を使う
972デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/26(木) 20:03:01.42ID:DmfMCHFwp
それより、そのアドレスはアクセス権のある場所を指してるんだよな?
2017/10/26(木) 21:41:04.91ID:oyaJ8gC3M
>>966
レベルの問題
> リスト構造とか知ってるからってポインタ受け渡しのトリックに気付くとは限らんだろ
そんな奴がいないとは言わないがそう言う奴はごろごろいるとは思えないだろ
974デフォルトの名無しさん (ワッチョイ d175-rVGZ)
垢版 |
2017/10/26(木) 21:42:34.03ID:Fjma9sq90
とりまリスト構造なんて誰でもしってること
>>959のレスはイミフ
2017/10/27(金) 03:11:40.50ID:QY+Fa/Ak0
>>966
これはトリック、か?
2017/10/27(金) 06:49:46.56ID:VPed4ksO0
「関数の引数に値渡ししかないから、
ポインタを渡すことで呼出側の変数の内容を関数側で変更する」
というのが他の言語と比較した場合、C特有のトリックと呼べるかも。

もちろん、Cの村では当然かつ基本のことだけど。
977デフォルトの名無しさん (ワッチョイ 1387-jmG0)
垢版 |
2017/10/27(金) 08:36:39.71ID:JYNAFOfl0
たくさん値を返したいなら、
戻り値を型宣言した構造体にしたらいい。
2017/10/27(金) 09:39:08.11ID:a5gmSSmH0
残念だったな、トリックだよ
979デフォルトの名無しさん (ワッチョイ 1be7-DRuk)
垢版 |
2017/10/27(金) 09:42:57.69ID:Q7q08ysx0
>>977
autoでもできるのですか?
980デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 09:57:16.24ID:CUGbjFhkp
ああ、昔はauto変数に取った構造体を戻り値にして割り込み系で散々な目に遭ったよな。
あれは言語仕様に沿って無いコンパイラが悪いんだがな。
2017/10/27(金) 10:00:31.70ID:v/FEPkkV0
古いコンパイラではNGだったけど
構造体の引数での値渡し、戻り値での値戻しは可能
982デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 10:18:09.15ID:CUGbjFhkp
古くなくてもニッチな環境では要注意だ。
コンパイラの吐き出すコードが言語仕様に沿って無い場合がある。
2017/10/27(金) 10:27:32.22ID:8fSPZcAJ0
>>976
トリックと言うか他の言語ではコンパイラがやってることをアセンブラやCでは明示的に書くと言うだけ
2017/10/27(金) 13:06:16.96ID:v/FEPkkV0
>>982
なんてこったw
ニッチな環境だとメンテもされてないことあるだろうしねー
2017/10/27(金) 15:36:47.12ID:dGyUnw2Y0
ホワイトスミスなんて、printfすら無いような処理系作って
いた人がANSIの役員していて2度びっくり
986デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/27(金) 18:41:59.37ID:BvMxy0d+0
C言語のポインタで
int *a;
int b;
a = 10;
これは理解できるんだけど
a = &b;
*a = 10;
これはどうなってるん?aにアドレス入ってるのにどうやって10を送ってるん?
2017/10/27(金) 18:47:48.96ID:/LUCvRWS0
> int *a;
> a = 10;
> これは理解できるんだけど
説明できるのなら その先も分かるはず
2017/10/27(金) 18:49:13.82ID:xRxq9X9wd
>>986
> int *a;
> int b;
> a = 10; //エラー。ポインタに整数は代入できない。そもそも全角文字と半角文字を間違っている。
> a = &b;
> *a = 10;
アスタリスク(*)で実体の整数データを手繰り寄せているイメージね。
989デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/27(金) 18:55:00.02ID:BvMxy0d+0
>>988
*aで中にあるアドレスで探って送ってるイメージ?
2017/10/27(金) 18:57:22.58ID:xRxq9X9wd
うん。アスタリスクを付ければ、アドレス先への代入になる。

ポインタにゼロ以外の整数は代入できないに訂正。
991デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 19:14:00.54ID:CUGbjFhkp
宣言とフィールドで意味の違う*が悪い。
2017/10/27(金) 19:16:29.79ID:t/XrhBpFM
アーキテクチャとアセンブリ言語勉強するのが早道な気がする
2017/10/27(金) 19:19:35.75ID:t/XrhBpFM
>>991
意味は同じだよ。*aがintだと宣言してるから整合してる。
初期化構文がちょいと怪しいが。
994デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 19:21:42.60ID:CUGbjFhkp
>>993
宣言ではポインタである事を表すが、
フィールドでは、掛け算記号だったり、ポインタの内容だったりするだろ?
995デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/27(金) 19:56:47.39ID:BvMxy0d+0
char *c;
int *a;
この二つはポインタだけど使い方が違うのか?
2017/10/27(金) 20:00:41.33ID:xRxq9X9wd
sizeof(*c) == sizeof(char)で、
sizeof(*a) == sizeof(int)だ。
2017/10/27(金) 20:11:43.60ID:HlvRN0vUF
Cの文法特にポインタ宣言周辺は、
頭が悪いと読めないよう定められてる。

ソフトウェア開発は馬鹿でも手伝わせる
必要があるくらい人手不足なのに、
なんでこんな文法にしたのか不思議。
2017/10/27(金) 20:21:32.42ID:3Ly7XcHr0
えっ、Cの由来を知らないの?
2017/10/27(金) 20:26:24.89ID:xRxq9X9wd
次スレお願い
2017/10/27(金) 21:22:14.66ID:zFbk1AXy0
あぼーん
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 78日 1時間 0分 51秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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