X



C言語なら俺に聞け 153

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 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
0003デフォルトの名無しさん (ワッチョイ 132c-BF++)
垢版 |
2019/08/18(日) 03:38:02.60ID:26pp6bRY0
仮想アセンブラは、元々、日本の情報処理資格試験用に、CASL2 が作られた。
個別のCPU 命令では、試験にふさわしくないから、抽象化した命令が必要だった

でも、世界的には流行らなかった

それで、学生が作った、LLVM に、Apple が飛びついた
0004デフォルトの名無しさん (ワッチョイ 13a5-1WPq)
垢版 |
2019/08/18(日) 09:39:05.87ID:S9bN8HAf0
実像を見てない試験で社会から乖離してるな
バkの集団なんだろうか?
それともz80の問題だしたらライセンス料でも払わないといけないのか?
カネに掛けてはとかくケチな貧乏人が思い付きそうな小手先だ
至るところで独自規格で無意味の羅列、全く学習にならず、受けるだけムダな試験が練り上げられる
0006デフォルトの名無しさん (ラクッペ MMa5-66q6)
垢版 |
2019/08/18(日) 10:09:11.56ID:/GvnB8qbM
以前に実施されていたマイコン応用システム開発技術者試験のアセンブラ問題は8080, Z80, 6800からの選択だった
現在の情報処理試験エンベデッドシステムの前身となった資格試験
0007デフォルトの名無しさん (ワッチョイ 13a5-1WPq)
垢版 |
2019/08/18(日) 10:17:41.38ID:S9bN8HAf0
実際に使えないものを教えられてるのは英語と同じだな
CASLやっても機械語の練習にならない

「教育用」にまで形骸化すると使い物にならない、現実と実用から乖離する、ファンタジーになる、
これが「教育用」の弊害だ
PASCAL不人気の原因もここら辺にあるんじゃねえか?
IT界隈は教育用と実用の間で揺れてる
0008デフォルトの名無しさん (ワッチョイ 8bf2-Zpsd)
垢版 |
2019/08/18(日) 12:10:38.91ID:RmgmCswc0
>>2 先生 700行の数式パーサーまたHPに載せて下さい!
0009デフォルトの名無しさん (ワッチョイ d144-9R4q)
垢版 |
2019/08/18(日) 13:54:54.01ID:NDt9ShII0
ハゲタマゴどこ行った
0013入門 (ワッチョイ d901-QMAU)
垢版 |
2019/08/19(月) 07:50:31.64ID:AfRfI86I0
http://program-lecture.info/c_structure5.html

ここのサイトを見ながら学習しているのですがこのshowStatus関数では何故int配列を
int型の仮引数で受け取れてるのでしょうか?配列は配列かポインタでしか受け取れないと思ってたんですが
その認識は間違ってますか
よろしくお願い致します。
0015デフォルトの名無しさん (ワッチョイ 8b69-LL4R)
垢版 |
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;
 }
これと同じ
0020デフォルトの名無しさん (アウアウカー Sa5d-KcV4)
垢版 |
2019/08/24(土) 22:48:02.26ID:UVaZe+22a
下のコードの部分を実行すると、最後の行だけ2回表示されます。
理由はなぜでしょうか?また、最後も1回にするにはどう変更したら良いでしょうか?
よろしくお願いします。

http://codepad.org/WCL1vHLd
002220 (ワッチョイ f125-KcV4)
垢版 |
2019/08/25(日) 00:34:55.25ID:9+tsViui0
>>21
サンクス!

While 行と fgets 行の間にその行を入れたら1回になりました。
修正はこれで良いのでしょうか?
002320 (ワッチョイ f125-KcV4)
垢版 |
2019/08/25(日) 00:46:09.40ID:9+tsViui0
>>22 の修正だと最後の行以外にもだいぶ表示されなくなってました。
どうするのが正解なのでしょうか?
002620 (ワッチョイ 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);

最終的にこうなりなした。助かりました。
0027デフォルトの名無しさん (ワッチョイ 7a2c-3Uq+)
垢版 |
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
0028デフォルトの名無しさん (アウアウクー MM73-Ivwm)
垢版 |
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が入るようなマクロはどう書けばいいですか?
0030デフォルトの名無しさん (ワッチョイ 9f68-Ivwm)
垢版 |
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__)
0031デフォルトの名無しさん (ワッチョイ ff12-k1Ft)
垢版 |
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)
0037デフォルトの名無しさん (アウアウクー MM73-Ivwm)
垢版 |
2019/09/17(火) 13:01:08.68ID:pZqZMIzxM
うーん、どうにかして上のように[]を使って書き換えることは出来ないのですかね。
ちなみに下のようにして全パターン定義しようとしたらエラーでした。何故でしょうか。

#define val[0:2]=(...) DEF(val,0,2,__VA_ARGS__)
0039デフォルトの名無しさん (アウアウウー Sa63-ErpI)
垢版 |
2019/09/17(火) 19:09:34.89ID:g1BlUkdva
>>37
なぜって、#defineを使用するための構文を完全に無視してるからだよ。こちらが思ったことを都合良く解釈してくれるわけでなく、構文通りの単純な置換をしてくれるだけだよ。
一度ちゃんと調べておいた方がいい。
0041デフォルトの名無しさん (アウアウウー Sa63-ErpI)
垢版 |
2019/09/17(火) 20:37:25.67ID:g1BlUkdva
>>40
不可能。やるなら自前でプリプロセサでも書けばいいが、そんなことするくらいなら、ソース上に書くのではなく独自のデータファイルとそれを読み込んでデータを初期化するような処理でも作れば?
0043デフォルトの名無しさん (アウアウウー Sa63-0qvw)
垢版 |
2019/09/17(火) 22:44:02.30ID:WDh8MszDa
新言語作った方が良さそうな。
初期のC++みたいにC言語へのコンバータとして作っちゃえば楽だと思う。Cと同じで良い部分はほとんど素通しで行けるし。
0046デフォルトの名無しさん (ワッチョイ ff8c-e0wG)
垢版 |
2019/09/18(水) 07:02:57.91ID:ik5RQtCe0
yaccとlexを使えばできるだろう。たぶん
0047デフォルトの名無しさん (ブーイモ MM9f-+9C/)
垢版 |
2019/09/18(水) 08:32:22.55ID:cLmp+ocZM
独自言語を開発したときなんかはとりあえずCに変換するというのはわりとある話。
コード生成とか最適化とか考えずに済むから。

昔、独自じゃないけど、とある言語からCへのコンバータ作ったよ。
楽しかった。
0051デフォルトの名無しさん (アウアウクー MM11-bPqq)
垢版 |
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)だと正しく動きます。
0052デフォルトの名無しさん (ワッチョイ 51f6-ACnl)
垢版 |
2019/09/19(木) 16:38:05.33ID:1k0/HGmS0
タイミングの問題だ
#defineはコンパイル前に解釈されるが
関数仮引数の値は実行時に渡される

実行時とはコンパイル〜リンクまで全て終わった後の話だ
だから関数仮引数の値を#defineで置き換えることができない
0058デフォルトの名無しさん (ワッチョイ 0dd2-jgJV)
垢版 |
2019/09/20(金) 15:15:19.52ID:X5/vL2CD0
                            __、
                iー'゙゙゙゙''''ー-,/^´  ゙';
                |      ゙ゝ....‐  .}
                !           |,
                   i____________......r'".'''゙ヽ  . ..,,、
                ,,. -/        `'ー  |      .' 、
             ,..-'"  l゙          __.. -''′     ./
        . ,/     .`''''〜- ....---''''"゛        ,/
       /.,,                           ,,..r'"
         `''ー、,、                 _,,,-'"  `!、
               /'r‐、          ,/´ /゙゙',    ヽ
            / レ'゙ ´゙リ´ . `^^゙゙゙゙゙゙厂j  .! │    . l
           /  |  .l.      丿/ / . /      !
            l  !  .,,....--ー'''''''″ /  .| (、     . !
         _  .ィ‐¨゙゙'广゛ ......    ./  ,ノ.l.  `'ィ ..,,_/
     ..-‐'"゛  'l_゙'ーノ`' ..........,,_ .,, -"  / │   .!   ゙''''-.
   .i''i       ヽ、          /  .!    !
   ,)イ      : ..,,,,,>u;;;;,、.__ _,,,.. /    |    "
  / . 、          !  .`             |
     !,                     ,!
     ."                        ゙
0060デフォルトの名無しさん (ワッチョイ 02ad-9GzD)
垢版 |
2019/09/23(月) 14:43:33.00ID:995jKG080
グローバル変数を宣言する時、ヘッダファイルでextern int hogehoge;ってするよね。
*.cからヘッダファイルをincludeすると、
extern int hogehoge;を毎回書いたのと同じ状態になるの?
0062◆QZaw55cn4c (ワッチョイ e247-TpwJ)
垢版 |
2019/09/23(月) 15:58:05.13ID:ZLX7TvLd0
>>60
被参照側(メイン)に int hogehoge と書く
参照側(サブ)には extern int hogehoge と書く

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

*.h に extern int hogehoge と書く
被参照側(メイン)に int hogehoge と書き、*.h をインクルード…@
参照側(サブ)は *.h をインクルード
@でヘッダと実体に矛盾がないかチェックします
0064デフォルトの名無しさん (アウアウウー 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)
0066デフォルトの名無しさん (ワッチョイ e77c-Sxlc)
垢版 |
2019/09/30(月) 08:11:22.10ID:gJLA2fQe0
パスワードやらなんやらの機密情報を保存したバッファは解放前にゼロクリアしようねという話です。
任意のバッファという意味ではありません。失礼しました
0070デフォルトの名無しさん (アウアウウー Sa8b-dyKo)
垢版 |
2019/09/30(月) 09:14:54.65ID:eZfyppwla
>>66
元のツイートした本人か。
ここ見に来ているとは思わなかった。
0074デフォルトの名無しさん (アークセー Sxbd-BjtM)
垢版 |
2019/10/04(金) 10:40:51.28ID:0WBkPtDcx
そもそもゼロクリアされてるbss領域なんて重要なもの以外にも大量に存在してるので攻撃者がピンポイントで判断することなどまず不可能。
逆に綺麗すぎる乱数のほうが目立つ。
0080デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/04(金) 14:20:51.26ID:hcjI0QEWa
スワップされてディスクに書き込まれたら終わりなのでスワップされないようにする必要がある。
0081デフォルトの名無しさん (ワッチョイ 8d88-LHep)
垢版 |
2019/10/04(金) 14:34:25.76ID:TDKY2TUM0
windowsの細かな動きがわからんけどスリープとかでメモリ内容を全部ディスクに保存する動きしない?
するなら言語レベルではどう頑張ってもディスクにデータを書き込まずにスルーする術なんてないんじゃなかろうか?
ということは漏洩防止目的でバッファをゼロクリアする意味は無い?
windows以外は知らん
0084デフォルトの名無しさん (ドコグロ MMb1-XtwS)
垢版 |
2019/10/04(金) 15:25:19.34ID:uYF9K7e8M
スワップに書いてある内容がどのプロセスのものかをどうやって知るつもりなんだろう…
てかそんなのがわかる状況ならそもそもセキュリティうんぬん言ってもしょうがないと思う
0085デフォルトの名無しさん (アウアウウー 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にも似たようなのはある筈。
なければ高度なセキュリティが必要なプログラムは作れない。
0086デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/04(金) 15:43:12.94ID:hcjI0QEWa
サスペンドでメモリ内容が全てディスクに書き込まれるような場合は暗号化サスペンドイメージを使うように予め設定しておくしかないようだ。(もはや言語の問題ではない。OSの問題)。
0087デフォルトの名無しさん (ワッチョイ 8d88-LHep)
垢版 |
2019/10/04(金) 15:53:58.62ID:TDKY2TUM0
最終的にはOSやらハードウェアファームやらのレベルの話に行き着くんで上位レイヤーでの完全対応は無理
ならば他アプリが自アプリのバッファにアクセスできないよう下位レイヤーが保証してるならバッファクリアは不要ということになる?
そんなレベルで心配が必要なことは個人的に触ることは無いと思うけど
0097デフォルトの名無しさん (アウアウウー Sa21-8Spd)
垢版 |
2019/10/08(火) 10:23:23.04ID:UHIrT7RMa
Chupa Chups
0099デフォルトの名無しさん (アウアウウー Sa5b-DLKC)
垢版 |
2019/10/10(木) 20:53:57.73ID:f2z6TkRsa
まずは燃料投下する必要があるんじゃないかな。C言語はダメとかクソとか、あるいは引数にvoidなんて見たことないとか、そういったことを書けば火が付いて3スレぐらいあっという間に消費すると思うよ。
■ このスレッドは過去ログ倉庫に格納されています

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