[過去ログ] C言語なら俺に聞け 163 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
201(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-6w0d) 2024/09/16(月)18:10 ID:JwEVxA0h0(5/6) AAS
>>199
こっちは根拠になる規格の文面を提示してるんだから違うというなら違うと思う根拠を提示して。
202: (アウアウウー Sa5b-E6+g) 2024/09/16(月)18:57 ID:ISRAyNkZa(1) AAS
>>188
そらargv[][]では誤りだもんな
203(1): (アウアウエー Sadf-N1Zj) 2024/09/16(月)21:32 ID:NNTpe0yPa(1) AAS
>>187
たしかに関数の引数だと違うんだな
外部リンク:ideone.com
#include <stdio.h>
char *hoge(char fuga[10])
{
++fuga;
省10
204: (ワッチョイ bf4f-NiVF) 2024/09/16(月)22:10 ID:hHcIxSUD0(1) AAS
>>197
流石に言ってる事が的外れ過ぎるのでもうちょっと勉強した方がいいと思うよ
205(1): 警備員[Lv.1][新芽] (ワッチョイ f731-/vo+) 2024/09/16(月)22:25 ID:z+htC2pc0(1/2) AAS
恥ずかしながら、静的記憶域期間(で合ってるのか?)という言葉を知らなくて、ライフタイムは「静的」に含意されているのかと思ったワ…
しかし、記憶域期間って違和感あるなぁ
206: 警備員[Lv.1][新芽] (ワッチョイ f731-/vo+) 2024/09/16(月)22:30 ID:z+htC2pc0(2/2) AAS
わけわからん
>>205は撤回します
207(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/16(月)22:43 ID:JwEVxA0h0(6/6) AAS
>>203
余談だけど配列だけじゃなくて関数型も関数ポインタ型に調整されるよ。
208(1): (ワッチョイ 9f7c-2MD7) 2024/09/16(月)22:52 ID:TDYyKtgo0(1) AAS
>>201
規格に配列は常にポインタに変換されるなんて書いて無いぞ。
209: 2024/09/16(月)23:00 ID:f3T7KT8T0(1) AAS
>>208
「常に」とは書かれていない
「ポインタに変換される」ではなく「ポインタに型変換される」
>>102がまさにそれでしょ
E1という配列が関数呼び出しでない場合においてもポインタという型に変換されているから出来ること
210(1): (ワッチョイ ff63-y7MN) 2024/09/16(月)23:10 ID:yKwOC4kA0(2/2) AAS
>char *hoge(char fuga[10])
こう書いてあっても、関数内で10を使う訳ではない
関数内で仮に100個めの要素アクセスするロジック書いてもエラーにはならない
(実行時にはエラーになると思う、多分)
だから、
>char *hoge(char fuga[])
添え字無しにしても良いことになる
211: (ワッチョイ d7cd-qbvN) 2024/09/17(火)01:04 ID:BokinMog0(1) AAS
>>210
元々ローカルでchar hage[10];と定義して10以上をアクセスしてもコンパイル時にはエラーにならないでしょ
引数に[10]と書くとしたら可読性のため(この関数では[0~9]までアクセスする可能性があると明示するため)
212(1): (スプッッ Sd3f-2MD7) 2024/09/17(火)10:15 ID:9gub94Dsd(1/3) AAS
__FILE__ とか __LINE__ は大文字なのになんで __func__ は小文字なん?
213: (アウアウエー Sadf-N1Zj) 2024/09/17(火)10:17 ID:TMGdiCOOa(1/2) AAS
範囲の問題じゃなくて
++hage または hage++ が出来るか出来ないかが問題なんです
214(1): (ワッチョイ ff63-y7MN) 2024/09/17(火)11:06 ID:bX/ekV+z0(1/3) AAS
一見配列を受け渡ししているように見えるけれど、
実際はポインターとして受け渡ししているってことでしょ
215(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ d70f-6w0d) 2024/09/17(火)11:56 ID:FRc2ySeD0(1) AAS
>>212
__func__ はマクロではないからだと思う。
216: (ワッチョイ ff63-y7MN) 2024/09/17(火)12:47 ID:bX/ekV+z0(2/3) AAS
#include <stdio.h>
char hage[10] = {0};
char *hoge(void)
{
// ++hage; // error '++' には左辺値が必要です。
// return hage;
return &hage[1];
省6
217(1): (アウアウエー Sadf-N1Zj) 2024/09/17(火)13:07 ID:TMGdiCOOa(2/2) AAS
>>214
そんなことは判ってるよ
(char hage[10]) で hage++ または ++hage 出来ちゃってる(ように観える)のが問題なんでしょ
関数の引数は (char hage[]) または (char *hage) のみにすれば良かった
(char hage[10]) はどうみても蛇足(結局境界テストされてないし)
218: (ワッチョイ ff63-y7MN) 2024/09/17(火)13:11 ID:bX/ekV+z0(3/3) AAS
問題だと思う人は、使わないようにしましょう
開発サイトでそういうルールを用意するのも手です
219: (スプッッ Sd3f-2MD7) 2024/09/17(火)17:17 ID:9gub94Dsd(2/3) AAS
>>215
納得しました。
220: (ワッチョイ 9ffd-NiVF) 2024/09/17(火)20:17 ID:dLWvmxgr0(1) AAS
>>197
そもそもstr系mem系はアドレスを受け取るんであって配列を受け取る関数ではないっていう勘違いがあるんだけど
それはともかく大きさがどうのとかなんちゃらが都合がいいとか、本当にC言語でなんかプログラムを書いた事あるの?
221: (スプッッ Sd3f-2MD7) 2024/09/17(火)20:58 ID:9gub94Dsd(3/3) AAS
俺は尻より胸派なんだよね。
222(8): (ワッチョイ d7cd-qbvN) 2024/09/18(水)00:42 ID:wcwImUMc0(1/3) AAS
>>217
この場合に限らずcでは範囲チェックなどされないでしょ
必要なら自分でチェックするのが原則
void aaa(char hage[10],int idx)
{
if((UINT)idx < sizeof(hage)/sizeof(hage[0]))
printf("%d=%d¥n",idx,hage[idx]);
省4
223: (ワッチョイ bfee-GITO) 2024/09/18(水)01:22 ID:9DvoA/Ly0(1/2) AAS
ド素人w
224(1): (ワッチョイ d712-IGT5) 2024/09/18(水)05:59 ID:Y3+kk9yU0(1) AAS
>>222
c faq 6.21 (英文が詳しい)
外部リンク[html]:c-faq.com
>>207 の'調整'は'adjust'だろう
N1256を'adjust'で検索するのじゃ
Look, a new day has begun.
225: (ワッチョイ d710-SKTh) 2024/09/18(水)07:51 ID:9Z5pFVfx0(1) AAS
8/16bit時代の1バイトでも、1ステップでも減らせってのを経験した人と
最近の可読性、移植性、安全性優先設計が当たり前世代とのギャップ。
226: (ワッチョイ bf32-GITO) 2024/09/18(水)08:59 ID:9DvoA/Ly0(2/2) AAS
ギャップの問題じゃねーから
文脈すら理解できないじじいはすっこんでろ
227: (ワッチョイ 5701-vU+L) 2024/09/18(水)09:30 ID:Qk7JHPx80(1) AAS
専門板によくいるアスペだな
228: (ワッチョイ ff63-y7MN) 2024/09/18(水)10:34 ID:UYQxUcxO0(1/4) AAS
225 は釣りでしょう
229: 警備員[Lv.2][新芽] (ワッチョイ bfd9-/vo+) 2024/09/18(水)13:08 ID:eTGNACyx0(1/2) AAS
>>222
sizeof(hage) で配列のサイズが求まるの?
と思ったら、「char * (ポインタ)の大きさを返すよ」みたいな警告が @gcc
230: (ワッチョイ ff63-y7MN) 2024/09/18(水)13:15 ID:UYQxUcxO0(2/4) AAS
釣りだか天然だか、分からなくなってきた 笑
231: はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/18(水)13:35 ID:td/rS/wM0(1) AAS
今どきの統合開発環境を使ってるなら変数の型くらい見れると思うけれど
古典的な手法としてあえてエラーにしてメッセージを読むという型の確認方法がある。
void foo(char bar[10]) {}
int main(void) { int baz = foo; }
こんなコードをたとえば gcc でコンパイルを試みると
error: initialization of 'int' from 'void (*)(char *)' makes integer from pointer without a cast
というエラーになる。
省3
232: 警備員[Lv.3][新芽] (ワッチョイ bfa6-/vo+) 2024/09/18(水)13:51 ID:eTGNACyx0(2/2) AAS
なるほど
勉強になります
233(1): (スプッッ Sd3f-2MD7) 2024/09/18(水)14:54 ID:LEoKOQZWd(1/5) AAS
>>222
>この場合に限らずcでは範囲チェックなどされないでしょ
>必要なら自分でチェックするのが原則
>
>void aaa(char hage[10],int idx)
>{
> if((UINT)idx < sizeof(hage)/sizeof(hage[0]))
省8
234: (スプッッ Sd3f-2MD7) 2024/09/18(水)14:56 ID:LEoKOQZWd(2/5) AAS
書式のとのuzじゃなくてzuだっけ?zだけでよかったっけ?
ま、主旨はそこじゃないからいっか。
235(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ d7e2-6w0d) 2024/09/18(水)15:47 ID:3rwci13t0(1) AAS
>>233
sizeof(char*)/sizeof(char) ということになる。
sizeof(char) は確実に 1 だから結果としては単に char* のバイト数ってことだね。
この場合は「『もし 10 に意味があるとしても』境界チェックはされないことに変わりないのでなんの役にも立ってない。 役に立てるとしたらここまで書かなきゃならない」というのが主旨なのであくまでもしもの話。
実際の値はどうでもよい文脈だと思う。
236: (ワッチョイ d7cd-qbvN) 2024/09/18(水)16:33 ID:wcwImUMc0(2/3) AAS
>>224
ああそうなの
昔のことだから記憶違いをしてたようだ
237: (スプッッ Sd3f-2MD7) 2024/09/18(水)16:43 ID:LEoKOQZWd(3/5) AAS
>>235
>>222 の「これなら[10]に意味が出る」ってのは間違いってことね。
238(1): (ワッチョイ d7cd-qbvN) 2024/09/18(水)18:00 ID:wcwImUMc0(3/3) AAS
'ここの10は意味ありませんよ'
って警告を出してもいいじゃんってことでしょ
それなら例えば
typedef char HAGE_TBL[10];
void foo(HAGE_TBL hage) {}
(毎回10とか書くのは危険なのでこういう使い方が多いと思う)
などとした場合に毎回警告が出てうざいことになるんじゃないか
239: (ワッチョイ ff63-y7MN) 2024/09/18(水)18:07 ID:UYQxUcxO0(3/4) AAS
警告ならまだ笑っていられるが、
明らかに書いた奴の意図とは違って誤動作してるだろ
240: (スプッッ Sd3f-2MD7) 2024/09/18(水)18:30 ID:LEoKOQZWd(4/5) AAS
>>222 のバグを晒すスレはここですか?
241: (スプッッ Sd3f-2MD7) 2024/09/18(水)18:46 ID:LEoKOQZWd(5/5) AAS
C言語は難しいな
242: (ワッチョイ ff63-y7MN) 2024/09/18(水)20:53 ID:UYQxUcxO0(4/4) AAS
void aaa()の中で、
引数で渡された値が何かを確かめて見ると良い
それと、 sizeof(hage)やsizeof(hage[0])の値も
プログラム書いた人の意図としては、
sizeof(hage)/sizeof(hage[0])が10になるはずなんだが
さてさていくつだろうか?
243: (ワッチョイ 9f7c-2MD7) 2024/09/19(木)00:15 ID:5H+5PGV10(1) AAS
もうやめて!>>222 のライフはゼロよ!
244(1): (ワッチョイ 9f1e-S785) 2024/09/19(木)06:32 ID:zdFAvN1E0(1) AAS
本人が新たなネタを出してくるんだもん。
>>238 でもわざわざ
typedef char HAGE_TBL[10];
ってやっておきながら、なんで
void foo(HAGE_TBL hage)
なの? 構造体と同じように
void foo(HAGE_TBL *hage)
省1
245(1): (ブーイモ MMbf-GITO) 2024/09/19(木)15:36 ID:bQAYIDF0M(1) AAS
cは洗練された型システム持ってないんだからそんなところ頑張っても無駄なんだよ
この悟りに至って始めて脱初級
原則語るならそれからにしてくれ
246: (ワッチョイ ff63-y7MN) 2024/09/19(木)15:40 ID:cPR7xA8Z0(1/3) AAS
Cは一部の洗練された型システム持つ言語よりも遙かに自由度が高い
そこが分かってようやく中級レベル
あとは本人の努力次第で空も飛べるし海も潜れる
247: (ワッチョイ bfda-GITO) 2024/09/19(木)15:50 ID:c2v//UgT0(1/2) AAS
おいおい
そのぶん危険なんだから持ち上げる部分でもないだろ
お前も初級
248(1): (ワッチョイ ff63-y7MN) 2024/09/19(木)17:19 ID:cPR7xA8Z0(2/3) AAS
ナイフは危険だが有用
不器用者は使わない方が良い
249(1): (ワッチョイ b766-qbvN) 2024/09/19(木)17:44 ID:8NYyNXbk0(1) AAS
>>244
typedefは新たな型を作るわけじゃない別名を定義するだけから
void foo(char hage[10])
と
void foo(HAGE_TBL hage)
は同じことだよ
250: (ワッチョイ bf29-GITO) 2024/09/19(木)20:28 ID:c2v//UgT0(2/2) AAS
>>248
c言語ってとっくの昔から自由にキャストしまくれる言語じゃないの知ってるか?
さぁお前はなんと答える?
251: (ワッチョイ ff63-y7MN) 2024/09/19(木)20:47 ID:cPR7xA8Z0(3/3) AAS
そんなに怖がるなよ
食われるわけじゃないんだから
252: (アウアウエー Sadf-3vlU) 2024/09/19(木)21:11 ID:/CBFTgYsa(1/2) AAS
>>245
悟った人は全部void*
253: (ワッチョイ ff4c-KlCL) 2024/09/19(木)21:52 ID:j90utfqH0(1) AAS
文字も数字も全部intでいいやん
254: (アウアウエー Sadf-3vlU) 2024/09/19(木)21:56 ID:/CBFTgYsa(2/2) AAS
getch() は int
255: (ワッチョイ 9f1e-S785) 2024/09/20(金)07:15 ID:dn4N5ANS0(1) AAS
>>249
それが不満なようだから「HAGE_TBL * にしたら何ができるか考えてみては?」ということでは?
256: (ササクッテロ Sp47-i443) 2024/09/24(火)10:26 ID:/2yiAcKTp(1) AAS
昔のコンピュータはメモリー少ないから、intで文字持つなんて贅沢だったんだよ
257: (ワッチョイ 1e2b-VArp) 2024/09/24(火)11:12 ID:CARZyoOh0(1) AAS
次のジジイの的外れな言いたいだけコメントを先取り
intは16bit以上だぞ
258: (ササクッテロ Sp47-i443) 2024/09/24(火)11:31 ID:QMMOdtbOp(1) AAS
違うよ、intは処理系依存だから8ビットの場合もある
259: (スプッッ Sd52-L8o3) 2024/09/24(火)11:49 ID:vvKB2ofDd(1) AAS
規格書読め
260: (ブーイモ MM32-VArp) 2024/09/24(火)11:54 ID:kMxfGMRcM(1) AAS
次のジジイ
getcharがなぜintを返すか
261(1): (ワッチョイ d6f5-K4S3) 2024/09/24(火)19:39 ID:tv/lKhnI0(1/2) AAS
>>174
> char* foo = "hoge";
>
> のようなケースではポインタ foo は文字列リテラルを指してる
(単に端折っただけかもしれないけれど、)文字列リテラルに関してCには非常に込み入った事情(Rationale Rev. 5.10 6.4.5 冒頭-l.26, N1256 Annex J.5.5)があり、厳密に言えば foo は "hoge" によって初期化された無名の配列を指している(N1256 6.7.8-32)。
C99RationaleV5.10
外部リンク[pdf]:www.open-std.org
省9
262: 261 (ワッチョイ d6f5-K4S3) 2024/09/24(火)19:51 ID:tv/lKhnI0(2/2) AAS
>>158
件の意味論は 6.7.8-32 を介して 6.7.8-14,15 に帰結するように思われる一方で、文字列リテラルが 6.4.5-5 で自ら初期化した(やはり)無名の配列の代名詞だとすると 6.7.8-11 が適用されるという解釈も成り立ちそう。
char *gfoo1 = "hoge"; // (1)
char *gfoo2 = "hoge"; // (2)
void f() {
char *foo1 = "hoge"; // (3)
char *foo2 = "hoge"; // (4)
省4
263: (ワッチョイ de79-sesJ) 2024/09/25(水)19:34 ID:8eNfi/Op0(1) AAS
まだやってるキモ…
いくら話題無いからってこれは誰も幸せにならない
264(1): (ワッチョイ 727d-rNKn) 2024/09/25(水)23:05 ID:YARyzAjz0(1) AAS
ええんちゃう別に
どうせ5chに答えを求めてやって来る人なんてもうおらんのやし
265: (ワッチョイ 1663-7cnK) 2024/09/25(水)23:07 ID:1jKu7Jqx0(1) AAS
青い鳥を探してます
ここに来れば教えてくれると聞いて来ました
266(1): (ワッチョイ 022d-w5sm) 2024/09/26(木)09:49 ID:oesVQEFi0(1/2) AAS
PythonとかC++のスレで規格持ち出して言い合いしてるのを見たことないが
何故かここではよく起こるな
267: (ワッチョイ ebbe-i443) 2024/09/26(木)10:19 ID:944iXMZC0(1) AAS
Cなんてのは対象CPUの違いとかでも標準とかけ離れた実装して来るのにね
268: (アウアウエー Saaa-rNKn) 2024/09/26(木)10:58 ID:R5lWYvWFa(1) AAS
>>264
これ++
269(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ e332-Pvcq) 2024/09/26(木)12:24 ID:B+Au+yIB0(1/2) AAS
>>266
じゃあ何を根拠にしてるの?
妄想?
270: (ワントンキン MM42-LD7o) 2024/09/26(木)14:46 ID:oxN8/Up7M(1) AAS
perlあたりで頼む
271(1): (ワッチョイ 022d-w5sm) 2024/09/26(木)16:39 ID:oesVQEFi0(2/2) AAS
>>269
君の問題点は規格読んでるの間違えてるとこだよ
272: はちみつ餃子◆8X2XSCHEME (ワッチョイ e332-Pvcq) 2024/09/26(木)16:48 ID:B+Au+yIB0(2/2) AAS
>>271
規格を根拠にしてたら間違えてる箇所は間違えていると反論できるだろ。
根拠がないよりは良い。
ところでどこに間違いがあった?
273(2): (ワッチョイ 63e3-VZV9) 2024/09/26(木)23:55 ID:jCy2QsTx0(1) AAS
>>235
これの1行目は文字列長によらず固定値にならない?
char* と char[] を区別できてないように思う
// これは (ヌル文字を含む) 4バイトのデータがスタック上に作られる
// sizeof(a1) の結果は文字列数により変わる
char a1[] = "abc";
// こう書いた場合、文字列の実体は静的な領域 (テキスト領域) に確保され、
省3
274: (ワッチョイ 63e3-VZV9) 2024/09/27(金)00:02 ID:ju4/Ooeg0(1/2) AAS
char* でも char[] でも、a[n] と書けばn文字目を参照するのは変わらない
これはポインタの [] 演算子は「ポインタをn個進めた位置の要素を参照する」ため、結果的には配列と変わらないから
だけど前述の a1 と a2 は違う型なので、そこは注意が必要
たぶん VS Code でC言語の拡張を入れてれば、上記のように書いた変数のところにカーソルを当たるとヒントが出るので、それで確認できると思う
それか実際に動かして sizeof の結果を見るか
275: はちみつ餃子◆8X2XSCHEME (ワッチョイ e332-Pvcq) 2024/09/27(金)00:16 ID:dEIfxD4z0(1/2) AAS
>>273
> これの1行目は文字列長によらず固定値にならない?
その通りだよ。 固定値になってたぶん意図通りではない。
その話は >>222 がボコボコに言われてもう終わったよ。
276: (ワッチョイ d27c-tavX) 2024/09/27(金)00:20 ID:qUi2cfOF0(1) AAS
もう >>222 を晒すのはやめてあげて......
277: (ワッチョイ 1663-7cnK) 2024/09/27(金)00:22 ID:xb00usC10(1) AAS
222は釣りでしょう
278(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ e332-Pvcq) 2024/09/27(金)00:23 ID:dEIfxD4z0(2/2) AAS
あ、ひょっとすると >>273 は話題を誤解してるのか。
「仮引数が配列形式だった場合にポインタに調整されるルール」が話題の中心。
仮引数として現れないと意味ない。
279: (ワッチョイ 63e3-VZV9) 2024/09/27(金)07:31 ID:ju4/Ooeg0(2/2) AAS
>>278
すまん自分が直近のレスだけ見て話題を早とちりしてた
だいたい流れは分かった
280(2): (ワッチョイ 2b65-ebyo) 2024/10/15(火)13:20 ID:+DYHSMWW0(1/3) AAS
初歩的な質問で申し訳ないんだけど
プログラムをユーザーの入力によって一時停止させるのってどうしたら良い?
pauseで入力待ちにするとかフラグを間に挿入するとかではなくユーザーからの入力があった場合のみ一時停止したい
281(1): (ブーイモ MM7f-tEjz) 2024/10/15(火)13:29 ID:WZg8MP0BM(1/2) AAS
まずメインの処理を一時停止可能な作りに変える
上下前次1-新書関写板覧索設栞歴
あと 721 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.033s