[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 10:52 / Filesize : 232 KB / Number-of Response : 957
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 18



1 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:39:50 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 17
pc11.2ch.net/test/read.cgi/tech/1185286631/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 94代目
pc11.2ch.net/test/read.cgi/tech/1185452895/

809 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:13:25 ]
皆様すばやいレスありがとうございます。

>>804
C:\borland\bcc55\Includeの中にstdio.hはありました。
インストールはその入門書についてあるCDに収録されていた
freecommandlinetools2.exeというファイルを実行しました。

>>807
Pathは通したつもりでいます。
入門書に書かれてあることをそのまま行っただけなので間違いないとは言い切れませんが。

810 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:20:23 ]
C:\borland\bcc55\Bin に、
bcc32.cfg、ilink32.cfg はあるか?
テキストエディタで開いて、以下に設定されているか確認。無ければ以下のをそれぞれ保存

・bcc32.cfg
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"

・ilink32.cfg
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"

811 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:22:48 ]
結局、インクルードパスか、、、cfgが確実だな

812 名前:803 mailto:sage [2007/09/14(金) 15:36:19 ]
>>810
bcc32.cfg、ilink32.cfg はC:\borland\bcc55\Binにあります。
bcc32.cfg、ilink32.cfg ともに;c:\Borland\Bcc55\lib\PSDK"の部分はありませんでした。
そこで;c:\Borland\Bcc55\lib\PSDK" を追加してみましたがやはりエラーでした。


813 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:36:28 ]
>>807 >>808
知ったかぶるなら黙ってろ。お前らの頭じゃPATHの意味すらわかってなさそうだから。

814 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:39:02 ]
>>812
面倒くさいんでこれ使っちゃいな
ttp://www.vector.co.jp/soft/dl/win95/prog/se141451.html

815 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:41:25 ]
>>812
どうしても嫌ならこれで
ttp://www.enri.go.jp/~fks442/K_MUSEN/bcc.htm

816 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:43:39 ]
>>807
カレントディレクトリをコンパイラのある場所に移動すりゃ良いんじゃね?
エラーメッセージから推測できるのは、必要なファイルのある場所の
設定がされていないということ。つまり、そういうことだ。
PATHが必要なものに設定されていればどうなるか、分かるよね?

817 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:43:57 ]
>>813
おまえ、名指しで何か言うなら知ったかしないほうがいいぞ
PATHの意味を言ってみ?



818 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:44:54 ]
>>816
>C:\cwork>bcc32 sample.c
>Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

この2つからPATHが通っているのは明白

819 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:46:34 ]
>>817
味方にボールを送る事に決まってんだろうが

820 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:53:56 ]
それはPASS

821 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 15:56:07 ]
>>819
アホか
ヤマハの電動アシスト自転車の事だろ

822 名前:803 mailto:sage [2007/09/14(金) 15:57:16 ]
>>814-815
ありがとうございます。
試してみようと思います。

>>816
ソースファイルを作成したc:\cworkというディレクトリに移動しているのですが、こういうことでしょうか? 

823 名前:803 mailto:sage [2007/09/14(金) 16:10:52 ]
>>814様のソフトをダウンロードして自動設定したら解決できました。
皆様お忙しいところくだらない質問に時間を割いていただき本当にありがとうございました。


824 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 16:13:02 ]
結局、原因はなんだったんだろうな

825 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 16:19:23 ]
どういたしまして
がんばって

826 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 16:21:01 ]
cfgのタイプミスだろうなあ・・・

827 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 16:36:51 ]
>>821の言っている事がわからない



828 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 16:41:00 ]
知らないならレスしなくていいよ
つーか知っててもスルーしてるが

829 名前:デフォルトの名無しさん [2007/09/14(金) 18:49:34 ]
FFFFFF80を2進数に直すと、どうして
11111111 11111111 11111111 1000000になるのかわかりません
特に、80は 0101000では?

830 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 18:51:39 ]
>>829
(0101)2 → (5)10

831 名前:デフォルトの名無しさん [2007/09/14(金) 18:56:10 ]
レス、ありがとうございます
???
間違っているのですか?

832 名前:デフォルトの名無しさん [2007/09/14(金) 18:56:41 ]
16進の80
2進だと1000000
10進の80と誤解してると思われ

833 名前:デフォルトの名無しさん [2007/09/14(金) 18:59:02 ]
0一個たんなかった

834 名前:デフォルトの名無しさん [2007/09/14(金) 19:02:19 ]
>>832
ん〜どうしてもわかりません

では、2進数の80では、0101000で合っていて
16進数の80では、どうして1000000になるのでしょうか?

835 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:10:41 ]
2進数の80なんかあるか。2進数は1と0だけ。

836 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:12:30 ]
(x)y を y進法で表すxとする

(80)10 = (0101000)2
(80)16 = (128)10 = (10000000)2

837 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:13:01 ]
16進数の80 = 10進数の128 = 2進数の10000000

16進数の50 = 10進数の80 = 2進数の10100000



838 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:16:47 ]
>>836 >>837
計算違くね
(80)10 = (0101 0000)2

839 名前:837 mailto:sage [2007/09/14(金) 19:18:05 ]
うぁ。みすorz

840 名前:829 [2007/09/14(金) 19:23:39 ]
皆さん、レスありがとうございます。

>>16進数の80 = 10進数の128 = 2進数の10000000

   16進数の50 = 10進数の80 = 2進数の10100000

では、一旦10進数に置き換えてから、2進ぬするのでしょうか?
どうやれば、16進数の80は10進数の128に、又は16進数の50は10進数の80に
直せるのでしょうか?

841 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:31:21 ]
>>840
ググれば解説しているサイトはたくさんある

842 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:32:12 ]
>>840
16進から2進の場合、は分割するんよ

FFFFFF80
F=1111 , 8 = 1000 , 0=0
あとはくっつける

1111 1111 1111 1111 1111 1111 1000 0000

FFFFFF80(16)=11111111111111111111111110000000(2)
って感じ

843 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:34:44 ]
>>840
失礼、ちょっと訂正

FFFFFF80
F(16)=1111(2) , 8(16)=1000(2) , 0(16)=0000(2)  ね

10進に直すより16進→2進 、2進→16進の方が楽(のはず)

844 名前:デフォルトの名無しさん [2007/09/14(金) 19:42:23 ]
さすがにゆとり教育杉な気もしてきた

845 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:44:21 ]
C言語がいいらしいんですが無料でできますか?

846 名前:デフォルトの名無しさん [2007/09/14(金) 19:46:33 ]
はい

847 名前:デフォルトの名無しさん [2007/09/14(金) 20:11:41 ]
ありがとうございましm(__)m
これで先に進めます



848 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 20:49:08 ]
>>840の解説に同意。

16って2^4(二の四乗)の事ですよね。
つまり、2進数表現4ビットの最大値(1111)
が、16進数Fに相当している事もわかりますよね。

したがって、>>840の解説を御借りすると、

FFFFFF80
F=1111 , 8 = 1000 , 0=0

【|】(パイプ)で区切ると

1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1000 | 0000 (2)
F F F F F F 8 0 (10)

となります。

849 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 20:50:17 ]
>>840じゃなくて、>>842でした。

850 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:59:14 ]
C言語なんですが、ファイルに書き込むときって自分でEOF書き込むんですか??
それとも、閉じるときに勝手にやってくれるんでしょうか。

851 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:03:47 ]
>>850
閉じるときに勝手にやってくれる。
つか、EOFというデータはないんだけど。
ファイルの最後まで読んだときfreadなどのファイル入出力関数がEOFを返すだけ。

852 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:24:22 ]
あ、そうなんですか!
てっきり、改行コードみたいにEOFっていう記号があるのかと思いました。。。

853 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:37:45 ]
URL

854 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:59:28 ]
>>796 >>797
超ありがとうございます。
勉強します。


855 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:25:48 ]
>>852
EOF=1A じゃなかったかな。昔のテキストファイルには使っていたと聞くよ。

856 名前:852 mailto:sage [2007/09/15(土) 00:40:18 ]
>>855
MS-DOSのテキストファイルにはEOF(1Ah)が書かれていたようですね。

EOF(1Ah)がファイル内に実際にデータとして書かれているものと書かれていないもの
さらに、書かれているもののうちアプリケーションがこのEOF(1Ah)をデータとして
意識すべきものと意識しなくてよいもの

があるようですね。

ファイルのデータをレングスで管理しているファイルシステムはEOFがなくて、
このレングスがないファイルシステムにはEOFがデータとしてある。

ということでしょうか。

857 名前:852 mailto:sage [2007/09/15(土) 00:45:30 ]
ということで>>850さん

EOFをアプリケーションで書き出す必要があるかないかは、
「ファイルの仕様による」ということです。

Windowsのハードディスクのファイルは書き出す必要はありません。



858 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:51:53 ]
>>852、855
ありがとうございます〜 むっちゃわかりやすかったっす。


859 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 01:47:18 ]
CのライブラリのEOFとアプリが使う終了のマークを一緒にしたらだめでしょ。

860 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:08:55 ]
>>817
お前とかうぜーよ、偉そうに。英語すら理解していないだろ。
ttp://dictionary.goo.ne.jp/search.php?MT=path&kind=ej&mode=0&base=1&row=0
必要なデータやプログラムのある場所へPATHを通しておくことで
どこのディレクトリからでも扱えるようにできるようになることくらい知っているだろ。
っつかお前、DOSとかその他そういった仕組みを持ったシステムを使ったことないだろ?

861 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:12:21 ]
>>857
>Windowsのハードディスクのファイルは書き出す必要はありません。
判っていないのならレスしなくてもよろしいのでは?

862 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:13:29 ]
どうやらPATHの意味をそれぞれ勝手に解釈している同士が罵り合っている模様。
仲のいいことで。

863 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:17:01 ]
>>861
そういうレスはいけないと思うよ。

間違っているを指摘すべきだと思う。

864 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:41:12 ]
猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ
ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
char *strではなくchar str[32]なら可とのこと
なぜでしょうか?
もうひとつ
下記のプログラムでprintf("%sの長さは%dです\n",*str,len);
のように%sに対して*strとすると実行時にエラーになりますが
*strなら中身のASCIIコードが入っているはずで問題ないと思うのですが…
ご教示願います。

#include <stdio.h>
#include <string.h>

int main()
{
char *str;
size_t len;

printf("文字列を入力してください。--");
scanf("%s", str);

len = strlen(str);

printf("%sの長さは%dです\n",str,len);

return 0;
}

865 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:41:52 ]
>>864
%s→%c

866 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:43:37 ]
char str[32]でも不可です

867 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:48:22 ]
>>864
> 猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ
> ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
> char *strではなくchar str[32]なら可とのこと
問題が無かったのは str の指す先が*偶然*致命的な場所で無かっただけで
予期しない場所が書き換えられています
str が指す先がちゃんと確保されている場合には問題は無いです



868 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 03:05:22 ]
>>864
その本には、なぜダメかってのは書いてないのか。

869 名前:デフォルトの名無しさん [2007/09/15(土) 04:39:20 ]
scanfとprintfの関数の違いと働きを教えてください。お願いします。

870 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 04:41:45 ]
ja.wikipedia.org/wiki/Scanf
ja.wikipedia.org/wiki/Printf

871 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 04:48:43 ]
>>869
scanf - scan with format
printf - print with format

872 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:13:04 ]
さすが猫ですね

873 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 00:32:08 ]
データが1個増えるたびにreallocしてることが発覚しましたw
バカすぎますか?

874 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 00:34:36 ]
はい

875 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 00:34:40 ]
データが増える間隔とデータ量による

876 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 00:38:15 ]
>>873
実装が楽なので使い捨てコードのときにはそうします

877 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 00:42:30 ]
>>873
一個ごとでも、まったくOK。
データの複数個ずつぶんのメモリを確保しても、ほとんどの場合は、
スピードアップしません。



878 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 00:48:01 ]
vectorとかでも中では一回ごとにrealloc的なことしてるんだっけ?

879 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 01:24:37 ]
>>878
ここは C のスレですぜ
> vector
ってなに?


880 名前:デフォルトの名無しさん [2007/09/16(日) 01:34:48 ]
ここは東京だぜ

881 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 02:19:19 ]
読み込んだ数式を逆ポーランド記法に変換しようとしてるんですが、
1+(3+(4-2)+1)*4
のようにすると、1342-+1+4*-という式になってしまいます。

else if(source[i] == ')'){
while( now > 0 && stack[now -1] != '('){
rpn[r++] = stack[--now];
}
--now;
}

原因がわかりません。教えてください。
できれば解決策もm(_ _)m

882 名前:864 mailto:sage [2007/09/16(日) 02:45:34 ]
レスありがとうございます

>>865
確かに%cとすると一文字だけですが表示されます
JavaをかじってたこともあってString型がCにもあると思い込み,いわゆる文字列がポインタであることを理解していませんでした
pritf("%d",i);のようにカンマの後には変数名を書けばよいと思っていましたが
%sの場合は例外でポインタを書かないといけないのですね
確かにそうすると表記上はすべて変数名のように見えて綺麗ですから、そのためにそのような設計になったのでしょうか…


>>866
31文字以上は入力しないという前提でも不可なのでしょうか?

>>867
char *str ではポインタ(アドレス変数)が確保されただけでその中身については未定義で
さらに、その中身のアドレスの後ろが他のことに使われていないという保証もないから不可で
char str[32]なら31文字分については安全な場所が確保されるからOKという理解で正しいでしょうか

>>869
本文をそのまま引用すると
『strはchar型へのポインタですね。ということはアドレスを格納する変数なのです。これではだめですね。』
とのことです。
しかし、scanfやstrlenについては、渡すべきものはアドレスであり間違えているようには考えられず
printfについても%sにはポインタを渡すのであっているようなので理由が私にはわかりませんでした。

883 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 03:18:00 ]
適当な本だな

884 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 03:34:24 ]
渡すべきものはアドレスだが、その渡しているアドレスの値が適切なのかどうかということだ。
scanfは、渡されたアドレスが示すメモリ領域を書き換えるのだから、適当なアドレスを渡してはいけない。
特に、初期化してないポインタ (どのアドレスを指してるか不定) を渡すなんて、もってのほか。
書き換えられても安全な領域 (char[32]とか) を用意して、そのアドレスを渡す必要がある。

885 名前:881 mailto:sage [2007/09/16(日) 04:01:59 ]
すみません自己解決しましたm(_ _)m

886 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 04:12:05 ]
1+(3+(4-2)+1)*4 は逆ポーランド記法で
4 2 - 3 + 1 + 4 * 1 + で合ってますか?

887 名前:デフォルトの名無しさん [2007/09/16(日) 04:22:14 ]
車輪の再開発は止めましょう

その程度の計算なら電卓でできます。
暗算でもできるでしょ?

作る意味無いよ



888 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 04:28:51 ]
            ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ <こいつ最高にアホ
 彡、   |∪|  /
/ __  ヽノ /
(___)   /

889 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 04:58:38 ]
   ∩___∩
   | ノ      ヽ !
  /  ●   ● |   こいつも最高にアホ
  |    ( _●_)  ミ
 彡、   |∪|   / .\
/ __  ヽノ / \ ...\
(___)   /   .│ ..│
            /  ヽ
            l..lUUU
            .U

890 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 05:19:03 ]
そんな餌に俺様が釣られクマーー

891 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 06:42:36 ]
>>886
1342-+1+4*+ かな。

892 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 08:17:49 ]
>>886
適当に作ってみた。
やっぱり 1342-+1+4*+ になる。
sund1.sakura.ne.jp/uploader/source/up11687.c

893 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 09:03:32 ]
>>886
1+(2+3) と 2+3+1 が同じだというならそれでも合ってる

894 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:10:01 ]
>>873-879
おれの居る現場の既存のコードでは、
最終的に300〜400MBのメモリを確保するのに、reallocを繰り返して、
延べ 2.5GBぶんコピーを繰り返している事が分かったよ。

DBのテーブルのデータを一度メモリーに全部取り出すんだ...orz


895 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:12:34 ]
>>894
それだとDBの意味ががが
元からなさそうな感じではあるけど

896 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:32:44 ]
realloc()を使うと、毎回確保し直すと思っている馬鹿が多いのか?
自分でわざわざ回数まとめてからrealloc()するようなコード書くより、
毎回realloc()する方が速いかもしれないぞw

897 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:39:00 ]
そんな当たり前の事言われても。



898 名前:894 mailto:sage [2007/09/16(日) 13:03:07 ]
>>895
まあ100%無意味って訳じゃないんだけどね。一応SQLの恩恵は受けているから。
でもバッチ系が全部、「始めてプログラムを組んだんじゃないか?」ってレベルなんだ。
>>894のコードも基本的に集計するだけだから、DBの設計さえ良ければ単純なSQLで済むはずなのになー。

ハッ、ここは愚痴スレじゃなかったなスマソ。

899 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 13:10:10 ]
気づいたんなら送信するな

900 名前:894 mailto:sage [2007/09/16(日) 13:16:21 ]
>>896
その話は聞いたことあるが、そういうレベルじゃない。
reallocその物を使わないで済ませられるような場面でやってるだよ。



901 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:00:29 ]
realloc()って新たに確保した場所にそれ以前のものをコピーするんじゃなかったっけ?
毎回やっているかは知らんが

902 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:06:55 ]
>>901
元の領域に連続した領域を確保できれば、単純な拡張でよいので、
コピーは省略出来る。

903 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:09:04 ]
>>901
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
void *ptr=NULL, *new_ptr;
int i, count=0;

for(i=1;i<=1000;i++){
new_ptr=realloc(ptr, i*100);
if(ptr!=new_ptr){
fprintf(stderr, "pointer changed. [%d]\n", i);
ptr=new_ptr;
count++;
}
}
printf("change count : %d\n", count);
free(ptr);
return 0;
}

904 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:10:12 ]
巨大な配列を宣言時に同じ値で初期化したいんですけどこういう場合に簡略化する書き方とかないですかね
void func()
{
static int array[3000] = { 0, .. ,0};
}

的な…


905 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:20:31 ]
{0}
っていうかstaticって自動的に0で初期化されなかったっけ?

906 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:33:31 ]
サンクス。うまくいきますた。

907 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:43:25 ]
グローバル変数、静的変数は宣言時に全ての要素が 0 で初期化される。
ローカルな配列は、宣言時に1つ(1要素)でも初期化を行うと残りが全て 0 で初期化される。

int a[3000]; // a[0]〜a[2999] まで全て 0
int b[3000] = {1, 2, 3}; // b[0]=1, b[1]=2, b[2]=3, b[3]〜b[2999]=0
int c[3000] = {1}; // c[0]=1, c[1]〜c[2999]=0
main(){
int d[3000]; // d[0]〜d[2999] まで全て不定値(適当な値)
static int e[3000]; // a と同じ
int f[3000] = {1, 2}; // bとかcと同じ
}

よく、ローカルな配列を 0 で初期化するために array[256] = {0}; とか書くが、
1要素でも初期化すると残りが 0 で初期化されることを利用しているだけ。
array[256] = {1}; と書いて全ての要素が 1 で初期化されると誤解するやつが多い。

任意の値で初期化させたければ、n次元の配列はn重のループを普通に書く。
C++ならalgorithmのfillなんかを使えばいい。




908 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 20:37:21 ]
>>904
staticなら自動的に0で初期化される。
関数内staticにするなら、他の値は難しいな。
呼び出しの都度初期化でいいならmemsetとかでも良いだろうけど。



909 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 20:39:25 ]
複数ファイルにソースを書くときのお作法を知りたいんだけど、わかりやすいところないかな






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<232KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef