C言語なら俺に聞け 153

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 5fba-LL4R)
垢版 |
2019/08/17(土) 23:02:42.00ID:tN5mSQYg0
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/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 152
https://mevius.5ch.net/test/read.cgi/tech/1560763630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/08/19(月) 01:35:14.42ID:HWxct0dM0
>>10
D
2019/08/19(月) 02:31:19.64ID:WV8MsfnG0
コンパイルもリンクも正常に動いているようだぞ
生まれたのがバグじゃなくて良かったな ha ha ha
13入門 (ワッチョイ d901-QMAU)
垢版 |
2019/08/19(月) 07:50:31.64ID:AfRfI86I0
http://program-lecture.info/c_structure5.html

ここのサイトを見ながら学習しているのですがこのshowStatus関数では何故int配列を
int型の仮引数で受け取れてるのでしょうか?配列は配列かポインタでしか受け取れないと思ってたんですが
その認識は間違ってますか
よろしくお願い致します。
2019/08/19(月) 08:28:31.64ID:kSnvMIS70
>>13
showStatus()はint型でもint型配列でもなくcharacter型を受け取ってるようだが?
2019/08/19(月) 09:48:04.61ID:O1nZQbpw0
showStasus() の引数は struct person 型の実体を受けてる

main では
 struct person 型の配列を用意 party[]
 配列の各要素 party[0], party[1] のぞれぞれについて showStatus() を呼んでいる

本質的には
 void foo(int arg);
 int main() {
  int array[2];
  foo(array[0]);
  foo(array[1]);
  return 0;
 }
これと同じ
2019/08/19(月) 17:57:43.49ID:7obxXURV0
>>15
理解出来ました。ありがとうございます( ;∀;)
2019/08/19(月) 20:10:40.78ID:GYeBbzEk0
>>8
あのコードは今となっては時代遅れだ。意味がない。
2019/08/19(月) 20:19:09.86ID:PrhOfqin0
先生書き直さないんですか?w
2019/08/19(月) 20:20:07.30ID:GYeBbzEk0
>>10
産婦人科へGo!

https://www.mylohas.net/2018/08/173369menstruation.html
20デフォルトの名無しさん (アウアウカー Sa5d-KcV4)
垢版 |
2019/08/24(土) 22:48:02.26ID:UVaZe+22a
下のコードの部分を実行すると、最後の行だけ2回表示されます。
理由はなぜでしょうか?また、最後も1回にするにはどう変更したら良いでしょうか?
よろしくお願いします。

http://codepad.org/WCL1vHLd
2019/08/24(土) 23:20:14.88ID:xKwct0SAM
>>20
if ( !fgets(buf, sizeof(buf), fp) ) break;
2220 (ワッチョイ f125-KcV4)
垢版 |
2019/08/25(日) 00:34:55.25ID:9+tsViui0
>>21
サンクス!

While 行と fgets 行の間にその行を入れたら1回になりました。
修正はこれで良いのでしょうか?
2320 (ワッチョイ f125-KcV4)
垢版 |
2019/08/25(日) 00:46:09.40ID:9+tsViui0
>>22 の修正だと最後の行以外にもだいぶ表示されなくなってました。
どうするのが正解なのでしょうか?
2019/08/25(日) 00:52:09.44ID:uvOm2rq20
良いのか?って聞かれると
色々言いたくなる奴が大勢出てきそう
2019/08/25(日) 01:04:15.99ID:uvOm2rq20
>>23
//while ( !feof(fp) ) {
while (fgets(buf, sizeof(buf), fp)!=NULL){
//fgets(buf, sizeof(buf), fp);

こんなんでどうか
2620 (ワッチョイ f125-KcV4)
垢版 |
2019/08/25(日) 03:58:18.71ID:9+tsViui0
>>25 うまくいきました! Thanks!
やっぱり俺に訊けスレですね。ここの人達はすごい。

if ( (fp = popen(cmdline,"r")) == NULL ) {
perror ("can not exec commad");
}
while (fgets(buf, sizeof(buf), fp)!=NULL){
printf("%s", buf);
}
pclose(fp);

最終的にこうなりなした。助かりました。
2019/08/25(日) 04:09:39.00ID:SpCWKyo10
Ruby では、Windows の、powershell, clip コマンドも呼べる。
UTF-8, CP932 の文字コード変換もできる

クリップボード内の複数行文字列の、各行の先頭・末尾から、
連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
2019/09/12(木) 14:34:32.33ID:PzZxK66KM
defineマクロで以下をやりたいです。

struct my{
int d0 =0;
int d1 =0;
int d2 =0;
int d3 =0;
int d4 =0;
}:

struct my val;

val[0:2] = (1, 1, 1);

と入力した時にvalのdata0〜data2に1が入るようなマクロはどう書けばいいですか?
2019/09/12(木) 18:39:59.73ID:7fKDA9wF0
__VA_ARGS__ つこて2段呼び出しだな
qiita.com/saltheads/items/e1b0ab54d3d6029c9593
2019/09/15(日) 10:20:29.94ID:Y/GLm+KZ0
>>29
ありがとうございます。
リンクを参考に、可変引数にするマクロまでは出来ました。(作った関数が間違えていたらすみません。)

struct my def2(struct my val, int s, int e, int d1, int d2){
int *p = val.d0;
*(p+s) = d1:
*(p+e) = d2;
return val;
}

/*def3省略*/

#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define DEF(val,s,e,...) GET_MACRO(__VA_ARGS__, def3, def2)(val,s,e,__VA_ARGS__)

ここから、表記を変える方法が分かりません。
下のようなことをしたいのですが、このように書くとコンパイルエラーになりました。
どう書けばいいでしょうか。

#define VAL[A:B]=(...) DEF(VAL,A,B,__VA_ARGS__)
2019/09/15(日) 12:30:40.49ID:58rKn0L90
マクロ使わずにこれで十分だろ。

typedef struct my;

val = (my){1,1,1};
val = (my){1,1,1,1};

以下のようにはできるけど、
マクロの多用は誰もソースを読みたくなくなるから避けたほうがいいよ

#define SET(v,...) v=(struct my){__VA_ARGS__}
SET(val, 1, 1, 1)
2019/09/15(日) 13:05:57.26ID:Y/GLm+KZ0
>>31
すいません、説明不足でした。
どうしてマクロかと言いますと、3つのデータを入れたい場所が0〜2だけではなく5〜7や2〜4の場合もあるからです。
2019/09/15(日) 13:41:31.71ID:58rKn0L90
#define SET(x,s,e,...) memcpy(((int*)&val)+s,&(int[]){__VA_ARGS__},sizeof(int)*(e-s))

SET(val, 1, 3, 1, 1)
SET(val, 1, 4, 1, 1, 1)

部下がこんなコード書いてきたら突っ返すわ
2019/09/15(日) 15:47:59.75ID:v7T7Pyv90
ID:Y/GLm+KZ0 が上司だったらと想定してみよう。
2019/09/15(日) 15:59:14.90ID:58rKn0L90
自分の考えが浅はかでした。申し訳ありません
2019/09/17(火) 11:43:21.23ID:tz0JLczQ0
>>34
背中を撃たれてしまうのでは・・・?
2019/09/17(火) 13:01:08.68ID:pZqZMIzxM
うーん、どうにかして上のように[]を使って書き換えることは出来ないのですかね。
ちなみに下のようにして全パターン定義しようとしたらエラーでした。何故でしょうか。

#define val[0:2]=(...) DEF(val,0,2,__VA_ARGS__)
2019/09/17(火) 14:46:00.52ID:nfIIVgp70
マクロ諦めてインライン関数にしたら?
2019/09/17(火) 19:09:34.89ID:g1BlUkdva
>>37
なぜって、#defineを使用するための構文を完全に無視してるからだよ。こちらが思ったことを都合良く解釈してくれるわけでなく、構文通りの単純な置換をしてくれるだけだよ。
一度ちゃんと調べておいた方がいい。
2019/09/17(火) 19:57:33.48ID:pZqZMIzxM
>>39
なるほどです。
では、[]や:を利用して独自の構文を定義するのはC言語において不可能、ということですか?
2019/09/17(火) 20:37:25.67ID:g1BlUkdva
>>40
不可能。やるなら自前でプリプロセサでも書けばいいが、そんなことするくらいなら、ソース上に書くのではなく独自のデータファイルとそれを読み込んでデータを初期化するような処理でも作れば?
2019/09/17(火) 20:47:01.62ID:pZqZMIzxM
>>41
ありがとうございます。
最終的な目標は、Cを他言語ライクな記述でコーディングすることなので、プリプロセッサについて調べてみます。
43デフォルトの名無しさん (アウアウウー Sa63-0qvw)
垢版 |
2019/09/17(火) 22:44:02.30ID:WDh8MszDa
新言語作った方が良さそうな。
初期のC++みたいにC言語へのコンバータとして作っちゃえば楽だと思う。Cと同じで良い部分はほとんど素通しで行けるし。
2019/09/18(水) 03:52:29.58ID:YwguJHoc0
そこまでしてCに拘る意味がわからない
2019/09/18(水) 05:50:30.71ID:A+b/Im8h0
あの変態的にC言語には見えないObjective CでさえほとんどプリプロセッサでCに変換してからコンパイルしてたと聞くので、やろうと思えばできるんだろうね。
46デフォルトの名無しさん (ワッチョイ ff8c-e0wG)
垢版 |
2019/09/18(水) 07:02:57.91ID:ik5RQtCe0
yaccとlexを使えばできるだろう。たぶん
2019/09/18(水) 08:32:22.55ID:cLmp+ocZM
独自言語を開発したときなんかはとりあえずCに変換するというのはわりとある話。
コード生成とか最適化とか考えずに済むから。

昔、独自じゃないけど、とある言語からCへのコンバータ作ったよ。
楽しかった。
2019/09/18(水) 08:40:59.31ID:vdXxwq0s0
コンパイル前にソースを別のソフトで変換、置き換えさせて・・・
2019/09/18(水) 09:00:45.02ID:qgVAc8a30
そしてCにもどるネズミの嫁入り
2019/09/18(水) 12:47:21.47ID:1Vhu13ZT0
BNFとyaccのお勉強から
2019/09/19(木) 15:34:03.81ID:yCvdPLl+M
#define ARR_NAME(n) arr##n

int arr0 [] = {0,0,0};
int arr1 [] = {1,1,1};

int* select_arr(int i){
return ARR_NAME(i);
}

これはどうしてコンパイルエラーになりますか?
ちなみにreturn ARR_NAME(0)だと正しく動きます。
2019/09/19(木) 16:38:05.33ID:1k0/HGmS0
タイミングの問題だ
#defineはコンパイル前に解釈されるが
関数仮引数の値は実行時に渡される

実行時とはコンパイル〜リンクまで全て終わった後の話だ
だから関数仮引数の値を#defineで置き換えることができない
2019/09/19(木) 17:34:18.54ID:fzYUHnaEd
arriという変数はない。プリプロセッサでは変数の中身までは見られない。
2019/09/19(木) 18:13:33.75ID:yCvdPLl+M
分かりやすかったです。ありがとう。
この機能の代替として良き方法はありますか?配列のdimを増やすしかないですか?
2019/09/19(木) 18:22:24.66ID:fzYUHnaEd
次元を増やすのがベストだろう。
2019/09/19(木) 18:23:38.47ID:QG4rugRZ0
配列変数名はコンパイル時には分かっているのだから
その配列のアドレスを格納したポインタ配列を用意してやる
2019/09/19(木) 18:24:58.88ID:Hv2f/JNH0
>>55
これに1票。
2019/09/20(金) 15:15:19.52ID:X5/vL2CD0
                            __、
                iー'゙゙゙゙''''ー-,/^´  ゙';
                |      ゙ゝ....‐  .}
                !           |,
                   i____________......r'".'''゙ヽ  . ..,,、
                ,,. -/        `'ー  |      .' 、
             ,..-'"  l゙          __.. -''′     ./
        . ,/     .`''''〜- ....---''''"゛        ,/
       /.,,                           ,,..r'"
         `''ー、,、                 _,,,-'"  `!、
               /'r‐、          ,/´ /゙゙',    ヽ
            / レ'゙ ´゙リ´ . `^^゙゙゙゙゙゙厂j  .! │    . l
           /  |  .l.      丿/ / . /      !
            l  !  .,,....--ー'''''''″ /  .| (、     . !
         _  .ィ‐¨゙゙'广゛ ......    ./  ,ノ.l.  `'ィ ..,,_/
     ..-‐'"゛  'l_゙'ーノ`' ..........,,_ .,, -"  / │   .!   ゙''''-.
   .i''i       ヽ、          /  .!    !
   ,)イ      : ..,,,,,>u;;;;,、.__ _,,,.. /    |    "
  / . 、          !  .`             |
     !,                     ,!
     ."                        ゙
2019/09/20(金) 17:51:25.98ID:/93Uxf6sM
それは増やさなくていいから
2019/09/23(月) 14:43:33.00ID:995jKG080
グローバル変数を宣言する時、ヘッダファイルでextern int hogehoge;ってするよね。
*.cからヘッダファイルをincludeすると、
extern int hogehoge;を毎回書いたのと同じ状態になるの?
2019/09/23(月) 14:47:57.02ID:LA+tlTim0
そうだよ
includeはファイルをそのまま展開するだけ
2019/09/23(月) 15:58:05.13ID:ZLX7TvLd0
>>60
被参照側(メイン)に int hogehoge と書く
参照側(サブ)には extern int hogehoge と書く

これが基本です、*.h を使うのなら

*.h に extern int hogehoge と書く
被参照側(メイン)に int hogehoge と書き、*.h をインクルード…@
参照側(サブ)は *.h をインクルード
@でヘッダと実体に矛盾がないかチェックします
2019/09/23(月) 21:19:08.91ID:995jKG080
>>61-62
ありがとうございました
64デフォルトの名無しさん (アウアウウー Sa8b-dyKo)
垢版 |
2019/09/29(日) 22:13:04.83ID:wBLVWLTJa
お前がC言語を 使う前に
言っておきたい 事がある
かなりきびしい話もするが
俺の本音を 聴いておけ
初期化前の変数を 使ってはいけない
gets()関数も 使ってはいけない
文字列の長さと 配列サイズは別物だ
使い終わったバッファは ゼロクリアしろ
できる範囲じゃなくて 全部やって

https://twitter.com/satoru_takeuchi/status/1176429522687676416?s=03
https://twitter.com/5chan_nel (5ch newer account)
2019/09/30(月) 07:29:14.67ID:II5MOx76M
>>64
> 使い終わったバッファは ゼロクリアしろ
これは要らんやろ
2019/09/30(月) 08:11:22.10ID:gJLA2fQe0
パスワードやらなんやらの機密情報を保存したバッファは解放前にゼロクリアしようねという話です。
任意のバッファという意味ではありません。失礼しました
2019/09/30(月) 08:13:21.71ID:VG7pOpzld
物凄く初歩的な質問で申し訳ないのですが
1%5のような余剰計算をした場合解は5になるのでしょうか0になるのでしょうか
2019/09/30(月) 08:15:49.83ID:VG7pOpzld
すみません自己解決しました
2019/09/30(月) 08:18:14.42ID:II5MOx76M
それC言語固有の話じゃないし個々にやるべきかプロセス毎にやるべきかとかのポリシーもあるし
70デフォルトの名無しさん (アウアウウー Sa8b-dyKo)
垢版 |
2019/09/30(月) 09:14:54.65ID:eZfyppwla
>>66
元のツイートした本人か。
ここ見に来ているとは思わなかった。
2019/10/04(金) 06:41:48.31ID:UVSgb2bf0
ゼロクリアだとそこだけ異様にキレイなので逆に重要な値が入るものと察知される
乱数値でクリアすべき
2019/10/04(金) 08:54:32.98ID:iKrL2UhC0
>>71
すごいコストがかかるよねそれ・・・
2019/10/04(金) 09:53:27.82ID:gjBxAXtl0
一々乱数計算しなくても数パターン乱数表つくってメモリコピーでもいいんじゃね?
2019/10/04(金) 10:40:51.28ID:0WBkPtDcx
そもそもゼロクリアされてるbss領域なんて重要なもの以外にも大量に存在してるので攻撃者がピンポイントで判断することなどまず不可能。
逆に綺麗すぎる乱数のほうが目立つ。
2019/10/04(金) 11:02:52.42ID:uYF9K7e8M
そこだけにするからバレると言うなら全部ゼロクリアすればいいってことでしょ

> 使い終わったバッファは ゼロクリアしろ
> できる範囲じゃなくて 全部やって
2019/10/04(金) 11:23:25.74ID:rAj4fuhv0
今の流行りは不変プログラミング
スコープが短い云々ではなく使い捨て
再利用なんてしない
2019/10/04(金) 11:28:53.13ID:MVQV/kgg0
アメリカ国防省のDoD5200.28-Mとかね
2019/10/04(金) 11:42:07.63ID:TDKY2TUM0
HDDだと少数回のゼロクリアじゃデータ復旧される可能性が残るけどメモリだったらその心配はないのかね?
2019/10/04(金) 11:48:30.26ID:0WBkPtDcx
>>78
DRAMはリフレッシュがあるので原理的に不可能な気がする。
SRAMもフリップフロップなら不可能な気がする。
80デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/04(金) 14:20:51.26ID:hcjI0QEWa
スワップされてディスクに書き込まれたら終わりなのでスワップされないようにする必要がある。
2019/10/04(金) 14:34:25.76ID:TDKY2TUM0
windowsの細かな動きがわからんけどスリープとかでメモリ内容を全部ディスクに保存する動きしない?
するなら言語レベルではどう頑張ってもディスクにデータを書き込まずにスルーする術なんてないんじゃなかろうか?
ということは漏洩防止目的でバッファをゼロクリアする意味は無い?
windows以外は知らん
2019/10/04(金) 15:03:33.90ID:gjBxAXtl0
スリープ処理って関数実行中でも起きるの?
メッセージ待ちとかで起こると思ってた。
2019/10/04(金) 15:23:30.09ID:0WBkPtDcx
多分priemptされてたら実行状態でも普通にswap outされるだろうな。
2019/10/04(金) 15:25:19.34ID:uYF9K7e8M
スワップに書いてある内容がどのプロセスのものかをどうやって知るつもりなんだろう…
てかそんなのがわかる状況ならそもそもセキュリティうんぬん言ってもしょうがないと思う
85デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/04(金) 15:35:25.79ID:hcjI0QEWa
Linuxにはmlock()がある。
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mlock.2.html
多分他のOSにも似たようなのはある筈。
なければ高度なセキュリティが必要なプログラムは作れない。
86デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/04(金) 15:43:12.94ID:hcjI0QEWa
サスペンドでメモリ内容が全てディスクに書き込まれるような場合は暗号化サスペンドイメージを使うように予め設定しておくしかないようだ。(もはや言語の問題ではない。OSの問題)。
2019/10/04(金) 15:53:58.62ID:TDKY2TUM0
最終的にはOSやらハードウェアファームやらのレベルの話に行き着くんで上位レイヤーでの完全対応は無理
ならば他アプリが自アプリのバッファにアクセスできないよう下位レイヤーが保証してるならバッファクリアは不要ということになる?
そんなレベルで心配が必要なことは個人的に触ることは無いと思うけど
2019/10/04(金) 17:34:20.04ID:SD7r35lfM
関数ポインタの書式と宣言方法がわからぬ(´・ω・`)
だれか助けてクレメンス
2019/10/04(金) 18:02:32.55ID:TP3p64JiM
ここで講義始めるわけに行かないんだからもっとspecificに頼むよ
2019/10/05(土) 01:05:45.82ID:JlWvx+CH0
Makefileなどに書かれているCCって「C Compiler」の略でしょうか?
2019/10/05(土) 08:03:44.94ID:9T2eUTn80
UNIXのccコマンドじゃね?
2019/10/05(土) 20:19:21.97ID:JlWvx+CH0
http://www2.scphys.kyoto-u.ac.jp/BIRDnet/manuals/A1_BIRDintro/cc1.html
C コンパイラーっぽいですね
2019/10/07(月) 09:08:10.49ID:wNNRR3l10
ピザ好きな不老不死の女の子かと思った
2019/10/07(月) 19:40:47.02ID:Xs+XlBV4d
250億分の1のドム?
2019/10/08(火) 06:14:41.38ID:T9JnCGiw0
Card Captor
2019/10/08(火) 07:56:55.95ID:/Tt7z8U00
さくらちゃん!
97デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/08(火) 10:23:23.04ID:UHIrT7RMa
Chupa Chups
2019/10/10(木) 14:01:00.49ID:at1yx75i0
このスレこんなに過疎ってたっけ
99デフォルトの名無しさん (アウアウウー Sa5b-DLKC)
垢版 |
2019/10/10(木) 20:53:57.73ID:f2z6TkRsa
まずは燃料投下する必要があるんじゃないかな。C言語はダメとかクソとか、あるいは引数にvoidなんて見たことないとか、そういったことを書けば火が付いて3スレぐらいあっという間に消費すると思うよ。
2019/10/10(木) 21:22:58.67ID:uAIxYTc70
void君呼ばれてるよ〜
2019/10/10(木) 21:27:26.48ID:uUO69neG0
void君だと日下部を連想しちゃう
2019/10/10(木) 23:54:41.04ID:a+kHg1ZD0
C言語がクソなのは誰の目にも明らかだから燃料にもならない

何を犠牲にしてでも最速を求めなければならないとか
今時キロバイト単位のメモリしか載ってないとかで渋々使わざるを得ないだけ
2019/10/11(金) 00:09:31.72ID:pVz4+WpI0
>>102
プログラムに関係する問題を人に伝えたく、かつ、言語固有の事情をできるだけ排除したいときにあえて c で表現することはあります、普段書きはすでに c++ ではあるのですが
https://mevius.5ch.net/test/read.cgi/tech/1551247748/442-443
2019/10/11(金) 07:30:31.94ID:nZkXsNOYd
だな
2019/10/11(金) 07:53:34.25ID:3LFsZ0AAx
かと言ってC++にそんなにメリット感じないんだよなぁ。
2019/10/11(金) 08:03:12.82ID:tJJSdY6IM
python最強!python最強!python最強!
2019/10/15(火) 23:35:16.76ID:j31F4ljf0
pythonスレ、寂れているぞ
2019/10/15(火) 23:36:55.58ID:41wob9vL0
Cスレより寂れてから出直してこい
2019/10/18(金) 13:14:43.91ID:fz6Ul+V20
あんなに活気のあったスレがこんなに寂れるとは
5chから人が減っているという噂は本当だったか・・・
2019/10/18(金) 13:17:46.21ID:TRDqZrvk0
2chに戻れば盛況になると思うよ
■ このスレッドは過去ログ倉庫に格納されています