[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/22 11:29 / Filesize : 258 KB / Number-of Response : 1018
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け 158



1 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 12:11:46.61 ID:xxeaCAplM.net]
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
codepad.org/

C17
www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

C11
www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

75 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 00:45:04.90 ID:VBYSAUJW0.net]
rustがCの代替になる理由がメモリ関連のバグが減るからってのはどう言う事?

76 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 00:56:25.55 ID:jU2WrI4n0.net]
オブジェクトは複雑に依存関係が出来る場合もある。
参照 (C 的に言えばポインタ) が残っているのにオブジェクトの寿命が尽きていればダングリングが生じてしまう。
C では寿命の管理をするのはプログラマの責任であって、無効なポインタを使った結果は未定義。
そういうのを静的にチェックしてエラーにしてくれたらありがたいなぁというのを実現したのが Rust 。
そのかわり制約の記述がちょっと面倒くさくはあるんだが、どちらにせよ依存関係の管理は C でもやってたことではあるからね。
Rust で制約を書けないようならたぶん C でもちゃんとメモリ管理できてない。

77 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 02:01:49.66 ID:4l2NkMK40.net]
Ubuntuのgcc9で

size_t i = -100;
printf("%ld\n", i); // -100

と出力されたんですが、なぜsize_tで負数が扱えるんですか?
stddef.hでは

typedef long unsigned int size_t;

になってました
怖いです

78 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 02:09:51.98 ID:jU2WrI4n0.net]
>>76
扱えていない。
printf の書式指定と実際の型に不整合がないようにするのはプログラマの責任で、
それができていないときにどういう挙動になっても知ったことじゃない。

79 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 02:13:20.92 ID:4l2NkMK40.net]
>>77
printfですかなるほど

80 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 02:32:10.74 ID:4l2NkMK40.net]
>>77

あと

size_t n = -100;

if (n == -100) {
puts("-100");
}

これが真になるのは-100がsize_tに暗黙的にキャストされてるせいですかね

81 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 06:34:55.39 ID:J3jxIzMN0.net]
>>68
gcって思考放棄だろ
資源管理の中でメモリだけ後片付けを特別扱いできたからって何ってこと
資源管理にはアルゴリズムがいらないと思うのか?

82 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 08:24:31.68 ID:y6/SFoBh0.net]
>>76
-100は32bit 2の補数表現で0xFFFFFF9Cになる。
これはunsigned longで4294967196に相当し、符号なしのiにはこの値が入ってる。
ただprintfの指定が%ldと符号付きになってるので0xFFFFFF9Cを符号付きで表示したらやっぱり-100になる。

>>79
-100がsize_tに変換されるのではなく、どちらの値域も含めることができるように両辺がlong long intに拡張される。

83 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 08:24:40.15 ID:6BYLlYWJd.net]
>>79
signed longかsize_tかどっちかに暗黙的にキャストされる
-Wallすると警告出るだろうけど



84 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 13:06:53.33 ID:RA8YXgQS0.net]
サイズがおっきい側にあわせて拡張されるけど
拡張の際に符号付で拡張されるかは、拡張される側の型による でいいのかな?
左辺が size_t で 右辺が (__int16)-1 と (unsigned __int16)0xffff とで変わってくる

85 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 19:03:14.06 ID:4l2NkMK40.net]
>>81
なるほど、わかりました
ありがとうございます

>>81-83
比較の計算のために型を合わせるってことですね
納得しましたありがとうございます

86 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:09:27.93 ID:VBYSAUJW0.net]
>>80って>>57
よく分からん話し方が似てる

87 名前:デフォルトの名無しさん mailto:sage [2022/01/18(火) 07:11:42.98 ID:gNdHIxeHd.net]
おまえさん、匿名掲示板に向いてないな

88 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 11:09:59.27 ID:3tZE3jDgH.net]
#defineの効果を全体に適用させる方法は無いの?
書いてあるヘッダを取り込まなくても

89 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 11:14:24.09 ID:hwIlnS+y0.net]
コマンドラインで指定

90 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 14:48:47.15 ID:n7chvAG30.net]
>>87
ヘッダに書かないメリットは何?
暗黙の効果があると全体の見通しが悪くなるだけだと思うんだが

91 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 16:57:56.31 ID:JLPh4iSLd.net]
gcc -DUNKO
とかでコンパイル時分岐させるのはよくやる
これで "#define UNKO" 相当

92 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 17:35:43.55 ID:JsGuh7u5K.net]
>>90
細かいツッコミだが、
> これで "#define UNKO" 相当
"#define UNKO 1" 相当な

93 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 18:12:26.02 ID:Eie73JRu0.net]
この問題なんで答え0なん?
難しいhttps://i.imgur.com/TelzwbB.jpg



94 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 19:26:05.14 ID:8odJS2DdM.net]
%rbp の値を pushq でスタックに退避して他の処理をやって popq で下ろしてきてるから最初に入ってた 0 が出てくる

95 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 19:30:17.07 ID:6OdGtD3E0.net]
>92
なんか80286〜80486時代に見たアセンブラと違うorz


適当にググった予想

;レジスタ %rbp、%rbx の値をスタックにコピー
pushq %rbp
pushq %rbx

...

popq %rbx
popq %rbp
;コピーしておいた値を%rbx,%rbpに戻す

呼び出し前と同じ値になるだけだね。

96 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 00:21:23.88 ID:3gUGA9pL0.net]
>>92
0の入った%rbpをpushqして最後にそれをpopqして%rbpに戻しているから。
pushq, popq の数は合っているので他の値にはならない。

97 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 06:05:07.87 ID:mAmuRLc0a.net]
>>89

ライブラリの中なんで書き換えるのはちょっと

98 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 06:13:28.12 ID:mAmuRLc0a.net]
マイコン系のやつでヘッダのインクルードする前に
マクロ定義すれば使うピンを選択できるようになってるはずなんだけど

当然ながら別にコンパイルされるソースの中には効力がないと

99 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:37:29.62 ID:hGKgCtXH0.net]
「マクロ定義すれば使うピンを選択できるようになってる」メーカー提供の何かを使った
自前のライブラリで なんとかしたいと?

それライブラリの設計ミスじゃね?

100 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 12:31:56.24 ID:90hTt9580.net]
日立の悪口はやめろ

101 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 06:37:18.36 ID:Li0julahd.net]
ライブラリはコンパイル済みだから#defineしても無駄だろ

102 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:09:47.27 ID:iLK8Wqk90.net]
>>75
Rustは間違いがあるとコンパイラが色々指摘してくれる点でいいよね
例えばこの部分にこういうメモリの安全でない使い方をしていますよ、とか
ここにこんなデータ競合が発生していますよ、とか

103 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:32:17.82 ID:Ppmaq+BpM.net]
メモリ管理って言っても大層なことしないけどな
単一コンテキストなら対照的にctr/dtr置けばいいし、複数コンテキストならリンクリストに繋いでrefget/refputでいいし
まあメモリ上限やフラグメント、メモリプールとかやり始めるとなかなか面倒になってくるけど…



104 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:10:17.71 ID:z6fCP1j50.net]
Cのサーティファイ3級の問題集で
int main(void){
int i,j;
for(i=3, j=10;i-->0 && j-->0;);
printf("iは%d.jは%d\n",i,j);
return 0;}
でiが-1 jが7になるのはどうしてでしょうか?

105 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:34:45.68 ID:4bRyoani0.net]
>>103
i-->0 && j-->0が偽になるのはi==0, j==7のとき
iはi--で-1になってjの方は短絡評価でj--が評価されずにj==7のまま

106 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:37:25.63 ID:94PZZUq60.net]
課題や問題としてはアリなんだろうけど、こういうコードはキモいよなぁ

107 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:41:05.71 ID:R08bxH5q0.net]
ルールを知ってるか?という問題に
実用上どうのと言ってるやつ
わからんから負け惜しみにしか聞こえんぞ

108 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:44:03.93 ID:zNP9VNXb0.net]
条件に副作用がある式を書くと糞コードになるよ、って例かな

109 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:48:11.38 ID:z6fCP1j50.net]
>>104
ありがとうございます!大先輩! _(._.)_

110 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:49:35.56 ID:R08bxH5q0.net]
関数ポインタを使っただけで糞コードと言い出すやつと変わらんな

111 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 22:02:05.94 ID:iLK8Wqk90.net]
偶然だけどRustがCから唯一受け継がなかったのがfor(;;)文と前置/後置の++と--だね
Rustではfor(;;)の代わりにもっとわかりやすいイテレータを使うfor inになって
イテレータ利用で++と--を使う場面が激減したため +=1と-=1で十分となった

112 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 08:19:14.30 ID:1WN6znb60.net]
#include <stdio.h>

void main(){
 int a[5];

 printf("%d\n", &a[0]);
 printf("%ld\n", &a[1]);
 printf("%d\n", &a[2]);
}

結果:
1860819792
140735054207828 ←★
1860819800

1860819796になるところがprintfで%ldにすると★のようになりました。どうして?

113 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 08:40:51.15 ID:hGoB7Zi60.net]
%dはint、%ldはlong
LP64環境(Linux等)なのだろう

ってか、ポインタを%dや%ldで出すのが変なんだけどね
%pで出しましょう



114 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 09:28:40.94 ID:Fupo2oO/d.net]
挙動がわかっててやるのはともかく
なんで?になるのはギルティだな
担当教官が

115 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 11:12:04.00 ID:HehBpiSx0.net]
++は、アセンブラコードを意識していると思うよ

116 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 12:53:54.43 ID:cK3g3Gve0.net]
>>114
大昔はコンパイラが直訳だったからね
今はコンパイラが賢いからx++でもx+=1でもx=x+1でも同じ結果
さらにアセンブラ側もレジスタを介すinc命令ではなくメモリ上に直接add 命令で1加算とか
そもそもポインタの++なら対象の型が8/16/32/64bitに応じて1/2/4/8をaddとか
だからアセンブラは今は関係ないし言語としても++がなくても影響なくなってしまってる

117 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 07:31:33.24 ID:Tsd33EHWd.net]
ポインタから次々読んでいく場合
a=*(p++);
のほうが便利

118 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 07:43:00.03 ID:y3i0lS6h0.net]
格好つけるダサいやつ

119 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 08:12:12.92 ID:LR3qN1W70.net]
一種のイディオム化しているがふつうその括弧はつけないな。

120 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 08:17:06.42 ID:2Fs3iqwoM.net]
まあ、あっても悪さしないし心配なら付けるのは正しいと思う
>>118の言う通りよく見るイディオムになってるので違和感はあるけど

121 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 08:25:24.42 ID:D0DTDHxMd.net]
char *src, *dst;
while(*dst++=*src++);

みたいな書き方はよく見るけど
最適化とか存在しない古いコンパイラのための書き方だよなといつも思う

122 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 09:16:27.33 ID:grc2q108d.net]
いい意味の面倒くさがりだよ

123 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 09:23:04.37 ID:Tsd33EHWd.net]
最適化だけの問題ではないぞ

while(*dst=*src){dst++;src++;}

では変数名を変更する必要が出た場合2ヵ所づつ書き換えねばならない
→ミスにつながる

それにループが終わった後でdstとsrcは最後の要素を指しているので余計なインクリメントが要るかもしれない



124 名前:デフォルトの名無しさん [2022/01/28(金) 11:00:14.06 ID:yXxqNK5h0.net]
初心者や他言語ばっかりやってた人の誤読回避は考慮する?

125 名前:デフォルトの名無しさん [2022/01/28(金) 11:17:11.26 ID:udo1auGz0.net]
この頃発見した printf() のフォーマット

% の後に # を付けると x 変換の時に頭に 0x を付けてくれると知り、早速こう書いてみた。

printf("%#x\n", 0xab);

0xab が出力される。

これはいい、と思い16進4桁出そうとしてこう書いた。

printf("%#04x\n", x);

すると 0x は付いたがその後が2桁になった。どうやら 0x の部分の桁数も含めなければいけないようだ。仕方がないのでこう書き直す。

printf("%#06x\n", x);

やった!できた!

しかし幸せは長くは続かない。やがて x に 0 が入った状態でここを通過。以下の出力を得る。

000000

126 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 11:22:43.44 ID:dRbZojn90.net]
Cは初心者向けではないし、可読性は考慮していない
やりたい

127 名前:魔さっとコード化出来る人に向いている言語 []
[ここ壊れてます]

128 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 12:25:59.28 ID:6cofCgvGM.net]
>>124
そんなフラグ初めて見たけど、仕様見たら確かに0以外の時に0xを付加するんだな
いまいち使いづらい

129 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 12:32:45.35 ID:obJ/SPWt0.net]
文字列のエスケープシーケンスでバイナリ直接したんだけど、例えば"\x10"の後に"a"という文字を続けようとして"\x10a"って書くと値が大きすぎるってエラーになる。
"\x10" "a"と分割するしかない?

130 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 12:35:51.06 ID:grc2q108d.net]
Cはプログラマを信頼する言語だ
悪いことをさせない制限より
自由度を優先させている

怠けるやつより進歩する者を優先するのもしかり

131 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 13:19:26.12 ID:vyOOr9LZM.net]
>>127
> "\x10" "a"と分割するしかない?
それしかなさげ
8進表現は最大3文字となってるから "\0123" は '\012' と '3' になるけど16進表現には桁数の制限がないので "\x10a" を1文字に解釈しようとしてエラーになる
char * の文字列は2文字、wchar_t の文字列は4文字までにすればいいと思うんだけど

132 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 13:57:54.02 ID:obJ/SPWt0.net]
>>129
ありがとう。やっぱりそうなのね。
ESCシーケンスが書きにくくてしょうがないわ。

133 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 16:18:28.78 ID:hT9TavA00.net]
>>127,129
マイクロソフトのドキュメントにも言及があるのを見つけた。
https://docs.microsoft.com/ja-jp/cpp/c-language/octal-and-hexadecimal-character-specifications?view=msvc-170
不格好だけど C はそういうもんだからしょうがないね。



134 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 16:49:19.01 ID:obJ/SPWt0.net]
>>131
わざわざ調べて頂いてありがとうございます。
 #define ESC_UP "0x1b" "A"
のようにマクロで逃げることにしました。
使う側では
 printf("今からUP" ESC_UP "UP完了");
と少し気持ち悪いですが。

135 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 17:55:44.80 ID:sJpZ8snBM.net]
ESC しか使わないなら
printf("今からUP\033AUP完了");
とかでもいいかも
今更8進数かよって感じもするけど…

もしく

136 名前:
#define ESC(c) "\x1b" #c
printf("今からUP" ESC(A) "UP完了");
くらいかなぁ
[]
[ここ壊れてます]

137 名前:unko [2022/01/29(土) 18:53:20.85 ID:cvNc/NLr0.net]
ごめんなさい高校のc言語の課題で乱数とじゃんけん対決をして結果と手を動的配列に格納して最後にまとめて結果を表示するというやるをやってるんですが
whileループで代入した結果とその後のforループでカウントしながら表示している値が違うみたいでずっとプログラム見てても何が原因なのか分からないのでわかる方いたら教えて欲しいです.
https://github.com/unko-c/kadai/blob/main/kadai.c

138 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 19:18:32.81 ID:mAwlWFlr0.net]
>>134
scanfで表示出力は出来ません。分けましょう。
printf("times: "); scanf("%d",&j);

しかし、それでもまだ問題がある。

139 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 19:22:51.55 ID:wjo4lb340.net]
44: どっから配列が出てきた

デバッガ使えばプログラムの動き見るの捗るから使え
使えないなら怪しそうなとこにひたすらprintfを埋めろ

140 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 20:13:03.39 ID:mAwlWFlr0.net]
(&janken->man)[i] = man;
printf("man:%2d ",(&janken->man)[i]);

構造体配列のメンバーアクセス方法が間違ってる

case 0:
  countDraw++;
この直後にはbreak;を入れること(全てのcase文に適用)

while(i<=j && man<=2 && man>=0) {
ここにmanを入れる意味は?
入力範囲チェックを意図するなら、ここではなく
scanf直後に、範囲外ならcontinueさせる方が良い

無駄もあるけれど、この辺を直せば動くんではないか?

141 名前:unko [2022/01/29(土) 20:51:58.61 ID:cvNc/NLr0.net]
>>137
ありがとうございます
break;忘れてたので実行結果変でしたね
ポインタとかは最近やり始めてまだよく分かってないのでちゃんと勉強しておきます

142 名前:unko [2022/01/29(土) 20:54:58.88 ID:cvNc/NLr0.net]
>>136
一応whileの直前当たりでかろっくで配列確保してます

143 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 01:38:43.74 ID:05k5AmyC0.net]
44: (&janken->man)[i]
janken->man は配列ではない。
jankenは配列とみなせるポインタだが関係ない

たぶんコンパイルを通すためにこの形になってるんだろうけど
janken[i].man とするべき



144 名前:デフォルトの名無しさん [2022/01/30(日) 07:23:03.99 ID:qcbJpmhr0.net]
ソケット関連の質問です。
この前ドメイン名取得してきたのですが、(練習のため)
webブラウザにurlを打ち込んだ時に自分のパソコン内のサーバーソケットにつなげて
htmlで”HelloWorld”と吐き出したいのですが、ドメイン名IPアドレスの紐づけ
ってどの段階でやればいいのでしょうか?
ソケットを作るときにするのかなと思っているのですがそもそもこの考え自体が間違っているでしょうか?

145 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 08:48:53.30 ID:v3wXXGPY0.net]
名前-IPを関連させる(D)DNSの話であって、ほぼソケット関係無いような

146 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 09:18:12.24 ID:uPZ//xKSM.net]
>>141
> ドメイン名IPアドレスの紐づけ
紐づけと言うか解決はgetaddrinfo()でやる
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/getaddrinfo.3.html
文字通りの紐づけなら>>142が言うようにDNSの話だからシステム管理者なりに聞いてくれ

てか、まずOS書いてくれ

147 名前:unko [2022/01/30(日) 09:28:39.21 ID:ft1MsLjp0.net]
>>140
ありがとうございます
構造体のポインタを宣言してるのでその表現が正しそうですね
以前の課題だと構造体のメンバのポインタに配列を割り当てていたのでそれと同じように何も考えないでアロー演算子でアクセスしちゃってました

148 名前:デフォルトの名無しさん [2022/01/30(日) 10:55:49.17 ID:qcbJpmhr0.net]
>>142>>143
ありがとうございます。
Windows11とVC2021でc++です。
DNSもっと調べてきます。

149 名前:デフォルトの名無しさん [2022/01/30(日) 11:46:45.94 ID:qcbJpmhr0.net]
VSやった・・・

150 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 12:38:44.79 ID:x0r2XrqVM.net]
VSに2021はない…

151 名前:デフォルトの名無しさん [2022/01/30(日) 15:19:39.90 ID:wVIChEm/0.net]
>>134
33行目と34行目は入れ替えないと構造体の配列のメモリ確保が一つ分少なくなる。

152 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 15:27:39.02 ID:wVIChEm/0.net]
>>141
ソケットで connect() する前には接続先アドレスが分かっている必要があるが、
そのアドレスを調べるのは connect() 前のどの時点でやっても良い。
というか後々ソケットのconnect()で利用するかどうかとは無関係に調べて良い。

153 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 19:53:38.68 ID:F7MhehSXM.net]
このスレの猛者が書く>>134の課題ってどんなコードになるんやろ?



154 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 21:12:41.91 ID:olbUxhsiM.net]
初級クラスであっさり書ける

155 名前:デフォルトの名無しさん [2022/01/31(月) 16:42:11.29 ID:uGjzp6vA0.net]
VisualStudioをつかっています。
_MSC_VER
これって(マクロ?)VSのバージョンを表す定数を返すと言うことで間違いないでしょうか?

156 名前:デフォルトの名無しさん [2022/01/31(月) 16:56:08.70 ID:uGjzp6vA0.net]
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
これの意味がよくわからないのですが
(_MSC_VER)というマクロが使えて
かつ
その値が1200以上であるなら
#endifまでをコンパイルする。
# pragma onceはこのコードが乗っているファイルと同名のファイルが
既にインクルードされているならこのファイルをインクルードしないと言うことで
合っているでしょうか?

157 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 17:32:45.71 ID:eqy2NGbAd.net]
合ってる
https://docs.microsoft.com/ja-jp/cpp/preprocessor/predefined-macros?view=msvc-170

VisualStudioの1200以降の環境ならごにょごにょするって時に使う

アンダーバー+大文字で始まるマクロ(変数も)はコンパイラ側で定義するので
勝手に定義してはいけない

158 名前:デフォルトの名無しさん [2022/01/31(月) 17:46:24.93 ID:uGjzp6vA0.net]
ありがとうございます。
メンタルやられて退職してしまったので、のんびりとブースト読んでいきます。

159 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 18:19:27.99 ID:JSQ8RYi00.net]
自前でユニークな識別子考える必要のないインクルードガードがあるなら
そっち使ったほうが間違いないしね

160 名前:デフォルトの名無しさん [2022/01/31(月) 18:47:08.25 ID:uGjzp6vA0.net]
ヘッダファイルの先をたどって行ってよくわからなくなったのですが
ヘッダファイルが全部コメントアウトされているのですが
これはインクルードするときにコンパイラに無視されますよね?
boost/config/user.hppをインクルードするときに最初にインクルードしますって
コメントして書かれてあるんですけど、使うかもしれないから一応置いておいているのでしょうか?
それとも//を外してコンパイルすることが出来るのでしょうか?

161 名前:デフォルトの名無しさん [2022/01/31(月) 19:08:10.67 ID:uGjzp6vA0.net]
もしかしてその名前のファイルがインクルードされているかが重要で、
インクルードする中身は関係ない的な感じでしょうか?

162 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 15:26:31.67 ID:SDlFynth0.net]
C言語において配列のリテラルはchar型(文字列)以外存在しないのでしょうか?
例えば以下のようにchar型ポインタを初期化すると、リテラル値"test"の先頭アドレスがstrに格納されると思います。
char *str = "test";

ですが、これを次のようにint型にするとエラーになってしまいます。
int arr = {10, 20, 30};

これは{10, 20, 30}が配列を表していないということでしょうか?

163 名前:デフォルトの名無しさん [2022/02/13(日) 15:48:05.55 ID:YeyzPZAO0.net]
初期化は普通の代入と違ってプログラムを書き易くするために特殊な表現になっていることがあると覚えておいた方が良い。

で、その int 型の初期化だが、{10, 20, 30} は int の配列変数に対する初期化ではないからエラーになる。
int arr[] = {10, 20, 30}; ならエラーにならない。



164 名前:デフォルトの名無しさん [2022/02/13(日) 15:49:17.27 ID:YeyzPZAO0.net]
ごめん。間違えた。

> {10, 20, 30} は int の配列変数に対する初期化ではないから



> {10, 20, 30} は int の配列変数に対する初期化だから

165 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 16:21:43.07 ID:nD0XyBZB0.net]
>>159
一応はコンパウンドリテラル (複合リテラルとも言う) というものがあってこう書けなくもない。

int *arr = (int []){1, 2, 3};

だけど文字列リテラルの生存期間が常に static なのに対してコンパウンドリテラルは
それが現れる場面に応じて static な場合と automatic な場合があるのでちょっとわかり難いね。

166 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 17:48:50.08 ID:SDlFynth0.net]
配列型のリテラルは、char型のみ使用できる特殊な形と言うことですね。
ありがとうございました。

>>159の下の文のarrは*arrの間違いでした。失礼いたしました。

167 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 00:39:00.54 ID:Pf4iignB0.net]
文字列リテラルはアドレスを持つので左辺値ですよね?
いま読んでいる参考書に右辺値だと書いてあるのですが…

168 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 00:44:54.40 ID:Pf4iignB0.net]
というか、右辺値と左辺値の違いってアドレスを持つか持たないかの違いだと思っていたのですが
違うのでしょうか?

169 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 00:55:29.91 ID:BGIr1fua0.net]
え、右辺値と左辺値の違いってイコールの左辺になりえるかどうかじゃねーの?

170 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 01:39:48.34 ID:e2U3ATgO0.net]
>>164
左辺値です。「アドレスを持つか」という分類でだいたい間違いないと思います。

>>166
「イコールの左辺になりえるかどうか」は語源の話としては正しいですが、現状の語義は違ったものになっています。
規格の "lvalue" に対する脚注でも「オブジェクトに対する "locator value" を表すものと考えたほうがよいだろう」とされています。

171 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 06:54:02.60 ID:uDi/Wll10.net]
>>167
すみませぬ。
アドレスを持たないってどういうのを言うんですか。

172 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 08:47:32.72 ID:liZElF75d.net]
書き込み可能かどうかもあるだろ

173 名前:はちみつ餃子 mailto:sage [2022/02/20(日) 08:56:21.85 ID:eF5vmZw/0.net]
>>164
配列は lvalue だが、ポインタに変換する規則が適用された後は lvalue ではない。



174 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 09:33:21.73 ID:e2U3ATgO0.net]
>>168
たとえば数値リテラルや算術演算子の結果など。これらに対して "&" でアドレスを取ることはできない。

175 名前:はちみつ餃子 mailto:sage [2022/02/20(日) 09:45:32.09 ID:eF5vmZw/0.net]
>>168
仕様上の理屈ではアドレスをもたないものが右辺値 (rvalue) なんじゃなくて右辺値がアドレスを持たないので逆なんだが……。
たとえば
int a=1;
a=2;
というように変数に代入できるが、
1=2;
という式がおかしいことは感覚的にわかるだろう。
a には 1 が入っているんだから a を評価すれば 1 になるはずなのに 1=2; と同じではない。
このとき a は a に入っている値のことであると同時に場所としての性質を持つ。
アドレスを持たないのが右辺値であるのとは対照的にアドレスを持つ (場所としての性質を持つ) のが左辺値だ。
左辺値は現れる文脈によって「値 (右辺値)」に変換される。
左辺値が値に変換される場合とされない場合が上手く使い分けられているから代入が成立するわけ。

一例をあげると以下のような式の途中経過として現れる一時的な値は右辺値であるので、
単項 & を適用できずにエラーになる。

#include <stdio.h>

int main(void) {
int a=1, b=2;
printf("%p\n", &(a+b)); // a+b の結果は rvalue なので & を適用してアドレスを知ることは出来ない
}






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef