[過去ログ] C言語なら俺に聞け 162 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
101
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/27(月)09:01 ID:HtoHgn5y0(1) AAS
>>100
それは左辺値/右辺値とは関係ない。
「リテラルを書き換えようとしたら未定義」というルールが関与してる。

前者の場合は文字列の場所を示すアドレスが cp に格納されているので
cp が指す先というのは文字列リテラルだが
後者の場合は確保された配列を初期化子の文字列で初期化するという理屈なので
配列と文字列リテラルとは別の実体を持ち、リテラルではない配列を書き換えることは問題にならない。

初期化子として文字列が出てくるときは初期化の文法としてちょっと特例があるのと
(文字列を含む) 配列は暗黙の型変換で勝手にポインタに変換される特例があって
そういう変則的なルールの積み重ねが分かり難い要因だと思う。
省4
102
(1): (アウアウウー Sa0b-6V65) 2023/11/27(月)09:03 ID:7/k6/GSga(1) AAS
char *cpa = "abcdefg;
char cpb[] = cpa; // 出来ない

char cpc[] = "abcdefg";
char *cpd = cpc; // 出来る & abcdefgの中身も描き替え出来る
103: (ワッチョイ 7fab-LZ+J) 2023/11/27(月)11:14 ID:zMN468VW0(1/2) AAS
「大前提で文字列リテラルは書き換えたらダメ」があって

初期化と代入が同じ記号の = で行われてる
配列での代入操作は暗黙で先頭のポインタを渡す一方で
配列の初期化はあたかも複製をとったような形になる

ここらへんにややこしさがあってめぐりめぐって1行目にヒットする
104: (スププ Sd7f-RFe5) 2023/11/27(月)11:25 ID:554QjvZVd(2/2) AAS
>>101 ご親切にありがとうございます。標準的な本にもかいてあることを聞いてしまいました。
105: (エムゾネ FF7f-xen6) 2023/11/27(月)12:06 ID:65C4jQRRF(1) AAS
ポインタと配列(の先頭番地)は同じように使えるがまったく別のもの

>>102の例だとsizeof(cpc)は8で
sizeof(cpa)はポインターサイズ
106: (ワッチョイ 7fab-LZ+J) 2023/11/27(月)12:39 ID:zMN468VW0(2/2) AAS
"abcdefg"[2] = 'C'; これがNG
107: (ワッチョイ 5f79-/KuA) 2023/11/27(月)19:49 ID:/cbu4sL+0(1) AAS
>ポインタと配列(の先頭番地)は同じように使えるがまったく別のもの
まったく別と言い切ってしまうのはちょっと語弊があるように思う
言い換えれば配列はアドレスが変更できないポインタとみなせる
後は参照先のメモリ領域が書き換え可能かそうでないかの違いでしかない
108
(1): (ワッチョイ 7f63-YwKO) 2023/11/27(月)19:53 ID:iryvQ0lx0(1) AAS
配列名は単に文字列が格納されている場所に付けられたラベル
109
(1): (ワッチョイ 7f6a-l0Ve) 2023/11/27(月)22:43 ID:LIfK37a60(1) AAS
>>108
上で触れられているようにサイズ情報も持ってる
110: (スプッッ Sdff-z/Dz) 2023/11/28(火)08:18 ID:0HFLSmnDd(1) AAS
>>109
それは別に配列だからってわけじゃない。
111
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/28(火)09:29 ID:mRTkdYl90(1/2) AAS
配列の型は配列型だ。

char cpc[] = "abcdefg";

とあればこのときの cpc の型は char[8] をもつ。
式中に配列型の式が現れた場合には sizeof か & のオペランドであった場合を除いてその配列の先頭要素を指すポインタ (この場合は char*) に暗黙に型変換される。
変換が適用されればポインタだし、適用されない場面では配列。

配列自体は左辺値だが変更できる左辺値 (modifiable lvalue) ではないので代入演算子の左辺に現れることはできない。
配列を型変換を適用して出来るポインタは左辺値ではないのでやっぱり代入することは出来ない。
112
(1): (ワッチョイ dfc6-AnfR) 2023/11/28(火)10:56 ID:vcMwjchf0(1) AAS
え?左辺値に出来るやん
113: (ワッチョイ a76b-onFz) 2023/11/28(火)15:19 ID:87HNLOa+0(1) AAS
型の話って、実は結構難しいというか深いよね…

型を認識するプログラム作ってみるとわかるんだけど
「~のポインタである」と
「~の配列である」を同じ情報量では扱えなくて
「~の配列(要素数n)である」としないとだめなの

ポインタである ことは1ビットで保持できるのに、配列である は要素数があるから必要なビット数がやたら多いのよ
114
(1): (ワッチョイ 4701-GgRN) 2023/11/28(火)18:36 ID:0ouam6Fz0(1) AAS
((char*)cpc)++ で cpc[0] が 'b' を指すように移動できるの?
これがポインタが左辺値になってるって意味の理解でOK?
115: (ワッチョイ a763-YwKO) 2023/11/28(火)19:17 ID:7gZuadd+0(1/2) AAS
++は無理
116: (ワッチョイ 47e7-xen6) 2023/11/28(火)19:34 ID:7TmihfNz0(1) AAS
アセンブラで考えるとよくわかる
cpa:
.dw cpa_static
cpa_static:
.db 'abcdef',0

cpc:
db 'abcdef',0

こんな感じになるだろう
cpaをインクリメントするのが可能だがcpcをインクリメントするのは無理なのがわかるだろう
cpcはアセンブル後には値がなくなる固定値でcpaは領域が確保されてる変数だから
117
(1): (ワッチョイ a763-YwKO) 2023/11/28(火)19:42 ID:7gZuadd+0(2/2) AAS
>((char*)cpc)++

こんな風な事をしたいなら、

*(char*)cpc+i

これでどうだろうか
cpcは固定値で、加算も減算も出来ないが、その位置からのオフセットならとれる

でも、ふつうの人は cpc[i] こうするだろう
118
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/28(火)20:11 ID:mRTkdYl90(2/2) AAS
>>114
代入可能であるためには左辺値であることは必要条件なのだけれど十分条件ではない。
配列が代入の対象になりえないにも関わらず
(modifiable という概念を導入してまで) 左辺値という扱いにしていることからもわかるように、
代入できるかどうかで左辺値かどうかは語れない。
左辺値でも代入できないことはある。

右辺値はどこかに代入しない限り捨てられる (その式を超える寿命を持つことはない) という性質があるので
逆にそうでないものは左辺値という扱いにしないと辻褄が合わないからこうなってるんだと思う。
119: (ワッチョイ 5fdf-2qxF) 2023/11/28(火)20:38 ID:h0hB0aZz0(1) AAS
>>112
>>118で「配列が代入の対象になりえないにも関わらず」なんて言い方してるくらいだから
多分左辺値とか右辺値がなんなのかよく分かってないんだろう
まあいつも規約をだらだら載せてるだけだけのコテだしね
120: (アウアウウー Sa0b-6V65) 2023/11/29(水)06:07 ID:n75oaT1ga(1) AAS
なんでcpcを++したいと思うんだろ
121: (ワッチョイ bf35-UyS0) 2023/11/29(水)07:30 ID:Dj4oipus0(1) AAS
左辺値かどうかの簡単な切り分けだと思っただけで
そういう欲求はない
122: (スフッ Sd7f-1fOb) 2023/11/29(水)11:41 ID:5J3ZheQvd(1/8) AAS
>>111 正確には、配列名のことをいっているんでしょ?
123: (スフッ Sd7f-1fOb) 2023/11/29(水)11:43 ID:5J3ZheQvd(2/8) AAS
でないと文章的につじつまが合わない
124
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/29(水)12:08 ID:sncgHuaJ0(1/4) AAS
何を言ってるのだかわからん。
代入演算子の左辺に配列が現れることは出来ないという説明
に納得いかない (できる状況があると思っている) ということ?
125: (スフッ Sd7f-1fOb) 2023/11/29(水)12:16 ID:5J3ZheQvd(3/8) AAS
>>124 そういうことです
126
(1): (ワッチョイ 5f79-/KuA) 2023/11/29(水)12:18 ID:UMPQWy8o0(1/2) AAS
代入可能な左辺値一覧

○…代入可能な左辺値
×…代入可能な左辺値ではない

1 変数に代入 v=x ○
2 変数のアドレスに代入 &v=x ×
3 配列に代入 a[i]=x ○
4 配列の名前に代入(2に相当) a=x ×
5 ポインタ変数に代入 p=x ○
5 ポインタ変数のアドレスに代入 &p=x ×
7 ポインタ変数の参照先に代入 *p=x ○ ただし参照先が書き込み可能でなければランタイムエラー
省1
127: (スフッ Sd7f-1fOb) 2023/11/29(水)12:25 ID:5J3ZheQvd(4/8) AAS
>>126 まだまだ浅学な者で、3と4の違いが分かれば十分です
128: (スフッ Sd7f-1fOb) 2023/11/29(水)12:26 ID:5J3ZheQvd(5/8) AAS
右辺値と左辺値に関しては
129: (スフッ Sd7f-1fOb) 2023/11/29(水)12:34 ID:5J3ZheQvd(6/8) AAS
char ss[5];
char *p;
p = ss; 〇
p = &ss[0]; 〇
ss = p; ×
p = ss + 2; 〇
p = &ss[2]; 〇
130: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/29(水)12:41 ID:sncgHuaJ0(2/4) AAS
配列 a があるとき
a[i]=x
という式の左辺は配列に添字演算子を適用したもの (配列の要素) であって
これのことを「配列に代入」と呼ぶと語弊がある。
131: (スフッ Sd7f-1fOb) 2023/11/29(水)12:54 ID:5J3ZheQvd(7/8) AAS
しかし、食べたらまずそうなコテハンですね('_')
132: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/29(水)13:01 ID:sncgHuaJ0(3/4) AAS
最初はSCHEME餃子と名乗ってたけどSCHEMEスレが過疎ってて暇だから
CスレC++スレにも書く機会が多くて途中で変えた。
私としてはあり得なさそうな組み合わせの語を選んだつもりだったのだけど
はちみつを使った餃子のレシピはあるみたいだよ。
133: (スフッ Sd7f-RFe5) 2023/11/29(水)13:56 ID:5J3ZheQvd(8/8) AAS
配列には確かに構造体のようにごっそり代入できませんね
134: (ワントンキン MM3f-LVuv) 2023/11/29(水)14:07 ID:5SldHabaM(1) AAS
構造体に入れてしまえば解決
135: (ワッチョイ 7fab-LZ+J) 2023/11/29(水)15:10 ID:K/pKiYoT0(1) AAS
126 の表現を借りるなら

 3 は配列の要素に代入
 4 が配列に代入

こういう意識だわ
136: (ワッチョイ 5f79-/KuA) 2023/11/29(水)15:15 ID:UMPQWy8o0(2/2) AAS
結局てめーの日本語が気に食わないって話かよ
長文は読む気が失せるわー
137: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/29(水)16:16 ID:sncgHuaJ0(4/4) AAS
「配列は」という話をしているときに配列でなくする操作 (要素に対するアクセス) をすれば出来るみたいな話と混同されると困る。
138: (ワッチョイ 47e7-xen6) 2023/11/29(水)20:22 ID:odjcqh9C0(1) AAS
初心者のころ
char text[] = "Answer is _";
text[10] = 'A' + ans;

とか書こうとしてうろおぼえで

char *text = "Answer is _";
text[10] = 'A' + ans;

としたらエラーかワーニングになって
なんでできないんだよ!とずっと悩んでいたことがあるが
そういう話じゃないの?
139
(1): (アウアウウー Sa0b-6V65) 2023/11/30(木)06:41 ID:yOmuxKyka(1) AAS
char a[] = "A";
char *p = a;
は別物(同じだと説明している入門書があるならクソ本)
&a[0] を a と省略出来るだけ
もちろん sizeof p と sizeof a[0] と sizeof a は違う
140
(2): (ワッチョイ bfe7-2qxF) 2023/11/30(木)13:09 ID:EuLMofdV0(1) AAS
>>139
もう少しで完全に理解できそうなので
ガンダムで例えてくれ
141: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/11/30(木)14:54 ID:3QI4e6Tt0(1/5) AAS
> &a[0] を a と省略出来るだけ

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

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

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

外部リンク:ideone.com

#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"};
省11
148: (アウアウウー Sa0b-6V65) 2023/11/30(木)20:51 ID:h/B+JtY5a(3/3) AAS
アンカ忘れた
>>140
149: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-zy57) 2023/11/30(木)21:26 ID:3QI4e6Tt0(4/5) AAS
>>145
あくまでも言語仕様の理屈で言えばこうだという説明なのでその言語仕様が良いかどうかの意見は含んでないよ。
色々とアレな部分も多いってのは文句つけても仕方がないいまさらな話だし。
150: (ワントンキン MM3f-XlNP) 2023/11/30(木)22:06 ID:wy49Mw9yM(1) AAS
いやいや何を言っとんの?
利便性のためにそういう仕様にしてるんだよ
C書いてりゃさすがに分かんだろうよw
151: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-zy57) 2023/11/30(木)22:36 ID:3QI4e6Tt0(5/5) AAS
感覚的にはそんなに不自然には感じないんだけど
仕様の規則が変則的なのも確かなので
つまりは人間の感覚は不合理なものってことだ。
152: (ワッチョイ bf5f-2qxF) 2023/11/30(木)22:41 ID:0Cr+jEwb0(1) AAS
>>147
%zd は知らなかったわ。 勉強になった
153: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/12/01(金)00:42 ID:U5xjJXbM0(1/3) AAS
sizeof の結果の型は size_t で、
size_t は符号なし整数というだけしか規定されていない処理系定義なんだけど
unsigned int や unsigned long int の別名として定義されていることが多いせいで
それをあてにした形で説明している資料は割とある。
154: (ワッチョイ 5fad-F3mB) 2023/12/01(金)02:30 ID:oKQshtme0(1) AAS
>>145
> a[]のアドレスが欲しければ&aと書くだけでいいのに
俺はそっちのほうがややこしいと思うけどな

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

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

インデックスアドレッシングを [ ] 記号に当てただけと思うけど、そんなに難しいかね
156: (ワッチョイ a76b-onFz) 2023/12/01(金)05:55 ID:sCbOzpGc0(2/2) AAS
型の話かと思ってたら、いつの間にか 入門者がポインタを理解できない話 になった印象
157
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) 2023/12/01(金)14:51 ID:U5xjJXbM0(2/3) AAS
>>145
配列 a に &a としたときに得られるのは配列を指すポインタであって配列の先頭要素を指すポインタではない。
(型が違う。 アドレスを数値として見たら同じはずだけど。)

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

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

#include <stdio.h>

int main(void) {
int foo[2][3] = {
{1, 2, 3},
{4, 5, 6}};
printf("%d\n", foo[1][2]); // ふたつの座標みたいに見えるけど
// 式を各段階に分解すると……
省5
160
(6): (ワッチョイ 65d3-WD8q) 2023/12/05(火)07:30 ID:72+QzLj/0(1/2) AAS
c言語初心者です
質問させてください

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

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

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

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

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

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

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

というのは、これ↓ ?

外部リンク[html]:9cguide.appspot.com
> 苦しんで覚えるC言語

であれば文法解説のようなので、ファイル操作をしてはどう?
cat コマンドを作るとか。
188
(1): (ワッチョイ 65ff-WD8q) 2023/12/07(木)10:04 ID:NYiehhGh0(2/4) AAS
>>186
Windowsソフトを制作して当方の業務を効率化できればと考えています。
「既存コード」を読むですか、なんだか英語学酒のようで気が滅入りますね>
>>187
失礼しました。「覚える」でしたか。
ファイル操作がどこまでを指すのかわかりませんが高低水準入出力はすでに可能です。
189: (ラクッペペ MM3e-8Sbt) 2023/12/07(木)10:23 ID:aHfAXzyRM(1) AAS
業務効率の向上が目的ならC言語は回り道すぎる
他の言語選んだ方がいい気がする
190: (ワッチョイ 1163-8qzv) 2023/12/07(木)10:31 ID:HPax2zCP0(1/2) AAS
ファイル操作の課題出してあげようか
指定した二つのDirにあるファイルを同期させる
単にコピーするのではなく、タイムスタンプの新しいものだけをコピーする
新しいSubdirできていたら、中味があればDirごとコピーする
とりあえずは、新しく作られてファイルの同期まで、
削除については考慮しなくて良い
191
(1): (ワッチョイ b501-sZSb) 2023/12/07(木)10:39 ID:3PWWuEZS0(1/3) AAS
>>188
>Windowsソフトを制作して当方の業務を効率化できればと考えています。
早速これに取り組んだ方が良い
実用するものを作る方がモチベになる
192
(1): (スプッッ Sdea-GtvU) 2023/12/07(木)11:21 ID:6u4iKMo7d(1) AAS
C言語のスレッドで言う事じゃないがC言語以外の生産性の高い言語を学んだほうがよさそう
193
(1): (ワッチョイ 71cf-Gt6m) 2023/12/07(木)11:56 ID:QzDrEJVi0(1/2) AAS
>>184
CはOSのAPIを直接叩けることがメリットでもあるので、Linuxのプログラミング本を読んでコード書いてみるのが一番良いだろう
マルチプロセス、マルチスレッド、ソケットとか覚えるべき事は沢山ある
Cでやれば根本から理解出来る
194
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-1gjz) 2023/12/07(木)12:04 ID:FWY3NSUg0(1/3) AAS
(事務作業などの?) 業務効率化が目的なら Power Automate Desktop の活用を考えた方がいいと思う。
効率化の最初の段階は解決すべき問題を見つけることで、これをきちんと一度で洗い出すのは大抵の場合に出来ない。
雑に作って運用しながら改善するという手順をとるのがのぞましいが、 C で書くとそういう柔軟な体制がとりづらい。
195: (ワッチョイ 9a2b-ntmn) 2023/12/07(木)13:30 ID:zYUoekf60(1) AAS
「なにを作りたいのかが大事」ってのは良く分かるんだけど、普通の人が作りたいものって大抵Cじゃない方が…ってなっちゃうんだよな
196
(3): (ワッチョイ 65ff-WD8q) 2023/12/07(木)13:42 ID:NYiehhGh0(3/4) AAS
>>90
そういった事もできるんですねー
>>191
取り組みたいのは山々なのですがuiの作り方からわからないので入手できるバーションで解説されている書籍が欲しいところです。
>>192
基礎を大切にしたいのでcをはじめのうちは使っていきたいと考えています。
>>193
仰る通り根本を理解できればと思います。Linux本ですね。可能であれば簡単なものでおすすめを添えていただけないでしょうか。
>>194
グラフィック系のソフトを使う上で不便なところを楽したい、と言いますか
省2
197: (ワッチョイ 3514-I4o8) 2023/12/07(木)13:42 ID:P4JhXVL60(1) AAS
WindowsアプリならCじゃくて、せめてC++にしておけ
198: (ワッチョイ 6aa0-0M9k) 2023/12/07(木)13:43 ID:n9+uyfFo0(1) AAS
楽したい奴にはCは向かない
199: (アウアウウー Sa21-wVFe) 2023/12/07(木)14:18 ID:wNl2TimYa(1) AAS
C++は変な癖がつく
Cの方が絶対良い
200: (ワッチョイ b501-sZSb) 2023/12/07(木)15:23 ID:3PWWuEZS0(2/3) AAS
Cで全部書いてると大変だと思うよ
機能全部使わんでも良いからC++の方が現実的だよ
1-
あと 802 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.082s