トップページtech
1001コメント301KB

C言語なら俺に聞け(入門編)Part 116

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/06/14(金) 20:22:05.73
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 115
http://toro.2ch.net/test/read.cgi/tech/1368444993/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&;andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 164代目
http://toro.2ch.net/test/read.cgi/tech/1370255305/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/C/C++の宿題片付けます 165代目
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
07237172013/07/07(日) NY:AN:NY.AN
>>722
Amazonのレビューを読むと、配列とポインタの違いについての細かい説明があるようですね。
この機会に勉強してみようと思います。ありがとうございました。
0724デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
その場合普通、番兵(sentinel)
門番(gate keeper)は使わない。
0725デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
今までmallocした後freeなんて使ったことないんだけど
アプリケーションでこんな事やったら大事故が起きたりするの?
どの本にもfree必要ねーしwwとか書いてるけど。
0726デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
専用スレがあるからそっちに行きなさい。
0727デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>725
メモリリークするでござるよ。コンピュータのメモリがなくなって
コンピュータの動作が鈍重になり、いずれは処理不可能な状態におちいる。
すぐ実行を終了するようなものだと問題になることはないけどね。
0728デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>726
mallocの専用スレはここでしょうwww

>>727
でもランタイムでfreeは必要ないよね?
return 0で強制的に開放されるんだし。
0729デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>728
ずっと実行しっぱなしのものだったら解放していかんとやばいでしょ。
すぐに実行が終了するものだったら必要ない。
0730デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
ところがその話題は宗教戦争になるから隔離スレがある。
0731デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
windowsでコマンドプロンプト以外で実行端末ってありますか?
0732デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>731
ckwてのがあるよ。

ckw-mod on GitHub by ckw-mod Project
http://ckw-mod.github.io/
0733デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>732
むしろ作れますか?
それも技術者が作ったんでしょう?
実行端末ってどうやって作るんでしょう。
0734デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
0735デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>729
はぁ?
ゴミは黙ってろよ
メモリは確保したままになってるだけでそれだけ電気食うんだぞ
ただでさえ電気代が値上げだっつってんのに電気食うようなことを教えるな
電気食えばそれだけ発熱するから部屋も暑くなるし
お前電力会社の社員か何か
キモすぎ早く回線切れゴミ
0736デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
資源が勿体無いから専用スレ行こうぜ
http://toro.2ch.net/test/read.cgi/tech/1359549517/l50
07377292013/07/08(月) NY:AN:NY.AN
>>735
申し訳ありませんでした。わたしの軽率な発言は日本の電力消費を
上げ、みさなさまの会社の光熱費を上げ経営を圧迫し、連鎖的倒産に
導くばかりか、できるだけエアコンを使わず服装でカバーしようという
クールビズの活動のモチベーションまで下げかねないものであり、
地球温暖化という世界規模での異常事態を悪化させかねないものでした。
もしそうなれば南極の氷が融けて東京がビル50回の高さまで水没すると
聞いています。なんてことをしてしまったんだという思いでいっぱいです。
わたしは電力会社に勤めているわけではありませんが、電力の消費について
不適当な発言をしたことは間違いありません。
二度とこのようなことはいたしません。回線を切ってネットサーフィンの
時間をいままでの自分を省みる時間にあてたいと思います。本当に申し訳ありませんでした。
0738デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
原発ガンガン動かせばいいんだよ。
そうすれば電気代も安くなってfree()も減らせる。
まさかfree不要論を唱えるプログラマーの中に反原発派なんかいないよな?
0739デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
そもそもいまどきCで書くコードって大半は何かのプラグインとかモジュールとかじゃないの?
なにか不具合起こっても勝手にexitするようなわけにいかないことが多いだろうし、
きっちり終了処理書く癖つけとくべきだと思うけど
07407292013/07/08(月) NY:AN:NY.AN
>>738
freeするのにCPUさんがガンガン電気使ったりして。
07417292013/07/08(月) NY:AN:NY.AN
>>739
だね。それが現実的。
0742デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
いまどきCとかいうけど
高速なCが今時扱いされるのはなぜ?
0743デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
Cすら使えない低能の負け惜しみに振り回されてる>>742
07447292013/07/08(月) NY:AN:NY.AN
>>742
PythonとかHaskellとかJavaとかC並みに高速で安全性の高い言語
がありコンピュータの処理速度も上がり、言語による実行速度の
違いをさほど意識する必要がなくなってきたいまどきということでござろうよ。
0745デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>744
ベンチ結果も書かずに何言ってるの?
お前が勝手に意識しないだけだろ、キメェ
07467292013/07/08(月) NY:AN:NY.AN
>>745
黙れ羊野郎、はい論破。
07477292013/07/08(月) NY:AN:NY.AN
別に俺はー、>>745に理解してもらおうとは思ってねーしー、
俺はそう理解したと述べてるだけだしー、ベンチ結果が知りたければ
自分で勝手にベンチすればいんじゃねつー感じだしー、
一生メーメーほざいてろよって感じ。
0748デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
ここまで俺の自演
0749デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
Haskellって最近名前だけよく聞きますね。
メリットあるの?
0750デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>749
>>729みたいな知恵遅れでも使える
0751デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
などと意味不明なことを供述しており、警察は慎重に調べを進めるとしています
0752 ◆QZaw55cn4c 2013/07/08(月) NY:AN:NY.AN
>>731
cygwin の bash もわりと
0753デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>746
羊の寄せ乳知らない童貞野郎は引っ込んで露
0754 ◆QZaw55cn4c 2013/07/08(月) NY:AN:NY.AN
>>744
それがそうでもないんだ‥‥
うちの会社のとある24時間システム、java で組んであるけど、タスクマネージャをみるたびにページファイル使用量が増えていく‥‥
そして、ある日突然リブートするんだ‥‥

GC なんて信じらんない
0755 ◆QZaw55cn4c 2013/07/08(月) NY:AN:NY.AN
>>749
http://toro.2ch.net/test/read.cgi/tech/1364009659/
http://toro.2ch.net/test/read.cgi/tech/1363171842/
ここらがくわしいよ
07567292013/07/08(月) NY:AN:NY.AN
>>754
タスクマネージャを見なきゃいんじゃないでしょうかというバカなことをいうのは
やめておこうと思いますが、実装がまずいじゃないの?
0757デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
連投荒らしか
0758デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>754
>うちの会社のとある24時間システム

Qはロートルニートなんじゃね?
0759デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
保証値がない、または形骸化しているものは、
ただ使うだけで自分もろとも信用失墜する絶叫カーでしかないってことさ
0760デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
>>754
まあ、JAVA VM の実装がちゃんとしててメモリーリークがないとしても、そのシステムの実装がタコでメモリー確保しまくってたら、そりゃ落ちるわな。
0761デフォルトの名無しさん2013/07/08(月) NY:AN:NY.AN
JAVAのプログラムでやたらメモリを喰うものを見かけるが、明示的に解放する
必要がないからといってそういうところ無頓着なマが書いてんだろうな。
0762デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
javaに対して、メモリリークがないとか、アプリエラーがないとか思ってるなら
まずはその幻想をぶち壊す
0763デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
まあ話が果てしなく脱線しているのを無理やり元に戻してまとめ:

Cは時代遅れ
0764デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>762
壊すじゃなくて殺すだねそれ
0765デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
「幻想をぶち殺す」
というのは幻想を擬人化した表現であり
文学板ならまだしもム板ではただの基地害
0766 ◆QZaw55cn4c 2013/07/09(火) NY:AN:NY.AN
最近は「ぶち殺す」っていうのか?小泉さんが言ってたのはたしか「ぶち壊す」だったか「ぶっ潰す」だったか
0767デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
<string.h>の
strncat

strnはstringだと思う
catって何からきてるんですか?
0768デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
catinate
0769デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
strはstringだけどnは違うだろw
0770デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
Free!
0771デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
strcatを知らない世代か…
0772デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
straycats、迷い猫オーバーラン!ですね?
わかります。
0773 ◆QZaw55cn4c 2013/07/09(火) NY:AN:NY.AN
voidcat, ヘミ猫オーバーランですね!わかります
0774デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
linuxのlib/string.cにあった関数ですが、
int memcmp(const void *cs, const void *ct, size_t count)
{
const unsigned char *su1, *su2;
int res = 0;

for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
if ((res = *su1 - *su2) != 0)
break;
return res;
}

(res = *su1 - *su2) != 0
この部分は
*su1 != *su2
ではいけないんでしょうか?
0775デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>774
いいでしょ。これで。
for (...)
{
 if (*su1 != *su2)
 {
  break;
 }
}
return *su1 - *su2;
0776デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>774
memcmp()のリターン値は、
cs > ct → 正
cs < ct → 負
cs = ct → 0
だから。
0777デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>774
(res = *su1 - *su2) != 0 だと算術演算をしてその結果のフラグレジスタをそのまま
参照できるから速くなるのかな?

>>775 だと引き算の結果を有効に活用しないで、別に比較命令を実行しなくてはいけない。

最適化がかかれば関係ないかもしれんけど。
0778デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
resを求めたいのでついでにifにも使ってるんだろ
0779デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
char[] と char の文字列連結ってどうすればいいのん?

strcatだと連結ソースの型が違うよーって怒られるデス!
0780デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
どうしてもC言語つかわなきゃいけない人は自力でなんとかしろ。仕事のためだったら続けられない。
C言語でなくてもいいんだったらC++のstringで、a+bで連結できる。
0781デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>779
char str[100] = "abc";
char ch = 'x';

len = strlen(str);
str[len] = ch;
str[len + 1] = 0;
0782デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>780
わからないと格好つけて言ったらそうなるのか。
0783デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>777
0との比較なので
引き算 + 条件ジャンプ
比較演算 + 条件ジャンプ
CPUへの負荷は同じということなのですね
勉強になりました
0784デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>779
strlcat(dst, sizeof(dst), &c, 1);
0785デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>781,784
ありあと!
0786デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>775
それcount==0のときaccess violation
0787デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>786
だから何だバーカ。
0788デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
議論してるときに枝葉でガタガタ言ってくるやついると冷める。
0789デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
そもそもコンパイルできねえしな。
0790デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
細かいところに気付く目ざとい俺カッコいいとでも思ってんだろ。ただのアスペだよ。
0791デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
どちらかというと枝葉で議論してるんだけどね
0792デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
全然枝葉じゃないし。
よっぽど悔しかったか?
0793デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>792
*su1 != *su2
ではいけないのかって話ですが?
0794デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
access violation起こすなら致命的ではないのか
0795デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>793
>>775のコードに問題があるかどうかだが。
0796デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
一つの配列で最大何個要素作れますか?
疑問です。
0797デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
ページプリンタのファームで使用していたコンパイラで、
要素数に255個という制限があった。悲しかった。
0798デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>790
いやエッジケースくらい常に考えろよww
定数倍の速度より遥かに重要
0799デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>797
いやint x[N];
Nの最大値はどのくらいですか?
0800デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>795
でしょ。あんたが言ってるのはそれ、だから俺とあんたは違う話をしてるよね。
0801デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>798
揚げ足取りして何が楽しいのかね。
まともな教育受けてないんじゃないかね。
0802デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
一致不一致だけ知りたいのか、大小同じの比較をしたいのかという話だろ?
straycatsは迷い猫オーバーラン!を起こすけど、
それの対策用のstrayncats関数は無いからな。
0803デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>802
count==0の話だが?
0804デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>802
>>776
0805デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>801
やおい
0806デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
最近C言語でオブジェクト指向プログラミングの練習を始めた者です
ある構造体Boxに中の変数Countがあるのですが、その値を見る関数GetCountを関数ポインタを使ってメンバ関数的に割り当てようとしています

//include省略

typedef struct Box{
int count;
int (*GetCount)(struct Box *);
} Box_t;

int Box_GetCount(Box_t* p_box){
return p_box->count;
}

Box_t* Box_New(int num){
Box_t* p_box = (Box_t *)malloc( sizeof(Box_t) );
p_box->count = num;
p_box->GetCount = &Box_GetCount;
return p_box;
}

int main()
{
Box_t* box1 = Box_New(5);
printf("%d", box1->GetCount(box1));
free(box1);
return 0;
}

このやり方ですと、構造体Boxのメンバ関数GetCount(外部関数Box_GetCountのポインタ)でメンバ変数countを読む時に
box1->GetCount(box1) と自身のポインタを渡すようになっているのですが、これをbox1->GetCount()のように引数なしでできるでしょうか?
構造体内の宣言を変えればいいのか、関数Box_Newの中身を変えればいいのか悩んでおります。ご教授頂けると幸いです
0807デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>806
ムリ。
C++使ったほうがいい。
0808デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>806
できない
個人的にはbox1->GetCount(box1)にするくらいなら、Box_GetCount(box1)とかにすればと思う
0809デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>806
これだと多態はできても、抽象型プログラミングみたいのができないからあんまりうれしくないね。
Cでやるなら >>808 みたいにしてカプセル化くらいでいいと思うわ。
0810デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
void func(char *ary[]);

このような引数を持つ関数を呼び出す時の作法がわかりません
以下の二つの方法は試しましたがどちらもNGでした

char ary[5][10] = {0};
// ここでary に入れる処理 (strcpy(ary[0], "abc");等)
func(ary); // 型エラー

char *ary[10] = {0};
// ここでary に入れる処理(strcpy(ary[0], "abc");等)
func(ary); // 通るけどaryの中身がおかしい

どなたかよろしくお願いします。
0811デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
詳しくないか忘れたけど。
c言語 関数 引数 配列 型 サイズ
で検索したらいいんでは。
08128102013/07/09(火) NY:AN:NY.AN
それらしいワードで検索しても探す事は出来ませんでした
どなたかよろしくお願いします
0813デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>810
こういうこと?

char array[10] = "abcde";
func(&array);
08148112013/07/09(火) NY:AN:NY.AN
引数がchar*型の配列ってことで、渡す前にメモリ確保していなければ
エラーになるんだろう。
08158102013/07/09(火) NY:AN:NY.AN
>>813
いえ、これだと型が違うのでエラーになってしまいます

>>814
そうですね
なので char ary[5][10] = {0}; のように変数を用意してメモリ確保
その後にメモリへ目的の値ををコピー
そしてfunc読み出しとしたのですが型が違うと怒られてしまうのです

このようなケースでは具体的にどの様にすればいいのでしょうか?
08168112013/07/09(火) NY:AN:NY.AN
char ary[5][10] = {0};
これではダメだろう。関数側で書き込む領域まで大きめにメモリ確保しないと。
自分もだが、こういう基礎レベルで迷う場合はC++を使った方がいい。
vector<string>型なら簡単。
0817デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
プログラム内にデータファイル保存する事できますか?
exeファイルだけで全てすませたいです。
08188102013/07/09(火) NY:AN:NY.AN
>>816
申し訳ありませんが C でお願いします

そういえば getopt 等の関数がこのパターンに該当するのでGoogle等で検索してみた、、のですが
どれもmain関数からの呼び出しからのみで参考にならず…
08198112013/07/09(火) NY:AN:NY.AN
型エラーになるのは多分、関数の引数が配列として2次元以上になる場合、
コンパイラ側がchar[N]型みたいのを生成していて、ちょうどサイズを一致させないと受け付けなくなってる気がした。
08208102013/07/09(火) NY:AN:NY.AN
検索して見つけた…
malloc等を使う上に環境依存だとは…
今の環境だと確実にメモリ断片化が起きるので動的にメモリ確保は使えない…

malloc が使えない環境だと getopt 等の関数は使えないのかなぁ
08218062013/07/09(火) NY:AN:NY.AN
>>807-809 無理っぽいですか……やはり下手な内はOOPなら無理せずOOPL使えってことですね
返信ありがとうございました
0822デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
アホ同志でワイワイやってるのが楽しいんだろうから判ってるヤツは茶々入れちゃダメだよ
■ このスレッドは過去ログ倉庫に格納されています