目次

ニュース

日記カテゴリ

書庫

ふと基本情報技術者くらい受けておくかぁ、と思いむたぐちさんPowerShell本と共に基本情報技術者の本を買いましたとさ。

で、アルゴリズムのページなんか見ているとちょっと書きたくなってCコンパイラを用意w

とりあえずソートでも書いてみるかぁ、なんて書き始めたんですがいやぁ普段.Netだと書けない書けないw

「配の長さって・・・、え?w」みたいな感じです。

結局は分かりましたけどね。

sizeof(配列) / sizeof(配列[0])

と、ここで更につまづく。
コマンドライン引数で取って来たもの、もしくはexternを付けたりすると長さが取れない!ということにwikipediaをみて気づく。

それで分かりました。int argcを取るコマンドライン引数で取る理由が。
それ以外で配列長を求められなかったのね。
投稿日時 : 2008年5月20日 16:08
Feedback
  • # re: [C言語] 配列の長さを求める
    めたぼ なら
    Posted @ 2008/05/20 16:15
    > sizeof(配列) / sizeof(配列[0])
    これって確か処理系依存だったような...
    # 昔えムナウさんが似たようなことをどっかで書いてたような。

    なので、配列のサイズはconstとかで固定しときましょうってのが良いんぢゃなかろうかと...
  • # re: [C言語] 配列の長さを求める
    シャノン
    Posted @ 2008/05/20 16:34
    JIS X 3010にも、sizeof の使い方として、配列の要素数を求めるのは書いてありますけどね。
  • # re: [C言語] 配列の長さを求める
    ma2
    Posted @ 2008/05/20 16:54
    mallocで動的に確保したものも求められませんよね。
    昔聞かれて解決できなかった思い出が。
  • # re: [C言語] 配列の長さを求める
    taka
    Posted @ 2008/05/20 17:07
    > めたぼさん
    > なので、配列のサイズはconstとかで固定しときましょうってのが良いんぢゃなかろうかと...
    以前Pro*Cやりましたけどそのときもそんなことしてましたねー。

    > シャノンさん
    > JIS X 3010にも、sizeof の使い方として、配列の要素数を求めるのは書いてありますけどね。
    やっぱ定石なんかな。

    >ma2さん
    そうそう、それも出来ないですね。
    つまりコンパイル時に決まらんとダメっぽい。
    #つかコンパイル時に測値になるから当たり前か。
    #wikipeida調べ
  • # re: [C言語] 配列の長さを求める
    めたぼ なら
    Posted @ 2008/05/20 17:44
    > JIS X 3010にも、sizeof の使い方として、配列の要素数を求めるのは書いてありますけどね。
    そなんや。
    ぢゃ、いいのかな。

    で、えムナウさんの記事見っけ。
    http://blogs.wankuma.com/mnow/archive/2007/02/17/62748.aspx

    これって、悪影響ないんかなぁ。
    # 普通の配列なら大丈夫か。
  • # re: [C言語] 配列の長さを求める
    taka
    Posted @ 2008/05/20 17:57
    あぁ、そうそうポインタを渡すとポインタのサイズが変える。
    例えばsizeof(char*)、で32bitだと4で、16bitだと2。
    文字列配列の配列長ならそのままいけるけど、文字列長だとターミネータ来るまで走査しないとだめっぽいのね。
    #いや、本当にそうか?w試してないから分かりまへん(?-?)
  • # re: [C言語] 配列の長さを求める
    とっちゃん
    Posted @ 2008/05/20 18:20
    TCHAR[] a="123\0567";
    sizeof(a) としてみると、文字列長と配列の長さの違いがわかります。

    もちろん、_tcslen(a); との比較もしないとだめですがw
  • # re: [C言語] 配列の長さを求める
    出水
    Posted @ 2008/05/20 18:46
    char a[] = "test";
    えムナウさんの時代はこの書き方が出来なかったんじゃないかなぁと推測

    ちなみに、昔のC++はdelete[]に引数が必要だったんですよ
    char *a = new char[100];
    delete [100] a;

    で、今は引数いらないから長さを隠し持っているわけですが、
    隠し持ってるなら教えてくれてもいいよねってepiさんに聞いたら
    確保と開放に必要な情報と長さ情報は違う、ってな事を言われたような気がします

    で…考えた結果…
    ・1kBのバッファと空き容量とカウンタを確保
    ・newのたびにカウンタ++,deleteでカウンタ--
    ・カウンタが0になったときのみバッファ全体を開放済みとして扱う
    みたいな管理だと、個々の長さ情報はわからないですのでこういうことじゃないかなーとか
  • # re: [C言語] 配列の長さを求める
    taka
    Posted @ 2008/05/20 18:57
    > とっちゃん
    TChar[]って事はマルチバイト?
    あと、_tcslen()に関しては全く分かりません。
    見た感じ、文字列長を返しそうな感じですが。

    > 出水さん
    C++は書いたことないからいまいちピンとこないですねー
    特に
    > で・・・考えた結果・・・
    のくだりのところ。
  • # re: [C言語] 配列の長さを求める
    めたぼ なら
    Posted @ 2008/05/20 19:02
    > char a[] = "test";
    これは初版のK&Rでも書けてたよ。

    # なんかごめん、私のコメントきっかけで脱線させちゃった。
  • # re: [C言語] 配列の長さを求める
    taka
    Posted @ 2008/05/20 19:03
    > めたぼさん
    別にかまへんですよー
    こんな流れで余分な知識が蓄積されるのですw
    #そして必要なときは余分な知識でなくなる
  • # re: [C言語] 配列の長さを求める
    とっちゃん
    Posted @ 2008/05/20 19:09
    TCHAR は、UNICODE だと wchar_t、 SBCS/MBCS だと char になる、#define です。
    _tcslen は strlen の TCHAR 版です。

    これから先、Windows 系で C/C++ をやるならまず最初に把握しておくべきところですね。
    Unix 系はどういう扱いになってるか知らんですがw
  • # re: [C言語] 配列の長さを求める
    出水
    Posted @ 2008/05/20 21:35
    >めたぼさん
    char a[] = "test";
    sizeof("test"); → sizeof(char*);
    この二つが両立しているコンパイラはあるんですかね?って意味です
    素人考えだと、"test"がchar[5]を返すから配列サイズが確定するんだと思ったんですが…
  • # re: [C言語] 配列の長さを求める
    めたぼ なら
    Posted @ 2008/05/20 22:01
    出水さん
    > この二つが両立しているコンパイラはあるんですかね?って意味です

    それって、えムナウさんの記事と同じ話?
    それとも、またわたし迷子になっちゃった?

    > 素人考えだと、"test"がchar[5]を返すから配列サイズが確定するんだと思ったんですが…

    それでOKだと思います。
    char[5]って、charのサイズ×5って意味であれば。

    # ごめんよぉ~。>みなさま。私が惑わすようなコメントをしたばっかりに。
    # takaさんの記事はそれ単体でOKで、私が脱線させちゃいました。
  • # re: [C言語] 配列の長さを求める
    とっちゃん
    Posted @ 2008/05/20 22:17
    あ、今気付いた...
    TCHAR a[] = "..."; じゃなくて
    TCHAR a[] = TEXT("...");

    TCHAR a[] = _T("...");
    じゃないとダメっす。<最初のコメント

    と、KYなことを書いてみるw
タイトル  
名前  
Url
コメント   

Blog 利用状況