X



C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
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/

前スレ
C言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0534デフォルトの名無しさん (ブーイモ MM7f-V9cG)
垢版 |
2017/11/28(火) 03:16:49.45ID:Ol4PUSI5M
>>533
3点ほど

配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?

ローカル変数名は input_num とか分かる名前つけようか

main の戻り値
0535デフォルトの名無しさん (ワッチョイ 0793-C/lT)
垢版 |
2017/11/28(火) 07:53:02.37ID:tl7kMs1v0
C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。
0538デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/29(水) 02:06:01.37ID:1lf2VR3q0
>>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。
0542デフォルトの名無しさん (スプッッ Sdff-T4vC)
垢版 |
2017/11/29(水) 16:25:56.35ID:llo+D0tpd
>>538
ありがとうありがとう
そうすることにする


stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった
0543デフォルトの名無しさん (ワッチョイ bf8a-LwI/)
垢版 |
2017/11/29(水) 17:24:28.37ID:FWpFj9nP0
>>541
ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]〜*strh[2])の内容まで変わる
値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]〜strh[2][])の内容は変化しない
配列とポインタでは挙動が違う
0545デフォルトの名無しさん (ガックシ 068f-forR)
垢版 |
2017/11/29(水) 17:49:08.23ID:Ypog5BGe6
配列変数はただのポインタ変数じゃないってマジ?
arr==&arrになるんやが。
arrがポインタなら&arrはポインタのポインタだからこれはおかしい。
0549デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/29(水) 18:51:10.65ID:DGImDAX5a
また一人C言語の罠に掛かったようだ・・・
0550デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/29(水) 18:57:26.48ID:DGImDAX5a
>>545
ポインタの変数はポインタを入れとくための変数だ。
配列変数はポインタを入れとく変数ではなく、単に配列の先頭を表すラベルでしかない。
0552デフォルトの名無しさん (ワッチョイ 0793-C/lT)
垢版 |
2017/11/29(水) 19:11:32.94ID:vgi7NPsq0
>>545
int arr[10]; みたいに配列を定義して
if (arr == &arr) {...} てな具合に比較する話かな。

配列名 arr は &arr[0] (先頭の要素へのポインタ)
配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
『秘伝C言語問答 ポインタ編』p.25 Column1-2 「配列名に&をつけると……」


>>548
型が違うのは間違いないけど、値が一致しない場合ってあるのかな?
それとも型の異なるポインタ同士での値の比較って未定義動作なんだっけ?
0553デフォルトの名無しさん (ワッチョイ 0775-forR)
垢版 |
2017/11/29(水) 19:31:59.94ID:bodUKsOx0
>配列名 arr は &arr[0] (先頭の要素へのポインタ)
>配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
>…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。

なるほどな
0554デフォルトの名無しさん (ワッチョイ a77f-8Ex9)
垢版 |
2017/11/29(水) 19:54:00.64ID:Xa+98JY60
>>552
>6.5.9 等価演算子
>(中略)
>制約??次のいずれかの条件を満たさなければならない。
>(中略)
>-両オペランドとも適合する型の修飾版又は非修飾版へのポインタである。

「〜型」と「〜型の配列型」は適合しないから、ポインタの比較は未定義
0555デフォルトの名無しさん (ワッチョイ 7f80-xsLR)
垢版 |
2017/11/29(水) 20:09:41.35ID:/RfTzpPk0
>>552
型が異なったら、比較できない

例えば、アドレス100番地から10バイトと、
アドレス100番地から20バイトでは、全然違う

仮に、同じバイト数だとしても、中身・内容が異なるし、比較する事に意味がない
0556デフォルトの名無しさん (ワッチョイ 5ff9-uRPb)
垢版 |
2017/11/29(水) 22:15:27.21ID:QTG/JUE+0
>>542
ファイルの破損というのがファイルの中身の論理レベルの話なら正常なファイルとみなされるはずだし、ファイルシステムレベルの破損やメディアの物理的破損なら実装依存じゃないかな。
0557デフォルトの名無しさん (ワッチョイ 5ff9-uRPb)
垢版 |
2017/11/29(水) 22:18:50.37ID:QTG/JUE+0
>>555
いま話題にしているのはarrと&arr[0]の比較であって、これらはどちらも比較演算子のオペランドとしてはint*型として評価されて型も値も一致すると思ってたけど、どうだろう。
0560デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/11/30(木) 06:56:06.98ID:VGvsvH1F0
>>557-558
int arr[10]; と定義されてる場合、
arr の型は int*
&arr の型は int (*)[10]
つまり arr と &arr は型が違う
というのが >>552 の「&arr は配列全体へのポインタ」の意味。

「引数として『10個のintを要素とする配列』のみを受け入れる関数」
(要素数が違うとコンパイルエラー)みたいのを書ける。
もちろん、それが目的で存在する書式じゃないだろうけど。

それにしても &arr の型の書き方は分かりにくいな。
理屈は多次元配列を仮引数にとる関数プロトタイプと同じ、
だと思うんだが。
0562デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/11/30(木) 10:29:35.42ID:/QNJXUpA0
>>560
arrの型はint[10]だボケ
&arr[0]がint*だ

おまえさんの、その理解では&arrがint**になっちまうだろうが
0567デフォルトの名無しさん (ワッチョイ a5ea-7XMe)
垢版 |
2017/11/30(木) 10:56:17.41ID:CwUb7XwN0
代入左辺の int* に渡す右辺
関数引数の int* に渡す引数
ここに渡す際に先頭要素へのポインタを与えてるだけで

変数そのものはポインタにはなっていなくて配列のまま
0568デフォルトの名無しさん (ササクッテロル Spbd-QD6R)
垢版 |
2017/11/30(木) 11:01:32.20ID:I+JVe+Ukp
arrは要素10持つ配列の先頭アドレスを返す、サイズはint 10個分
&arr[0]は、配列要素0番目のアドレスを返す、サイズはint 1個分
先頭アドレスが欲しいだけなら型キャストして使えばいい。
代入に使うならサイズが違うから上手く行かない。
0570デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/11/30(木) 12:23:05.77ID:/QNJXUpA0
>>563
いーや違う
§6.3.2 Other operands
Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type'' is
converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.
あくまで配列からポインタへconvertedつまり元の型int[10]とは違う型int*への変換だ
0572デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/11/30(木) 12:58:49.70ID:7wMQk3WFa
そ、そうかあ?
0575デフォルトの名無しさん (ワッチョイ a5ea-7XMe)
垢版 |
2017/11/30(木) 15:49:01.37ID:CwUb7XwN0
入力された氏名のファイルを探す
 無い→ファイル作って 入力した生年月日を書き出すとともに変数に覚えておく
 有る→ファイルから生年月日を変数に読み込む
↑の処理で変数で覚えている生年月日から年齢を求め表示する
0579560 (ワッチョイ 3d93-kA4S)
垢版 |
2017/11/30(木) 17:54:17.29ID:VGvsvH1F0
>>562 言葉は悪いけど言う通りだね。
俺が書いたのは arr て名前が演算の対象として単独に現れたときに
自動的にポインタの値に変換される場合の値と型のことだった。

arr 自体はあくまで配列だから int[10]
この名前が関数の引数とかで使われた場合 &arr[0] と同じになる。
配列名は隙あらば「先頭要素へのポインタ」になりたがる。
こんな感じでよろしいか? (我ながらぎごちないけど)
0580デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/11/30(木) 18:07:14.42ID:rYNpG8Zla
>>577
fprintf()で一行にカンマ区切りで名前と生年月日出した方が扱いやすいのでは?

で、処理の順序としてはこうだ。

1. 名前入力。

2. 入力された名前がファイルの中にあったら一緒に入っている生年月日を出して終了。

3. 生年月日入力。

4. 名前と生年月日をファイルに追加。

5. 終了。

ファイルアクセスは2では読み出ししかせず開きっぱなしにしないでクローズする。
4では追加書き込みだけしてクローズだ。
0583デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/11/30(木) 21:02:57.60ID:/QNJXUpA0
>>579
演算の対象ではなく、特定の演算子の対象な
どの演算子で&arr[0]に変換されるのか、
列挙できる知識が必要ということだ
0584デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/11/30(木) 21:56:39.93ID:xcZwpJOTa
XMLで

なんていうと余計にややこしくなって大変な事になるなw
0586デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 06:29:54.45ID:jGNBP26P0
>>585
Cの演算子は「特定の演算子」の集合で、
そこから、ある特定の演算子を除いた残りもまた
特定の演算子だろうがよ
0590デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 09:50:32.00ID:jGNBP26P0
>>587
宣言? おまえさん、int arr[10];がint *arr;に変換されるとでも思っているのか?
仮引数にint arr[10]と書くとint arr[]に読み替えられたりはするが、
そのことを言っているのなら>>562で指摘したとおりになるな
ただし>>560にはセミコロンが付いていてそういう逃げ道は封鎖されているわけだが
0593デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 11:08:59.34ID:jGNBP26P0
>>589
初期化宣言子 init-declarator
0594デフォルトの名無しさん (ワッチョイ b6eb-1noQ)
垢版 |
2017/12/01(金) 12:08:20.94ID:IMGPh1jC0
>>593
なるほど、情報サンクスです。
C++だと、同じものが代入演算子と称されていて。コンストラクタ内で代入演算子をオーバーロードすべし、
のような言い方をよく見かけますので。Cでも同じ呼び方をするのかと思ってました。
0597デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 13:24:35.76ID:jGNBP26P0
>>595
s/"宣言子"か//
0599デフォルトの名無しさん (スップ Sd0a-ygIL)
垢版 |
2017/12/01(金) 15:44:26.68ID:0Iysip4/d
プログラミング初心者です
車のタコメーターをフルカラーのディスプレイを使って作りたいのですが、どうすれば良いのかが全く分かりません
C言語は計算機内で式の答えを演算する程度なら使えますが、ハードを制御したりはできないです(Arduinoなら少し弄りました)
C言語で作れるのかも分からないので、簡単なところから教えてください
エンジン回転数のパルス信号は取れてます
0601デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 15:56:55.06ID:jGNBP26P0
Ardudinoを弄ったことがあってハード制御ができない?
パルス信号を取れるっていうのは、オシロスコープか何かで確認できたってことか?

・・・もしかして、こういうことか?
その信号をプログラムで読み取るには、どこの端子に繋ぐのかとか、
信号のレベルの合わせ方とか、そういうことがわからんのか?
0606デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/01(金) 16:56:05.30ID:y5AhnBkya
>>603
ターゲットのマシンは?
Windows? Linux?

ていうか、C言語でやると何で動かすにしても大変面倒だと思うので何か他の言語使った方が良いと思う。
0609デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 17:09:00.66ID:jGNBP26P0
ディスプレイのつなぎ方がわからんのか?
つないであるディスプレイへのコマンドの送り方がわからんのか?
0610デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/01(金) 17:42:29.56ID:jA0BeSqZ0
>>599
PCのウィンドウ環境上でウィンドウを開いてグラフィック表示って問題なら、
環境次第でここでも分かると思うけど…。

部品としての液晶やLEDのパネルのハードウェア制御ってことになると、
まずはどの部品を使うのか、って話になるな。
0613デフォルトの名無しさん (ブーイモ MM81-kYsf)
垢版 |
2017/12/01(金) 18:35:32.61ID:6HJgPekDM
消費電力、サイズ制限、予算諸々考えてどの程度のハードが用意出来るかって所から

linuxやwinが動くようなリッチな環境が用意出来るなら
GUI部はCじゃなくても良くねってのが正直な感想
0616デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/01(金) 19:38:44.88ID:quTLstwT0
>>608
> ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます
根本的に分かってないようだが、「ターゲット」ってのはお前が決めるんだよ。
そして既にコードを書いていて、そこにLCDを接続したいだけなら、その環境を言えよ。
0618デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 20:27:16.42ID:NXDNhmZv0
>>615
初期化子なしは、不定値で初期化するって意味だと納得することにしてるわ
一応、初期化の説明に含まれてるし。。。

つーことで、>>586とかには演算子のオペランドでないこともあるって理解してもらえたかな
良かった良かった
0619デフォルトの名無しさん (ワッチョイ 9e9e-GQwd)
垢版 |
2017/12/01(金) 20:54:03.81ID:HgVhW4BC0
>>603
>信号→マイコン→処理
>は分かります
で、信号は取れたとか言ってるんだから対象の物理的扱いはわかっているんだろ。
それをどんなマイコンにどう繋ぐかだ。出来合いのマイコン基板を買ってきて
それに繋げるのか、基板から自作するのか
0620デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 21:25:55.70ID:jGNBP26P0
>>618
586だが、だから何だ?
演算子に限らずとも、Cは明確に列挙された機能の集合だ
そこから特定の演算子を除いた残りは、
おまえが言うような曖昧な集合ではない
0621デフォルトの名無しさん (ワッチョイ 5db3-7XMe)
垢版 |
2017/12/01(金) 21:37:37.37ID:kbDZQVhk0
>>583 へのカウンターじゃないの?
583では 変換が走るのは 特定の演算子の対象 としてるけど

初期化においても変換が走ってる
この記述中では演算子はなくて、該当変数は演算子のオペランドになっていない って
0622デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 21:39:28.94ID:NXDNhmZv0
>>620
ん?
配列型を持つ左辺値は特定のケースを除いてポインタ型に変換されるという
規格に明記してある話を理解してもらえればそれで十分だよ?

初期化子には演算子が含まれないこともあるって理解できたんだよね
なら、それで良いよ
0623デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 21:43:38.60ID:jGNBP26P0
>>621 >>622
>>560からの流れ読んでね
やつはint arr[10];と定義されたオブジェクトに対する
arrというアクセスがint*だと言っているんだ
おまえら2人とも変換と言っているよな
変換てそもそも何だ?
0626デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 22:05:59.37ID:NXDNhmZv0
もしかしてarr自体がint*型を持つというアホな解釈を擁護してるとでも思われてたの?
それは>>560自身も、>>579で式中に現れた場合のことでしたって弁明してるでしょ

それとも
arr;
という識別子名だけの単文があったとき、arrがポインタ型に変換されないと思ってる?
左辺値なんだから、当然変換されるよ
0627デフォルトの名無しさん (ワッチョイ 5db3-7XMe)
垢版 |
2017/12/01(金) 22:11:15.92ID:kbDZQVhk0
>>625
> 配列の初期化に用いられる文字列リテラル
(その通りに動作すると期待して)普通に使ってるけど、
逆の観点の、配列のまま取り扱ってる例として挙げようとすると、見落とすわ これ
0628デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 22:19:35.93ID:jGNBP26P0
>>626
うん、そう思っている

おまえ、なぜ
arr;
がポインタ型に変換されると思っている?

なんだか残念な答えが返ってきそうな予感がするが
0629デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 22:49:05.07ID:NXDNhmZv0
6.3.2.1 Lvalues, arrays, and function designators
An lvalue is an expression with an object type or an incomplete type other than void

6.8.3 Expression and null statements
expression-statement: expressionopt ;

arr;は式文、arrは式(左辺値)
よって、>>570の規則に従って変換される
0630デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 22:57:47.71ID:jGNBP26P0
>>629
それはおかしいぞ
arrという部分式を評価中に、それがどんな文脈の作用対象となるかは
予見しないのがCのポリシーで、だからこそ式arrはlvalueを生じる
その後lvalueからvalue of an expressionへの変換を要請する文脈を経ずに
シーケンスポイントとなっているそのプログラム片のどこに
アドレス計算が生じうるんだよ
0631デフォルトの名無しさん (スプッッ Sd12-ygIL)
垢版 |
2017/12/01(金) 22:59:25.50ID:UqjXH8z4d
>>608です

>>616
コードをどう書けばいいかも、どれを使えば実現できるのか分からないです
コストや部品点数は抑えたいと思ってます

>>619
どういうマイコンをどうすればアニメーションでディスプレイ出力ができるのかを知りたいんです
おおまかな道筋を教えて欲しいです
ARMマイコンとかどうなんですかね…
0632デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 23:03:12.88ID:jGNBP26P0
PIOのディレクションレジスタを出力に設定してマスクパターンを指定しておき、
それからコマンドを書き込んでストローブのパルスを作って。。。
0633デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 23:07:47.82ID:NXDNhmZv0
>>630
ポリシーとかじゃなくて規格の話をしてくれない?

配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの
演算子を伴わない場合は変換されないというのなら、その規格を明示して

左辺値ですらないというのであれば、その根拠となる規格を示して

人に説明求める割に、自分の論拠が想像ってのはどうかと思うよ
■ このスレッドは過去ログ倉庫に格納されています

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