!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 160
https://mevius.5ch.net/test/read.cgi/tech/1672191630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C言語なら俺に聞け 161
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f63-sFbk)
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0289はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/09(日) 18:31:02.01ID:6ZzBc/+b0 >>287
この場合に card の型は int[5][5] なんだけど
配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール
だから式中に card が出てきたら int(*)[5] として扱われる。
この型は int* と互換性のない型ということを警告は言ってる。
型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど
上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。
故に p = *card; で通る。
この場合に card の型は int[5][5] なんだけど
配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール
だから式中に card が出てきたら int(*)[5] として扱われる。
この型は int* と互換性のない型ということを警告は言ってる。
型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど
上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。
故に p = *card; で通る。
290デフォルトの名無しさん (ワッチョイ 17b3-6GCC)
2023/07/09(日) 18:37:18.48ID:nGZbLr+D0 サンクス
291デフォルトの名無しさん (ワッチョイ 9ffb-9JJG)
2023/07/09(日) 18:49:34.69ID:vTvbeyL00 この場合ってpを長さ25の1次元配列として使っていいという保証あるっけ?
`card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど
`card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど
292はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/09(日) 19:43:00.43ID:6ZzBc/+b0293デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/09(日) 20:21:15.21ID:DZU7rHSU0 アフォはこう書く
p = (int*)card;
先輩方に見捨てられるので気をつけて
p = (int*)card;
先輩方に見捨てられるので気をつけて
294デフォルトの名無しさん (スプープ Sd3f-4U7T)
2023/07/09(日) 20:52:22.88ID:QgBW0FA9d >>291
心配なら
int card[5*5];
とでも宣言すれば安心だけど
パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので
card[5][5];も同じようにアクセスできるはず
心配なら
int card[5*5];
とでも宣言すれば安心だけど
パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので
card[5][5];も同じようにアクセスできるはず
295デフォルトの名無しさん (ワッチョイ 175f-kkOg)
2023/07/09(日) 23:01:01.58ID:uNLQZN7w0 >>291-292
隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。
隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。
296はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 00:28:02.91ID:EhhseXmK0 規格上の規定は要素のレイアウトの規定として私は理解してたので
そのレイアウトと矛盾しなければ一次元の配列として
扱っても仕様に反しないという解釈でいたんだが……。
直接的に書かれている演算方法を経由した場合しか許さん
と捉えたなら保証はないのかもしれない。
そのレイアウトと矛盾しなければ一次元の配列として
扱っても仕様に反しないという解釈でいたんだが……。
直接的に書かれている演算方法を経由した場合しか許さん
と捉えたなら保証はないのかもしれない。
297デフォルトの名無しさん (ワッチョイ ff63-kkOg)
2023/07/10(月) 00:33:20.12ID:SSHQru750 保証がないと、困るよ・・
298はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 00:36:21.43ID:EhhseXmK0 解釈の余地があるときは安全側 (制約が厳しい側) で解釈しておくのが筋ではある。
299デフォルトの名無しさん (ワッチョイ ff63-kkOg)
2023/07/10(月) 00:53:08.94ID:SSHQru750 元々配列なんて一次元が基本だし、mallocで確保して多次元配列として扱うなんてのもよくあるし
300はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 01:20:39.58ID:EhhseXmK0301デフォルトの名無しさん (スプープ Sd3f-4U7T)
2023/07/10(月) 08:43:48.54ID:Xrxae+evd 先頭と領域が確保されていればその間にアクセスできない部分があることはないだろう
そんな器用なことをする必然性がないわ
そんな器用なことをする必然性がないわ
302デフォルトの名無しさん (アウアウウー Sa9b-8N3f)
2023/07/10(月) 08:47:35.15ID:7JEyTvQka #include <stdio.h>
void main(void) {
int card[5][5];
int **p1;
int *p2
p1 = card;
p2 = card[0];
}
void main(void) {
int card[5][5];
int **p1;
int *p2
p1 = card;
p2 = card[0];
}
303デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/10(月) 09:02:15.74ID:BD2ve/J+0304デフォルトの名無しさん (アウアウウー Sa9b-8N3f)
2023/07/10(月) 09:24:10.89ID:dS/bwvgRa305デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/10(月) 09:29:04.81ID:BD2ve/J+0 >>304
何のことだよ?
何のことだよ?
306はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 09:53:48.86ID:EhhseXmK0 >>301
オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。
ポインタの演算の結果は配列の要素か配列の最後の要素を
ひとつ過ぎた位置を指さなければならない。
その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく
ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。
(C99 なら 6.5.6 の加減演算子の項目に書いてある。)
今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので
このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。
仕様に書かれている演算はその演算に相当するレイアウトで配置される
という意味で解釈することも出来ると私は考えていたが
仕様の文面に厳密に言えば駄目かもわからん。
現代的な処理系ではポインタは由来 (provenance) という概念を持っていて
演算の元になったオブジェクトを外れたら未定義であるということを
利用して最適化することもある。
これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。
仕様に厳密にしないとわけのわからないことが起こるのが C というものなので
仕様の解釈は大事だよ。
オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。
ポインタの演算の結果は配列の要素か配列の最後の要素を
ひとつ過ぎた位置を指さなければならない。
その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく
ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。
(C99 なら 6.5.6 の加減演算子の項目に書いてある。)
今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので
このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。
仕様に書かれている演算はその演算に相当するレイアウトで配置される
という意味で解釈することも出来ると私は考えていたが
仕様の文面に厳密に言えば駄目かもわからん。
現代的な処理系ではポインタは由来 (provenance) という概念を持っていて
演算の元になったオブジェクトを外れたら未定義であるということを
利用して最適化することもある。
これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。
仕様に厳密にしないとわけのわからないことが起こるのが C というものなので
仕様の解釈は大事だよ。
307デフォルトの名無しさん (ワッチョイ 9fad-kkOg)
2023/07/10(月) 10:31:52.15ID:ifz8cUKw0 >>302
p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
308デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/10(月) 10:34:39.51ID:BD2ve/J+0 int card[5][5]; となっているとき
&card 二次元配列全体へのポインタ
card 最初の行へのポインタ
*card 最初の要素へのポインタ
&card 二次元配列全体へのポインタ
card 最初の行へのポインタ
*card 最初の要素へのポインタ
309デフォルトの名無しさん (ワッチョイ bf79-CBkq)
2023/07/10(月) 12:23:15.05ID:pvSg+WfU0 2次元配列なんてExcelのRangeオブジェクトが返す配列ぐらいでしかお世話になったことないわ
特に効率的でもないし構造体でええやろ
特に効率的でもないし構造体でええやろ
310デフォルトの名無しさん (スップ Sd3f-hfg2)
2023/07/10(月) 12:47:58.91ID:Wg7MEfSed 何でそこで構造体?
311デフォルトの名無しさん (ワッチョイ 175f-kkOg)
2023/07/10(月) 12:53:57.17ID:AzWw4sMa0 >>308 下2行は正しくない。
312デフォルトの名無しさん (スップ Sd3f-hfg2)
2023/07/10(月) 13:25:18.46ID:Wg7MEfSed §6.3.2.1の段落2で定める例外にあたらない場合という但し書きが足りないね
悪かったよ
悪かったよ
313デフォルトの名無しさん (ワッチョイ ff63-/79E)
2023/07/10(月) 18:04:08.51ID:SSHQru750 5ch、専用ブラウザがサポート終了し、撤退する様です。
FireFoxだと書き込める様です。
それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
FireFoxだと書き込める様です。
それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
314デフォルトの名無しさん (ワッチョイ ff7c-rqKn)
2023/07/10(月) 18:05:43.31ID:BD2ve/J+0 ソースplz
315デフォルトの名無しさん (スップ Sd3f-9JJG)
2023/07/10(月) 18:24:57.71ID:EIZKDTevd 処理系が16byte境界に合うように
「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安
わざわざコンパイラがそんなことする理由は
1. 16byte境界の合わせたほうがindexの計算が速い
2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる
規格上パディングが入らないことが保証されるならこの話は忘れてくれ
「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安
わざわざコンパイラがそんなことする理由は
1. 16byte境界の合わせたほうがindexの計算が速い
2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる
規格上パディングが入らないことが保証されるならこの話は忘れてくれ
316デフォルトの名無しさん (ワッチョイ ff63-/79E)
2023/07/10(月) 18:29:02.59ID:SSHQru750 Talk専用ブラウザ 「Jane Style」 ← 5chの記述が消えました
20230710
Version 5.00 公開
・Talk に対応しました
* 5ch.net のサポートを終了しました
http://janesoft.net/janestyle/
20230710
Version 5.00 公開
・Talk に対応しました
* 5ch.net のサポートを終了しました
http://janesoft.net/janestyle/
317デフォルトの名無しさん (アウアウウー Sa9b-HEX/)
2023/07/10(月) 18:54:15.08ID:ebofKpc7a >int **p1;
無いわωωω
無いわωωω
318デフォルトの名無しさん (ワッチョイ 9fad-OD6X)
2023/07/11(火) 02:24:43.39ID:vn98dBP10 >>314
https://agree.5ch.net/test/read.cgi/operate/9240230711/
正確にはJaneStyleが離反した
> 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech
> Janestyleはもう5ch.netと提携していません。
> Janestyle以外の専用ブラウザをご利用ください。
> 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。
> (以下略)
https://agree.5ch.net/test/read.cgi/operate/9240230711/
正確にはJaneStyleが離反した
> 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech
> Janestyleはもう5ch.netと提携していません。
> Janestyle以外の専用ブラウザをご利用ください。
> 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。
> (以下略)
319はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-/79E)
2023/07/11(火) 11:41:03.76ID:MoKwTryZ0 >>315
おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。
おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。
320デフォルトの名無しさん (ワッチョイ b702-VAl4)
2023/07/11(火) 12:37:10.33ID:UJem4sQV0 テスト
> どういう理屈か知らんけど
> chmateで『URLから開く』で見たい板のURL貼り付けして
> 「5ch」の部分を「5Ch」に変えて開くと
> 5chのスレchmateで見れて草
https://twitter.com/motokamin_/status/1678473238177783835
https://twitter.com/5chan_nel (5ch newer account)
> どういう理屈か知らんけど
> chmateで『URLから開く』で見たい板のURL貼り付けして
> 「5ch」の部分を「5Ch」に変えて開くと
> 5chのスレchmateで見れて草
https://twitter.com/motokamin_/status/1678473238177783835
https://twitter.com/5chan_nel (5ch newer account)
321デフォルトの名無しさん (ワッチョイ e2ad-/jfo)
2023/07/17(月) 05:23:15.01ID:0PvTd+Ok0 chmate はもう対応できてないかな。俺は読み書きできるようになったよ。
今これはPCからで Siki っていうの使って書いてるが。
今これはPCからで Siki っていうの使って書いてるが。
322デフォルトの名無しさん (ワッチョイ 163e-MI76)
2023/07/17(月) 09:16:25.38ID:YifLUjyU0 旧 API を復活させて制限が緩くなったから昔の専ブラがそのままかちょっとした設定変更で使えるよ。
今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。
今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。
323デフォルトの名無しさん (ワッチョイ 3279-EJzg)
2023/07/17(月) 11:31:18.04ID:SG+RSRxx0 >>321
PCはAPI対応前の昔のlive2ch(live5ch)が使える
PCはAPI対応前の昔のlive2ch(live5ch)が使える
324デフォルトの名無しさん (ワッチョイ 4d46-am1z)
2023/07/17(月) 11:33:54.45ID:o8kBjP6A0 ninja は make を完全に置き換え可能になったでござるかニンニン?
325はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 163e-MI76)
2023/07/17(月) 11:48:18.17ID:YifLUjyU0 >>324
設計思想が異なる。
ninja は make ほど多機能ではなく、メタビルドツール (cmake など) と組み合わせるのを前提としている。
どうせメタビルドツールは使うという前提なら ninja のほうが使い勝手が良いと思うが、
そうでないなら make のほうが楽だと思う。
設計思想が異なる。
ninja は make ほど多機能ではなく、メタビルドツール (cmake など) と組み合わせるのを前提としている。
どうせメタビルドツールは使うという前提なら ninja のほうが使い勝手が良いと思うが、
そうでないなら make のほうが楽だと思う。
326デフォルトの名無しさん (ワッチョイ dfad-onGn)
2023/07/22(土) 17:50:40.48ID:ZqN2VkQO0 Siki はおすすめ記事が出ていた。
5chブラウザー、JaneStyle代わりのオススメは「Siki」
https://news.yahoo.co.jp/articles/adfd44b291fbc07686ea4735e1397a3287aa4045
5chブラウザー、JaneStyle代わりのオススメは「Siki」
https://news.yahoo.co.jp/articles/adfd44b291fbc07686ea4735e1397a3287aa4045
327デフォルトの名無しさん (ワッチョイ 7f63-cTWz)
2023/07/27(木) 01:32:04.41ID:z625zk2O0 現状専用ブラウザJaneStyle4.23を落としてきて修正パッチを当てて動かしてます。
修正パッチは有志が機械語レベルまで降りて解析し対処してます。
今まで無かった機能まで追加してます。その技術力はスゴイですね。
ただ、専用ブラウザは今後5ちゃんねるの仕様が変わったときに
開発者がメンテできるかどうかで生死が決まりそうですね。
修正パッチは有志が機械語レベルまで降りて解析し対処してます。
今まで無かった機能まで追加してます。その技術力はスゴイですね。
ただ、専用ブラウザは今後5ちゃんねるの仕様が変わったときに
開発者がメンテできるかどうかで生死が決まりそうですね。
328デフォルトの名無しさん (ワッチョイ 7310-X/lp)
2023/08/02(水) 10:02:23.97ID:6slkiMgF0 なんか昔「コンパイル言語は消滅してスクリプト言語が主流になる!!」って主張聞いて
オープンソースアプリはともかく商業アプリでスクリプト言語使ってたら
速攻解析されてコピーなりクラックされて(その結果どうなるかはわからんけど)商売にならないんじゃないのかと思ったけど
現状どうなのかな?
JaneStyleの 不具合発生→ねらー修正 っての見てるとバイナリーコードでもスクリプトコードでも解析難易度は変わらないのかなとも思うけど。
オープンソースアプリはともかく商業アプリでスクリプト言語使ってたら
速攻解析されてコピーなりクラックされて(その結果どうなるかはわからんけど)商売にならないんじゃないのかと思ったけど
現状どうなのかな?
JaneStyleの 不具合発生→ねらー修正 っての見てるとバイナリーコードでもスクリプトコードでも解析難易度は変わらないのかなとも思うけど。
329デフォルトの名無しさん (ワッチョイ 1746-ZTxv)
2023/08/02(水) 10:53:42.75ID:19FN81hV0330デフォルトの名無しさん (ラクッペペ MMe6-Fuds)
2023/08/02(水) 11:00:33.97ID:Vv20iihFM バイナリクラックなら開発言語そのものにはあまり意味はない気がするけどな
バイナリエディタで稼働中の実行コード覗かれれば元の言語が何であろうが同じこと
バイナリエディタで稼働中の実行コード覗かれれば元の言語が何であろうが同じこと
331デフォルトの名無しさん (ワッチョイ be63-1j9t)
2023/08/02(水) 11:10:57.90ID:STym7Vrv0 こういうのはやはりファームやってた人は強いのだろうか?笑
332はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b73e-yh3V)
2023/08/02(水) 11:11:56.50ID:Vhf3uqZN0 暗号化やら難読化やらを駆使しても
実行中には実行できる形になってるのは
どうしようもないもんな。
だからライセンスで制約を付けるんだが、
不特定多数をユーザーとするビジネスモデルだと
制約を守らせるのも難しいのだと思う。
実行中には実行できる形になってるのは
どうしようもないもんな。
だからライセンスで制約を付けるんだが、
不特定多数をユーザーとするビジネスモデルだと
制約を守らせるのも難しいのだと思う。
333デフォルトの名無しさん (ワッチョイ be63-1j9t)
2023/08/02(水) 11:38:35.24ID:STym7Vrv0 不具合を何度も指摘されても放置していて
痺れ切らしたユーザーが解析してパッチを公開した
これが最初だったと思う
痺れ切らしたユーザーが解析してパッチを公開した
これが最初だったと思う
334デフォルトの名無しさん (ワッチョイ 4af0-0TAO)
2023/08/02(水) 11:45:48.58ID:JKibevwe0 あれ難読化してあるの?
335デフォルトの名無しさん (ワッチョイ 6aad-kNqZ)
2023/08/02(水) 11:54:41.63ID:na1pjdup0 業務用アプリならサブスクとクラウドって感じだろうけど
個人向けのだとどうなんだろうね
まあそういう海賊版はアップロードした奴を捕まえることで対処しているっぽいけど
アプリの制限取っ払われるのはもうどうしようもないんじゃないかな
個人向けのだとどうなんだろうね
まあそういう海賊版はアップロードした奴を捕まえることで対処しているっぽいけど
アプリの制限取っ払われるのはもうどうしようもないんじゃないかな
336デフォルトの名無しさん (ワッチョイ 6aad-kNqZ)
2023/08/02(水) 11:55:36.50ID:na1pjdup0 難読化はしてない
いやらしいほどに丸見え
いやらしいほどに丸見え
337デフォルトの名無しさん (スッププ Sdb6-FXAW)
2023/08/02(水) 20:21:52.90ID:Zi22N3SKd >>328
オープンソースを勘違いしてる?
オープンソースを勘違いしてる?
338デフォルトの名無しさん (ワッチョイ be63-1j9t)
2023/08/02(水) 20:58:10.27ID:STym7Vrv0 質問型式ではなく、自分はこう考えていると書いて
339デフォルトの名無しさん (スッププ Sdb6-FXAW)
2023/08/02(水) 23:54:36.96ID:W7+oBwzNd >>328
次元の違う問題を比較してると思う
スクリプトでコンパイル言語を代替できるようになったとしても
商業ソフトを供給するほうがスクリプトでないと実装できないことにはならないし
サーバーサイドで重要な処理を行うようにすればスクリプトでもそこは解析できないわけだし(今回の5chのAPI仕様変更みたいに)
次元の違う問題を比較してると思う
スクリプトでコンパイル言語を代替できるようになったとしても
商業ソフトを供給するほうがスクリプトでないと実装できないことにはならないし
サーバーサイドで重要な処理を行うようにすればスクリプトでもそこは解析できないわけだし(今回の5chのAPI仕様変更みたいに)
340デフォルトの名無しさん (ワッチョイ 6aad-Z/b2)
2023/08/03(木) 04:03:41.71ID:/xW45k0z0 >>328
主流かどうかはわからんけどJavaのような仮想マシンで動くやつは流行ったな(Androidスマホで採用されたので思い切り流行った)。Perlとかのインタープリタの言語も内部でコンパイルしてから動くのでなんとなく似ている。
こういう風に仮想マシンで動くようにするとOSやCPUが違っても互換性を保つのが楽になる。
主流かどうかはわからんけどJavaのような仮想マシンで動くやつは流行ったな(Androidスマホで採用されたので思い切り流行った)。Perlとかのインタープリタの言語も内部でコンパイルしてから動くのでなんとなく似ている。
こういう風に仮想マシンで動くようにするとOSやCPUが違っても互換性を保つのが楽になる。
341デフォルトの名無しさん (ワッチョイ 5b2d-IPSQ)
2023/08/03(木) 17:16:30.77ID:5KUHoXNc0 tiktokなんかjavascriptでVMを実装してその上で独自のコードが動いてるせいで解析が極めて困難になってる
342デフォルトの名無しさん (ワッチョイ 1746-ZTxv)
2023/08/04(金) 08:54:17.97ID:4oDPVLgw0 >>341
こわっ...
こわっ...
343デフォルトの名無しさん (スフッ Sd8a-KN61)
2023/08/04(金) 15:45:40.86ID:GMHK0FTid /* 文字列を反転させる */
#include <stdio.h>
#include <string.h>
void reverse(char *);
void reverse(char *cp)
{
char *p, *q, wk;
p = cp;
q = &cp[strlen(cp)]-1; // strlen()は'\0'を数えないのに1引かないと正しく動作しない
while (p < q) {
wk = *p;*p = *q;*q = wk;
p++;
q--;
}
}
int main(void)
{
char ss[] = "Program123456789";
reverse(ss);
printf("%s\n", ss);
return 0;
}
上記プログラムでstrlenは'\0'文字をカウントしないのに、1引かないと正しく動作しないのはなぜですか?
#include <stdio.h>
#include <string.h>
void reverse(char *);
void reverse(char *cp)
{
char *p, *q, wk;
p = cp;
q = &cp[strlen(cp)]-1; // strlen()は'\0'を数えないのに1引かないと正しく動作しない
while (p < q) {
wk = *p;*p = *q;*q = wk;
p++;
q--;
}
}
int main(void)
{
char ss[] = "Program123456789";
reverse(ss);
printf("%s\n", ss);
return 0;
}
上記プログラムでstrlenは'\0'文字をカウントしないのに、1引かないと正しく動作しないのはなぜですか?
344デフォルトの名無しさん (スフッ Sd8a-KN61)
2023/08/04(金) 15:49:34.67ID:GMHK0FTid 343の訂正です
q = &cp[strlen(cp)-1]です
q = &cp[strlen(cp)-1]です
345デフォルトの名無しさん (ワッチョイ 17c9-NYH+)
2023/08/04(金) 15:57:00.72ID:/AVxr1FX0 末尾の \0 を入れ替えたらあかんやろ
"AB" は strlen() == 2 になって
0 1 2
[A][B][\0]
こういう配置や
"AB" は strlen() == 2 になって
0 1 2
[A][B][\0]
こういう配置や
346デフォルトの名無しさん (ワッチョイ 17c9-NYH+)
2023/08/04(金) 16:03:23.77ID:/AVxr1FX0 strlen は文字数を返す一方で [ ] の中はオフセット量(0スタートの相対距離)だから
1文字目を指すのは オフセット0 の場所なんだわ
1文字目を指すのは オフセット0 の場所なんだわ
347デフォルトの名無しさん (スフッ Sd8a-rFCo)
2023/08/04(金) 16:09:46.38ID:GMHK0FTid348デフォルトの名無しさん (ワッチョイ 17c9-NYH+)
2023/08/04(金) 16:25:43.11ID:/AVxr1FX0 そこまで考えてというか ポインタ/配列添え字 が 0 から始まるだけの話でな
1文字目 = (オフセット)0
2文字目 = (オフセット)1
:
n文字目 = (オフセット)n-1
他所言語(特に古めのBASIC) だと配列の添え字は 1から始まるのが自然だから
その感覚のままだと およよ? ってなる
1文字目 = (オフセット)0
2文字目 = (オフセット)1
:
n文字目 = (オフセット)n-1
他所言語(特に古めのBASIC) だと配列の添え字は 1から始まるのが自然だから
その感覚のままだと およよ? ってなる
349デフォルトの名無しさん (ワッチョイ be63-1j9t)
2023/08/04(金) 16:33:03.37ID:h8ImZ1qQ0 COBOL, PL/I, RPG, FORTRAN, BASIC, R, Lua, Julia は、1で始まる
350はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b73e-yh3V)
2023/08/04(金) 16:45:56.55ID:vdf3rEq10 BASIC はバリエーションが多いよ。
0 と 1 を切り替える機能があるやつを知ってる。
0 と 1 を切り替える機能があるやつを知ってる。
351デフォルトの名無しさん (ブーイモ MMe6-rA3N)
2023/08/04(金) 22:18:35.44ID:3UzK9dfoM >>341
そのやり方だとapple審査通らないのでは?
そのやり方だとapple審査通らないのでは?
352デフォルトの名無しさん (ブーイモ MMe6-rA3N)
2023/08/04(金) 22:23:16.57ID:3UzK9dfoM 環境はwebkitでvm自体dlしてくるから問題ないということなのか…
353デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
2023/08/05(土) 14:06:37.50ID:7Tp3cevL0 >>349
Pascal もよろしく
Pascal もよろしく
354デフォルトの名無しさん (ワッチョイ bb01-tyL0)
2023/08/05(土) 21:43:38.19ID:p8skrLMB0 >>353
Fortranは添字の開始値を指定しない場合は1から始まり、添字の開始値を指定する場合は任意の整数
(負も可)を指定できるが、Pascalは添字の開始値指定が必須で任意の整数(負も可)を指定できるから、
1から始まるとは言えない。
Fortranは添字の開始値を指定しない場合は1から始まり、添字の開始値を指定する場合は任意の整数
(負も可)を指定できるが、Pascalは添字の開始値指定が必須で任意の整数(負も可)を指定できるから、
1から始まるとは言えない。
355デフォルトの名無しさん (スプープ Sdc3-EMqx)
2023/08/05(土) 22:05:05.59ID:Rq9CiLOMd356デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
2023/08/05(土) 23:14:06.26ID:7Tp3cevL0 >>354
そういやそうだった。忘れてた。
そういやそうだった。忘れてた。
357デフォルトの名無しさん (ワッチョイ c379-IXit)
2023/08/06(日) 12:09:56.49ID:SuulMMGF0 今時はExcelのセルをCellsでアクセスしたり配列に代入した場合だけ1オリジン固定でちょっと困る
歴史的経緯というよりExcelのCOMオブジェクトの仕様なんだろうけど
歴史的経緯というよりExcelのCOMオブジェクトの仕様なんだろうけど
358デフォルトの名無しさん (テテンテンテン MM17-2Tt6)
2023/08/06(日) 13:13:28.45ID:GDllPCgfM 配列って
array + sizeof(*array) * index
だから、0からの方が理にかなってると思う
1からの場合は、実行時にアドレスを割り出すときに絶対1引いてるよね…
そこまでしても人間の直感に合わせたかったのだろう
array + sizeof(*array) * index
だから、0からの方が理にかなってると思う
1からの場合は、実行時にアドレスを割り出すときに絶対1引いてるよね…
そこまでしても人間の直感に合わせたかったのだろう
359デフォルトの名無しさん (ワッチョイ ebad-9S8H)
2023/08/06(日) 13:25:15.07ID:jxDYmhFo0 1引いているのはあくまで内部的なもの
それこそ人間の直感に合わせたインターフェイスとコンピュータの都合の良い情報に相互変換するのがプログラムじゃなかろうか
0からのほうが分かりやすいと思うのはプログラマだからだろうし
10個のデータの最後のインデックスは10というのは添え字で考える場合は分かりやすいしね
それこそ人間の直感に合わせたインターフェイスとコンピュータの都合の良い情報に相互変換するのがプログラムじゃなかろうか
0からのほうが分かりやすいと思うのはプログラマだからだろうし
10個のデータの最後のインデックスは10というのは添え字で考える場合は分かりやすいしね
360デフォルトの名無しさん (ワッチョイ 7510-WTQk)
2023/08/06(日) 14:09:12.01ID:VdM0xi000 先頭をゼロと呼ぶか1と呼ぶかならまだマシよ
音楽なんて先頭要素を1と呼ぶだけじゃなく、要素間の差がない事まで、ゼロじゃなく1と呼ぶ
現代人からするとどう考えても頭おかしいが、仕方がない。ゼロの概念がなかった時代から定義が変わらず続いてるらしい
音楽なんて先頭要素を1と呼ぶだけじゃなく、要素間の差がない事まで、ゼロじゃなく1と呼ぶ
現代人からするとどう考えても頭おかしいが、仕方がない。ゼロの概念がなかった時代から定義が変わらず続いてるらしい
361デフォルトの名無しさん (ワッチョイ c379-IXit)
2023/08/06(日) 14:15:40.68ID:SuulMMGF0 Cはゼロに限らず何もないを示すvoidが無い頃は全部intでやってた時代もあるんだよ
頭おかしいな
頭おかしいな
362デフォルトの名無しさん (ワッチョイ ebad-9S8H)
2023/08/06(日) 14:37:12.68ID:jxDYmhFo0 voidが何もないことを示すならvoid*の存在のほうが気になる
363デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
2023/08/06(日) 14:59:14.25ID:RhhSFLLO0 void だけ特殊な型と考えるしかないのではないかな。大きさが0ビットの型と考えても良いのかも知れないが。
364デフォルトの名無しさん (テテンテンテン MM17-2Tt6)
2023/08/06(日) 15:50:27.26ID:3R7VaRJUM sizeof(void) → 1 だな
これって正式な仕様なのか分からんけど
これって正式な仕様なのか分からんけど
365デフォルトの名無しさん (ワッチョイ 87cf-n4fA)
2023/08/06(日) 16:40:17.07ID:Raz9Sh7o0 それgccなんかの独自仕様のはず。void*をバイト単位で計算できるから便利なんだけどね。
366デフォルトの名無しさん (スッププ Sd03-EMqx)
2023/08/06(日) 17:35:17.48ID:/aV5Am17d それは気持ち悪いな
367はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
2023/08/06(日) 17:46:22.79ID:Mgx3ApDu0 言語仕様上は void は不完全型とする扱い、かつ sizeof に不完全型を与えることは出来ない。
368デフォルトの名無しさん (スッププ Sd03-EMqx)
2023/08/06(日) 17:48:27.27ID:/aV5Am17d gccだとsizeof(関数名)も1なんでしょ
明らかにただの手抜き
明らかにただの手抜き
369デフォルトの名無しさん (ワッチョイ b363-aAN6)
2023/08/06(日) 17:52:12.98ID:wnylhiXb0 仕様上の問題は置いておいて
1として扱うと何か良いことあるんでしょうか?
1として扱うと何か良いことあるんでしょうか?
370はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
2023/08/06(日) 17:56:04.37ID:Mgx3ApDu0 未定義な動作は規格として規格が何ら要求を課さないことを意味するが
但し書きの中に「文書化された環境に特有な方法で処理してもよい」ともある。
GNU C のドキュメントには void と関数 (関数指示子) の大きさについて記述がある。
https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
これも規格が認める正しい動作のひとつ。
それはそうとして処理系に固有の挙動に依存するのを避けるに越したことは無いけど。
但し書きの中に「文書化された環境に特有な方法で処理してもよい」ともある。
GNU C のドキュメントには void と関数 (関数指示子) の大きさについて記述がある。
https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
これも規格が認める正しい動作のひとつ。
それはそうとして処理系に固有の挙動に依存するのを避けるに越したことは無いけど。
371デフォルトの名無しさん (ワッチョイ 87cf-n4fA)
2023/08/06(日) 18:03:13.82ID:Raz9Sh7o0372はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
2023/08/06(日) 18:10:14.29ID:Mgx3ApDu0 void* は演算させないという意思表示なこともあるんで
演算できることが良いわけでもないんだけどね。
演算できることが良いわけでもないんだけどね。
373デフォルトの名無しさん (ワッチョイ 87cf-n4fA)
2023/08/06(日) 18:29:53.89ID:Raz9Sh7o0 どんな用途があるかな?デリファレンス先にアクセスできないってだけで十分な気もするが。
374デフォルトの名無しさん (アウアウウー Sa9f-W3Bx)
2023/08/06(日) 18:36:51.14ID:mq8IFmf1a 任意に渡ってきたポインタ間の距離?
375デフォルトの名無しさん (ワッチョイ 7510-WTQk)
2023/08/07(月) 01:08:17.44ID:zJXXdP4R0 アレじゃないかな?メリットあるとしたら
【struct に含めたメンバーは、サイズゼロはダメ】っていう仕様があったかと思う。
正確には【structの違うメンバーが同じアドレスになったらダメ】だったか
----
以下は蛇足
ただサイズゼロだめってのは例外があって。
structの末尾メンバーでchar[] だか char[0]ってのが、確かC99あたりでアリになった気がする。
これは…それまでも使われてたテクで
【structの最後に char [1] のメンバーを置いて、実際にはメモリ確保の時structのサイズ+可変長部のサイズでメモリ確保し、最後のメンバーを使ってstructのサイズを超えてアクセスする】という慣用句があって、
それの目的で
C言語公式仕様風では char[1] と書き
確か昔は gccだとchar[]
vcだと char[0]
ていう書き方してた。(gccとvcは逆だったかも知れない)
のが、公式仕様でもサイズゼロokになった…という話だったかと。
【struct に含めたメンバーは、サイズゼロはダメ】っていう仕様があったかと思う。
正確には【structの違うメンバーが同じアドレスになったらダメ】だったか
----
以下は蛇足
ただサイズゼロだめってのは例外があって。
structの末尾メンバーでchar[] だか char[0]ってのが、確かC99あたりでアリになった気がする。
これは…それまでも使われてたテクで
【structの最後に char [1] のメンバーを置いて、実際にはメモリ確保の時structのサイズ+可変長部のサイズでメモリ確保し、最後のメンバーを使ってstructのサイズを超えてアクセスする】という慣用句があって、
それの目的で
C言語公式仕様風では char[1] と書き
確か昔は gccだとchar[]
vcだと char[0]
ていう書き方してた。(gccとvcは逆だったかも知れない)
のが、公式仕様でもサイズゼロokになった…という話だったかと。
376デフォルトの名無しさん (ワッチョイ 7510-WTQk)
2023/08/07(月) 01:23:44.93ID:zJXXdP4R0 あ、メリットの言い方をすると
処理系内でstructのサイズ計算を実装するにあたって、あらゆる型がサイズ1以上である事が分かっていれば、合算処理を合理的に実装する事ができる
…よね?
処理系内でstructのサイズ計算を実装するにあたって、あらゆる型がサイズ1以上である事が分かっていれば、合算処理を合理的に実装する事ができる
…よね?
377デフォルトの名無しさん (スッップ Sdd7-EMqx)
2023/08/07(月) 08:18:18.04ID:SwgOJiZRd 意味不明
メンバーにvoidを含められたとしても参照すればエラーになるはずなので使いようがない
(void*はもともと正しいサイズを持つ)
unionで似たようなことはできる
メンバーにvoidを含められたとしても参照すればエラーになるはずなので使いようがない
(void*はもともと正しいサイズを持つ)
unionで似たようなことはできる
378はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
2023/08/07(月) 09:11:24.17ID:U9It/DCQ0 >>375
サイズゼロをOKとすると言ってしまうと語弊があると思う。
仕様上の理屈だと「不完全型を指定できる」だし、そうした場合の動作は
いくつかの特例で成立していて「長さ 0 の配列」は現れない。
sizeof などでは「フレキシブル配列メンバは無視される」だし、
メンバにアクセスするときは
> 置き換えられた配列が要素をもたないとき,それはただ一つの要素をもつのと同じ規則で動作する。
> しかし,その要素にアクセスした場合,又はその要素を一つ越えたポインタを生成した場合,
> その動作は未定義とする。
とあって、長さ 1 として扱うけど要素にはアクセスするなという回りくどい言い回しになってる。
サイズゼロをOKとすると言ってしまうと語弊があると思う。
仕様上の理屈だと「不完全型を指定できる」だし、そうした場合の動作は
いくつかの特例で成立していて「長さ 0 の配列」は現れない。
sizeof などでは「フレキシブル配列メンバは無視される」だし、
メンバにアクセスするときは
> 置き換えられた配列が要素をもたないとき,それはただ一つの要素をもつのと同じ規則で動作する。
> しかし,その要素にアクセスした場合,又はその要素を一つ越えたポインタを生成した場合,
> その動作は未定義とする。
とあって、長さ 1 として扱うけど要素にはアクセスするなという回りくどい言い回しになってる。
379デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
2023/08/07(月) 10:17:41.09ID:wl/Lx6N5a >>375
typedef struct { int x; char a[1]; } A; A *p = (A *)malloc(sizeof(A) - 1 + N);
typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) + N);
typedef struct { int z; char c[0]; } C; C *r = (C *)malloc(sizeof(C) + N);
かな
typedef struct { int x; char a[1]; } A; A *p = (A *)malloc(sizeof(A) - 1 + N);
typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) + N);
typedef struct { int z; char c[0]; } C; C *r = (C *)malloc(sizeof(C) + N);
かな
380デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
2023/08/07(月) 10:19:25.16ID:wl/Lx6N5a >>378 の主張だと
typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) - 1 + N);
でなければならないのかな
typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) - 1 + N);
でなければならないのかな
381はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
2023/08/07(月) 11:05:26.04ID:U9It/DCQ0 >>379
配列の大きさとして 1 を指定して可変長のように扱うやり方については
ちょっと不明瞭なんだが仕様に厳密にいうと準拠してない方法だと考えられている。
https://c-faq.com/struct/structhack.html
配列の大きさが 0 より大きくなければならないということについては
例外を見つけられないのでどこであろうと 0 を指定したら未定義と解釈していいと思う。
GNU C では構造体メンバの最後の配列要素に 0 を指定した場合は
C99 でフレキシブル配列メンバにしたときとほぼ同じような扱いになることがドキュメント化されてる。
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
つまり GNU C では 0 を指定していいわけだが……結果が同じならあえてやる必要もないな。
GNU C でも構造体の最後の要素を除いて配列の大きさに 0 を指定するのは (可能だが) 推奨されていない。
アクセスした結果は未定義なのでなんの役に立つのかようわからん。
配列の大きさとして 1 を指定して可変長のように扱うやり方については
ちょっと不明瞭なんだが仕様に厳密にいうと準拠してない方法だと考えられている。
https://c-faq.com/struct/structhack.html
配列の大きさが 0 より大きくなければならないということについては
例外を見つけられないのでどこであろうと 0 を指定したら未定義と解釈していいと思う。
GNU C では構造体メンバの最後の配列要素に 0 を指定した場合は
C99 でフレキシブル配列メンバにしたときとほぼ同じような扱いになることがドキュメント化されてる。
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
つまり GNU C では 0 を指定していいわけだが……結果が同じならあえてやる必要もないな。
GNU C でも構造体の最後の要素を除いて配列の大きさに 0 を指定するのは (可能だが) 推奨されていない。
アクセスした結果は未定義なのでなんの役に立つのかようわからん。
382デフォルトの名無しさん (スッップ Sdd7-EMqx)
2023/08/07(月) 11:36:51.88ID:SwgOJiZRd383デフォルトの名無しさん (ブーイモ MMf3-DyKn)
2023/08/07(月) 14:20:51.17ID:Xd8Y6/QgM384はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
2023/08/07(月) 14:26:13.65ID:U9It/DCQ0 >>382-383
どっちも間違い。 この場合は -1 をしてはいけない。
どっちも間違い。 この場合は -1 をしてはいけない。
385デフォルトの名無しさん (スッップ Sdd7-EMqx)
2023/08/07(月) 20:36:36.16ID:SwgOJiZRd386はちみつ餃子 ◆8X2XSCHEME (ワッチョイ eb32-oz9p)
2023/08/07(月) 21:06:32.92ID:+g1cDN8+0 >>385
1バイトごときのために余計なことをしないってのは理解できる理屈だが、不必要な1バイトを確保するってのもそれはそれで無駄に考えさせられてしまう感じがする。
やろうとしていることと合致しないコードなわけだから。
害はないが役に立ってもいないということを確信するのはどういう役に立っているのかを見つけるより難しい。
1バイトごときのために余計なことをしないってのは理解できる理屈だが、不必要な1バイトを確保するってのもそれはそれで無駄に考えさせられてしまう感じがする。
やろうとしていることと合致しないコードなわけだから。
害はないが役に立ってもいないということを確信するのはどういう役に立っているのかを見つけるより難しい。
387デフォルトの名無しさん (ブーイモ MMf3-DyKn)
2023/08/07(月) 21:30:20.59ID:6YHeZP2fM■ このスレッドは過去ログ倉庫に格納されています
