【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 at TECH
[2ch|▼Menu]
[1からを表示]
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);
}

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
まずはパソコンを買うことから始めます。


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

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