X



C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©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
0006デフォルトの名無しさん (ワッチョイ 3323-hZ6b)
垢版 |
2017/08/11(金) 03:16:23.49ID:suC9gTdR0
0007デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/11(金) 08:28:05.03ID:8TW1by1n0
>>2
煽りコントで笑いをとってたコメディアンのこと?
0010デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/11(金) 12:14:58.92ID:8TW1by1n0
ハード・ソフト両利きになるには絶好の近道
0012デフォルトの名無しさん (ワッチョイ 3323-aEKd)
垢版 |
2017/08/12(土) 16:57:37.18ID:6AXlD0eu0
>>8
それはあなたが今後何をやりたいかによる。
0014デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 16:07:14.55ID:2GAXDCvV0
そういう意味では、あと英語な
マニュアルや規格票といえばまず英語
日本語版はないか、あっても10年遅れとか
そればかりか自分のコードのマニュアルやコメントも
英語で書けとだいたい言われる
0015デフォルトの名無しさん (ワッチョイ 3323-aEKd)
垢版 |
2017/08/13(日) 17:01:50.43ID:aXXBQeA80
え?そんな所あるの?外資系とか?

まあ最初から英語できることを前提に雇っているならわかるけど、そうでない会社で
それやったらネイティブが忍耐をもってしても解読困難な英語モドキの文書の山に
なってしまうのではないか?
0016デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 17:33:10.24ID:2GAXDCvV0
解読困難な英語モドキすっげええ、うんざりするほどあるよ
ずーずー弁しぇからしかこんだらず、なんて次元じゃねえ訛り方
・・・まあ恥ずかしながら日本人の訛り方はトップグループなんだが
0019デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 18:29:50.42ID:2GAXDCvV0
技術英語を憶えるのに一般英語は邪魔
技術英語独特のボキャ貧はマニュアルや論文でしか学べない
0021デフォルトの名無しさん (ワッチョイ ba89-MZKP)
垢版 |
2017/08/13(日) 18:39:03.83ID:o1ygPh5l0
>>18
自分がある程度詳しい分野のちゃんとした英語のドキュメントを読んでると、ここはこういう意味か、こんな時はこんな表現するのか、と言うのがある程度身についてくると思う。
0022デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/13(日) 18:54:33.40ID:2GAXDCvV0
>>20
0030デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 11:07:32.90ID:J2krMHFz0
エディタで充分
IDEいらね
0031デフォルトの名無しさん (ガックシ 06b6-C9Js)
垢版 |
2017/08/16(水) 11:12:04.39ID:79/XacN36
Cの文法だけ知りたいんならIDEで身につくと思うけど、CのUNIX的な使い方とかMakefileの作り方まで含むならやっぱりターミナルでVimかEmacsが一番身につくと思うな
0034デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 12:30:21.85ID:J2krMHFz0
IDEであろうがなかろうが
複数の環境を使ったほうがいい
1つの環境だけ使っていると
間違った知識をたっぷり吹き込まれる
その環境が悪いわけじゃなく
Cには処理系定義だの未規定だのがたくさんあるからだ
0036デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 17:14:38.09ID:J2krMHFz0
関数を呼び出すたびごとにいちいちGETMAINするのかと思ったら違った
0038デフォルトの名無しさん (ワッチョイ 0e1c-Jp9e)
垢版 |
2017/08/16(水) 21:24:11.17ID:J2krMHFz0
カード穿孔機くらいかな
トライグラフの必要性を感じたデバイスは
0048デフォルトの名無しさん (ワッチョイ 110d-JJVS)
垢版 |
2017/08/17(木) 10:55:11.53ID:NamoDwZf0
>>47
最近のコンパイラはデフォでトライグラフを抑制してくれてるようだけど
古いコンパイラは、そんな気がきいてないから

警告文 "warning??!" ってやって実際の出力が warning| で なんじゃこりゃ?と
0054デフォルトの名無しさん (エーイモ 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みたいに毎回不定で文字列が出力されるんですけど何でですか?
0061デフォルトの名無しさん (ブーイモ MMc5-gUFl)
垢版 |
2017/08/18(金) 03:59:52.12ID:URLOh4DLM
キャスト毛嫌いしてたんだけど、size_t や int*_t シリーズを printf 書式で使う時のベストプラクティスだと気付いてしまったよ。
0068デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 09:48:31.67ID:+zi/zXZ30
>>65
問題大ありだよ
64bit 環境では、sizeof sizeof 1 == 8 だぞ
0069デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 10:03:06.56ID:+zi/zXZ30
脇道に逸れるが整数のサイズってどいつもこいつもイマイチだね
char 8
short 16
int 32
long 64
long long 128
と、せっかく5階級あるのを無駄なく使えるようになってない
0071デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 11:55:29.20ID:+zi/zXZ30
いや、そういう環境があったらなあと
0073デフォルトの名無しさん (ワッチョイ 4b6c-oL0b)
垢版 |
2017/08/18(金) 12:46:10.63ID:K+PXWISB0
Makefileの書き方なんだけど

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


.c.o:
@echo $@:$^
$(CC) $(CFLAGS) -c $<
みたいに書いたりしてんだけど、全部に書くのもダサい気がするし
良い方法はないでしょうか
0074デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 15:25:50.71ID:+zi/zXZ30
>>72
128が標準にあれば使い途いろいろあるぞ
0083デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/18(金) 23:11:42.85ID:+zi/zXZ30
違う! 前置だ
b = (a = a + 1);
0085デフォルトの名無しさん (ワッチョイ db6f-2g+Y)
垢版 |
2017/08/18(金) 23:57:54.41ID:nSj4GkNd0
>>78
>前置インクリメントa++
>後置インクリメント++a

考え方が逆
変数を基準に考えるのではなく演算子を基準に考える
前置インクリメント++a : 演算子を’前’置した場合、変数(式)の評価’前’に演算子が適用される
後置インクリメントa++ : 演算子を’後’置した場合、変数(式)の評価’後’に演算子が適用される
0087デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/19(土) 09:44:47.22ID:CpINIl4e0
i = i + 1;
の、iの変更と最後のiの評価の間の順序性は?
0088C言語ますたー《ますたー軍団(常時募集)の長》 ◆oa6k//3vOQ (ラクッペ MMed-UZV0)
垢版 |
2017/08/19(土) 09:54:20.36ID:6ANTyB1VM
>>87
i+1のiは変更前のiでしょ
0091デフォルトの名無しさん (ワッチョイ f932-Jcyw)
垢版 |
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.」
左オペランドの変更は、左右オペランドの評価の後
0093デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/19(土) 15:28:05.17ID:CpINIl4e0
>>91
thx
だよな、そこは断り書きが必要な箇所
0098デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 09:25:38.38ID:sGdhnhOm0
事実上どうなっているという話ではなく
理屈の上でどうなのかという話
ちゃんと断り書きがあったからめでたしだが
そうでなかったら大変だった
0100デフォルトの名無しさん (ワッチョイ 096f-jLVh)
垢版 |
2017/08/22(火) 11:22:32.57ID:chgkyZKA0
defineした定数を文字列定数にいれるにはどうしたらいいの?

#define EOL 0x0d

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

↑この文字列の改行コードに定数EOLを展開した値を入れたいです。
0102デフォルトの名無しさん (エーイモ 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
と出力したいです
0103デフォルトの名無しさん (ワッチョイ 596f-MAnB)
垢版 |
2017/08/22(火) 11:59:42.09ID:GCxyf0Da0
>>100
小さな部品を繋いで大きなものを得るのはとても簡単にできるけど
部分を削って小さな部品を得るのはとても大変なのよ
だから本来は改行文字は機能的にレイアウトなのでデータとは分離しておいて
表示なりなんなりするときに結合して使うのが望ましいもちろんVersionと数字もね

その上で既存コードのメンテ等でどうしても必要なら>>101がベスト
0106デフォルトの名無しさん (ワッチョイ 596f-MAnB)
垢版 |
2017/08/22(火) 12:14:35.93ID:GCxyf0Da0
>>102
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a);
0107デフォルトの名無しさん (エーイモ SEf3-Ufa9)
垢版 |
2017/08/22(火) 12:52:42.46ID:przmPyd7E
>>106
そうなんですか・・・
全部直書きするのキツイのであだ名がなくてもかまわないのでこの場合の方法ないでしょうか?
0109デフォルトの名無しさん (ワッチョイ 096f-jLVh)
垢版 |
2017/08/22(火) 13:20:20.96ID:chgkyZKA0
>>101,104、ありがとうございます、

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

必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか
0113デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 17:44:12.68ID:NIldwpVs0
再帰的に列挙は自動だととんでもない情報量になったりするからな
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ
0114デフォルトの名無しさん (ワッチョイ 936f-jLVh)
垢版 |
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);
}
0118デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/22(火) 23:41:21.22ID:D8nSL4rC0
>>115でいいと思うけど、
そもそもこれがしたい場合にC言語を使うのが間違いでしょ。
動的言語かリクレクションがある言語を使えばいいだけ。

ちなみにVC++/CLIでよければリフレクションが使えるけどね。
質問者には無理だろうけど。
レベルからいって>>108が当たりだろうね。
0123デフォルトの名無しさん (ワッチョイ 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"});
0128デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 15:42:32.73ID:RGmsOxnq0
Cはうんことかほざくやつ
まさかLinuxなんか使ってねえだろな
0133デフォルトの名無しさん (ワッチョイ caea-6Dzw)
垢版 |
2017/08/25(金) 22:45:39.22ID:IHFV3+gX0
むしろ Ruby で自由にコードを書ける人を尊敬する今日この頃。
最近やってるんだけど、どうしても馴染めない。普通には組めるけど、違和感が残るというか抵抗があるというか。
0134デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/26(土) 00:06:54.39ID:F7j6CSPU0
リフレクションを使う気がなければリフレクション自体がウンコだよ。
・ソースコードがだだ漏れ
・実行体が無駄に膨らむ(ソースコード情報を含むため)
・リクレクションが必要な用途なら、動的言語でついでに型無しの方が断然楽

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

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

>>133
どの辺が?
俺はRuby使いではないが、それよりも酷いとされるJavaScriptには馴染んでしまったから、
ある程度は答えられるかも。
0135デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/26(土) 00:48:52.34ID:acOQPPj10
lua等の組込み言語とやり取りする container生成用補助構文群が有ってもいい
関数では前方宣言とか scopeが邪魔して対処しきれないだろうから
うまくすれば文字列操作表示も標準libraryから追い出せる
0136デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/26(土) 00:52:27.30ID:acOQPPj10
pr(test_t, (test_t){.i=999; .s="abc";});
0138デフォルトの名無しさん (ワッチョイ 6aab-M74o)
垢版 |
2017/08/29(火) 00:26:03.40ID:+Y8D6iZy0
>>134
規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
TypeScriptとかFlowとか
速度を稼ぐ目的でwasmも今後主流になっていくだろう

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

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

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

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

後者は型を明示的に書かなくてもいというだけで最初からすべて型検査してるぞ。
型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
0146デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/29(火) 22:43:29.12ID:Uz0lh6nE0
>>140
> 型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
これは事実としてはその通りだが、理由はこれが型あり言語の正義だからであって、
現実は型検査がウザイだけの時も多いだろ。
C++のtemplateとか、varで書いたら勝手にtemplate化してくれ、という場合も多い。
込み入ったことをやるとコンパイルを通すだけの為に苦労したりするが、
あんなのは完全に時間と手間の無駄だ。
また、他でもよく言われているが、確かに関数ポインタを常用し始めた場合、
型あり『しか出来ない』言語は壮絶にウザイ。どうでもいい型が氾濫するだけだし。

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

C(と言うかC++)ではconstがこの状況に近いのではないかな?
通説ではconstは付けるべき、となっているが、俺は付けてない。理由は、
・そもそも俺はconstで苦労したことがない(必要性を感じない)
・中途半端に付けてると余計に面倒になるだけ
・const_castとか、ただの馬鹿としか思えない
なんだが、同様の意見の奴もある程度はいるだろ。
過剰な型検査ってのはあるんだよ。それが人によって異なるってだけで。
やればいいって物ではない。
0148デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/29(火) 23:14:00.57ID:Uz0lh6nE0
>>147
現状認識も間違っていると思うけど。
日本語が不自由ならさようなら。

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

そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
0151デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/29(火) 23:53:00.65ID:Uz0lh6nE0
>>150
そうとしか取れないのは君が未熟だからだね。

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

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

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

あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
0154デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
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修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
0156デフォルトの名無しさん (ワッチョイ 5923-pgRk)
垢版 |
2017/08/30(水) 01:17:46.58ID:ry+Kms2n0
型どうこうで考えるべきは依存関係なんだが

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

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

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

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

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

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

新しい言語はそこら辺かなり解決されてる
0160デフォルトの名無しさん (ワッチョイ 6aab-M74o)
垢版 |
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にポインタが欲しいぐらいの不自然さ
0164デフォルトの名無しさん (エーイモ SEb2-dmBu)
垢版 |
2017/08/30(水) 13:51:14.27ID:AB0hyKA3E
すいません
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
0166デフォルトの名無しさん (ワッチョイ 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なんかがいるんで適宜追加しる
0172デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 19:17:51.85ID:BJd10UjW0
あのなー・・・
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
0175デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 20:41:41.90ID:BJd10UjW0
>>168だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
0179デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/30(水) 23:02:07.68ID:F1WQhw000
>>158
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。

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

C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
0180デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
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++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
0181デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
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)の後ろなのであって)
0182デフォルトの名無しさん (ワッチョイ 096f-pmc4)
垢版 |
2017/08/30(水) 23:14:59.21ID:58Rp2mqQ0
ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
0183デフォルトの名無しさん (スフッ Sdea-NYHg)
垢版 |
2017/08/30(水) 23:55:33.72ID:FdjUx67gd
最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
0193デフォルトの名無しさん (ワッチョイ 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 のように重なってしまっておかしくなったと。
0194デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
垢版 |
2017/08/31(木) 03:22:36.47ID:IR3nOS0l0
>>179
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
0195デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
垢版 |
2017/08/31(木) 03:58:43.17ID:IR3nOS0l0
>>180,181
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず

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

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

コンパイルエラーじゃなくてテストで保証するとになればなおさら変
0196デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
垢版 |
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)みたいなコードをはいてくれたりもする
0198デフォルトの名無しさん (ワッチョイ 430d-b8Mh)
垢版 |
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 が配列ではなくポインタだった為
処理したい要素数が渡っていない
0199デフォルトの名無しさん (ワッチョイ fff0-6h2J)
垢版 |
2017/08/31(木) 13:55:57.05ID:wUqC2S3T0
>>183
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
0201デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 16:17:00.98ID:JYM1pg890
半分使って、半分継ぎ足しを繰り返すと79回目あたりで
アボガドロ定数の逆数くらいに薄まるよね
0203デフォルトの名無しさん (ワッチョイ 6323-6h2J)
垢版 |
2017/08/31(木) 22:53:34.07ID:F9uWTtxD0
>>194
> 型あったほうが便利派
半分くらいはインテリセンス目当てだと思うぞ。
そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。
だからconstは使ってないし、関数ポインタの型検査もウザイ。
つーか、型を間違えること自体がほぼ無いだろ?
引数の順番を間違えたりした場合に型検査で引っかかるってだけで。
0204デフォルトの名無しさん (ワッチョイ 6323-6h2J)
垢版 |
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を付けられるはず。
これをやっているのか?
やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。
0205デフォルトの名無しさん (ワッチョイ 6323-6h2J)
垢版 |
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)に対しての副作用を持たないことを保証)することは出来ないでしょ。
0206デフォルトの名無しさん (ワッチョイ 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
}
0208デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 09:06:42.83ID:2msaHTP30
typoしとるな
[は{
0210デフォルトの名無しさん (ワッチョイ 53db-aQR2)
垢版 |
2017/09/01(金) 11:36:56.59ID:IGPoCkp90
Cのconstは変更不可なオブジェクトだからな
0212デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 15:37:25.51ID:2msaHTP30
違う
constはもともとC++発祥のもので、
Cでパクるにあたり微妙に改変した
constは最適化に関係するが
今この流れでは最適化とは全く無関係の話をしている
0215デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 18:43:10.50ID:2msaHTP30
ビットフェードとvolatileは関係ないぞ
0219デフォルトの名無しさん (ワッチョイ a323-wVzx)
垢版 |
2017/09/03(日) 11:44:42.91ID:jl0cf3RS0
性的な
0221デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:40:32.30ID:jXGwZqzU0
一口にstaticと言っても、そのキーワードは用法で意味が変わるからなあ
0224デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 18:47:29.02ID:jXGwZqzU0
C99以後、仮引数のstaticもあるしな
0225デフォルトの名無しさん (ワッチョイ ffea-pNuo)
垢版 |
2017/09/04(月) 00:43:28.93ID:QxIkVb9z0
ポインタ関連で*と&の記号を使っているのも
初心者を遠ざけているよな
素直にpointerとかrefとかの予約語作ればよかったのに
0226デフォルトの名無しさん (ワッチョイ 7f89-eV1K)
垢版 |
2017/09/04(月) 01:05:35.63ID:IeE+YITL0
>>225
もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。
0229デフォルトの名無しさん (ワッチョイ 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]);
0230デフォルトの名無しさん (ワッチョイ a323-wVzx)
垢版 |
2017/09/05(火) 00:59:51.51ID:2RdPD3ce0
>>229
ああ。そういう使い方か。
0231デフォルトの名無しさん (アウアウウー Sa47-ktFK)
垢版 |
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);
0232デフォルトの名無しさん (ワッチョイ b323-QlH+)
垢版 |
2017/09/08(金) 04:19:51.29ID:LlnxN/9E0
>>231
1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。
例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。
0233デフォルトの名無しさん (エーイモ 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;
}
0236デフォルトの名無しさん (ワッチョイ 1af0-x/0H)
垢版 |
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;
}
0238デフォルトの名無しさん (ワッチョイ 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の比較じゃ意味ねーと思うんだわ
0239デフォルトの名無しさん (ワッチョイ b323-xkdj)
垢版 |
2017/09/10(日) 04:20:42.87ID:3lFSiHDa0
>>237
大丈夫だと思う。
0242デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 11:46:48.72ID:uI7cAZFMa
暇すぎたので昨日からC言語の勉強始めましたプログラミング初心者です。
これって趣味にできる?
0245デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:42:12.95ID:uI7cAZFMa
今本屋なんだけどどの本で学ぶのがいい?
てかphytonとか他の言語の方が良かったりする?
0246デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:45:14.25ID:uI7cAZFMa
ちなみに本職は監査法人の公認会計士で監査してるんだけど仕事に役立つならそれに越したことはない
0247デフォルトの名無しさん (ワッチョイ b339-xWDE)
垢版 |
2017/09/10(日) 13:50:00.90ID:SyCSejr00
幅広くエロエロやると上達早いで
もしノイマン型コンピュータの基本知識が
無いのならどこかで学習する必要がある
メモリ、アキュムレーター、インデックスレジスタ…etc
0248デフォルトの名無しさん (ワッチョイ baef-/PUN)
垢版 |
2017/09/10(日) 13:53:38.31ID:rGvjr77j0
>>246
公認会計士の仕事にはなかなか結びつかないだろうけれども…ガンバレ
C/C++ はどちらかというと原始的
python AI/機械学習で今はやり

ゴルフでもなんでも最初は大変だから一定の覚悟が必要
0249デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:56:43.80ID:uI7cAZFMa
あんま知識は無い。
じゃあC言語とphytonを並行して学ぼうかしら。
0250デフォルトの名無しさん (ワッチョイ b323-QlH+)
垢版 |
2017/09/10(日) 14:35:30.74ID:3lFSiHDa0
会計ねえ。Excelとかの本のほうがいいかも知れんな。その方が仕事に結び付けられる事が多くて覚えは早いのではないかと思う。
マクロも一応プログラムだしな。Excelにくっついた形のものではあるが結構色々な事ができる。
で、それがある程度できるようになったらプログラムというものがだいたいどういうものかわかるようになってるだろうから次はVBのように似ているものをやる。
似ているのでこれの習得はかなり早いと思う。それから他の言語を色々やって幅を広げる。
0252デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 15:07:37.65ID:uI7cAZFMa
まあ別に趣味だから仕事に役立たなくてもいいぞ
0253デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 15:12:20.15ID:uI7cAZFMa
苦しんで覚えるC言語っての買った
0259デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 17:58:39.08ID:Z8XrRGDBa
受信したメールの中身を理解して必要なメールと不必要なメールを分け、必要なメールの情報を分かりやすい文章に要約して表示するプログラムC言語で作れる?
ついでに簡単な返信なら自動でしてくれたらありがたいんだが。
0260デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 18:04:27.57ID:Z8XrRGDBa
返信が必要なメールと判断した場合は、返信メール本文の例を1万種類ぐらい自動で作成して、その中からより最適なものを3種類ぐらい提示してきてこっちはそれを選ぶだけで良いという機能も欲しいぞ
0267デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/10(日) 19:00:48.08ID:BxaTac1G0
>>259
「必要なメール」とそれ以外の境界を
おまえさんが明確化できるか否かにかかっている
何言語を使おうが同じことだ
Cは推論エンジンそのものを作れる言語で
通信アプリやドライバを作れる言語でもあるので
諦めねばならないアイディアはまずないはず
0268デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 19:38:42.01ID:Z8XrRGDBa
>>267
「必要なメール」とそれ以外の境界線はこれまで私自身が行ってきたメールへの対応を見てプログラム自ら学習して欲しい。
また分類や要約は高度な文脈、ニュアンス判断も伴うレベルで行わせたい。
それも様々な小説や文献を通してコンピュータ自ら学習して欲しい。

ちなみにこれ外注したらいくらぐらい?
10万円ぐらいするかな?
0273デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/10(日) 20:10:47.20ID:BxaTac1G0
>>268
267だが、Cは推論エンジンを作れると言ったはず
おまえさん自身はそこから学習しなかったのか?

10万ねえ
支那の国家プロジェクトがどうなっているか知っているか?
支那からのSPAMに「天安門」と書いて返信すると我々にとって
ありがたい動作をしてくれるというアレだ
国家ではないが大企業のAIが共産党は無能とか言い出して
ひと騒ぎにもなったよなあ
おまえさんの10万円のソフトはおまえさんを無能とか
言い出さないか?
0274デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 20:26:02.78ID:Z8XrRGDBa
あとC言語でタイムマシン作れる?
といっても未来のインターネット閲覧できる程度でいいんだが。
作れる人いたら10万円までなら出すぜ。
0277デフォルトの名無しさん (ワッチョイ 576c-+qdT)
垢版 |
2017/09/10(日) 20:42:41.68ID:I7ZEh6pU0
物理法則なんて人間が考えたものに過ぎないからどうせ間違いだらけでしょ?
0279デフォルトの名無しさん (ワッチョイ 3b97-oRRO)
垢版 |
2017/09/10(日) 21:11:06.17ID:n6o1Bnrv0
物理は、むずかしい
0288デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/12(火) 22:47:32.51ID:CGKPtYms0
>>284
馬鹿つっても、少なくともおまえみたいな自宅警備員より1ペタくらいマシだよ
コーダーでやってけてるやつナメてんだろ、おまえ ボケ!
0293デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 12:41:46.69ID:cFJcbLHs0
>>289
いいこぶってろクズ
現業がいなきゃ自分じゃ何もできないやつが
現業をバカにするのを見ると虫酸が走るんだよ
0295デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 13:33:05.82ID:cFJcbLHs0
人件費のダンピングは国が国民を保護する義務の対象だが
真面目にやってくれなくて我々はその被害を受けているのだ
本来、能力に応じた収入があるべきという感覚そのものを
捨てちまったブタはいいねえ悩みがなくて
0296デフォルトの名無しさん (ワッチョイ b3be-v0Ju)
垢版 |
2017/09/13(水) 14:36:38.24ID:GgkwnlJN0
>>295
本来能力に応じた報酬を受け取るべきと考えて、それが受け取れない事に不満を持った連中はとっくに逃げ出してる
残ってるお前らは不満を持ちながら逃げ出す事さえ出来ないゴミ
下に見られてもしょうがない
0298デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 15:31:18.76ID:cFJcbLHs0
>>296
俺より年収1桁少ないやつにだけは言われたくねえぜ
なに、2桁? そりゃ失礼したw
0301デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 16:18:46.88ID:cFJcbLHs0
妻子持ちがどのくら金いるか
童貞にはわからんようだな
0303デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 16:42:40.48ID:cFJcbLHs0
284にぬかせボケ
0304デフォルトの名無しさん (ワッチョイ 3b00-xkdj)
垢版 |
2017/09/13(水) 17:15:26.17ID:7kZqRPKj0
クソスレ過ぎ笑う
0306デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 19:25:13.27ID:cFJcbLHs0
>>305
奴隷? 俺は領主の立場だ
おまえと一緒にするな無礼な
0313デフォルトの名無しさん (ワッチョイ 9a6f-vOdE)
垢版 |
2017/09/13(水) 21:56:29.09ID:dVC5ajCT0
マ板でやれ
0314デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/13(水) 22:36:54.70ID:cFJcbLHs0
>>312
俺は金持ちじゃねえ
単年度で8桁いっても次年以後で気を抜けばボコボコだ
一生遊んで暮らせる金があるやつにしか子供を作らせないなんて国策はねえ
童貞がイソップの葡萄こいてろ、こちとら稼いでみせると必死こいてんだ
0316デフォルトの名無しさん (ワッチョイ d3f7-sU5l)
垢版 |
2017/09/14(木) 17:55:25.19ID:r9C1TnUx0
まんこ
0317デフォルトの名無しさん (ワッチョイ 6123-pAdv)
垢版 |
2017/09/14(木) 21:35:54.73ID:Ng+6QcSm0
>>299
3桁って、10進数だと999円が限界だぞ
0322デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/21(木) 20:42:10.28ID:x8dEnzes0
for(;~scanf("%d",&a);)とかwhile(~scanf("%d", &a))とかで~がないだけで永遠に入力ループするんだけど
~ってなにを宣言してるんだ教えてくれ
0325デフォルトの名無しさん (ワッチョイ 8b11-hoCt)
垢版 |
2017/09/21(木) 21:23:35.16ID:kYTPFpbC0
本来なら 変数a に格納されるまでループしたい意図だろうけど・・・・・

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

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

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

これがあるので scanf は使うな、と良く言われてる所以
0326デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/21(木) 21:54:22.20ID:x8dEnzes0
一行読み込みで同じ処理を数値なくなるまでしたいんだけどどう読み込んだ方がいい?
0327デフォルトの名無しさん (ワッチョイ 8b11-hoCt)
垢版 |
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 に値が格納されたよ */
:

}
0333デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/22(金) 01:39:40.49ID:BRiVyzo00
forの継続条件がどう動いてるのかわからないな読み込めた時はループして読み込めなかったときはループ抜けるってのがどう判定されてるのか見えないな
0334デフォルトの名無しさん (ワッチョイ eb6f-9dtB)
垢版 |
2017/09/22(金) 02:12:21.25ID:exEqzPdX0
>>333
scanf("%d",&a);
で、数値が来れば取り込みに成功した個数、つまり1を返し、失敗なら0を返す
それを~でビットNOT、つまり各ビットを反転させるので
成功なら0x00000001を反転で0xFFFFFFFE、失敗なら0x00000000を反転で0xFFFFFFFF

ようするにどうやってもループを抜けないので、結論としては「そもそもループ条件として間違ってる」
>>324の言う通り~は不要
0336デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/22(金) 03:10:18.60ID:IvB4cJv30
>>335
簡単なので多分もう世界中に山ほどあると思うが、標準化されてないだけだろうな。
0337デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/22(金) 05:10:39.06ID:BRiVyzo00
while((a=Console.ReadLine())!=null)こうゆうので入力がなかったら終了するって簡単にできればC言語も楽なんだけどな
0338デフォルトの名無しさん (ワッチョイ 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;
}
こんなしょーもないのでいいのに標準化委員会は斜め上なことばかり・・・
0339デフォルトの名無しさん (ワッチョイ 06aa-73Ld)
垢版 |
2017/09/22(金) 20:47:03.45ID:dtN6vQMf0
>>334
でもscanfの前に~あるだけで入力なくっても無限ループしないで抜けるのはNOTと戻り値がNOTでtureだから抜けるの?
0340デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/22(金) 22:06:16.56ID:IvB4cJv30
チルダ付けたのは失敗した時に-1が返されると思ったからかな?
てか、チルダ付けた場合はそれ以外で0にならんよな。
まあでもこれも整数値の内部表現の違う特殊な環境だったりしたらダメかも知れないが。
0343334 (ワッチョイ eb6f-9dtB)
垢版 |
2017/09/22(金) 22:25:08.34ID:exEqzPdX0
ごめんウソ書いたわ
一つも変換されないで入力エラーになったらscanf()は0ではなくEOFを返すらしい

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

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

} catch (...) {

}
}
0358デフォルトの名無しさん (ワッチョイ 0f23-7Jrl)
垢版 |
2017/09/23(土) 21:54:35.77ID:IblrvTVf0
>>356
たぶん原因が分かりました。
現在は標準関数をやめてWINAPIのCreateThreadを使ってますが標準関数と原因は同じです。
CreateThreadでThread1,Thread2を作成して監視してるとあるタイミングでThread2が消失してたのですが
どうやらThread1で変更があった他のグローバル変数の値がThread2で上手く読めずに終了判定されて消えてたようです。
ようするに他のグローバル変数の書き換えが原因でした。
ロック処理をしたりしたのですが上手く行かずグローバル変数すべてにvolatileをつけると上手く動いてるようです。
でもこの回避作で良いんでしょうか?CriticalSectionを使ったりして処理してもうまく他スレッドでグローバル変数が
参照出来なかったのでvolatileをつけてみたら完璧に動作するようにはなったんですが……
0359デフォルトの名無しさん (ワッチョイ 8b11-hoCt)
垢版 |
2017/09/23(土) 22:09:28.20ID:9QRg4G5c0
排他制御の問題ではなく
最適化の作業で、変数を不変値と判断し、変数参照を追い出した翻訳をしたパターン

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

a は文意から不変の定数として扱えるので
while (1) { /* */ }
に翻訳しちゃえるわけさ
0361デフォルトの名無しさん (ワッチョイ 8b11-hoCt)
垢版 |
2017/09/23(土) 22:28:00.05ID:9QRg4G5c0
volatile つけるのは1つの手ではあるが 100% 回避してくれるかは、コンパイラ次第
スレッドで共有するフラグ関係はOS側が用意してる機構を使うほうが良いんだけどねー
0363デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/23(土) 22:58:35.90ID:PasvkTo90
何の変数を使ってるか知らんが、排他取ってねーんだから書き換え途中の変数を読み取ってバグることもあるだろ
最近のVCはvolatileだけでマルチプロセッサ対応のメモリバリアになるらしいから、古いVCでビルドしてもアウトだな

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

つかね、マルチスレッドでグローバル変数を使いまくること自体がだね、、、
0365デフォルトの名無しさん (ワッチョイ 2b23-PvnN)
垢版 |
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では直らないはず。
0367デフォルトの名無しさん (ワッチョイ 0f23-7Jrl)
垢版 |
2017/09/23(土) 23:26:59.26ID:IblrvTVf0
>>361-365
CriticalSectionつかってグローバル変数の書き込み時にはロックをするのも試してみたんですが
やっぱりthread2が途中で死んで(内部のループで終了判定になってしまって)、ダメだったんですよね。
それがグローバルにvolatileをつけると普通に動作するようになってるんです……
0368デフォルトの名無しさん (ワッチョイ 0f23-7Jrl)
垢版 |
2017/09/23(土) 23:29:48.18ID:IblrvTVf0
こういう事ですか?
CriticalSectionによるロックもやる必要がある。理由はロックしてない時固有の問題もあるから。
今回の不具合はコンパイラの最適化が原因だったのでvolatileで回避できただけ。
ロック処理もvolatileも両方やる必要がある。ということですか?
0369デフォルトの名無しさん (ワッチョイ 8b11-hoCt)
垢版 |
2017/09/23(土) 23:33:50.34ID:9QRg4G5c0
書き込み時だけロックして 読み込み側のほうはロックせずに読み込んでる
片手落ちのように受けとれる文章だけど・・・ 排他制御をちゃんとやってたうえでの話?
0370デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/23(土) 23:49:15.83ID:8bsZ0VcP0
volatileにしてロックして読み書きするのが普通では?
0372デフォルトの名無しさん (ワッチョイ 2b23-PvnN)
垢版 |
2017/09/23(土) 23:57:26.40ID:Z1NsXN0c0
>>368
× > 今回の不具合はコンパイラの最適化が原因だったのでvolatileで回避できただけ。
○ コンパイラの不具合ではなく、君のコードの問題で、
 volatileで動いているように見えるのはバグに当たる確率が低くなっただけで、直ってはいない。

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

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

ここら辺分かってなくてグローバルで同期ってのはマルチスレッド初心者なのだろうけど、
バグったらsync入れまくってデバッグはセオリーではあるし、まあがんばれ、と。
ただ、おそらく同期の仕方を根本的に間違ってるから、知ってる人に見てもらったほうがいいとは思うが、
コード内のグローバルは常に「最新」を期待しているのであれば、ロック+volatile+フェンスで動くはずでもある。
0379デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/24(日) 10:21:22.00ID:jg2xx4vD0
はあ、そうですか
共有リソースの排他アクセスのためのAPIなのに、ロック対象がわからないからロック無視して最適化しますと
それが真実ならWinAPIとVCが腐ってるんじゃないですか
0382デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/24(日) 13:57:54.86ID:c233uqnI0
腐っているのでしょう
0383デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/24(日) 14:40:58.49ID:jg2xx4vD0
メモリバリアを跨いでオブジェクトへのアクセス命令を最適化するとか
そんな頓珍漢なことを言う腐った奴がいるとは思わなかったわ
volatileを何だと思ってんだか
0385デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/24(日) 16:31:41.65ID:jg2xx4vD0
CriticalSectionの話のつもりだったんだけど、CreateSectionに変わったの?
それならごめんだわ、>>378で唐突に出てきて誤字だとばかり
さすがにそんなアホな話題転換があるとは思わなかった
0387デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
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とかのほうが手軽そうだけどね
0389デフォルトの名無しさん (オッペケ Sra3-Brv+)
垢版 |
2017/09/25(月) 03:09:32.37ID:eX6e3GbIr
Cのコンパイラはクリティカルセクションなんて知らない。単なる構造体かなんかのtypedefとして実直にコンパイルするだけ。
スレッド関連の関数についても単に関数の一種として扱うだけ。

従ってスレッドやクリティカルセクションを扱っているかどうかが最適化の結果に影響することはない。
一方volatile指定はコンパイラが認識するキーワードで最適化に影響する。
0390デフォルトの名無しさん (ワッチョイ 0f23-7Jrl)
垢版 |
2017/09/25(月) 04:54:33.75ID:glvYaQMb0
ということは今回の事例だと排他制御しても不具合は解消できなかったという事かな?
volatile付けて最適化を無効にすることが正しい解決策だったということになる?
0391デフォルトの名無しさん (ドコグロ MMb3-gXon)
垢版 |
2017/09/25(月) 06:45:40.93ID:/OvZrhVRM
>>387
だからそれはメモリーバリアの話で最適化の話とは別だよ
繰り返しになるけど CriticalSection は排他制御するリソースを知ることはできないしコンパイラも CriticalSection のことを知らない
0398デフォルトの名無しさん (オッペケ Sra3-Brv+)
垢版 |
2017/09/25(月) 12:40:04.95ID:uoxmxxDAr
>>394
おおごめん、規格自体には詳しくない

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

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

やってみればわかるけど、CriticalSecltionの有無でアセンブル結果が違う
0403デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/25(月) 23:03:28.51ID:LPAVGpvK0
CriticalSectionに限らず未知の関数が呼ばれたのであれば、その中でグローバル変数やらが変更される可能性を考慮しなければならない
他にも、ある関数の引数にローカル変数のアドレスを渡すと、以降の別関数内でそのアドレス経由でローカル変数を変更される可能性がある
よって、場合によってはローカル変数であっても関数呼び出しを跨いで最適化できなくなることがある

わからないからこそ、最適化してはならないんだよ
0404デフォルトの名無しさん (ワッチョイ 2b23-PvnN)
垢版 |
2017/09/25(月) 23:26:04.50ID:3XblncDf0
>>390
ならない。君のソースコードだけの問題だ。同期機構の使い方が悪いだけ。

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

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

サーバ用とかでソフトが長期間使われる場合は要注意だ。
0407デフォルトの名無しさん (ワッチョイ 1eaa-ZPBl)
垢版 |
2017/09/26(火) 01:21:21.88ID:mvSUAuA/0
マルチスレッドは、たまたま動いているだけで、
ちょっとしたタイミングで、バグる

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

プロは、Elixir などの関数型を使う
0408デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/26(火) 02:12:13.37ID:8E9hjYW60
いや、ちゃんとロックすりゃなんとかなるってw
もちろん最初から考慮されてる言語は何も考える必要ないからうまく行って当然。
0412デフォルトの名無しさん (ワッチョイ 1396-Otw/)
垢版 |
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;
}

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

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

目的達成するためにどこが悪いのか教えてくださいよ
0420デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/28(木) 00:13:55.27ID:LEgoP/Tm0
>>412
本当にそれがソースの全てか?
0422デフォルトの名無しさん (ワッチョイ 23f0-IQJU)
垢版 |
2017/09/28(木) 08:22:53.76ID:veeq8lRB0
>>415
windowsプログラムでFuckファックは初心者がやるものではない
何故かと言うとFuckファックは非常に拙いからで、これはご存じの通りにFuckファックつまりはセクロスとかセックスを意味する
FuckRawInputなどと書かれると非常に面食らうので、動作には全く関係ないがFuckファックの箇所をHookフックとする
Fookという間違いならまだしもFuckが出てくるのは途轍もなく拙い

windowsプログラムは入門書を一通り終えた後にようやく手を出せる程度に面倒くさい
0426412 (ワッチョイ 9596-5hSF)
垢版 |
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);
0433デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/29(金) 01:17:32.92ID:EHQhOpQV0
>>426
本当にそれがソースの全てなのか?
0434デフォルトの名無しさん (ワッチョイ 9baa-iHa+)
垢版 |
2017/09/30(土) 05:35:50.31ID:/O3sxKWS0
これ無理だろうWindowsプログラムの言語を理解してないと直せないっしょ
0436デフォルトの名無しさん (ワッチョイ 2312-IQJU)
垢版 |
2017/10/02(月) 13:06:27.14ID:6IbuGwAs0
>16 :デフォルトの名無しさん:2006/03/10(金) 22:15:19
>>>10
>> こんな変数名があちこちに散らばっているのがPerl
>
>大学の研究室のボスは、特殊変数の表をふ〜んと2分ほど眺めて完全に暗記した。
>
>そういうレベルの人たちのための言語なんだなと思って、トイレで血の涙を流した。
0437デフォルトの名無しさん (ワッチョイ 2345-U38j)
垢版 |
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をプリントしたりすると何故か問題なく動きます。
この部分だけ切り出したテストコードでは全く再現しませんでした。
この手のエラーでよくあるのは未初期化領域へのアクセスだと思いますが、
@で領域の確保はできているからこれは原因ではないですよね?
どこがエラーの原因でしょうか・・・?
0439デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 06:57:44.74ID:ZkSEHHAS0
うん、funcが怪しい
0440デフォルトの名無しさん (ワッチョイ e59f-Txnz)
垢版 |
2017/10/03(火) 08:24:29.85ID:759fwjeu0
うん
0441デフォルトの名無しさん (ワッチョイ b5ea-asy+)
垢版 |
2017/10/03(火) 11:40:15.04ID:QFI8P6tG0
配列サイズ 32要素で 32個 空白で生めてるが
文字列 という用語を使ってるあたり func は一般の文字列操作してそうだけど
終端記号 '\0' の分の考慮が落ちてるんでないの?
0447デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/03(火) 15:39:40.20ID:2Eoq+Ro56
>>446
だめ
0448デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 16:18:15.22ID:9r7sfmBO0
char charList[n+1,32]こうしないとダメだよね?なにかっこ二つ使ってんだよ読み込めねえよって昔2次元配列で怒られたな
0450デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:45:08.36ID:ZkSEHHAS0
うん、今の1回生が生まれた頃から
0451デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:25:07.16ID:9r7sfmBO0
>>449
なったのか少しは便利になったのか
0455デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:53:27.85ID:9r7sfmBO0
>>448
これダメだC#だった、エラーになるわ
0457デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:39:06.25ID:djTGgeKPp
iOS11にしたらまともに入力できない

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

このクソOS
0459デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:23.61ID:djTGgeKPp
このクソOS死ね
0460デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:56.99ID:djTGgeKPp
まともに入力できないって
0462437 (ワッチョイ 2345-IQJU)
垢版 |
2017/10/04(水) 01:30:41.39ID:+TP/cS/R0
返事が遅れてすみません。レスありがとうございます。
再現性の乏しい質問で申し訳ないです。

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

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

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

さっぱり原因が想像できないのですが、考えられる可能性としては、funcの中でメモリがずたずたに壊れたものの
偶然エラーにならずに戻ってきてmemsetでやっと死んだ、というパターンでしょうか?
0463デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/04(水) 06:19:36.24ID:Sd/env2d0
>>452
存在するだろ
char charList[32]と等価になるぞ
0467デフォルトの名無しさん (アウアウカー Sad1-pOaJ)
垢版 |
2017/10/04(水) 08:22:11.58ID:F93q6j3ba
ってか二次元配列と二重配列間違ってねーか?
それとfunc呼んでからmemsetしたらfunc呼ぶ意味あるの?
memsetもループさせるんじゃなく一回で全部fillした方がよくない?
とかとか。
0470デフォルトの名無しさん (スップ Sd03-vp8x)
垢版 |
2017/10/04(水) 13:49:31.85ID:hBVSLcAId
>>469
funcの中身を知らないのに「意味無い」とか「意味あるの?」とかっていう書き込み、意味あるの?
それを聞けば問題の解決になるの?

少なくとも空白を埋めてない部分があるし
問題が発生する範囲で簡略化したのかもしれないし
当然意味があるから呼んでるんだろうと思うのが普通
0479デフォルトの名無しさん (ワッチョイ 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 }
} ;
0480デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:56:16.34ID:+admsRHQ0
↑構造体の初期化で
charを連続4byte設定するときの書き方
0x00000000はたぶん違いますよね?
どう書けば良いんですか?

初心者過ぎてすいません
0481デフォルトの名無しさん (ワッチョイ 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 }
} ;
0483デフォルトの名無しさん (ワッチョイ 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 },
} ;
0484片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd43-sxBl)
垢版 |
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
} ;
0487デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/04(水) 17:28:20.90ID:VznoOWf36
PCでも上じゃね?
0488片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd43-sxBl)
垢版 |
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)} },
} ;
0489デフォルトの名無しさん (ワッチョイ 7576-vp8x)
垢版 |
2017/10/04(水) 18:04:30.94ID:9y3nqzOw0
構造体の中身から推測すると、
書く順番はエンディアンに依存しないと思う
単純に配列の頭から1バイトずつ送信するだけ

仮にエンディアンで順番が変わるとしても
どうせガッツリ環境依存なコードなんだから
依存しちゃえばいい
環境依存が無いコードを書くつもりなら、
charが1バイトかどうかにも依存しないようにしないとね
0491デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/04(水) 18:48:35.51ID:VznoOWf36
もちつけよw
0501デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/05(木) 01:23:13.38ID:ioWgBjMx0
>>483
やってみな。
0503437 (ワッチョイ 5a45-wbjw)
垢版 |
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をプリントしたりすると何故か問題なく動く」からそれで一時凌ぎする考えも
頭をよぎりましたが、思いとどまりました。

ひとまずこれで終えます。回答くださった方々、本当にありがとうございました。
0509デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/05(木) 10:10:50.98ID:6niZC7Nf0
>>506
堂々と嘘つくんじゃねえ
sizeof(char[m][n]) != sizeof(char**)
0510デフォルトの名無しさん (ワッチョイ da33-qWqy)
垢版 |
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
0511デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/05(木) 12:14:43.27ID:6niZC7Nf0
そういう保証は紙っきれの条文より自分で確認・検証することが最重要だ
いくら「保証されている」ことでもコンパイラがバグったり中には確信的に違反するケースまである

空想論の域を出ないくだらんことのために
現実的なアイディアを諦めていては生産性が上がらない
0512デフォルトの名無しさん (ワッチョイ 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バイト一気に設定の書き方はどうすればいいんでしょうか?
0517デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/05(木) 13:04:36.67ID:TRdRMfhC0
なるほどー ありがとうございました
0519デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/05(木) 13:13:39.58ID:/W/G46pt6
無名配列のリテラルは初期化時には使えるけど代入には使えないってこと?
0520デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/05(木) 13:16:53.65ID:/W/G46pt6
初期化時というか宣言時
0528デフォルトの名無しさん (ワッチョイ 9d76-hWC7)
垢版 |
2017/10/05(木) 20:34:21.70ID:3IfCpLlr0
整数の負の数に1の補数を用いる環境
整数の負の数に絶対値と符号ビットを用いる環境
整数にトラップ表現がある環境
charが8の倍数ビットでない環境

を教えてください
0529デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/05(木) 20:34:53.22ID:olaqz/S6p
ARMは選択出来たっけ?
まあ、みんなリトルで使ってるがな。
地味にMicroBlazeがビッグだな。
0535デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/05(木) 20:46:52.00ID:olaqz/S6p
6502とか、地味に生きてるやん?
あ、あれはエミュレータか。
0536片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdfa-yc5c)
垢版 |
2017/10/05(木) 21:04:49.44ID:Xv32D2hUd
ほとんどの環境のcharが8ビットなのは、基本ASCIIが7ビットで表現できることと、7ビットより8ビットの方が切りが良くてパリティビットなどに使えて便利だったことによる。
0537デフォルトの名無しさん (ワッチョイ 054b-5Ff0)
垢版 |
2017/10/05(木) 21:09:26.31ID:PAHxl06e0
最近C言語ハマってる
言語がシンプルなのと直にコンピュータを操ってる感
0546デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/05(木) 23:58:01.04ID:ioWgBjMx0
>>512
strncpy(I2C_MEM0.DATA, "\x11\x12\x13\x14", 4);
0547デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/06(金) 00:05:52.06ID:L6h7mNkA0
実行時間の長い再帰関数(ハノイの塔)を実行しながら過程をglutというOpenGLライブラリで開いたウィンドウに描画させたいのですが方法ありませんか?
ステップ毎に再帰関数を最初から実行するしかないですか?
0549デフォルトの名無しさん (ワッチョイ 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だけでは何だか違います
0550デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/06(金) 02:18:01.36ID:x0C9073k0
>>549
いやずばり %e だと思うが?
0552デフォルトの名無しさん (ワッチョイ 059f-TYR1)
垢版 |
2017/10/06(金) 03:37:10.08ID:x0C9073k0
>>551
最近って・・・うーん。
0561デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/06(金) 10:38:12.40ID:EDz06gtM6
自分のミスはスルー
0562デフォルトの名無しさん (ワッチョイ 4623-XSap)
垢版 |
2017/10/06(金) 10:39:45.78ID:d6jfQR1X0
strncpyは0で終端される条件が毎回わからなくて敬遠していたんです。
でも、strlcpyを使うようになってから肌年齢が10歳若返りました!
今は毎日がとっても楽しいです。
0563デフォルトの名無しさん (ワッチョイ 0502-5Ff0)
垢版 |
2017/10/06(金) 10:54:46.60ID:U5/7Dlcy0
>>548
おお!センクス!
0564デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 13:16:11.88ID:qH0Ei3hn0
>>559
おまえさんが言わなくても老いた者は死にゆくように自然はできている
それを妨げるなという主張なら医療業界に言え
0565デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/06(金) 14:05:32.93ID:UT/zOTNDp
何の為にサイズ指定があるか、考えりゃわかるじゃん?
0567デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 15:16:39.88ID:qH0Ei3hn0
>>566
形容詞には比較をつけろ
一年目でおぼえる初歩だろうがボケ
0568デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/06(金) 15:20:28.76ID:B4vVDMXU0
うんち!
0571デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 20:42:56.05ID:qH0Ei3hn0
>>569
朝鮮語か日本語かには関係ない
電気屋のルールだ
0572デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/07(土) 14:47:24.49ID:f9dDdlSq0
>>555
>>546にはそのstrncpy()が書かれているが?
0573デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 10:02:50.14ID:iaWD4MFGE
PHPしかできないザコだったけどC言語が楽しい
Cのスタンダードなコーディングスタイルってないですか?
インデントにタブ使ってたりifに{}使ってなかったりするコードをよく見かけますけど
0578デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/08(日) 13:04:33.16ID:SXbZ1Yc30
>>573
ほんまC言語楽しいよな
俺もC#かWeb系スクリプト言語しか使ったことなかったんだが
0580デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/08(日) 13:05:13.53ID:SXbZ1Yc30
C++はゴミ
0581デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/08(日) 14:51:03.41ID:c+/m9riq0
>>579
いやタブ1つにして表示幅はスペース4つ分だ。
0582デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/08(日) 14:54:49.62ID:c+/m9riq0
>>576
ああ。もうこのスレはスペース開けるか開けないか改行するかしないか何文字にするか中括弧はどうするか行末にバックスラッシュ入れて次行に書くか書かないかgotoどうするか等の話で延々と10年ぐらい費やされるんだろうな。
もちろんエディタの話に飛び火してviがvimがemacsがとなる。
0585デフォルトの名無しさん (ワッチョイ 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などという変数を使って間接的に宣言するのか? >>
<< うんちくきぼんぬ >>
0591デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/08(日) 17:16:54.10ID:tULmhvm40
なるほどー ありがとうございました
0592デフォルトの名無しさん (ワッチョイ b68a-YM+x)
垢版 |
2017/10/08(日) 17:26:51.19ID:F9J/pQ0V0
>>590
C++ではtypedefは不要だよ(別にあっても構わないけど)
structとclassはメンバーのデフォルト設定がpublicかprivateかという違いを除けば構文的には全く同じように使える
structで継承することすら出来る
0593デフォルトの名無しさん (ワッチョイ 75b3-qWqy)
垢版 |
2017/10/08(日) 17:32:00.82ID:dE95R3nJ0
>>592
論点はそこじゃなくて
 struct Person { };
 Person p;
が C++ では文法として通るのは指摘の通り

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

こうなってるから、これじゃ C++ の文法でも通らないでしょうよ ってことで
0594デフォルトの名無しさん (ワッチョイ b68a-YM+x)
垢版 |
2017/10/08(日) 17:37:28.39ID:F9J/pQ0V0
通るよ
class宣言ではいちいちtypedefなど使わないのと同じように構造体でもtypedefは省略するのが一般的
むしろ先頭の構造体テンプレート名を省略して最後の型名だけ宣言する場合も多い
0602デフォルトの名無しさん (エーイモ 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個で{}を省略しないルールだけにしたいと思います。
0603デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 19:04:57.70ID:uO7C8UFXE
空白8個なのはメモ帳で見た時にこのくらいだから合わせてるだけです
0609デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/09(月) 01:05:37.72ID:6VRPxojV0
マンデルブロの描画がうまくいきません。ズームするとすぐに単調になってしまいます。

動画
https://youtu.be/Ompp_YwrLPw

ソースコード
http://codepad.org/mlm33eRT
0612デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/09(月) 01:53:40.87ID:6VRPxojV0
>>610
一応クリックするとある境界線付近を拡大するようにプログラムに書いてるのですが...
0616デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/09(月) 08:53:44.75ID:IXUwPWpS6
>>613
変えても同じでした
>>614
>>615
なるほど!家に帰ったらやって見ます!
0620デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/09(月) 12:12:59.35ID:9ioWbZDx6
Linuxのソースコードは?
0622デフォルトの名無しさん (ワッチョイ 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 ;
}
}
0623デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:22:20.38ID:98rFBdXp0
↑単純に関数内で構造体のデータにポインタ+インデックスでアクセスしたい
0624デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:26:06.29ID:98rFBdXp0
間違い発見
p += 1 ; は aaa += 1 ; に置き換えてください
0625片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdfa-yc5c)
垢版 |
2017/10/09(月) 14:39:31.76ID:vdfcSFiBd
>>622
何がしたいのかわからない。
代入の左辺は右辺と互換性のある型じゃないといけないし、配列まるごとの代入はできない。
まずは代入の型をそろえないと。
0627デフォルトの名無しさん (ワッチョイ 5ae1-bBfX)
垢版 |
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] に代入できない
0628デフォルトの名無しさん (ドコグロ MM0d-Nz6W)
垢版 |
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 の言う通りなにをしたいのかよくわからん
}
}
0629デフォルトの名無しさん (ワッチョイ 5593-Xc0J)
垢版 |
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 をまとめただけ、だけど。
0630デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/09(月) 17:19:35.64ID:tFlwnlNI0
>>629
c を char *c[2] で宣言しておけばなんとかなるね。
0631デフォルトの名無しさん (ワッチョイ 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 ;
こんな書き方ってできるの?
0632デフォルトの名無しさん (ワッチョイ 75b3-qWqy)
垢版 |
2017/10/09(月) 17:44:30.12ID:N3YX2Zf80
ポインタを返す場合はそういう書き方
aaa->DATA+3
ポインタの指してる先を求めたい場合は
aaa->DATA[3]

左辺が何を要求しているのか(どういうものを操作したいのか)を頭の中で整理せずに
記述法だけを即物的にトレースするのはとてもまずい
0633デフォルトの名無しさん (ワッチョイ 958a-j1W8)
垢版 |
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の糖衣構文)、ドットとアローそれぞれの
左側の違いを理解しないと先には進めないよ
0635デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 10:23:33.14ID:jY+yK3vs6
過疎ってるな
0636デフォルトの名無しさん (ワッチョイ 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] ;
}
}
0637デフォルトの名無しさん (ワッチョイ 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] ;
}
}

に修正します
0638デフォルトの名無しさん (ワッチョイ 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 ;
}
}

に修正します
0640デフォルトの名無しさん (ワッチョイ 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の意味が
希薄になるのでコンパイラに対する変数だよと明示(コンパイラ&設計者に)したいのだが
そんな書き方ある?ということでありまして
0641デフォルトの名無しさん (ワッチョイ c9ea-89ZN)
垢版 |
2017/10/12(木) 12:41:11.33ID:Z8zboj8V0
多少は意図した記述に沿って機械語出力するだろうけど、
保障されてるわけでもないし、最適化他でどうなるかもわからん

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

volatileは最適化抑止(消すなー!)のための記述と認識しているんですが
volatileの逆の機能が欲しいんですよね 実体化するなー!ってやつです
0646デフォルトの名無しさん (ワッチョイ c9ea-89ZN)
垢版 |
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);

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

キャストのためのループであることをコンパイラに
推論させるための変数指定の仕組みがあるのかな?ってはなし
0649デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:32:07.54ID:9bJ1Vwh10
まあ 指定しなくても現状でコンパイラは推論してるけれどもねw
なんかキモチ悪いといえばキモチ悪いんで指定できればうれしいってだけです
0650デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 14:36:32.09ID:OhN0e73F6
死ねゴミ
0651デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:37:45.66ID:9bJ1Vwh10
なんかすぐ出てこないところをみると
そこらへんはコンパイラまかせなのね
0652デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 14:38:53.90ID:OhN0e73F6
クッサ
0656デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 15:03:43.28ID:9bJ1Vwh10
大体わかりました
ありがとうございました
0657デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 15:06:24.03ID:OhN0e73F6
一から10まで足し合わせるプログラムを教えてください。
0659デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 15:18:14.51ID:OhN0e73F6
>>658
ありがとうございます!
0661デフォルトの名無しさん (ササクッテロレ Sp45-NqOW)
垢版 |
2017/10/12(木) 20:36:00.66ID:1sF6m3D2p
俺は逆だと思っている。
人に上手く思いを伝えられないからこそ、
表現手段を駆使して伝えようと努力するんだよな。
絵とか音楽とか、クリエイターってそんな生き物。
0662デフォルトの名無しさん (ワッチョイ 13b3-itUa)
垢版 |
2017/10/12(木) 21:49:52.42ID:wn8w1zGC0
>>661
> 絵とか音楽とか、クリエイターってそんな生き物。
全然違う
あいつらは自分の思いを伝えられるのは自分の表現法方だけだと思ってる
絵を描く奴で説明文を書いて思いを伝えるやつなんていないだろ
0663デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/12(木) 23:57:59.88ID:5ILt7KpA0
>>645
メモリマップドI/Oに使える。特定のアドレスを読むとキーボードで入力した文字が読めるとか、そういうやつ。
読んだ直後に内容が変わる可能性があるので volatile でないとまずい。
0664デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/13(金) 00:30:38.46ID:neFZx4WS0
共有メモリとか mmap() して複数のプロセスまたはスレッドがアクセスする領域も同じか。
あれ? こんなのちょっと前に話題にならなかったか?
0666デフォルトの名無しさん (ワッチョイ 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 ; 実体化

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


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


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

つまり、おまえさんの言うように整数変数を
そのままアドレスの表現に使っていた
0675デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:42:43.01ID:UePpwGnn0
なるほど ありがとうございました
0678デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:49:08.21ID:UePpwGnn0
ちょっとお尋ねします
ベテランとお見受けする方は

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

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

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

アスキーコード "2F2F"って何かあるんですか?
0687デフォルトの名無しさん (ワッチョイ 1993-grZD)
垢版 |
2017/10/13(金) 17:23:15.84ID:kwktlkZb0
>>682 の話は行の最後に \ があると次の行に継続するってやつかな。
その言語仕様と Shift-JIS の特定文字との組み合わせで問題が起きる。
「表」や「能」は文末に来る可能性が高い字でしょ。
0702デフォルトの名無しさん (ワッチョイ 0b3f-MWTH)
垢版 |
2017/10/13(金) 19:53:08.82ID:/fw1jTt60
またfgets厨が湧いたか
Cスレには付きものだが
誰が吹き込んでるんだかしつこさが異常なんだよな
まったく
0703デフォルトの名無しさん (ガックシ 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;
}
0705デフォルトの名無しさん (ワッチョイ 0b3f-MWTH)
垢版 |
2017/10/13(金) 21:08:48.11ID:/fw1jTt60
何がどのように何に対して優れているんだ?
腐っても工学者たるもの客観的で再検証可能な主張をしてみな
0707デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/13(金) 21:17:30.86ID:yVfJQeWEp
え?scanfは、この通り打ち込まないと認識しないよって事だろ?
0709デフォルトの名無しさん (ワッチョイ 5975-HijE)
垢版 |
2017/10/13(金) 21:31:55.79ID:DZqiVJRN0
>>706
dクス
0712デフォルトの名無しさん (ワッチョイ eb7f-MV6u)
垢版 |
2017/10/13(金) 22:15:45.85ID:xDZ8VANT0
それ都市伝説だから、単に使い方間違えてるだけだから!
フィールド幅をちゃんと指定すればscanf系でも安全だよ?

まぁ、エラーメッセージの都合上fgets使うかもだけど。。。
0716デフォルトの名無しさん (ワッチョイ 1387-NqOW)
垢版 |
2017/10/13(金) 22:31:22.01ID:KDt3KwS+0
C言語はアセンブラのラッパー言語だから、そう言うもんは各自が気を付ければいいのであって、へんな関数量産すんな。
0718デフォルトの名無しさん (ワッチョイ 1993-grZD)
垢版 |
2017/10/14(土) 05:25:15.07ID:G4fIdpwa0
m修飾子はscanf()の中でバッファの確保とポインタ代入をしてくれる、か。
使用者側がバッファを用意して容量はこれだけ、と言明するのとはちと違うね。

実用だと書式文字列をsnprintf()か何かで生成する手かなぁ。
0720デフォルトの名無しさん (ワッチョイ 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
0721デフォルトの名無しさん (ワッチョイ 0bf0-MWTH)
垢版 |
2017/10/14(土) 07:16:53.80ID:F19RwFTi0
>>711
くだらんなあ
%sのためにわざわざscanfなんぞ使う珍獣の話しかできんのかおまえは
0726デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/14(土) 13:41:17.27ID:YpZiBRe40
windowsの方でもscanf()のmあるのでは?
0731デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 15:59:02.19ID:bKRFV+pB0
はい ちょっとお邪魔しますよ
ISR() signal() の違いについて
どちらを使うべきなのか うんちくきぼんぬですよ
0732デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 16:17:48.14ID:bKRFV+pB0
↑割り込みハンドラで使う関数についての質問です
0733デフォルトの名無しさん (ワッチョイ 1387-NqOW)
垢版 |
2017/10/14(土) 16:24:17.93ID:J5VLsuMb0
組み込み系だとmallocなんか初期化関数ん中でしか使わない。
0735デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 16:42:09.10ID:bKRFV+pB0
なるほど! ありがとうございました
0737デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/14(土) 17:13:04.55ID:bKRFV+pB0
割り込みにまさかの独自ライブラリがあるとは思わなかった
>>736の参照先見ると色々なアトリビュートが設定できるようになっとるわw
その内容をみると自前で割り込み関係のレジスタ叩けば実現可能な機能ばかり
##pop/push/reti自動付加禁止だけはsignal()では実現不能?
signalでよさそうな気が。。。
0739デフォルトの名無しさん (ワッチョイ 0bf0-MWTH)
垢版 |
2017/10/14(土) 19:42:35.98ID:F19RwFTi0
>>722
他には?
珍獣でないと主張するにはnが小さすぎるぜ
その小さすぎるnでどうたら言っちゃうおまえ
自らへの死刑宣告を読み上げている自覚はあるのか?
0740デフォルトの名無しさん (ワッチョイ 79b3-dPak)
垢版 |
2017/10/14(土) 19:59:48.25ID:4XKuJznc0
クッサ
0741デフォルトの名無しさん (ワッチョイ d360-qUyi)
垢版 |
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() だので処理するのが定石
0742デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/15(日) 04:40:36.84ID:aLoOQk2A0
>>727
てか、C言語のライブラリの問題なのであるともないとも言えるよな。
POSIX準拠でないCコンパイラでも同じ動きをするライブラリをリンク時または実行時にリンクするならそう動くわけだし。
WindowsでもGCCでコンパイルするならそうなるわけだし。Cygwinの中ならなおのことそうだ。
0743デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/15(日) 05:29:35.87ID:ZgJv24or0
そう言えば fgets() も1行の長さが指定した長さ以上になった場合に入力に残るよな。
で、だいたいは妙に長いバッファ用意して誤魔化す(またはそういう仕様にするw)わけだが、
そういうのが通用しない場合はそれを上回る入力をされた時にエラーにするかまたは入力に
残った不要な文字列を捨てる処理はあった方が良い。そうでないなら GCC の getline() を
使うかまたは自作するかだ。
0745デフォルトの名無しさん (ワッチョイ 13b3-itUa)
垢版 |
2017/10/15(日) 07:05:24.20ID:KCBqed/H0
>>743
> そう言えば fgets() も1行の長さが指定した長さ以上になった場合に入力に残るよな。
当たり前だろ
より長い入力が想定されるなら普通に改行がでてくるまで続けて読めばいいだけだし
妙に長いバッファとかアホすぎる w
0747デフォルトの名無しさん (ワッチョイ 0102-MWTH)
垢版 |
2017/10/15(日) 09:47:59.48ID:J//jr+AC0
はははは、やっとn=6か
で、%sさえ使わなきゃscanfは安全なのか?
0748デフォルトの名無しさん (ワッチョイ 0102-MWTH)
垢版 |
2017/10/15(日) 09:48:32.63ID:J//jr+AC0
>>741
>>747
0751デフォルトの名無しさん (ワッチョイ d1c7-MWTH)
垢版 |
2017/10/15(日) 13:38:38.59ID:R4tP3Q0h0
>>749
わからないだと?
おまえシッタカこいてただけか

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

>シッタカ
大局観といってほしいね
0753デフォルトの名無しさん (ワッチョイ 794b-dPak)
垢版 |
2017/10/15(日) 17:10:16.88ID:/ln1Xcyy0
scanf vs fgets
もう終わり?
0754デフォルトの名無しさん (ワッチョイ e9c6-BSx0)
垢版 |
2017/10/15(日) 17:14:39.09ID:Yk/ODCzd0
くだらん戦いだ
0756デフォルトの名無しさん (ワッチョイ d108-MWTH)
垢版 |
2017/10/15(日) 19:51:17.65ID:DZC0OlhV0
>>753
終わりつーか始まってない
そもそもscanfを把握してない御仁とでは話にならなくて
0757デフォルトの名無しさん (ワッチョイ d360-qUyi)
垢版 |
2017/10/15(日) 20:51:34.80ID:12RNBD+40
scanf() の詳細仕様を把握しないと判断できない、というのはどうかな?
scanf() が初期のころから建て増し建て増しでどんどん増えていったあの方向性は、正しくない複雑化のしかただと思うよ
scanf() を書く側にたってみると、おぞましい
0758デフォルトの名無しさん (ワッチョイ e9c6-BSx0)
垢版 |
2017/10/15(日) 21:09:03.11ID:Yk/ODCzd0
scanf()
scanf()
scanf()
scanf()
scanf()
0759デフォルトの名無しさん (ワッチョイ 530f-GDEj)
垢版 |
2017/10/15(日) 21:13:13.74ID:Y+x8OcED0
超ド級初心者なんだけどおすすめの開発環境とかある?
0761デフォルトの名無しさん (ワッチョイ 530f-GDEj)
垢版 |
2017/10/15(日) 21:17:59.72ID:Y+x8OcED0
vs2017コンパイルの仕方がわからなかった(´・ω:;.:...
0763デフォルトの名無しさん (ワッチョイ 530f-GDEj)
垢版 |
2017/10/15(日) 21:22:30.69ID:Y+x8OcED0
ビルド押したんだけど反応がなかったんだ・・・
もっかい調べなおしてみる
ありがとう
0764デフォルトの名無しさん (ワッチョイ d108-MWTH)
垢版 |
2017/10/15(日) 21:51:37.18ID:DZC0OlhV0
>>757
建て増しする前の単純な仕様のscanfでさえ
%sしか攻撃できない空っぽ脳みそと
どうやってコミュしろというのか教えてくれ
0765デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/15(日) 21:56:59.72ID:kn6M0KEM0
>>763
プロジェクト作成しないとビルドできない
0767デフォルトの名無しさん (ワッチョイ fbe7-ceAT)
垢版 |
2017/10/16(月) 05:28:44.80ID:6Nh3McCV0
C言語知ってたらC++簡単に扱える?
0771デフォルトの名無しさん (ワッチョイ fbe7-ceAT)
垢版 |
2017/10/16(月) 06:42:19.28ID:6Nh3McCV0
まあ入出力でCとC++で違うのは解ってたけど本読んで書いてあったのはC++で書いて動かなかったら
最悪Cで書けば動かせるということは書いてあったな
0772デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/16(月) 11:15:45.26ID:tZR41NVXp
つか、コマンドラインアプリで文字列受け取るのは、実行時引数だけで充分だろ。
0774デフォルトの名無しさん (ワッチョイ 09b3-NqOW)
垢版 |
2017/10/16(月) 14:21:36.48ID:JrEYnkdn0
対話型ツールなら、きちんと入力解析エンジン載せれや。
なんだよscanfってw
0775デフォルトの名無しさん (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 14:22:15.72ID:QsDGIdoW0
gccのワーニングで、「declared inside parameter list」これを無視したいです。
-Wではじまるオプションはなにを指定すればよろしいですか?

#pragma GCC diagnostic ignored "-W???
0782デフォルトの名無しさん (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 15:04:51.05ID:QsDGIdoW0
>>778
原因はわかっています。
構造体宣言を別のヘッダーで行っているにもかかわらず、
プロトタイプ宣言しているヘッダーより上に定義がないのが原因です

>>780
gcc -w ?
#pragma GCC diagnostic ignored "-w" でしょうか?
0784sage (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 15:25:30.24ID:QsDGIdoW0
>>783
やはりそのように潰していくしかないのでしょうね。
0786デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/16(月) 22:46:04.81ID:snZUUJVe0
>>784
いや、てか、そのヘッダ書き換えられないのか?
0787デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/16(月) 22:49:48.00ID:tZR41NVXp
自身のポインタを構造体に宣言するのと同じ様に書けよ。
0789デフォルトの名無しさん (ワッチョイ 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;

}
0790デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/17(火) 20:29:18.04ID:FJCAd6676
>>789
scanfのところの\nって要らなくね
0791デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/17(火) 20:54:03.89ID:Usq7nzejp
こんなすぐに桁溢れしちまう様なサンプル作ったら、何を試したいのかわからんだろ。
0793デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 21:08:48.81ID:Q3d5MYhb0
>>790
消したら動いた
ありがとう
0795デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/17(火) 21:33:12.55ID:Usq7nzejp
初期化をあんなとこに書いたらコーディング規約で叩かれるしなぁ〜
0797デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 21:57:54.65ID:Q3d5MYhb0
VS2017でやってるんだがさっき作ったプログラムを保存して別のファイルで勉強を再開しようとして新しくファイルを作ったんだ
そしてテストも兼ねてさっきのプログラムコピペしたら
プリコンパイルヘッダーを検索中に不明なEOFが見つかりました。
'#include"stdafx.h"をソースに追加しましたか?
と出た
さっきは何もなかったのに
0798デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 22:19:31.03ID:PpmRGT3a0
>>797
それな
よく分からんけど空のプロジェクトってやつでプロジェクト作って自分でソースファイル作成すれば出てこない
まあ詳しい人が教えてくれるかも
0799片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd33-WP5G)
垢版 |
2017/10/17(火) 22:26:24.33ID:/2LkUivAd
>>797
プリコンパイルヘッダーというのは、プロジェクト内のヘッダーを事前にまとめてコンパイルしてビルドを早くする仕組みのことだ。
通常、stdafx.hというヘッダーにプロジェクトで使うヘッダーをまとめる。
一つ一つのソースファイルごとのプロパティでプリコンパイルヘッダーを作成するか、使用するかを設定できる。
0800デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:30:05.39ID:Q3d5MYhb0
>>799
つまり…どういうことだってばよ
0801デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:35:56.33ID:Q3d5MYhb0
ソースコード関係の知識は苦Cやらで積めるけどソフトやらの知識はどこで積むんだ
0802片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd33-WP5G)
垢版 |
2017/10/17(火) 22:36:28.37ID:/2LkUivAd
プリコンパイルヘッダーを使用するのであれば、プロジェクト内のどこかのソースファイル(例えばstdafx.cpp)を使って、プリコンパイルヘッダーを作成しないといけない。
あるソースファイルにおいてプリコンパイルヘッダーを使用するのであれば、プリコンパイル対象のヘッダーを#includeして、そのソースファイルがプリコンパイルヘッダーを使用することを設定する。
プリコンパイルヘッダーを使用しないなら、すべてのソースのプロパティでプリコンパイルヘッダーを使用しないように設定する(空のプロジェクトの規定値)。
0806デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:59:14.26ID:Q3d5MYhb0
>>804
とりあえず空のファイルは作れたけどソースが書けん
0807デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:01:36.30ID:PpmRGT3a0
新しいプロジェクト

空のプロジェクトを作成

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

>>789をコピペ

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

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

int main(void)
{
  /* 処理 */
}
のように書くのか、どちらが多いのか気になります。
0816デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/18(水) 18:20:58.46ID:M3PcmRrI6
入れます
0818デフォルトの名無しさん (ササクッテロラ Sp45-NqOW)
垢版 |
2017/10/18(水) 21:12:51.09ID:QINtBhkfp
各社のコーディング規約に合わせます。
0820デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/18(水) 23:24:47.06ID:bG8m3FQp0
>>815
改行入れるね。

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

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

 return 0;
}

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

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

cb とか indent なんてコマンドはその名残かな
0830デフォルトの名無しさん (ブーイモ MM71-v1IO)
垢版 |
2017/10/19(木) 12:34:12.75ID:LAmWAPnYM
>>815
統計取る方法がないから、確実な答えはわからないと思うよ。
で、戦争のたびに出る結論が「気にするな」「仕事環境に従え」なんだよねー。

で、俺はどうかと言うと、俺も不思議と>>823に落ち着いた。
0832デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:33:33.89ID:PsgLgPWo0
http://9cguide.appspot.com/15-05.html
これのモードの切り替えってところで判定結果違うんだが俺だけ?
pがでたらめな数字になる
コピペしても変わらなかったから多分タイプミスとかじゃないと思う
0834デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:50:26.60ID:PsgLgPWo0
できた
ありがとう
0835デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/19(木) 22:50:52.77ID:4jVxr5CI0
10 1
scanf("%d%d", a, b);
こう読み込んだ時に空白を飛び越えて読み込んでくれるん?
10,1
この時はエラーになっちゃう?
0836デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/19(木) 22:53:39.25ID:Y4NllfOF0
多分空白はできる
,を入れたかったら%d,%dすれば多分できる
0841デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/20(金) 00:41:34.11ID:Wby94Fq80
>>837
入力が決められてなかったらscanfじゃあできないからわかるわー
0844デフォルトの名無しさん (エーイモ SE7a-5x7G)
垢版 |
2017/10/20(金) 09:24:11.93ID:NCAWbF0uE
本買うお金がないのですが公式なドキュメントってどこで見れますかね?
0845デフォルトの名無しさん (ワッチョイ ddb3-0MKJ)
垢版 |
2017/10/20(金) 09:53:04.65ID:VprmOZRL0
>>1に書いてあるのではだめなん。
0847デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:55:02.73ID:7oD3lqB2p
C言語の仕様は規格が決まってるから、調べれば幾らでもネットに落ちてるんだがなぁ〜
0848デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:56:41.44ID:7oD3lqB2p
ランタイムライブラリやプラグマやデファインの事なら使ってるコンパイラにドキュメントがあるだろ?
0849デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:36:54.91ID:XMzxe3/+0
ネスティングを気にするかどうかは各自のスタイルによる
気にならない書き方はいくらでもできるし
ファイル分割がいやでべた書きする奴はネスティング気にするだろ
0850デフォルトの名無しさん (ガックシ 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;
}
0851デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:43:18.91ID:XMzxe3/+0
ネスティングが浅い記述しか書かない奴にとってはどうでも良い案件なんですよ
技術計算を多用するコード例だとネスティングちゃんとしないと分けがわからなくなる
0852デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 17:02:28.07ID:Hcn/q6HeM
なんで配列の要素数って省略してもいいのですか?
0855デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 17:57:17.39ID:7oD3lqB2p
配列は何次元でも扱える代わりに中身の管理は利用者に一任されたんだ。
0856デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 18:16:01.46ID:Hcn/q6HeM
>>853
配列の宣言の時です。
省略してはいけないのはどういう場面ですか?
0857デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/20(金) 18:42:47.35ID:3KJGg1dF6
>>856
初期化無しの宣言とか?
0860デフォルトの名無しさん (ワッチョイ a593-+4Iz)
垢版 |
2017/10/21(土) 07:38:47.06ID:KIdTQfIK0
>>850 すごく… 古くさいです…

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

古いコンパイラだとどっちも許されるんだっけ。
0862デフォルトの名無しさん (ワッチョイ 4e8a-JMxd)
垢版 |
2017/10/21(土) 08:49:05.01ID:TZDyO3Kt0
registerは可能ならばレジスタに割り当てると言う意味なので、アドレス演算子を使えばレジスタに割り当てられない
利用可能なレジスタ数を超えてregisterが使われうる可能性を考えれば明らか
autoとも併用できないし、半可通としか言いようがない
0867デフォルトの名無しさん (ワッチョイ 7ad2-9nkm)
垢版 |
2017/10/21(土) 10:46:45.41ID:KlHNvq3I0
仕事で5年くらいMATLABやってたけど来月からC言語やらなあかん
難しそうで、もうイヤイヤ期よ

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

応援メッセージ待ってます!
(´;ω;`)
0870デフォルトの名無しさん (ワッチョイ 317f-0GSP)
垢版 |
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.
こう書いてある
0872デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:04:46.13ID:VJktQUPlp
俺にはレジスタ変数に割り当てた変数を関数のアドレス渡し引数にする意図が想像できない。
そんなにオーバーヘッド気になるなら、グローバル変数でレジスタ変数宣言してしまえって思う。
0875デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:43:51.25ID:VJktQUPlp
じゃあそんなクリティカルな問題無い様に、関数化する事自体を諦めた方がいいのでは?
0876デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:46:37.26ID:VJktQUPlp
ヘッダーファイルにインライン宣言した関数を記述してしまうって解決方法もあるよな?
0880デフォルトの名無しさん (ワッチョイ f9d6-1OZr)
垢版 |
2017/10/21(土) 20:38:07.37ID:LO7dvffl0
グローバル変数をregister指定できたり楽しかったなあ
0881デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/21(土) 20:48:45.74ID:S+Fuo4jD0
いや、指定しても実際効果あるか無いかってだけだからなぁ
0883デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/21(土) 23:00:30.68ID:qfiVibk/0
10年前にC言語覚えたなC#もないopenGL作る時も基礎が出来てない白紙から打ち込んでたから凄い大変だったのを思い出したわ
0884デフォルトの名無しさん (ワッチョイ a593-+4Iz)
垢版 |
2017/10/22(日) 05:28:16.50ID:m20yJ7cw0
register宣言とアドレス演算子の話だけど、
Cではエラー、C++だとアドレスを取れる(register指定は無視される)、みたいね。
望洋さんのファックとWikipediaのC++に出てたわ。

…実は逆に覚えててね。
レジスタに割り当てた変数の変数のアドレスが欲しいってのは矛盾してるから、
C++は厳格にチェックするかと。
0885名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ a127-1OZr)
垢版 |
2017/10/22(日) 07:11:33.28ID:dj2Vz85u0
>>884
俺もそう思う
registerはprvalueであるべき
0888名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 12:31:48.51ID:NaoIEEjs0
世の中には、レジスタがメモリーの先頭と同じ位置にマッピングされてるCPUだってあるけどな。
0889名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 3a23-0GSP)
垢版 |
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
となり、要素の列挙がうまくいかないので対策を教えていただきたいです。
0891名無しさん@そうだ選挙に行こう! Go to vote! (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/22(日) 13:55:57.90ID:pqhboyRRp
素直に配列使え。
0892名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ a593-+4Iz)
垢版 |
2017/10/22(日) 14:15:34.40ID:m20yJ7cw0
scanf() での値の格納先 (== sumに加える値の参照先) である p を
初期化時の &x[0] のまま進めてないから入力した値が上書きされるんだよ。
もちろん x[1], x[2], ... には値が入らない。


質問の趣旨と関係ない部分を指摘して混乱させるつもりはないんだけど、
配列 x[] の要素数が足りないのがオジさん気になるなぁ。
0893名無しさん@そうだ選挙に行こう! Go to vote! (アウアウウー Sa89-PVu7)
垢版 |
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;
}
0895名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 15:27:37.67ID:NaoIEEjs0
まあ、なんでポインタに拘るのかわからんが、
つうか、書きと読みでアクセス方法は合わせた方がいいと思うが、
動きゃいいかw
0897名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/22(日) 16:41:26.75ID:iiKpFSsu0
起動の度に外部ファイルで変数の初期値を変えて起動したいんだけどどうすんの?
0899名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/22(日) 17:06:30.45ID:iiKpFSsu0
外部ファイルに変数名と初期値を書いておきたい
0901名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ a593-+4Iz)
垢版 |
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);
}

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

皆さん文脈から分かってくれると思うけど、
VisualStudio なんかで別の意味で使う言葉だし。
0908デフォルトの名無しさん (ワッチョイ a108-1OZr)
垢版 |
2017/10/22(日) 21:19:51.70ID:bXoG3HvV0
メインフレームでDIAGNOSEを使うときなんか
WCSのアドレスを指定とかね
0909デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/23(月) 01:07:16.21ID:mBA7Qm4F0
スタック変数いらねえな
グローバル変数で性能追求しようぜ
0911デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/23(月) 01:37:37.69ID:mBA7Qm4F0
オペランドを8bitに限定してコード効率上げるってのがゼロページの発想でしょ
メモリ素子が高価な時代の涙ぐましい仕組みのひとつ
0913デフォルトの名無しさん (ワッチョイ a593-+4Iz)
垢版 |
2017/10/23(月) 05:14:49.57ID:u4PJ0rqa0
>>911 アドレス値のフェッチが1byteだけで済むから
16bit(2byte)の絶対アドレスより速い、てメリットもあるしね。

>>912 これはアリかも。
CPUにデカいキャッシュが載る時代のゼロページ的な使い方だな。
0914デフォルトの名無しさん (ワッチョイ 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
0917デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 19:25:26.97ID:nagTo3YF0
>>915
そこって、デバッガがCPUレジスタ参照する為の窓だから、プログラムがその領域指すと、デバッグが困難になるから禁止してるんじゃね?
0918デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 19:29:22.87ID:nagTo3YF0
デバッガー専用の作業メモリー領域もプログラムから使用禁止だったりするだろ?
0919デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/23(月) 19:30:14.37ID:HemzWECS0
レクサスRXに見えた
0922デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 20:30:23.77ID:nagTo3YF0
>>921
アクセス禁止じゃねーよw
使用禁止だ。
デバッガー使わないなら好きに使えばいい。
0923デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/23(月) 20:37:44.96ID:nagTo3YF0
あ、レス間違えたわw
0930デフォルトの名無しさん (ワッチョイ c5eb-cn1a)
垢版 |
2017/10/24(火) 12:07:36.73ID:SPAXueit0
int func(int) は、引数が int 型で、int 型の値を返す関数
int func(void) は、引数が無しで、int 型の値を返す関数

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

int func() のように () の中が空の場合は、どうゆう意味になりますか?
int func(void) と同じ?
0934デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/24(火) 13:44:26.08ID:/a/Ldfbw0
DMAでも使うならともかく
レジスタをメモリ空間にマッピングする利点なんてないだろ
0936デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/24(火) 14:14:56.50ID:gWGoT/ywp
>>934
むしろデメリットさえあるな。だからデバッガが使う以外は利用されてないだろ?
0937デフォルトの名無しさん (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/24(火) 14:24:36.56ID:fybDUnFS0
ふふ、トヨ〇の要求。今は知らん。
0938デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/24(火) 16:20:50.45ID:b8RDVE7X6
まだやってたのかよレジスタ
0939デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/24(火) 18:07:58.27ID:gWGoT/ywp
内部レジスタと外部レジスタは意味がまるっきり違うんだがなぁ
0941デフォルトの名無しさん (ワッチョイ 559f-0GSP)
垢版 |
2017/10/25(水) 01:31:11.21ID:a9TiLHl10
>>930
同じなんだけどコンパイル時の引数チェックをしなくなる。
int func(void) の関数に対して func(123) みたいにして呼ぶとコンパイルエラーだが
int func() の関数に対して func(123) で呼び出す記述があってもエラーにならない。

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

へーへー
0946デフォルトの名無しさん (ワッチョイ cee7-LaKm)
垢版 |
2017/10/25(水) 18:20:37.33ID:Ls3qnFv30
>>944
まず何のプログラミングか言わなきゃダメでしょうみんなプロだから挙動で読めちゃう人いるけどさ
0947デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/25(水) 18:28:36.51ID:Ho4Id2OA0
>>944
printfでNULL->valueをしてるから
0952デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/25(水) 19:16:50.46ID:Ho4Id2OA0
そういうことか
全然分からんかった
引数に受け渡されたポインタ変数のコピーに新しく確保したメモリのアドレス入れても呼び出し元のポインタ変数はなんも変化しないのか
0954デフォルトの名無しさん (ワッチョイ cee7-LaKm)
垢版 |
2017/10/25(水) 20:39:40.86ID:Ls3qnFv30
俺の頭じゃあ理解できなかったわアロー関数は苦手だ、ここには天才がやっぱいるわ
0956デフォルトの名無しさん (ワッチョイ 7ad2-eNpY)
垢版 |
2017/10/25(水) 23:31:22.55ID:A9sEwxck0
追い詰められてる時って、ちょっとしたことを見落としたりしがちだし。
そういうときにちょっとしたつまらない問題点を指摘してくれる人が神様に思えることはある。
本当に何でこれに気づかない?って問題に延々と気づかないことあるから。
0957デフォルトの名無しさん (ワッチョイ 7181-/MqV)
垢版 |
2017/10/26(木) 01:05:20.57ID:WmOJzpQL0
実務の世界だと、開発リーダーにとっては、この程度はさらさらと書いて欲しいと思うだろうな
この辺の考え方が理解できてないと、構造体を使ったリスト構造、木構造が作れないと思う
0958デフォルトの名無しさん (ワッチョイ 7102-rVGZ)
垢版 |
2017/10/26(木) 01:22:11.08ID:FPgm8C1h0
急に語り出したぞ、おい
0959デフォルトの名無しさん (ワッチョイ 719f-a4mA)
垢版 |
2017/10/26(木) 03:22:11.49ID:kwyo2eDl0
リスト構造、木構造という言葉がわからなかったのかな?
0961デフォルトの名無しさん (ワッチョイ 9193-cGPg)
垢版 |
2017/10/26(木) 06:24:41.35ID:8UQnYlEC0
>>944 からの流れだとすると、実務で使う人とは感じなかったな。
専門外の学生さんが単位を取るために四苦ハック、
進級できたら思い出しもしない、という立場からの質問だろうと。
0962デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/26(木) 10:26:24.17ID:Z8IKw2VS6
リスト構造木構造とか理系大学の情報系科目で誰でもやるがな
こんなところ見てる奴が知らんわけないだらアホ
0963デフォルトの名無しさん (ササクッテロラ Sp9d-aRZk)
垢版 |
2017/10/26(木) 10:46:18.77ID:DmfMCHFwp
リストもツリーも基本の構造は一緒だろ。
ただ、鎖ね繋がってる数が違うから、
扱いが違うだけでな。
0966デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/26(木) 12:51:34.13ID:jbwuNtau6
>>965
リスト構造とか知ってるからってポインタ受け渡しのトリックに気付くとは限らんだろ
0969デフォルトの名無しさん (ワッチョイ 1be7-J/p5)
垢版 |
2017/10/26(木) 18:29:14.01ID:l+WAoJAx0
自分の知ってる関数解ってる宣言の仕方ならわかるけどさ解らない奴使ってたらもう変数が動いてるかわからんだろう
そうなったらもう謎でコードなんか読めないだろ?
0972デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/26(木) 20:03:01.42ID:DmfMCHFwp
それより、そのアドレスはアクセス権のある場所を指してるんだよな?
0974デフォルトの名無しさん (ワッチョイ d175-rVGZ)
垢版 |
2017/10/26(木) 21:42:34.03ID:Fjma9sq90
とりまリスト構造なんて誰でもしってること
>>959のレスはイミフ
0976デフォルトの名無しさん (ワッチョイ 9193-cGPg)
垢版 |
2017/10/27(金) 06:49:46.56ID:VPed4ksO0
「関数の引数に値渡ししかないから、
ポインタを渡すことで呼出側の変数の内容を関数側で変更する」
というのが他の言語と比較した場合、C特有のトリックと呼べるかも。

もちろん、Cの村では当然かつ基本のことだけど。
0977デフォルトの名無しさん (ワッチョイ 1387-jmG0)
垢版 |
2017/10/27(金) 08:36:39.71ID:JYNAFOfl0
たくさん値を返したいなら、
戻り値を型宣言した構造体にしたらいい。
0979デフォルトの名無しさん (ワッチョイ 1be7-DRuk)
垢版 |
2017/10/27(金) 09:42:57.69ID:Q7q08ysx0
>>977
autoでもできるのですか?
0980デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 09:57:16.24ID:CUGbjFhkp
ああ、昔はauto変数に取った構造体を戻り値にして割り込み系で散々な目に遭ったよな。
あれは言語仕様に沿って無いコンパイラが悪いんだがな。
0982デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 10:18:09.15ID:CUGbjFhkp
古くなくてもニッチな環境では要注意だ。
コンパイラの吐き出すコードが言語仕様に沿って無い場合がある。
0986デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/27(金) 18:41:59.37ID:BvMxy0d+0
C言語のポインタで
int *a;
int b;
a = 10;
これは理解できるんだけど
a = &b;
*a = 10;
これはどうなってるん?aにアドレス入ってるのにどうやって10を送ってるん?
0988片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd33-+nyC)
垢版 |
2017/10/27(金) 18:49:13.82ID:xRxq9X9wd
>>986
> int *a;
> int b;
> a = 10; //エラー。ポインタに整数は代入できない。そもそも全角文字と半角文字を間違っている。
> a = &b;
> *a = 10;
アスタリスク(*)で実体の整数データを手繰り寄せているイメージね。
0989デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/27(金) 18:55:00.02ID:BvMxy0d+0
>>988
*aで中にあるアドレスで探って送ってるイメージ?
0991デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 19:14:00.54ID:CUGbjFhkp
宣言とフィールドで意味の違う*が悪い。
0994デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/27(金) 19:21:42.60ID:CUGbjFhkp
>>993
宣言ではポインタである事を表すが、
フィールドでは、掛け算記号だったり、ポインタの内容だったりするだろ?
0995デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/27(金) 19:56:47.39ID:BvMxy0d+0
char *c;
int *a;
この二つはポインタだけど使い方が違うのか?
0997デフォルトの名無しさん (マクド FF6d-mlZ6)
垢版 |
2017/10/27(金) 20:11:43.60ID:HlvRN0vUF
Cの文法特にポインタ宣言周辺は、
頭が悪いと読めないよう定められてる。

ソフトウェア開発は馬鹿でも手伝わせる
必要があるくらい人手不足なのに、
なんでこんな文法にしたのか不思議。
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を超えています。これ以上書き込みはできません。

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