C言語なら俺に聞け 143

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
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言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
443デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/22(水) 01:37:39.91ID:CvPbHYJg0
>>418
こんな感じかねえ。

if (cmd) {
 int s = system(cmd);

 if (s == -1) {
  // 子プロセス作成失敗またはステータス取得失敗

 } else if (WIFEXITED(s)) {
  // 子プロセスは正常に終了した。

  int es = WEXITSTATUS(s);

  // es の内容が子プロセス側での exit(es) または return es
  // これはたいてい 0 以外がエラーになっている。0なら成功。
 } else if (WIFSIGNALED(s)) {
  // 子プロセスはシグナルで中断して終わった。
  // (人が Ctrl+C をキーから押したとか、kill したとか、プログラムバグってて core dump したとか 0 で割ったとか)
  // シグナルの意味は signal(7) の man page 見るとわかる。

  int sg = WTERMSIG(s);
  // sg にシグナル番号が入る。
 }
}
444デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/22(水) 02:48:21.29ID:CvPbHYJg0
>>417
試しに正規表現使うとどうなるか作ってはみたが、あまり意味ないなw
https://paiza.io/projects/n8RUPm6x15vg2r0-i-xc0g
2017/11/22(水) 06:57:55.87ID:ehTxx6H60
>>431
f = f*i を f *= i と解釈して1ステップか、それもありうる。
2017/11/22(水) 08:11:12.98ID:W0SJQGiTM
>>445
それもありうるって言うかそうでない処理系の方が珍しいだろ
2017/11/22(水) 08:30:23.30ID:OmrPXxhs0
元の問題が、演算と代入とそれぞれ1ステップって書いてあるんだから
そこを議論しても意味がない
2017/11/22(水) 14:50:29.32ID:5BCPAAz7a
これ教えてくれ
https://i.imgur.com/fK9MpEP.jpg
449デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:01.31ID:qJn/S+Fz0
面倒くせえ奴らだなあ。。。
//aho.cpp
extern "C" char* regex_replace(char* str, size_t n, char const* pat, char const* put) noexcept
{
try
{
string buff{str};
buff = regex_replace(buff, regex{pat}, put);
strncpy(str, buff.data(), n);
return str;
}
catch(...) {}
return nullptr;
}
450デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:31.73ID:qJn/S+Fz0
//baka.c
char* regex_replace(char*, size_t, char const*, char const*);

int main()
{
char buff[100];
while(fgets(buff, 100, stdin))
if(regex_replace(buff, 100, "/+$", "")) puts(buff);
else puts("error");
}
451デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:55.87ID:qJn/S+Fz0
rem test.bat
cl baka.c aho.cpp /EHsc && baka

ったく世話の焼ける(ぶつぶつ
2017/11/22(水) 15:31:36.02ID:5BCPAAz7a
ありがとうございます!
2017/11/22(水) 17:50:15.00ID:MV3BmYS20
初心者です、教えていただけませんか?
大文字の配列を小文字にするコードなのですが

1 int main(){
2 int i;
3 char str[]={'A','B','C'};
4
5 for(i=0;i<3;i++)
6 {
7 str[i]=str[i]+'a'-'A';
8 }
9 return 0;
10
11 printf("答え \n");
12 for(i=0;i<3;i++)
13 {
14 printf("%c\n",str[i]);
15 }
16 return 0;
17 }
を実行すると 「Info: Nothing to build for Hello」 となります。
5行目から9行目までを削除して実行すると答えは大文字で「ABC」となります
5行目から9行目の文法がおかしいと思うのですが何処がおかしいのかわかりません
誤っている個所をご指導頂けないでしょうか?よろしくお願いします。
2017/11/22(水) 17:52:20.48ID:QYl/HC3Nd
>>453
9行目のreturn 0;でmainから制御を戻しているから、以下は実行されない。
2017/11/22(水) 18:11:10.14ID:MV3BmYS20
>>454
ありがとうございます。とても感謝してます。
戻り値とmain関数の関係を調べてみます。
大変にありがとうございました。
2017/11/22(水) 18:14:07.74ID:MV3BmYS20
>>455
9行目のreturnでmain関数が終わってしまっていたのですね
ありがとうございました!
2017/11/22(水) 19:23:09.00ID:T7TzzxgAp
ちよわw
机上デバッグなりステップ実行なりすりゃいいじゃんみたいなんばっかりだな。
2017/11/22(水) 20:47:50.23ID:W0SJQGiTM
>>447
正解は>>411らしいしまともなら知識を持ってたら普通に同意する内容だし
2017/11/22(水) 20:50:57.50ID:W0SJQGiTM
>>453
とりあえず
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1509780815/
に行けよ...
2017/11/22(水) 21:53:31.50ID:SHp93EZHa
mmap の page fault で割り当てられたページフレームってスワップアウトとか発生した時にドロップしたりしますか?
461デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/23(木) 06:33:31.65ID:ZFTBiu2d0
君の言っている事がよくわからない
2017/11/23(木) 09:17:29.44ID:N/op9puJa
>>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?

madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね
2017/11/23(木) 09:34:44.63ID:NGg/SBGT0
MMUにもよるんじゃない
2017/11/23(木) 09:46:31.82ID:N/op9puJa
ディスクリードがあるのでmmuにはよらないかと
2017/11/23(木) 10:51:34.50ID:ijGzvwTZ0
結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される

madviseが実際に指示通りに動くかどうかは実装次第だけど
一応LinuxとかはMADV_DONTNEEDで物理は解放できる

というか、これはC言語の話じゃないから各環境のスレで聞け
2017/11/23(木) 12:41:47.79ID:FGycjMyka
>>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます

一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました
2017/11/24(金) 13:07:13.19ID:13KSLmbUM
>>466
一応一般的には
非dirtyならまだ物理メモリは割り当てられてない、が正しい
物理メモリの再利用についてはdirtyでもswapがあれば行われる(そのためのswap)
2017/11/24(金) 14:08:06.79ID:/RqU0h4Pd
コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective)
2017/11/24(金) 15:12:46.00ID:bYdw4irrd
>>468
まず「リーダブルコード」読んどけ。
2017/11/24(金) 15:20:30.73ID:W0y6TqiA0
>>467
つまりreadonlyでmmapし場合、dirtyにならないから物理は割り当てられないと
すごいな
2017/11/24(金) 16:33:20.57ID:/I02is1j0
割り当てられてないメモリーにアクセスするとページフォルトが起きてから
OSが割り当てる遅延ファイルマッピングの事をいいたいんじゃないのかな。
2017/11/24(金) 17:19:21.14ID:oz95vMBJM
DMA涙目だな
473デフォルトの名無しさん (JP 0H4b-9mpY)
垢版 |
2017/11/24(金) 17:56:03.88ID:37SoWLJsH
ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる?
2017/11/24(金) 18:18:10.79ID:OpHoTsuS0
>>473
まずはやってみろ
475デフォルトの名無しさん (アウアウアー Sa4f-9mpY)
垢版 |
2017/11/24(金) 18:23:00.58ID:LzLaFdMta
>>474
たしかに
家帰ったらやってみる
2017/11/24(金) 19:41:11.01ID:5gRYCg9up
つか、どうしつて区別すると思うんだ?
2017/11/24(金) 19:44:50.18ID:4DoLJt5P0
*も含めて変数名と思ったんじゃね?
2017/11/24(金) 20:43:22.73ID:yshQtEuUM
>>466
まあここでいいと思うぞ

madviseはあまり関係ない
落とされる前提でポリシー決めてるだけ
MAP_SHAREなら解放される可能性がある
MAP_LOCKEDで解放されない

他のフラグは知らん、試せ
479デフォルトの名無しさん (ワッチョイ 078a-9mpY)
垢版 |
2017/11/24(金) 21:30:01.83ID:Mh0dfdoe0
これまた初歩的な質問なんだけど、intとdoubleとかで変数名が衝突したらどうなる?
2017/11/24(金) 21:34:30.17ID:oQOGHeAz0
衝突してるぞエラーになる
2017/11/24(金) 22:01:24.27ID:OpHoTsuS0
>>479
>>474
482デフォルトの名無しさん (ワッチョイ 078a-9mpY)
垢版 |
2017/11/24(金) 22:54:20.18ID:Mh0dfdoe0
確かにエラー出るんだけど、できないってことでいいの?
2017/11/24(金) 23:29:26.60ID:LzKIf/Vy0
外のスコープで定義されたものと名前が衝突した場合は内側の方が有効になり
同じスコープで衝突した場合はエラーになる
2017/11/24(金) 23:30:01.94ID:oz95vMBJM
cでは出来ない。という仕様
485デフォルトの名無しさん (ワッチョイ 078a-9mpY)
垢版 |
2017/11/25(土) 00:53:38.80ID:JCp8dCym0
サンガツ
2017/11/25(土) 06:12:18.91ID:KGlQ3mpn0
同じ変数名でもスコープが違えば出来るよ。
2017/11/25(土) 06:35:32.53ID:H7G0IpRv0
int* ptの意味は意味int *ptだよ。
ptをデリファレンス演算子で評価したらint型になるよという宣言だよ。
2017/11/25(土) 08:28:27.42ID:InRb1JFJ0
変数名が型ごとに独立した名前空間に属する、という言語があるのかな。
原理的には可能だと思うけど、えらく組みにくそうな気がする。
「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。
2017/11/25(土) 08:44:13.26ID:H7G0IpRv0
構造体のネームスペースみたいに
全部の変数に型名をつけるようになるだろうな。
2017/11/25(土) 08:47:32.78ID:t3NLc0dP0
かえって使いづらい言語になるね
2017/11/25(土) 09:32:16.56ID:87Khqx810
変数の寿命はできるだけ短くしましょう
2017/11/25(土) 13:36:36.33ID:O9uPrWP7d
リーダブルコーディングとeffective以外に本を探してるのだけど他にあるかな?
2017/11/25(土) 14:31:12.80ID:99QBz+fh0
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006
2017/11/25(土) 16:19:42.50ID:87Khqx810
C実践プログラミング
2017/11/25(土) 16:51:39.14ID:o/Q+Vng/d
っコードコンプリート
496デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/25(土) 17:02:06.40ID:DmTU06Rg0
>>488
perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。
2017/11/25(土) 17:03:44.75ID:ROI3Hzdd0
>>493
ネットで MISRA の詳しい解説はありませんか?
2017/11/25(土) 17:08:09.65ID:N5s7ffCaM
>>497
https://srad.jp/comment/2295472
499デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/25(土) 17:24:25.43ID:6ctJHfBp0
処理重視なら毎回毎回変数宣言って処理が鈍くなるよな?
2017/11/25(土) 17:58:52.01ID:AcXq78AE0
インタプリタじゃないです
2017/11/25(土) 17:59:36.62ID:t3NLc0dP0
C++でもないのでコンストラクタ走るわけでもないです
2017/11/25(土) 18:34:32.19ID:ve9pYFQ+p
スタック操作なんか関数呼び出し時にまとめてやってるから、どこで宣言しようが処理速度は変わらないけどな。
2017/11/25(土) 18:34:37.15ID:ROI3Hzdd0
>>499
その程度ならコンパイラが良きに計らってくれますよ
2017/11/25(土) 19:25:41.27ID:Hc9rYyD70
for文の中の変数宣言って外で行うよりオーバーヘッド大きいの?
2017/11/25(土) 19:29:40.95ID:o/Q+Vng/d
>>504
言語上ブロック内で有効なだけで、
他の自動変数同様スタックに余分にとられるだけだからまず変わらない。
506デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/25(土) 20:41:30.63ID:DmTU06Rg0
>>499
宣言だけ?メモリ確保とかは自分でやらずに?
だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。
507デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/25(土) 20:51:32.38ID:L+SRk42p0
あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は
ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間
掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。
508デフォルトの名無しさん (スッップ Sd7f-Xp/k)
垢版 |
2017/11/25(土) 20:59:06.21ID:XP2bT693d
動的に確保というのはあるだろうが、
俺を意識した使い方するだろうし
509デフォルトの名無しさん (ワッチョイ bf8a-S11E)
垢版 |
2017/11/25(土) 21:27:39.55ID:FWelsGSm0
VLAはスコープの出入りで伸縮だと思うが
510デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/25(土) 22:01:34.55ID:DmTU06Rg0
ああ。そうか。これか。
https://qiita.com/raccy/items/bfcb62086c5f027d57b6
C11のこと忘れてた。
511デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 16:09:01.86ID:EJqMiwXm0
>>506
for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
2017/11/26(日) 16:12:10.13ID:xKw15WCKH
そのレベルの理解なら気にする必要はない
そもそもCを使う必要もない
2017/11/26(日) 16:15:46.29ID:pGcZHtwF0
>>511
> for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
よほどショボいコンパイラでない限り気にする必要はない

> なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
そう言うアホな本は窓から捨てるべき
514デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 16:46:48.52ID:EJqMiwXm0
>>513
それは中の処理が大量になっても大丈夫なのか?
20行、30行ぐらい長い処理でも?
2017/11/26(日) 16:52:44.80ID:14BIGute0
宣言と長い処理って何処に関連が?

初期化の右辺がすんげー長いというのは
変数宣言がループの中にあろうが変数宣言をループの外に追い出しても
同じで必須コストだしそこは論点じゃないよね
516デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 17:10:19.17ID:EJqMiwXm0
>>515
https://qiita.com/EqualL2/items/472035c3f0d3e34734a8
これのループ内での変数宣言ってやつのことを知ってそうしたんだけど
2017/11/26(日) 17:15:43.31ID:14BIGute0
>>516
全部ヒントに「コンパイラが最適化でやる」って書いてあるし
逆にそのコストが重いようならもっと根本的な手入れ(アルゴリズムの見直しとか)が必要だし
518デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 17:20:34.69ID:EJqMiwXm0
なるほどなるほど、アルゴリズムの問題か納得した
2017/11/26(日) 17:23:40.85ID:woDc+4Yf0
C言語じゃなくてC++でのクラス変数じゃないの?
2017/11/26(日) 17:29:05.50ID:pGcZHtwF0
>>514
測定して本当にそれが問題になってるとわかった時に考えればいい
521デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/26(日) 17:57:37.44ID:YtJM5Nau0
>>516
「実際のところ」と書いてある所をよく読むべき。
2017/11/27(月) 04:22:16.28ID:vYl0vGfCd
コードとは直接関係はないけどメモリリークのテストってlinuxだとどうやるのだろう?
523デフォルトの名無しさん (ブーイモ MMeb-V9cG)
垢版 |
2017/11/27(月) 07:40:08.21ID:fAclYYwOM
>>522
valgrind か LeakSanitizer
2017/11/27(月) 07:57:21.48ID:ENOa9M21M
>>522
valgrind (http://valgrind.org/)
2017/11/27(月) 13:20:55.85ID:HfjV3qo40
脳内ループ最適化かー。結構良く目にするのは
int i;
for(i = rows; 0 < i; i―)
Hoge;

だったりするけど
組み込みでも、このくらい最適化かかるのにねぇ
2017/11/27(月) 19:33:17.36ID:vYl0vGfCd
>>523
>>524
ありがとう調べてみる
別件なのだけど、systemの子プロセス戻り値をみるときって

ret=system(コマンド)
if(wifexisted(ret))
{
wexitstatus(ret)
}

これだけで良い?エラー処理ってほかにいるかね?
wifsignaledとかwtermsigとかいるのかね?ってなってるんだ
その他のマクロについても....
527デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/27(月) 20:30:19.45ID:clAY2uWxa
>>526
systemって-1返す事なかったっけ?
528デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/27(月) 20:31:48.14ID:clAY2uWxa
>>526
てか、>>443見てみな。
2017/11/27(月) 22:36:43.33ID:AvUHS7bA0
>>522
オレは単純にpsコマンドで、vszとszの推移を見てるだけだなー
確保の仕方にもよるだろうけど。。。
530デフォルトの名無しさん (ブーイモ MM7f-V9cG)
垢版 |
2017/11/27(月) 22:55:20.44ID:epITd0LcM
>>529
メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ
2017/11/27(月) 23:00:48.16ID:jJU6vIIdd
>>528
うおおおおお
たしかにあった

>>527
-1は素で忘れてた
>>443見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる
if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない...
532デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/28(火) 01:05:27.23ID:uD/TV9F60
>>531
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html
Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。
しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。
533デフォルトの名無しさん (ワッチョイ 07b3-zoBB)
垢版 |
2017/11/28(火) 01:45:58.95ID://UzmZat0
https://i.imgur.com/NECNUPM.jpg
この問題なんだけど、下の書き方以外に賢い方法ある?
このやり方はごり押し過ぎてさすがに違うと思うんだけど
http://codepad.org/pUUVFFJA
2017/11/28(火) 03:16:49.45ID:Ol4PUSI5M
>>533
3点ほど

配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?

ローカル変数名は input_num とか分かる名前つけようか

main の戻り値
2017/11/28(火) 07:53:02.37ID:tl7kMs1v0
C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。
2017/11/28(火) 08:09:45.26ID:VZsT4wzqd
>>532
さんくす
これ読みにくいよなぁ....

子プロセスの配送が停止したとき
具体的に言うとwifstoppedの時は別なのかな?
2017/11/28(火) 18:38:43.18ID:v3J3k8MEM
stdlib.hのSUCCESSなんちゃらをほんにゃら
538デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/29(水) 02:06:01.37ID:1lf2VR3q0
>>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。
2017/11/29(水) 15:46:29.13ID:awoPtY5k0
char str1[10]="AAAAAA";
char str2[10]="BBBBBB";
char str3[10]="CCCCCC";
があって、これをそれぞれ
char strh[0][10]〜char strh[2][10]に代入する方法を教えてください。
2017/11/29(水) 15:58:48.18ID:mhTWLdh/0
strcpy(strh[0],str1);
strcpy(strh[1],str2);
strcpy(strh[2],str3);
と適当に書いてみる。
2017/11/29(水) 16:16:35.31ID:4OxukQ3ip
ポインターのコピーじゃダメなんですか?
なんで中身をわざわざ複製して、処理時間を無駄に消費するんですか?
2017/11/29(水) 16:25:56.35ID:llo+D0tpd
>>538
ありがとうありがとう
そうすることにする


stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。