C言語なら俺に聞け 159at TECH
C言語なら俺に聞け 159 - 暇つぶし2ch792:デフォルトの名無しさん
22/12/06 11:20:14.67 yvaEv+2ca.net
>>761
> Win98時代は1Mバイト程度の配列変数作っただけで動作がおかしくなってたな。
それは今でも一緒だろ
Windows の既定のスタックサイズは1MBのままだぞ
URLリンク(learn.microsoft.com)

793:デフォルトの名無しさん
22/12/06 11:30:06.24 PYPomZFd0.net
MS-DOSの頃は、メモリ1MB積んだPCってスゴイ豪華な印象だったな
搭載メモリーを使い切る様なプログラムを、オレは書けるんかって思ってた

794:デフォルトの名無しさん
22/12/06 12:01:21.10 63yxghiR0.net
I/Oバンク方式かEMSかって時代か

795:デフォルトの名無しさん
22/12/06 14:59:37.11 iX2JPZR5d.net
本当のメインメモリとして使えたのは640kBまでで
残りの384kBはバンクかEMSの増設メモリだった

796:デフォルトの名無しさん
22/12/06 19:43:39.61 PYPomZFd0.net
最初はハードウェアで実装してたけれど
そのうち仮想86モードだったかで、
特別なハードを追加せずにメモリアクセス出来る様になってたね

797:デフォルトの名無しさん
22/12/06 20:33:29.46 zjGx1PLy0.net
>>766
残りはハードウェアのIOやらROMやらVRAMなどだ
EMSウインドウはその開いている隙間アドレスにねじ込んだだけ

798:デフォルトの名無しさん
22/12/06 21:49:14.42 63yxghiR0.net
>>767
あったねー、ソフトウエアEMS>ハードウエアEMSなんて珍現象

799:デフォルトの名無しさん
22/12/09 05:45:28.61 QbuGAkRx0.net
#include <stdio.h>
#include <time.h>
void
main(void)
{
time_t now, now2;
now = time(NULL);
now2 = time(NULL);
struct tm *tm1 = localtime(&now);
struct tm *tm2 = localtime(&now2);
tm2->tm_mday = 1;
tm2->tm_mon = 1;
printf("%d %d\n", tm1->tm_mday, tm1->tm_mon);
printf("%d %d\n", tm2->tm_mday, tm2->tm_mon);
}

800:デフォルトの名無しさん
22/12/09 05:46:27.95 QbuGAkRx0.net
tm2を変更するとtm1も同じ値になってしまいます。
回避方法を教えて下さい。

801:デフォルトの名無しさん
22/12/09 05:47:05.17 QbuGAkRx0.net
OS:Linux Mint
コンパイラ:gcc です

802:デフォルトの名無しさん
22/12/09 06:15:54.45 rdO0dbBS0.net
URLリンク(linuxjm.osdn.jp)
localtime_r()を使いましょう
struct tm *tm1 = localtime(&now);
こんな使い方をするって時点でlocaltime()が「何」を返すのか、察しましょう

803:デフォルトの名無しさん
22/12/09 06:58:19.07 QbuGAkRx0.net
>>773
サンクス、動いた

804:デフォルトの名無しさん
22/12/09 07:14:28.04 aKtIUC7D0.net
このへん、言っちゃなんだけどクソだね
なんでこんな変な設計にしたんだろう

805:デフォルトの名無しさん
22/12/09 07:27:22.65 G83XZmEL0.net
ローカルで構造体を定義してそこへのポインタを返すとスタックから消えてデータが壊れますか?

806:デフォルトの名無しさん
22/12/09 07:54:25.65 DDM/thjI0.net
>>775
いちいち使う人に領域確保させる手間をかけさせたくなかったってことでしょ
マルチスレッドなんてない時代だし

807:デフォルトの名無しさん
22/12/09 07:57:34.07 DDM/thjI0.net
>>776
構造体に限らずローカル変数へのポインタを返すとポインタの指す先の内容は壊れる(かもしれない)

808:デフォルトの名無しさん
22/12/09 13:31:15.00 RVIOSi06d.net
未定義の動作という

809:デフォルトの名無しさん
22/12/09 15:26:27.10 Z1cscK2ka.net
>>775
strtok

810:デフォルトの名無しさん
22/12/09 15:41:02.97 8zaQFmsV0.net
何らかの要因でテンパって煮詰まってコーディングしてて
変なものができてしまうこと、皆さんも経験あるのでは

811:はちみつ餃子
22/12/09 17:25:23.52 Qnrm7z6h0.net
>>776
スタックから消えるというか、言語仕様的な用語でいうと生存期間が終了していることになる。
そんでオブジェクトを生存期間の外部で参照したときの動作は未定義なので何が起こるかわからん。
C でいう未定義ってのは「何が起きてもいい」なのでデータが壊れる (意味不明の値が読みだされる) だけでは済まないかもしれない。

812:デフォルトの名無しさん
22/12/09 17:34:59.55 i/ZE6Izl0.net
恋と同じで、はかなく消える運命

813:デフォルトの名無しさん
22/12/10 01:00:03.41 ap6EnRqC0.net
>>776
すぐ消えないことがあるので読めてしまうかも知れない。しかし何かをすると一瞬にして破壊されて終わるかも知れない。
あてにしてはいけない。
ていうかこの頃のコンパイラってそういうのは警告出したりエラー扱いにしない?

814:デフォルトの名無しさん
22/12/10 08:35:32.63 0yWWcyiC0.net
コンパイル時に常に摘出できるわけじゃないし

815:デフォルトの名無しさん
22/12/10 08:43:06.25 VZKCrGXt0.net
いやバグは睾丸みたいに摘出はできないだろ

816:デフォルトの名無しさん
22/12/10 11:08:12.32 8LaJbp4o0.net
warning C4172: ローカル変数またはテンポラリのアドレスを返します: hoge
VS2022

817:デフォルトの名無しさん
22/12/10 11:18:10.60 W5v0KihFa.net
>>787
URLリンク(learn.microsoft.com)

818:デフォルトの名無しさん
22/12/10 11:34:37.41 FHzDIuwr0.net
そういうときはレジスタ変数のアドレスを返すようにコーディングしなさい

819:デフォルトの名無しさん
22/12/10 11:49:59.77 n733SMJ50.net
staticの出番は?

820:デフォルトの名無しさん
22/12/10 12:13:19.32 9jPqI4Xva.net
そして>>773の仕様となるのであった…

821:デフォルトの名無しさん
22/12/10 12:55:16.29 8LaJbp4o0.net
int *fuga(void){
 register int i = 123;
 return &i;
}
error C2103: '&' レジスタ変数のアドレスを得ようとしました。
ふむ

822:デフォルトの名無しさん
22/12/10 13:24:22.34 HjLF/vvU0.net
>>788
説明とコードが対応してる気がしない
どういうこと?

823:デフォルトの名無しさん
22/12/10 13:32:02.53 GuAR5Ny/0.net
>>348
レジスタに割り当てた変数には左辺値はないよ
だって、ハードウェアのレジスタだから

824:デフォルトの名無しさん
22/12/10 13:43:23.28 VZKCrGXt0.net
言いたいことはわかるけど日本語が変
左辺値はメモリアクセスを意味する式なので
レジスタに左辺値がないのではなく
記憶クラスがregisterの変数の識別子は左辺値ではない

825:デフォルトの名無しさん
22/12/10 13:46:04.91 HjLF/vvU0.net
>>789への疑問やろ

826:デフォルトの名無しさん
22/12/10 14:05:33.41 lr6mtoK80.net
>>793
floatからdoubleへ変換したうえでその参照を返してる
パッと見分かり辛くて人間の認知への挑戦かと思うなw

827:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
22/12/10 15:12:06.94 brInbnm70.net
>>792
register 指定が付いたらアドレスを取る操作自体が出来なくなるように制限されてるよ。
配列を register 付きで宣言したらなにも出来なさ過ぎてワロタwwwというのはよくあるネタ。
(言語仕様的には配列 (の要素) へのアクセスもポインタ演算の構文等になってるから暗黙にアドレスを取る操作。)

>>794-795
左辺値であるかどうかと記憶クラスは関係ない。
必ずしもメモリにアクセスすることを意味しない。
register 宣言でアドレスを取れなくなるのは左辺値でなくなるからではなく
& のオペランドは register 付きで宣言されたものであってはならないという直接的な制約。
どこをどう見ても左辺値の定義自体には register 指定は関係しない。

更に C99 の 6.5.3.2 から単項 & の制約について抜粋

> 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.

JIS の日本語だとこうなってる。

> 単項&演算子のオペランドは,関数指示子,[]演算子若しくは単項*演算子の結果,又は左辺値でな
> ければならない。左辺値の場合,ビットフィールドでもなく,register記憶域クラス指定子付きで宣言
> されてもいないオブジェクトを指し示さなければならない。

左辺値のときは register 指定されていてはいけないというのは逆に言えば register 指定されている左辺値というものも存在することを示唆する。

828:デフォルトの名無しさん (ワッチョイ 27c2-aipL)
22/12/10 15:19:28.45 VZKCrGXt0.net
> register 指定されている左辺値というものも存在することを示唆する。

具体例ある?

829:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
22/12/10 15:24:22.50 brInbnm70.net
>>799
具体例�


830:ニいうか、 register 指定は左辺値か右辺値かの定義に無関係なので 左辺値なものは register 指定されていようがいまいが左辺値って話。 変数の宣言のときに register 指定を付けたら全て register 指定のついた左辺値だよ。



831:デフォルトの名無しさん
22/12/10 15:44:01.19 VZKCrGXt0.net
メモリにアクセスすることを意味するでしょ。
6.3.2.1 左辺値
左辺値が評価されたときにオブジェクトを指し示していなければ,動作は未定義とする。
3.14 オブジェクト(object) その内容によって,値を表現することができる実行環境中の記憶域の部分。
参考オブジェクトを参照する場合,オブジェクトは,特定の型をもっていると解釈してもよい(6.3.2.1 参照)。
なんでそういう決まりになっているのかを理解せずに条文の字面に書いてあることだけ表面的に言う人とは歯車が噛み合わないな。

832:デフォルトの名無しさん
22/12/10 15:50:02.57 gyOVa4Se0.net
>>792みたいなのはレジスタ変数じゃなくてもやっちゃダメだけどw

833:デフォルトの名無しさん
22/12/10 15:51:48.45 zHuXawkZa.net
昔の CPU はレジスタが少なくて
なんでもかんでも register 付けて宣言すると
CPU の持ってる実 register 数以上に宣言してしまうことが多い
では使い切った後の変数はどこに割り当てられるのか?

834:はちみつ餃子
22/12/10 16:30:03.16 brInbnm70.net
>>801
話を >>794 といっしょくたにしたのが誤りだった。 すまぬ。
> ハードウェアのレジスタだから
の続きで
> メモリアクセスを意味する式なので
をハードウェア的なメモリアクセスの意味で解釈してしまった。
むしろそんなん関係なく言語仕様上の意味で反論してたんだね。
(後から読む人のために補足すると C の言語仕様でいう実行環境は言語仕様で規定する仮想的な実行環境の
ことであって実際の機械語とどう対応づけるか規定されない。 どういう機械語が生成されるかは
言語の意味の根拠にならないので言語仕様で再解釈しようとしたのが >>795 だと私は解釈した。)
が、言語仕様の解釈として
> registerの変数の識別子は左辺値ではない
の部分が誤っているということには変わりないよ。

835:デフォルトの名無しさん
22/12/10 21:03:51.14 iVr3EzOTM.net
レジスターにもアドレスを割り当てておいたら良かったかも

836:デフォルトの名無しさん
22/12/10 22:47:45.19 37vQL6PeM.net
昔6800系CPUはメモリの固定番地をレジスターと同格に扱うダイレクトメモリアドレッシングで見かけのレジスタ数を増やしていた

837:デフォルトの名無しさん (ワッチョイ 7f63-KKgq)
22/12/10 22:55:13.62 FHzDIuwr0.net
レジスタを指すポインタをインクリメントすると、別のレジスタの値を書き換えられる、とか

838:デフォルトの名無しさん (ラクッペペ MM8f-JsS5)
22/12/10 22:59:08.86 cw57tQlnM.net
組込み用の8ビットCPUでも同じような機能があるものもある
ダイレクトアドレッシング、ダイレクトページアドレッシングなど殆どは8ビットアドレスのゼロページ目をレジスタと見做して
メモリ経由することなく直接ALUで演算を行なうことが出来る

839:デフォルトの名無しさん (ワッチョイ 7f63-KKgq)
22/12/10 23:32:50.32 FHzDIuwr0.net
レジスター配列とかプログラムコードをレジスタに置くとか

840:デフォルトの名無しさん
22/12/11 03:20:22.27 BIXjZcK80.net
>>804
左辺値がメモリアクセスを意味するのに?

841:はちみつ餃子
22/12/11 03:56:09.23 ftKoc+Hh0.net
>>810
言語仕様では抽象計算機での動作として記述される。 (C99 なら 5.1.2.3?を参照)
記憶域として書かれているものは抽象的な意味の上での記憶域であって、
実際のメモリにアクセスするかどうかはコンパイラの裁量。
register 指定は変数の意味に関与せず、抽象機械の動作の上ではごく普通に記憶域に割り当てられているのと同じ。
その上で register 指定は「可能な限り速いアクセスを期待する」というヒントであることと、アドレスが取れなくなるという制約が付く。
register 指定は抽象機械の上での記憶域をハードウェアのレジスタに割り当てるなどして高速化して


842:くれたらうれしいなぁ (/ω・\)チラッ という指定であって、言語の理屈の上ではアドレスを取れない以外の何の意味も持たない。



843:デフォルトの名無しさん
22/12/11 06:45:02.24 BIXjZcK80.net
抽象計算機の記憶域がメモリではないって?
もういい、あんたとは話にならん

844:はちみつ餃子
22/12/11 06:47:07.10 ftKoc+Hh0.net
>>812
根本的には register 指定で左辺値でなくなったりはしないという話をしてるんで。

845:デフォルトの名無しさん
22/12/11 07:35:55.41 BIXjZcK80.net
その話の根拠に疑問を示したんだけど、例の屁理屈に逃げるんでもういい

846:はちみつ餃子
22/12/11 08:06:06.44 ftKoc+Hh0.net
>>814
言語仕様でそうなっているという以外に根拠が必要か?

847:はちみつ餃子
22/12/11 08:12:25.56 ftKoc+Hh0.net
clang で抽象構文木を見る機能があったわ。
lvalue ってなってるだろ。
URLリンク(wandbox.org)

848:デフォルトの名無しさん
22/12/11 08:25:20.92 BIXjZcK80.net
>>815
しつこい

849:デフォルトの名無しさん
22/12/11 09:45:19.90 B9k8N7vL0.net
>>805
そういうプロセッサーはあるよ(ディスコンしてるけど)
URLリンク(i.imgur.com)
Z80 の裏レジスタは裏側のレジスタを直接触れなくてモヤモヤしたけどこいつは他のバンクのレジスタも直接さわれるからちょっと便利
PCとかもメモリー空間に見えてるプロセッサーもあったような気がするけど具体的なプロセッサー名を思い出せない
>>806
それはちょっと話が違う
単にアドレッシングモードとしてゼロページやダイレクトページが短いコードで扱えると言うだけのことでメモリーはあくまでもメモリー
例えば6800はPSH AでAレジスタをスタックにプッシュ出来るけどゼロページの内容を直接プッシュ出来るわけじゃない
6502 のインダイレクト・インデックストYぐらいの機能ならまあベースレジスタをメモリー上に置けるとは言えるけど

850:デフォルトの名無しさん
22/12/11 09:47:13.53 B9k8N7vL0.net
>>817
しつこいのは君かと
そもそも左辺値なんて言語仕様で定義されてるんだから仕様書で反論できない時点でお前の負け

851:デフォルトの名無しさん
22/12/11 10:26:09.32 2yXQoOg9d.net
IDコロコロ

852:はちみつ餃子
22/12/11 10:45:16.87 ftKoc+Hh0.net
>>819
べつに勝ち負けを競っているわけじゃない。
根拠 (この場合は言語仕様) に基づく解釈の妥当性がそれで変わることはないので納得しない誰かがいても不都合もない。
5ch に書き込むのはただの暇つぶしだ。
どうせほかに話題もないんだからしつこくてもいいんじゃね。
反応するかどうかは知らんけど。

853:デフォルトの名無しさん
22/12/11 11:25:34.59 RuZtb54i0.net
>>821
そういうレスは流石にしつこいわ

854:デフォルトの名無しさん (ワッチョイ 87bb-3TNT)
22/12/11 15:02:48.86 51+9+dkC0.net
ブレークブレークw

855:デフォルトの名無しさん
22/12/11 15:25:03.37 jc+ZhrAU0.net
みんな仲良くしなよ

856:デフォルトの名無しさん
22/12/11 17:37:29.66 kiLLcra70.net
ポインタは卒業した。コンパイラあるんだから、ググるより書いて結果を見たほうが早いぞ。
何十回も繰り返せばわかるはず。

857:デフォルトの名無しさん
22/12/11 17:42:03.60 kiLLcra70.net
亀レスだが機械語を知らないと、いい高級言語は書けない、ってのはわからん。
機械語と高級言語は別物だろう。
機械語を簡単に理解できる知能水準の人は、高級言語を新しく学習したときも
たやすく理解できる、
というのが実態なのに、ネットでは背びれ尾ひれついて、「ハードウェアを知らないと、~」みたいな
論調が市民権を得ているな。

858:デフォルトの名無しさん
22/12/11 18:08:31.63 3kpvLkL20.net
CやC++はアセンブラレベルが理解出来ないとそもそも実装が無茶苦茶だったりするけど
ポインタとかが


859:無いJavaとかはそこまでアセンブラレベルでどうのこうのってのは無いが それでもコンピュータ的な知識が皆無な奴は論理演算を理解出来なかったりするし ビットシフトみたいなことやってると、何でこんな書き方しているの?みたいな事言う奴出てくるからなぁw



860:デフォルトの名無しさん
22/12/11 18:39:34.39 jc+ZhrAU0.net
それがメモリー上二銅格納されてるか位は知っておいた方が良いよ
配列データをソートする時、どうやると効率的かがすぐ分かる

861:デフォルトの名無しさん
22/12/11 18:40:10.49 jc+ZhrAU0.net
メモリー上にどう格納

862:デフォルトの名無しさん
22/12/11 18:50:45.41 DhbhWaSTM.net
2の補数表現の知識は機械語の範疇だろう
スタックもそうだ
Cの仕様にスタックなんて言葉は出てこないからな
register指定も完全に機械語だ
タイマとか割り込みを扱う場合は機械語の知識も必要だな
setjmp longjmpも何が保存されてるのか理解するには機械語の知識が必要だ
要するに機械語の知識は必要だ

863:はちみつ餃子
22/12/11 19:18:24.83 ftKoc+Hh0.net
>>825
ポインタ演算は未定義動作を簡単に引き起こせてしまうので
十分に理解できてない状態で実際に動作させてみるというのはあまりあてにならない。
ある程度は理解した上で実際にやってみたら納得しやすいってことならわかるけど。

864:デフォルトの名無しさん
22/12/11 19:19:01.91 HcYuyEaDa.net
何十年前の話題を蒸し返してるのか知らんけど今のコンパイラは賢いからregisterとか使う必要ないぞ
むしろ人間が余計な指示を出すことで効率が悪くなる可能性すらあるからハードウェアの知識が云々とかいう老害理論はパイプラインとかキャッシュとかを全て把握してから言ってくれ
君たちの時代は終わったんだよ

865:デフォルトの名無しさん
22/12/11 19:29:49.83 vn3Pz69o0.net
register なんてあてにならんもん、使ってる奴いなかったと思うよ
本当に速くしたい所は、それこそインラインアセンブラ使ったり
アセンブルしたルーチン呼んでたし

866:デフォルトの名無しさん
22/12/11 19:33:50.07 HcYuyEaDa.net
>>833
コンパイラが本当に愚直な時は最適化無しで使ってたぞ

867:デフォルトの名無しさん
22/12/11 19:38:52.22 vn3Pz69o0.net
それは失礼した

868:はちみつ餃子
22/12/11 19:39:00.70 ftKoc+Hh0.net
少なくとも gcc とか clang くらいのモダンな処理系ではコンパイラの判断のほうが賢いわな。
低レイヤのコードだと人手で指定を付けたいときもあるかもしれんが
そういう分野ではどうせ処理系の拡張がなきゃどうにもならんので
register キーワード程度のあやふやなものひとつを言語仕様に入れてもあまり役に立たない。
C++ では register は削除された (機能は削除されたがキーワードとしては予約語のまま) わけだし、
C でもその内に削除されるんじゃないかな。

869:デフォルトの名無しさん
22/12/11 20:04:06.71 8Gp9TgZBa.net
register なんて要らんとか昔からずーっと言われてるけど
つけたらつけたで速くなったのその目で見たやつも居るでしょ?
gcc と gprof だけで頑張ってたとき確かに速くなったけど
だから register は有効有用使うべきとは言わないけどね

870:デフォルトの名無しさん
22/12/11 21:31:25.77 OhnENqmv0.net
>>830
>setjmp longjmpも何が保存されてるのか理解するには機械語の知識が必要だ
基本スタックポインタとプログラムカウンタだけだと思っていましたが、まあレジスタ全部と他何を保存してましたっけ?

871:ハノン
22/12/11 22:26:47.72 OhnENqmv0.net
>>836
>C++ では register は削除された (機能は削除されたがキーワードとしては予約語のまま)
auto のように別の形で復活しそうですね
あと、asm はどうなりましたか?

872:デフォルトの名無しさん
22/12/11 22:34:58.44 IkAIpxjPM.net
>>838
基本レジスタ全部だな(OSが使うレジスタは含まず)
他は無いはずだけど
ただ、戻り値にレジスタを使ってる場合は、そのレジスタは書き換えられてるだろう

873:デフォルトの名無しさん
22/12/12 06:30:06.98 ychPXO7Q0.net
メジャ


874:ーどころのCPUは大抵、戻り値はレジスタだね



875:デフォルトの名無しさん
22/12/12 07:28:31.07 v0et11DOM.net
呼出規約
URLリンク(ja.wikipedia.org)

876:デフォルトの名無しさん
22/12/12 14:27:00.05 Y3syqvcfd.net
static記憶クラス指定子の理解はできますが、いざプログラムを組んでみると、使い方がわかりません。

877:デフォルトの名無しさん
22/12/12 14:36:59.78 jnrvptAKa.net
>>841
CPU関係あるか?

878:デフォルトの名無しさん
22/12/12 14:37:08.19 RmZ1ojDx0.net
わかるものを使えばいいよ

879:デフォルトの名無しさん
22/12/12 15:05:24.79 BWUj5Mhq0.net
意訳
メジャーどころのCPU(に対応したCコンパイラ)は大抵、戻り値はレジスタだね
ではないかと
VCだとコンパイルオプションで変化した記憶がある

880:はちみつ餃子
22/12/12 16:42:43.35 J7ftRWn10.net
>>844
呼び出し規約 (を含む ABI) の策定はアーキテクチャを設計したところが主導するもんじゃないのかな。
CPU の特性に反した使い方を基本にされても困るだろうし。
ざっと調べた感じだとよく使われている System V ABI はインテルが議長の委員会で決める体制っぽい。
マイクロソフト (Windows) は引数の渡し方がちょっと違う規約でやってて
文句も出てない (出てないよね?) からそんなに強い強制力があるわけでもないんだろうけど、
CPU ごとに常識的な使い方というものはあるだろう。

881:デフォルトの名無しさん
22/12/12 16:59:57.60 RmZ1ojDx0.net
B言語でも戻り値はレジスタだったし

882:デフォルトの名無しさん
22/12/12 19:01:13.79 xR631HBma.net
>>847
マイクロソフトが作ってるハードはSurfaceとかだろ?

883:デフォルトの名無しさん
22/12/12 19:19:51.33 m7KoqGgA0.net
DOS時代にグラフィックライブラリとかをMASMでアセンブルして出来たobjファイルを
Cコンパイラで作ったobjとをリンクさせて
Cからアセンブラのルーチン呼び出したりしてたけど、
COBOLやFORTRANで作った関数をリンクさせて
Cで呼び出したりも出来るの?

884:デフォルトの名無しさん
22/12/12 19:31:09.72 BWUj5Mhq0.net
FORTRANなら呼べると思うが、COBOLは分からない
FORTRANやCOBOLからならCの関数は呼べたと思う

885:デフォルトの名無しさん
22/12/12 19:34:09.58 2yJi4NkT0.net
objファイルは流石に無理があるけどDLLや静的ライブラリでも作れば良いだけでは?
gfortranならexe以外にもDLL等が作成出来る

886:デフォルトの名無しさん
22/12/12 19:37:26.25 BWUj5Mhq0.net
受け渡しのデータ型も割と近くないかな?

887:デフォルトの名無しさん (ワッチョイ a701-3npV)
22/12/12 19:39:34.73 qCai2YYC0.net
引数の積みかたやらスタックフレームの巻き戻しはどっちがやるか等の約束事が
シンプルに固定されてるDLLなら他所言語への持ち出しや持ち入れがやりやすいわね

888:デフォルトの名無しさん
22/12/12 20:17:18.59 munrOkPw0.net
>>828 まあ・・C言語を触るぐらいだから、一般的には大学とかのコンピュータサイエンス教科を
履修しているのが前提だろうから、そこはあえて省略したのですが・・
昔の高校生は頭がよかったけど。
今は「仕事でC言語を触らせてくれる身分」になるためには基本、情報系の大卒でしょうし・・

889:デフォルトの名無しさん
22/12/12 20:18:59.06 munrOkPw0.net
>>828 配列のソートってメモリ意識しますかね。フラグメンテーションとか考えたこともないな・・。
単純に演算オーダー(log O^n とか・・)そんな感じである程度予測を立てて、あとは扱うデータ次第かと。

890:はちみつ餃子
22/12/12 21:58:34.14 J7ftRWn10.net
アルゴリズムのレベルではある程度の効率は事�


891:Oに考えるけど 断片化とかキャッシュヒットとかはチューニングが必要な状況になるまで考えないな。 むしろ考慮したくなっても意識的に忘れるようにする。 いわゆる「早すぎる最適化」の一種だから。 当然ながら必要になったときには知っている必要はあるんだけどそんな機会は多くないよね。 普通の (アルゴリズムのレベルでは充分に配慮された) プログラムを書いて極端に効率が悪いようなら メモリアロケータやキャッシュの設計のほうが悪い。 (そうは言っても目の前にあるものがそうなってるなら自分のほうが合わさないとしょうがないんだろうけどさ……)



892:ハノン
22/12/12 22:18:23.35 1Of7Vyge0.net
>>847
win32api はなぜ PASCAL にしたんでしょうかね?

893:ハノン
22/12/12 22:21:28.35 1Of7Vyge0.net
>>847
AMD64 は AMD が呼び出し規約まで決めちゃったけれども、普通は OS 屋が決めるものという気がしますけどね

894:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
22/12/12 23:05:07.66 J7ftRWn10.net
>>839
register というキーワードが将来に転用 (repurposing) 出来るようにというのは書かれている。
URLリンク(timsong-cpp.github.io)

auto という名前が新しい用途にぴったり (少なくとも不自然ではない) なので
それと同じくらいに register という名前が丁度良い場面というのは全く想像がつかないんだけど
思いもよらぬ形で上手いこと使われることはあるかもしれんね。

メンバ関数の宣言のときの default とか delete とかも考えたやつは天才じゃん……と私は思ったよ。

895:デフォルトの名無しさん (ワッチョイ 7f63-KKgq)
22/12/12 23:08:20.90 BWUj5Mhq0.net
switch文のdefaultはたまに綴りを間違えてしまうw

896:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
22/12/12 23:14:51.65 J7ftRWn10.net
>>861
あれの問題点は綴りを間違えてもラベルという扱いになってしまってエラーとして検出されないところなんよね。
処理系やオプションによっては使われていないラベルとして警告が出たりはするんだけど。

897:デフォルトの名無しさん (スフッ Sdff-d44j)
22/12/12 23:35:39.10 zHXfNaq5d.net
転用とかややこしいだけだから勘弁
自動でautoだからあんまり気にすんなよ、ちなc++ではこんな意味だよと、またややこしい補足が増えるだけ
むしろアンスコ付きの変な名前の方がかえってキーワードなんだなと分かりやすい、ソースは醜くなるけど、それは今更

898:デフォルトの名無しさん (ワッチョイ 7fcf-FUlb)
22/12/13 00:08:19.11 HbzfEbfW0.net
auto も B言語の名残りだか後方互換だかで、
Bではデータ型がなくて、変数=整数が文脈により、ポインタとしても使われた
その storage classesとして、automatic, external, internal の3種類があった

main() {
extrn putchar, n, v;
auto i, c, col, a;
(略)
putchar('*n*n');
}

v[2000];
n 2000;

という風に auto で変数を宣言していた

899:デフォルトの名無しさん (スフッ Sdff-d44j)
22/12/13 00:29:54.37 +JwZZYrvd.net
他に触る言語で明示的にauto宣言するのはbcかな、オモチャみたいなもんでPOSIXも有名無実で仕様なんぞ無いに等しいが

ポインタは明示的に触らないけど、エミュる時は配列の添�


900:嘯ノauto変数(整数)突っ込むからむしろCよりBっぽい



901:デフォルトの名無しさん (ワッチョイ 7f63-KKgq)
22/12/13 00:36:12.95 FXPyPtyo0.net
可変長で必要に応じて伸び縮みする配列とか、
桁数制限無しの整数型や計算誤差のない実数型とか

誰か作って(人任せ)

902:デフォルトの名無しさん
22/12/13 06:01:01.43 d0KqwuA/0.net
> 桁数制限無しの整数型
つGMP

903:デフォルトの名無しさん
22/12/13 07:11:07.69 ZjPntofYa.net
>>858
当時流行ってたからだろ

904:デフォルトの名無しさん
22/12/13 07:11:26.57 4+XH+KhI0.net
>>866
>桁数制限無しの整数型
スレリンク(tech板:84番)

905:デフォルトの名無しさん
22/12/13 13:48:16.74 aee1RRAhM.net
計算誤差の無い実数型って不可能だけどなw
decimalを使うと2進数は10進数の浮動小数点数を正確に表現出来ない問題を解消できる
ratio(分数)を使うと、1/3とかをそのまま保持出来るから誤差が出ない
ちなみに、Common Lispは分数を凄い簡単に扱えるしbignumも使える
Cでもそうなって欲しいもんだ

906:デフォルトの名無しさん
22/12/13 13:59:48.87 7PNjtjtua.net
なぜ分数や多倍長整数が必要な案件にCなんかを使うのか

907:デフォルトの名無しさん
22/12/14 12:00:46.68 erx97Ujd0.net
虚数や複素数も扱えてたよね
あまり使い道はないかも知れないが

908:デフォルトの名無しさん
22/12/14 13:40:07.30 XaqmHtNn0.net
区間を分割して評価、終了判定がintegerpで判定とか細かい所で色々楽はできるだろう
単にスケールしても済むし、何回もやるなら任意精度でない有理型くらい構造体とgcdさえ書ければ誰でも書けるだろ
用途が違うし別にclは推さんが、標準の一つであるcltl2はあらゆるプログラマに貴重な書
浮動小数点演算に関しても複素関数の豊富なプロット載せて定義やブランチカット選びの良し悪しにかなりページ割いて、その図の生成に使ったpsコード生成コードも載ってる
つーか>>866はbcって言って欲しいだけでしょ、おまえら釣られすぎ

909:デフォルトの名無しさん
22/12/14 14:04:41.21 XaqmHtNn0.net
<cmath.h>徹底解剖みたいな文献って無いんだろうか

910:デフォルトの名無しさん
22/12/14 14:17:47.17 XaqmHtNn0.net
complex.hだった
最近触り始めたpythonでcmathだから素で間違えた
んでc++はmath.hが<cmath>と…

911:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
22/12/14 16:18:53.52 YAu9ihh40.net
math.h と cmath とは事情がややこしいので単に名前が変わっただけとは思わないほうがいい。
math.h の関数は多相化されてなくてマクロで多相化された版は tgmath.h にある。
cmath の多相化にはテンプレートが使われている。

912:デフォルトの名無しさん
22/12/14 19:29:35.78 XaqmHtNn0.net
Cのtgmathの方が(実装的な意味で)エグいよね
よくマクロの真髄みたいに色んな実装が紹介されるし、ちゃんと動いてるんだろうけど
ちょっと訳がわからないものは避けたい…
_Genericでスッキリ書けたりしないのだろうか

913:デフォルトの名無しさん
22/12/14 20:13:04.33 h6lYzG45d.net
ヘッダに直書きされてるから目につく機会が多いだけで、内部的にやっても同じロジックが隠れるだけか
気にし出せばきりがないようにも思う

914:デフォルトの名無しさん
22/12/14 20:45:14.60 QXbvEgmH0.net
>>874
<ccmath>?

915:はちみつ餃子
22/12/15 14:40:26.12 xFKc8Du50.net
>>877
_Generic で素直に分岐すれば問題なくかけるよ。
tgmath.h が規


916:格に入ったとき (C99) は規格の範囲内でやる方法は無かったので 処理系の拡張を使ったり新たな拡張を作ったりしてなんとかなったのだがやっぱりそれは あかんやろと思ったのか C11 で _Generic を入れることになった。 ただ、処理系は C99 に厳密なモードを持つことがあるからそのモードで動かしたときに ヘッダ内の _Generic についていちいち警告なりエラーなりが出るのもよろしくないし、 #ifdef で分けるのも二度手間だし、 旧来通りの実装で残すのはそれなりに合理的なんだと思う。 ありがたいことに普通に使う分には標準ヘッダの実体を気にする必要はないのだから忘れておくのが幸せだろう。



917:デフォルトの名無しさん
22/12/21 10:08:23.47 537DsEmx0.net
// エラーを報告するための関数
// printfと同じ引数を取る
void error(char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(1);
}
これってprintfをerrorに変えただけって認識でok

918:デフォルトの名無しさん
22/12/21 10:08:47.18 537DsEmx0.net
すまん誤爆した

919:デフォルトの名無しさん
22/12/21 10:11:35.91 537DsEmx0.net
これってprintfをerrorに変えただけって認識でok?
error("引数の個数が正しくありません");と
fprintf(stderr, "引数の個数が正しくありません\n");
の違いを誰か教えてくれ

920:はちみつ餃子
22/12/21 10:21:03.43 6CmfCawf0.net
>>881-883
その認識でいいけどそれに加えて最後に exit で終わっているから
復旧不可能なエラーを報告するための関数なんだろ。

921:デフォルトの名無しさん
22/12/21 10:21:33.71 LOXcnIHB0.net
呼び出したら、死ぬ?

922:デフォルトの名無しさん
22/12/21 10:31:04.10 Fs8T+fBed.net
そのerrorならexit以外そうじゃね
perror(msg)はもう少し賢くて
fprintf(stderror, "%s: %s\n", msg, strerror(errno))
相当(by k&r2e)

923:デフォルトの名無しさん
22/12/21 10:34:02.36 537DsEmx0.net
>>884
こんな時間にありがとう、助かる。
fprintf(stderr, "引数の個数が正しくありません\n");と同じってことやな
これにexitを加えて関数にしたのがerrorってことやね
わざわざerror関数にする必要性がわからんかったから助かったわ

924:デフォルトの名無しさん
22/12/21 10:37:12.34 LOXcnIHB0.net
私なら、error()を呼び出した側でexit()呼ぶなあ

925:デフォルトの名無しさん
22/12/21 10:39:53.43 Fs8T+fBed.net
ステータス選べるしな
わざわざexitに渡すステータス引数を拵えるくらいならexit読んだ方が早い

926:デフォルトの名無しさん
22/12/21 10:51:42.39 Fs8T+fBed.net
>>881
あ、地味にfprintf(stderr, "\n")でフラッシュしてるのに気付いた
あるいはfmtへの\n付け忘れ防止配慮か
基本stderrはこまめにフラッシュされるものと思ってるけど、fflushや"\n"で念を入れても損は無いな

927:はちみつ餃子
22/12/21 11:33:17.33 6CmfCawf0.net
言語仕様では exit で終了とか main の終端に到達した場合に全てのオープンされているファイルはクローズする
(そのときに全ての出力ストリームをフラッシュする) というのは保証してる。
エラーが起きている状況でどこまで信用できるかよくわからんから念押ししても損はないだろうけど。

928:デフォルトの名無しさん
22/12/21 15:19:19.23 537DsEmx0.net
URLリンク(codepad.org)
これの70行目と79行目の*ってただただ関数でポインタを扱うよってだけ?
なんか関数ポインタと似ててどうなんやって思った
int (*func1)(char*, int);

929:デフォルトの名無しさん
22/12/21 15:23:54.32 WXW0EqS+d.net
なんか質問者はexit呼ばないんだったら関数化しないでええやろって思ってそうで怖いな
設計方針次第でもあるが心配になるな

930:デフォルトの名無しさん
22/12/21 15:35:25.72 537DsEmx0.net
>>893
今学習段階


931:だからかなりの無知なんや、すまん



932:デフォルトの名無しさん
22/12/21 15:51:20.06 537DsEmx0.net
あと上のURLのプログラムのcallocではメモリ解放してないけど大丈夫なのか?

933:はちみつ餃子
22/12/21 15:56:02.50 6CmfCawf0.net
>>892
返却値の型が Token* であるという意味。
でも文法的には * は宣言子に含まれていて Token の側じゃなく関数名がある側のグループなんよ。
だから右側に寄せて書く習慣になってる。
C の宣言の文法が無茶苦茶なのはイマサラな話なので……。
可変長引数の扱いも低レイヤの事情が見え隠れするような古の設計なので
歴史的事情を知らんとわけわからんのもしょうがないとは思う。

934:デフォルトの名無しさん (ワッチョイ 7e02-evpg)
22/12/21 16:08:16.37 5pWmYDMC0.net
一貫性が大事って意味ならそう思う、特にdiagnosticなエラー(最後まで残る)は

俺は手入力で適当なエラーメッセージ書くのは極力控えてる、例えば数学関数書いてるなら
errno = EDOM;
perror(__func__);
→my_func: Argument to the math function out of domain.
的な
手続き的なルーチン(main)なら__FILE__/__LINE__とかで

用意されてるシンボル定数で意味論が合うなら活用すべき

EDOMなんかは好きに使っていいけど、システム、IO関連のエラーは意味が直感的でなかったり、規約に厳密に従わないとerrno見るcallerが騙されたりでバグの素なので、ちゃんとマニュアル参照のこと

935:デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
22/12/21 16:09:52.42 537DsEmx0.net
>>896
こりゃかなわん。
基礎から出直してくる

936:デフォルトの名無しさん (ワッチョイ 7e02-evpg)
22/12/21 16:10:45.37 5pWmYDMC0.net
ああ、当たり前だけどerrnoを上書きする前に気付いてないフラグ立ってないかif(!errno)チェックは忘れずに
割と立ってる事がある()

937:デフォルトの名無しさん (スップ Sd8a-UQjj)
22/12/21 16:16:43.94 WXW0EqS+d.net
>>895
勿論使い終わったら解放する必要があるので解放関数を用意してあげよう

938:デフォルトの名無しさん
22/12/21 17:55:00.19 j8NGwdcp0.net
>>895
exit() したら解放されるからいいんじゃん
って言う層が一定数いる

939:デフォルトの名無しさん
22/12/21 18:13:15.89 3kYobt3Gd.net
今、息してるのか?

940:デフォルトの名無しさん
22/12/21 18:21:41.76 LOXcnIHB0.net
一日一回再起動すれば大丈夫

941:デフォルトの名無しさん
22/12/21 21:42:34.64 MxQdxJ6G0.net
再起動なんてちまちましたことやってられるかい
電源ぶっこ抜いて入れ直すんだよ、それか蹴れば直る

942:デフォルトの名無しさん
22/12/22 11:43:33.39 kpFE4WK60.net
アプリ(強制)終了後に使ったファイル削除→このファイルは使用中です。

OSで保証されてないならアプリ側でやるしか無いじゃん。

943:デフォルトの名無しさん
22/12/22 13:27:28.75 LbsYIb+eM.net
誰かがこのPCを使っている

944:デフォルトの名無しさん
22/12/22 13:35:11.18 KHPfY9lXd.net
LANなら充分にあり得ることだな

945:デフォルトの名無しさん (ワッチョイ 9710-Hnc0)
22/12/22 19:42:13.17 /Ar1RYH70.net
プロセス終了に関しちゃ今時のOSでハンドル握りっぱなしにはならんでしょ

946:デフォルトの名無しさん
22/12/22 20:28:13.17 Q5govio9d.net
/* 文字列を逆順にして返す関数 */
#include <stdio.h>
#include <string.h>
void reverse(char *ss);
int main(void)
{
  char tt[]= "programing game"; 


947: reverse(tt); printf("tt=%s\n",tt); return 0; } void reverse(char *ss) { int wk,pos1=0,pos2; pos2=strlen(ss)-1; while (pos1<pos2) { wk=*(ss+pos1) *(ss+pos1)=*(ss+pos2); *(ss+pos2)=wk; ++pos1; --pos2; } } このプログラム、gccだとコンパイル出来ますが、clangだと以下のエラーになります。なぜでしょうか? ~/CCR/UserFiles/sample26.c:22:3: error: invalid operands to binary expression ('int' and 'char *') *(ss+pos1)=*(ss+pos2); ^~~~~~~~~~ 1 error generated



948:はちみつ餃子
22/12/22 20:40:06.89 KT1tc7ko0.net
>>909
wk=*(ss+pos1) の後にセミコロンが抜けてる。

949:デフォルトの名無しさん
22/12/22 20:43:53.45 Q5govio9d.net
ありがとうございます。コピペミスでした。

950:はちみつ餃子
22/12/22 21:11:31.21 KT1tc7ko0.net
事例としては面白いよ。
セミコロンが抜けても一応は式の形式として成立するから
型が合わないというところがエラーとして報告されちゃうんだな。

951:デフォルトの名無しさん
22/12/22 22:10:59.69 dL3lthyL0.net
昔のコンパイラならエラーなしで通してだろうな

952:デフォルトの名無しさん
22/12/22 22:43:34.75 K5vPIqXq0.net
ナウいヤングな文字列の掛け算はサポート外なんだわ
strcatで頑張れ

953:デフォルトの名無しさん
22/12/22 23:40:21.52 bege0WAi0.net
昔のコンパイラだと=*が乗算代入だったんだけどな

954:デフォルトの名無しさん
22/12/23 08:27:13.83 msM3WKDD0.net
exit on free 論争か・・・ そういう論争があったというのは知っているが
どっちに帰着したのか知らない

955:デフォルトの名無しさん
22/12/23 08:52:05.54 FPNxo7old.net
RAIIでexitするやついたら匙投げる

956:デフォルトの名無しさん
22/12/24 17:52:35.28 aYmW2hx40.net
プロセス終了を検知してOSで良きに測って欲しいよね

957:デフォルトの名無しさん
22/12/24 20:25:27.94 xbH5VpiM0.net
>>917
膨大なリストなんかはいちいち解放しないで exit( ) でヒープごと解放する方が効率的なんて言う奴までいたんだよ...

958:デフォルトの名無しさん
22/12/24 21:34:16.33 aYmW2hx40.net
いっそプログラム開始時に、
ドーンとでっかくメモリ確保して
自前でチマチマ割り当てて、
終了時にドーンと解放で良い気もする

959:はちみつ餃子
22/12/25 00:15:12.94 8blj/qJt0.net
そういう戦略をとっている有名なプログラムもある。
確保したメモリが結局はプログラムの最後までほとんど使用されっぱなしだということがわかっているなら
ちまちま管理しなくても終了と同時に全部が回収されることをあてにしても総合的なメモリ使用量は変わらない
(むしろ free のコスト分だけ節約できる) という考えをすることはあって、
リンカの LLD や Mold がそういう戦略をとっていたはず。
http サーバの h2o はセッション単位でドカンとメモリの確保と解放をしてる。
つってもプログラム全体のメモリについて見通しが立てられるということと
実行環境の事情を把握してるからそういう戦略を取れるのであって、
普通は小さなモジュールに分割するし、モジュール単位でメモリ管理に矛盾がないように設計するので
結果的にチマチマした確保と解放になる。
そこそこの規模になるとプログラムを分割せずに把握するのは大変なので凡人は小さな単位で
確保と解放をするように設計するのはしょうがないよ。

960:デフォルトの名無しさん
22/12/25 07:20:21.70 vLPFsJBC0.net
>>921
> 結果的にチマチマした確保と解放になる。
解放が必要なものまで>>920みたいなことしちゃダメだろ
リンカーのシンボル表みたいなのは処理中は追加オンリーで処理終了後に解放することになるから一気に解放が有効なわ�


961:ッで



962:デフォルトの名無しさん
22/12/25 08:37:13.23 AjsJE3fQ0.net
つまりメモリプールでしょ。昔からある戦略だ

963:デフォルトの名無しさん
22/12/25 08:49:15.44 gsvPl1RZ0.net
DOS時代の拡張子COMアプリは起動時に空いてるコンベンショナルメモリ全部(PC98ならVRAMの前まで)COMアプリに割り当てられるんだっけ。

964:デフォルトの名無しさん
22/12/25 08:59:08.85 CcfMXDnS0.net
やればできるよ
EXEとの違いはリロケーションテーブルがないってだけ
コード次第で出来んことは無いィィィ

965:デフォルトの名無しさん
22/12/25 09:03:42.49 vLPFsJBC0.net
>>923
考え方は近いがもっと特化した手法
なのでシンボル表みたいなものにしか適用できない

966:デフォルトの名無しさん
22/12/25 10:31:57.80 NJW41kMTa.net
空いてるコンベンショナルメモリ全部というと大きなメモリが割り当てられるように聞こえるけどコンベンショナルメモリは640キロバイトしかないからな
逆に小細工しないと拡張メモリ(exeで使える大きなメモリ)が使えないと言った方が正しい

967:デフォルトの名無しさん
22/12/25 11:06:28.12 CcfMXDnS0.net
リアルモードの「拡張メモリ」ならCOMでもEXEでも同じことだぞ
プロテクトモード用の「EXE」はまた別物だ
バイモーダルEXEなんてのもあったね

968:デフォルトの名無しさん
22/12/25 13:44:18.05 pgi9BcgIM.net
ラージモデルのexe、拡張子をcomに書き換えても動くのは秘密です。

969:デフォルトの名無しさん
22/12/25 15:44:19.19 mgz0dfZnM.net
exeとcomってファイル先頭のエントリーアドレスの解釈が違ってなかったっけ?
拡張子だけ変更しても暴走したような気がする

970:デフォルトの名無しさん
22/12/25 16:11:57.52 zQEQkIp7H.net
>>924
自力でシステムコール(あるいは farmalloc()) と far ポインタを扱うんだったら出来る

971:デフォルトの名無しさん
22/12/25 16:49:45.05 FlWfyDt20.net
OSは、EXEかCOMかの判定をファイル先頭2バイトで行うので
拡張子は同名実行ファイルの優先度以外には影響ありません

972:デフォルトの名無しさん
22/12/25 18:17:37.99 4l2e8mxL0.net
何のOSの話なんだよ?

973:デフォルトの名無しさん
22/12/25 22:36:13.77 R9zYhJab0.net
>>933
MS-DOS

974:デフォルトの名無しさん (US 0Hd7-ij7E)
22/12/25 23:53:11.65 3pvnVlsWH.net
>>925
LSI-C試食版のコード64KB の制限はなんとかなりませんかね?

975:デフォルトの名無しさん (ワッチョイ b363-dxp0)
22/12/26 00:03:12.26 eX0Ff8H70.net
試食版のコードで生成する実行プログラムを、動かす環境もってるの?

976:デフォルトの名無しさん (US 0Hd7-ij7E)
22/12/26 01:36:38.31 xk9EZjkPH.net
>>936
URLリンク(takeda-toshiya.my.coocan.jp)

977:デフォルトの名無しさん
22/12/26 10:26:13.14 eX0Ff8H70.net
W32が動く環境があるなら、そこでネイティブに使えるコンパイラにした方が良くないかな?
試食版って事はそれを業務で使うわけではないんでしょ?

978:デフォルトの名無しさん
22/12/26 11:02:09.22 +xP92Jxa0.net
8086 の SBC とか使って趣味でなんか作ってるんじゃね
俺も会社でだけど 80186 ボードのために Visual C++ 1.52c をずっと持ってた

979:デフォルトの名無しさん
22/12/26 11:47:25.06 Gtnl1i7F0.net
C使用でも何も考えずにVC++無料版入れてるわ。
バージョンアップの度にプロジェクト作成項目に悩む・・・。

980:デフォルトの名無しさん
22/12/26 11:49:12.88 rbZigseYd.net
関数のポインタの配列を返す関数の宣言を教えてくさい

981:デフォルトの名無しさん
22/12/26 12:21:30.32 sWfTrmtka.net
残念だなのび太
C言語は配列を返せないんだ

982:デフォルトの名無しさん
22/12/26 12:24:01.49 XQluw9Ded.net
>>935
試食って書いてあるの見えない?
そういう類いには意図的に制限かけてあるんだよ
有料の正規バージョンを買ってねって意味
PS3のlinux封じとは訳が違う
怒る人のいないやり方なので
脱獄は誰も手伝ってくれないよ

983:デフォルトの名無しさん
22/12/26 12:48:43.97 gpJgKl24M.net
森公一郎さん、亡くなっているんだよな

984:デフォルトの名無しさん
22/12/26 12:49:38.27 6bMfB0bxa.net
>>942
返す関数は定義出来るだろ
確保した領域の生存が関数内のみかそうじゃないかで結果は変わるが
>>941
思ってるものを描いてみ?

985:デフォルトの名無しさん
22/12/26 12:54:26.08 VH0Lg5Zw0.net
まあ関数イテレータ的には使えるのか
int getNoTest1(int x, int y, int z){return x*100+y*10+z;}
int getNoTest2(int x, int y, int z){return x*200-y*20-z;}
int getNoTest3(int x, int y, int z){return x*1000-y*100+z;}
typedef int(*FuncType)(int, int, int);
FuncType *getFuncAddrArray(void){
 static FuncType fa[3];
 fa[0] = getNoTest1;
 fa[1] = getNoTest2;
 fa[2] = getNoTest3;
 return fa;
}
int main(int argc, char *argv[]){
 FuncType *funcAddr = getFuncAddrArray();
 for (int i = 0; i < 3; ++i){
  printf("%d\n", funcAddr[i](rand(), rand(), rand()));
 }
 return 0;
}

986:デフォルトの名無しさん
22/12/26 15:36:06.25 tmqxSKGS0.net
>>945
できねーよ
配列が第一級オブジェクトじゃない珍しい言語

987:デフォルトの名無しさん
22/12/26 16:49:38.00 URVWGre6d.net
void(*func(void)[2])(void);
できるとしたら、こうなるが

988:デフォルトの名無しさん
22/12/26 17:05:11.56 0DsOmzGV0.net
固定長配列を戻すなら struct を経由したくなるわ

989:デフォルトの名無しさん
22/12/26 17:05:36.17 F5Lcb5Ke0.net
const char *f() {return "関数のポインタの配列";}

990:デフォルトの名無しさん
22/12/26 17:32:34.93 eX0Ff8H70.net
一休さんは、やめよう

991:デフォルトの名無しさん
22/12/26 17:34:43.38 0DsOmzGV0.net
URLリンク(ideone.com)
strust ひっぺがして 戻り値が配列となる宣言だとおこられた
FUNC_PTR_T getFuncs(void)[3];

992:デフォルトの名無しさん
22/12/26 18:26:36.88 +xP92Jxa0.net
>>949
てか struct で包めば配列も返せるよね

993:デフォルトの名無しさん
22/12/26 18:41:08.47 sEpxtj4KM.net
関数へのポインタの配列の構造体?

994:デフォルトの名無しさん
22/12/27 00:19:48.06 8jh3A4jF0.net
>>944
近藤嘉雪 パーサ担当
森 公一郎 コードジェネレーター担当
近藤さんの本は20年くらい前本屋でよく見かけたな

995:デフォルトの名無しさん
22/12/27 01:28:35.56 1kPfWYrSM.net
配列も値型だったら一貫性が有っただろうな
でも、配列を丸ごとコピーするなんて普通しないから、利便性を優先したんだろう
それによって、ポインタと配列は似てるけど違いもあるみたいな、初学者泣かせな仕様が生まれてしまった

996:デフォルトの名無しさん
22/12/27 03:19:13.84 lusjSahA0.net
ベースアドレスが配列の初めの要素を指すCスタイルの配列には一貫性があるだろ、だから0-based indexを採用する蓋然性があるわけで
何らかのbookkeeping、サイズ、ストライドやランク情報等のメタデータをスカラで一緒に渡す明示的なもの、あるいはstructで包む、メンバに.flagを設けるのはdope arrayの再発明
一方、dope arrayをネイティブ採用する為には
ベースアドレス+0は配列要素ではなく、メタデータを指さねばならない
だから初めの配列要素はベースアドレス+1(いわゆる1-based index)であるべき、という蓋然性がある
最も邪悪な配列の設計はメタデータを持つにも関わらずC慣習にすり寄って来て0ベース採用のやつな、設計に何の一貫性も無い
アドレス計算はCスタイルの方がスッキリして好き、個人的にはだけど

997:デフォルトの名無しさん
22/12/27 03:42:16.62 lusjSahA0.net
array[0]がarrayの始めの要素を指す、という伝統を尊重しつつ整合的にメタデータを持たせる拡張をしたいなら、arrptr-1に持たせるって手もあるね

998:デフォルトの名無しさん
22/12/27 05:21:18.30 nX/ozHbV0.net
文字列はchar型の配列だし
文字列のコピーなんか、あらゆる言語で基本中の基本だ

999:デフォルトの名無しさん (ワッチョイ 9d10-dxp0)
22/12/27 08:19:53.31 yfz0bOFn0.net
処理コスト軽減の為に配列自体ではなく配列の先頭ポインタでやり取りしましょう。

1000:デフォルトの名無しさん
22/12/27 11:14:55.49 FjfQte1M0.net
配列が固定長なのは仕方がないと言うか、当然かなと思うが
文字列は、編集がもっと自在に出来た方がありがたかったな

1001:デフォルトの名無しさん
22/12/27 11:19:00.19 8jh3A4jF0.net
>>960
同じことだぞ
式の中では配列はポインタそのものだ

1002:デフォルトの名無しさん
22/12/27 11:32:56.50 pT1qhH4d0.net
sizeof演算子「いや俺区別してるし」

1003:デフォルトの名無しさん
22/12/27 11:34:00.98 2fUOYjFgd.net
&演算子: いい加減なこと言ってもらっちゃ困るな

1004:デフォルトの名無しさん
22/12/27 11:36:45.19 2fUOYjFgd.net
昔、こんなバカいたよ
printf("%d", sizeof "abc");
見ろ、文字列はポインタだ(キリッ

1005:デフォルトの名無しさん
22/12/27 11:49:59.77 8jh3A4jF0.net
式の中の配列と書いたのが読めないバカが多すぎる

1006:デフォルトの名無しさん (アウアウウー Sa2f-aXTt)
22/12/27 12:20:51.00 3AXDXHupa.net
式がどういう意味かわかった上で他人をバカ扱いしてる?

1007:デフォルトの名無しさん (ワッチョイ 9769-jXNG)
22/12/27 12:21:02.33 o7XCQITF0.net
965なんかもあくまで式だよ

int a[100];
int *b;
(sizeof a) + (sizeof b); ←これも式であり、式の中に配列もポインタも居る

a++ 非合法
b++ 合法
これも式

1008:デフォルトの名無しさん (US 0Hd7-ij7E)
22/12/27 17:43:59.96 x3eVxeWPH.net
あの~
誰か excel マクロで動く cc を作ってくれませんか?
うちの会社、cygwin 禁止なんです、cygwin インストーラですら実行できないんです、すごく弱っています
コンパイラが手元にないと私は無力……

1009:デフォルトの名無しさん
22/12/27 18:03:44.42 /tVTIbQ7a.net
VBA使えよ
安心しろお前は自分で思ってるほどCが得意じゃないから

1010:デフォルトの名無しさん
22/12/27 18:19:46.78 uvaA1liZd.net
visual studioの稟議を上げられない社畜?

1011:デフォルトの名無しさん
22/12/27 18:22:29.22 FjfQte1M0.net
C#のコンパイラなら、何もせずともWinのどっかにはいっているような気がした

1012:デフォルトの名無しさん
22/12/27 19:41:50.61 tBCD9SD30.net
>>971
仕事に関係のない VS なんて認可されませんよ、べつにソフトウェアの人じゃないんだから
>>970
コンパイラが手元にないと、どうもやる気がでなくって…

1013:デフォルトの名無しさん
22/12/27 19:42:45.86 tBCD9SD30.net
>>972
cs.exe なんて大っ嫌い

1014:デフォルトの名無しさん
22/12/27 20:26:44.18 pT1qhH4d0.net
>仕事に関係のない VS なんて認可されませんよ
>誰か excel マクロで動く cc を作ってくれませんか?
仮に誰か作ってもインストール認可されないんじゃないの?
そういう環境だと読み取ったけど

1015:デフォルトの名無しさん
22/12/27 20:30:03.68 NnGcg72Bd.net
>>973
勤務中にくだらねえことやってんじゃねえって上司に怒られるの?

1016:デフォルトの名無しさん
22/12/27 20:31:33.55 usWDFVvc0.net
まあ仕事に関係ないって自分で言っちゃってるからなぁ

1017:デフォルトの名無しさん
22/12/27 20:39:00.00 FjfQte1M0.net
じゃあ、無敵のシェルスクリプトだだだ・・・

1018:デフォルトの名無しさん
22/12/27 22:26:37.16 tBCD9SD30.net
>>975
>仮に誰か作ってもインストール認可されないんじゃないの?
>そういう環境だと読み取ったけど
マクロはインストール


1019:するものじゃないから自由に使えるんですよ、インストール権限の必要なソフトはインストールできないってだけでして >>976 そうはいっても、単一ディレクトリの全ファイルに対して、ファイル名の冒頭に連番を振るプログラムを 3 時間ほどでチョロっと書いて、業務に生かしているんですけどね いちいち手作業でファイル名を変えるとかやってらんないでしょ?自分のために自分で書く分くらいは許容してほしいよね



1020:デフォルトの名無しさん
22/12/27 22:29:39.01 tBCD9SD30.net
あと、巨大な csv ファイルを結合するプログラムも便利に使っていたんですけどね、大概の機械はデータを csv で吐いてくれますますからねえ

1021:デフォルトの名無しさん
22/12/27 22:31:04.10 usWDFVvc0.net
>>979
屁理屈なら上司に言って怒られてこい
なぜまともなソフトがインストール不可なのにお前の作ったソフトなら大丈夫と思うんだ

1022:デフォルトの名無しさん
22/12/27 22:35:10.73 usWDFVvc0.net
ファイル名の頭に連番打つとかPowerShellでもバッチでもVBAでもできるしそもそも打つ必要があるかどうかさえ怪しい
お前のやってることが本当にみんなにとっていいことなら業務効率化のためにコンパイラの申請を通すのは何も難しくない
拒否られてるところで気づけよマジで
職場に不和の種をまくんじゃねえ

1023:デフォルトの名無しさん
22/12/27 22:35:56.95 FjfQte1M0.net
こう言うわがままは却下されて当然ではないか

1024:デフォルトの名無しさん
22/12/27 22:43:18.14 tBCD9SD30.net
>>976
操作記録をいちいち記録されて、裏でこっそり査定に響く仕組みですよ、たぶん
ああ、こんなところでここまで書いちまったらもう私の給料は来年は半額になっちまいますねえ、当の昔に諦めてるけど

1025:デフォルトの名無しさん
22/12/27 22:58:37.89 VvvSD8wK0.net
>>982
power-shell はたぶん入っていないと思いますよ、あったら使うに決まってますもん
VBA はいちいち excel を起動してマクロを走らせて、ああ、もうめんどくさくって死にそう
実行ファイルワンクリックで、ピシッと全ファイルを改名したいだけですよ、そうすればさくさく錯綜するメールスレッドを管理できますからね
バッチファイルで改名?できるというのなら見せてくださいな?
>>981
業務効率改善のため自分のために自分で作り自分が使うだけのソフトと、多数の人が使う商用の売り物のソフトとを一緒にしないでくれる?

1026:デフォルトの名無しさん
22/12/27 23:03:13.50 VvvSD8wK0.net
>>983
そりゃ、業務そっちのけで得体の知れないプログラムを書いてばかり(星新一の短編にそんなのがありましたね…)だったら叱られますけど、ぱっぱと3時間で書いて後はノーメンテ、それで半年実用になっているんだから遊んでいるわけじゃないんですけど

1027:デフォルトの名無しさん
22/12/27 23:06:57.48 VvvSD8wK0.net
>>982
>業務効率化のためにコンパイラの申請を通すのは何も難しくない
難しいんですよ…
あらかじめ効用をきちんと提示しなければならないなんてめんどくさくってやってらんない、
作りたいソフトが具体的に念頭にあるわけではなく、将来的に使いたい可能性が発生する可能性があります、で稟議を通るわけがないでしょう?

1028:デフォルトの名無しさん
22/12/27 23:25:57.12 FjfQte1M0.net
マ板で相談してみたら?
ここは大分場違いになってきてる

1029:デフォルトの名無しさん
22/12/27 23:34:33.01 nX/ozHbV0.net
ブログにでも書けばいいのでは

1030:デフォルトの名無しさん
22/12/28 00:05:29.63 JeA8YDJe0.net
>>988
(職業)マじゃないただの一般人なので、マ板はたぶん板違い
>>989
ブログみたいな上等な場所に書くことではなく、便所のチラ裏で愚痴るに相応しい話題だと私


1031:は思いますけどね まあ、もうやめます



1032:デフォルトの名無しさん
22/12/28 01:06:31.58 PyoNDBFu0.net
別に職業プログラマでなくても良いんだよ
プログラム(ロジック)についての悩みならここで良いが
プルグラムを書こうとする人の悩みは、マ板の方が相応しい

1033:デフォルトの名無しさん (テテンテンテン MM97-t1KK)
22/12/28 03:37:42.61 +f6n+5TtM.net
> バッチファイルで改名?
これが出来なきゃ何のためにバッチファイルが存在してんだよw
バッチやシェルスクリプトは、ファイルのコピーやリネームとか、ファイル関連の処理が簡単に出来る事が最大のメリットだ
兎に角グクれば山ほど出てくる

1034:デフォルトの名無しさん
22/12/28 05:55:41.03 VGHawTJO0.net
C

1035:デフォルトの名無しさん
22/12/28 05:56:03.28 VGHawTJO0.net


1036:デフォルトの名無しさん
22/12/28 05:56:54.31 VGHawTJO0.net


1037:デフォルトの名無しさん
22/12/28 05:57:50.13 DPVYYyHtM.net
C

1038:デフォルトの名無しさん
22/12/28 05:58:53.46 DPVYYyHtM.net


1039:デフォルトの名無しさん
22/12/28 05:59:41.77 DPVYYyHtM.net


1040:デフォルトの名無しさん
22/12/28 06:00:17.27 DPVYYyHtM.net


1041:デフォルトの名無しさん
22/12/28 06:00:51.24 DPVYYyHtM.net


1042:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 145日 6時間 28分 24秒

1043:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch