C言語なら俺に聞け(入門編)Part 65

このエントリーをはてなブックマークに追加
601デフォルトの名無しさん
よくわからんで設計したら、フローとかあってもなくて同じでしょ。(ハマるだけ)
602デフォルトの名無しさん:2010/06/06(日) 03:38:45
処理単位じゃなくてデータ単位で書くほうがよかろ
603デフォルトの名無しさん:2010/06/06(日) 03:39:23
>>596
UnixとかのOSもいきなりコーディングから始めたの?だとしたらすごいよな。
「ポインタが理解できない理由」という本にUnixの疑似プログラムが記載されていたけど
みてて複雑に絡み合っててすぐには理解できなかった。
あれを設計なしにコーディングして途中で修正加えて完成させたってのか・・。
604デフォルトの名無しさん:2010/06/06(日) 04:07:02
だれも設計しないなんて言ってないよ
完璧な設計をいつまで作ってなかなかコーディングし始めない人を批判してるんだよ
605デフォルトの名無しさん:2010/06/06(日) 05:14:24
設計がおかしいとコードを書けなくなることがある
606デフォルトの名無しさん:2010/06/06(日) 06:13:55
で?
607デフォルトの名無しさん:2010/06/06(日) 06:40:11
最近「で?」とだけレスするの流行ってるの?
608デフォルトの名無しさん:2010/06/06(日) 06:52:42
ここまで1セットです。
609デフォルトの名無しさん:2010/06/06(日) 07:35:01
バランスですよ、バランス。
いきなりコードを書くのは良くないが、いつまでも設計図を書いているのもよくない。
バランス感覚を養うただ一つの方法は経験を積むことです。
610デフォルトの名無しさん:2010/06/06(日) 14:00:05
テキストのデータを配列に格納するにはどのようにすればできますか?

file.txtのデータが
0.1
-0.5
0.32
0.65
0.76
-0.45

となっていて、それを配列w[100]に順番に格納していきたいです
よろしくお願いします
611デフォルトの名無しさん:2010/06/06(日) 14:11:25
FILE* file = fopen( "data.txt", "r" );
char buf[ 256 ];
double w[ 100 ];
int i = 0;
while( fgets( buf, 256, file ) != NULL )
{
  w[ i ] = atof( buf );
  i ++;
}
fclose( file );
612デフォルトの名無しさん:2010/06/06(日) 14:14:58
>>611
どうもありがとうございます
613610:2010/06/06(日) 14:23:52
もうひとつお願いします
double w[ 100 ]={ 0.1 , 0.5 , 0.32 ,0.65 , 0.76 , -0.45 , ・・・};
の配列をtxtファイルに1行づつ書き込んでいくにはどうすればいいですか?
なんどもすみません

614デフォルトの名無しさん:2010/06/06(日) 14:32:45
FILE* file = fopen( "data.txt", "w" );
char buf[ 256 ];
double w[ 100 ] = { 0.1 , 0.5 , 0.32 ,0.65 , 0.76 , -0.45 };
for( int i = 0; i < 10; i ++ )
{
  sprintf( buf, "%f\n", w[ i ] );
  fputs( buf, file );
}
fclose( file );
615デフォルトの名無しさん:2010/06/06(日) 14:57:15
>>614
ありがとうございました
うまくいきました
616デフォルトの名無しさん:2010/06/06(日) 20:49:09
staticのことで単刀直入に質問しますが
main関数内で変数を宣言するとき、頭にstaticつけようがつけまいが結果は変わりませんよね?
617デフォルトの名無しさん:2010/06/06(日) 20:50:38
いいえ
618デフォルトの名無しさん:2010/06/06(日) 20:50:57
思い切り変わります。
619デフォルトの名無しさん:2010/06/06(日) 20:52:06
>>616
static だと
初期化される
ヒープに確保される

なので結果が変わる事もあります
620デフォルトの名無しさん:2010/06/06(日) 20:58:48
621616:2010/06/06(日) 21:04:07
ヒープ領域に確保されるんですか。勉強になりました。

変数の寿命という点では同じですよね?
622デフォルトの名無しさん:2010/06/06(日) 21:05:26
んなわけねー
623デフォルトの名無しさん:2010/06/06(日) 21:06:39
staticなローカル変数なんか使っちゃイカン
624デフォルトの名無しさん:2010/06/06(日) 21:06:53
main後もプログラムは動くんだぜ
625デフォルトの名無しさん:2010/06/06(日) 21:07:45
>>619
ヒープに確保されるわけねーだろw
626デフォルトの名無しさん:2010/06/06(日) 21:18:49
メイン関数内の変数をstaticにする利点がわからない
627デフォルトの名無しさん:2010/06/06(日) 21:22:33
>>626
大きな配列を用意する時とか
628デフォルトの名無しさん:2010/06/06(日) 21:23:33
>>625
じゃあスタックに確保されるの?
629デフォルトの名無しさん:2010/06/06(日) 21:24:24
>>628
ヒープとスタックしか知らんのか
630デフォルトの名無しさん:2010/06/06(日) 21:41:09
>>629
あとはレジスタくらいしか知らない
631616:2010/06/06(日) 21:42:10
>>627
main関数内で、大きな配列を扱うときにstatic入れるのは
自動で0初期化するためですか?
632デフォルトの名無しさん:2010/06/06(日) 21:45:07
>>627
ヒープ使え、ヒープ
staticだとメモリ足らなかったら起動できずに
OSがエラーメッセージ吐くぞ
ヒープ使ってたら自分でメッセージ出せる
633デフォルトの名無しさん:2010/06/06(日) 21:47:03
>>630
レジスタ知ってて.dataとか知らないのか
634デフォルトの名無しさん:2010/06/06(日) 22:03:24
>>631
callocでいいやん
635デフォルトの名無しさん:2010/06/06(日) 22:13:47
静的領域って起動時に自動的に確保されるヒープ領域みたいなもんだと
思ってたけど違うのか
636デフォルトの名無しさん:2010/06/06(日) 22:19:19
みたいなもんは等しいってわけじゃないから
637デフォルトの名無しさん:2010/06/06(日) 22:21:34
ヒープと表現すると不具合あるってこと?
638デフォルトの名無しさん:2010/06/06(日) 22:28:10
プログラムがメモリ上にロードされる時に
ヘッダ、命令、可変データ、不変データ、スタックを置くためのメモリが確保される
staticで確保されるメモリはこのうち可変データ(非const)と不変データ(const)だ
ヒープはそれとは別に確保される領域
639デフォルトの名無しさん:2010/06/06(日) 22:29:31
データ領域が2つに別れてるのは
もちろんメモリ保護のある状況だけだかんな
640デフォルトの名無しさん:2010/06/06(日) 22:39:24
プロテクトモードの由来だな。
641デフォルトの名無しさん:2010/06/06(日) 22:57:01
>>446
大学でそれってクレバーじゃないよ。もっともひどいやり方だよ。
642デフォルトの名無しさん:2010/06/06(日) 23:04:13
バークレーでいいよ。
643デフォルトの名無しさん:2010/06/06(日) 23:04:34
そいつに何言っても無駄w
644デフォルトの名無しさん:2010/06/06(日) 23:05:59
>>642
名門すぎんだろw
645デフォルトの名無しさん:2010/06/06(日) 23:16:17
>>632
そうできないOSもあるよ
646デフォルトの名無しさん:2010/06/06(日) 23:17:07
で?
647デフォルトの名無しさん:2010/06/06(日) 23:20:01
printf("で?\n");
648デフォルトの名無しさん:2010/06/06(日) 23:29:00
で?って流行ってるの云々
649デフォルトの名無しさん:2010/06/06(日) 23:29:43
組み込みならstatic使えばいいし
メモリ確保を遅延する環境はどうしようもない
650デフォルトの名無しさん:2010/06/06(日) 23:30:42
試した事ないから知らないんだけど
シグナルも飛ばずに即死するの? >遅延確保に失敗した場合
651デフォルトの名無しさん:2010/06/07(月) 00:29:26
>>648
で?
652デフォルトの名無しさん:2010/06/07(月) 00:31:52
面白くないぞ。話題について行けない中学生
653デフォルトの名無しさん:2010/06/07(月) 01:53:37
中学生がこんな幼稚なことするわけないだろw
654デフォルトの名無しさん:2010/06/07(月) 06:02:27
linuxでヒープ使い切ったらどうなるか試したことないや
少なくともmallocは0を返さないはずだよね
655デフォルトの名無しさん:2010/06/07(月) 11:36:26

FILE *f;
int c;
f = fopen("a.txt", "rb");
while ((c = fgetc(f)) != EOF) {
  printf("%X\n", c);
}

UTF8で”あ”と1文字だけ書かれたa.txtをバイナリモードで開いて
バイトコードを出力するプログラムを書いたんですが

E3
81
82
A

という結果になります。”あ”はUTF8でE38182なんでOKですが最後のAは謎です。
これはどっから来てるんでしょうか???
656デフォルトの名無しさん:2010/06/07(月) 11:44:15
>>655 \n
657デフォルトの名無しさん:2010/06/07(月) 11:51:59
>>656
ありがとうございます。改行でした。
実はa.txt内には直接改行は入ってないんですが、なんで改行出てきちゃうんでしょうか??
658デフォルトの名無しさん:2010/06/07(月) 11:54:47
vi で編集した?
659デフォルトの名無しさん:2010/06/07(月) 12:19:23
>>658
はいviです。
環境はMac snow leopardのMacVim7.2です。文字コードutf-8、改行コードはunix(LF)です。
660デフォルトの名無しさん:2010/06/07(月) 12:24:51
>>659
最後の行に改行を追加する旨警告メッセージが出なかった?
vi系は原則最後に改行文字を出力するから。
661デフォルトの名無しさん:2010/06/07(月) 12:35:27
vi は、わりと行指向のエディタです。

viで普通にファイルを作成すると、行の最後に改行文字がつきます。
ファイルが一行だけでも同じことで、改行文字が最後につきます。

ファイルの最後に改行文字がないようなファイルを編集すると、
保存時にファイルの最後に改行文字が付加されます。

662デフォルトの名無しさん:2010/06/07(月) 12:52:27
>>660-661
viが自動的に追加していたんですね。
ありがとうございます。本当に助かりました。
663デフォルトの名無しさん:2010/06/07(月) 17:10:04
>>650>>654
ディフォルトの設定のままだとNULLは返らない。
その場合、遅延確保に失敗したら即死する。
但し、確保しようとしたプロセスが死ぬとは限らない。
664デフォルトの名無しさん:2010/06/07(月) 18:10:35
>>>663
え、アドレス空間ぜんぶ空いてない場合でもNULLが返らないの?
665デフォルトの名無しさん:2010/06/07(月) 18:21:21
あー、流石にその場合はNULLだね。
666デフォルトの名無しさん:2010/06/07(月) 18:32:54
あ、そうなんだ。
じゃあ連続領域が確保できるかどうかについてはその時点で検証しないということ?
667デフォルトの名無しさん:2010/06/07(月) 19:35:22
標準入力で
abc123 de-50fg

みたいに入力してatoiで123と-50をintの配列に格納するときはどうすればいいでしょうか

上の文字列(abc...)の要素を先頭から順に見て(文字列のポインタを増やして)
数字が来たら(細かい分岐はとりあえず無視)atoiの引数にポインタ入れて整数にして格納ってできますか?
ちなみにポインタよくわかってないです
668デフォルトの名無しさん:2010/06/07(月) 20:03:38
すごい発見しました。staticをなんとポインタ変数の頭につけてみたんです。
static int *ip;→この時点でipはNULL初期化される。
669デフォルトの名無しさん:2010/06/07(月) 20:07:43
これはひどい釣り
670デフォルトの名無しさん:2010/06/07(月) 20:12:10
>>669
本当にNULL初期化されるから試してみなされ。
671デフォルトの名無しさん:2010/06/07(月) 20:12:46
このスレレベル落ちすぎだろ
672デフォルトの名無しさん:2010/06/07(月) 20:16:10
static付けるとbssに割り当てられるから、起動時に初期化されるだけ
673デフォルトの名無しさん:2010/06/07(月) 20:18:10
>>670
質問者にとっては珍しい出来事かもしれないが、回答者にとってはそれ当たり前なので、勘弁してください。
674デフォルトの名無しさん:2010/06/07(月) 20:18:41
>>672
bssってなんですか?
675デフォルトの名無しさん:2010/06/07(月) 20:24:25
676デフォルトの名無しさん:2010/06/07(月) 20:42:53
>>675
調べてきた
メモリにロードされたプログラムの中で、初期値のない静的変数が割り当てられるセグメントのこと。
block started by symbol の略。
でも0初期化されるから「初期値のない」じゃ説明がつかないな
677デフォルトの名無しさん:2010/06/07(月) 21:05:02
Cのスタートアップ処理がいい加減だと、bss領域とかが初期化されないこともある
678デフォルトの名無しさん:2010/06/07(月) 21:10:38
bssの処理をランタイムがやってる時点で糞アホだな
どこの組み込み系OSだよ
679デフォルトの名無しさん:2010/06/07(月) 21:18:35
昔、はまってた奴がいたんだよ
680デフォルトの名無しさん:2010/06/07(月) 21:35:46
>>667
strtol()してポインタが進んでいたらそれを格納してポインタを更新、そうでなければポインタを一つ進める
681デフォルトの名無しさん:2010/06/07(月) 21:37:17
パソコンアプリみたいにお膳立てしてくれる環境ばかりじゃないんだよ
682デフォルトの名無しさん:2010/06/07(月) 21:41:18
なんで組み込み屋って偉そうなの?
683デフォルトの名無しさん:2010/06/07(月) 21:42:02
ちゃちなプライドにしがみ付いていないと溺れっちまうからさ
684デフォルトの名無しさん:2010/06/07(月) 21:44:25
規格違反の処理系を使わなければいけない可哀想な人なんだから優しくしてあげなよ
685デフォルトの名無しさん:2010/06/07(月) 22:07:07
規格違反?
686デフォルトの名無しさん:2010/06/07(月) 22:08:18
携帯開発で病んでしまったんだろう
687デフォルトの名無しさん:2010/06/07(月) 23:10:41
>>685
どういう意図で疑問形にしたの?
なんか胡散臭いレスだな。
688デフォルトの名無しさん:2010/06/07(月) 23:16:15
胡散臭くてごめんくさい
689デフォルトの名無しさん:2010/06/07(月) 23:41:25
質問ですが、#include<stdio.h>の次のint main(void)ってありますよね?
このmainは何を表してるんですか?intは関数の型ですよね?voidは引数の
型は何でもいいってことですよね?mainとは何ですか?ここ適当にmanyとか
にしていいんですか?全く分からないのですが・・
690デフォルトの名無しさん:2010/06/07(月) 23:42:32
入門書とか読まずにやっているのか?
691デフォルトの名無しさん:2010/06/07(月) 23:45:20
>>689
voidは何も無しってこと。何でもいいんじゃなくて、何も無し。
mainとはエントリポイントに指定されている関数。そこからプログラムが始まる。
692デフォルトの名無しさん:2010/06/08(火) 00:10:12
>>691
いろいろなソース見てみると
int XXXXX()のXXXXの部分はmainばかりじゃないんですが
この場所は勝手に自分で作ったらいけないんですか?
あとmainだとどういう特性があるんですか?
>>690
入門書は分かりにくい、挫折した。
693デフォルトの名無しさん:2010/06/08(火) 00:13:17
関数は自分で作って良いけど…説明するのメンドイわ
じゃあ、#include<stdio.h>って言ってるけど、これが何か分かってるわけ?
分からなくて良いからとりあえずそんなもんだと思って進め。あとで分かる
694デフォルトの名無しさん:2010/06/08(火) 00:13:58
なんの本も無しにどうやって勉強するんだよ。
695デフォルトの名無しさん:2010/06/08(火) 00:15:25
つーか何を見てるんだろう
何も読んでないのにmain出てくる訳ないし
696デフォルトの名無しさん:2010/06/08(火) 00:16:00
まずは、仕様を読めと
タダで読めるんだし一読しとけ?
697デフォルトの名無しさん:2010/06/08(火) 00:16:52
入門サイトくらい見て全て理解して質問しろよ
698デフォルトの名無しさん:2010/06/08(火) 00:19:44
スレのレベルが落ちすぎ
699デフォルトの名無しさん:2010/06/08(火) 00:23:08
初心者にいきなり仕様書読めとかいう馬鹿がいるのかよ
700デフォルトの名無しさん:2010/06/08(火) 00:25:10
>>692
> いろいろなソース見てみると
> int XXXXX()のXXXXの部分はmainばかりじゃないんですが
> この場所は勝手に自分で作ったらいけないんですか?

自分で勝手に作ってもいいよ。実際に「int XXXXX()」でもいい。

> あとmainだとどういう特性があるんですか?

>>691に書いてあるけど、そこからプログラムが始まる(プログラム開始時にmain()が呼び出される)という特性がある。