【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131at TECH
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 - 暇つぶし2ch2:デフォルトの名無しさん
07/02/01 23:09:04
2げと

3:デフォルトの名無しさん
07/02/01 23:09:27
>>295 ローカルルール
> ◆ ちょっとしたネタ・雑談・質問は、雑談or攻略質問スレッドで。
>   一つの質問のために一つのスレを立てるのはやめてね。
>>296
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
スレリンク(tech板)

4:デフォルトの名無しさん
07/02/01 23:28:55
いちもつ

5:デフォルトの名無しさん
07/02/02 01:18:52
こんばんわ


#include <stdio.h>

/*整数10個入力しその合計を出力せよ*/

int main()
{
char kei[10];
int goukei = 0;
int i;

for(i = 0; i <= 10; i++){

kei[i] = getchar();

printf("数値:&c",kei[i]);

goukei += kei[i];
}

printf("合計は:%c",goukei);



}

これどこがまちがってるのかすごくわからないです
おねがいしますおしえてくださいです。

6:デフォルトの名無しさん
07/02/02 01:20:34
printf("&c → printf("%d
printf("%c → printf("%d

7:デフォルトの名無しさん
07/02/02 01:33:47
クマーーーーー!!

8:デフォルトの名無しさん
07/02/02 01:40:23
>>6
レスありがとうございます。

やってみたのですが・・・
うまくいきません・・・ごめんなさい
10回まわっていくはずなのに6回だけになってしまい


数値:&c数値&c数値&2


という感じになってしまいます
。・゚゚・(>_<;)・゚゚・。

9:デフォルトの名無しさん
07/02/02 02:26:27
誤:for(i = 0; i <= 10; i++){
正:for(i = 0; i < 10; i++){

10:デフォルトの名無しさん
07/02/02 02:27:45
誤:printf("数値:&c",kei[i]);
正:printf("数値:%c",kei[i]);

11:デフォルトの名無しさん
07/02/02 02:51:18
数値→int型
文字→char型

12:デフォルトの名無しさん
07/02/02 03:01:29

>>11
うっどうしてもできないです・・・
ごめんなさいごめんなさい(*ノ-;*)エーン

13:デフォルトの名無しさん
07/02/02 03:02:35
#include <stdio.h>

/*手操作入力で数値を10個入力しその合計を画面に出力する*/

int main()
{
int kei[10];
int goukei = 0;
int i;

printf("数値を入力せよ\n");

for(i = 0; i < 10; i++){

kei[i] = getchar();

printf("数値:%c\n",kei[i]);

goukei += kei[i];
printf("-------------------------------------------------\n");

}

printf("合計は:%c",goukei);



}


というふうにかえてみたのですが

14:デフォルトの名無しさん
07/02/02 03:09:26
ASCIIな環境なら

kei[i] = getchar();  を
kei[i] = getchar() - 0x30; にするとか

で、
printfの中の %c は全部 %d に替えろ


15:デフォルトの名無しさん
07/02/02 03:11:59
数値を読み込むならscanf関数を使う手もある。


16:デフォルトの名無しさん
07/02/02 03:13:16
>>15
ですよね・・・
わたしもscanfならgetcharよりわかるのですが
こんかいはgetcharでということなんですよね・・・
;;;;(;・・)ゞウーン・・・むずかしぃですね

17:デフォルトの名無しさん
07/02/02 03:16:08
>>14
ASCII環境かどうかは正直よくわからないですが
表示される数値が1を入力すると49とでるので
ASCIIコードで表示されているのかな?とおもってたりします



18:デフォルトの名無しさん
07/02/02 04:06:41
0x30なんて絶対書くなよ。
必ず'0'にしろ。

19:デフォルトの名無しさん
07/02/02 04:08:41
>>18
立った一問に私何十時間かかってるんだろう・・・なみだでてきた
でもまけない
そうなんですか・・・わかりました・・・ありがとうです

20:デフォルトの名無しさん
07/02/02 05:06:47
>>19
getcharは1文字ずつ読み込む関数。
入力で打ったキーは全部1文字ずつ読み込む。

for(i=0; i<10; i++){

kei[i] = getchar();

}
だと、10文字読み込んで終わりだぞ。



21:デフォルトの名無しさん
07/02/02 07:32:49
>>20
キーボードの上に手を置いたままねてた・・・(o;TωT)o" ビクッ!

キーボード入力で整数10個となってるから
10文字でいいとおもっているんですが・・・どうなんでしょう?
そのさいgetchar()をしようするという指定なんです・・・涙

本などみたのですがscanf()関数の詳しいことを書いてる本はおおい
のですがgetchar関数はあまりくわしくかかれてないので
飲み込みがわかりません・・・・

printf()関数で入力した文字を出力なのか・・.
などと
混乱しています。
~(=^‥^A アセアセ・・・

22:デフォルトの名無しさん
07/02/02 07:45:50
getchar() の代わりにこれ。多分出題者の意図するところはこういう事じゃないすか。
int next_int() {
 int c, n = 0;
 do { if((c = getchar()) == EOF) return 0; } while(!isdigit(c));
 do { n = c - '0' + n * 10; } while((c = getchar()) != EOF && isdigit(c));
 return n;
}

23:デフォルトの名無しさん
07/02/02 07:56:17
>>22
すみません・・・
ちょっとわからないです・・・
でも、帰ってくるまでには調べておこうと思います。
ありがとうございますです(o*。_。)oペコッ

24:デフォルトの名無しさん
07/02/02 10:37:28
>>23
文字定数を整数型に変換しないと計算できなくない?

25:デフォルトの名無しさん
07/02/02 12:02:52
ここまで誰も「宿題スレ逝け」と言わないことに驚愕

26:デフォルトの名無しさん
07/02/02 12:46:51
#include <ctype.h>    /* 文字の種類を判別するためのライブラリ */
#include <stdio.h>

int main()
{
 int c,       /* getchar()で「いま読んだ1文字」を覚えておく変数 */
   flag =0,    /* 読んでいた部分が数値なのかそうでないのかを覚えておくフラグ */
   value=0,    /* 入力された整数ひとつぶんを覚えておく変数 */
   total=0,    /* 入力された整数の合計を覚えておく変数 */
   count=0;    /* 入力された整数の数を数えている変数 */

 while(count<10){    /* 10個読み込むまで繰り返す */
  c=getchar();    /* 一文字読む */
  if(isdigit(c)){    /* もし数字なら、 */
   value=value*10+c-'0';    /* valueに値を取り込む(この計算式の意味についてはよく考えること) */
   flag=1;             /* いま数字を読みましたというしるし */
  }
  else if(flag==1){    /* 数字でないものを読んだとき、直前に読んだものが数字なら、そこで一つの整数が終わったということだから、 */
   printf("数値:%d\n",value);    /* valueに取り込んだ値を印字する */
   total+=value;            /* valueの値をtotalに足し込む */
   count++;               /* 読み込んだ数を数える */
   value=0;               /* 次の数のためにvalueを初期化する */
   flag=0;                /* 数字でないものを読みましたというしるし */
  }
 }
 printf("合計は:%d\n",total);    /* totalを印字する */

 return 0;    /* 必ずreturnすること */
}

27:デフォルトの名無しさん
07/02/02 12:57:18
書いてから気付いたが、これは整数ではなく自然数しか想定していない
負の数にまで対応する気ならもっとややこしくなるが、
上のが理解できないようならどっちみち無理だ

28:デフォルトの名無しさん
07/02/02 13:58:51
なんでめんどくさいことするの?
全部文字で読み込んでから数字に変換して計算すればいいじゃん^^;;

29:デフォルトの名無しさん
07/02/02 15:01:00
>28
どうせ1文字1文字読み取るという動作は同じだからたいして変わらんし
文字列に読み込む場合はバッファがあふれないようにする手間が
それを理解する手間こみで必要だから

30:デフォルトの名無しさん
07/02/02 15:10:53
どう考えても初級練習問題のレベルじゃないんだよなぁ…
「数字を10個連続で入力させてその合計を求めろ」って問題じゃないのかぁ?

31:デフォルトの名無しさん
07/02/02 16:38:05
宿題スレ逝けと言いたい。

>>29
>>22 じゃ駄目なのか?

32:デフォルトの名無しさん
07/02/02 17:58:03
>>31
>>22だと何も数字打たずにEnter叩いた場合0が返るぞ
それでいいってんならいいけどさ

33:デフォルトの名無しさん
07/02/02 18:13:10
数字が出るまで読み飛ばしてるからそれはないと思う

34:デフォルトの名無しさん
07/02/02 19:44:36
あー勘違いしてたわ
>>32は見なかったことに

35:デフォルトの名無しさん
07/02/02 22:31:15
最高にわろた

36:デフォルトの名無しさん
07/02/02 22:53:53
int n = 0;
printf("%d %d", n++, n++);
って未定義なの?

37:デフォルトの名無しさん
07/02/02 22:54:47
>>36
確か、未定義のハズ。

38:デフォルトの名無しさん
07/02/03 00:13:24
実引数の評価される順が処理系定義なだけだと思うのだが。

39:デフォルトの名無しさん
07/02/03 01:22:24
>>36
2つの副作用完了点(シーケンスポイント)の間で同じ値を2回変更しているので、
未定義動作になります。

40:デフォルトの名無しさん
07/02/03 14:23:51
sprintfを使ったときstdio.hをインクルードし忘れていて、スタックを壊し
サブルーチンからリターンするアドレスが0x00000000になって、おかしくした俺がきましたよ。


・・・不思議と1ステップずつデバッガで操作したら吹っ飛ばなかったのだが。

41:デフォルトの名無しさん
07/02/03 14:50:06
>>39
それなら
printf("%d %d", n+=1, n+=2);
みたいなのも未定義?

42:デフォルトの名無しさん
07/02/03 15:14:43
>>41
もちろん

43:デフォルトの名無しさん
07/02/03 16:58:48
int f(int *n){return (*n)++;}

・・・
printf("%d %d\n", f(&n), f(&n));

は、未定義じゃないよね? 結果は処理系依存だけど。

44:デフォルトの名無しさん
07/02/03 17:05:31
いいえ。

45:デフォルトの名無しさん
07/02/03 17:29:16
>>43
うん。 return 文の完了にシーケンスポイントがあるので大丈夫。

46:デフォルトの名無しさん
07/02/03 23:14:24
顔文字 (o*。_。)oペコッ ~(=^‥^A アセアセ・・・ とか使う馬鹿に
おまいらよく真面目に答えられるな

どう考えてもここはスルーするべき所じゃないのか?

47:デフォルトの名無しさん
07/02/03 23:30:48
みなさんありがとうございます。

いちおう理解して自分のなかで消化できました・・・
いろいろな助言ありがとうございました。
いいわけなんですが、学校では今までscanf()を使ってたり
簡単な関数で表現をしてきたので
いざ自分が社会人になって頑張っていこうと思うと・・・

自分が使えない人間である

とひしひしとわかってきました。
エンジニアという職業は常に勉強ですから
考えることがおおいですが
すこしずつ・・・皆さんに近づけるよう
がんばりたいとおもいます。

本当にありがとうございました!!!


48:デフォルトの名無しさん
07/02/04 00:25:52
>>47
お前は向いてないから諦めた方がいい

49:デフォルトの名無しさん
07/02/04 00:31:14
~(=^‥^A アセアセ

50:デフォルトの名無しさん
07/02/04 06:53:08
>>46
そういうおまえはなぜスルーしない。

51:デフォルトの名無しさん
07/02/04 07:09:08
スルーしてるじゃんw

52:デフォルトの名無しさん
07/02/04 18:58:56
ちっともスルーできてないし、おまけにぶり返している

53:デフォルトの名無しさん
07/02/04 20:05:59
スルーは規格外らしい。

54:デフォルトの名無しさん
07/02/05 22:02:11
 value=value*10+c-'0';    /* valueに値を取り込む(この計算式の意味についてはよく考えること) */

わかんね

55:デフォルトの名無しさん
07/02/05 22:12:30
'0'から'9'が連続していることは保証されていますか?

56:デフォルトの名無しさん
07/02/05 22:15:24
保証されています

57:デフォルトの名無しさん
07/02/05 22:17:08
規格のどのあたりに書いてるか分かりますか?

58:デフォルトの名無しさん
07/02/05 22:17:36
保証されていません

59:デフォルトの名無しさん
07/02/05 22:18:23
規格のそのあたりに書かれています

60:デフォルトの名無しさん
07/02/05 22:20:40
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
 │                                      │
 │          おしえてあげないよ。  ジャン!         │
 │                                      │
  \_________________________/
        V                V              V

     _,∩_         _,∩_           _,∩_
    (_____)ゝ、     (_____)    y     (_____)
    / :: :: :: ヽ 〉     /-‐:: ::‐-ヽ /       / :: :: :: ヽ
   _./ (・ )ll(・ ) ∨     _/  0) i! 0) ∨      _/ ( ・)i!(・ ) ゙、_
 // :: :: ∈ゝ :: ::ヽ   // ::  ‐-‐ :: ヽ    //  :: ー一 :: ヽ\
. ゝ/:: :: ::  :: :: ::ヽ  ゝ/ :: ::  ::  :: :: ヽ   ゝ/ :: ::  ::  :: :: ヽく
   ̄ ̄ | ̄ ̄ | ̄ ̄     ̄ ̄ | ̄ ̄ | ̄ ̄     ̄ ̄ | ̄ ̄ | ̄ ̄
       |     |             |     |             |     |
    ⊂!     !つ        ⊂!     !つ        ⊂!     !つ

61:デフォルトの名無しさん
07/02/05 22:27:47
>>57
URLリンク(ja.wikipedia.org)

62:デフォルトの名無しさん
07/02/05 22:31:23
分かりません~(=^‥^A アセアセ

63:デフォルトの名無しさん
07/02/05 22:31:50
>>61
Cでは常にASCIIコードが使われると保証されていると?

64:デフォルトの名無しさん
07/02/05 22:31:55
>>61
英語でお願いします。

65:デフォルトの名無しさん
07/02/05 22:40:12
>>63
CではASCIIでなければならないという規定はないが、
基本文字集合で、'0'から'9'がこの順で並んでいなければならないという規定はある。

>>55-63
JIS X3010:2003では5.2.1。ISO/IEC 9899:1999でも同じ位置にあると思う。

66:デフォルトの名無しさん
07/02/05 22:46:08
ねーよw

67:デフォルトの名無しさん
07/02/05 22:46:21
JIS X 3010:2003 抜粋

5.2.1 文字集合
・・・
ソース基本文字集合及び実行基本文字集合は,少なくとも次に揚げる要素をもっていなければならない。
・・・
― 10個の10進数字(digit)
   0 1 2 3 4 5 6 7 8 9
・・・
ソース基本文字集合及び実行基本文字集合の双方において,10進数字に関する上の並びにおいて,
0の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ1だけ大きくなければならない。
・・・


68:デフォルトの名無しさん
07/02/05 22:49:20
保証されています。

69:デフォルトの名無しさん
07/02/05 23:27:17
>>67
該当箇所を見て確かに保証されていることは理解出来たのですが、
アルファベットはどうなのですか?書き方が微妙で判断がつきにくいんですが

70:デフォルトの名無しさん
07/02/05 23:31:33
さっさと教エロや(゜Д゜#)

71:デフォルトの名無しさん
07/02/05 23:42:13
>>69
保証されていません
10進数字以外の文字は一般的に数値との関連性は薄いためでしょう
16進用の文字は大文字小文字の都合で一本化はできませんし

ほかに保証されているのは、ヌル文字が全ビットゼロであることだけです

72:デフォルトの名無しさん
07/02/06 00:12:48
>71
良く分かりました
詳しい説明どうもありがとう

73:デフォルトの名無しさん
07/02/06 00:21:34
全然わかりません~(=^‥^A アセアセ

74:デフォルトの名無しさん
07/02/06 00:53:00
分からない奴には必要ない事

75:デフォルトの名無しさん
07/02/06 00:54:26
ちょっとは文字コード体系見るぐらいしろやおまえら

76:デフォルトの名無しさん
07/02/06 01:16:04
すみません~(=^‥^A アセアセ

77:デフォルトの名無しさん
07/02/06 03:32:20
俺に謝れ

78:デフォルトの名無しさん
07/02/06 10:20:48
#defineMOV_SEGTBL_USER(str){\
a->regs.##str##.value= b->##str##.value;\
a->regs.##str##.addr = b->##str##.addr;\
}
こういうマクロ作って、例えば。
{ a->regs.test.value = b->test.value; a->regs.test.addr = b->test.addr; };
と展開されることを期待したんだけど

Emacsのcc-modeのマクロ展開機能だと、うまくこのように展開されてるんだけど
コンパイルすると。

"." と "test" を貼付けましたが正常なプリプロセッサトークンとなりません


79:デフォルトの名無しさん
07/02/06 10:21:30
ごめん、途中で書き込んじゃった。

>>78の続き
というコンパイルエラーが出てコンパイルできない。

どうしたらいい?

80:デフォルトの名無しさん
07/02/06 10:29:37
お帰りください(o*。_。)oペコッ

81:デフォルトの名無しさん
07/02/06 10:53:23
>>78
正常なプリプロセッサトークンとするために "." と "test" を貼り付けなければいいんだろ。

82:デフォルトの名無しさん
07/02/06 10:57:06
>>81
じゃこういうマクロの使い方は出来ないってこと?

83:デフォルトの名無しさん
07/02/06 10:59:32
トークン連結演算子はトークンとトークンを連結するんであって
トークンと演算子との間に書いたらおかしくなるのはあたりまえ

84:デフォルトの名無しさん
07/02/06 11:00:37
じゃ代替案なにかありませんか?

85:デフォルトの名無しさん
07/02/06 11:06:05
##をはずして代わりにカッコでくくれ

86:デフォルトの名無しさん
07/02/06 11:08:40
あ、まちがった
くくるな

87:デフォルトの名無しさん
07/02/06 11:09:40
>>85-86
Thx!!

88:デフォルトの名無しさん
07/02/06 14:14:55
ちょっと文字列比較のベンチマーク取ってみたら

char hoge[] = "BenchMarkTest";

1:  if (strcmp(hoge, "BenchMarkTest") == 0) {}

2:  if (hoge[0] == 'B' && hoge[1] == 'e' && hoge[2] == 'n'
     hoge[3] == 'c' && hoge[4] == 'h' ・・・・・・・・・・続く・・・・・・・) {}

コンパイラはgccで最適化オプション -O -O2 -O3 をそれぞれ試した。


2 のほうが全開早いんだけど、そんなもん?
文字列比較は、2の方法で書くべき?



89:デフォルトの名無しさん
07/02/06 14:16:24
暑いですね~(=^‥^A アセアセ

90:88
07/02/06 14:25:34
ゴメン、手元にstrcmpのソースあったわww


91:デフォルトの名無しさん
07/02/06 15:11:42
お前は全部マシン語で組んでればいいよ

92:デフォルトの名無しさん
07/02/06 15:13:19
>>88
たぶん2に最適化かけたら文自体が消えるぞ

93:デフォルトの名無しさん
07/02/06 15:14:36
ミシン語って何ですか?(o*。_。)oペコッ

94:デフォルトの名無しさん
07/02/06 15:54:04
質問です!
Ⅽ初心者で、今MFCを使用しない前提でプログラムを組んでいます。
そこでMessageBox関数というのを見つけたのですが、
これはMFCとは無関係なのでしょうか?

95:デフォルトの名無しさん
07/02/06 15:59:59
無関係なので使ってかまいません

96:デフォルトの名無しさん
07/02/06 16:00:36
>>93
わかってると思うけどパソコン自体がI抵抗、コンデンサ
、コイル、ダイオード、トランジスタ等々(意味的には同じ
ととらえて良い部分がありますが)でできた回路です。
で、CPU(たぶんメモリも)5V~0V(正確には0Vに近い小さな電圧)
のいんか電圧から、電流が流れています。
この5Vで流れる電流を1とし0Vで流れる電流を0としてCPUの中で
の要はダイオードの組み合わせみたいなもので出来た回路で・・・
説明めんどくせ!
要はマシン語ってのは1と0の羅列。それの事となる。
けど、そんなもん全部理解するには頭の中にパソコンの回路構成
が入ってて、なおかつそれを・・・
説明めんどくせ!
まぁ、アセンブラで書けってことじゃないの?


97:デフォルトの名無しさん
07/02/06 16:02:56
わかりません~(=^‥^A アセアセ

98:デフォルトの名無しさん
07/02/06 16:03:44
>>94
大いに結構!!
他にもいっぱいwin32apiの関数あるから使っていこう。
そして全部覚えよう。そして覚えれたなら、君を神様と呼ばしていただこう

99:94
07/02/06 16:11:00
やさしい方ばかりで涙がでそうです;;
ありがとう

100:デフォルトの名無しさん
07/02/06 16:34:03
わろた~(=^‥^A アセアセ

101:デフォルトの名無しさん
07/02/06 18:56:34
>>93
マシン語はアセンブラ言語とほぼ同じとみて差し支えない

102:デフォルトの名無しさん
07/02/06 20:00:45
ちょっとスレタイから離れすぎですよ、藻前等。

103:デフォルトの名無しさん
07/02/07 00:31:48
;;;;(;・・)ゞウーン・・・むずかしぃですね

104:デフォルトの名無しさん
07/02/07 03:25:55
>>103
初心者向けのスレで揉まれて来ることをお勧めします。

105:デフォルトの名無しさん
07/02/07 09:58:30
遠慮します(o*。_。)oペコッ

106:デフォルトの名無しさん
07/02/07 11:41:37
[1] 授業単元:数値計算法
[2] 問題文(含コード&リンク):以下の常微分方程式をホイン法で解くためのプログラムを作成しなさい。また
0<=t<=10におけるx(t)およびy(t)のグラフをエクセルで作成しなさい。
dx/dt=2x(t)-0.01x(t)y(t)
初期条件にx(0)=300,y(0)=150
dy/dt=-y(t)+0.01x(t)y(t)
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語:c言語
[4] 期限:2007年2月9日まで
#include <stdio.h>
double func(double x, double y);
void heun(double x, double y, double a,double b, int n,double (*f)(double,double));
int main(void)
{ int n;
print("分割数を入力してください--->")
scanf("%d",&n);
heun(0.0,1.0,0.0,1.0,n ,func);
return 0;}
void heun(double x, double y, double a, double b, int n, double (*f)(double,double))
{ double k1,k2,h;
int i;
h = (b-x)/n;
for (i = 0 ; i<n ; i++)
{ k1=f(x,y); k2 = f(x+h,y+h*k1);
y = y+h/2.0 * (k1 +k2);
x = x+h;
print("x=%f \t y=%f \n" , x,y);}}
ここからどういじるのでしょうか?

107:デフォルトの名無しさん
07/02/07 11:44:33
宿題は宿題スレ逝け

108:デフォルトの名無しさん
07/02/07 12:00:03
分からないんですね~(=^‥^A アセアセ

109:デフォルトの名無しさん
07/02/07 13:18:43
分かる分からない以前の問題だな

110:デフォルトの名無しさん
07/02/07 13:20:23
分かる分からない以前の問題なんですねw~(=^‥^A アセアセ

111:デフォルトの名無しさん
07/02/07 13:23:22
分かる分からない以前の問題だと分かってないのはお前だぜ

112:デフォルトの名無しさん
07/02/07 13:33:04
       / \  /\ キリッ
.     / (ー)  (ー)\      
    /   ⌒(__人__)⌒ \    
    |      |r┬-|    |      分かる分からない以前の問題だと分かってないのはお前だぜ
     \     `ー'´   /     
    ノ            \
  /´               ヽ              
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.    
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //  だっておwwwwwwwwwwwww~(=^‥^A アセアセ
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /     バ
 |    |   l||l 从人 l||l      l||l 从人 l||l  バ   ン
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、    ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


113:デフォルトの名無しさん
07/02/07 15:18:00
次の患者さんどうぞ

114:デフォルトの名無しさん
07/02/07 15:56:36
16歳独身

最近、朝起きるとき、非常に気持ち良い快感で目覚めると
パンツがカピカピになってます。
何か尿道あたりに細菌が混入し、病気になっているのでしょうか。
心配で夜もねむれません。まぁ寝れますが。
これはどういった症状なのでしょう。

追伸:
最近SEXという言葉をしりましたが、意味はまだ理解してません。

115:デフォルトの名無しさん
07/02/07 19:51:18
       / \  /\ キリッ
.     / (ー)  (ー)\      
    /   ⌒(__人__)⌒ \    
    |      |r┬-|    |      分かる分からない以前の問題だと分かってないのはお前だぜだっておwwwwwwwwwwwww~(=^‥^A アセアセ
     \     `ー'´   /     
    ノ            \
  /´               ヽ              
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.    
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //  だっておwwwwwwwwwwwww
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /     バ
 |    |   l||l 从人 l||l      l||l 从人 l||l  バ   ン
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、    ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


116:デフォルトの名無しさん
07/02/07 19:52:57
ははは・・・~(=^‥^A アセアセ

117:デフォルトの名無しさん
07/02/07 22:29:42
次の患者さんどうぞ

118:デフォルトの名無しさん
07/02/09 15:42:29
クラミジアにかかってしまいました
痒いです

119:デフォルトの名無しさん
07/02/09 16:04:10
剃毛した後に消毒用エタノールで綺麗にした後
この抗生剤を飲み、下着を適度に履き替え局部を清潔に保つようにしてください
一週間ほどで良いでしょう

120:デフォルトの名無しさん
07/02/09 23:41:05
>>118
つテトラサイクリン

121:デフォルトの名無しさん
07/02/10 04:26:29
>>118
残念だが、もうチンコは諦めてくれ。

122:デフォルトの名無しさん
07/02/11 23:46:18
ここ数年、仕事でC言語使って開発しています。

動くものは作れるのですが、
設計?構造でいつも悩んでいます。(状態遷移とか。。)

1つのイベントと複数のトリガを管理する定石とか、
状態遷移を管理するときの定石とか
まとまった書籍/HPないでしょうか?

デザインパターンのように拡張性を考慮した設計が知りたいです。

123:デフォルトの名無しさん
07/02/12 08:21:44
正直、スレ違い。

124:デフォルトの名無しさん
07/02/12 13:06:15
int a[42] = {}, b[42] = {0}

配列を0で初期化するのにこの二通りを目にするんだけど、
規格上はどちらも等価ですか?

125:デフォルトの名無しさん
07/02/12 14:13:00
規格上は、{}の中には一つ以上の初期値を書かなければならないことになっている

126:デフォルトの名無しさん
07/02/12 14:26:14
なるほど。ありがとうございます

127:デフォルトの名無しさん
07/02/12 23:27:37
>125
便乗だけど、その理由が何なのか知りたいのだが。

128:デフォルトの名無しさん
07/02/13 00:03:24
>>127
つ【規格でそう決まっているから】

まあマジレスすると、配列(構造体とかもだが)の宣言時の{}は、
複合文のくくりである{}とは違うもので、「初期化子となる式のリスト」を意味する。
(もちろん、中のカンマもカンマ区切りであってカンマ演算子ではない)
つまり、「=」が暗示するように、そこには何らかの式が少なくとも1つなければいけない。
ということ。構文上の問題だから、a[42]={}; でもOKなコンパイラもあるだろうけどね。

129:デフォルトの名無しさん
07/02/13 04:40:04
= {} だったら、何も代入しないのか、空を代入するのか、よく分かんないんだよな。

130:デフォルトの名無しさん
07/02/13 13:51:56
char str[SIZE] = "";

は全部ヌル文字になる?それとも

char str[SIZE] = {'\0'};

と書かなきゃダメ?

131:デフォルトの名無しさん
07/02/13 14:06:56
>>130
前者後者ともローカル変数であるならば、関数突入時に毎回毎回、0のコピーか代入が発生する。
恐らく前者は、SIZEbyte分""のためのスペースが確保されることになる。

まぁ、全部ナル文字になることを当てにするロジックは推奨できないが。

132:デフォルトの名無しさん
07/02/13 16:57:45
memset

133:デフォルトの名無しさん
07/02/13 17:44:28
>>130
どっちも同じ。
char配列の文字列リテラルでの初期化は、
下のように1つずつ文字定数を指定したかのように扱われる。

134:デフォルトの名無しさん
07/02/14 21:38:40
C++のstring.substr()のようなことがやりたいのですが、Cで文字列を抜き出す関数は何ですか?

135:デフォルトの名無しさん
07/02/14 21:49:18
>>134
無いと思っていい。強いて言えば memcpy() ?

136:デフォルトの名無しさん
07/02/14 23:25:41
ないんですか。道理で検索しても出てこなかったんですね。
memcpyから自作してみます。ありがとうございました。

137:デフォルトの名無しさん
07/02/14 23:35:04
っていうかいつからsubstrはC++の標準になった?

138:デフォルトの名無しさん
07/02/14 23:40:41
最初にISOで規格化されたときから
クラステンプレートstd::basic_stringの非静的メンバ関数になっている。

139:デフォルトの名無しさん
07/02/14 23:43:01
>137
(゚д゚)

140:デフォルトの名無しさん
07/02/15 01:27:58
>>134
memcpy()なんぞ使わずに、こんな関数でも用意しろ。
char * substr(char * buf, const char * str, int pos, int n)
{
sprintf(buf, "%.*s", n, str + pos);
return buf;
}

141:デフォルトの名無しさん
07/02/15 01:37:12
>>140
関数用意するのはいいとして、こんな処理に sprintf() は高すぎる。
ここは memcpy() の出番だろ。

142:デフォルトの名無しさん
07/02/15 06:40:40
|  |                                       人|  |
|  |                                        (_ .|  |
|  |                           strncpy → .(・∀|_|
|_|ω・`)  ←strncat                        (⊃ |糞|
|質|と )                                |∧.| ̄|
| ̄|u'

143:デフォルトの名無しさん
07/02/15 06:47:18
>>142
いいの、おまえらはカスだから。

144:デフォルトの名無しさん
07/02/15 23:38:34
strncpyはともかく、strncatをカスと言うな

145:デフォルトの名無しさん
07/02/17 23:25:42
質問です
4バイト(32bit)で1が立っているかどうかを、1ビットずつ判定していきたいのですが、

for( i=0 ; i<32 ; i++ )
{
  if( (unsigned long)abc & (1<<i) == 1<<i )
  {
  }
}

こんな感じでいいでしょうか?
全然違うぞとかアドバイスありましたらよろしくお願いします。

146:デフォルトの名無しさん
07/02/17 23:41:51
間違ってはないけど

if (abc & (1<<i))
{
}

で十分じゃね

147:デフォルトの名無しさん
07/02/17 23:42:55
>>145
キャスト要らない。
1 だと int なので、符号ビットなど移植性を考えると 14 回までしか左シフトできない。
マスクした結果は 0 と比較したほうが効率がいいし、ソースが簡単にできる。

ってことで
  if( (abc & (1UL<<i)) != 0 )
または
  if(abc & (1UL<<i))
あたりがお勧め。

148:デフォルトの名無しさん
07/02/17 23:49:55
あれ << って算術シフトだっけ?
1 << i だったら最上位ビットは動かないのか

149:デフォルトの名無しさん
07/02/18 00:10:41
>>148
この場合は負の数が関係なので符号ビットとか言ったのは混乱の元だった。
ごめん。

どの環境でも保証されている INT_MAX の最小値は 32767 なので、
16384 になる 1 << 14 までしか移植性のある動作は保証されない。
それ以上シフトすると未定義動作になる。

1UL だと型が unsigned long になり、 ULONG_MAX の最小値の定義は
4294967295 なので 2147483648 になる 1UL << 31 まで大丈夫。

150:145
07/02/18 00:27:04
みなさんありがとうございます
言われてifの使い方調べて勉強になりました。
if(a) a≠0:真 a=0:偽 なので
!=0や==0を省略できるのですね

あとULですが、どの環境でも使えるものなのでしょうか?

151:デフォルトの名無しさん
07/02/18 00:33:45
>>150
整数リテラルのサフィックス UL は標準。どこでも使える。

152:デフォルトの名無しさん
07/02/18 02:09:52
あと>149が言い忘れてるけど、移植性考えるならabcもintではなくunsigned longで定義すること

153:デフォルトの名無しさん
07/02/18 03:36:36
abc のコピーを順次右シフトして 1 と and を取れば 1 の型を気にする必要なんかないのにな

154:145
07/02/18 06:11:09
多くのアドバイスありがとうございます。

int i ;
unsigned long abc ;
if( (abc & (1UL<<i)) != 0 )
または
unsigned long saveabc ;
saveabc = abc ;
if( ((saveabc>>i) & 1) != 0 )

こんな感じでどうでしょうか?

155:145
07/02/18 06:18:55
下のsaveabcは意味ないですね・・・コピーを順次右シフトどうやるんでしょう

156:デフォルトの名無しさん
07/02/18 06:30:43
>>=1

157:デフォルトの名無しさん
07/02/18 06:33:17
saveabc=abc;
for (i+......) {
 if (saveabc & 1) { ... } /* 最下位ビットのみチェック */

 /* チェック対象自身を右シフトしてしまえー */
 saveabc >>= 1; /* saveabc = saveabc >> 1; */
}

順次右シフトは、上記を示唆してるんだと思うよ

158:145
07/02/18 13:16:34
なるほど、どうもありがとうございました

159:145
07/02/18 13:30:49
すみません今思いついたのですが、

int i ;
unsigned long abc ;

for( i=0 ; i<32 ; i++ ){
  if( (abc>>i & 1) !=0 ){...}
}

これだとabcはunsigned longだし右に31シフトもできますでしょうか?

160:デフォルトの名無しさん
07/02/18 13:33:40
>>159 問題ない。

161:デフォルトの名無しさん
07/02/18 15:07:39
・ abc>>i & 1
・ abc & 1<<i
・ copyabc & 1 ... copyabc>>=1
・ mask=1 ... abc & mask ... mask<<=1

abcの値がその後必要ないなら

・ abc & 1 ... abc>>=1

も使える

162:145
07/02/18 15:46:30
大変勉強になりましたm(__)m
ありがとうございました

163:デフォルトの名無しさん
07/02/20 20:56:53
free()でメモリ領域を解放する時、何故解放するメモリ領域へのポインタだけで解放できるんでしょうか?
解放するメモリ領域のサイズも必要な気がするのですが。

164:デフォルトの名無しさん
07/02/20 21:25:58
>>163
その情報をポインタだけで引き出せるように管理しているから。
malloc/freeの実装の一例はK&Rに載ってる。
もちろんこれは一例で他にも実装方法はある。

165:デフォルトの名無しさん
07/02/20 21:51:42
回答ありがとうございます。

malloc()したときに割り当てた領域へのポインタとサイズを一緒に記録しておいて
free()するときに引数として渡されたポインタを元に割り当てた領域のサイズを計算して解放するというような感じですかね?

K&R持ってないので買って読んでみます。

166:デフォルトの名無しさん
07/02/20 22:03:57
>>165
そういう実装もあると思う。
K&Rのやり方は、

・mallocするときに管理用ヘッダ+要求されたサイズのメモリを確保
・mallocは管理用ヘッダのサイズ分アドレスを進めたポインタを返す
・freeは渡されてきたポインタから管理用ヘッダのサイズだけ戻して管理情報を得る
・各メモリ領域はリンクポインタで辿れるようになっている

という感じの実装だった(はず。今手元に本がない)。

167:デフォルトの名無しさん
07/02/20 22:07:11
>>166
空き領域の線形リストで、渡されたポインタで挟まれる部分を探す方式でなかったっけ?

K&R 探すか

168:デフォルトの名無しさん
07/02/20 22:15:24
>>167
うーん、そうだったかもしれない。ごめん。

169:デフォルトの名無しさん
07/02/20 22:18:11
>>168
いやいや。 俺も記憶だけで書いてるから…

>>165 とまあ、なんとかしてポインタから領域情報をひねりだしてるですよ

170:デフォルトの名無しさん
07/02/21 17:55:41
ちょっとK&R引っ張ってくる

171:デフォルトの名無しさん
07/02/24 17:08:02
標準化される前(つまりC89以前)の文字列リテラルの型はなんでしょうか?
現行規格では static char[] 型 です。

172:デフォルトの名無しさん
07/02/24 17:13:48
staticはautoなんかと同じ記憶クラス指定子だから、変数を修飾していて、型を修飾してるわけじゃないよ

173:デフォルトの名無しさん
07/02/24 17:18:06
まあでも静的記憶期間だと言いたいことはわかる

174:デフォルトの名無しさん
07/02/24 17:24:15
標準化される前は処理系依存なんだからその質問は無意味な気がするが

175:デフォルトの名無しさん
07/02/24 17:29:41
sizeof("ab") == sizeof("cde") が真ならchar*で、偽ならchar[]なんじゃね?
*"" = '\0'; でソレっぽいコンパイルエラーが出るならconstなんじゃね?

176:171
07/02/24 17:34:48
標準化される前だから >>174 の言う通りですね、、、

177:デフォルトの名無しさん
07/02/24 18:03:14
>>175
真っ赤な嘘書くなや。

178:デフォルトの名無しさん
07/02/25 01:33:02
ところで、文字列リテラルの型がなんであるのかを知りたい理由が聞きたいんだが

179:171
07/02/25 20:06:13
>>178
sizeof("1234567890") は char[11] のサイズか char* のサイズかを知る為
現行規格では char[11] のサイズ 11 になる

標準化前については、処理系依存で納得です。

180:171
07/02/25 20:09:09
>>179
補足
標準化される前は 文字列リテラルの型は char* だと某所で見た。

181:デフォルトの名無しさん
07/02/25 20:17:40
>>179
いやそうじゃなくて、文字列リテラルの型を知って
それを何に応用出来るの?って話だと思うぞ。
豆知識?

182:171
07/02/25 20:20:32
>181
だから
標準化前の sizeof("1234567890") の値を知る為。
その為に文字列リテラルの型が必要

でも処理系依存で納得した。

183:デフォルトの名無しさん
07/02/25 20:21:50
>>182
無限ループになりそうだからもうやめとく。

184:171
07/02/25 20:24:12
>>183
>>178 には「知りたい理由」 とありますが?
「何に応用出来るか?」とは書いてません。

185:デフォルトの名無しさん
07/02/25 20:30:16
くだらね

186:デフォルトの名無しさん
07/02/25 21:46:09
変なのにからまれて、171 の中の人も大変だな。

187:178
07/02/25 22:20:33
わかったわかった言い直すよ

どうして sizeof("1234567890") の値を知りたいのか教えてくれ

188:デフォルトの名無しさん
07/02/25 23:02:42
>>182
逆ではないのか?
文字列リテラルの型を間接的に測る手段としてsizeofを使うんだろうが。

189:デフォルトの名無しさん
07/02/25 23:13:57
ファイル操作に関して質問です。

GB単位のファイルを処理しているんですが
ファイルの一部を上書きする標準関数てあるのでしょうか?
あと指定した位置から後ろ全てを削除するような関数も探してます。


190:デフォルトの名無しさん
07/02/25 23:15:27
fseekして書き込めばいいんじゃないかな

191:デフォルトの名無しさん
07/02/25 23:17:05
ググればサンプルも見付かるよ。

192:189
07/02/25 23:27:21
fseek して fwrite ということですね!
ありがとうございます。

ファイルの後半を削るというのはやっぱり無理なんでしょうか?

193:デフォルトの名無しさん
07/02/25 23:31:32
Cの標準ライブラリではそういうことするのはないな。
Windows限定だったらSetEndOfFileなんてものもあるけど。

194:デフォルトの名無しさん
07/02/25 23:39:19
UNIXならtruncateか。

195:189
07/02/25 23:41:21
ありがとうございます。

fseek で調べたら上書きができるということはわかりました。
ただ挿入というようなことはできないと考えてよいのかな?

後半削除はないのですね。
ということは実現するには必要な部分だけファイルコピーということですね。
Windows 限定のコードではないので残念です。
差分とメタデータ使って実現するしかなさそうだな・・・。

196:デフォルトの名無しさん
07/02/25 23:41:47
0バイトをwriteするとそこから先が削れる場合もあるけど
処理系依存(そもそもwrite自体が処理系依存だが)

197:デフォルトの名無しさん
07/02/26 00:13:07
stdioでできることは、
ファイルを作ること
ファイルをリネームすること
ファイルの任意の位置から読むこと
ファイルの任意の位置に書くこと
だけで、ファイルのサイズやレコードのオフセットを変更することはできない。
というかそれらはファイルの中身ではなく、ファイルの管理方法に関わることなので、
必然的に処理系のファイルシステムに依存する。

ありとあらゆる環境で動作することを保証したいなら、
それはファイルをまるごと読んで必要な構成で別ファイルに書き出し
元ファイルを消してから元の名前にリネームするしかない。
ある程度ターゲットの環境が決まっていて、それぞれに有効な環境依存の技があるなら、
それぞれの環境のためのコードを書いて、プリプロセッサで処理系に適合させるのが有効。

198:デフォルトの名無しさん
07/02/26 04:57:47
そういうファイル処理するプロセスを環境ごとに作り、主プログラムからはそれを呼び出すというのも一つの手。

199:171
07/02/26 19:52:50
>>187
某所で、その話題を見たから気になっただけ。

>>188
確かにそうですね。



200:デフォルトの名無しさん
07/02/28 15:50:13
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

201:デフォルトの名無しさん
07/02/28 16:11:58
>>200
楽しいか?

202:デフォルトの名無しさん
07/03/01 00:55:09
>>201
C++相談室の「STLを使うと」から始まるコピペみたいに
テンプレ化せんとダメなんかなぁ?

203:デフォルトの名無しさん
07/03/05 22:32:01
ANSI Cの仕様について質問です。

mainはANSI Cではint main(void)またはint main(int argc, char *argv[])
と決まってるけど
K&Rではmain()となっていて戻り値intと引数voidを省略していますよね?
これもANSI準拠と言えるんでしょうか?

204:デフォルトの名無しさん
07/03/05 22:50:07
>>203
戻り値の省略はANSI準拠でない

205:デフォルトの名無しさん
07/03/05 23:56:49
JIS X 3010では
関数定義:
 宣言指定子列opt 宣言子 宣言並びopt 複合文
宣言子:
 ポインタopt 直接宣言子
直接宣言子:
 識別子
 ( 宣言子 )
 直接宣言子 [ 定数式opt ]
 直接宣言子 ( 仮引数型並び )
 直接宣言子 ( 識別子並び )
だからmain()は許されてるように読めるけど。どこかで明示的に禁止されてたっけ?

206:デフォルトの名無しさん
07/03/05 23:57:22
識別子並びの後ろにoptが抜けてた。

207:デフォルトの名無しさん
07/03/05 23:58:24
>>203だと関数定義なのか関数宣言なのか曖昧だな

208:デフォルトの名無しさん
07/03/06 00:16:26
Cの場合は省略時はintじゃなかったっけ
C++は確かダメだったような

209:デフォルトの名無しさん
07/03/06 00:18:29
許されてはいるけど、
コンパイラによっては警告が出るから鬱陶しい。

210:デフォルトの名無しさん
07/03/10 02:33:54
よくqsortに渡す関数ポインタを

int cmp(int* a,int* b)
{
return *a-*b;
}
と書いてるサイトを見かけるんですが、これは
qsortのプロトタイプの
int(*func)(const void* a, const void* b))
と関数ポインタの互換性が無いと思うんですが、これはアリなんですか?



211:デフォルトの名無しさん
07/03/10 02:36:13
>>210 ダメ

212:デフォルトの名無しさん
07/03/10 02:41:41
intの配列ならこうだな
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}

213:デフォルトの名無しさん
07/03/10 02:41:50
>>210
それはオーバーフローを起こすアホコードだから絶対に真似しちゃダメ。

214:210
07/03/10 02:43:22
>>211
ですよねぇ・・・
更には
return *a-*b;
も何かやばい感じがするんですが

aに大きい負数が渡されるとおかしな事になるような・・・


215:デフォルトの名無しさん
07/03/10 02:43:29
>>212 もアホ確定。

216:デフォルトの名無しさん
07/03/10 03:06:11
多分、このスレの前スレで、Linuxのカーネルソースは
$ lint ~
にパスしないと受け付けられない、みたいな書込みがあったように思うのですが、
この「~」の部分のオプションが分かる方いらっしゃいますでしょうか?

217:デフォルトの名無しさん
07/03/10 03:46:02
サイトからソースを取得するプログラムについて質問したいのですが・・・
誰かいますか??

218:デフォルトの名無しさん
07/03/10 03:47:05
>>217
環境依存スレへどうぞ。

219:デフォルトの名無しさん
07/03/12 23:00:34
ANCI C言語辞典だと
return *a-*b;みたいな書き方してるけど
この辞典のサンプルソースはあてにならん
int型の配列のqsortの比較関数は下のような
感じになるんじゃないかな
int int_cmp(const void *a, const void *b)
{
if (*(int *)a < *(int *)b)
return (-1);
else if (*(int *)a > *(int *)b)
return (1);
return (0);
}

220:デフォルトの名無しさん
07/03/12 23:16:43
int int_cmp(const void *a, const void *b)
{
  return *(int *)a == *(int *)b ? 0 : ( *(int *)a > *(int *)b ? 1 : -1 );
}

221:デフォルトの名無しさん
07/03/12 23:21:23
やはり、intを返すという基本設計がまずいな。

222:デフォルトの名無しさん
07/03/12 23:23:46
>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。

223:デフォルトの名無しさん
07/03/12 23:28:40
よし、doubleを返すようにすればいいんだな!

アホかい

224:デフォルトの名無しさん
07/03/12 23:42:35
えーとじゃぁオレchar返すよ

225:デフォルトの名無しさん
07/03/12 23:43:55
たぶん彼は3値論理の型が欲しいと言っているんだろう

226:デフォルトの名無しさん
07/03/12 23:58:36
#define UNDER -1
#define EQUAL 0
#define OVER 1

227:デフォルトの名無しさん
07/03/13 05:33:23
そこはenumだろ常識的に考えて

228:デフォルトの名無しさん
07/03/13 06:17:15
_Bool返せよ。

229:デフォルトの名無しさん
07/03/13 06:39:41
おまえからそんなもの借りてないよ

230:デフォルトの名無しさん
07/03/13 06:44:58
>>228
_Boolじゃ3種類の値は返せないだろ

231:デフォルトの名無しさん
07/03/13 06:47:54
別に3種類も返す必要ないだろ。

232:デフォルトの名無しさん
07/03/13 06:52:19
qsortの比較関数か? なら最低3値返す必要があるよ。

233:デフォルトの名無しさん
07/03/13 06:55:27
クィックソートは3値ないとアルゴリズム的に実行不可能なわけ?

234:デフォルトの名無しさん
07/03/13 06:56:51
アルゴリズム的に実行不可能という意味がよくわからないけど、
qsortの仕様がそれを要求している。それだけ。知らなかったの?

235:デフォルトの名無しさん
07/03/13 07:09:43
>やはり、intを返すという基本設計がまずいな。
という流れできてるんだけど・・・・・・

236:デフォルトの名無しさん
07/03/13 07:42:29
>>233
C++のstd::sort()の場合、要求してるのは2値(bool値)のPredicateだし
別に不可能ってわけじゃない。

例えばcmp() は a > b ならtrue, さもなくばfalseを返すという仕様であると
して、もし同値かどうかの判定が必要であれば、
cmp(a,b)、cmp(b,a)の両者がfalseならば a == b と判断できるわけで。

>>234の言うように、C標準のqsort()の仕様が3値の比較関数を求めている
ってだけだ。

237:デフォルトの名無しさん
07/03/13 07:58:04
>>233
qsortはクイックソートではない
内部でどういうアルゴリズムで実装されててもいいことになっている

そういうわけで、a==bに対して非0を返すと、ソートが終わらなくなる可能性がある。

238:デフォルトの名無しさん
07/03/13 08:12:54
>>236-237 >>235

239:デフォルトの名無しさん
07/03/13 08:42:20
>>235
ああ、なるほど。流れはわかった。
が、intを返すのってそんなにまずい設計か?
ちょっとその辺の説明が欲しい。

むしろループの中で何度も呼ばれる関数なわけで、
intを返すのは性能の観点から当然の選択だと思うけどな。

240:デフォルトの名無しさん
07/03/13 08:46:49
>>239
>>221 がまずいって言い出したから、みんなで何がまずいんだよって叩いてる流れ

241:デフォルトの名無しさん
07/03/13 08:54:11
三値を返すのが不味いんだろ。型が問題なわけじゃない。

242:デフォルトの名無しさん
07/03/13 09:29:51
ネーミングから誰でも一度はする誤解だよな>qsortはクイックソート

243:デフォルトの名無しさん
07/03/13 10:31:22
要は、整数の比較関数を減算で行なうサンプルが問題なんだろ。

244:デフォルトの名無しさん
07/03/13 12:23:16
値の差が INT_MAX を超えるとアウトだからね…

245:デフォルトの名無しさん
07/03/13 12:57:11
まぁ必ずしも必要とは限らないのに、比較が2回必要な3値の関数を
求める仕様は糞と言ってもよいだろうな。

246:デフォルトの名無しさん
07/03/13 13:03:14
必要なソートアルゴリズムもあるから、そうなってるんだろ

247:デフォルトの名無しさん
07/03/13 13:12:03
>>237
×qsortはクイックソートではない
○qsortはクイックソートとは限らない

248:デフォルトの名無しさん
07/03/13 15:20:00
strcatを使用しないでchar型配列(str1とstr2)を連結したいのですが、
文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは
分かるのですが、やり方がわかりません。
どうすればできますか?

249:デフォルトの名無しさん
07/03/13 15:22:36
マルチすんなアホ

250:デフォルトの名無しさん
07/03/13 20:15:26
>>242
というかクイックソートを念頭に置いて名付けたんだろ。
単にこのスレ的にそう決めつけるのは誤ってるってだけで
>>244
実際の差を返す必要はないでしょ? 必要なのは符号だけで

251:デフォルトの名無しさん
07/03/13 20:17:15
>>250
おまえは何もわかってないな

252:デフォルトの名無しさん
07/03/13 21:22:59
>>250 後段
いちいち言われんと解らんのか。
>>213

253:デフォルトの名無しさん
07/03/13 21:42:38
なんで>>250の後段が>>213に関連してくるのかわからん。
誰か解説してくれ。

254:デフォルトの名無しさん
07/03/13 21:52:19
>>213の意味がわからんて事?

255:デフォルトの名無しさん
07/03/13 22:22:01
>>250 の意味が分かってもらえてないって事だろ。

256:デフォルトの名無しさん
07/03/14 00:21:36
>>213
なんでオーバーフロー起こすか解説きぼん

257:デフォルトの名無しさん
07/03/14 00:25:00
問:負の数が弐の補数の処理系において、
*a=0, *b=INT_MINの場合、どうなるか?

258:デフォルトの名無しさん
07/03/14 00:35:24
>>246
>>236を読め。2値さえ貰えれば十分のはずだから。

259:デフォルトの名無しさん
07/03/14 01:29:02
ダメだこりゃ。

260:デフォルトの名無しさん
07/03/14 01:32:05
>>213なんて分かりきった上で、全然別の次元の話をしているだけなのだが?

261:デフォルトの名無しさん
07/03/14 01:41:12
INT_MINの符号反転はINT_MINのままだから
int a = 0; int b = INT_MIN;のとき
>>210だと
cmp(&a, &b) < 0となってしまうのでダメってことか

>>220だと
cmp(&a, &b) > 0となり正しいと。

262:デフォルトの名無しさん
07/03/14 01:47:31
>>250=256=260
だと最高なんだがなーw

263:デフォルトの名無しさん
07/03/14 01:58:02
450Kのコードっていったらどれくらいの規模のこと?
45万行ってこと?

264:デフォルトの名無しさん
07/03/14 02:01:41
450KiBかも知れず。

265:デフォルトの名無しさん
07/03/14 02:18:51
>>262
違うよ。いつまでもそんな下らない話題引っ張られても邪魔だから
引っ込んでろといってる。

266:デフォルトの名無しさん
07/03/14 02:21:24
stdc++のstd::sort()もソートアルゴリズムを指定していない点では同じだが
要求しているのは2値のPredicateだ。
何度も繰り返すが、3値のPredicateは要らないんだよ本来は。

整数のオーバーフローとかいう低レベルの下らない話とは全然別問題。


267:デフォルトの名無しさん
07/03/14 03:36:11
>>266
なんでここで全然関係のないstdc++が出てくるのかわからんがな。

規格においてqsortは安定でないことになっているから、
本来は3値も要らず、2値で十分てことだろ。

268:デフォルトの名無しさん
07/03/14 03:46:23
>>267
実際には順序付け集合に対する2値の述語関数があれば、
3値と同等のことは実現できる。だから、仮に3値が必要な場合であっても
2値の述語関数で十分なの。
>>236を読めよ。


269:デフォルトの名無しさん
07/03/14 03:59:52
結論:
比較関数をいっぱい呼びたい奴はC++を使っとけ

270:デフォルトの名無しさん
07/03/14 05:38:34
>>268
まったくだ。ifとwhileだけで構造化は実現できるのにforなんて無駄きわまりないな。
breakやcontinueなんてもっての他だ。gotoやlongjmpに至っては(ry

271:デフォルトの名無しさん
07/03/14 05:47:10
>>270
意味不明。馬鹿じゃないの。
構造化のための構文は*ユーザにとって*便利であり
*ユーザが*見通しの良いプログラムを書くのに役に立つ。

2値の述語関数で十分なのに3値の述語関数を要求するのは
*ユーザにとって*便利でも何でもないし、
それによって効率があがりもしない。

結局3値の比較が*実際に*必要である箇所では、比較が2度必要になるからだ。
しかし、3値の比較を*常に*ユーザ側に求めた場合、実際には必要でない
箇所でも2度の比較を行う羽目になる。

つまり、不便なだけでなく、効率が悪くなるのだ。

それはライブラリ側の怠慢であり手抜きであり仕様の欠陥でしかないよ。

272:デフォルトの名無しさん
07/03/14 05:47:59
>>270
まったくだ。lambdaさえあれば他になにも(ry

273:デフォルトの名無しさん
07/03/14 05:56:40
>>269
アホか。C++のほうがはるかにソートを楽に記述できる。

274:デフォルトの名無しさん
07/03/14 06:00:15
順序集合をソートする場合において、等値かどうかの比較が常に必要とは
限らないんだが、
わざわざそれを常にユーザに強いているのがCのqsort()の仕様。

C++のstd::sort()の場合は、そんな馬鹿なまねはしない。必要な場合は、
そして必要な場合のみに限って、2値のPredicateだけで等値かどうかの
判定をできるからだ。

275:デフォルトの名無しさん
07/03/14 06:59:21
そして、2値を返すなら、compの素直な実装方法による
オーバーフローがどうこうという面倒な話も発生しない。

276:デフォルトの名無しさん
07/03/14 07:34:36
Perlにはsortのために(としか思えない)わざわざ3値比較のための
演算子なんてものが用意されてるよね。
<=> とか cmp とか。これは笑ってしまう。

277:デフォルトの名無しさん
07/03/14 08:02:25
それはここでやる話じゃないだろ。

278:デフォルトの名無しさん
07/03/14 09:12:15
ここまで読んだ

とりあえず論点が完全にズレたまま進行してることはわかった

279:デフォルトの名無しさん
07/03/14 20:42:33
いつまでソートの話してんだよ。

280:デフォルトの名無しさん
07/03/14 21:31:47
例えば以下のような構造体をファイルで宣言した時
初期値として、
hoge.bar == NULL と hoge.foo == NULL は保証されているのでしょうか?


struct {
  char *bar;
  char **foo;
} hoge;


281:デフォルトの名無しさん
07/03/14 21:33:29
されるわけないでござる

282:デフォルトの名無しさん
07/03/14 21:40:01
え?その定義ならされるだろ。
まさかあれか、全ビット0がNULLとは限らないというあの流派か。

283:デフォルトの名無しさん
07/03/14 21:43:23
自動変数でも?

284:デフォルトの名無しさん
07/03/14 21:56:14
大域変数か静的変数なら初期化される。
ゼロフィルではなく、全てのメンバが0に。

285:デフォルトの名無しさん
07/03/14 22:01:03
ファイルで宣言ってのは、自動変数説を否定している、と俺は見たが。
関数で宣言、なら自動変数かもね。 深読みしすぎといわれればその通り。

286:デフォルトの名無しさん
07/03/14 22:06:00
C言語初心者です。
「C言語プログラミング能力認定試験」って取るメリットありますか?

287:デフォルトの名無しさん
07/03/14 22:09:52
スレ違いだよ

1級ならまだ許せるけど、履歴書に2級とか書かれたら(´,_ゝ`)プッ

288:デフォルトの名無しさん
07/03/14 22:16:35
私はまだ何も分からないのですが
プログラミングをするにあたってまず何をそろえて何をすればいいんでしょうか?

289:デフォルトの名無しさん
07/03/14 22:19:21
>>288
MSのサイトからコンパイラをダウソ。

290:デフォルトの名無しさん
07/03/14 22:21:24
まずはパソコンを買うことから始めます。

291:デフォルトの名無しさん
07/03/14 22:24:13
>>288
ボーランドコンパイラかVisual C++ Express。どっちも無料
インストール後、適当にPATH通せ

292:デフォルトの名無しさん
07/03/14 22:29:36
Knoppixをお勧めしてみるテスト

293:288
07/03/14 22:49:47
Visual C++ Expressのダウンロード及びセットアップ完了しました。

294:デフォルトの名無しさん
07/03/14 23:22:34
>>280
「ファイルで」というのが「関数の外で」宣言されたという意味なら、される。
この初期化は、配列でも構造体でも、全ての要素について「=0」と書いたかのように行われる。
よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。

>>293
入門書を買って言語仕様を覚えろ。

295:デフォルトの名無しさん
07/03/14 23:27:15
関数内でもstatic付けた静的変数ならやっぱり0初期化される

296:デフォルトの名無しさん
07/03/15 00:19:35
>よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。
大間違い。

297:デフォルトの名無しさん
07/03/15 00:39:01
>>296
俺は294じゃないけど間違いというならその理由を示してよ。

K&R A8.7初期化 より引用
> 明示的に初期化されない静的オブジェクトは、それ(あるいはそのメンバー)に定数
> 0が代入されたかのように初期化される。明示的に初期化されない自動オブジェク
> トの初期値は、不定である。

298:デフォルトの名無しさん
07/03/15 00:52:49
>>297
根拠を示さず「大間違い」とだけ言うのは小学生だってできる。
無視してかまわんだろう。

299:デフォルトの名無しさん
07/03/15 00:53:35
>>297
知らんがたぶん、>>282 じゃないのかな

300:デフォルトの名無しさん
07/03/15 00:59:15
>>299
違う。

301:デフォルトの名無しさん
07/03/15 01:00:15
>>299
>>297が示している通り、プログラマーが =0 と書いたのと同じように初期化される。

302:デフォルトの名無しさん
07/03/15 01:01:03
>>299
関係ないでしょ。だって
void *p = 0;
と書いてあるように初期化されるんでしょ。
これはpには全ビットが0の値が入るのではなくて、
NULLポインタが入るんだよ。

303:デフォルトの名無しさん
07/03/15 01:01:37
段階を追って詳しい説明になっていくのにワラタw

304:デフォルトの名無しさん
07/03/15 01:02:24
ゼロフィルで済む処理系ならBSSをロードする時に全部ゼロ埋めするだけだが、
それで済まない処理系で規格を満たすためには、初期化専用のコードを
コンパイラが吐き出して、スタートアップルーチンで呼ばれるようにする
んだろね。
なんかC++みたいだなw

305:デフォルトの名無しさん
07/03/15 01:06:45
不動じゃなくて浮動だろと言うつっこみだったんだよ!たぶん

306:デフォルトの名無しさん
07/03/15 01:07:23
>>302
それ実は俺もずっと気になってたんだけど
ポインタに0代入したらそれはNULLポインタと等価なの?

というか全ビット0がNULLとは限らない処理系ってあるの?

307:デフォルトの名無しさん
07/03/15 01:09:10
>306
CFAQには、そういう処理系も実在すると書いてあったよ

308:デフォルトの名無しさん
07/03/15 01:11:14
というか
ヌルポインタの内部表現が未既定なのも
ポインタがくるべき場所に整数定数0を書いたらヌルポインタに変換されるのも
規格がそう定めているからであって、そのような処理系が実在するからではない

309:デフォルトの名無しさん
07/03/15 01:15:45
>>306
> ポインタに0代入したらそれはNULLポインタと等価なの?
Yes.
ポインタの文脈では0はいつでもnull pointer constantとして扱われる。

310:デフォルトの名無しさん
07/03/15 01:16:21
ポインタに「値が0の整数定数式」を代入したり、(暗黙にでも)比較したりしたときは、
コンパイラが整数定数0を正しいヌルポインタの値に変換する。

値が0である整数変数を代入する場合はこれにあてはまらない。
あくまで定数だけである。

311:デフォルトの名無しさん
07/03/15 01:25:21
>>305
なっとく。

312:デフォルトの名無しさん
07/03/15 01:27:00
>>280が変数宣言を書けば、こんなにモメなかったろうにw

ぶっちゃけauto変数以外はリンカーがプログラムに引っ付けて実行形式で出力する。
実行するとローダーがフォーマットに従い元通りに展開してくれる
auto変数で使うスタック領域もローダーがフォーマットに従いサイズ分用意してくれるが、
0クリアする決まりが無いので未初期化として扱うのが決まりになってる。

ROMで実行されるプログラムでない限りは、こんな覚え方でいいような気がする。





313:デフォルトの名無しさん
07/03/15 01:29:48
NULLの定義が
#define NULL 0
#define NULL ((void*)0)
以外の処理系って見たことある?
俺は無いけど。

314:デフォルトの名無しさん
07/03/15 01:32:02
>>312
BSS(未初期化のstatic変数を格納する領域)も実行形式に
埋め込む処理系は少ないのでは。
スペースの無駄だからね。


315:306
07/03/15 01:37:05
物凄い参考になった。皆thx

316:313
07/03/15 01:39:15
ちなみに俺はC++の癖でCでもNULLと書かずに0と書いてしまう。

317:デフォルトの名無しさん
07/03/15 02:15:30
>>313
最近のgccとかは __null とかになってなかった?

318:デフォルトの名無しさん
07/03/15 03:16:08
そうだと困るハードがあるからNULLが0x00000000とは定めてないわけだよねぇ?

319:デフォルトの名無しさん
07/03/15 03:17:01
>>316
構わないと思う。

320:デフォルトの名無しさん
07/03/15 03:27:38
>>318
ハードにかかわらず、NULLを整数値として評価した場合は 0 として評価されるって規格で定められてたと思うけど。

321:デフォルトの名無しさん
07/03/15 03:43:29
>>320
あ、いやNULLの番地がって意味で

322:デフォルトの名無しさん
07/03/15 05:00:16
NULLを使わず0で初期化してる人がいるようだけど
俺したこと無い。

例えば
int *foo = 0;
とか

typedef struct{
int a;
char *p;
}hoge;

hoge *ho = 0;
とかしちゃったりするの?


323:デフォルトの名無しさん
07/03/15 05:01:38
>>322 もちろん。

324:デフォルトの名無しさん
07/03/15 05:06:01
標準ライブラリに含まれてる型名って、ファイルスコープの名前だから
関数ローカルや構造体メンバでその名前使っても問題ないよね?

jmp_buf とか va_list とか、マイナーなやつをうっかり使ってしまうことが
無いとは言えないんで、エディタのキーワードハイライトに全部
突っ込んでおこうかと思ったんだけど、よくよく考えたら
ファイルスコープでやらかさなけりゃ全然問題ないんじゃないかと。

325:デフォルトの名無しさん
07/03/15 08:35:49
>>313
DOSでラージメモリモデルの環境では0Lになっていると思う。
少なくともLSI C-86のヘッダではそうだった。

326:デフォルトの名無しさん
07/03/15 08:38:48
>>324
いや、それらはグローバルなので問題ありまくり。
衝突を避けたければ、ユーザコードの名前に特定のPrefixを付けるといった
規約を考えたほうがよい。

327:デフォルトの名無しさん
07/03/15 09:54:39
>>326
jmp_buf なんて何の規則も無い名前との衝突を避けようと思ったら、
関数ローカルや構造体メンバに int a; とすら書けないと思うんだが、
正気か?

328:デフォルトの名無しさん
07/03/15 10:22:35
>>327
は?
構造体タグ名、変数名、メンバー名は別の名前空間に属するから、
そのような例で同一の名前を用いても問題が生じるわけがないよ。

329:デフォルトの名無しさん
07/03/15 10:22:58
>321
単に「NULL」という言葉を「ヌルポインタ」という意味で使うと誤解を招きかねないのでやめたほうがいい
マクロNULLとヌルポインタは別のものであるから、区別できるように書くべき

330:デフォルトの名無しさん
07/03/15 10:27:24
>>328
元の質問 >324 がそう言って「問題ないよね?」って聞いたのに対して
>326 が「問題ありまくり」と返しているんだが。

331:デフォルトの名無しさん
07/03/15 10:30:11
>>330
同一の名前空間で同じ名前を重複させたら当然問題あるでしょ。
あなたがC言語の仕様に対する無知によって、的外れな例を挙げただけ。


332:デフォルトの名無しさん
07/03/15 10:40:58
>>331
構造体メンバは問題が生じるわけないってことか?
なら残りはローカル変数ってことでいいかい?

ファイルスコープの typedef である jmp_buf の名前空間は
ローカル変数といっしょで変数名だよね?
でもローカル変数ならスコープが重なるだけなんで、ライブラリの
jmp_buf を使うつもりじゃなくてうっかり(知らずに)ローカル変数名として
使っただけなら問題ないんじゃないの?
どうせ内側で宣言されたローカル変数しか参照しないんだから。

333:デフォルトの名無しさん
07/03/15 10:43:47
>>332
ヒント: 他人にものを聞く態度

>>336を読まなかったのかい?
jmp_bufは「ファイルスコープ」の名前ではありません。

334:デフォルトの名無しさん
07/03/15 10:52:50
typedef名と変数名の名前空間も別物です。

だから、
typedef int i;
i i;
のようなコードも合法。良いスタイルではないけどね。

335:デフォルトの名無しさん
07/03/15 11:11:43
>>333
「ファイルスコープ」じゃなくて「グローバルスコープ」って言いたいの?

ISO C99 の最新ドラフトを見てしゃべってるんだが、規格には
「グローバル」なんてスコープは無いよ。
6.2.1 で列挙されてるのは "file scope", "block scope",
"function prototype scope" の3種類だけ。 "global scope" で
検索してもひとつもヒットしない。なので >326 の言ってる
「グローバル」ってのはファイルスコープのことだと思った。

336:333
07/03/15 11:14:40
>>335
あーごめん。嘘ついたかも。

リンケージまで考えるとファイルスコープって一般にstaticなオブジェクトのこと
を指すと思うんだけど、今は名前の話だったな。ごっちゃになってたわ。

337:デフォルトの名無しさん
07/03/15 11:16:45
「C99 の最新ドラフト」はおかしいな。

>>334
で、同じく ISO C の最新ドラフトから、 6.2.3 に列挙されてる
名前空間は、ラベル名、タグ名、メンバ名、その他の4つ。
変数名も typedef 名も最後のその他で同じ名前空間です。

どんなコンパイラがそのコードを受け付けてくれるの?
手元の gcc ではやっぱりエラーになるよ。
:2: error: 'i' redeclared as different kind of symbol
:1: error: previous declaration of 'i' was here

338:334
07/03/15 11:20:54
あー名前空間同じだけど、typedef定義と変数宣言を
スコープ違う形で試したから受け入れられたっぽいな。
こっちもすまん。

339:デフォルトの名無しさん
07/03/15 11:22:19
>>329
確かに。お粗末でした。

340:324
07/03/15 11:57:28
えーと。つまり >324 はやっぱり問題ないってことでおk?

341:デフォルトの名無しさん
07/03/23 00:03:57
>>337

struct a {
  int a;
};
typedef struct a a;
 
a b:
void c()
{
  b.a = 0;
  goto a;
a: ;
}

ってこと?

342:デフォルトの名無しさん
07/03/23 01:52:18
>>341
何がしたいのかわからん。

343:341
07/03/23 09:26:10
処理自体には意味ない。
ただ名前空間の分類としては、こういうことかな?と
aは全部違う名前空間ということで。

344:デフォルトの名無しさん
07/03/23 10:34:48
>>343
そうだよ。ちゃんとコンパイルできただろ?

345:デフォルトの名無しさん
07/03/30 01:20:19
↓のようなことって技術的に可能ですか?
何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので
ここで質問させていただきました

558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq
そうだ
一応書いておくわ

CとかJavaとか言語でわけてる現状がそもそもおかしいから

ソースコード翻訳機作ってやってるよ
おまえも参加しろwww

役に立たない下っ端を使えるようにする秘策だぞwwww

561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq
意味分からないのか??

コンパイラじゃなく
ソースコードをそれぞれに変換するってことだぞ

意味分からないかな??

564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq
たとえば
Cで書いたコード100万行を
自動変換で
Javaコードに変換するって奴だwwwwww

分かるかな???

スレリンク(dame板)l50

346:デフォルトの名無しさん
07/03/30 01:27:44
>>345
マルチ氏ね!

347:デフォルトの名無しさん
07/03/30 02:31:56
はいはいわろすわろす

348:デフォルトの名無しさん
07/04/09 14:46:42
ファイルの作成された日時をゲットする方法を教えてくれい!

349:デフォルトの名無しさん
07/04/09 14:50:36
アイコンを右クリックしてプロパティを見る。

350:デフォルトの名無しさん
07/04/09 14:56:45
>349
そんなアホナ。。。

351:デフォルトの名無しさん
07/04/09 15:00:27
ワロタ

stat とか fstat で

352:デフォルトの名無しさん
07/04/09 15:11:31
環境依存

353:デフォルトの名無しさん
07/04/10 12:13:30
program.exe arg1 arg2 arg3 ....

と何個でも、何文字でも無制限にいけるのか?

354:デフォルトの名無しさん
07/04/10 12:27:41
引数の長さには通常制限があるが、環境依存。
ARG_MAXでぐぐれ。

355:デフォルトの名無しさん
07/04/10 12:39:20
制限はあるけどそれはプログラムの方の制限じゃないよ

356:デフォルトの名無しさん
07/04/10 20:30:12
ARG_MAXはPOSIXだと思う

357:デフォルトの名無しさん
07/04/11 00:27:46
うん

358:デフォルトの名無しさん
07/04/11 00:30:27
シェルの制限かと思ってた

359:デフォルトの名無しさん
07/04/12 22:37:03
>>349
できました! ありがとうございます!

360:デフォルトの名無しさん
07/04/13 01:54:24
>359
mjky

361:デフォルトの名無しさん
07/04/13 15:40:58
malloc とか free に一枚皮を被せるって常識なの?

void Free(void *ptr)
{
  if (ptr != NULL) free(ptr);
}
こんなようなの、、、


362:デフォルトの名無しさん
07/04/13 15:50:03
少なくとも、free() にNULL渡すのは問題ない仕様だから
それは意味無いな。

363:デフォルトの名無しさん
07/04/13 15:50:40
違った delete に渡すのが問題無いんだった

364:デフォルトの名無しさん
07/04/13 15:51:15
>>361
常識ではないし、標準Cなら
| free 関数は、ptr が指す領域を開放し、その後の割付けに使用できるようにする。
| ptr が空ポインタの場合、何もしない。
ので、まったくの無駄。

もっとも、malloc/free のトレースをしたいという目的で
ラップするのはアリ。

365:デフォルトの名無しさん
07/04/13 16:46:05
メモリリーク検出には役立つかも知れない

366:デフォルトの名無しさん
07/04/13 23:45:45
>>361
ペアであるmalloc/freeのインターフェイスをよりペアらしくできるから、
オレはこんな感じにすることがある。

result_type my_malloc(void **ptr, int size)
{
  *ptr = malloc(size);
  return (NULL != *ptr) ? result_success: result_faild;
}

result_type my_free(void **ptr)
{
  if (NULL == *ptr)
  {
    free(*ptr);
    *ptr = NULL;
  }
  return result_success;
}

367:デフォルトの名無しさん
07/04/14 00:02:53
void**はないだろ、常識的に考えて…

368:デフォルトの名無しさん
07/04/14 00:04:43
スレタイを100回音読すべきだな

369:デフォルトの名無しさん
07/04/14 00:25:26
>>367
間違えやすいよな.C++なら参照使えばいいけど,
Cならマクロ使った方がいい局面かも.

370:デフォルトの名無しさん
07/04/14 00:42:17
自分用ツールだったら、よくmallocが0を返したら即exit(1)するラッパを使う。
C++を使えるときにはnewを使えばいいんだけど。

371:デフォルトの名無しさん
07/04/14 02:43:50
>>366
my_freeは、渡されてきたポインタがNULLの時にのみ解放してるけど、それでいいの?
というか単純ミスだよなw

372:デフォルトの名無しさん
07/04/14 02:57:19
my_free(NULL);

373:デフォルトの名無しさん
07/04/14 09:31:55
linuxの場合は、malloc()が成功したかどうかは、実際にメモリにアクセスするまで分からないから、
malloc()の戻り値をチェックするのは無駄だって説もあるな。

374:デフォルトの名無しさん
07/04/14 09:45:08
>>373
カーネルの設定換えれば検出できるようになるね。
さもなくば、calloc()で検出できるんじゃないか?

375:デフォルトの名無しさん
07/04/14 10:05:41
そんな環境依存の話を書かれても

376:デフォルトの名無しさん
07/04/14 10:12:33
つまり、このスレ的にはmalloc()の戻り値を検出するためだけのラッパは要らないということで。

377:デフォルトの名無しさん
07/04/14 10:23:45
仕様的にはmallocの時点で割り当て失敗かどうか検出できないのってどうなの?

378:デフォルトの名無しさん
07/04/14 10:31:26
WindowsもたぶんVirtualAlloc使うと、実際にアクセスするまで確保されない
ってこのスレじゃ関係ないね

379:デフォルトの名無しさん
07/04/14 11:49:59
今ググても見つからなかったけど、俺が読んだ文章だと「近代的なOSだと、そういうふうになってる」みたいな言い方だったね。
mallic()で0を返さないって。

380:デフォルトの名無しさん
07/04/14 11:54:59
マリックwwwww

381:デフォルトの名無しさん
07/04/14 15:47:16
>>373
malloc()は、システムコールじゃないよ。libcの関数だよ。
わかってる?

382:デフォルトの名無しさん
07/04/14 15:58:38
>>377
駄目。

malloc()の実装のサンプル(システムコールとの関係)はK&Rにも載ってるから
興味がある人は目を通して理解しておくと良いよ。
知ったかぶりすると恥ずかしいから。

Windowsで言うなら、
VirtualAllocは確保できなくても0以外を返すかもしれない(実際は知らない)けど
HeapAlloc(OSからもらったメモリを必要な分だけに区切って渡す)は
確保出来ないときは0(NULL)を返すということ。
(サイズ情報等を埋め込むから、必ず実際のメモリにアクセスする)
VC++なんかのmallocは、HeapAllocをそのまま呼んでるだけだし。

383:デフォルトの名無しさん
07/04/14 16:11:45
URLリンク(www.linux.or.jp)
> デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が
> NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。
> これは本当にまずいバグである。
なるほど、確かにこれはバグだと言っている

384:デフォルトの名無しさん
07/04/14 16:19:02
ヒント: 管理情報はアプリケーションに返すメモリブロックに隣接している必要はない
malloc()がどう実装されてるかなんてそれこそ環境依存以外の何者でもない
とはいえ利用可能でないのにNULLを返さないのは規格違反だろうな

385:デフォルトの名無しさん
07/04/14 16:23:15
なるほど、
アドレス空間が足りない時等「一般的にmallocがNULLを返す状況」では無く、
システム全体(カーネルと各プロセス最小限使用分)の「物理メモリ」が不足する状況で
プロセスの存在そのものが抹消されるわけね。
それも、自分自身とは限らないプロセスが。

386:デフォルトの名無しさん
07/04/14 16:25:23
とはいえ、どう考えても、これが「近代的なOS」と関係あるとは思えない。

「近代的なOS」が使っているのは、仮想記憶とデマンドページングだろ。
mallocが失敗してもNULLを返さないのとは関係ない。

387:デフォルトの名無しさん
07/04/14 16:26:27
つまり、このスレ的にはLinuxのlibc(におけるmalloc()の実装)は間違いだということですね。

388:デフォルトの名無しさん
07/04/14 16:30:32
Linuxはカーネルだけだから理論的にはまともな実装をしたlibcに置き換えることもできる。
glibcと言っておこう

389:デフォルトの名無しさん
07/04/14 16:31:52
>>384
でも、とりあえず、manでヒープの破壊について触れているくらいだから
今話題のLinuxのglibcの実装に関しては、
確保したブロックの前後に管理ブロックがあると、仮定しても構わないでしょ。

390:デフォルトの名無しさん
07/04/14 16:33:25
じゃあどういう状況でNULLを返さないことがあり得るんだろう。
アプリケーションに返すメモリがたまたまページ境界にまたがったときかな

391:デフォルトの名無しさん
07/04/14 16:38:02
>>390
いや、>>385な状況で、実際に物理メモリが足りないと判明する時でしょ。たぶん。
ページ境界の可能性もあるけど、大きなブロックを確保して真ん中にアクセスした時とかも。

ていうか、この場合、メモリ不足が
「アクセスするまでわからない」じゃなくて「絶対にわからない」だな。
分かった瞬間に検出することも出来ないまま殺されちゃうんだから。
>>373の「NULLチェックが無駄かも」という結論は一緒かもしれないけど。

392:デフォルトの名無しさん
07/04/14 16:38:04
あとページサイズを超える大きなメモリブロックを割り当てた場合
最初のページだけは管理情報の書き込み時点でコミットされるけど
2ページ目以降を踏んだとたん落とされる可能性がある

393:デフォルトの名無しさん
07/04/14 16:38:28
2秒差でかぶったorz

394:デフォルトの名無しさん
07/04/14 21:09:29
ハードウェアの制限で256の倍数でデータを書き出しを行いたいのですが
端数が出た場合の処理はどのように実現するのがスマートなのでしょうか。

データは必ずシーケンシャルに確実に書き込まれる必要があって困っています。
携帯開発辛い...



395:デフォルトの名無しさん
07/04/14 21:14:10
>>394
言語と何ら関係がない質問なので、スレ違い。

まぁ、切り捨てていいなら切り捨てるし切り捨ててはいけないなら補うだけだな。
尤も、補う方法もダミーを詰めるだけでいいのか適当に間引く必要があるのか知らんが。

396:デフォルトの名無しさん
07/04/15 02:13:31
>>394
許されるバッファサイズと
書き込みサイズ > 256
書き込みサイズ ~= 256
書き込みサイズ <<< 256
で, 解が 異なると思うんだが...


397:デフォルトの名無しさん
07/04/15 08:03:22
>>396
馬鹿晒さなくていいから。

398:デフォルトの名無しさん
07/04/15 12:16:27
n: アライメント
書き出しサイズ (data_size + (n-1)) / n * n

n が2の累乗数なら (data_size + (n-1)) & ~(n-1) で代用可能

399:デフォルトの名無しさん
07/04/15 17:27:09
>>382
VirtualAllocがメモリの予約やコミットに失敗した時は
NULLを返すのは保証されてるよ~

400:デフォルトの名無しさん
07/04/15 19:59:29
完璧にスレ違いだけどな

401:デフォルトの名無しさん
07/04/21 04:35:16
フラッシュの書き込みとかやったなあ、なつかしい

402:デフォルトの名無しさん
07/04/22 23:30:12
ファイルのサイズを取得する方法として
fseek()でSEK_ENDに移動して
ftell()の戻り値を取得する方法を使っていたんですが、
どこかのサイトに
「バイナリモードでファイルをオープンした時はSEEK_ENDの値が保証されない」
みたいな事が書いてありました
理由がよくわからないんですが、なぜなんでしょう

403:デフォルトの名無しさん
07/04/23 00:08:58
その管理者に「日本語でおk」とメールしろ

404:デフォルトの名無しさん
07/04/23 00:10:45
ISO/IEC 9899:1999 7.19.9.2 The fseek function / Para.3

3 For a binary stream, the new position, measured in characters from the beginning of the
file, is obtained by adding offset to the position specified by whence. The specified
position is the beginning of the file if whence is SEEK_SET, the current value of the file
position indicator if SEEK_CUR, or end-of-file if SEEK_END. A binary stream need not
meaningfully support fseek calls with a whence value of SEEK_END.

だそうだ、詳しくは知らない

405:デフォルトの名無しさん
07/04/23 00:11:27
>>402
SEEK_ENDの値が保証されない
でググって最初のやつ

406:デフォルトの名無しさん
07/04/23 00:24:42
>>402
URLリンク(takagi.in)
このページか? 大嘘だから無視していい

The fseek() function sets the file position indicator for the stream
pointed to by stream. The new position, measured in bytes, is obtained
by adding offset bytes to the position specified by whence. If whence is

...

The fgetpos(), fsetpos(), fseek(), ftell(), and rewind() functions con-
form to ISO/IEC 9899:1990 (``ISO C90'').


407:デフォルトの名無しさん
07/04/23 00:31:34
ファイルサイズをバイト単位で管理しないファイルシステムがあった大昔のためだろ。
テキストファイルはファイル終端を表すEOFコードを書き込んでいたが、
バイナリファイルではそうもいかないため終端へのシークができない
(あえてやるとすればブロックなどといったもう少し大きな単位での終端までいってしまう)
ということのはず。

408:デフォルトの名無しさん
07/04/23 05:10:49
>406のページは他にも嘘が……

409:デフォルトの名無しさん
07/04/23 05:26:59
>>407
CP/Mがそんなだったかな。
EDLINEとかDOS用のエディタでテキストファイルを作ると最後に^Zが付くのはその名残。

410:デフォルトの名無しさん
07/04/23 19:21:07
副作用完了点について質問があります。

1) どこだったか忘れてしまったのですが、ネット上の文書で
「カンマ演算子はインクリメント/デクリメントの副作用完了点にならない」
というような記述を読みました。これは正しいのでしょうか?
i++, i++; としてはならないと書いてありました。

2) int *f(int *p) { return p; } という関数があったとして、
以下の例は合法でしょうか?
int i;
*func(&i) = 1;
*func((++i, &i)) = 1;

3) 関数 int g(int); について、式 (++i * g(++i)) の 二つの ++i の評価される順序や、
式 (g/*1*/(i) + g(g/*2*/(i))) で g/*1*/ と g/*2*/ が呼ばれる順序は定義されていますか?

よろしくお願いします。

411:デフォルトの名無しさん
07/04/23 19:54:58
++i と i++ で処理が変わるようなプログラムは
今の時代書くべきじゃない。

412:デフォルトの名無しさん
07/04/23 19:56:19
++i や i++ を何かに突っ込んだプログラムもな。
a[i++] = b; とか。
読みやすいプログラムを書け。

413:デフォルトの名無しさん
07/04/23 19:57:42
>>411,412
なんで乞われてもいないのに語りだすん?

414:デフォルトの名無しさん
07/04/23 20:08:42
引数を列挙する時のコンマは副作用完了点にならないけど、
コンマ演算子は副作用完了点になるはずだと思うんだけど。

415:デフォルトの名無しさん
07/04/23 21:05:46
論理積 (&&)、論理和 (||)、カンマ演算子 (,)、三項演算子 (?:) の評価順は左から。
その他の演算子は不定。なので
1) は「正しくない」
2) は「合法」
3) は「定義されていない」

>>413
>>411-412 は、今何の話をしているかをまったく理解できていないものと思われる。

416:デフォルトの名無しさん
07/04/23 21:27:43
でも、よく下のような使い方は見るよね

int a,b

for(i=0;i<10;i++)
{
  *a++ = *b++;
}

417:デフォルトの名無しさん
07/04/23 21:43:38
>>416 それがどうした?

418:デフォルトの名無しさん
07/04/23 21:47:41
>>416
見ないし、見たくない。

419:デフォルトの名無しさん
07/04/23 22:15:36
>>416
以下を、突っ込んで欲しい順に並べてください。
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?
ウ・aとbはポインタちゃうやろ!!

420:デフォルトの名無しさん
07/04/23 22:20:26
>>419
ウ・aとbはポインタちゃうやろ!!
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?


421:402
07/04/23 22:26:44
みなさん回答ありがとうございます

> A binary stream need not meaningfully support fseek calls with a whence value of SEEK_END.

という事は厳密には移植性が無いって事でいいんですかね

と思ったんですが

>>406 マジすか?混乱してきました
>>408 後学のためにどこか教えていただけますか?

422:デフォルトの名無しさん
07/04/23 22:44:09
>>421
例えばこの辺。
> Linux などの Unix 系 OS の環境では、テキストモードとバイナリモードの区別がないという表現がよく見受けられますが、
>それはあくまでもナロー文字を扱っている場合のことであり、ワイド文字を扱う場合には当てはまりません。
>また、たとえ Unix 環境でナロー文字しか扱わない場合であっても、移植性の高いコードを書くには、
>テキストモードとバイナリモードを等価なものと考えてはいけません。

ここを見れば判るが、POSIXではそもそもそんなモードがない。
URLリンク(www.linux.or.jp)

423:デフォルトの名無しさん
07/04/24 00:44:29
カンマ演算子について、

while ((c = getchar()) != EOF) {}
なんて書き方を良く見るが、たまに
while (c = getchar(), c != EOF) {}
の方が分かりやすい人も居るんじゃないかと思ったりする。
(優先順位等が分かっている人には)

ただ、K&R等で上の書き方が使われているし、
一般的に「慣れている方が分かりやすい」という観点からは
やはり上の形なのかな、と思う。
K&Rで上の形式なのは、大昔の非最適化コンパイラの都合もあるだろう。

424:デフォルトの名無しさん
07/04/25 15:10:10
dirent_t構造体のメンバ変数でd_typeというのがあるのですが、
これの示す値がどのように定義されているのかが分かりません。

とりあえず実際に動かして調べてみたところ、
ファイルの場合は8、ディレクトリの場合は4が入ってくるようなのですが、
他にも何か値が入ってくる場合があるのでしょうか?

御教授ください

425:デフォルトの名無しさん
07/04/25 15:14:06
sys/stat.h

426:デフォルトの名無しさん
07/04/25 19:11:37
>>423
確かにカンマ演算子使うのはいいかもな、
ま、俺もどうせ今更だから使わないけど

427:デフォルトの名無しさん
07/04/25 19:31:06
>>423
下の方が分かりやすいとは思うんだけど、
c を2回書かないといけない点は気持ち悪い。
悩ましいところ。

428:デフォルトの名無しさん
07/04/25 22:49:49
すみませんお願いします。
scanfで10桁までの数字を入力し、その10桁の数字を配列に格納するにはどうしたら良いでしょうか?
こんな感じの↓問題なのですが、お願いします。

1.10桁までの任意の数字を入力し、入力した値を配列に格納し、
「何桁目を表示しますか?」を出力し1~10までの任意の数字を入力後
「○○桁目の数字は○です」と出力されるプログラムを作成せよ

ググってもわからないし、全然できないです…orz
どなたか解いてください。

429:428
07/04/25 22:52:19
あ、使用しないとならない関数はscanf printf switch case になります。

430:デフォルトの名無しさん
07/04/25 22:52:36
宿題スレにいけば教えてくれるよ

431:デフォルトの名無しさん
07/04/26 10:21:10
出題者にswitch case は関数じゃない、とつっこんどけ

432:デフォルトの名無しさん
07/04/28 13:57:29
while (GetChar(&c) != EOF) {}

でええやんw

433:デフォルトの名無しさん
07/04/28 14:03:40
なんですかそれは

434:デフォルトの名無しさん
07/04/28 14:33:14
int pos,list[10];
setNum(&list[], sizeof(list));
pos=getPos("何桁目を表示しますか?", sizeof(list));
printf("%d桁目の数字は%dです\n", pos, list[pos] );

こんな感じでおk


435:デフォルトの名無しさん
07/04/28 15:20:44
setNumとかgetPosって何やねん

436:デフォルトの名無しさん
07/04/28 15:37:00
setNum()
配列サイズの個数の任意の数字を入力し、入力した値を配列に格納

getPos()
メッセージを出力し1~サイズ以下の任意の数字を入力させ、それを返却

437:デフォルトの名無しさん
07/04/28 16:24:15
標準Cにそんな関数あるのか?

438:デフォルトの名無しさん
07/04/28 16:42:57
無いなら作れ

439:デフォルトの名無しさん
07/04/28 16:46:46
最初から「宿題は自分でやれ」でええやん

440:デフォルトの名無しさん
07/04/28 20:09:57
御教授ください

とありましたが、「御教示ください」と言ふべきです。

441:デフォルトの名無しさん
07/04/28 22:21:30
「あいにくですが教授の知り合いはいません」と答えておけばいい

442:デフォルトの名無しさん
07/04/28 22:25:40
「教えたまえ」でいいじゃん

443:デフォルトの名無しさん
07/04/30 19:09:20
はらいたまえ、きよめたまえ

444:デフォルトの名無しさん
07/05/01 17:07:22
質問です、プログラムAから別のプログラムBを立ち上げて、
Bの出力する標準出力はディスプレイに出さず全てAが受け取り、
Bが行うscanfなどの標準入力要求時には、すべてAから入力を与えるようにするにはどうすればよいでしょうか。

system,popen等の関数を調べたのですが、実現できません。
一見popenで出来るかと思いきや入力か出力のどちらかしかできないようで困ってます。

手順やキーワードだけでも結構ですので教えてもらえませんでしょうか。

445:gost
07/05/01 17:22:26
符号なし 32bit の変数 a と b があります。
>>
unsigned long a;
unsigned long b;
a と b には任意の値が格納済みであるとして、加算するとオーバー
フロー(0xFFFFFFFFを超える)の場合、"Overflow"、オーバーフロー
しない場合、"(a+b) OK" を出力するプログラム 教えてください
条件:
if((a + b) > 0xFFFFFFFF) の判定は使えません。
if((a + b) <= 0xFFFFFFFF) の判定は使えません。
a と b を加算してはなりません。

446:デフォルトの名無しさん
07/05/01 17:32:29
>>444
popenの第2引数に"rw"使えなかったっけ
あとはforkで起動してパイプつなぐとか

447:デフォルトの名無しさん
07/05/01 17:43:29
>>445
宿題臭いな。宿題スレに行けば。

448:gost
07/05/01 17:46:03
thanks



449:デフォルトの名無しさん
07/05/01 17:51:05
昔、if (x || y || z) よりも if ((x | y | z) != 0) の方が
速くなる可能性がある(コメント必須)という話があったが

if (memcmp(p, "924", 3) != 0) より
if (p[0] != '9' || p[1] != '2' || p[2] != '4') より
if ((p[0] ^ '9' | p[1] ^ '2' | p[2] ^ '4') != 0) の方が
速くなる可能性もあるのかな。(コメント絶対必須で)
もちろん、ショートサーキットの起こる率によっても違うだろうが。


まあ、このケースに限れば(バスエラーが起きない状況なら)
if (*(DWORD *)p & *(DWORD *)"\xFF\xFF\xFF" == *(DWORD *)"924")
の右2つを整数定数に変えたものが最速か。
もちろん、このコードは移植性も無いし可読性もない
最悪のコードではあるのだが。

450:デフォルトの名無しさん
07/05/01 17:51:27
stdioのFILE系で読み書きを同時にするのはトラブルの元だって
たしかrubyの人が言ってた気がする。

451:デフォルトの名無しさん
07/05/01 18:00:03
宿題の答えとしては条件に合わない方法

unsinged long c = a + b;
if(c < a) {
 puts("Overflow");
} else {
 puts("(a+b) OK");
}

∵)
オーバーフローしたとすると、
c = a + b - m (m = 0x100000000)
c >= a だと仮定すると b >= m となるが、b < m なので矛盾する。
従って、オーバーフローした場合は必ず c < a となる。

逆に、オーバーフローしていない場合に
必ず c >= a になるのは自明。

∴ c < a ならばオーバーフローしている。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch