C言語なら俺に聞け 162

■ このスレッドは過去ログ倉庫に格納されています
2023/10/30(月) 17:13:00.82ID:hHEGE8Ol0
!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言語なら俺に聞け 161
https://mevius.5ch.net/test/read.cgi/tech/1682053520/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/11/30(木) 14:54:30.13ID:3QI4e6Tt0
> &a[0] を a と省略出来るだけ

意味が同じなわけなので記法の上では省略と言えるんだけど
a が &a[0] のことを意味しているというわけではなく、
言語仕様上の理屈としては a のほうにプリミティブな定義があって &a[0] のほうが構文糖という扱い。

@ E1[E2] は (*((E1)+(E2))) と等価である
A & のオペランドが単項*演算子の結果の場合,*演算子も&演算子も評価せずに両演算子とも取り除いた場合と同じ
  (添字演算子の適用結果をオペランドとする場合も同様)
B 配列 (結果が配列型となるような式) は sizeof か & のオペランドであるときを除いて先頭要素を指すポインタに変換される

つまり &a[0] の場合を順番に当てはめるとまず &*(a+0) と同等と見做され、
&* は無かったことにされるので a+0 となり、 0 を足しても内容は変化しないから無視できて a と同じ。
そして a は配列の先頭要素を指すポインタに変換される。
2023/11/30(木) 14:59:53.10ID:3QI4e6Tt0
(順序から言うと配列がポインタに変換されるほうが先だな……。 すまぬ)
2023/11/30(木) 15:08:15.57ID:3QI4e6Tt0
配列 a は a と書くだけで先頭要素を指すポインタなので
&a[0] と書くってのは 0 を足すという要らんことをしているという扱いってこと。
2023/11/30(木) 20:20:41.06ID:4nwqW1NG0
>>140
pがザビ家でaがジオン公国そのものと言ったら判りやすいだろうか
ジオンはザビ家にNTRれたけど元のジオン・ダイクンが掲げた思想(長さとか)はNTRが完了した時点で失われた
その後出てきたアクシズ(ネオ・ジオン)はもっと酷くてジオンと言える部分はNTRしたザビ家の跡取りとその傀儡だけでジオンとは一体何だったのか語れる人物は一人もいない
2023/11/30(木) 20:26:04.69ID:SvZ2/mZg0
>>143
そっちのほうが余計なギミックじゃない?
a[]のアドレスが欲しければ&aと書くだけでいいのに
aが自動的にa[]の先頭番地になってしまうからややこしい
ちなみにBASICだと配列と同名の単純変数が作れてしまいこれも今思うと無茶苦茶だった
2023/11/30(木) 20:46:09.47ID:h/B+JtY5a
>>117
意味無いわ
147デフォルトの名無しさん (アウアウウー Sa0b-6V65)
垢版 |
2023/11/30(木) 20:47:46.07ID:h/B+JtY5a
完全に理解した!!!

https://ideone.com/g2912A

#include <stdio.h>

#define N 3

int main(int argc, char **argv)
{
char *hoge[] = {"abcd", "efg"};
char **hige = hoge;
char hage[][N] = {"ab", "cd", "ef", "gh"};
char (*fuga)[N] = hage;
char (*moga)[N] = {"ab", "cd", "ef", "gh"};
printf("%zd %s %s\n", sizeof(hoge), hoge[0], hoge[1]);
printf("%zd %s %s\n", sizeof(hige), hige[0], hige[1]);
printf("%zd %s %s %s %s\n", sizeof(hage), hage[0], hage[1], hage[2], hage[3]);
printf("%zd %s %s %s %s\n", sizeof(fuga), fuga[0], fuga[1], fuga[2], fuga[3]);
printf("%zd %s %s %s %s\n", sizeof(moga), moga[0], moga[1], moga[2], moga[3]);
return 0;
}

説明してみ
148デフォルトの名無しさん (アウアウウー Sa0b-6V65)
垢版 |
2023/11/30(木) 20:51:51.20ID:h/B+JtY5a
アンカ忘れた
>>140
2023/11/30(木) 21:26:27.48ID:3QI4e6Tt0
>>145
あくまでも言語仕様の理屈で言えばこうだという説明なのでその言語仕様が良いかどうかの意見は含んでないよ。
色々とアレな部分も多いってのは文句つけても仕方がないいまさらな話だし。
150デフォルトの名無しさん (ワントンキン MM3f-XlNP)
垢版 |
2023/11/30(木) 22:06:24.41ID:wy49Mw9yM
いやいや何を言っとんの?
利便性のためにそういう仕様にしてるんだよ
C書いてりゃさすがに分かんだろうよw
2023/11/30(木) 22:36:56.23ID:3QI4e6Tt0
感覚的にはそんなに不自然には感じないんだけど
仕様の規則が変則的なのも確かなので
つまりは人間の感覚は不合理なものってことだ。
2023/11/30(木) 22:41:39.63ID:0Cr+jEwb0
>>147
%zd は知らなかったわ。 勉強になった
2023/12/01(金) 00:42:09.23ID:U5xjJXbM0
sizeof の結果の型は size_t で、
size_t は符号なし整数というだけしか規定されていない処理系定義なんだけど
unsigned int や unsigned long int の別名として定義されていることが多いせいで
それをあてにした形で説明している資料は割とある。
2023/12/01(金) 02:30:56.67ID:oKQshtme0
>>145
> a[]のアドレスが欲しければ&aと書くだけでいいのに
俺はそっちのほうがややこしいと思うけどな

むしろ*(a+10) を [] で表現するなら *a[10] みたいな書き方になるほうが、理解する上ではややこしくなかったかなとは思うけど(使う上では不便)

[] って箱(マス)に見えるし、まあ直接箱の中身を示すものなのだなって覚えたけど
2023/12/01(金) 05:52:03.14ID:sCbOzpGc0
誰が誰なのかよく分からんけど、キッズが来て荒れた、という話ですか

インデックスアドレッシングを [ ] 記号に当てただけと思うけど、そんなに難しいかね
2023/12/01(金) 05:55:20.08ID:sCbOzpGc0
型の話かと思ってたら、いつの間にか 入門者がポインタを理解できない話 になった印象
2023/12/01(金) 14:51:35.53ID:U5xjJXbM0
>>145
配列 a に &a としたときに得られるのは配列を指すポインタであって配列の先頭要素を指すポインタではない。
(型が違う。 アドレスを数値として見たら同じはずだけど。)

多次元配列にアクセスするとき (添字演算子を重ねて適用するとき) に仕様の通りに解釈していくと配列と先頭要素が都合よく切り替わって最終的にポインタ演算になるのが実に上手いこと出来てる。
配列の要素にアクセスするときの記法を現状のような形にするという前提でならなんだかんだでよく出来ている。

配列に & を付けたら配列を指すポインタになるというのは例外的ではない普通の挙動だからそこに別の意味を割り当てるならそれもやっぱり変則的なややこしい挙動ってことになってしまうよ。
2023/12/01(金) 19:03:26.87ID:Ga+233FE0
>>157
ポインタ完全制覇でよーく理解できました。
20年以上やってきて配列へのポインタは一度だけ出番がありました。
2023/12/01(金) 19:23:36.92ID:U5xjJXbM0
>>158
プログラマが直接的に書く機会はあんまりないだろうけど、
暗黙には頻繁に表れていてこのルールがないと上手いこと機能しないって話。

#include <stdio.h>

int main(void) {
int foo[2][3] = {
{1, 2, 3},
{4, 5, 6}};
printf("%d\n", foo[1][2]); // ふたつの座標みたいに見えるけど
// 式を各段階に分解すると……
int(*bar)[3] = foo; // 配列を指すポインタは出てきてる!
int *baz = bar[1];
int qux = baz[2];
printf("%d\n", qux);
}
160デフォルトの名無しさん (ワッチョイ 65d3-WD8q)
垢版 |
2023/12/05(火) 07:30:58.43ID:72+QzLj/0
c言語初心者です
質問させてください

FILE *fpという宣言の「FILE」にどういった役割があるのでしょうか
*fpは関数によってどこを読み書きするかを指定するためにアドレスを格納することは分かるのですが
それならばint型のポインタで良いような気もします
プログラムを書く上でどうでもいい内容なのですが教えていただければ今日の寝付きが良くなる気がします
2023/12/05(火) 07:53:15.80ID:kkEdYaZP0
>>160
stdio.h の中身を見れば FILE がどう宣言されているか分かるのでは?
162デフォルトの名無しさん (スフッ Sd0a-Oc+E)
垢版 |
2023/12/05(火) 08:16:33.53ID:64vzQPx0d
>>160 FILE構造体っていうことだけは、どの本にも書いてある。
2023/12/05(火) 08:26:33.63ID:Sjl8/rh40
実際UNIXのfile descriptorはintでWindowsのファイルハンドルHANDLEはvoid*だ。
こいつらはシステムコールによってカーネルモードで操作されるから中身が完全に見えないようになってる
それとは違って標準Cライブラリはユーザモードで動作するから
処理系依存で中身を操作してもいいように作ったのかもしれない
2023/12/05(火) 08:33:57.88ID:GHHZLCc/d
>>160
確かに構造体の中身を使わないかぎり何のポインタでもいいんだけど
間違えて他のタイプへのポインタと混同した時にエラーが出るから気づきやすい
それはけっこう重要だよ
165デフォルトの名無しさん (ワッチョイ 65d3-WD8q)
垢版 |
2023/12/05(火) 09:00:17.71ID:72+QzLj/0
>>160です
普通の構造体の宣言とは異なり要素の記述はありませんが
「FILE」とは「ファイル構造体を使うよ」と宣言しているという意味で
そうしてstdio.h上のFILE構造体の要素に開いたファイルの情報が代入されていくということでしょうか?
「FILE」を記述せずにfopenで開こうとした場合構造体メンバのptrに代入されている数値が使えないのでfopenから戻り値が受け取れず正しく*fpに座標が代入されない
みたいな
そして開くだけならfopenでも開けてしまうとか
2023/12/05(火) 10:08:56.47ID:z5PiblaY0
言語仕様的に見れば FILE はストリームを制御するのに十分な情報が入ったオブジェクト型であることと、
アドレス (FILE 型のオブジェクトがある場所) に意味がある場合もあるから
オブジェクトをコピーして機能するとは限らないという程度のことしか書いてない。

FILE にどのような情報が格納されているのかといったことや
詳細な仕組みはホスト環境の事情に合わせて処理系の裁量で決めてよい部分なので、
具体的にどうなっているのかは各実行環境・開発環境ごとに違う。

特に環境依存の細かい部分に立ち入って制御をしたい事情があるのでない限りは
fopen が「なんらかの方法」で FILE 構造体を構築してそのアドレスを返すものであるということだけ知っていれば
普通のプログラマにとって十分なように出来ている。
167デフォルトの名無しさん (ワッチョイ 8ac1-Vvnv)
垢版 |
2023/12/05(火) 10:36:22.34ID:NYBtRI3Y0
>>165
3行目から4行目の理解で大体あってるよ
それ以降は何言ってんのか分かんねーから全部アタマの中から破棄していいよ

正確にはFILEってのは抽象データ型であんたは構造体って言ってるけど構造体かどうかは分からんし使う側は知る必要もない
提供者がわざわざ抽象型にして使い手側の負荷を下げてくれるとこを中身がどうとか役割がどうとかさぐんのは筋が悪いんだよ
使えって言われてんだから何も考えずにだまって使えばいいよ
2023/12/05(火) 11:08:08.12ID:h96fo3nj0
FILE構造体ってOS毎に変わるし、コンパイラ実装でも又変わってた様な気がする
2023/12/05(火) 12:35:58.10ID:4VzMioa/0
FILE*経由だとバッファリングされるから、バッファーのポインタとそこに含まれてるデータサイズも含んでいるだろう
そもそもファイルのシーク位置も含まれてる
まとめると
・ファイルディスクリプターやファイルハンドル
・シーク位置
・バッファー(ポインタ、サイズ、含まれてるデータサイズ)
となるかね
2023/12/05(火) 15:39:55.92ID:QJai9ytva
>>160
void *hoge = (void *)fopen("hoge", "wb");
fprintf((FILE *)hoge, "hoge\n");
fclose((FILE *)hoge);
2023/12/05(火) 17:31:14.53ID:4VzMioa/0
FILE*互換の自前のストリームを実装できれば便利なんだがなぁ
継承が無いから、構造体に自前の関数をセットして、何らかの登録関数に渡す感じになるだろう
2023/12/05(火) 17:40:17.96ID:oSX0a7FoH
fopencookieとかfunopen
2023/12/05(火) 17:48:30.74ID:z5PiblaY0
パイプのインターフェイスをストリームとして開くことが出来るから
適当なスレッドを開いてパイプの受け取り口で受け取った情報を好きなように加工するようにすれば、
パイプに書込む側ではストリームに書き込んだらいい感じに処理してくれるように見える。

というのを Windows でやっているのをどっかで見た。
2023/12/05(火) 18:11:37.45ID:GHHZLCc/d
>>165
開くだけで何が楽しいんだ?
読み取りも書き込みもクローズもできない
exitで自動的にクローズはされるけど…

>>163
HANDLEはポインタではなくただの整理券番号で実体は整数値だ
しかしWindows SDKでは「架空の構造体へのポインタ」として定義されているので例えばウィンドウハンドルをファイルハンドルと混同するとType mismatchエラーになる
これはかなり有用な仕組みでC言語が仕様に組み込んでほしいくらい
2023/12/05(火) 23:44:52.07ID:9c748LJ40
ソケットディスクリプタってファイルポインタに転生できる?
2023/12/05(火) 23:48:43.88ID:4UYj/sQ80
>>175
fdopen
177デフォルトの名無しさん (ワッチョイ 65a4-WD8q)
垢版 |
2023/12/06(水) 08:34:18.09ID:hjosWl9s0
>>160です
皆さん大変参考になりました
今日はよく眠れそうです
178デフォルトの名無しさん (スフッ Sd0a-nvfk)
垢版 |
2023/12/06(水) 12:07:25.67ID:dR0trs3yd
対策このままなら再発しそうね
https://japan.zdnet.com/article/35212258/4/
2023/12/06(水) 16:09:22.53ID:JLoh059d0
仕事なくなったら困る人が大勢いるし
2023/12/06(水) 20:24:47.29ID:tBrgYtLt0
free(NULL) は許されるのに
fclose(NULL) は許されないんよな
2023/12/06(水) 21:05:20.14ID:gHtrZlY5a
>>180
さらにfflush(NULL)は許されるという一貫性の無さ
2023/12/06(水) 21:19:13.20ID:+44Bjs460
fflush の場合は全てのストリームを対象とするという特別なフラグとして NULL を活用しているので無効なポインタとしての NULL とは事情が違う気がするね。
それにしたってNULL を多義的に使っているという意味では一貫性はないけど。
183デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/06(水) 21:23:39.94ID:bAVe0RWP0
free(NULL)は、おバカなマの為に特別に許容したんだろ
184デフォルトの名無しさん (ワッチョイ 65a4-WD8q)
垢版 |
2023/12/07(木) 02:17:45.58ID:NYiehhGh0
以前ネットでおすすめされていた「苦しんで学ぶc言語」の内容をしっかり理解する段階まできたのですが、次は何をすれば良いのでしょう。
猫でも分かるプログラミングも読んでみたのですが仕様が古すぎてトレースできないのと、私には作者さんの文章の作りが合わず困っています。

まずは簡単なソフトを作りながら学べればと思います。
入門書の次に読めるような本と、そこからアプリケーション開発のイロハが分かる本やサイトを教えていただけないでしょうか。
2023/12/07(木) 07:17:00.47ID:Y9iRVwaI0
↑みたいなのって目的ないのかね
今後C言語で特に何かやりたい事がないなら別に何もする必要ないよ
2023/12/07(木) 08:27:05.09ID:wi0prF2i0
Cで現実的なアプリケーションを作るならホスト環境 (OS など) の事情は無視できないし、具体的な目標なく道筋は決まらないと私も思う。
何の情報もない他人に何かを勧めるというのはしづらい。
目標があるならその分野の既存のコードを「読む」という体験はためになるかもしれない。
実際のコードを見て意味がわからない部分があれば学習が必要な部分だというとっかかりになる。
187デフォルトの名無しさん (ワッチョイ 6646-wNAC)
垢版 |
2023/12/07(木) 09:28:19.84ID:++8K4NmJ0
>>184
> 「苦しんで学ぶc言語」

というのは、これ↓ ?

https://9cguide.appspot.com/index.html
> 苦しんで覚えるC言語

であれば文法解説のようなので、ファイル操作をしてはどう?
cat コマンドを作るとか。
188デフォルトの名無しさん (ワッチョイ 65ff-WD8q)
垢版 |
2023/12/07(木) 10:04:58.60ID:NYiehhGh0
>>186
Windowsソフトを制作して当方の業務を効率化できればと考えています。
「既存コード」を読むですか、なんだか英語学酒のようで気が滅入りますね>
>>187
失礼しました。「覚える」でしたか。
ファイル操作がどこまでを指すのかわかりませんが高低水準入出力はすでに可能です。
2023/12/07(木) 10:23:42.82ID:aHfAXzyRM
業務効率の向上が目的ならC言語は回り道すぎる
他の言語選んだ方がいい気がする
2023/12/07(木) 10:31:24.83ID:HPax2zCP0
ファイル操作の課題出してあげようか
指定した二つのDirにあるファイルを同期させる
単にコピーするのではなく、タイムスタンプの新しいものだけをコピーする
新しいSubdirできていたら、中味があればDirごとコピーする
とりあえずは、新しく作られてファイルの同期まで、
削除については考慮しなくて良い
2023/12/07(木) 10:39:50.34ID:3PWWuEZS0
>>188
>Windowsソフトを制作して当方の業務を効率化できればと考えています。
早速これに取り組んだ方が良い
実用するものを作る方がモチベになる
2023/12/07(木) 11:21:46.78ID:6u4iKMo7d
C言語のスレッドで言う事じゃないがC言語以外の生産性の高い言語を学んだほうがよさそう
2023/12/07(木) 11:56:53.00ID:QzDrEJVi0
>>184
CはOSのAPIを直接叩けることがメリットでもあるので、Linuxのプログラミング本を読んでコード書いてみるのが一番良いだろう
マルチプロセス、マルチスレッド、ソケットとか覚えるべき事は沢山ある
Cでやれば根本から理解出来る
2023/12/07(木) 12:04:11.70ID:FWY3NSUg0
(事務作業などの?) 業務効率化が目的なら Power Automate Desktop の活用を考えた方がいいと思う。
効率化の最初の段階は解決すべき問題を見つけることで、これをきちんと一度で洗い出すのは大抵の場合に出来ない。
雑に作って運用しながら改善するという手順をとるのがのぞましいが、 C で書くとそういう柔軟な体制がとりづらい。
2023/12/07(木) 13:30:05.55ID:zYUoekf60
「なにを作りたいのかが大事」ってのは良く分かるんだけど、普通の人が作りたいものって大抵Cじゃない方が…ってなっちゃうんだよな
196デフォルトの名無しさん (ワッチョイ 65ff-WD8q)
垢版 |
2023/12/07(木) 13:42:19.21ID:NYiehhGh0
>>90
そういった事もできるんですねー
>>191
取り組みたいのは山々なのですがuiの作り方からわからないので入手できるバーションで解説されている書籍が欲しいところです。
>>192
基礎を大切にしたいのでcをはじめのうちは使っていきたいと考えています。
>>193
仰る通り根本を理解できればと思います。Linux本ですね。可能であれば簡単なものでおすすめを添えていただけないでしょうか。
>>194
グラフィック系のソフトを使う上で不便なところを楽したい、と言いますか
とにかく画像表示や文字列表示から進めていきたいと考えています。
前述の通り基礎を理解したいので可能であればcで作成したいのです。
2023/12/07(木) 13:42:44.77ID:P4JhXVL60
WindowsアプリならCじゃくて、せめてC++にしておけ
2023/12/07(木) 13:43:24.10ID:n9+uyfFo0
楽したい奴にはCは向かない
199デフォルトの名無しさん (アウアウウー Sa21-wVFe)
垢版 |
2023/12/07(木) 14:18:01.05ID:wNl2TimYa
C++は変な癖がつく
Cの方が絶対良い
2023/12/07(木) 15:23:59.73ID:3PWWuEZS0
Cで全部書いてると大変だと思うよ
機能全部使わんでも良いからC++の方が現実的だよ
2023/12/07(木) 15:31:37.34ID:HPax2zCP0
大変かどうかは、何を作るかによる
2023/12/07(木) 15:35:13.86ID:3PWWuEZS0
>>201
>>196を踏まえて大変だと思うよ
2023/12/07(木) 16:19:14.82ID:QzDrEJVi0
>>196
自分はUNIX Cプログラミング(いわゆるライオン本)で勉強して、めちゃくちゃ為になったけど、さすがにこれは古すぎる
詳解UNIXプログラミング 第3版は間違いのない名著
ふつうのLinuxプログラミング 第2版はLinux向けだし初心者向け
Cで仕事をするようにはならないかもだけど、「ふつうの~」を理解出来て自分のものにすることがCを学ぶ意義だな
2023/12/07(木) 16:23:44.20ID:5AmCTrxW0
>グラフィック系のソフトを使う上で不便なところを楽したい
ソフト側でスクリプト等がサポートされてなければ
できることは連続するショートカットを 1プッシュでまとめて出す
キーロガー&再生系とか Joy2Key みたいなキーコード送出系ぐらいしか思い浮かばん
2023/12/07(木) 17:03:32.49ID:FWY3NSUg0
>>196
具体的に対象になってるソフトの名前は言える?

モダンな設計の Windows 用ソフトが外部から制御するために公開するインターフェイスは
Component Object Model の技術をベースにしていることが多くて、
高度な開発環境の補助を得ながら使う分には便利なんだが
C から使おうとするとすごく面倒くさい。 (出来なくはないけど。)

ソフトが外部に対してインターフェイスを公開するのではなく
制御用のスクリプト言語を内蔵している場合もあるので
C でのプログラミングに詳しくなってもあまり役に立たないこともある。

もしも外部に対してインターフェイスを用意していないなら
ボタン操作のイベントを発生させるとかして制御する (つまりまさに人がする操作を代行させる) ということも可能だが、
それを可能にするような基礎技術というか Windows の動作モデルを理解したいのなら
「猫でもわかるWindowsプログラミング」はそれなりに有用だと思うよ。
私は書籍を読んだことは無いけどウェブ版は Windows がイベントを伝播させて操作させる構造を理解するのに十分な記述はある。

だけど、人が操作するときに Windows の中で何が起こっているのかを
初心者が根本から理解してきちんと使いこなせるまでになるハードルは割と高めなんだよ……。
Power Automate Desktop なら技術の根本を理解せずともそれが出来るようになってるし、
マイクロソフトが直接に提供していてしかも無料という神ソフトなのでオススメした次第。
UWSC とか AutoIt なんかも人気があるね。
2023/12/07(木) 17:15:58.47ID:ggcXWkJv0
関数のサイズというのは、関数の引数のサイズと同じと考えて良いのでしょうか?
中身に1万行使ってる関数があるとして、その1万行は関数のサイズとは全然関係ないんでしょうか?

構造体はなんとなく変数のバイト数の足し算なんだなってわかるけど、関数がピンとこないです・・・
2023/12/07(木) 17:18:59.29ID:Dmh4B19g0
プリプロセッサメタプログラミングを覚えてからc言語の開発は楽になったわ
前は同じようなデータ構造でたくさんモジュール作ってたからな
2023/12/07(木) 17:34:07.95ID:FWY3NSUg0
>>206
関数をデータとして扱うことはないので「大きさ」は定義されない。
C の言語仕様的には「関数はオブジェクトではない」という扱い。

関数に対して呼び出し以外の操作をする方法はない。
関数ポインタで関数の場所を指すということは出来るが、
型システム的にちょっと特殊な扱いになっていて関数ポインタ経由で値を取り出したりも出来ない。

もちろん実際にはなんらかの形でメモリ上には存在するし、
長いプログラムは大きい可能性が高いけど。
実際にどうなってるのかは生成された機械語を見ればいいんでね。
2023/12/07(木) 17:41:37.50ID:VEE9aIzl0
>>206
質問文が謎すぎて、何を聞きたいのか解釈できない

関数のサイズって言ってるのがビルドしてできた実行ファイルのファイルサイズの事なら、コードの量が多ければ当然サイズは大きくなる
2023/12/07(木) 17:41:59.31ID:ggcXWkJv0
>>208
ポインタのアクセス条件でメモリのサイズ・型が明確になっていること
とあったので、関数ポインタもサイズや型が明確でないといけないなら
ちゃんとわかっとかないといけないと思ったのですが、関数の扱いはわかってる人から見ても特殊なんですね
ありがとうございます
2023/12/07(木) 18:04:20.91ID:Kvlx+aNw0
>>206
あなたはどういう文脈で「関数のサイズ」が気になった・話題になったの?プアな組み込みとか?
俺は「関数のサイズ」が気になった・話題になった覚えがない
まぁコンパイル後のコード量かなぁ、関数の行数は大きく関係する
引数はスタックに積むけど「関数のサイズ」とは言わない気がする
2023/12/07(木) 18:19:55.87ID:5AmCTrxW0
サイズ云々は
インクリメントしたときにどんだけ(何バイト)進むのかが確定してる型でないとポインタにならない
→ じゃ関数ポインタって 関数のサイズ(≒ コンパイル後の機械語化されたバイナリのサイズ) を知ってるのか?

こういう思考の流れかな?
2023/12/07(木) 19:14:37.61ID:ggcXWkJv0
>>212
まさにそれです!
関数ポインタを配列に格納した時インクリメントしたら何バイト進むのか分かってないといけないのではと
2023/12/07(木) 19:46:05.37ID:Avn/NPEq0
>>213
その状況で必要になるのは関数のサイズじゃなくて関数ポインタのサイズや
それは他のポインタと同じ、64bitPCなら8バイト

仮定の話として、もし「関数ポインタの配列」ではなく「関数の配列」が作成できるような言語仕様にするなら、関数のサイズも決めないといけなかっただろうね
2023/12/07(木) 19:58:53.01ID:ggcXWkJv0
>>214
言われてみたらたしかにそうですねなんでポインタなのに普通の変数のように考えてしまってたんだろう・・・
216デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/07(木) 21:12:50.21ID:fQltjmnX0
void*使えるやん
217デフォルトの名無しさん (ワッチョイ 65ff-WD8q)
垢版 |
2023/12/07(木) 21:34:16.53ID:NYiehhGh0
>>203
ありがとうございます。
>>204
メインのソフト除いて二窓三窓しているので欲しい機能だけ載せたソフトを自作したいなと。
>>205
204へのレスと同じです。
猫でも分かるは説明していない単語が出てきたり、UI作成の手順をトレースできなかったり
わからない人向けではなく分かる人向けの解説のようで個人的には合いませんでした。
2023/12/08(金) 03:48:38.29ID:tzfGEsy80
>>216
関数ポインタは void* に格納可能であると保証してないし、関数ポインタがオブジェクトを指すポインタより大きかったり表現が異なっていたりする環境はある。
出来る環境でなら使うのが悪いわけではないけど移植性は犠牲になる。
2023/12/08(金) 06:53:57.90ID:Mdse7dEX0
>>218
>関数ポインタは void* に格納可能であると保証してないし
そんなことありえるの?
2023/12/08(金) 07:01:37.37ID:g0YSKcXt0
near ポインタモデル?だったかの
変数のアドレッシングサイズと
プログラムカウンタのアドレッシングサイズが違うやつ
2023/12/08(金) 07:38:56.35ID:qsjd2ZYcM
ミディアムモデルとかコンパクトモデルとか
まぁ過去の話だわな
2023/12/08(金) 07:57:53.16ID:m+qJyEe4d
関数のサイズは関数のポインタをアドレス順にソートすれば求められる
そのサイズ分を実行可能領域にコピーすれば当然実行もできるよ
dllインジェクションとかでたまに使われる
2023/12/08(金) 08:01:58.55ID:ClTGg8d6d
>>217
業務で使ってるような信頼性のソフトを自作するつもりなのか
一人で?予算は?期間は?
まあ無理だろ
単純にメモリの大きなPCに買い替えればいいんじゃない
2023/12/08(金) 09:53:49.26ID:B2zBKDAb0
>>217
マイクロソフトが出している公式のチュートリアルは C++ が基礎だけど
考え方としては C でも同じなのでそのへんは適当に読み替えながら……
https://learn.microsoft.com/ja-jp/windows/win32/
Win32 API は C で使ってもそんなに不便ではないように出来てる。

特に最も基礎のこのへんの例示のコードは (C++ とは書いてあるが) たぶん C としてコンパイルさせても通る。
https://learn.microsoft.com/ja-jp/windows/win32/learnwin32/your-first-windows-program

必要な知識の分量は初心者が想像するよりずっと多いと思う。
分かりやすいドキュメントがあったとしても (そして無いこともしばしばある!) 分量は減らないので
分量というハードルをクリアするのは単純に学習量しかないし、
学習量をこなすには時間をかけるしかしょうがない。

やりたいことを自由に出来るようになるまで何も生産しない時間 (業務なら人件費に換算されるだろう) をかける余裕があるの?
というところを不安に思っちゃうわけだよ。
ここは C スレだから C プログラミングを支援したい気持ちはあるがそれがしんどい場合も多いってことも知ってる。
個人事業なら趣味と兼ねるのもアリかもしんないけど。
225デフォルトの名無しさん (ワッチョイ 6646-wNAC)
垢版 |
2023/12/08(金) 10:13:43.24ID:20YRNN5F0
>>224
Cコンパイラに、C++ -> C トランスレート機能あるの?
2023/12/08(金) 10:26:10.76ID:vLixVDpZ0
API はほとんど C インターフェースで
C++をベターCとして利用してて C++のクラスの機構はほぼ使ってない

(GDI+ とかAPIがはなっから C++ インターフェースの奴は別)
227デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/08(金) 10:34:54.49ID:faKtyhh20
>>218
ねえよ
2023/12/08(金) 10:50:23.47ID:k3Bpg+TDa
ぶっちゃけGDI+もCから使えるけどね
2023/12/08(金) 10:53:01.67ID:vLixVDpZ0
>>228
あれ Cインターフェース居るのか 最終的にはCOMになってるんやっけ?
2023/12/08(金) 11:03:20.25ID:Mdse7dEX0
>>220-221
なんかそういうのあったかも
2023/12/08(金) 11:04:41.36ID:VEgZ7oNC0
あれはPascalの呼出ではなかったかな
2023/12/08(金) 11:27:29.89ID:B2zBKDAb0
>>229
gdiplus.dll 自体は関数群を置いてあるだけっぽい。
それをラッパークラスで覆って C++ から使いやすくしているだけ。
233デフォルトの名無しさん (ワッチョイ 6548-WD8q)
垢版 |
2023/12/08(金) 12:03:08.97ID:7hcazM9a0
>>224
兼任ですが個人事業主でお金と時間はそれなりに自由に使えます。
3〜5ヶ月くらいはまとまった時間を取ることも可能です。
公式チュートリアルは参考にはなりますが読みやすいかと言われると微妙ですね。

知識はもちろん身につけたいのですが、そこまでの道筋は他人のコードを読む方がやはり良いのでしょうか?
書籍やサイトなどでアプリの形になるまでのチュートリアルなどは無いのでしょうか。
2023/12/08(金) 12:17:34.25ID:k3Bpg+TDa
Win32APIというよりそれ以前の
C言語の知識が足りてないんじゃないのかな
2023/12/08(金) 13:05:38.60ID:B2zBKDAb0
>>233
何を学べば良いかすらわからないときのとっかかりとして
他人のコードを読む (何がわかってないかはわかる) ことを勧めたまでで、
良い資料があるならそれを読むにこしたことはないよ。
良い資料がないことも多いという現実はあるけど。

私は公式チュートリアルは良いほうだと思う。
知らないことを書いてあるんだからある程度は読みづらいこともあるのは当たり前のことで、
どれを読んだって似たようなもんじゃないかな。
専門的な内容をスラスラ読めるほうがおかしいでしょ。
2023/12/08(金) 13:11:55.82ID:0BufPgxy0
さてはオメー
ふらっとC#スレで他人のコードの読み方とか延々聞いてたヤツだな?
2023/12/08(金) 13:15:41.58ID:o54AonyOa
>>206
関数もメモリにロードされるのわからず?
関数はただのマシンコードなんだからここから始まりますよ、というラベルがついてるだけだぞ
そして呼ばれた時はそこへジャンプするだけ
関数ポインタはそのマシンコードのラベルのアドレスを保持しているだけ
ポインタ以前にコンピュータの仕組みからやった方が良さそう
プログラム格納方式とか聞いたことない?
2023/12/08(金) 13:31:18.44ID:k3Bpg+TDa
>>236
なんちゃらGPTがここでこっそり質問してたら笑う
2023/12/08(金) 13:36:30.72ID:SLmq2FCH0
>>219>>227
ググってみたらどうも>>218が正しいらしい
240デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/08(金) 15:42:45.24ID:faKtyhh20
だからねえよ
そいつが勘違いしてるか、使い方が悪いかだろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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