C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
面倒くせえ奴らだなあ。。。
//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;
} //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");
} rem test.bat
cl baka.c aho.cpp /EHsc && baka
ったく世話の焼ける(ぶつぶつ 初心者です、教えていただけませんか?
大文字の配列を小文字にするコードなのですが
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行目の文法がおかしいと思うのですが何処がおかしいのかわかりません
誤っている個所をご指導頂けないでしょうか?よろしくお願いします。 >>453
9行目のreturn 0;でmainから制御を戻しているから、以下は実行されない。 >>454
ありがとうございます。とても感謝してます。
戻り値とmain関数の関係を調べてみます。
大変にありがとうございました。 >>455
9行目のreturnでmain関数が終わってしまっていたのですね
ありがとうございました! ちよわw
机上デバッグなりステップ実行なりすりゃいいじゃんみたいなんばっかりだな。 >>447
正解は>>411らしいしまともなら知識を持ってたら普通に同意する内容だし mmap の page fault で割り当てられたページフレームってスワップアウトとか発生した時にドロップしたりしますか? >>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?
madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね 結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される
madviseが実際に指示通りに動くかどうかは実装次第だけど
一応LinuxとかはMADV_DONTNEEDで物理は解放できる
というか、これはC言語の話じゃないから各環境のスレで聞け >>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます
一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました >>466
一応一般的には
非dirtyならまだ物理メモリは割り当てられてない、が正しい
物理メモリの再利用についてはdirtyでもswapがあれば行われる(そのためのswap) コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective) >>467
つまりreadonlyでmmapし場合、dirtyにならないから物理は割り当てられないと
すごいな 割り当てられてないメモリーにアクセスするとページフォルトが起きてから
OSが割り当てる遅延ファイルマッピングの事をいいたいんじゃないのかな。 ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる? >>466
まあここでいいと思うぞ
madviseはあまり関係ない
落とされる前提でポリシー決めてるだけ
MAP_SHAREなら解放される可能性がある
MAP_LOCKEDで解放されない
他のフラグは知らん、試せ これまた初歩的な質問なんだけど、intとdoubleとかで変数名が衝突したらどうなる? 確かにエラー出るんだけど、できないってことでいいの? 外のスコープで定義されたものと名前が衝突した場合は内側の方が有効になり
同じスコープで衝突した場合はエラーになる int* ptの意味は意味int *ptだよ。
ptをデリファレンス演算子で評価したらint型になるよという宣言だよ。 変数名が型ごとに独立した名前空間に属する、という言語があるのかな。
原理的には可能だと思うけど、えらく組みにくそうな気がする。
「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。 構造体のネームスペースみたいに
全部の変数に型名をつけるようになるだろうな。 リーダブルコーディングとeffective以外に本を探してるのだけど他にあるかな? 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006 >>488
perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。 >>493
ネットで MISRA の詳しい解説はありませんか? 処理重視なら毎回毎回変数宣言って処理が鈍くなるよな? C++でもないのでコンストラクタ走るわけでもないです スタック操作なんか関数呼び出し時にまとめてやってるから、どこで宣言しようが処理速度は変わらないけどな。 >>499
その程度ならコンパイラが良きに計らってくれますよ for文の中の変数宣言って外で行うよりオーバーヘッド大きいの? >>504
言語上ブロック内で有効なだけで、
他の自動変数同様スタックに余分にとられるだけだからまず変わらない。 >>499
宣言だけ?メモリ確保とかは自分でやらずに?
だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。 あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は
ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間
掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。 動的に確保というのはあるだろうが、
俺を意識した使い方するだろうし >>506
for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた そのレベルの理解なら気にする必要はない
そもそもCを使う必要もない >>511
> for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
よほどショボいコンパイラでない限り気にする必要はない
> なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
そう言うアホな本は窓から捨てるべき >>513
それは中の処理が大量になっても大丈夫なのか?
20行、30行ぐらい長い処理でも? 宣言と長い処理って何処に関連が?
初期化の右辺がすんげー長いというのは
変数宣言がループの中にあろうが変数宣言をループの外に追い出しても
同じで必須コストだしそこは論点じゃないよね >>516
全部ヒントに「コンパイラが最適化でやる」って書いてあるし
逆にそのコストが重いようならもっと根本的な手入れ(アルゴリズムの見直しとか)が必要だし >>514
測定して本当にそれが問題になってるとわかった時に考えればいい >>516
「実際のところ」と書いてある所をよく読むべき。 コードとは直接関係はないけどメモリリークのテストってlinuxだとどうやるのだろう? >>522
valgrind か LeakSanitizer 脳内ループ最適化かー。結構良く目にするのは
int i;
for(i = rows; 0 < i; i―)
Hoge;
だったりするけど
組み込みでも、このくらい最適化かかるのにねぇ >>523
>>524
ありがとう調べてみる
別件なのだけど、systemの子プロセス戻り値をみるときって
ret=system(コマンド)
if(wifexisted(ret))
{
wexitstatus(ret)
}
これだけで良い?エラー処理ってほかにいるかね?
wifsignaledとかwtermsigとかいるのかね?ってなってるんだ
その他のマクロについても.... >>526
systemって-1返す事なかったっけ? >>522
オレは単純にpsコマンドで、vszとszの推移を見てるだけだなー
確保の仕方にもよるだろうけど。。。 >>529
メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ >>528
うおおおおお
たしかにあった
>>527
-1は素で忘れてた
>>443見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる
if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない... >>531
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html
Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。
しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。 >>533
3点ほど
配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?
ローカル変数名は input_num とか分かる名前つけようか
main の戻り値 C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。 >>532
さんくす
これ読みにくいよなぁ....
子プロセスの配送が停止したとき
具体的に言うとwifstoppedの時は別なのかな? stdlib.hのSUCCESSなんちゃらをほんにゃら >>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。 char str1[10]="AAAAAA";
char str2[10]="BBBBBB";
char str3[10]="CCCCCC";
があって、これをそれぞれ
char strh[0][10]〜char strh[2][10]に代入する方法を教えてください。 strcpy(strh[0],str1);
strcpy(strh[1],str2);
strcpy(strh[2],str3);
と適当に書いてみる。 ポインターのコピーじゃダメなんですか?
なんで中身をわざわざ複製して、処理時間を無駄に消費するんですか? >>538
ありがとうありがとう
そうすることにする
stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった >>541
ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]〜*strh[2])の内容まで変わる
値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]〜strh[2][])の内容は変化しない
配列とポインタでは挙動が違う 初期化でやってしまう話じゃないんだろうな。 多分
char strh[3][10] = { "AAAAAA", "BBBBBB", "CCCCCC" }; 配列変数はただのポインタ変数じゃないってマジ?
arr==&arrになるんやが。
arrがポインタなら&arrはポインタのポインタだからこれはおかしい。 int a[10];
int *p;
p++; 問題なし
a++; エラー
配列は配列 ポインタはポインタ ■ このスレッドは過去ログ倉庫に格納されています