【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/02/01 23:08:46
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
URLリンク(www.kouno.jp)
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
URLリンク(www.amazon.co.jp)

他の過去ログはここに
URLリンク(nssearch.hp.infoseek.co.jp)
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
スレリンク(tech板)


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.34【環境依存OK】
スレリンク(tech板)
C/C++の宿題を片付けます 82代目
スレリンク(tech板)

2:デフォルトの名無しさん
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
Wikipedia項目リンク

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);
}


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

5371日前に更新/213 KB
担当:undef