sizeof(char)が必ず1でも、省略すべきではない at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/08/19 20:06:26
malloc(sizeof(char)*(strlen(s)+1))
ではなく
malloc(strlen(s)+1)
と書くような糞コードばかり見て育った、
悪しき慣習を引きずった人は引退すべし


2:デフォルトの名無しさん
07/08/19 20:10:10
>>1
YOU死んじゃいなYO

3:デフォルトの名無しさん
07/08/19 20:10:21
そんなに悔しかったか。

4:デフォルトの名無しさん
07/08/19 20:12:35
何もたてなくても・・・

5:デフォルトの名無しさん
07/08/19 20:12:55
sizeof(char) => sizeof(*s) じゃだめか?と俺が言った。

6:デフォルトの名無しさん
07/08/19 20:15:45
>>1 
こういうのが孤軍奮闘して、単に議論がダラダラと続いているだけなのに、最終的には
「宗教論争」と言い出して「どちらでもいい」ということにしてしまうんだよなぁ。

2chの片隅で、そんなことをしても、なにがどうなるってわけでもないんだけど、
弱い人は、精神防衛せずにはいられないんだろうなぁ。

7:デフォルトの名無しさん
07/08/19 20:17:16
>>5
それもいいかもね。
ただ、charとワイド文字の切り替えを意識してるコードだって知らない人がみたら、意図をつかみにくいかも。

8:デフォルトの名無しさん
07/08/19 20:25:17
>>7
切り替えがなくとも、
sの指す先の型を人間が手作業で書くのは良くないので、
ミス防止のためには、コンパイラに仕事させたほうがいいと思う。

9:デフォルトの名無しさん
07/08/19 20:25:26
可読性だけの問題なのかね。

10:デフォルトの名無しさん
07/08/19 20:28:27
複数箇所に
malloc(strlen(s)+1)
のようなコードを書くこと自体が間違い。

最低でも関数でラップすべきだし、
C++ならstd::basic_stringを使うべきだろう。

11:デフォルトの名無しさん
07/08/19 20:34:31
>>8
char固定なら、いらないじゃん。

12:デフォルトの名無しさん
07/08/19 20:39:21
>>10
ぜんぜんOK

それにラッパー書かなくても、フツーはstrdup()使う。

13:デフォルトの名無しさん
07/08/19 20:51:41
ちんちんが臭いんです><

14:デフォルトの名無しさん
07/08/19 21:03:28
>>11
char固定であることを人間が保証してやるなんて馬鹿馬鹿しい。

>>12
可哀想に。恵まれない職場にいるんだね。

15:デフォルトの名無しさん
07/08/19 21:31:44
sizeof(char)は必ず1である事が定義されてるんだから
別にいいじゃんねぇ

16:デフォルトの名無しさん
07/08/19 21:35:30
そもそも strlen はcharの文字列の長さを求める関数であって
多バイト文字の文字数を求めるなら strlen を使っちゃダメだろ。

17:デフォルトの名無しさん
07/08/19 22:03:17
#define sizeofchar 1

18:デフォルトの名無しさん
07/08/19 22:04:24
>>14
ええ? malloc()のラッパーって話じゃなくて、malloc(strlen(s)+1)のラッパーってことだよね?
職場のヘンなコードばっかり見てないで、いろいろコードを見たほうがいいと思われ。



19:デフォルトの名無しさん
07/08/19 22:05:45
>>14
strlen()使うんだから、char以外は使えないじゃん。

20:デフォルトの名無しさん
07/08/19 22:07:49
>>16
文字列複製用のメモリ確保だと思われるから、長さはバイト数でいいんじゃね?

21:デフォルトの名無しさん
07/08/19 22:30:08
意味の問題。

mallocの引数は「バイト数」
strlenの返り値は「文字数」


22:デフォルトの名無しさん
07/08/19 22:45:24
sizeof(char) == 1バイト

23:デフォルトの名無しさん
07/08/19 22:55:28
>>22
保証は無い。(まだそんなマシン動いてるかどうかはともかく)


24:デフォルトの名無しさん
07/08/19 22:57:39
>>23
100%保障。
sizeof(char)が1でないコンパイラがあったら捨てたほうがいい。

25:デフォルトの名無しさん
07/08/19 23:01:36
一応ANSIならとかつけたほうがいいんでねぇの?
sizeof( char ) != 1の環境は見たこと無いけど・・・

26:デフォルトの名無しさん
07/08/19 23:01:37
問題なのはバイトの方!


27:デフォルトの名無しさん
07/08/19 23:04:00
>>26
だからcharは1バイトだって。

28:デフォルトの名無しさん
07/08/19 23:10:32
>>25
何も書いてない時の ANSI 縛りは、暗黙の了解事項だろ。

そうでないとなんでもありありになっちゃうし。

29:デフォルトの名無しさん
07/08/19 23:13:32
まえスレの人は、charが1バイトってくらいは分かったうえで、いろいろ言ってる様な印象だったけど、
ちがう人と交代したのかな?

30:デフォルトの名無しさん
07/08/19 23:13:51
牛乳タンクの容量を割り当てる関数があるとしよう。引数はリットル型だが、実はintのtypedefだ。

箱の中に複数本の牛乳パックが入っている。
本数を問い合わせる関数があるとしよう。返り値は本数型だが、実はintのtypedefだ。

箱の中の牛乳パックを開けてタンクに入れようとする。
同じintのtypedefだからといって、
リットル型の引数に、本数型を渡していいものだろうか。

俺はダメだと思うね。
たとえ1本1Lと決まっていても、本数型からリットル型に変換する段は踏むべきだ。

31:デフォルトの名無しさん
07/08/19 23:18:49
いちいち
hoge = (type*)malloc(sizeof(type)*size) ;
なんて書いてる人いるの?

初心者だって、
#define MALLOC(type, size) ((type)*)malloc(sizeof(type)*(size))
くらいして、
hoge = MALLOC(char, strlen(s)+1) ;
って書くだろ?

だいたい、いまどきCオンリーなんて、なにか理由があるときくらいなもので、
普通はC++だから、文字列クラスを使うだろう。

いまだにチマチマとstrlenとかstrcpyとかやってるから、
つまらないバグやセキュリティホールを作り込んでしまうんだよ。

32:デフォルトの名無しさん
07/08/19 23:20:21
>>30
strlen()のリターン値は文字数==バイト数で、malloc()引数もバイト数じゃん。

33:デフォルトの名無しさん
07/08/19 23:23:55
>>30
強いtypedefのあるD言語をお使いください。

34:デフォルトの名無しさん
07/08/19 23:23:57
>>31
> 初心者だって、 ・・・って書くだろ? 

それ、たとえば誰が書いてるの?
職場の先輩とか?

35:デフォルトの名無しさん
07/08/19 23:23:57
malloc()の戻り値をcastするやつはバカ

36:前スレ980
07/08/19 23:33:02
俺は*sizeof(char)は付けない派だが。(付いてても気になら無いけど)

>>31
これはちょっと全体的に反対。

>#define MALLOC(type, size) ((type)*)malloc(sizeof(type)*(size))
そんな訳の分からないマクロ作るぐらいなら、素直にcalloc使うよ。

>普通はC++だから、文字列クラスを使うだろう。
そんな普通は無いだろ。

37:デフォルトの名無しさん
07/08/19 23:36:35
>>36
名前欄消し忘れた・・・。
是非スルー頼む。orz

38:デフォルトの名無しさん
07/08/19 23:41:53
>>36
全体的に賛成だがcallocになるのか?ラッパー関数とかじゃなくて?

39:デフォルトの名無しさん
07/08/19 23:42:29
> 普通はC++だから
www

40:デフォルトの名無しさん
07/08/20 00:00:32
>>32
たまたま 文字数==バイト数 なだけじゃん。

41:デフォルトの名無しさん
07/08/20 00:06:15
>>40
「規格上」文字数==バイト数。
たまたまじゃない。

42:デフォルトの名無しさん
07/08/20 00:08:37
>>35
Cではキャストは不要だがC++では必要。
まぁ、C++でmallocを使うこと自体がおかしいが。

43:デフォルトの名無しさん
07/08/20 00:09:23
>>41
たまたま「規格上」一致する組み合わせ


44:デフォルトの名無しさん
07/08/20 00:16:28
>>38
>>31のマクロだと「型と要素数を指定してメモリを獲得する」機能が欲しそうだったんで、
指定の仕方が近いcallocを持ってきただけだよ。

>>1やらの話なら、文字列長渡してメモリのアドレス返すラッパならアリじゃないかなぁ。
個人的には面倒だからやらないけども。

45:デフォルトの名無しさん
07/08/20 00:18:40
>>40
たまたまじゃないよ。
あつかってる文字セットが収まる範囲を1バイトにしてるんじゃん。

46:デフォルトの名無しさん
07/08/20 00:22:57
ここで文脈を読まずに文字数==バイト数なのはASCIIコードだけだとかいってみる

47:デフォルトの名無しさん
07/08/20 00:23:18
>>44
すでに_strdupがあるもんな。

「文字列の尻には\0があるから、+1文字分の領域が必要」
ということに対処するコードは一ヶ所だけにまとめておくべきで、
プログラム全体に散在させるべきではないよね。
それが後で変るかどうかは関係ない。

あちこちにmalloc(strlen(s)+1)と書けばいいと言う人間は、
構造化プログラミングを否定していると思う。

48:デフォルトの名無しさん
07/08/20 00:24:19
>>45
牛乳パック1本が1リットルと決まっているからといって、
リットル数を与えるべきところに本数を与えていいと思うか?

49:デフォルトの名無しさん
07/08/20 00:29:47
>>47
malloc(strlen(s) + sizeof(char)) って書くってこと?

50:デフォルトの名無しさん
07/08/20 00:30:11
恒久的に一本一リットルなら何の問題もないだろ。

51:デフォルトの名無しさん
07/08/20 00:41:20
>>50
恒久的にってのもだけど、論理的にも一文字1バイトだし。

52:5
07/08/20 00:42:54
俺もsizeof(char) == 1 だと思ってたけど、TCHARがWindowsのAPIがらみの定義らしいとこまで調べたので、strlenもwindowsの特殊仕様な可能性を考えてました。
(引数の型がTCHARとやらに変わるなど、思い込み)
無知なのに口だしてごめんなさい。

strlenがchar固定。sizeof(char)==1バイトが、規格から明らかならば、
sizeof(char)はいらないよね。

察するに>>40,>>43は「バイト数」と言う言葉と、「文字数」という言葉を
厳格に分けたいというところかな?

それに対して、1バイト==sizeof(char)は規格上定義されているから
分けて考える必要はないという反論。ってことですね。私はこっち派。

>>47,>>49
このスレで議論の中心になってるのは、+1ではなくて、
>>1の1行目、"sizeof(char)*" -charのサイズを掛けている-部分だと思うよ。

53:デフォルトの名無しさん
07/08/20 00:46:53
>>49
どこから、そういう発想がでてくるのだろ。

size_t CalcRequiredMemoryForString(const char* s) {
return sizeof(char)*(strlen(s)+1) ;
}

もっと細かく分けて

size_t ScanAscizStringLength(const char* s) {
return strlen(s)+1 ;
}

size_t CalcRequiredMemoryForString(const char* s) {
return sizeof(char)*ScanAscizStringLength(s) ;
}

とかでもいい。

そしたら、
char* s2 = malloc(CalcRequiredMemoryForString(s)) ;
と書けるようになるっしょ。

54:デフォルトの名無しさん
07/08/20 00:47:20
論点は、 (1)charのサイズの問題 (2)sizeof(char)を書くか なのかな。

(1)はラッパを書く、(2)は書いたら弊害があるのか? でダメ?

55:デフォルトの名無しさん
07/08/20 00:55:43
>>53
strlen()+1だけの関数とか、そんなのつかってるのオタクの職場くらいですよ。

56:デフォルトの名無しさん
07/08/20 00:58:56
>>53
壮大な釣り?
>size_t ScanAscizStringLength(const char* s) {
string lengthはどう考えてもstrlen()の戻り値そのままだろ。
stringに形容詞がつくだけで長さが変わるなんて気色悪い。
getStringSize()って名前なら判らんでもないが。

で、malloc(sizeof(char) * stringSize)なら「あ〜あ、一一書いているよ」で済むが、
malloc(CalcRequiredMemoryForString(string))なんて書いていたら「戯け」の一喝だな。
# CalcRequiredMemoryForDoublePrecReal()なんてのも作るのか?

57:デフォルトの名無しさん
07/08/20 01:00:09
>>55
ふつう文字列クラス使うよな。

strlenとかstrcatとかstrcpyなんて直接使わないもの。

58:デフォルトの名無しさん
07/08/20 01:01:31
>>56
ふつうC++なので、やるとしてもテンプレート関数だな。

59:デフォルトの名無しさん
07/08/20 01:06:54
>>57
mallocとか使ってることから、ここはC限定ではないのかな?

>>53
そこまで書くんだったら >>49 程度で済ました方が良いと思う。それと、その関数名だと長すぎて使いたくない。


60:デフォルトの名無しさん
07/08/20 01:06:55
>>54の(2)sizeof(char)を書くか
URLリンク(www.kouno.jp)

一般的には、どっちでも良いってよ。

61:デフォルトの名無しさん
07/08/20 01:09:02
ポイントとしては、
無知やうっかりミスによってバグを生じさせない
ということ。

+1が必要なことを知らない人もいるし、
+1を書き忘れることもあるし、
sizeとlengthを書き間違えることもある。

じゃぁどうすればいいか。
Cを捨ててC++で文字列クラスを使うべき。

62:デフォルトの名無しさん
07/08/20 01:13:01
>>59
C++でもmalloc使う人いるんだよねぇ。

> >>49 程度で済ました方が良いと思う。

strlen(s) + sizeof(char)
これこそ意味不明だねぇ。

1文字分ってことなら、
sizeof(char)
ではなく
sizeof(char)*1
としないとねぇ。

そうするなら
sizeof(char)*(strlen(s)+1)
になるわなぁ。

> その関数名だと長すぎて使いたくない。

いちいち手でタイプする人いるんだよねぇ。
ミスタイプしたりするからコピペが基本よ。



63:デフォルトの名無しさん
07/08/20 01:17:55
>>62
長い数式を書かない人なんだね・・・

64:デフォルトの名無しさん
07/08/20 01:22:01
>>53
まあ、常識的に考えてこんな関数つかわねーよな。

65:デフォルトの名無しさん
07/08/20 01:24:23
>>53とか>>55>>56とか
void *getBufByLen(int length)
{
 return malloc(length + 1);
}

まぁこのぐらいのラッパなら良いんじゃないの?
strlen(str)+1がどのぐらい出てくるかにもよるんだろうけどさ。

どうしても「+1」をソースコードから出来るだけ消したいなら、俺なら
#define LEN2SIZE(x) ((x)+1)
でも作って、LEN2SIZE(strlen(str))で書くか。
したら、今度は副作用がどうとか言われんのかねぇ。

66:デフォルトの名無しさん
07/08/20 01:29:49
>>65
そこまでして+1を消すと、かえって読みにくくなるよ。
strlen(s) + 1 と直に書くのがいちばん素直なCのコード。
技巧に走りすぎてもよくない。

67:デフォルトの名無しさん
07/08/20 01:38:58
>>66
そうは思うけどさ。
たまに上司の好みで結構色々言われんのよ。
(俺も多分好みで妙なコード書いてるとは思うけど)

んで、そこで激論しても時間無駄だから、
まぁ良いかと思えることは従うことにしてる。

今のところ「+1消せ」は言われたことないけど、
そういう指示が出たらこうするかな、ってぐらいのモン。

68:59
07/08/20 01:42:50
>>62
ごもっともです。

ところで、もともとの質問主の環境は VC++6.0 みたいですね。
素直にC++の文字列クラスを使うのがいいのかな...


69:デフォルトの名無しさん
07/08/20 04:32:26
>>65
getBufByLenではなくallocBufByLenにしたほうがいいと思う。


70:デフォルトの名無しさん
07/08/20 11:05:39
>>62
>C++でもmalloc使う人いるんだよねぇ。
それは酷い。

71:デフォルトの名無しさん
07/08/20 11:39:01
ひょっとしてJavaに移植するときとか、そこまで考えてるのか?
Cだけなら sizeof(char)==1 が仕様で定義されてるけど

72:デフォルトの名無しさん
07/08/20 11:47:13
乱れる倫理。10歳以下のセミヌード!
URLリンク(www11.big.or.jp)

73:デフォルトの名無しさん
07/08/20 11:49:09
うわ・・本当に脱いでる・・・

74:デフォルトの名無しさん
07/08/20 11:51:22
蝉の脱皮だろ

この板では空気を読む必要は無い。

75:デフォルトの名無しさん
07/08/20 11:52:25
>>71

#include <stdio.h>

int main()
{
printf("%d\n",sizeof(char));
return 0;

}

をCでコンパイルしてみたか?
C++でもコンパイルしてみたか?

76:デフォルトの名無しさん
07/08/20 11:55:31
>>72
これはアブラゼミだね

77:デフォルトの名無しさん
07/08/20 11:56:31
>>75
CとC++でsizeof(char)は絶対1なのは仕様で保証してるんだけど・・・

78:デフォルトの名無しさん
07/08/20 13:19:39
1バイトは8ビットとは限らないが、charは1バイトと規格で決まっている。
ってことでしょ?

79:デフォルトの名無しさん
07/08/20 13:37:00
>>75
もう帰れ無能。

80:デフォルトの名無しさん
07/08/20 13:40:04
>>43
Cの規格での「文字」の定義は「1バイトに納まるビット表現」。
規格書ちゃんと嫁。

81:デフォルトの名無しさん
07/08/20 13:43:49
>>80
文字っつーかcharな。単に文字とか言うとまた噛み付いてくるで。

82:デフォルトの名無しさん
07/08/20 14:01:07
>>81
>単に文字とか言うと
規格に於ける定義の話をしてるんだが。

83:デフォルトの名無しさん
07/08/20 14:25:58
>>82
それならきっちり「文字型」といった方が誤解ないよねとか
文字とだけ言うとシングルバイト文字とマルチバイト文字を
ごっちゃにするやつが出てくるから 規格話するなら正確に
みたいあn

84:デフォルトの名無しさん
07/08/20 14:40:08
>>75
関係ない話なんだが、
sizeof演算子の結果の型はsize_tだけど、こういう場合はintにキャストしなくていいの?

85:デフォルトの名無しさん
07/08/20 15:08:04
>>70
C++だろうとmallocは使えるでしょう?
mallocしたものをdeleteしたりしなければ。

86:デフォルトの名無しさん
07/08/20 15:12:41
>>80
charが1バイトなのは当然として、
1を掛けるのを省略して書いて良いのかどうか
という問題だろう。



87:デフォルトの名無しさん
07/08/20 15:21:31
>>85
使えるけど、new があるのに
>mallocしたものをdelete
する危険を冒してまで態々使う意味が判らない。

>>86
「省略しちゃいけない」とする理由が
「文字数とバイト数は意味が違うから」であれば、
規格上は「文字」=「1バイト文字」であり
「文字数=バイト数」であるから
「省略しても問題ない」よね?という確認。

88:デフォルトの名無しさん
07/08/20 15:35:24
問題は無いね
どうすべきかとなると宗教論争になりそうだ

89:デフォルトの名無しさん
07/08/20 15:37:25
>>86
C FAQにあるよ

90:デフォルトの名無しさん
07/08/20 15:42:03
つきつめるとCHAR_BITすら意味をなさないからあまり気にするものでもないと思うが

91:デフォルトの名無しさん
07/08/20 15:45:13
>>87
> 「文字数=バイト数」であるから

それは数値の一致であって、意味の一致ではない。
あくまでも「1バイト文字」の「文字数」なのだから。

省略してもプログラムは意図した通りに動くが、
プログラムが動けば何だっていいというのは間違い。


92:デフォルトの名無しさん
07/08/20 15:54:11
>>91
はあ…
>それは数値の一致であって、意味の一致ではない。
意味の一致だってばさ。頭悪いなあ。
「規格では、strlen() はバイト数を戻す」
これで納得した?

93:デフォルトの名無しさん
07/08/20 16:06:54
charやstrlenをハードコーディングしちゃうなら*sizeof(char)を書く意味はほとんど無いと思うなぁ。

>>87
new使ったってその危険はdeleteとdelete[]を間違える危険にかわるだけじゃね?

94:デフォルトの名無しさん
07/08/20 16:10:40
なんつーか
みんな暇なの?

95:デフォルトの名無しさん
07/08/20 16:11:19
規格では、strlen() はバイト数と等しい値を返す
だろ?

96:デフォルトの名無しさん
07/08/20 16:25:08
strlenの返す値の意味がバイト数ではなく文字数だと言いたいんですかね。

97:デフォルトの名無しさん
07/08/20 16:43:09
そんなに不安ならコメント書いとこうぜ

98:デフォルトの名無しさん
07/08/20 16:46:35
>>96
格納するのに必要なバイト数
ではないのは確かだな。

99:デフォルトの名無しさん
07/08/20 17:09:30
>>1
アルファベット=レターと非アルファベット記号=キャラクターとストリングの意味からして、strlenが間違い。

100:デフォルトの名無しさん
07/08/20 17:39:16
外人は文字が2バイトかもしれないなんて考えてないから、
strlenという関数名なんだろ。


101:デフォルトの名無しさん
07/08/20 17:50:26
>>94
意味のない議論をしたがる厨房が集まってるだけだろ

102:デフォルトの名無しさん
07/08/20 17:54:08
このスレ、すんごい伸びだな。

103:デフォルトの名無しさん
07/08/20 18:01:54
>>84
整数型の暗黙の変換ルールがあるから問題ない。
ただ、size_tは符号無しだから、
intに変換されることで情報が失われるかも分からんね。

104:デフォルトの名無しさん
07/08/20 18:05:52
>>100同感
2バイトあれば全世界の文字が収まると勘違いしていたしな。


105:デフォルトの名無しさん
07/08/20 18:14:57
してません

106:デフォルトの名無しさん
07/08/20 18:22:55
このさい8バイトでいいだろ。

107:デフォルトの名無しさん
07/08/20 18:23:09
>>100
記号一つに2バイトなんて無意味だし不可能。
strlenが誕生した時代は数バイトのメモリが数万円。

108:デフォルトの名無しさん
07/08/20 18:30:18
んなわけないだろ

109:デフォルトの名無しさん
07/08/20 18:36:58
そんなにsizeof書きたくないんだったら高級言語つかえよ

110:デフォルトの名無しさん
07/08/20 18:40:09
なんじゃそりゃ

111:デフォルトの名無しさん
07/08/20 18:42:46
そんなにsizeof書きたいんだったら高級言語使うなよ

112:デフォルトの名無しさん
07/08/20 18:44:08
>>108
PDP-11は、メモリ64KB程度搭載で、1万ドルくらいだったそうだな。
当時の為替レートからすると、360万円か。

数バイト数万円は違うが、数Kバイト数万円くらいだな。

113:デフォルトの名無しさん
07/08/20 18:44:38
>>111
C言語は高級言語ではないな。

114:デフォルトの名無しさん
07/08/20 18:52:11
>>112
メモリのコストはその一部でしょう

115:デフォルトの名無しさん
07/08/20 18:53:46
>>1
#defineで定義しておけ。


116:デフォルトの名無しさん
07/08/20 18:54:59
>>114
昔のコンピュータは、メモリのコストは一部なんてもんじゃなく、かなりを占めていたのよ。

117:デフォルトの名無しさん
07/08/20 18:56:14
MSXの32KB増設RAMカートリッジが1万円以上だったのを
思い出したような

118:デフォルトの名無しさん
07/08/20 18:58:40
Cができたのってやっとシリコンメモリが普及し始めたころだっけ?

119:デフォルトの名無しさん
07/08/20 19:03:27
>>84
キャストするべき。
size_tがintと同じサイズである保証は全くない。
sizeof(int) == sizeof(long)の環境に限定するなら、省略するのもありかも試練が。

120:デフォルトの名無しさん
07/08/20 19:25:26
C FAQを見てはいけないスレはここですか?

121:デフォルトの名無しさん
07/08/20 19:32:08
>>118
PDP-11の頃

>>120
C FAQは聖典ですか?

122:デフォルトの名無しさん
07/08/20 19:40:30
聖典w

123:デフォルトの名無しさん
07/08/20 20:38:51
>>121
>C FAQは聖典ですか?
いいえ、常識です。

124:デフォルトの名無しさん
07/08/20 20:43:43
>>100
>>107
UTF-16とか思い出してあげてください。

125:デフォルトの名無しさん
07/08/20 23:07:54
>>123
C FAQ では、sizeof(char)を使うのは、プログラムがわかりやすくなるから、一興だと言ってるが?

126:デフォルトの名無しさん
07/08/20 23:10:14
>>124
UTF-16は1文字=2バイトじゃねーよ

127:デフォルトの名無しさん
07/08/20 23:13:15
>>125
ぜんぜんいらねーよ。

とも書いているね。まあどっちも正しいってことだな。

128:デフォルトの名無しさん
07/08/20 23:15:32
書かなかったからといって不正なプログラムというわけではない。

ということだな。

129:デフォルトの名無しさん
07/08/20 23:25:35
>>126
小学生からやり直せ

130:デフォルトの名無しさん
07/08/20 23:37:29
>>129
Cにおいてsizeof(char)=1は仕様だが、
1バイトが8ビットなのは仕様ではない。

131:デフォルトの名無しさん
07/08/21 00:08:16
つまんねー内容をだらだらだらだら
何を言い合ってんのおまえら (w

132:デフォルトの名無しさん
07/08/21 00:19:55
ここの人達が、同じプロジェクトに放り込まれたら、
どうなるんだろう...
C FAQ は理解しやすくなる「かも」とかいてあるけど、
逆に意図が分からなくて困惑する人もいるかも。

133:デフォルトの名無しさん
07/08/21 00:22:53
同じプロジェクトに入ったら個人レベルでソースファイルを分割し
他人が担当しているソースファイルは一切見ないようにすればOK。
レビューとかあれば、同じ信念をもち曲げないメンバーでする。

そんなプロジェクトやだなぁw

134:デフォルトの名無しさん
07/08/21 00:44:11
>>130
>>100>>107がC言語の規格が決まった当時の話をしてるのに、
>>124はもっと最近の話をしてるところが突っ込みどころなわけであって。

ナニコレ。
>UTF-16は1文字=2バイトじゃねーよ

>Cにおいてsizeof(char)=1は仕様だが、
>1バイトが8ビットなのは仕様ではない。

誰がUTF-16の1文字=2バイトとか言ってんだ?
んー・・・もしやUTF-16は1バイトが8ビットの環境て使うべきでない、
とかそういう意見をお持ちの方?

135:デフォルトの名無しさん
07/08/21 01:57:32
>>134
charは文字だろ

って話の寄り道だったんじゃないか?

136:デフォルトの名無しさん
07/08/21 07:54:41
マロック・ストラレン

137:デフォルトの名無しさん
07/08/21 08:07:00
文字の型を隠蔽してsizeof(TCHAR)でいくね

138:デフォルトの名無しさん
07/08/21 10:44:54
>>137
C++ のクラスをWin32とWinCEで使いまわす俺には必須だぜ!

ところで、>>129 がどこに突っ込んでるのかが知りたい。
UTF-16の1文字は2バイトとは限らないし
2オクテットとも限らないわけだが。

139:デフォルトの名無しさん
07/08/21 11:46:27
1バイトのビット数ってこの話にはあんまり関係ないような

140:デフォルトの名無しさん
07/08/21 11:57:51
>>138
根本的にズレてるって意味だろう。
>124 は別にUTF-16が1文字=2バイトだとは言ってないから。

141:デフォルトの名無しさん
07/08/21 12:21:34
>>138
Win32でもUnicodeでやればいいじゃんかー。

142:デフォルトの名無しさん
07/08/21 12:33:10
スレの趣旨がわからなくなってきた

143:デフォルトの名無しさん
07/08/21 13:37:16
1nibble=4bit

144:デフォルトの名無しさん
07/08/21 14:46:42
1nibble=4bit
1byte=8bit
1word=16bit
1dword=32bit
だっけか
環境とか詳しいことは知らんが

145:デフォルトの名無しさん
07/08/21 14:59:30
1ワードは36bitだよ。

146:デフォルトの名無しさん
07/08/21 15:12:29
1byte=8bitとは限らない。

147:デフォルトの名無しさん
07/08/21 15:25:06
32ビット256Kワードとかよくある話だな

148:デフォルトの名無しさん
07/08/21 20:46:59
>>142
暇つぶし

149:デフォルトの名無しさん
07/08/21 21:40:25
結論。
必ず1だから省略すべし。

150:デフォルトの名無しさん
07/08/21 21:53:41
省略するのは最適化コンパイラの仕事であって人間の仕事ではない。

151:デフォルトの名無しさん
07/08/21 22:00:31
コンパイラは省略しません。そういう意味では無駄にコストが発生します。
# 勿論、コンパイルのね。

152:デフォルトの名無しさん
07/08/21 23:06:13
>>151
いや、定数の演算だから消えてなくなるだろ

153:デフォルトの名無しさん
07/08/21 23:08:54
もう、どっちなんですか!!!?

154:デフォルトの名無しさん
07/08/21 23:20:24
>>152
消えてなくなると言うことは、コンパイラは省略せずにちゃんと最適化したということですね。

155:デフォルトの名無しさん
07/08/21 23:24:28
意味はあっても価値はない。ってところかしら?
価値が無いからと言って、消して良いのか?
でも最適化でけされるよ。
消されなかったら実行時のコストだな。
じゃあ、今、消しておこう。

156:デフォルトの名無しさん
07/08/22 02:04:18
消してしまったsizeof(char)を復元する必要が出てきたときに
莫大なエネルギーが消費されるからそのままにしておいたほうがいいお。

仕事でスパゲッティコードをリファクタリングしたときに、
元のコードをコメントで残しとけとか言われて非常に苦労した覚えがあるお。

157:デフォルトの名無しさん
07/08/22 02:13:07
>元のコードをコメントで残しとけ
リファクタリングもへったくれもありませんな。

158:デフォルトの名無しさん
07/08/22 02:23:23
>>156
>復元する必要が出て来たとき。
上の方で誰か書いてたけど、ラッパー関数にするか、マクロにするかして、
一度に変えられる様にしておけば良い。
復元してもどうせ1だからそのまま使う訳じゃないだろう。

159:デフォルトの名無しさん
07/08/22 09:47:48
>>156
>sizeof(char)を復元する必要
Cの仕様が変更にならない限りその必要は無いからな
どうだろうな

160:デフォルトの名無しさん
07/08/22 12:46:00
subversionでいいじゃん

161:デフォルトの名無しさん
07/08/22 21:07:24
…そう言って通る職場なら良いけどな

162:デフォルトの名無しさん
07/08/22 21:54:59
svn厨は退場してください

163:デフォルトの名無しさん
07/08/22 22:36:22
じゃあCVSで・・・ごめん、悪かった

164:デフォルトの名無しさん
07/08/22 22:51:41
それならよし!

165:デフォルトの名無しさん
07/08/22 23:00:05
それでいいんかい!

166:デフォルトの名無しさん
07/08/23 01:40:32
ふつーbzr

167:デフォルトの名無しさん
07/08/23 20:54:00
もうねmallocなんてあちこちで書いてちゃだめなんだよ。
ラッパーとか言うのも違うな。
構造化だよ。オブジェクトを作る段でだけ利用するんだ。
そもそもC++の偉い人がnewなんてすばらしい関数を
用意してくれているんだから、new使えよ。

168:デフォルトの名無しさん
07/08/23 21:34:07
Dの偉い人が動的配列なんてすばらしい機能を
用意してくれているんだから、動的配列使えよ。

169:デフォルトの名無しさん
07/08/23 21:54:16
vector使うお!!

170:デフォルトの名無しさん
07/08/24 00:15:47
え?newって関数なの?演算子かと思ってたんだが・・・

171:デフォルトの名無しさん
07/08/24 00:20:10
C++のnewは演算子だな。


172:デフォルトの名無しさん
07/08/24 00:32:18
newだって寿命管理はプログラマがやらなきゃいけないわけで、
mallocと同じように、
考えて使うところを狭めないと、
収拾が付かなくなる。

173:デフォルトの名無しさん
07/08/24 00:32:33
ってことはoperator newでオーバーロードできたりするの?

174:デフォルトの名無しさん
07/08/24 01:24:37
>>173
何を今更。だからやろうと思えばOS管理外からメモリを引っ張ってくる事だってできる。

175:デフォルトの名無しさん
07/08/24 01:44:33
smart_ptr<T> ptr = Allocator<T>();
みたいなカスタムアロケータ用意するとか

176:デフォルトの名無しさん
07/08/24 09:39:31
演算子は全て関数だと乱暴な言い方も当然出来る。

177:デフォルトの名無しさん
07/08/24 11:39:47
>>176
挙動が違うんだけど。

178:デフォルトの名無しさん
07/08/24 19:45:47
で、sizeof(char)の省略いいの?わるいの?

179:デフォルトの名無しさん
07/08/24 19:48:27
いい

180:デフォルトの名無しさん
07/08/24 20:52:42
文法的にも、プログラム的にも、省略するのは間違いではない。
だが、
プログラムを人間が読んで理解する上では、省略しないほうがよい。

181:デフォルトの名無しさん
07/08/24 22:22:15
>180みたいな人間に合わせるために、省略しない方がいい。
>180みたいな人間が見ることがないコードなら、遠慮することなく省略していい。

182:デフォルトの名無しさん
07/08/25 00:29:12
>>180
そもそも理解の妨げにならない、という話をしてるんじゃないのか。

183:デフォルトの名無しさん
07/08/25 03:38:00
>>180
逆、コンピューターの作法に人間が合わせてるだけ。
人間様はシンプルな方が理解しやすい。

184:デフォルトの名無しさん
07/08/25 09:16:43
>>182
>>180 は理解が足りない、って話じゃないの?

185:デフォルトの名無しさん
07/08/25 11:05:48
書く目的が、、、
(1).人間が理解しやすい、と言うなら、
「無くても理解できる。」、「無駄なコードに見える」
(2).char -> wchar_t や処理系固有の文字型に変更する可能性のためなら、
strlen はchar専用、またsizeof(char)と直接書くのも適切ではない。より汎用的に書くべき。
また#if などで、文全体を置き換えるとすれば、(1).より、無くても良い。
必要な型の場合のみ書く。
(3).その処理系はsizeof(char)自体が、1ではない。
このスレの前提「必ず1でも」に一致しないので、除外する。

186:デフォルトの名無しさん
07/08/25 13:54:03
>>185
>181

187:デフォルトの名無しさん
07/08/25 14:24:25
#define SZCHAR 1

p = (char*)malloc(SZCHAR*strlen(ps));

if(p == NULL)
{
return ERR;
}

こうすればいいじゃね

188:デフォルトの名無しさん
07/08/25 14:37:13
>>187
aho


189:デフォルトの名無しさん
07/08/25 14:44:33
>>187
βακα..._〆(゚▽゚*)

190:デフォルトの名無しさん
07/08/25 15:23:52
>>187
Ma nuke.

191:デフォルトの名無しさん
07/08/25 15:29:12
>>185
汎用的に書くからには、それで正しく動作するように書き、テストもすべきだ。
見かけ倒しで実際にはダメなんてのは迷惑。
だから、charでしか正しく動作しないのであれば、charで書いておくべきだ。

192:デフォルトの名無しさん
07/08/25 23:38:06
VCならTCHAR使えってこった。

193:デフォルトの名無しさん
07/08/26 01:33:34
_TCHARとTCHARの違い、わかって言ってる?

194:デフォルトの名無しさん
07/08/26 04:15:18
>>188
気やすくAhoと言うな。

AWKを作った偉い人の名前だぞ。

195:デフォルトの名無しさん
07/08/26 05:37:47
/*sizeof(char)*/

196:デフォルトの名無しさん
07/08/26 14:29:20
なんかchar型のサイズが1バイトって前提の話になってるけど
C++だとcharのサイズって1(単位なし)だよな。
で、各型のサイズはcharのサイズの整数倍であることが保証されている。

でも1=1バイトかどうかは環境依存だよな?
#あくまで企画上の話なので実際にcharのサイズが1バイトじゃない環境出せとかいうのはなしね。


197:デフォルトの名無しさん
07/08/26 14:37:23
>>196
1バイトが8ビットであることも決まっていない。
CHAR_BITは8以上となっているから、1バイト=7ビットでは規格合致できないけど。

198:デフォルトの名無しさん
07/08/26 14:58:19
>>196
C、C++は 絶対何があってもsizeof(char)は1バイト
と規格で定めてる。
それ以外の環境はありえないし存在しない。

1バイトが8ビットかどうかはこのスレでは論じていない。

199:デフォルトの名無しさん
07/08/26 15:02:07
>>197
とりあえず、規格上のサイズ指定に使われている単位と
環境上で実際にサイズ指定に使われている単位って違うよなってことを
指摘したかっただけなんだ。

で、指摘の件だけど、それはcharのサイズ=1=2バイト(今の話なら14ビット)
で定義してやればその要件は満たすんじゃね?
CHAR_BITはcharを構成するビット数であって1バイトを構成するビット数の
話じゃないよな?

あと、バイトの出自ってIBMの内部呼称でbit octetからきてると思ったんだが
今はなんかビット数に関して不問にするみたいなのってあるのかな?

200:デフォルトの名無しさん
07/08/26 15:12:09
>>199
そういうこと。外から見てcharが2オクテットだったとしても、
CHAR_BIT == 16にして、sizeof (char) == 1にすれば規格合致できる。

いずれにせよ、198の言うとおりこのスレで話すようなことではないけどな。

201:デフォルトの名無しさん
07/08/26 15:47:31
>>198
プログラミング言語C第2版p44(ISBN4-320-02692-6)にはたしかに書いてあるね。
けどプログラミング言語C++第3版(ISBN-4-7561-1895-X)にはそんなこと書いてないよね。
charのサイズに関してはp110で言及してるけど、サイズが1であること、8ビット以上であること、
ほとんどの場合に8ビットバイトであることはかかれてるけど、1バイトとは書いてないよね。
#これよんで9ビットバイトって書いてもいいのかとは確かに思った。

まぁ、何が言いたいかというとcharのサイズが2バイトのC++環境とかだと
sizeof(char)をかけてもC++の仕様レベルで必要バイトサイズとれないよなって話。
#mallocの引数はバイト数なんだよね。

Cは厳密な話知らなかったから知らない。
#ちゃんとC++限定で話してたよね。

>>200
ということで、charのバイトサイズをべつに定義しておいてmallocに渡すときはそれを
使ってバイトサイズに変換しろっていうまとめをするとすれ違いにならないかな?


202:デフォルトの名無しさん
07/08/26 15:48:12
マルチバイトを扱うなら文字列関係は普通ライブラリ化する
不都合が発生してもそこだけ修正するので1の件は重要じゃない
反対にmalloc散らばりまくりの汚い実装なら
17文字余計にタイプすると人件費にして2円位になるから
わざわざ強要してもとコストがかさむだけでメリットがない

203:デフォルトの名無しさん
07/08/26 15:50:25
>>202
>17文字余計にタイプすると人件費にして2円位になるから
計算方法kwsk

204:デフォルトの名無しさん
07/08/26 15:56:25
>>201
wikipediaでもなんでも見ればいいだろ。

205:デフォルトの名無しさん
07/08/26 16:07:59
>>203
例えば1500円/人時で5秒2円位。17文字タイプだとその位にはなる

206:デフォルトの名無しさん
07/08/26 16:14:51
>>201
ISO/IEC 14882(C++の規格だ) の5.3.3 Sizeof にこう書いてある。

sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;

207:デフォルトの名無しさん
07/08/26 16:20:56
>>206
いや、お前さんは流れ読めてなさ杉だろ。

208:デフォルトの名無しさん
07/08/26 16:21:29
#define sizeof(char) 1

209:デフォルトの名無しさん
07/08/26 16:24:36
>>207
>charのサイズが2バイトのC++環境とかだと
っていう>>201の前提がこれで無くなった っていうだけだよ

210:デフォルトの名無しさん
07/08/26 16:25:29
>>201後半
それはない。
そうだとすると、malloc(2)の返すポインタが
要素数2つのchar配列として使えないという意味になるではないか。

mallocが使う単位もまた、sizeofと同じ。

211:デフォルトの名無しさん
07/08/26 16:36:14
>>209
sizeofの単位がバイトとはどこにも書いてないだろう

212:201
07/08/26 16:36:27
>>209
いやいや。だから、規格だと1とは書いてあるけどそれが1バイトを意味するって書いてないよねってはなし。
たとえば1=1ワードとかあり得るわけで。昔とかだと1ワード9ビットとか10ビットのマシンってあったしね。
その1ってなんだ? っていうお話。

sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;
じゃなくて、
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1 byte;
ってかいてあるなら自分の言ってることは間違いってことになるけど。

>>210
そうだよ。だから、規格上ではホントにそれが保証できないって言いたいわけ。
malloc(8)の返すポインタが要素数2つのint配列として使えないのと同じってこと。

mallocが使う単位はbyteでsizeofの単位はC++に限って言うならcharのサイズを1とした環境依存。
実用上同じでないと使い勝手が悪いというのならそれには同意。


213:デフォルトの名無しさん
07/08/26 16:43:08
C99ではsizeofの結果はバイト数ってことになってるな。

> sizeof 演算子の結果は、そのオペランドの大きさ(バイト数)とする。

214:デフォルトの名無しさん
07/08/26 16:44:00
>>212
The sizeof operator yields the number of bytes in the object representation of its operand.

ってわけえ、sizeofはバイト数を返します

215:デフォルトの名無しさん
07/08/26 16:46:07
>>201
次のネタどうぞ

216:デフォルトの名無しさん
07/08/26 16:51:06
sizeof()の返り値はバイト数
malloc()の引数はバイト数

では、
strlen()の返り値は何?

バイト数なら、そのまま+1してmallocの引数に渡すのはOKだが、
文字数なら、sizeof(char)を掛けないと、バイト数にはならないよね。

217:デフォルトの名無しさん
07/08/26 16:56:47
The strlen function returns the number of characters that precede the terminating null character.

218:デフォルトの名無しさん
07/08/26 17:00:44
1を掛けても掛けなくても数値は変わらないよね

219:デフォルトの名無しさん
07/08/26 17:03:15
strlenの引数は char* だから文字数=バイト数と考えてよいのでは?
それとも漢字が混じるとそれも1文字として扱われるだろうか?
だとしたら、sizeof(char)掛けてもバイト数にはならないよね。

220:デフォルトの名無しさん
07/08/26 17:03:27
>>216
戻り値はキャラクタ数
1キャラクタは1バイト
よって戻り値はバイト数

ってことだね

221:デフォルトの名無しさん
07/08/26 17:05:29
それは数値の一致であって、意味の一致ではない。
あくまでも「1バイト文字」の「文字数」なのだから。

省略してもプログラムは意図した通りに動くが、
プログラムが動けば何だっていいというのは間違い。

222:デフォルトの名無しさん
07/08/26 17:15:13
仕様上キャラクタ=バイトです。
たまたま文字を意味するときだけ
わかりやすくキャラクタと表記します。
そのため、byte という型はありません。

だってさ。なるほどね。

223:デフォルトの名無しさん
07/08/26 17:19:42


224:デフォルトの名無しさん
07/08/26 18:17:13
>>221
1バイト文字の文字数がバイト数と等しいと見なすことの何がいけない。

225:デフォルトの名無しさん
07/08/26 18:25:17
プログラムのコードに現われない、暗黙の変換を行うから、いけない。


226:デフォルトの名無しさん
07/08/26 18:26:25
>>225
暗黙じゃないだろ・・・

227:デフォルトの名無しさん
07/08/26 18:34:00
>>225
こんな自明な事柄、変換じゃないだろ。

228:デフォルトの名無しさん
07/08/26 18:42:37
自明だからといって省略するのは、悪い癖だなぁ。

229:デフォルトの名無しさん
07/08/26 18:57:07
そもそも変換じゃないだろ。

230:201
07/08/26 19:23:37
>>213
>>214
これは知りませんでした。ご教授ありがとうございます。
たしかにsizeof(char)は常に1で、返すのはバイトサイズだからcharが
2バイトの環境ってあり得ないですね。
勘違いしてました。

>>215
ごめん。
俺の疑問は俺の誤解だったということで解決したから、次のネタはないの。。。
単発と言うことで許して。


231:デフォルトの名無しさん
07/08/27 01:09:02
お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。

いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。
strlenなんて使うか? ふつー。

232:デフォルトの名無しさん
07/08/27 01:14:17
最近はもうC自体あんまり使わない

233:デフォルトの名無しさん
07/08/27 01:23:27
>>231
話がループしてるからいくらでも伸びる気がする。
ところで、
「散在させる」ってのはどこから出てきた?
strlenを使わないなら何を使う?(あくまでCだとして)
sizeof(char)を省略すべきでない?


234:!= 231
07/08/27 01:25:34
ここでstrlen_sだなんて言ってみるテスト

235:デフォルトの名無しさん
07/08/27 01:28:31
>>231
くだらないからこそだろう

まさにこれこそが 「自転車置場の議論」 ってやつだな


236:デフォルトの名無しさん
07/08/27 01:35:19
>>233
マクロ、ライブラリ、クラスの中で使うのではなく、
ベタベタと書くコードの中で使う = 散在させる

ぶっちゃけ、適切に局在化されていれば、
多少マズいコードだろうと直せるので、
このスレで話しているようなことは、
どーでもよくなるんですよ。



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

5372日前に更新/137 KB
担当:undef