X



C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 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
0380デフォルトの名無しさん (ワッチョイ e92b-0hG5)
垢版 |
2017/11/18(土) 21:10:22.92ID:V3PmucT60
setlocaleの引数は?
0382デフォルトの名無しさん (ワッチョイ a193-GczB)
垢版 |
2017/11/18(土) 21:48:38.17ID:N5k0nP0W0
解決した
関数の中で宣言したwchar_t の配列buff[20]のポインタを返してそれを表示してたんだけどそれがまずかったみたい

スコープから抜けた瞬間に解放されちゃうみたい

無知だったわ申し訳ない
0384デフォルトの名無しさん (ワッチョイ a19f-RjUU)
垢版 |
2017/11/18(土) 23:02:18.25ID:euoYf0NO0
>>382
GC言語使ってた奴がよくやるパターンだ。ドンマイ。

>>383
それだと後でいちいちfreeするのが面倒だろ。
普通は呼び出し元で buff[20] 確保してポインタを渡し、子関数内でそこに書き込む。
なおどうしても値返しで組みたければ、structならreturnで値返しできるからくるめばいい。(はず)
0385デフォルトの名無しさん (ワッチョイ 419f-Eq+G)
垢版 |
2017/11/19(日) 03:54:32.58ID:+NeHX1+n0
char* hoge(){
   char buff[20];
   strcpy(&buff[0], "何らかの処理");
   return &buff[0];
}

int main(int argc, char* argv[]){
   char* str = hoge();
   printf("%s\n", str);
   return 0;
}

多分、こうなってたんじゃないか?
配列は、自分で管理すべきだよねー。

void hoge(char* const str){
   strcpy(&str[0], "何らかの処理");
   return 0;
}

int main(int argc, char* argv[]){
/*  char str[20]; */
   char* ptr = nul;
/*  ptr = &str[0]; */
   ptr = (char*)malloc(sizeof(char) * 20);
   hoge(ptr);
   printf("%s\n", str);
   return 0;
}
0386デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/19(日) 04:46:36.12ID:uKY6C0dJ0
意味は同じだし最適化されるからどうでもいいことではあるが、
そこの &str[0] は単に str と書くだけでいいんじゃないの?
見やすさの点からも受け取る部分が char *str ならそのまんま
str って書いておいた方が分かり易いと思うんだけど。
0388デフォルトの名無しさん (ブーイモ MMf6-6+Yk)
垢版 |
2017/11/19(日) 09:57:18.82ID:v7NTUoVSM
初心者はこれだけ守ってれば良いかと

処理対象のメモリは呼び出し元で確保、alloc-freeで処理をはさむ
処理の戻り値は基本intでエラーコードを返す
ローカル変数は16k未満、可変長配列は使わない

>>387
そんなことはない
0389デフォルトの名無しさん (ワッチョイ 82a4-Eq1o)
垢版 |
2017/11/19(日) 10:16:36.97ID:Rb2sIcHm0
> 処理の戻り値は基本intでエラーコードを返す

malloc先生やprintf先生を見習ったら違反だな


> ローカル変数は16k未満、可変長配列は使わない

何だそのマジックナンバーは??
0390デフォルトの名無しさん (ワッチョイ a193-oo0Z)
垢版 |
2017/11/19(日) 10:34:41.84ID:YNZopTj60
malloc に限らんけど、ポインタを返す関数は
失敗の場合にNULLを返すってのはまぁ基本だね。
線形リストの探索、見つからなければNULL、みたいに。

printf の返り値はintだから一応は >>388 の方針通りじゃろ。
成功なら非負の値、失敗したら -(エラーコード) が返る、
と決めておけば何かと使いやすいわね。
0391デフォルトの名無しさん (ワッチョイ 82a4-Eq1o)
垢版 |
2017/11/19(日) 10:42:05.59ID:Rb2sIcHm0
>>390
ちょw
printfの仕様を知らんのか
0395デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/19(日) 13:05:21.82ID:uKY6C0dJ0
printf() の man page 見てもエラーの時は負の値を返すとしか書いてなくて errno に何か入るとは書いてない。
まあ、実際には中で putchar() と同等な事をするだろうからその中で使われる write() で何か書かれるとは
思うがその辺は保証されていないので使えない。(書き込み時のエラーではないかも知れないしな)。
GNU の asprintf() もエラー時は -1 を返すのみで errno については何も書いてない。

それと snprintf() のような結果を書き込むバッファの大きさを指定できるやつはバッファを使い切った場合の
エラーの返し方が違う。
0396デフォルトの名無しさん (アウアウカー Sa49-GczB)
垢版 |
2017/11/19(日) 16:13:09.94ID:ViWWOCHYa
条件が
文字列の長さ
文字列比較
でソートしたくて2回forで回してます

流石にこれでは件数が増えたときにとてつもなく遅くなるので1回のforだけでやる方法を教えてください
0397デフォルトの名無しさん (ワイモマー MM05-harS)
垢版 |
2017/11/19(日) 16:19:33.08ID:lEYmgXHFM
>>396
普通にソートすれば、長い方が後に来るんじゃね?
0398デフォルトの名無しさん (ワッチョイ 41b3-wRfy)
垢版 |
2017/11/19(日) 16:32:59.11ID:NI05LLAC0
条件を変えて2回まわしたら1回目のソートは(ほぼ)意味がないんじゃない?
(順位を保つソート法なら 多少意味が出てくる: qsort はその保障はない)

qsort の srot_cmp の記述で
比較すべき それぞれの要素 c1 と c2 を多重に比較すればいい

・「文字列長さ」で比較し 違うなら大小関係を返す→
 ↓
・(上の比較が等しいので)「文字列」比較し 違うなら大小関係を返す→
 ↓
 :
 ↓
・(上の比較が等しいので)等しいと返す

これならソートは1回だけ
0400デフォルトの名無しさん (ワッチョイ 919f-RuWE)
垢版 |
2017/11/19(日) 19:18:57.18ID:uKY6C0dJ0
>>399
f=f*i の部分は四則演算1回と代入1回だから2ステップなのでは?
0401デフォルトの名無しさん (ワッチョイ feeb-MUuo)
垢版 |
2017/11/19(日) 19:34:22.94ID:H23Xb2RQ0
f=1 代入1回
for(i=1;i<=n;i++) -> for(i=1;i<=n;i=i+1) 代入1回; 条件判断n+1回; 四則演算n回、代入n 回
f=f*i; 四則演算n回、代入n回

なので合計 5n+3 ステップかな、i++ を1ステップとする処理系なら 4n+3 とか。よくわからんけど
0403デフォルトの名無しさん (ワッチョイ a9ea-wRfy)
垢版 |
2017/11/20(月) 14:28:22.74ID:8OH1W8zR0
i++ を1ステップ勘定するか 2ステップ勘定するかは悩ましいけど
分解して 四則演算の1 + 代入の1 計2ステップ の見積もりするのが妥当なんかな
題中にインクリメント演算についてのステップ数は明示されてないし
0404デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/20(月) 17:25:41.15ID:ZHV8ZCmh0
i++みたいにハード的にありえない(メモリは加算機能を持たない)ことは
マイクロコードで実現しているわけで、1ステップなわけがない
0412デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/20(月) 23:56:46.22ID:ZHV8ZCmh0
おまえ自身は何も言わないわけか
0413デフォルトの名無しさん (ワッチョイ e92b-0hG5)
垢版 |
2017/11/21(火) 00:13:10.99ID:j0/qDr3U0
++は対象がレジスタに乗ってるときに1命令だろ
とくにアドレスレジスタの場合に *p++ をポストインクリメントレジスタ間接アクセス命令にそのまま置き換えられるから、
オプティマイズがまだ発達してなかったころに重宝したはず
0414デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/21(火) 06:23:40.67ID:uBkGRn7P0
そのバヤイは0.5命令だね
* と ++ を同時並列でやるわけで
0415デフォルトの名無しさん (ワッチョイ a193-oo0Z)
垢版 |
2017/11/21(火) 06:30:17.80ID:VCAIytbF0
>>411 実際のマシンとは関係のない、問題のための問題だから
問題を作った人の答えが正解というルールは仕方ないとして…。

i++ が1ステップなのか2ステップなのか、という疑問が出るスレッドで、
f = f*i はまとめて1ステップです、という解説が現れるのは予想外だったわ。
f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
0416デフォルトの名無しさん (ワッチョイ 4976-RVzq)
垢版 |
2017/11/21(火) 07:23:37.68ID:V9LM9CF/0
単純に行数で示す場合もあるし
いろいろだよ

重要なのは計算オーダーと実測値
ステップ数は計算オーダーを見積もる為の道具で
定数倍はわりとどうでも良い

計算量をもっと正確な値を知りたい時は
加減算○回、乗算○回、除算○回
など、より具体的な値とする
0417デフォルトの名無しさん (スップ Sd82-LOf1)
垢版 |
2017/11/21(火) 09:57:32.04ID:6BA+Ife8d
末尾に/が入っていたとき全て削除したいのだけどどうすれば簡単に実装できるだろうか
データはcharの配列に入っている

ex
aaa.txt
aaa.txt/→aaa.txt
aaa.txt/////→aaa.txt
0418デフォルトの名無しさん (スップ Sd82-LOf1)
垢版 |
2017/11/21(火) 10:04:28.94ID:6BA+Ife8d
あとsystem関数の戻り値の判定に悩んでます
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/system.3.html

上記参考にしたら四つのケースに別れていて
下二つはwexitなどのマクロで取得可能
上二つの内ひとつはnullチェックで弾くこと可能
残りは子プロセス作成失敗の-1で網羅できてると考えているのだけど間違ってるのかな?

やりたいことは
system関数のコマンドライン実行したアプリのステータスコードを取得したい。そのためにマクロ使ってる

ただ子プロセスの取得云々の前にsystemの結果判定必要なんでは?と指摘を受けて修正してるのだけどsystemの返す値がさっぱりわからなくて困ってます
0423デフォルトの名無しさん (エーイモ SEed-Aqvu)
垢版 |
2017/11/21(火) 11:41:02.99ID:qTGygbeTE
gcc -lライブラリ名 hoge.c

stdio.hと同じフォルダに自分が使いたいヘッダーファイルが存在してるのに
いちいち-lライブラリ名ってしないと参照できないんです
どうしてstdio.hは-lstdioって書かなくても使えるのに自分がインストールしたヘッダーファイルはいちいち-lで指定しないと使えないんでしょうか?
すか?
0429デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/21(火) 14:47:42.58ID:uBkGRn7P0
>>423
スクリプトかバッチを作ればいい
たとえばmycc.batというファイル名で
gcc -lライブラリ名 %*
と書き込んでおいて
mycc hoge.c
とやる
0430デフォルトの名無しさん (ワッチョイ e18a-H2sc)
垢版 |
2017/11/21(火) 19:27:53.90ID:5ScqS7z90
>>423
標準ライブラリオブジェクトはスタートアップファイル(crt0)に組み込まれていて自動的にリンクされる
標準以外のライブラリオブジェクトは明示的にリンクしないと使えない
0432デフォルトの名無しさん (ワッチョイ feeb-MUuo)
垢版 |
2017/11/21(火) 21:45:59.93ID:EZGPgPj40
まあ、先の問題については、ステップの厳密な定義が読み取れないし。
回答者の説明に矛盾がなければ○でいいと思うわ。
それでも誤答とされてしまったら、出題者がウンコだと思って忘れるレベル。
0438デフォルトの名無しさん (ワッチョイ 7d7f-GXP8)
垢版 |
2017/11/21(火) 23:33:58.03ID:6oQfsQ1l0
>>435
>>428はGnuWin32って名前から察するにPOSIXのregexだろ
置換なんてないから、正規表現コンパイルして検索して自分で書き換えるんだぞ

正規表現の置換を呼び出し一回で済ませられるような関数が
ANSIとかPOSIXにあるなら良いけど、そうじゃないだろ
0442デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/22(水) 00:18:19.23ID:CvPbHYJg0
>>417
こんなのはどうかなあ。
char *s が元になる文字列へのポインタ。p は char *p。

for (p = strrchr(s, '/'); p && p >= s && *p == '/' && ! *(p + 1); *p-- = '\0');
0443デフォルトの名無しさん (ワッチョイ 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 にシグナル番号が入る。
 }
}
0449デフォルトの名無しさん (ワッチョイ 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;
}
0450デフォルトの名無しさん (ワッチョイ 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");
}
0451デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:55.87ID:qJn/S+Fz0
rem test.bat
cl baka.c aho.cpp /EHsc && baka

ったく世話の焼ける(ぶつぶつ
0453デフォルトの名無しさん (ワッチョイ 02ab-RuWE)
垢版 |
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行目の文法がおかしいと思うのですが何処がおかしいのかわかりません
誤っている個所をご指導頂けないでしょうか?よろしくお願いします。
0461デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/23(木) 06:33:31.65ID:ZFTBiu2d0
君の言っている事がよくわからない
0462デフォルトの名無しさん (アウアウカー Sadb-AymA)
垢版 |
2017/11/23(木) 09:17:29.44ID:N/op9puJa
>>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?

madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね
0465デフォルトの名無しさん (ワッチョイ a77f-8Ex9)
垢版 |
2017/11/23(木) 10:51:34.50ID:ijGzvwTZ0
結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される

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

というか、これはC言語の話じゃないから各環境のスレで聞け
0466デフォルトの名無しさん (アウアウカー Sadb-AymA)
垢版 |
2017/11/23(木) 12:41:47.79ID:FGycjMyka
>>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます

一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました
0468デフォルトの名無しさん (スプッッ Sdbb-T4vC)
垢版 |
2017/11/24(金) 14:08:06.79ID:/RqU0h4Pd
コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective)
0473デフォルトの名無しさん (JP 0H4b-9mpY)
垢版 |
2017/11/24(金) 17:56:03.88ID:37SoWLJsH
ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる?
■ このスレッドは過去ログ倉庫に格納されています

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