【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131

このエントリーをはてなブックマークに追加
585デフォルトの名無しさん
ファイルサイズの取得方法って、「ftell」を使用するのが常道なんでしょうか。

Cでファイルサイズを取得する場合、自分は「fgetpos」を使用すのかなーと漠然と考えていて【B】のようなソースを考えていたんですが、
>>402がファイルサイズの取得方法として「ftell」を利用してるとのことだったので、【A】のようなソースも考えてみました。
やはりAのほうがよいのでしょうか。。。

========================
【A】
========================
long size = 0L;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  size = ftell( fp );
  if (size == -1L ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* sizeの値がhogehoge.jpegのファイルサイズ */
586585:2007/06/22(金) 04:01:52
で、Bです。
========================
【B】
========================
fpos_t *pos;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  if ( fgetpos( fp, &pos ) != 0 ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* posの値がhogehoge.jpegのファイルサイズ */
/* fpos_tってキャストできそうだからサイズの値が取れると思ったのですが。。。 */
========================
587デフォルトの名無しさん:2007/06/22(金) 04:02:02
環境依存の方法を使うのが普通じゃないかな。
588デフォルトの名無しさん:2007/06/22(金) 04:04:05
>>586
全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。
589デフォルトの名無しさん:2007/06/22(金) 04:14:58
fpos_tって別の変数にキャストしたりするとき困らない?

fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。
590デフォルトの名無しさん:2007/06/22(金) 04:19:29
横からすみません。

この>>585って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?
591デフォルトの名無しさん:2007/06/22(金) 05:16:26
標準Cでは2GBを超えるファイルのサイズを知る手段はないって結論になる。
fpos_tがキャスト可能であることは保障されていないことだし。

ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?
592デフォルトの名無しさん:2007/06/22(金) 06:19:36
>>587〜のみなさん、ありがとうございました(588さんご指摘ありがとうございます)。
ファイルのサイズが大きい場合のことまで頭が回っていませんでした。
標準Cでは難しそうですね。
stat等の機能を持つ関数使用が無難といったところでしょうか。
一応stat使用時のソースも考えてみましたが…

struct stat fInfo;
if ( stat( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}

あるいは・・・非 POSIX 標準 API インタフェースで(UX上で動作)

struct stat64 fInfo;
if ( stat64( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}







593デフォルトの名無しさん:2007/06/22(金) 07:49:47
相乗り質問ですいませんが
ファイルサイズ自体を知りたいのではなくて
ファイルサイズがある一定値を超えているか否かを判定したい場合も、
やはりstatなりftellなりでバイトサイズを一度取得してから
if文で判定するしかないですよね。

2GBだろうが3GBだろうが、とにかくある値を
超えてるか超えてないかだけわかればいいのですが。。。
594デフォルトの名無しさん:2007/06/22(金) 08:16:12
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて
エラーが出るかを拾うってのはどうだろう
やっぱ2GB超えちゃうとダメなのかな
595デフォルトの名無しさん:2007/06/22(金) 08:36:48
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、
stat64 なりで調べた方がいいと思うよ。
596デフォルトの名無しさん:2007/06/22(金) 08:45:05
ていうかPOSIX環境だと_FILE_OFFSET_BITS=64が無ければ
2G以上のサイズはのopen/fopen自体が失敗する。
Windows環境だとopenは出来るけど、seekが出来ない(シーケンシャルには読める)。
それぞれ、open64や_lseek64(bccには無い)を使う。
もちろん、_FILE_OFFSET_BITS=64なら、openだけでよい。

また、statも同様に、_FILE_OFFSET_BITS=64ならstatだけで良いが
それ以外はstat64等を使う。
597デフォルトの名無しさん:2007/06/22(金) 09:31:14
そもそもfseek()はエラーを返せない。
598デフォルトの名無しさん:2007/06/22(金) 09:54:27
stat構造体のst_sizeはoff_t型だから、……
long int型になるのかな、
そうするとlong int型に格納しきれないバイト数のファイルは
桁あふれするのかな? 0? 再現させてテストしたいが
環境が手元にないのだが。。。。。。
599デフォルトの名無しさん:2007/06/22(金) 10:00:42
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。
off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。
600デフォルトの名無しさん:2007/06/22(金) 10:07:58
あ、Windowsだとstatは失敗しないな。たぶん。
で、結果がどうなるかは処理系(ライブラリ)依存。
何故ならstatはエミュレーションしているので、
stat("c:/*", &st)が成功してしまったりする処理系があるから。
601デフォルトの名無しさん:2007/06/22(金) 11:44:19
ファイルサイズというのが何を意味するかによる。
OS上でのサイズのことなら、
そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。
Cの入出力関数で読んだときのバイト数のことなら、
読めないようなものは無視してしまえばいい。

まあ、なんでファイルサイズを知りたいのかってとこまで
一回さかのぼって考えてみるのも一計。
602デフォルトの名無しさん:2007/06/22(金) 22:25:44
サイズは「サイズ」以外ないだろ。
「文字数」とは違う。
603デフォルトの名無しさん:2007/06/23(土) 08:17:34
昔のCP/Mはセクタ数でしか管理してなかったなぁ
604デフォルトの名無しさん:2007/06/23(土) 08:53:01
>>603
今のCP/Mとやらはどう管理しているの?
605デフォルトの名無しさん:2007/06/23(土) 09:23:37
>>603
最終セクタの0x1Aまでがファイルの「サイズ」だろ?
606デフォルトの名無しさん:2007/06/23(土) 09:45:36
でもそれは管理されてない。
607デフォルトの名無しさん:2007/06/23(土) 09:54:38
ん、「管理されているかどうか」という話なの?
「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの?

だったらそれでいいけど。
608デフォルトの名無しさん:2007/06/23(土) 09:57:38
あっと、
「ファイルのサイズとはOSに管理されていなければならない」という
話の流れとは関係ないことを言いたかっただけで
「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。
609デフォルトの名無しさん:2007/06/23(土) 10:25:40
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。
610デフォルトの名無しさん:2007/06/24(日) 03:19:11
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、
テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。
統一した「ファイルサイズを得る方法」なんてあるわけがない。

あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。
611デフォルトの名無しさん:2007/06/24(日) 03:23:51
ファイルサイズを取得する関数が標準で用意されなかったのは、
そのあたりが理由なのかな?
612デフォルトの名無しさん:2007/06/24(日) 04:03:56
>>611
そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。
613デフォルトの名無しさん:2007/06/24(日) 04:31:09
MS-DOS 1.0 もディレクトリないんだっけ?
614デフォルトの名無しさん:2007/06/24(日) 04:43:31
汎用機もねーよ
615デフォルトの名無しさん:2007/06/24(日) 22:22:42
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
616デフォルトの名無しさん:2007/06/24(日) 22:24:17
そのネタ飽きた
617デフォルトの名無しさん:2007/06/25(月) 10:05:04
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな
128バイトのブロック単位だったからファイルの後ろにはゴミがついていた
Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・
618デフォルトの名無しさん:2007/06/25(月) 10:55:57
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。
619デフォルトの名無しさん:2007/06/25(月) 11:58:13
リソースフォークの話は出してくるやつが出ると思った
リソース/データフォークのサイズもファイルサイズの指定の意味で
書いたんだがわからなかったんだろう
620デフォルトの名無しさん:2007/06/25(月) 15:09:30
>リソース/データフォークのサイズもファイルサイズの指定の意味で
>書いたんだがわからなかったんだろう
これ日本語なの?
621デフォルトの名無しさん:2007/06/25(月) 19:06:14
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。
622デフォルトの名無しさん:2007/06/25(月) 19:07:17
どうと思う!
いや、どうかと思う、だorz
623デフォルトの名無しさん:2007/07/01(日) 14:39:59
MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに
str = "\\" + str;
これで全然問題ないのですが、標準のCで
char str[MAX_PATH];
strcpy(str, ".");
starcat("\\", str);
こうするとアクセスバイオレーションが発生します
どうしたらええの?
strcpy(str, "\.");これでも駄目だった
そうそう環境はWinXPSP-2、VC6です
624デフォルトの名無しさん:2007/07/01(日) 14:41:45
>>623
starcat なる謎の関数の仕様をよーく確認しろ。
625デフォルトの名無しさん:2007/07/01(日) 14:42:52
星猫
626デフォルトの名無しさん:2007/07/01(日) 14:46:52
スマンstrcatだったMSDN見ても問題ないと思うのだが?
文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが
627デフォルトの名無しさん:2007/07/01(日) 14:48:00
>>626
じゃぁ strcat の仕様をよーく確認しやがれこのバ
628デフォルトの名無しさん:2007/07/01(日) 14:48:55
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。
629デフォルトの名無しさん:2007/07/01(日) 14:50:02
それでもstarcatならきっとやってくれるさ
630デフォルトの名無しさん:2007/07/01(日) 14:50:05
MFC 使える環境なら CString か std::string 使えば?
そっちの方が幸せになれるよ。セキュリティ的にも。
631デフォルトの名無しさん:2007/07/01(日) 14:56:52
>>628
ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630
だからMFCなら全然無問題なのだが、Cの事も知りたいからよ
632デフォルトの名無しさん:2007/07/01(日) 14:56:54
>>626
strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。
633デフォルトの名無しさん:2007/07/01(日) 14:59:06
>>631
ならリテラル以外で問題が再現するコードを書いてみやがれ
634デフォルトの名無しさん:2007/07/01(日) 15:00:41
>>631
C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。
635デフォルトの名無しさん:2007/07/01(日) 15:04:06
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。
しかし、やりたいことがよく判らないからサンプルを書けない。
例えばディレクトリとファイル名を連結したいだけならこうなるのだが。
sprintf(path, "%s\\%s", dir, file)
636デフォルトの名無しさん:2007/07/01(日) 15:08:05
>>631
どうせ初期化してないのに strcat とかしたんじゃないのか?
637デフォルトの名無しさん:2007/07/01(日) 15:12:33
元のCStringを使ったコードはこうなっていると解釈するぞ。
CString str = ".";
str = "\\" + str;

char str[MAX_PATH] = ".";
size_t size = strlen(str) + 1;
if (size >= MAX_PATH)
  abort(); /*好きにしてくれ*/
memmove(str + 1, str, strlen(str) + 1);
str[0] = '\\';
WindowsならTCHAR系使えという気もするが、とりあえずcharにしておいた。
638デフォルトの名無しさん:2007/07/01(日) 15:39:04
BoehmGCのようなライブラリを使えば
char *str = ".", *tmp;
tmp = GC_MALLOC(strlen(str) + strlen("\\") + 1);
sprintf(tmp, "\\%s", str);
str = tmp;
でいいよ

んでも毎回strlen()とかすんのはウザいので、
typedef struct string_t { char *s; size_t len; } string_t;
とかして、string_tに対する操作を関数で一通り作るといいよ

んでもそんなアホくさい作業をするくらいならC++で素直に
std::basic_string<>使ったほうがいいよ
639デフォルトの名無しさん:2007/07/01(日) 15:53:40
MFC使っているならCStringもありさ
640デフォルトの名無しさん:2007/07/01(日) 19:19:12
strcpy -> strncpy
strcat -> strncat
sprintf -> snprintf
641デフォルトの名無しさん:2007/07/01(日) 20:09:50
>>640
残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。
642デフォルトの名無しさん:2007/07/01(日) 21:07:18
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。
何より楽だし。
643デフォルトの名無しさん:2007/07/01(日) 22:28:15
バッファオーバーフロー脆弱性の話を聞くたびに、
敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。
それができないなら C++ にしる、と。
644デフォルトの名無しさん:2007/07/01(日) 23:19:51
>641
C99は未だ存在しないのか・・・
645デフォルトの名無しさん:2007/07/01(日) 23:22:59
C99 が使える環境では snprintf を使って、
使えない環境なら等価な関数に #define すればいいんじゃない?
646デフォルトの名無しさん:2007/07/01(日) 23:26:40
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?
647デフォルトの名無しさん:2007/07/01(日) 23:33:00
VC++ には _snprintf がある。
648デフォルトの名無しさん:2007/07/02(月) 00:13:07
char *s;
FILE *fp = fopen("/dev/null", "w");
size_t len = fprintf(fp, ...); /* 長さを数えてもらう */
fclose(fp);
s = malloc(len + 1);
sprintf(s, ...);

勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが
それぐらいならやっぱりC++を使うべきという結論に
649デフォルトの名無しさん:2007/07/02(月) 00:38:37
>>648
必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。
650デフォルトの名無しさん:2007/07/02(月) 00:48:37
>>649
そいつらの代替実装の話だろ。
651デフォルトの名無しさん:2007/07/02(月) 00:48:40
問題は移植性の低さだな
標準とはいえC99未対応のCコンパイラは多い
652デフォルトの名無しさん:2007/07/02(月) 01:00:52
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?
653デフォルトの名無しさん:2007/07/02(月) 01:09:55
>>652
あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか
654デフォルトの名無しさん:2007/07/02(月) 03:06:17
その場合は自分でラッパ関数を定義すればいいんじゃないかな?
655デフォルトの名無しさん:2007/07/02(月) 21:29:01
*BSD LIBCあたりから掻っ払って来りゃええやん。
656デフォルトの名無しさん:2007/07/04(水) 22:59:02
ねぇねぇおまえらちょっと教えてくんない
ファイルの行数を取得する標準関数なんてないよね
そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数
数えるとかやってんの?
どうよ
657デフォルトの名無しさん:2007/07/04(水) 23:03:13
そうする
658デフォルトの名無しさん:2007/07/04(水) 23:34:14
それ以外の方法があるなら是非とも教えてもらいたいもんだ
659デフォルトの名無しさん:2007/07/04(水) 23:50:13
fp = fopen(filePath,"r");
while(fgets(szBuff, MAX_PATH, fp) != NULL)
{
  maxLine++;
}
fclose(fp);

char szItem[7][maxLine++];

じゃぁこれはどうよ、二次元配列が作りたくてこうやったら
error C2057: 定数式が必要です、MSDNとか調べてhttp://support.microsoft.com/kb/142493/ja

char szItem[7][((const int)maxLine++];
こうしてもなおんないんだよねぇこれってどうよ
660デフォルトの名無しさん:2007/07/04(水) 23:52:13
スマン訂正
int maxLine;
罰char szItem[7][((const int)maxLine++];
丸char szItem[7][(const int)maxLine++];
661デフォルトの名無しさん:2007/07/04(水) 23:59:58
C99じゃない限り配列の大きさはコンパイル時に固定=定数
662デフォルトの名無しさん:2007/07/05(木) 00:07:53
あきらめきれなくて
回避策はないのかと聞いてみる
663デフォルトの名無しさん:2007/07/05(木) 00:09:15
ttp://www23.atwiki.jp/homework/pages/11.html#id_062fdb0f
のwikiに載っていたリサージュのプログラムで
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
の2の値を自由に変えられる(自分で入力できる)ように
したいんですけど、どうやったらいいですか?
664デフォルトの名無しさん:2007/07/05(木) 00:10:28
>>662
malloc使えばいいんじゃない
665デフォルトの名無しさん:2007/07/05(木) 00:12:44
>>664
クワシク
666デフォルトの名無しさん:2007/07/05(木) 00:17:10
そこらへんの入門書に書いてある。
残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。
667デフォルトの名無しさん:2007/07/05(木) 00:53:10
>>662
寧ろ、C++でstd::vector使えばいいんじゃない?
668デフォルトの名無しさん:2007/07/05(木) 01:32:50
ドウシテC99ヲツカワナイノデスカ
669デフォルトの名無しさん:2007/07/05(木) 16:48:51
ドウシテC99ガフキュウシテルトオモウノデスカ
670デフォルトの名無しさん:2007/07/05(木) 16:50:55
C99 使うくらいなら C++ 使う
671デフォルトの名無しさん:2007/07/05(木) 16:52:17
んだな
672デフォルトの名無しさん:2007/07/05(木) 23:13:16
単項演算子の+って、どう言ったときに役に立つのでしょうか?
Cだけの話ではないかもしれませんが。
673デフォルトの名無しさん:2007/07/05(木) 23:13:35
メジャーなコンパイラでC99に対応してないのってあるの?
俺趣味グラマでgccしか使わんからわからん。
674デフォルトの名無しさん:2007/07/05(木) 23:16:17
>>673
VC++
675デフォルトの名無しさん:2007/07/05(木) 23:20:05
>>672
桁合わせくらいには役に立つことはあるかも。
676デフォルトの名無しさん:2007/07/05(木) 23:47:34
>>672
-があるから+も装備したらしい
677デフォルトの名無しさん:2007/07/06(金) 00:45:33
昔、
#ifdef xx
# define SYM 10
#else
# define SYM
#endif
のような時に

int num = SYM +0;
というような使い方をした覚えがあるような無いような。
678デフォルトの名無しさん:2007/07/06(金) 01:20:07
マクロ関連で役に立つことがたまにありそうではあるな。
679デフォルトの名無しさん:2007/07/06(金) 01:35:03
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?
680デフォルトの名無しさん:2007/07/06(金) 01:36:20
単項+のオペランドも式だし、
単項+のオペランドになれない式もあるだろ。
681デフォルトの名無しさん:2007/07/07(土) 03:44:31
#ifdef xx
# define SYM 10
#else
# define SYM 0
#endif
では、何故ダメだったのか教えてほしい。
682デフォルトの名無しさん:2007/07/09(月) 22:11:51
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。
○×ゲームを作るプログラムを作っていたんですが。
1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。
line1[10]=" 789\n",
line2[10]=" 456\n",
line3[10]=" 123\n",
という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが
何故Tabキー使っては駄目なのか教えていただけませんか?
683デフォルトの名無しさん:2007/07/09(月) 22:17:17
>>682
書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな
684デフォルトの名無しさん:2007/07/09(月) 22:37:32
いやコンパイルエラーになるんだろ。
たぶん、構文的に駄目になっているのだろうとしか言えない。
後できちんと規格書に当たってみる。

とりあえず、文字列リテラルの中でタブ文字を表現したければ、
タブを直接入力する代わりに\tを使えばいいと言っておく。
685デフォルトの名無しさん:2007/07/09(月) 22:44:18
>>683
ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。

strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?
686デフォルトの名無しさん:2007/07/09(月) 22:48:07
>>685
やってみたほうがよく分かる
687デフォルトの名無しさん:2007/07/09(月) 23:05:02
>>684
指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686
ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)
688デフォルトの名無しさん:2007/07/09(月) 23:12:54
環境もないのに実習なんて言うのか?
689デフォルトの名無しさん:2007/07/09(月) 23:28:53
>>688
ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。
690デフォルトの名無しさん:2007/07/09(月) 23:30:22
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。
691デフォルトの名無しさん:2007/07/09(月) 23:32:15
>>689
今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める
692デフォルトの名無しさん:2007/07/09(月) 23:36:48
>>691
今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\
693デフォルトの名無しさん:2007/07/09(月) 23:38:11
とりあえずお前はCの勉強する前にPCの勉強をしろ。
694デフォルトの名無しさん:2007/07/09(月) 23:40:29
>>692
Windows Vista と予想
695デフォルトの名無しさん:2007/07/09(月) 23:49:11
やっぱり聞くんじゃなかったかな。
もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。
696デフォルトの名無しさん:2007/07/09(月) 23:54:59
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。
697デフォルトの名無しさん:2007/07/09(月) 23:59:16
寿司食いたい
698デフォルトの名無しさん:2007/07/10(火) 09:13:41
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?
699デフォルトの名無しさん:2007/07/10(火) 10:29:56
スペースをタブにできるなら、スペースを\tにもできるだろう
700デフォルトの名無しさん:2007/07/12(木) 10:53:19
ファイルがテキストファイルかバイナリーファイルかを
Cプログラムで判定したいのだけれど、方法を教えてくれ。
701デフォルトの名無しさん:2007/07/12(木) 11:01:37
>>700
ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。
702デフォルトの名無しさん:2007/07/12(木) 11:23:16
つ[/usr/bin/file]
703デフォルトの名無しさん:2007/07/12(木) 11:33:10
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど
それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。
704デフォルトの名無しさん:2007/07/12(木) 12:26:31
>>702
ここをどこだと思ってるんだ
705デフォルトの名無しさん:2007/07/12(木) 12:27:18
そもそもテキストファイルとは何なのか。
706デフォルトの名無しさん:2007/07/12(木) 12:28:40
SUBをファイルの終わりとして認識すべきファイルのこと。
707デフォルトの名無しさん:2007/07/12(木) 15:25:59
>>706
CP/M の世界から、ようこそ!
708デフォルトの名無しさん:2007/07/13(金) 00:46:50
発注元がどうしても欲しい、というのでフローチャートを書いているのですが
#if を if文とフローチャート上で区別する方法はありますか?
具体的には

#if defined(MODEL_xx)
if (zzz) {
processYYY();
}
#endif

ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。
709デフォルトの名無しさん:2007/07/13(金) 00:58:46
両方納品するんならフローチャートは2セット要るんじゃないか?
710デフォルトの名無しさん:2007/07/13(金) 09:42:40
>>708
定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。
711デフォルトの名無しさん:2007/07/13(金) 10:21:15
if文は実行時に働くものだからフローチャートの一部だが
#ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで
よってフローチャートもその数だけ必要になる

っていうかCの話かこれ?
712デフォルトの名無しさん:2007/07/13(金) 16:31:31
char型のcharってcharacterの略で%nのnはnewlineの略ですよね?
こういう略してある語の元の単語が載ってるサイトってないですかね?
探してもこの2つしかわからなくて
713デフォルトの名無しさん:2007/07/13(金) 16:36:42
念のために言っとくが\nな

語なんてそんなに多くないから何がわからないか聞けばここで全部答えてもいいぞ(一回にまとめるなら)
714デフォルトの名無しさん:2007/07/13(金) 18:17:06
\nでしたすいません


stdioとhの意味
printfのprintとfの意味
scanfのscanとfの意味
int型 int
double型 double
%f f  
%c c  
%s s 
\t t 

全部でこれだけなんですがお願いできますか?stdioはstandard input outputかなとも思うんですが
715デフォルトの名無しさん:2007/07/13(金) 18:28:06
とおりがかりだけど、
hはheader、fはformat、intはinteger(整数)、doubuleはDouble Precision(倍精度(実数))、
%f はfloat(floating point 浮動小数点)、%c はcharacter、%sはstring、\t はTAB
あとは想像通り、辞書ひいてもいいし。

まあ誰かまとめてくれるかな。
716デフォルトの名無しさん:2007/07/13(金) 20:07:17
printfはprint formatted
717デフォルトの名無しさん:2007/07/13(金) 20:26:52
stdioはStandard IO(InputOutput)
718デフォルトの名無しさん:2007/07/13(金) 20:42:49
714は挙げていないけど、%gはe、fの次の文字だからという理由。
ANSI C言語辞典にはそう書いてある。
719デフォルトの名無しさん:2007/07/13(金) 22:22:38
>>712
新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。
720デフォルトの名無しさん:2007/07/14(土) 00:13:43
俺あれもってるけど、一度も引いたことないわ
manかぐぐればいいだけの話しだしな
721名無し:2007/07/14(土) 05:10:14
http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?

ここの「ファイル入出力」ってやつ分かりません。

助けてください
722デフォルトの名無しさん:2007/07/14(土) 05:18:33
>>721
初心者スレへどうぞ。
723デフォルトの名無しさん:2007/07/16(月) 03:14:46
(a+1)x^2+(b+1)x+(c+1)=0を
解くプログラムがわからないorz
a=1b=1c=1を入れるのだが
#include<stdio.h>
int main(void)
{
int a=1,b=1,c=1,d,x,y;
scanf("a=%f",&a);
scanf("b=%f",&b);
scanf("c=%f",&c);
d=b^2-4*a*c;
if(d>0)
x=(-b+sqr(d))/a;
y=(-b-sqr(d))/a;
printf("x=%d,%d\n",x,y);
elxe
printf("解なし\n");
return 0;
}
ではダメみたいなんよ
よくわからない、たすけておくれ

724デフォルトの名無しさん:2007/07/16(月) 03:37:42
マルチすんな
725デフォルトの名無しさん:2007/07/16(月) 10:19:32
elxe
これなに
726デフォルトの名無しさん:2007/07/16(月) 10:23:46
727デフォルトの名無しさん:2007/07/16(月) 21:36:40
C99で、
for(int i = 0; i < 10; i++) /* something */ ;
みたいにforの中で変数宣言できますけど、
while( int i = f() ) /* something */ ;
みたいなことはできないんですね。不便。
728デフォルトの名無しさん:2007/07/16(月) 22:26:34
>>727
C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど
729デフォルトの名無しさん:2007/07/16(月) 22:27:05
条件判定のところで変数宣言して何の意味があるんだい?

730デフォルトの名無しさん:2007/07/16(月) 22:28:33
判定のたびにブチ壊しては作り直すのであろうよ
おほほほ
731727:2007/07/16(月) 22:49:06
while( obj = nextObj() ) {
// something
}

みたいなことしません?
732デフォルトの名無しさん:2007/07/16(月) 22:55:17
int obj;
while( obj = nextObj() ) {
// something
}

でいいじゃんとか思ったら負け?
733デフォルトの名無しさん:2007/07/16(月) 23:03:09
>>727
for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。

対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。
734デフォルトの名無しさん:2007/07/16(月) 23:04:35
for(i=0;i=f();i=0){

とでも書いとけ
735デフォルトの名無しさん:2007/07/16(月) 23:08:04
そんなにループ内だけで変数を使いたいなら関数にでもしてしまえばよろしい
736734:2007/07/16(月) 23:10:44
まちがったが訂正はしない
わかって
おねがい
737デフォルトの名無しさん:2007/07/16(月) 23:15:49
{
 int obj;
 while( obj = nextObj() ) {
 // something
 }
}

みたいにブロックで囲めばいいじゃん。
738デフォルトの名無しさん:2007/07/16(月) 23:25:36
つーか
for (int obj; obj = nextObj(); ) {
// something;
}
でおk
739デフォルトの名無しさん:2007/07/17(火) 08:18:31
はんのーした香具師らは負け組
740デフォルトの名無しさん:2007/07/17(火) 10:40:12
>>733
>それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?
741デフォルトの名無しさん:2007/07/17(火) 15:04:07
>>740
そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。
742デフォルトの名無しさん:2007/07/17(火) 15:10:43
>>741
> while に書いたステートメント
> 変数の宣言は値を返さない

現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。
743デフォルトの名無しさん:2007/07/17(火) 16:31:46
なんというマジレスの嵐
744デフォルトの名無しさん:2007/07/17(火) 17:23:12
for (;int i = hoge();)
745デフォルトの名無しさん:2007/07/17(火) 17:32:03
寿司食いたい
746デフォルトの名無しさん:2007/07/17(火) 17:35:08
>>745
ガリでも食ってろ
747デフォルトの名無しさん:2007/07/17(火) 18:50:31
C++でできるんだから、C99でできるようにすることも可能だったとは思う。
どういう経緯があったかは知らないが、結果として制定されたC99では、
できるようになっていないけど。

以下チラシの裏
これは、こういうコード
Tok* ct;
if (ct = gettok()) { /* ... */ }
に対して、条件式のところで変数を宣言できれば、未初期化の変数を減らせ、
ついでに条件文内に変数の有効範囲を閉じ込められるというアイデアだった。
if (Tok* ct = gettok())
{
  // ctはスコープ内
}
// ctはスコープ外
参考『C++の設計と進化』 3.11.5.2 条件文の中の宣言

C++では、C以上に初期化と代入が区別されるので、
>>737-738のような書き換えができないこともある。
それもあって、俺はたまに使うし、C++からは無くなれと思わない。
748デフォルトの名無しさん:2007/07/17(火) 19:06:31
この文でコンパイルできるんだが結果が正しくでません。
どこか誤りありますか?
#include<stdio.h>
void main()
{
int a, b,c;
printf("a = ");
scanf("%d",&a);
printf("b = ");
scanf("%d",&b);
printf("c = ");
scanf("%d",&c);


if( a == b == c ){
printf("%d\n",a);
}else if( a >= b >= c ){
printf("%d\n",a);
}else if( a >= c >= b ){
printf("%d\n",a);
}else if( b >= a >= c ){
printf("%d\n",b);
}else if( b >= c >= a ){
printf("%d\n",b);
}else if( c >= a >= b ){
printf("%d\n",c);
}else if( c >= b >= a ){
printf("%d\n",c);
}
}
749デフォルトの名無しさん:2007/07/17(火) 19:14:43
>>748
「何をやろうとしているのか、また何が正しいのかは
 コードから読みやがれ」ってか。大した奴だ。

…とか思ってたら、ひと目で変な記述が。

>if( a == b == c ){
>if( a >= b >= c ){
    :(略)

そんな書き方できない。
面倒でも

if (a == b && b == c) {
if (a >= b && b >= c) {
    :(略)

と書かないと。
750デフォルトの名無しさん:2007/07/17(火) 19:16:46
>>749
スマソ。そしてありがとう。
そうやったら、できました。
751c言語初心者:2007/07/17(火) 19:38:16
突然すいません!!学校の問題でc言語の問題が3つ出たのですがまったくわからないです。問題書き込むんで誰か解いてもらえませんか?
よろしくお願いします。
752デフォルトの名無しさん:2007/07/17(火) 19:40:08
OKとりあえず宿題スレ逝け。
753c言語初心者:2007/07/17(火) 19:43:22
宿題すれってあるんですか??
754デフォルトの名無しさん:2007/07/17(火) 19:45:11
C言語なら俺に聞け(入門篇) Part 16
http://pc11.2ch.net/test/read.cgi/tech/1184003625/
755c言語初心者:2007/07/17(火) 19:50:54
ここならしていただけるんですか??
756デフォルトの名無しさん:2007/07/17(火) 19:53:03
>>755
>>751
> 学校の問題

C/C++の宿題を片付けます 93代目
http://pc11.2ch.net/test/read.cgi/tech/1184506311/
757デフォルトの名無しさん:2007/07/17(火) 19:55:22
ただし回答者の気が向いたら
気に入られなければスルーされる
758デフォルトの名無しさん:2007/07/18(水) 05:49:19
スレ立てられなかった。誰かキボン。

スレタイ: 【初心者歓迎】C/C++室 Ver.40【環境依存OK】

エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
age 推奨ですが、自己判断で。

◆ 前スレ: 【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/

◆ アップローダー (質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
759デフォルトの名無しさん:2007/07/18(水) 11:05:17
>>758
何故このスレで……
760デフォルトの名無しさん:2007/07/18(水) 13:58:47
もう立ってるね
761デフォルトの名無しさん:2007/07/19(木) 01:02:10
cの入門書とポインタ攻略本を読んでほぼ理解できたんだけど次に何読めばいいかわからん

何かお勧めの参考書教えてください
762デフォルトの名無しさん:2007/07/19(木) 01:05:40
アルゴリズムとデータ構造
763デフォルトの名無しさん:2007/07/19(木) 01:10:14
30日でできる! OS自作入門
764デフォルトの名無しさん:2007/07/19(木) 01:13:03
K&R
765デフォルトの名無しさん:2007/07/19(木) 01:41:38
アルゴリズム辞典
766デフォルトの名無しさん:2007/07/19(木) 10:10:47
>>761
>読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。
767デフォルトの名無しさん:2007/07/19(木) 21:12:03
ケースセンシティブにもう少しもないものだ
768デフォルトの名無しさん:2007/07/20(金) 01:15:22
たしかにw

まぁ、ポインタは理解したんだろう。
面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。
769デフォルトの名無しさん:2007/07/20(金) 01:38:29
えーとintの配列へのポインタを受け取って関数へのポインタへのポインタを返す関数・・・
770デフォルトの名無しさん:2007/07/20(金) 11:12:34
typedef って便利だよな。
771デフォルトの名無しさん :2007/07/20(金) 13:33:33
俺は、typedef void (*func)(int)っていうのを見て
何をtypedefしてんだ?と思った時期もありました。
772デフォルトの名無しさん:2007/07/20(金) 16:53:23
void (*const *foo(const int (*p)[10]))(void (T::*)(int (U::*)()));
773デフォルトの名無しさん:2007/07/20(金) 17:03:50
typedef様様だな
774デフォルトの名無しさん:2007/07/20(金) 17:16:19
>>771
それ何をtypedefしてるの?
初めて見た
775デフォルトの名無しさん:2007/07/20(金) 17:29:32
>>774
intの引数が1つで値を返さない関数を func にtypedef
例えば、、、

void foo(int);
func f = foo;
とか
776デフォルトの名無しさん:2007/07/20(金) 17:38:57
なるほどー
自分に使う機会が来るかはわからんけど覚えておこう
thx
777デフォルトの名無しさん:2007/07/20(金) 18:12:25
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
778デフォルトの名無しさん:2007/07/20(金) 18:13:29
typedef int (U::*FP1)();
typedef void (T::*FP2)(FP1);
typedef void (*FP3)(FP2);

const FP3* foo(const int p[][10]);
779デフォルトの名無しさん:2007/07/20(金) 20:18:26
>>777
ビットフラグのクリアとか?
780デフォルトの名無しさん:2007/07/20(金) 20:45:24
>>777
ビットの配列を作るときに使う
781デフォルトの名無しさん:2007/07/20(金) 20:45:55
「作る」じゃなくて「操作する」だな。すまん。
782デフォルトの名無しさん:2007/07/20(金) 21:50:27
>>779-781
ビットシフトはなんの役に立つのでしょうか?
でぐぐれ
783デフォルトの名無しさん:2007/07/20(金) 21:56:19
そういえばどうしてローテートはないんだろ
784デフォルトの名無しさん:2007/07/20(金) 22:20:58
>>777
コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?
785デフォルトの名無しさん:2007/07/20(金) 23:02:06
不定期テンプレ
786デフォルトの名無しさん:2007/07/20(金) 23:14:02
ただの荒らし
あるいは風物詩
あるいは新参の受ける洗礼
787デフォルトの名無しさん:2007/07/21(土) 00:56:47
>>783
ローテートをサポートしない CPU も多いんじゃね?
知らんけど。
788デフォルトの名無しさん:2007/07/21(土) 01:07:00
>>784
少ないなw
789デフォルトの名無しさん:2007/07/21(土) 02:04:14
&a->bって&(a->b)か(&a)->bかどっち?
790デフォルトの名無しさん:2007/07/21(土) 02:09:29
「演算子 順位」とかでぐぐれ
791デフォルトの名無しさん:2007/07/21(土) 02:19:04
&(a->b)ですね。ありがとう。
792デフォルトの名無しさん:2007/07/21(土) 02:25:36
つか、やってみりゃ分かるだろ。
793デフォルトの名無しさん:2007/07/21(土) 02:39:22
その態度は良くない。
・規格を読んで正しい挙動を把握する
・実際に処理系で実験してみる
・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)
794デフォルトの名無しさん:2007/07/21(土) 03:25:22
規格読んで来て、理解して&(a->b)を常に&a->bとか書くように
なる人と仕事組んだら俺泣きそうw
795デフォルトの名無しさん:2007/07/21(土) 04:28:59
&a->b は普通に書くだろw
796デフォルトの名無しさん:2007/07/21(土) 04:41:50
>・規格を読んで正しい挙動を把握する
=「演算子 順位」とかでぐぐれ
>・実際に処理系で実験してみる
=つか、やってみりゃ分かるだろ。
797デフォルトの名無しさん:2007/07/21(土) 04:45:12
正しい挙動を把握してから実験で確認するのと、
実験して結果を見て予想するのは、大きな違いがある。
798デフォルトの名無しさん:2007/07/21(土) 05:26:51
その態度はよくない。
実験して結果を見て法則を導くスタイルが無いと。
799デフォルトの名無しさん :2007/07/21(土) 05:30:11
はいはい、そうですね
800デフォルトの名無しさん:2007/07/21(土) 05:48:50
実験した後に確かめた方がいい。
801デフォルトの名無しさん:2007/07/21(土) 10:00:56
演算子の優先順位は、処理系依存ってことはないだろうから、実験でいいんじゃね?
802デフォルトの名無しさん:2007/07/21(土) 10:02:37
規格読む→実験する→2chで煽りつつ確かめる
803デフォルトの名無しさん:2007/07/21(土) 10:11:19
規格読む前に実験した方が実感しやすいな。
804デフォルトの名無しさん :2007/07/21(土) 10:36:58
その通りだ。実験して、壁にぶち当たって、その壁をぶっ壊せ!
フラグメンテーションエラーで、メモリーもぶっ壊せ!
そして泣きながら規格読んで実感だ!
805デフォルトの名無しさん:2007/07/21(土) 11:26:38
>>804
>そして泣きながら規格読んで実感だ!
お疲れ様です。
806デフォルトの名無しさん:2007/07/21(土) 11:51:31
C++ だが、export は色んな意味で泣ける。
807デフォルトの名無しさん:2007/07/21(土) 12:27:13
俺の胸でなけ
808デフォルトの名無しさん:2007/07/21(土) 13:02:06
俺の下であがけ
809デフォルトの名無しさん:2007/07/21(土) 14:42:57
実験だけじゃ優先順位なのか結合の方向なのか解らない、と。
まぁ、&a->bくらいなら、どっちでもいいけど。
810デフォルトの名無しさん:2007/07/21(土) 16:25:12
&a->b が (&a)->b と見做されるんだとしたら
皆 a.b と書くと思うんだわ。
811デフォルトの名無しさん:2007/07/22(日) 00:30:44
&a.bじゃないか?
812デフォルトの名無しさん:2007/07/22(日) 00:31:41
終電まで仕事してて疲れてた。>>811はお願いだから忘れて
813デフォルトの名無しさん:2007/07/22(日) 10:05:19
CD-R に保存しました
814デフォルトの名無しさん:2007/07/24(火) 03:59:19
石版に刻みました
815デフォルトの名無しさん:2007/07/24(火) 09:46:04
DNAに移植しました
816デフォルトの名無しさん:2007/07/24(火) 10:10:45
アカシックレコードに刻まれました。
817デフォルトの名無しさん:2007/08/01(水) 00:15:00
C++ の STL に感動しました
C言語で STL に似たことをしたいと思ったらどうすれば良いですか?
818デフォルトの名無しさん:2007/08/01(水) 00:16:19
C++に乗り換える。
819デフォルトの名無しさん:2007/08/01(水) 00:17:24
やっぱりそれが確実ですよね
820デフォルトの名無しさん:2007/08/01(水) 00:20:58
マクロを使う。
821デフォルトの名無しさん:2007/08/01(水) 02:11:51
そういえば、templateが使えない時代にはgeneric.hってのがあったな
822デフォルトの名無しさん:2007/08/01(水) 21:08:58
>>817
こんなんあった。かなりSTLに近いんじゃないか?
マクロを使ってるからデバッグがむずかしそうだが


>http://sourceforge.jp/projects/cstl
>CSTLは、C言語で使えるC++のSTLライクなコンテナライブラリです。
>vector, deque, list, set, multiset, map, multimap, stringを提供します。
823デフォルトの名無しさん:2007/08/02(木) 10:16:24
FILE *t=tmpfile();
で作成したtを
fclose(t);
してもいいですか?
なんか危なくて、こわいです。
824デフォルトの名無しさん:2007/08/02(木) 10:24:04
なんで危ないんだよw
まあ、またその内容を使うことがあるなら閉じちゃだめだが。
825デフォルトの名無しさん:2007/08/02(木) 10:44:31
ええ!
fclose(t)ってやってよかったの?
826デフォルトの名無しさん:2007/08/02(木) 10:56:00
C言語辞典見てみたけど、やっていいみたい。
827デフォルトの名無しさん:2007/08/02(木) 11:09:09
用がなくなったら閉じないとダメだろ。常考。
828デフォルトの名無しさん:2007/08/02(木) 11:52:56
tmpfile()は、そのファイルがクローズされたか、またはプログラムが終了したときに
自動的に削除されるファイルを生成し、そのストリームへのポインタを返す。

何も問題はない。
829デフォルトの名無しさん:2007/08/03(金) 06:35:21
自分ならOOライクにたとえ1行で済んだとしても生成と破棄を対にして両方の関数を作る
830デフォルトの名無しさん:2007/08/03(金) 07:59:09
なら別にC使わないで他のOO使えばいいじゃん。頭かたいね。
831デフォルトの名無しさん:2007/08/03(金) 08:38:00
生成と破棄を対にすることがOOライクだと思うくらいならそれでもいいんじゃね?
832デフォルトの名無しさん:2007/08/03(金) 09:21:23
ぷっ
833デフォルトの名無しさん:2007/08/03(金) 11:09:16
>>830
固いんじゃなく、弱いんだろう。
834デフォルトの名無しさん:2007/08/03(金) 23:43:24
>>822
面白そうなものがあるんですね
GPLじゃないところもイイ!

ただ、著作表示だけはしないといけないようですね
835デフォルトの名無しさん:2007/08/04(土) 00:29:40
>>834
BSDライセンスらしいから緩いでしょ
836デフォルトの名無しさん:2007/08/04(土) 00:34:52
いや修正BSDって中のファイルに書いてるじゃん
837デフォルトの名無しさん:2007/08/05(日) 18:02:02
////(main.h)
#ifndef MAIN_H
#define MAIN_H
int X
#endif
////

////(main.cpp)
#include "main.h"
#include "move.cpp"
main(){
move();
}
////

////(move.cpp)
#include "main.h"
move(){
(Xを操作する処理)
}
////

ゲームプログラミングを勉強中で、大筋で感じな状況になってます。
これをコンパイルすることも実行することもできるのですが
BCCでコンパイルすると、「パブリックモジュール_Xが、main.objとmove.objの
両方で定義されている」と警告されます。
これはどういうことで何が悪いのでしょうか?
グローバル関数を使いながら、ファイルを分割してみたいのですがどうしたらいいのでしょうか?



838デフォルトの名無しさん:2007/08/05(日) 18:03:42
>>837
////(main.cpp)
#include "main.h"
#include "move.cpp"←いらなくね?
839デフォルトの名無しさん:2007/08/05(日) 18:06:54
int X;
    ~
840837:2007/08/05(日) 18:15:40
>>838
それを消したら、未定義の関数moveを呼び出したなどとエラーだ出ます。

>>839
掲示板に書き込む時に簡略化したら忘れてしまいました。
841デフォルトの名無しさん:2007/08/05(日) 18:21:04
>>837
宣言と定義の区別をしっかりと。ヘッダには変数や関数の宣言だけ置くこと。
842デフォルトの名無しさん:2007/08/05(日) 18:23:31
プロトタイプ宣言でググれ
843デフォルトの名無しさん:2007/08/05(日) 20:04:20
////(main.h)
#ifndef MAIN_H
#define MAIN_H
extern int X;
#endif
////

////(main.cpp)
#include "main.h"
#include "move.h"
int main(){
move();
}
////

////(move.h)
#ifndef MOVE_H
#define MOVE_H
int move();
#endif
////

////(move.cpp)
#include "main.h"
int move(){
(Xを操作する処理)
}
////
844デフォルトの名無しさん:2007/08/05(日) 20:05:03
まちがった

////(main.cpp)
#include "main.h"
#include "move.h"
int X;
int main(){
move();
}
////
845わ ◆V92eIRyEPU :2007/08/14(火) 14:48:11
846拿 ◆J/ZoJAt3T2 :2007/08/14(火) 14:50:07
テスト
847デフォルトの名無しさん:2007/08/15(水) 23:58:55
>>843-844
俺なら、
extern int X; はmove.h側に入れて、int X; は move.cpp に入れて、
main.hは消すかな。細かいことですんませんね。

>>837
安心しなさい。あなたの方が、うちの元請けより優秀です!
ちゃんと #ifndef使うあたりが。
848名無しさん@お腹いっぱい:2007/08/19(日) 03:09:14
すいません最近c言語を習い始めたのですが、円の半径(double型)をあたえて、円周の長さと
と円の面積を表示するプログラムがどうしてもできません。
どうすればよいのでしょうか?
849デフォルトの名無しさん:2007/08/19(日) 03:47:30
お前さんが書いたコードを晒せ
850デフォルトの名無しさん:2007/08/19(日) 04:10:29
その前に初心者スレに行け。
851デフォルトの名無しさん:2007/08/19(日) 10:50:59
>>848が出来ない可能性
・scanfで&忘れ、%dを指定している
・式中にint型とかを使っている
・まともに調べてない、読んでない
・円周の長さ、円の面積が分からない
852デフォルトの名無しさん:2007/08/19(日) 10:57:20
#define PI 3
853デフォルトの名無しさん:2007/08/19(日) 12:33:21
ゆとりな定義だな
854デフォルトの名無しさん:2007/08/19(日) 12:39:38
#define ENSYUURITSU 3
855デフォルトの名無しさん:2007/08/19(日) 18:23:29
>>848 どぞ。

double pi = 3.14159265358979323846
double r = 1.0;
double s = pi * r * r;
double d = 2 * pi * r;
printf("s=%f,d=%f\n",s,d);
856デフォルトの名無しさん:2007/08/19(日) 20:58:27
どうでもいいが円周はlな方がしっくりくる
857デフォルトの名無しさん:2007/08/19(日) 21:16:49
#include <math.h>
double pi = atan(1) * 4;
858名無しさん@お腹いっぱい:2007/08/20(月) 02:27:48
>857
ありがとうございます。あと家でc言語使えるようにしようと思って
microsoft.net Framework version 2.0 再頒布可能パッケージ
microsoft.net Framework version 2.0 SDK 日本語版
をダウンロードしたのですが友達の話によると
microsoft.net Framework version 2.0 日本語版 language pack
が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが
どうやったら手に入るのでしょうか?
すごい初歩的な質問ですいません。
859デフォルトの名無しさん:2007/08/20(月) 05:52:55
>>858
初歩的以前にスレ違いなんだが自覚あるか?
860デフォルトの名無しさん:2007/08/20(月) 09:16:00
math.hインクルードするならM_PI使ったほうが早い
861デフォルトの名無しさん:2007/08/20(月) 09:20:12
>>860
M_PIは標準ではない。
862デフォルトの名無しさん:2007/08/20(月) 09:45:41
ここは世界レベルでの標準に関わる内容のスレです。標準的ではない手法はお断りします。
863デフォルトの名無しさん:2007/08/20(月) 10:10:12
M_PIが無い最近の環境って何がある?
864デフォルトの名無しさん:2007/08/20(月) 10:18:59
つ MS Visual C++
865デフォルトの名無しさん:2007/08/20(月) 10:28:00
gccでもansi適合モードにするとスルーされる。
866デフォルトの名無しさん:2007/08/20(月) 13:43:09
VC++は定義されてないのがデフォで、_USE_MATH_DEFINESを定義すると使えるようだね
867デフォルトの名無しさん:2007/08/24(金) 14:00:16
関数から構造体を受けることはできたんですが,構造体を渡して,受け取る関数を作りたいのですが
どのように記述すれば良いですか

struct Initset getinfo(struct Initset *syoki2)
↑のような記述はできないですか?
868デフォルトの名無しさん:2007/08/24(金) 14:07:52
それでいいです
869867:2007/08/24(金) 15:10:45
>>868
できました〜。ありがとうございます
870名無しさん@お腹いっぱい:2007/08/24(金) 16:41:08
入力した自然数nの正の約数をすべて表示するプログラムを今、作っているのですが、
int main(void)
{
int a = 1;
int n = 500;
int f = n / a;

while(a < n) {
a += 1;
}
printf("%d\n",f);
return 0;
}
上のものは自分がわからないながらも作ったものです。
でもできませんでした。
改善点お願いします。
871デフォルトの名無しさん:2007/08/24(金) 16:52:01
while(a < n) { と a += 1; の間に
if (n % a == 0) {
printf("%d\n", a);
}
とか入れてみ

まあ約数なら 1/2 以上はありえないから省くとかするけどな。
入力とかはとりあえずscanfかなんかで。
872デフォルトの名無しさん:2007/08/24(金) 16:57:44
>>870
まず処理の流れ自体がわかってないだろう
もう一回教科書を読み直せ
873デフォルトの名無しさん:2007/08/24(金) 23:19:39
入力した自然数nの正の約数をすべて表示するプログラムを今、作っているのですが、
int main(void)
{
int a = 1;
int n = 500;
int f = n / a;

while(a < n) {
a += 1;
}
printf("%d\n",f);
return 0;
}
上のものは自分がわからないながらも作ったものです。
でもできませんでした。
改善点お願いします。
874デフォルトの名無しさん:2007/08/24(金) 23:30:37
改善というか、まずプログラムを使わずに
正の約数を全て列挙する方法すら分かってないように思える。
プログラム以前の問題。
875デフォルトの名無しさん:2007/08/25(土) 00:30:50
どういう順番での実行を予想してるんだ?
876名無しさん@お腹いっぱい:2007/08/25(土) 00:41:32
870ですが約数をすべて列挙する方法ってnまでの数ですべて割る条件式つくって
それが成立するやつを表示するプログラムでよいのですか?
877デフォルトの名無しさん:2007/08/25(土) 01:09:54
よくない
878デフォルトの名無しさん:2007/08/25(土) 01:12:07
「nまで」がどこからnまでなのか、まら「まで」とは未満なのか以下なのか
「全て割る条件式」とは何のことなのか
本当にわかってるか?
879名無しさん@お腹いっぱい:2007/08/25(土) 01:18:28
すいません。たとえば500だったら1,2,3,4,5,6,7,8、という風に
して割り切れる、割り切れないのif文を作ればよいのかと思ったのですがそれではだめですか?
880デフォルトの名無しさん:2007/08/25(土) 01:22:00
>>879
そこまではいい
問題は「割り切れる」の意味がわかってるかどうかだ
881デフォルトの名無しさん:2007/08/25(土) 01:22:31
自然数nの正の約数を列挙する

自然数nを割り切れる正の整数を列挙する

自然数nを割り切れる可能性のある正の整数すべてについて、
その数で本当に割り切れるかどうかを調べ、
割り切れるときはその数を画面に表示する

一応言っとくが「割り切れる」とは除算して余りが出ないことだからな
882デフォルトの名無しさん:2007/08/25(土) 01:24:00
とりあえず「nをaで割り切れるならば」を意味するif文を書いてみろ
883名無しさん@お腹いっぱい:2007/08/25(土) 01:26:01
ありがとうございます。実は今もう一個悩んでいるのがあってかけ算の九九の表をつくるというプログラムをやっているのですが
自分なりにつくったのは
/* kuku.c */

int main(void)
{
int a, b;

int n = 9;

for(a = 1; a <= n; a = a + 1 ){
for(b = 1; b<=n; b = b + 1 ){
printf("%d\n",a*b);
}
printf("\n");
}





return 0;
} なのですが表になりません。おとといから始めたばかりなのでちんぷんかんぷんです。
いろいろとすいませんがご指導をお願いします。
884デフォルトの名無しさん:2007/08/25(土) 01:28:22

 一 個 ず つ や れ
885デフォルトの名無しさん:2007/08/25(土) 01:32:20
>883
初心者スレ逝け
886デフォルトの名無しさん:2007/08/25(土) 01:35:55
>>883
printf("%d\n",a*b); → printf("%3d",a*b);
がんばれ!
887デフォルトの名無しさん:2007/08/25(土) 01:37:43
>>883
処理の流れ、つまり「まずこれが起きて、次にこれが起きて……」という順番をたどりながら考えろ。
漠然と書いて走らせて出来なかったーわかんないーじゃいつまでも理解できん。

そしてここは基本的に「ある程度Cがわかってる人」が「標準C」というものについて少しつっこんだ質問をする場所だから
まずは初心者スレへ行くことをお勧めする。
888名無しさん@お腹いっぱい:2007/08/25(土) 01:45:23
>886
ありがとうございます。できました。
889デフォルトの名無しさん:2007/08/25(土) 11:17:58
なんだよ>>871は無視かよ
890デフォルトの名無しさん:2007/08/25(土) 12:49:26
だって約数はその数自身も含まれるから
ありえないなんて事はありえませんもん
891デフォルトの名無しさん:2007/08/25(土) 13:24:42
まあ順番を問わなければもっと速いが

if(!n%a){
 if(n/a < a)break;
 printf("%d\n",a);
 if(n/a != a)printf("%d\n",n/a)
}
892デフォルトの名無しさん:2007/08/26(日) 01:28:44
!
893デフォルトの名無しさん:2007/09/03(月) 18:47:21
bool a,b,c,d,e,f;
とか
int a,b,c,d,e,f;
みたいに並べて書いた変数を一気に同じ値で初期化する書き方ってありますか?
あったら教えてください。
894デフォルトの名無しさん:2007/09/03(月) 18:55:12
a = b = c = d = e = f = 0;
895デフォルトの名無しさん:2007/09/03(月) 18:57:51
>>894
宣言と合わせて一行でかけませんか。
896デフォルトの名無しさん:2007/09/03(月) 18:58:05
>>893
static int a,b,c,d,e,f;
これで全部0で初期化される。
struct foo {
int a,b,c,d,e,f;
} foo = {0};
これでも全部0で初期化されるな。

まぁ、横着するなってことだ。
897デフォルトの名無しさん:2007/09/03(月) 18:59:10
int a,b,c,d,e,f;a = b = c = d = e = f = 0;
898デフォルトの名無しさん:2007/09/03(月) 19:25:37
>>897
ワロタ
899デフォルトの名無しさん:2007/09/03(月) 19:29:01
それほど面白くはない
900デフォルトの名無しさん:2007/09/03(月) 19:59:10
>>898
そんなので笑えるなんて君の人生楽しそうでうらやましいわ
901デフォルトの名無しさん:2007/09/03(月) 20:07:29
>>893
同じ値で初期化するような変数なら同じような扱いをするんだろう
配列で宣言しろ
902デフォルトの名無しさん:2007/09/06(木) 16:40:24
過疎ってますね
ビットシフトでも入れてみますか?
903デフォルトの名無しさん:2007/09/06(木) 16:52:28
聞くことがないならそれでよし
わざわざ増やさんでいいw
904デフォルトの名無しさん:2007/09/06(木) 17:00:56
ビットシフト入れたかったのに・・・
905デフォルトの名無しさん:2007/09/06(木) 17:24:08
じゃビットシフト絡みで

MMXの様に、4Byteの整数型を1Byte単位で飽和演算する方法を
昔どこかで見た気がするんだけど、どうやるんだっけ

0xFEFEFEFE に 各バイトに3を加算

0xFFFFFFFF

画像処理に使おうと思ったけど思い出せない
906デフォルトの名無しさん:2007/09/06(木) 21:51:57
MMX対応のプロセッサを使う。
907905:2007/09/06(木) 21:56:42
あった
http://www.emit.jp/prog/prog_b.html

しかし原理がよくわかんね
908デフォルトの名無しさん:2007/09/06(木) 21:58:04
if文を任意の位置でぬけるbreakとかcontinueみたいな
命令ってないですか?
909デフォルトの名無しさん:2007/09/06(木) 22:00:49
>>908
こんなイメージ?
if (...) {
...;
if (...) ifBreak;
...;
}
これくらいしか手がない気が。
if (...) {
...;
if (...) goto endIf;
...;
}
endIf:
910デフォルトの名無しさん:2007/09/06(木) 22:01:58
goto
911デフォルトの名無しさん:2007/09/06(木) 22:15:29
>>909-910
サンクス
912デフォルトの名無しさん:2007/09/06(木) 22:38:47
do {
if(...)
{
}
else if(...)
{
....
break;
}
} while(0)
とか
913デフォルトの名無しさん:2007/09/06(木) 23:43:12
俺がよく使うのは

if(...){
 do{

  ...

  if(...) break;

  ...

 }while(0);
}
914デフォルトの名無しさん:2007/09/07(金) 00:12:33
何その隠れgoto
915デフォルトの名無しさん:2007/09/07(金) 00:51:35
んな隠れgoto使うくらいなら、素直にgotoで書いた方が未だ見やすい希ガス。
そもそも、ロジックを整理すべきじゃないかとは思うが。
916デフォルトの名無しさん:2007/09/07(金) 00:54:57
if (...){

 ...

 if(!...){

  ...

 }
}

でいいんじゃないの?
917デフォルトの名無しさん:2007/09/07(金) 01:11:34
int i;

scanf("%d",&i);

while( i<1 || i>9999 )
 {
 printf("もう一度入力してください");
 scanf("%d",&i);
 }


iに数字じゃなく、aaaaなどの文字列を入れると”もう一度入力〜”がえんえんループ表示されてしまいます。
これを防ぐにはどうしたらいいのでしょうか?
918デフォルトの名無しさん:2007/09/07(金) 01:14:43
919917:2007/09/07(金) 01:23:41
>>918
ありがとうございます!
920デフォルトの名無しさん:2007/09/07(金) 01:26:09
>>918
その方法もどうかと思うな。
scanf()は行単位の処理じゃないのに、バッファクリアだけ行単位になってしまう。
921デフォルトの名無しさん:2007/09/07(金) 01:34:26
それではどうすればいいかってのは、このスレでガイシュツです。
922デフォルトの名無しさん:2007/09/07(金) 10:37:17
typedef struct _st {
  char ** ppsz;
} st;

void freeif(st* pst) {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 2; j++) {
      if(*pst->ppsz != NULL) {
        free((void*)pst[i].ppsz[j]);
      }
    }
  }
  for(int i = 0; i < 3; i++) {
    if(pst->ppsz != NULL) {
      free((void*)pst[i].ppsz);
    }
  }
  if(pst != NULL) {
    free(pst);
  }
  return;
}
923デフォルトの名無しさん:2007/09/07(金) 10:38:36

int main(void) {
  st* pst;
  // make struct object
  pst = (st*)malloc(3);
  if(pst == NULL) {
    printf("st is null\n");
  }
  else {
    for(int i = 0; i < 3; i++) {
    // make struct member
    pst[i].ppsz = (char**)malloc(2);
      for(int j = 0; j < 2; j++) {
        // make member area
        pst[i].ppsz[j] = (char*)malloc(10);
      }
    }
    // free memory
    freeif(pst);
  }
  return 0;
}
924デフォルトの名無しさん:2007/09/07(金) 10:40:37
メモリの解放が上手くいきません。よろしくお願いします。

(正誤)
if(pst->ppsz != NULL) {  ← ×
if(pst[i].ppsz != NULL) { ← ○
925デフォルトの名無しさん:2007/09/07(金) 11:03:01
>>923
typedef struct _st {
  char ** ppsz;
} st;
static const char STRINGS[3][2][11] = {
  { "idx1:data1", "idx1:data2", },
  { "idx2:data1", "idx2:data2", },
  { "idx3:data1", "idx3:data2", },
};

void freeif(st* pst) {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 2; j++) {
      if(pst[i].ppsz[j] != NULL) {
        printf("pst[%d].ppsz[%d]:FREE\n", i, j);
        free((void*)pst[i].ppsz[j]);
      }
    }
  }
  for(int i = 0; i < 3; i++) {
    if(pst[i].ppsz != NULL) {
      printf("pst[%d].ppsz:FREE\n", i);
      free((void*)pst[i].ppsz);
    }
  }
  if(pst != NULL) {
    printf("pst:FREE\n");
    free(pst);
  }
  return;
}
926デフォルトの名無しさん:2007/09/07(金) 11:03:55

int main(void) {
  st* pst;
  // make struct object
  pst = (st*)malloc(3 * sizeof(st));
  if(pst == NULL) {
    printf("st is null\n");
  }
  else {
    for(int i = 0; i < 3; i++) {
      // make struct member
      pst[i].ppsz = (char**)malloc(2 * sizeof(char*));
      for(int j = 0; j < 2; j++) {
        // make member area
        pst[i].ppsz[j] = (char*)malloc(11 * sizeof(char));
        lstrcpy(pst[i].ppsz[j], STRINGS[i][j]);
      }
    }
    // debug
    printf("---------------------\n");
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 2; j++) {
        printf("pst[%d].ppsz[%d] >> %s\n", i, j, pst[i].ppsz[j]);
      }
    }
    printf("---------------------\n");
    // free memory
    freeif(pst);
  }
  _getch();
  return 0;
}
927デフォルトの名無しさん:2007/09/07(金) 11:31:28
>>922-924
固定サイズなら無理にmalloc()/free()を使う必要はないと思うぞ。
typedef struct _st {
char ppsz[2][10];
} st;
でいいやん。
928デフォルトの名無しさん:2007/09/07(金) 11:36:05
メモリ動的確保/解放の練習とかじゃない?>>927
929デフォルトの名無しさん:2007/09/11(火) 22:08:23
C89 の規格票ってどこかで見れない?
930デフォルトの名無しさん:2007/09/11(火) 22:38:18
過去ログにURLが転がってたような。
印刷できないPDFでよければJISCのサイトで閲覧できる
931デフォルトの名無しさん:2007/09/11(火) 23:14:17
JISCって過去の規格票まで見れたっけ?
現在有効のX3010:2003はC99相当だけど。
932デフォルトの名無しさん:2007/09/11(火) 23:19:57
最新版以外はなかったことになるから。
ふつーはそれでも問題ないんだよ。非互換な改訂しなければ。
JIS漢字とかJIS漢字とかJIS漢字とか、あとJIS漢字とか
933デフォルトの名無しさん:2007/09/12(水) 00:31:37
そうなんだよな。それにJIS漢字も追加で。
934デフォルトの名無しさん:2007/09/12(水) 00:53:09
おいおい、JIS漢字を忘れちゃいないか?
935デフォルトの名無しさん:2007/09/12(水) 01:01:56
規格票
936デフォルトの名無しさん:2007/09/12(水) 01:15:46
無粋なヤツだな
937デフォルトの名無しさん:2007/09/12(水) 02:38:12
無粋
938デフォルトの名無しさん:2007/09/12(水) 03:48:23
今日学校でプロトタイプ宣言に関する問題を習ったんですが
問題:再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい
プロトタイプ宣言:int Power(int x,int n);

実行画面
文字列入力==>2
文字列入力==>0
値:1

文字列入力==>2
文字列入力==>3
値:8

文字列入力==>6
文字列入力==>4
値:1296

この問題だけどうしても判らなくて困っています^^;
何方かわかる方がいましたら教えてください

939デフォルトの名無しさん :2007/09/12(水) 04:00:01
>>938
int Power(int x,int n)
{
int i;
int sum = 1;
if(n == 0)
return 1;
else{
for(i = n; i > 0; i--)
sum *= x;
}
return sum;
}
940デフォルトの名無しさん:2007/09/12(水) 04:04:51
再帰じゃないじゃん
941939:2007/09/12(水) 04:06:40
あ、再帰だったんだ、出直してくる。
942939:2007/09/12(水) 04:16:22
再帰版
int Power(int x,int n)
{
if(n == 0)
return 1;
else
return x*Power(x,n-1);
}
943デフォルトの名無しさん:2007/09/12(水) 04:21:11
int Power(int x, int n)
{
if(x == 0 && n == 0) exit(1);
if(n < 0) return 0;
if(n == 0) return 1;
return Power(x, n - 1) * x;
}
944デフォルトの名無しさん:2007/09/12(水) 06:51:52
static int power(int x, int n, int v)
{
if (n < 0) return 0;
if (n == 0) return v;
return power(x, n - 1, x * v);
}
int Power(int x, int n) {return power(x, n, 1);}
これで末尾再帰で最適化が利いてループになるはず。
945デフォルトの名無しさん:2007/09/13(木) 09:13:16
特定の範囲の整数(例えば1〜10000)だけを入力させたいのですが、
fgets()使用時に桁溢れを完全に抑止することは可能ですか?

char *buf[10];
unsigned int value;
while(1)
{
fgets(buf, 10, stdin);

〜isdigit()とかで数値のみかを判定して、atoi()でvalueに格納してbreak〜

}
fprintf(stdout, "%u\n", value);

こんな感じで書いてるんですが、わざと入力を10桁以上にしたときに入力バッファに残ってしまってうまくいきません。
何かイイ方法あるでしょうか?(fflush(stdin)は無しで)
946945:2007/09/13(木) 09:14:22
>>945
× char *buf[10]
○ char buf[10]
orz
947デフォルトの名無しさん:2007/09/13(木) 09:19:36
>>945
fgets の後で
fscanf(stdin,"%*[0-9]");
948デフォルトの名無しさん:2007/09/13(木) 11:18:05
>>947
通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?
949デフォルトの名無しさん:2007/09/13(木) 11:22:42
fflush(stdin)と置換可能な関数を自作するのは厳しい
とはいえ、fflush(stdin)は未定義
面倒くさいけど、fgetsで読み込んだbufに'\n'が有るかチェックして、
'\n'が無いなら'\n'が出てくるまで読み捨てることになる

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

int main(void)
{
  char buf[10];
  char *p;
  int c;
  while (fgets(buf, sizeof buf, stdin) != NULL) {
    if ((p = strchr(buf, '\n')) != NULL) {
      *p = '\0';
    }
    else {
      while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
    }
    puts(buf);
  }
  return 0;
}
950デフォルトの名無しさん:2007/09/13(木) 12:33:40
もっといい方法あるのかもしれないけど、こんなんでどうかな

int get_unsigned(unsigned *v)
{
  char buf[16];
  char *p;
  int c;

  if (fgets(buf, sizeof buf, stdin) == NULL)
    return EOF;
  if (strchr(buf, '\n') == NULL)
    while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
  *v = strtoul(buf, &p, 10);
  return *p;
}

int main(void)
{
  unsigned val;
  int end;

  while (printf(">>"), (end = get_unsigned(&val)) != EOF) {
    if (end == '\0' || isdigit(end)) printf("W:入力が切り捨てられました.\n");
    else if (end != '\n')      printf("W:不正文字がありました. '%c'\n", end);
    if (val < 1 || 10000 < val)   printf("W:入力範囲外です.\n");
    printf("<<%u\n", val);
  }
  return 0;
}
951945:2007/09/13(木) 13:55:57
>>947-950
ありがとうございます。おかげさまで解決しました。
952デフォルトの名無しさん:2007/09/13(木) 14:16:48
scanf("%*[^\n]%*c");なんてできなかったっけ?
953デフォルトの名無しさん:2007/09/13(木) 14:20:57
>>952
それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり
読み捨てることが出来ない。
scanf("%*[^\n]"); scanf("%*c");
ならおk
954デフォルトの名無しさん:2007/09/15(土) 02:24:20
うーん勉強になるなあ。ここに書き込みしている人達て通算何年くらい勉強してきたんですか。
俺には凄過ぎっすよ。
955デフォルトの名無しさん:2007/09/15(土) 02:26:09
名プログラマになる為に猛勉強だぜ。
956デフォルトの名無しさん:2007/09/15(土) 09:32:53
ここは知ったかばっかり
957デフォルトの名無しさん:2007/09/17(月) 15:28:45
知ったかな〜知ったかな〜うにゃうにゃ
はれってほれってひれんら〜
958デフォルトの名無しさん:2007/09/17(月) 18:37:19
>>957 迂闊にも笑ってしまいますた
959デフォルトの名無しさん:2007/09/18(火) 17:05:01
SHRT_MIN >= INT_MIN && SHRT_MAX <= INT_MAX 常に成り立つと思うのですが
sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?
960デフォルトの名無しさん:2007/09/18(火) 17:07:56
はい。
961デフォルトの名無しさん:2007/09/18(火) 18:26:29
ANSI C99準拠の標準ライブラリについて、詳しく説明しているサイトありませんか?
素直に本買ったほうがいいでしょうか?
962デフォルトの名無しさん:2007/09/18(火) 18:35:59
っ[JIS X 3010]
963961:2007/09/18(火) 19:21:05
>>962
ありがとう。でも高いねコレ…素直に本買います。
964デフォルトの名無しさん:2007/09/18(火) 20:47:24
965デフォルトの名無しさん:2007/09/19(水) 15:50:54
設計(PAD)でファイルを開いて読み込んでファイルの情報を構造体に格納するのって
どうやるか教えていただけませんか?
966デフォルトの名無しさん:2007/09/19(水) 16:06:49
たぶんCの話じゃないと思うぞ
967デフォルトの名無しさん:2007/09/19(水) 17:28:22
今C言語の勉強をしていて、ファイルの情報を構造体に格納して
それをメモリに展開するってゆーのをやってまして
968デフォルトの名無しさん:2007/09/19(水) 17:30:39
fread
969デフォルトの名無しさん:2007/09/19(水) 17:32:23
そんなもんファイルにどういう形式でデータが記録されていて
格納する構造体はどんなものかによるとしか言えん
970デフォルトの名無しさん:2007/09/19(水) 17:34:00
PADは関係あるのか?
971デフォルトの名無しさん:2007/09/19(水) 17:34:18
JIS X 3010-1993 を読むと

3.4
バイト
実行環境の基本文字集合の任意の要素を保持するために十分な大きさを持つデータ記憶域の単位。
1 バイト中のビット数は,処理系定義とする。
5.2.4.2.1
CHAR_BIT
ビットフィールドでない最小オブジェクト(バイト)におけるビット数
6.3.3.4
sizeof演算子の結果は,そのオペランドの(バイト数での)大きさとする。
sizeof(char) == 1

となっているのですが,ここから char 型オブジェクトのデータ記憶域での大きさは
1 バイトで 1 バイトは CHAR_BIT ビットと判断できるでしょうか?
972デフォルトの名無しさん:2007/09/19(水) 17:36:24
マジっすか。バイト=8bitだと信じてました。
int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・
973967:2007/09/19(水) 17:58:00
今PADの最中なんです。
問題としてはファイルにある社員IDと氏名を構造体に格納し、
メモリに展開するというものです
974デフォルトの名無しさん:2007/09/19(水) 18:06:04
C言語の規格改定って今でも進められているんでしょうか?
975デフォルトの名無しさん:2007/09/19(水) 18:47:35
>>971
そう思って構わないはず。

>>973
常に8ビットを表す単位が必要なら、オクテットを使う。
976967:2007/09/19(水) 19:03:57
文字の長さが2-10で変化するってどゆ意味ですか?
そもそも文字の長さってなんですか?
977デフォルトの名無しさん:2007/09/19(水) 19:09:43
次スレテンプレ

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132



このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
http://pc11.2ch.net/test/read.cgi/tech/1187944110/
978デフォルトの名無しさん:2007/09/19(水) 19:15:34
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
                                 ↓
GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は

何か気になるから変えてくれたら嬉しい
979デフォルトの名無しさん:2007/09/19(水) 19:58:51
>>937
お前前も来たな
帰れ
いや
死ね
980デフォルトの名無しさん:2007/09/19(水) 19:59:21
>>973だった
981デフォルトの名無しさん:2007/09/19(水) 20:22:18
(char *)*char_list->c
という式が表す値は
(char *)型のポインタcが指しているデータ
(char *)型のデータ
のどっちなんでしょうか?
982デフォルトの名無しさん:2007/09/19(水) 20:37:54
演算子の優先順位から、(char *)(*(char_list->c))
983デフォルトの名無しさん:2007/09/19(水) 20:47:49
>>982
その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている
みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは
別物として扱われているんでしょうか?
984デフォルトの名無しさん:2007/09/19(水) 20:52:45
そりゃ意味からして別物だろうが
985デフォルトの名無しさん:2007/09/19(水) 20:56:27
ついでに言うと、関数呼出演算子の括弧も別物。
986デフォルトの名無しさん:2007/09/19(水) 21:04:19
>>985
全部一緒くたにして考えてました。orz
最後にもう一つ、

char c = 'a';
char *pc = &c
printf("%d\n", (int)*pc);

予想では上のコードは4バイト分の整数を出力すると思ったのに、
実際にやってみたらa一つ分の97しか出力しませんでした。
これは何故なんでしょうか?
987デフォルトの名無しさん:2007/09/19(水) 21:06:35
何を言ってるんだ、お前は
988デフォルトの名無しさん:2007/09/19(水) 21:07:45
*(int*)pc とでもやりたかったのか?
989デフォルトの名無しさん:2007/09/19(水) 21:09:33
>>986
何が言いたいか分からん。
97は2桁だろ。何が出て欲しいんだか。
990デフォルトの名無しさん:2007/09/19(水) 21:11:57
>>986
charだろうがintだろうが10進数で出力したら97だろ
991デフォルトの名無しさん:2007/09/19(水) 21:13:08
>>986
>4バイト分の整数
この部分を具体例をあげつつ詳細に説明してくれ
992デフォルトの名無しさん:2007/09/19(水) 21:15:21
char c = 'a';
char *pc = &c;
printf("%d\n", sizeof((int)*pc));

4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ
993デフォルトの名無しさん:2007/09/19(水) 21:16:26
>>986
これでどうだ。
printf("%.8X\n", (unsigned int)(unsigned char)*pc);
ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。
994デフォルトの名無しさん:2007/09/19(水) 22:21:24
>>973
PADって構造化フローチャートみたいなやつ?
995デフォルトの名無しさん:2007/09/19(水) 22:24:57
>>994
大学でやった記憶が
996デフォルトの名無しさん:2007/09/20(木) 02:05:03
99というのはISOの年度だからANSI C99というのはおかしくないか
997デフォルトの名無しさん:2007/09/20(木) 02:12:12
おかしいね。
ANSI C89
ISO C90
ISO C95(と言っていいのか)
ISO C99
998デフォルトの名無しさん:2007/09/20(木) 08:33:04
個人的にはC89とかC99の前にANSIとかISOとか付いてる時点でキモい。
まぁキモいだけで、だからどうしようってほどじゃないけど。
999デフォルトの名無しさん:2007/09/20(木) 09:18:44
埋め
1000デフォルトの名無しさん:2007/09/20(木) 09:20:04
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。