トップページ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/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
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
ブログのアクセス数どのくらい?
何か面白いプログラム作ってよ
0839デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>837
ありがとう。
visual studioでそのファイル見つけました。
便利ですね。
0840toya2013/07/09(火) NY:AN:NY.AN
WikibooksのC言語の教科書が、標準ライブラリのページ以外は、一応完成した。
加筆修正、標準ライブラリの執筆してくれる方求む。
http://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E
0841デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
>>840
おつかれ。
0842デフォルトの名無しさん2013/07/09(火) NY:AN:NY.AN
入門レベルならその内容でいいと思うけど
応用Cとかいう題名でCの応用的な事を系統立てて学びたいどんな
プログラムにすればいいだろうか?

1章 
2章
0843デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
>>840
ここは執筆活動報告スレではない
他人に迷惑をかけないよう直ちに回線を切れ
0844デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
>>840
意義がある活動されてますね。
こういうのがあるの、初めて知りました。
0845 ◆QZaw55cn4c 2013/07/10(水) NY:AN:NY.AN
>>831
メモリ制限とは関係ないのでは?static な領域は計算可能だから必要な分だけ .data に確保されて問題ない。
static をつけずにスタックに配列(というおおげさなもの)を置くという方が、むしろ制限を意識する。
というか、配列を初期化するときには static をつけたくなるんだね、C89 が気になって、もうやめたいけどね。
0846デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
staticはヒープ領域じゃないの・・・・また恥を晒すのか?
0847 ◆QZaw55cn4c 2013/07/10(水) NY:AN:NY.AN
>>846
static はヒープじゃない、とは一言もいっていないが?
ただ、スタックはデフォルトのままでは「実行させるまで足りなくなることがわからない」けれども、static なら確保できなければコンパイルの時点ではねられるだろう?
配列をスタックに置くのはどーかと思うよ。

>>824
をみるかぎり static な領域のほうが制限がきつい、と思っているようだけれども、その判断は疑問だね。
0848 ◆QZaw55cn4c 2013/07/10(水) NY:AN:NY.AN
失礼
>>831 は static な領域のほうが制限がきつい、と思っているようだけれども、その判断は疑問だね。
0849デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
ヒープって、実行時に動的に割り当てる領域じゃなかった?
0850デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
staticな変数も起動時に割り当てられるよ
つーかQは頭大丈夫か?
0851デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
スタックに置いたら、プログラムサイズをlsで調べられなくなるじゃないですかー!!
0852デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
http://www.ibe.kagoshima-u.ac.jp/edu/gengo0/p8_1.gif

↑ これ、間違っているか?
0853 ◆QZaw55cn4c 2013/07/10(水) NY:AN:NY.AN
>>850
初期化しない分はたしかにそうだね
でも、初期化する分は、普通は、リンク前にすでに組み込まれているんじゃないの?

>>849
コード領域、スタック領域以外をヒープと呼ぶ人もいるようだ(昔なら DS セグメントレジスタでアクセスする分を全部ヒープといっていたようだね)。それに異論を唱えるつもりはない。

static な領域は、確保できないのならコンパイル&リンク時点ではねられるだろう?malloc() 失敗時にちまちま書くのが面倒なときは、えいや、と static にするね、配列なんか特にね。
0854 ◆QZaw55cn4c 2013/07/10(水) NY:AN:NY.AN
>>852
メモリ配置は環境によるね、その図の場合もあるし、ヒープとスタックが逆の場合もあるよ。静的領域(.data と .bss)は普通はコードの後ろに置くようだけれどもね。
0855デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
>>853
初期化する分もコード内に持っていて、プログラム起動時にヒープ領域にコピーされる
0856デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
>>853
>>static な領域は、確保できないのならコンパイル&リンク時点ではねられるだろう?

それは違う。メモリを割り当てるのはあくまでプログラム実行時(ロード時)。
0857デフォルトの名無しさん2013/07/10(水) NY:AN:NY.AN
あーまたQzの馬鹿講義が始まったよ(ノ∀`)アチャー
0858 ◆QZaw55cn4c 2013/07/10(水) NY:AN:NY.AN
>>855
ふむ。.text, .rdata, .data 各セクションの実行時における配置にすきまがある環境もあるんだね、意識したことはないけど
でも「確保できないのならコンパイル&リンク時点ではねられる」という点はどうであれ同じだと思うだけれども?
コンパイルできたコードが実行時(プログラムロード時)にはねられることもあるの?
■ このスレッドは過去ログ倉庫に格納されています