トップページ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/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
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
アホ同志でワイワイやってるのが楽しいんだろうから判ってるヤツは茶々入れちゃダメだよ
0823デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>820
組み込み?
ならその手の物は使えないよ
0824 ◆QZaw55cn4c 2013/07/09(火) NY:AN:NY.AN
>>810
http://codepad.org/Vy9euZzT
08258102013/07/09(火) NY:AN:NY.AN
>>823
メモリにかなり制限がある環境でそれに近いと思います

>>824
なるほどー
staticで確保してそこを挿すようにすればよかったのですね
おかげさまで解決しました
ありがとう
08268112013/07/09(火) NY:AN:NY.AN
なんか勘違いしてた。配列は変数宣言したと同時に指定サイズ分だけメモリ確保されるんだったな。
それは別にしてあれこれ動かしてみた結果、サイズを別に渡すのがうまくいくと思った。


#include <stdio.h>

void func(char *ary, int size) {
printf("%s\n", &ary[0]);
printf("%s\n", &ary[size]);
strcpy(&ary[size],"22222");
}


int main() {
char ary[2][10] = {"000000000","111111111"};
func(ary, sizeof(ary[0]));
printf("%s\n", ary[1]);
return 0;
}
0827デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
「こんな基礎もわかんねぇの(プッ」っと思ったけど>>824みて基礎レベルじゃねぇとやっと気付いた俺ガイル
08288112013/07/09(火) NY:AN:NY.AN
>>826はポインタの方を無視してた。
08298112013/07/09(火) NY:AN:NY.AN
>>824は、配列をポインタへ移し替えて
関数コールしてるだけだろ。
これでいいのか?
08308112013/07/09(火) NY:AN:NY.AN
関数へ2次元配列を渡した時に、
ポインタと配列でアクセス方法が変わってしまう事と、
ポインタの時、データが連続している保証がない事で困る。
ポインタと配列をどちらも入力できるようにするのは諦めるべきでは?
ポインタの時、配列のようにデータが繋がっているとしたら、これで共通のアクセス可能だが。


#include <stdio.h>

void func(char *ary) {
strcpy(&ary[0],"22222");
strcpy(&ary[10],"33333333");
}



int main() {
char ary[2][10] = {"000000000","111111111"};
char* bry[2] = {"000000000","111111111"};
//func(ary); func(bry);
func(&ary[0][0]); func(&bry[0][0]);
printf("%s %s\n", ary[0], bry[0]);
printf("%s %s\n", ary[1], bry[1]);
return 0; }
0831デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>824
メモリ制限がある環境でstaticはないだろと思ったけど、malloc/freeで断片化するような頻度での呼び出しでは有りか。
0832 ◆QZaw55cn4c 2013/07/09(火) NY:AN:NY.AN
>>829
そもそも int a[][] と int *a[] とはまったく別物と決めてかかったほうがいい、それでみんな楽になる
0833デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>826
ここはてめーの学習帳じゃねーんだよゴミ
ゴミってポインタ以前に本当に頭わりーな
0834デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
初心者にえばり散らす奴は最低
0835デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
ポインタと配列の違いがよく分かってないんだろうな
今ならHeadFirstCで分かりやすく解説してあるから立ち読みしてくるといい
0836デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
【訃報】共有ソフト「Winny(ウィニー)」開発者の金子勇さん 急性心筋梗塞で死去 42歳[13/07/07]
http://anago.2ch.net/test/read.cgi/bizplus/1373207268/
0837片山博文MZパンク ◆0lBZNi.Q7evd 2013/07/09(火) NY:AN:NY.AN
>>817
リソースファイル
0838デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>837
ブログのアクセス数どのくらい?
何か面白いプログラム作ってよ
■ このスレッドは過去ログ倉庫に格納されています