C言語なら俺に聞け 145

■ このスレッドは過去ログ倉庫に格納されています
2018/02/19(月) 22:13:58.98ID:9/te2eSJ0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.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言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/03/14(水) 17:08:34.94ID:L/3+Hz1H0
>>476
よかったな
ほら、もう1000回

# アホ
478デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/14(水) 17:14:31.52ID:buZ+p9lOa
他の人でこいつの言うことわかってるやつ居るのか?
2018/03/14(水) 17:24:39.97ID:L/3+Hz1H0
犬に邪魔されて説明どころではない状態だからなあ
2018/03/14(水) 18:08:46.89ID:m9sKyebjH
情報持ってるふりして出し惜しみするのがマウンティングの基本
481デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/14(水) 18:24:47.12ID:2cAisCwCF
朝日新聞ですねわかります
2018/03/14(水) 18:29:37.08ID:L/3+Hz1H0
煽れば出ると本気で思っているならやってみな
この程度の話、マジこの程度にも付いて来れないアホの泣き声は物笑いの種だぜ
2018/03/14(水) 18:30:37.68ID:uMO7yRavM
>>469
無駄じゃねーよ、把握しろ
把握しやすく設計するのも能力のうち
2018/03/14(水) 18:32:36.61ID:uMO7yRavM
>>480
持ってるふりすらできてないだが...
どうみてもいっぱいいっぱいやん w
485デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/14(水) 18:41:41.61ID:buZ+p9lOa
ま、どうでもいいから>>436で書いたC言語の例外処理についてどういうものなのか書けよ。
2018/03/14(水) 18:52:07.48ID:L/3+Hz1H0
>>485
それよりあと1000回だぞ
急がないと日付が変わっちまうぞw
487デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/14(水) 19:21:46.36ID:buZ+p9lOa
わかったわかった。もう書かなくていいよ。かわいそうなやつだな。合掌。
2018/03/14(水) 19:45:37.85ID:IogLKo4e6
ID:L/3+Hz1H0に構うな
2018/03/14(水) 21:53:59.94ID:L/3+Hz1H0
収穫ゼロで引き下がる、みじめなヤツw
2018/03/15(木) 06:38:35.49ID:z1/gBAj5d
Cでエクセルの指定シートだけテキスト化できます?
491デフォルトの名無しさん
垢版 |
2018/03/15(木) 07:11:47.68
>>490
できますん

Excelがインストールされている環境で動かす前提であれば
COMコンポーネント (Microsoft Excel Object Library) を使えばいいが
C++じゃないとダメかも

自前でExcelフォーマットを解析して変換することも
膨大な工数を費やせば理論的にはできるだろうが
現実的には選択肢に入らないな
xlsx限定ならまだ楽かも知れんが

Excelを扱う部分は他の言語で開発してCからはそれを呼び出すのが普通かな
2018/03/15(木) 07:16:10.04ID:BwZLx9bwM
>>490
できるけど結構面倒だよ
ところでなんでC縛りなの?
なんかの苦行とか?
2018/03/15(木) 07:53:33.32ID:/GlmcHqY0
Cにあっていると思う
バイナリを呼んでキャストして
キャスト後も分岐ルートが色々あって
構造体はほとんど可変長
細かいものを組み上げるのは、たぶん Cが最適
494デフォルトの名無しさん (ササクッテロロ Spe9-N79+)
垢版 |
2018/03/15(木) 09:54:54.80ID:W95zVRhkp
FIFO(名前付きパイプ)で、大量データを分割して送受信したいです。



送信側
---------------------------
buff=malloc(datalen);
len=512;
pos=0;

do{
w=write(fifo,buff+pos,len);
pos+=w
datalen-=w
len=datalen < 512 ? datalen : 512
}while(0<datalen)
---------------------

こんなんでok?
2018/03/15(木) 10:35:33.07ID:v5sVsR9k0
・最初に飛び込んでくる段階で datalen が 分割サイズ(512) より小さい時の考慮
 (ループ中と同じ記述で良いのでは?)

・書けなかった時(w=0 だったとき) の脱出をケアする
ぐらいでしょうか
2018/03/15(木) 10:45:14.98ID:lf1N2aO70
SIGPIPEで死ぬぽ。
2018/03/15(木) 10:49:38.59ID:c+umNtGLp
マジックナンバー使うな。
2018/03/15(木) 11:01:51.80ID:OczprsBK0
>>496
シグナルは悪い文明! 粉砕する!
499デフォルトの名無しさん
垢版 |
2018/03/15(木) 12:00:46.26
>>494
実用的にするなら非同期送受信でいろいろケアしたほうがいいけど
学習用とか数人で使うテストツールとかならいいんじゃね?
500デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/15(木) 12:19:33.36ID:KGbgKLI3a
>>494
エラー処理が抜けてる。
501デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/15(木) 12:21:39.25ID:KGbgKLI3a
>>496
そうそう。しかしその辺はOSや接続先によって違うかも。
502デフォルトの名無しさん (ワッチョイ 25d4-N79+)
垢版 |
2018/03/15(木) 16:10:59.70ID:CR6uT/FI0
>>494
これの受信側read()のコードを求むm(__)m
503デフォルトの名無しさん (ワッチョイ ddd2-0FUd)
垢版 |
2018/03/15(木) 16:16:36.38ID:umqIWKjV0
【守銭奴】  株・FX・トレーダー  <キリストW再臨″>  史上初テレパシー演説  【救世主】
https://rosie.5ch.net/test/read.cgi/liveplus/1521080734/l50
2018/03/15(木) 17:42:18.79ID:v5sVsR9k0
プロトコルなんか無しに来たものを読みきるだけの話なら

allocsz = blocksz = 512
buff = malloc(allocsz);
use = 0;

for (;;) {
 w = read(FIFO, buff+use, allocsz-use);
 if (w == 0) { /* もう来ない */
  break;
 } else if (w > 0) {
  use += w:
  if (use >= allocsz) {
   // 器が尽きた
   allocsz += blocksz;
   buff = realloc(buff, allocsz); // 手抜きで realloc
  }
} else { /* エラーケアしてね */ }
}

buff に use バイトだけ収まってる
2018/03/15(木) 17:56:13.79ID:lf1N2aO70
>buff = realloc(buff, allocsz)

リークするからやめなよ。
2018/03/15(木) 18:05:35.40ID:c+umNtGLp
ヒープなんか使わずに配列にして自己管理せい。
507デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/15(木) 18:12:47.89ID:yyzFA25Ma
ヒープに配列用のメモリを確保しているわけで・・・
2018/03/15(木) 18:18:50.14ID:xYxZI4zx0
>>505
ん?realloc() はリークするのか?
2018/03/15(木) 18:24:18.46ID:mTrAuuczd
>>508
割り当てに失敗したらリークするよ。
2018/03/15(木) 18:34:07.27ID:xYxZI4zx0
>>509
確認した
buff = realloc(buff, allocsz) という書き方は、たしかに realloc() に失敗すると buff が null で上書きされてしまうのでまずいね
2018/03/15(木) 18:43:54.61ID:T5+tR1ew0
戻りを別の変数で受けて確認してから代入
2018/03/15(木) 18:51:29.92ID:mTrAuuczd
前、ANSI準拠のreallocは、mallocとfreeの代わりになるって話をしたよな。
だから、最初のmallocは、NULLに対するreallocで置き換えできるんだよ。
2018/03/15(木) 18:52:49.68ID:mTrAuuczd
それから、この場合はintよりもsize_tを使った方がいい。
514デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/15(木) 20:39:48.98ID:yyzFA25Ma
>>512
最初だけ、な。
515デフォルトの名無しさん (アウアウカー Sa09-agSD)
垢版 |
2018/03/15(木) 23:54:08.20ID:NmT4VXxza
素朴な疑問なんですが、Cでメンバ関数を関数ポインタで定義して、そのメンバ関数から引数なしにメンバ変数を参照することってできませんか?
516デフォルトの名無しさん (ワッチョイ e19f-hKdO)
垢版 |
2018/03/16(金) 00:14:09.63ID:LkWvbaD00
>>515
メンバ関数ってなんですか?
2018/03/16(金) 01:02:32.36ID:w3tL3lE3M
>>516
C++でいうところのメンバ関数を構造体の関数ポインタのメンバで実装したいという意味だろ。読解しろ。
>>515
むり。C++で見かけ上引数がなくても内部で引数で渡してる。
2018/03/16(金) 01:37:32.81ID:GsmhGHn70
>>515
https://mevius.5ch.net/test/read.cgi/tech/1434079972/39
メンバ関数 h() を返す メンバ関数 g() を定義
メンバ関数へのポインタ f を定義
メンバ関数へのポインタ f にメンバ関数 g() の返り値を代入
ここでメンバ関数へのポインタ f にはメンバ関数 h() が格納されている
->* 演算子を使用してメンバ関数へのポインタ f が指すメンバ関数 h() を実行、 h() ではメンバ変数 C::a を出力する
2018/03/16(金) 02:08:17.17ID:w3tL3lE3M
>>518
スレタイ見ろ
520デフォルトの名無しさん (ワッチョイ 4fb3-LmTb)
垢版 |
2018/03/16(金) 04:14:48.79ID:3pmuZEr10
ポインタ構造体変数をポインタ変数で扱いたい時って
&p(ポインタ変数構造体変数)-> member(メンバ名)
みたいにわざわざ一回通常変数に直してからアドレスになおさないかんの?
2018/03/16(金) 05:57:40.20ID:PrpOQ5WH0
(&p)->memberなんてまずやらん
p.memberで同じことができる
522デフォルトの名無しさん (ワッチョイ 4fb3-LmTb)
垢版 |
2018/03/16(金) 06:50:12.92ID:3pmuZEr10
>>521
それやったらコンパイラにそんな構造体変数ないぞって言われた
2018/03/16(金) 08:05:49.18ID:w3tL3lE3M
>>522
質問するときは変数の宣言も使う文脈も省略せずに書け
2018/03/16(金) 08:16:43.56ID:6+mGA4RRM
>>522
&p->membar
(&p)->membar
2018/03/16(金) 10:27:00.36ID:DfshN/+jp
型教えないと何やっても無理だろ。
あと。下手に型変換させると、奇数バイトからワード処理とかさせてしまい、石によっては例外処理が走るか暴走するよな。
2018/03/16(金) 11:29:31.94ID:07ayGtU0a
cのコンパイラ作るのにアセンブラの知識は必要?
2018/03/16(金) 11:38:22.80ID:ObjPIdw20
今なら、LLVMがあるからコード生成はそちらに任せるという
選択肢があるね。
2018/03/16(金) 11:59:50.08ID:GsmhGHn70
>>526
コンパイルというくらいだから、最後に機械語に落とし込むのにアセンブラの知識は必要になるのではないか?
2018/03/16(金) 12:01:10.57ID:rupS10t30
C++ to C コンパイラとか 生成物が機械語で無いのもあるんじゃね?

(昔そういうの欲しかった)
530デフォルトの名無しさん (アウアウカー Sa09-agSD)
垢版 |
2018/03/16(金) 12:19:28.27ID:56A/2jiga
>>517
Cには無理なんですね
ありがとうございます
2018/03/16(金) 12:33:16.00ID:GsmhGHn70
>>530
>>515 でメンバ関数という言葉を使うのだから C++ を仮定している、というのならば C++ では >>518 で可能
C で可能かどうかを問題にしているのであれば、>>515 のメンバ関数という言葉が自己矛盾
2018/03/16(金) 12:43:32.01ID:rupS10t30
C言語の範囲では 構造体のメンバ中に関数のポインタをもつまで
C++言語のメンバ関数の機構(暗に this ポインタが渡ってくる) のを
C言語でやりたけりゃ自前で引数に渡すしかない&その関数はポインタを引数で受けなきゃいけない
533デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/16(金) 12:47:14.28ID:0ILmeguTa
>>529
C++の初期のコンパイラはそういうやつだった。つまり、Cへのコンバータだった。
2018/03/16(金) 13:59:12.95ID:DfshN/+jp
ああ、各ファイルの先頭に構造体の領域宣言とか関数にいちいち構造体のポインタが追加されるんだよな。
535デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/16(金) 14:00:33.86ID:ITdJ1YV3a
そういや昔々のX68000のBASICにもCへのコンバータがあったな。
2018/03/16(金) 14:26:36.05ID:DfshN/+jp
俺は、6502アセンブラコードをCに変えるコンバータ作ったけどな。
2018/03/16(金) 15:25:35.34ID:relEB8IL0
アセンブリをprintfにパースするのって大変なのかな。
538デフォルトの名無しさん (アウアウカー Sa09-agSD)
垢版 |
2018/03/16(金) 15:57:57.02ID:ScqC3AYEa
>>531
ではどういう言葉なら齟齬なく伝わりましたか?
539デフォルトの名無しさん (アウアウカー Sad3-Y9Jj)
垢版 |
2018/03/16(金) 16:00:12.76ID:HNnsk+Eya
>>538
「関数へのポインタ」では?
それが構造体のメンバとしてあるわけだし。
2018/03/16(金) 16:12:40.83ID:GsmhGHn70
>>538
コード断片で示すのもよい、誰かがコードを補完してくれるだろう
541デフォルトの名無しさん (エムゾネ FF2f-0FUd)
垢版 |
2018/03/16(金) 16:25:31.83ID:3ma6aQHvF
アスペとの会話ってつかれるよな
2018/03/16(金) 16:57:51.61ID:PrpOQ5WH0
Cスレで「メンバ関数」だぜ?
それをアスペとか、どんだけボキャ貧なんだよ
543デフォルトの名無しさん (エムゾネ FF2f-0FUd)
垢版 |
2018/03/16(金) 16:59:08.32ID:3ma6aQHvF
>> 542
おまえがアスペか
544デフォルトの名無しさん (アウアウカー Sa09-agSD)
垢版 |
2018/03/16(金) 20:29:17.66ID:56A/2jiga
>>539
> Cでメンバ関数を関数ポインタで定義して
一応そのつもりで書いたんだけどなあ

アスペ基準に合わせようとした俺が悪かったのか
2018/03/16(金) 21:09:53.74ID:GsmhGHn70
>>544
・関数ポインタとは別に「メンバ関数」というテクニカルタームが C++ にあった
・C/C++ の区別がついていない人の質問も、ここではよくみかける

という背景があって小さな誤解が発生したまでのこと、気にするでない、苦しゅうないぞ
2018/03/16(金) 21:13:51.61ID:nemrSVupM
>>526
どうやってコード生成部分を作るつもりなんだよ...
2018/03/16(金) 21:59:39.71ID:PPQOkRTja
マシン語があれば充分のんじょのいこの
548デフォルトの名無しさん
垢版 |
2018/03/16(金) 22:33:58.96
Cコンパイラがマシン語を出力しなきゃいけないって誰が決めたの?🙄
2018/03/16(金) 22:51:53.37ID:SxfrRBUw0
ラノベ出力してくれるコンパイラってステキ
2018/03/16(金) 22:53:03.55ID:d0lIgzUw0
誰も決めてないしマシン語じゃなくてアセンブラのソース出すコンパイラはいくらでもあるし
2018/03/16(金) 23:46:17.13ID:ObjPIdw20
VHDL出してもいいよね〜
552デフォルトの名無しさん
垢版 |
2018/03/17(土) 00:28:10.69
シェルスクリプトとまでは言わないからPerlスクリプトを出力して欲しい
2018/03/17(土) 03:07:05.34ID:ZFtG2t0c0
C++の非仮想関数 == Cの普通の関数
C++の仮想関数 == structの項(vtbl)の項
554デフォルトの名無しさん (アウアウエー Sa93-0FUd)
垢版 |
2018/03/17(土) 04:35:29.26ID:YYJgzE2Qa
>>553
違うね
2018/03/17(土) 07:17:45.03ID:qzfhHg+K0
>>553
上の方の関数。普通の関数pointerで保持出来るの?
2018/03/17(土) 07:35:06.72ID:zYYcg2u/0
C++のextern "C"関数 == Cの関数
Cに普通じゃない関数ってあるんだっけ
557デフォルトの名無しさん
垢版 |
2018/03/17(土) 07:51:22.83
>>555
そんなの当たり前じゃん
まさかできないと思った?
2018/03/17(土) 08:58:53.90ID:qzfhHg+K0
>>557
先生、非仮想なメンバー関数をcの構文では保持出来ません。
例をご教示願います
559デフォルトの名無しさん
垢版 |
2018/03/17(土) 09:00:39.42
>>558
「上の方の関数」すなわち「Cの普通の関数」を
「普通の関数pointerで保持出来るの?」
→Cの普通の関数は、普通の関数ポインタで保持できます

質問文に忠実に答えただけだが、何か問題でも?
2018/03/17(土) 13:08:05.54ID:8xjJdoU40
Cにゃメンバーって言語レベルの概念は無いから、そういうのはコーディング時に人様がメンバーのつもりになる書き方を明示的にやらないとならないんだよな。
2018/03/17(土) 13:47:23.11ID:8tKqJ0BR0
namespace のことを脇においとけば
非仮想関数って FILE 構造体と その関数だべ
2018/03/17(土) 13:51:13.91ID:V9AqDEvW0
LLVMはまずパースレイヤーが中間言語出力して中間言語を解釈するレイヤーが各種コードに吐き分けるということができる。
3段階のコード最適化ができるはずだったが、ちょっと迷走してる。
2018/03/17(土) 16:56:54.32ID:x+XAbvy+0
>>557
struct A
{
void func() {} //C++の非仮想関数
};
void (*ptr)(); //普通の関数pointer
ptr = &A::func; //まさかできると思った?
2018/03/17(土) 18:20:57.82ID:qqOQsVrX0
>>555
できませんね
https://ideone.com/5sW1lw
2018/03/17(土) 18:25:10.24ID:6umCop+Md
クラス内部の関数をstaticにすると、、、
2018/03/17(土) 18:26:02.67ID:6umCop+Md
普通の関数みたいに参照できる。
2018/03/17(土) 20:05:40.42ID:x+XAbvy+0
ここはCスレということをお忘れなく
2018/03/18(日) 08:12:11.88ID:5MZOkfmV0
https://ideone.com/gSWZOR
上のコードを見てください。
sprintfを続けて使うと文字が一つも出力されません
なぜですか?
569デフォルトの名無しさん (ワッチョイ 7761-7BQk)
垢版 |
2018/03/18(日) 08:14:12.57ID:5MZOkfmV0
ちょっと間違えました。
上の投稿は無視してください
2018/03/21(水) 22:30:20.44ID:Pk5+CKOYa
ニキ
配列で array[i] と i[array] て同じナンスカ?
後者の違和感すげーあるんスけどこういう風に書くことのメリットってかどっちが普通なんでしょうか
2018/03/21(水) 22:33:57.97ID:MsjTjvgF0
ポインターはINTに変換できる事もある。
んで、arrayはhogeっていうアドレス値を持ってる。
iはhageていう数字を持ってる。
生の数字でhoge+hage=i+arrayである。
まぁ、後者の書き方は普通しない。
2018/03/21(水) 22:34:54.75ID:DQv7yGEy0
アセンブラではオフセット[レジスタ]が普通
どっちが普通なんてくだらねえことだ
2018/03/21(水) 22:36:13.14ID:D2465Z9CM
offsetofマクロの実装を見て見なされ
オフセット値の算出にポインタ使っているでしょ
2018/03/22(木) 00:04:45.10ID:dLiR/Xt3M
a[b] は *(a+b) のシンタックスシュガー
2018/03/22(木) 00:19:52.50ID:2FEQ/Wa30
>>435
そうともいえない

一見目的のない議論が、将来の偉材を今育てているのかもしれない
2018/03/22(木) 00:23:55.20ID:2FEQ/Wa30
>>441
知らないのか?
setjmp/longjmp は、かつては例外(exception) の標準的な実装方法だったんだよ
OS に構造化例外機能がなかったときは sjlj が主流だったんだ
■ このスレッドは過去ログ倉庫に格納されています