【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
585 :
デフォルトの名無しさん :
2007/06/22(金) 04:01:03 ファイルサイズの取得方法って、「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のファイルサイズ */
586 :
585 :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ってキャストできそうだからサイズの値が取れると思ったのですが。。。 */ ========================
環境依存の方法を使うのが普通じゃないかな。
>>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のファイルサイズが巨大だった場合、
どうなっちゃんですか?
標準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だろうが、とにかくある値を 超えてるか超えてないかだけわかればいいのですが。。。
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて エラーが出るかを拾うってのはどうだろう やっぱ2GB超えちゃうとダメなのかな
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、 stat64 なりで調べた方がいいと思うよ。
ていうか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等を使う。
そもそもfseek()はエラーを返せない。
598 :
デフォルトの名無しさん :2007/06/22(金) 09:54:27
stat構造体のst_sizeはoff_t型だから、…… long int型になるのかな、 そうするとlong int型に格納しきれないバイト数のファイルは 桁あふれするのかな? 0? 再現させてテストしたいが 環境が手元にないのだが。。。。。。
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。 off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。
あ、Windowsだとstatは失敗しないな。たぶん。 で、結果がどうなるかは処理系(ライブラリ)依存。 何故ならstatはエミュレーションしているので、 stat("c:/*", &st)が成功してしまったりする処理系があるから。
ファイルサイズというのが何を意味するかによる。 OS上でのサイズのことなら、 そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。 Cの入出力関数で読んだときのバイト数のことなら、 読めないようなものは無視してしまえばいい。 まあ、なんでファイルサイズを知りたいのかってとこまで 一回さかのぼって考えてみるのも一計。
サイズは「サイズ」以外ないだろ。 「文字数」とは違う。
昔のCP/Mはセクタ数でしか管理してなかったなぁ
>>603 今のCP/Mとやらはどう管理しているの?
>>603 最終セクタの0x1Aまでがファイルの「サイズ」だろ?
でもそれは管理されてない。
ん、「管理されているかどうか」という話なの? 「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの? だったらそれでいいけど。
あっと、 「ファイルのサイズとはOSに管理されていなければならない」という 話の流れとは関係ないことを言いたかっただけで 「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、 テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。 統一した「ファイルサイズを得る方法」なんてあるわけがない。 あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。
ファイルサイズを取得する関数が標準で用意されなかったのは、 そのあたりが理由なのかな?
>>611 そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。
MS-DOS 1.0 もディレクトリないんだっけ?
汎用機もねーよ
615 :
デフォルトの名無しさん :2007/06/24(日) 22:22:42
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
そのネタ飽きた
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな 128バイトのブロック単位だったからファイルの後ろにはゴミがついていた Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。
リソースフォークの話は出してくるやつが出ると思った リソース/データフォークのサイズもファイルサイズの指定の意味で 書いたんだがわからなかったんだろう
>リソース/データフォークのサイズもファイルサイズの指定の意味で >書いたんだがわからなかったんだろう これ日本語なの?
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。
どうと思う! いや、どうかと思う、だorz
MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに str = "\\" + str; これで全然問題ないのですが、標準のCで char str[MAX_PATH]; strcpy(str, "."); starcat("\\", str); こうするとアクセスバイオレーションが発生します どうしたらええの? strcpy(str, "\.");これでも駄目だった そうそう環境はWinXPSP-2、VC6です
>>623 starcat なる謎の関数の仕様をよーく確認しろ。
星猫
スマンstrcatだったMSDN見ても問題ないと思うのだが? 文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが
>>626 じゃぁ strcat の仕様をよーく確認しやがれこのバ
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。
それでもstarcatならきっとやってくれるさ
MFC 使える環境なら CString か std::string 使えば? そっちの方が幸せになれるよ。セキュリティ的にも。
>>628 ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630 だからMFCなら全然無問題なのだが、Cの事も知りたいからよ
>>626 strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。
>>631 ならリテラル以外で問題が再現するコードを書いてみやがれ
>>631 C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。 しかし、やりたいことがよく判らないからサンプルを書けない。 例えばディレクトリとファイル名を連結したいだけならこうなるのだが。 sprintf(path, "%s\\%s", dir, file)
>>631 どうせ初期化してないのに strcat とかしたんじゃないのか?
元の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にしておいた。
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<>使ったほうがいいよ
MFC使っているならCStringもありさ
strcpy -> strncpy strcat -> strncat sprintf -> snprintf
>>640 残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。 何より楽だし。
バッファオーバーフロー脆弱性の話を聞くたびに、 敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。 それができないなら C++ にしる、と。
>641 C99は未だ存在しないのか・・・
C99 が使える環境では snprintf を使って、 使えない環境なら等価な関数に #define すればいいんじゃない?
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?
VC++ には _snprintf がある。
char *s; FILE *fp = fopen("/dev/null", "w"); size_t len = fprintf(fp, ...); /* 長さを数えてもらう */ fclose(fp); s = malloc(len + 1); sprintf(s, ...); 勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが それぐらいならやっぱりC++を使うべきという結論に
>>648 必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。
問題は移植性の低さだな 標準とはいえC99未対応のCコンパイラは多い
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?
>>652 あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか
その場合は自分でラッパ関数を定義すればいいんじゃないかな?
*BSD LIBCあたりから掻っ払って来りゃええやん。
ねぇねぇおまえらちょっと教えてくんない ファイルの行数を取得する標準関数なんてないよね そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数 数えるとかやってんの? どうよ
そうする
それ以外の方法があるなら是非とも教えてもらいたいもんだ
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++];
こうしてもなおんないんだよねぇこれってどうよ
スマン訂正 int maxLine; 罰char szItem[7][((const int)maxLine++]; 丸char szItem[7][(const int)maxLine++];
C99じゃない限り配列の大きさはコンパイル時に固定=定数
あきらめきれなくて 回避策はないのかと聞いてみる
663 :
デフォルトの名無しさん :2007/07/05(木) 00:09:15
そこらへんの入門書に書いてある。 残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。
>>662 寧ろ、C++でstd::vector使えばいいんじゃない?
ドウシテC99ヲツカワナイノデスカ
ドウシテC99ガフキュウシテルトオモウノデスカ
C99 使うくらいなら C++ 使う
んだな
単項演算子の+って、どう言ったときに役に立つのでしょうか? Cだけの話ではないかもしれませんが。
メジャーなコンパイラでC99に対応してないのってあるの? 俺趣味グラマでgccしか使わんからわからん。
>>672 桁合わせくらいには役に立つことはあるかも。
昔、 #ifdef xx # define SYM 10 #else # define SYM #endif のような時に int num = SYM +0; というような使い方をした覚えがあるような無いような。
マクロ関連で役に立つことがたまにありそうではあるな。
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?
単項+のオペランドも式だし、 単項+のオペランドになれない式もあるだろ。
#ifdef xx # define SYM 10 #else # define SYM 0 #endif では、何故ダメだったのか教えてほしい。
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。 ○×ゲームを作るプログラムを作っていたんですが。 1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。 line1[10]=" 789\n", line2[10]=" 456\n", line3[10]=" 123\n", という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが 何故Tabキー使っては駄目なのか教えていただけませんか?
>>682 書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな
いやコンパイルエラーになるんだろ。 たぶん、構文的に駄目になっているのだろうとしか言えない。 後できちんと規格書に当たってみる。 とりあえず、文字列リテラルの中でタブ文字を表現したければ、 タブを直接入力する代わりに\tを使えばいいと言っておく。
>>683 ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。
strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?
>>684 指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686 ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)
環境もないのに実習なんて言うのか?
>>688 ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。
>>689 今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める
>>691 今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\
とりあえずお前はCの勉強する前にPCの勉強をしろ。
やっぱり聞くんじゃなかったかな。 もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。
寿司食いたい
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?
スペースをタブにできるなら、スペースを\tにもできるだろう
700 :
デフォルトの名無しさん :2007/07/12(木) 10:53:19
ファイルがテキストファイルかバイナリーファイルかを Cプログラムで判定したいのだけれど、方法を教えてくれ。
>>700 ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。
つ[/usr/bin/file]
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。
そもそもテキストファイルとは何なのか。
SUBをファイルの終わりとして認識すべきファイルのこと。
発注元がどうしても欲しい、というのでフローチャートを書いているのですが #if を if文とフローチャート上で区別する方法はありますか? 具体的には #if defined(MODEL_xx) if (zzz) { processYYY(); } #endif ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。
両方納品するんならフローチャートは2セット要るんじゃないか?
>>708 定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。
if文は実行時に働くものだからフローチャートの一部だが #ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで よってフローチャートもその数だけ必要になる っていうかCの話かこれ?
712 :
デフォルトの名無しさん :2007/07/13(金) 16:31:31
char型のcharってcharacterの略で%nのnはnewlineの略ですよね? こういう略してある語の元の単語が載ってるサイトってないですかね? 探してもこの2つしかわからなくて
念のために言っとくが\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かなとも思うんですが
とおりがかりだけど、 hはheader、fはformat、intはinteger(整数)、doubuleはDouble Precision(倍精度(実数))、 %f はfloat(floating point 浮動小数点)、%c はcharacter、%sはstring、\t はTAB あとは想像通り、辞書ひいてもいいし。 まあ誰かまとめてくれるかな。
printfはprint formatted
stdioはStandard IO(InputOutput)
714は挙げていないけど、%gはe、fの次の文字だからという理由。 ANSI C言語辞典にはそう書いてある。
>>712 新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。
俺あれもってるけど、一度も引いたことないわ manかぐぐればいいだけの話しだしな
721 :
名無し :2007/07/14(土) 05:10:14
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; } ではダメみたいなんよ よくわからない、たすけておくれ
マルチすんな
elxe これなに
C99で、 for(int i = 0; i < 10; i++) /* something */ ; みたいにforの中で変数宣言できますけど、 while( int i = f() ) /* something */ ; みたいなことはできないんですね。不便。
>>727 C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど
条件判定のところで変数宣言して何の意味があるんだい?
判定のたびにブチ壊しては作り直すのであろうよ おほほほ
731 :
727 :2007/07/16(月) 22:49:06
while( obj = nextObj() ) { // something } みたいなことしません?
int obj; while( obj = nextObj() ) { // something } でいいじゃんとか思ったら負け?
>>727 for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。
対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。
for(i=0;i=f();i=0){ とでも書いとけ
そんなにループ内だけで変数を使いたいなら関数にでもしてしまえばよろしい
736 :
734 :2007/07/16(月) 23:10:44
まちがったが訂正はしない わかって おねがい
{ int obj; while( obj = nextObj() ) { // something } } みたいにブロックで囲めばいいじゃん。
つーか for (int obj; obj = nextObj(); ) { // something; } でおk
はんのーした香具師らは負け組
>>733 >それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?
>>740 そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。
>>741 > while に書いたステートメント
> 変数の宣言は値を返さない
現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。
なんというマジレスの嵐
for (;int i = hoge();)
寿司食いたい
C++でできるんだから、C99でできるようにすることも可能だったとは思う。
どういう経緯があったかは知らないが、結果として制定されたC99では、
できるようになっていないけど。
以下チラシの裏
これは、こういうコード
Tok* ct;
if (ct = gettok()) { /* ... */ }
に対して、条件式のところで変数を宣言できれば、未初期化の変数を減らせ、
ついでに条件文内に変数の有効範囲を閉じ込められるというアイデアだった。
if (Tok* ct = gettok())
{
// ctはスコープ内
}
// ctはスコープ外
参考『C++の設計と進化』 3.11.5.2 条件文の中の宣言
C++では、C以上に初期化と代入が区別されるので、
>>737-738 のような書き換えができないこともある。
それもあって、俺はたまに使うし、C++からは無くなれと思わない。
この文でコンパイルできるんだが結果が正しくでません。 どこか誤りありますか? #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); } }
>>748 「何をやろうとしているのか、また何が正しいのかは
コードから読みやがれ」ってか。大した奴だ。
…とか思ってたら、ひと目で変な記述が。
>if( a == b == c ){
>if( a >= b >= c ){
:(略)
そんな書き方できない。
面倒でも
if (a == b && b == c) {
if (a >= b && b >= c) {
:(略)
と書かないと。
>>749 スマソ。そしてありがとう。
そうやったら、できました。
751 :
c言語初心者 :2007/07/17(火) 19:38:16
突然すいません!!学校の問題でc言語の問題が3つ出たのですがまったくわからないです。問題書き込むんで誰か解いてもらえませんか? よろしくお願いします。
OKとりあえず宿題スレ逝け。
753 :
c言語初心者 :2007/07/17(火) 19:43:22
宿題すれってあるんですか??
754 :
デフォルトの名無しさん :2007/07/17(火) 19:45:11
755 :
c言語初心者 :2007/07/17(火) 19:50:54
ここならしていただけるんですか??
756 :
デフォルトの名無しさん :2007/07/17(火) 19:53:03
ただし回答者の気が向いたら 気に入られなければスルーされる
もう立ってるね
761 :
デフォルトの名無しさん :2007/07/19(木) 01:02:10
cの入門書とポインタ攻略本を読んでほぼ理解できたんだけど次に何読めばいいかわからん 何かお勧めの参考書教えてください
アルゴリズムとデータ構造
30日でできる! OS自作入門
K&R
アルゴリズム辞典
>>761 >読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。
ケースセンシティブにもう少しもないものだ
たしかにw まぁ、ポインタは理解したんだろう。 面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。
えーとintの配列へのポインタを受け取って関数へのポインタへのポインタを返す関数・・・
typedef って便利だよな。
俺は、typedef void (*func)(int)っていうのを見て 何をtypedefしてんだ?と思った時期もありました。
void (*const *foo(const int (*p)[10]))(void (T::*)(int (U::*)()));
typedef様様だな
>>771 それ何をtypedefしてるの?
初めて見た
>>774 intの引数が1つで値を返さない関数を func にtypedef
例えば、、、
void foo(int);
func f = foo;
とか
なるほどー 自分に使う機会が来るかはわからんけど覚えておこう thx
777 :
デフォルトの名無しさん :2007/07/20(金) 18:12:25
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
typedef int (U::*FP1)(); typedef void (T::*FP2)(FP1); typedef void (*FP3)(FP2); const FP3* foo(const int p[][10]);
「作る」じゃなくて「操作する」だな。すまん。
そういえばどうしてローテートはないんだろ
>>777 コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?
不定期テンプレ
ただの荒らし あるいは風物詩 あるいは新参の受ける洗礼
>>783 ローテートをサポートしない CPU も多いんじゃね?
知らんけど。
&a->bって&(a->b)か(&a)->bかどっち?
「演算子 順位」とかでぐぐれ
&(a->b)ですね。ありがとう。
つか、やってみりゃ分かるだろ。
その態度は良くない。 ・規格を読んで正しい挙動を把握する ・実際に処理系で実験してみる ・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)
規格読んで来て、理解して&(a->b)を常に&a->bとか書くように なる人と仕事組んだら俺泣きそうw
&a->b は普通に書くだろw
>・規格を読んで正しい挙動を把握する =「演算子 順位」とかでぐぐれ >・実際に処理系で実験してみる =つか、やってみりゃ分かるだろ。
正しい挙動を把握してから実験で確認するのと、 実験して結果を見て予想するのは、大きな違いがある。
その態度はよくない。 実験して結果を見て法則を導くスタイルが無いと。
はいはい、そうですね
実験した後に確かめた方がいい。
演算子の優先順位は、処理系依存ってことはないだろうから、実験でいいんじゃね?
規格読む→実験する→2chで煽りつつ確かめる
規格読む前に実験した方が実感しやすいな。
その通りだ。実験して、壁にぶち当たって、その壁をぶっ壊せ! フラグメンテーションエラーで、メモリーもぶっ壊せ! そして泣きながら規格読んで実感だ!
>>804 >そして泣きながら規格読んで実感だ!
お疲れ様です。
C++ だが、export は色んな意味で泣ける。
俺の胸でなけ
俺の下であがけ
実験だけじゃ優先順位なのか結合の方向なのか解らない、と。 まぁ、&a->bくらいなら、どっちでもいいけど。
&a->b が (&a)->b と見做されるんだとしたら 皆 a.b と書くと思うんだわ。
&a.bじゃないか?
終電まで仕事してて疲れてた。
>>811 はお願いだから忘れて
CD-R に保存しました
石版に刻みました
DNAに移植しました
アカシックレコードに刻まれました。
C++ の STL に感動しました C言語で STL に似たことをしたいと思ったらどうすれば良いですか?
C++に乗り換える。
やっぱりそれが確実ですよね
マクロを使う。
そういえば、templateが使えない時代にはgeneric.hってのがあったな
FILE *t=tmpfile(); で作成したtを fclose(t); してもいいですか? なんか危なくて、こわいです。
なんで危ないんだよw まあ、またその内容を使うことがあるなら閉じちゃだめだが。
ええ! fclose(t)ってやってよかったの?
C言語辞典見てみたけど、やっていいみたい。
用がなくなったら閉じないとダメだろ。常考。
tmpfile()は、そのファイルがクローズされたか、またはプログラムが終了したときに 自動的に削除されるファイルを生成し、そのストリームへのポインタを返す。 何も問題はない。
自分ならOOライクにたとえ1行で済んだとしても生成と破棄を対にして両方の関数を作る
なら別にC使わないで他のOO使えばいいじゃん。頭かたいね。
生成と破棄を対にすることがOOライクだと思うくらいならそれでもいいんじゃね?
ぷっ
>>822 面白そうなものがあるんですね
GPLじゃないところもイイ!
ただ、著作表示だけはしないといけないようですね
いや修正BSDって中のファイルに書いてるじゃん
////(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の 両方で定義されている」と警告されます。 これはどういうことで何が悪いのでしょうか? グローバル関数を使いながら、ファイルを分割してみたいのですがどうしたらいいのでしょうか?
>>837 ////(main.cpp)
#include "main.h"
#include "move.cpp"←いらなくね?
int X; ~
840 :
837 :2007/08/05(日) 18:15:40
>>838 それを消したら、未定義の関数moveを呼び出したなどとエラーだ出ます。
>>839 掲示板に書き込む時に簡略化したら忘れてしまいました。
>>837 宣言と定義の区別をしっかりと。ヘッダには変数や関数の宣言だけ置くこと。
プロトタイプ宣言でググれ
////(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を操作する処理) } ////
まちがった ////(main.cpp) #include "main.h" #include "move.h" int X; int main(){ move(); } ////
ね
テスト
>>843-844 俺なら、
extern int X; はmove.h側に入れて、int X; は move.cpp に入れて、
main.hは消すかな。細かいことですんませんね。
>>837 安心しなさい。あなたの方が、うちの元請けより優秀です!
ちゃんと #ifndef使うあたりが。
すいません最近c言語を習い始めたのですが、円の半径(double型)をあたえて、円周の長さと と円の面積を表示するプログラムがどうしてもできません。 どうすればよいのでしょうか?
お前さんが書いたコードを晒せ
その前に初心者スレに行け。
>>848 が出来ない可能性
・scanfで&忘れ、%dを指定している
・式中にint型とかを使っている
・まともに調べてない、読んでない
・円周の長さ、円の面積が分からない
#define PI 3
ゆとりな定義だな
#define ENSYUURITSU 3
>>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);
どうでもいいが円周はlな方がしっくりくる
#include <math.h> double pi = atan(1) * 4;
>857 ありがとうございます。あと家でc言語使えるようにしようと思って microsoft.net Framework version 2.0 再頒布可能パッケージ microsoft.net Framework version 2.0 SDK 日本語版 をダウンロードしたのですが友達の話によると microsoft.net Framework version 2.0 日本語版 language pack が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが どうやったら手に入るのでしょうか? すごい初歩的な質問ですいません。
>>858 初歩的以前にスレ違いなんだが自覚あるか?
math.hインクルードするならM_PI使ったほうが早い
ここは世界レベルでの標準に関わる内容のスレです。標準的ではない手法はお断りします。
M_PIが無い最近の環境って何がある?
つ MS Visual C++
gccでもansi適合モードにするとスルーされる。
VC++は定義されてないのがデフォで、_USE_MATH_DEFINESを定義すると使えるようだね
関数から構造体を受けることはできたんですが,構造体を渡して,受け取る関数を作りたいのですが どのように記述すれば良いですか struct Initset getinfo(struct Initset *syoki2) ↑のような記述はできないですか?
それでいいです
869 :
867 :2007/08/24(金) 15:10:45
入力した自然数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; } 上のものは自分がわからないながらも作ったものです。 でもできませんでした。 改善点お願いします。
while(a < n) { と a += 1; の間に if (n % a == 0) { printf("%d\n", a); } とか入れてみ まあ約数なら 1/2 以上はありえないから省くとかするけどな。 入力とかはとりあえずscanfかなんかで。
>>870 まず処理の流れ自体がわかってないだろう
もう一回教科書を読み直せ
入力した自然数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; } 上のものは自分がわからないながらも作ったものです。 でもできませんでした。 改善点お願いします。
改善というか、まずプログラムを使わずに 正の約数を全て列挙する方法すら分かってないように思える。 プログラム以前の問題。
どういう順番での実行を予想してるんだ?
870ですが約数をすべて列挙する方法ってnまでの数ですべて割る条件式つくって それが成立するやつを表示するプログラムでよいのですか?
よくない
「nまで」がどこからnまでなのか、まら「まで」とは未満なのか以下なのか 「全て割る条件式」とは何のことなのか 本当にわかってるか?
すいません。たとえば500だったら1,2,3,4,5,6,7,8、という風に して割り切れる、割り切れないのif文を作ればよいのかと思ったのですがそれではだめですか?
>>879 そこまではいい
問題は「割り切れる」の意味がわかってるかどうかだ
自然数nの正の約数を列挙する ↓ 自然数nを割り切れる正の整数を列挙する ↓ 自然数nを割り切れる可能性のある正の整数すべてについて、 その数で本当に割り切れるかどうかを調べ、 割り切れるときはその数を画面に表示する 一応言っとくが「割り切れる」とは除算して余りが出ないことだからな
とりあえず「nをaで割り切れるならば」を意味するif文を書いてみろ
ありがとうございます。実は今もう一個悩んでいるのがあってかけ算の九九の表をつくるというプログラムをやっているのですが 自分なりにつくったのは /* 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; } なのですが表になりません。おとといから始めたばかりなのでちんぷんかんぷんです。 いろいろとすいませんがご指導をお願いします。
一 個 ず つ や れ
>883 初心者スレ逝け
>>883 printf("%d\n",a*b); → printf("%3d",a*b);
がんばれ!
>>883 処理の流れ、つまり「まずこれが起きて、次にこれが起きて……」という順番をたどりながら考えろ。
漠然と書いて走らせて出来なかったーわかんないーじゃいつまでも理解できん。
そしてここは基本的に「ある程度Cがわかってる人」が「標準C」というものについて少しつっこんだ質問をする場所だから
まずは初心者スレへ行くことをお勧めする。
>886 ありがとうございます。できました。
だって約数はその数自身も含まれるから ありえないなんて事はありえませんもん
まあ順番を問わなければもっと速いが if(!n%a){ if(n/a < a)break; printf("%d\n",a); if(n/a != a)printf("%d\n",n/a) }
!
893 :
デフォルトの名無しさん :2007/09/03(月) 18:47:21
bool a,b,c,d,e,f; とか int a,b,c,d,e,f; みたいに並べて書いた変数を一気に同じ値で初期化する書き方ってありますか? あったら教えてください。
a = b = c = d = e = f = 0;
895 :
デフォルトの名無しさん :2007/09/03(月) 18:57:51
>>893 static int a,b,c,d,e,f;
これで全部0で初期化される。
struct foo {
int a,b,c,d,e,f;
} foo = {0};
これでも全部0で初期化されるな。
まぁ、横着するなってことだ。
int a,b,c,d,e,f;a = b = c = d = e = f = 0;
それほど面白くはない
>>898 そんなので笑えるなんて君の人生楽しそうでうらやましいわ
>>893 同じ値で初期化するような変数なら同じような扱いをするんだろう
配列で宣言しろ
過疎ってますね ビットシフトでも入れてみますか?
聞くことがないならそれでよし わざわざ増やさんでいいw
ビットシフト入れたかったのに・・・
じゃビットシフト絡みで MMXの様に、4Byteの整数型を1Byte単位で飽和演算する方法を 昔どこかで見た気がするんだけど、どうやるんだっけ 0xFEFEFEFE に 各バイトに3を加算 ↓ 0xFFFFFFFF 画像処理に使おうと思ったけど思い出せない
MMX対応のプロセッサを使う。
907 :
905 :2007/09/06(木) 21:56:42
if文を任意の位置でぬけるbreakとかcontinueみたいな 命令ってないですか?
>>908 こんなイメージ?
if (...) {
...;
if (...) ifBreak;
...;
}
これくらいしか手がない気が。
if (...) {
...;
if (...) goto endIf;
...;
}
endIf:
goto
do { if(...) { } else if(...) { .... break; } } while(0) とか
俺がよく使うのは if(...){ do{ ... if(...) break; ... }while(0); }
何その隠れgoto
んな隠れgoto使うくらいなら、素直にgotoで書いた方が未だ見やすい希ガス。 そもそも、ロジックを整理すべきじゃないかとは思うが。
if (...){ ... if(!...){ ... } } でいいんじゃないの?
int i; scanf("%d",&i); while( i<1 || i>9999 ) { printf("もう一度入力してください"); scanf("%d",&i); } iに数字じゃなく、aaaaなどの文字列を入れると”もう一度入力〜”がえんえんループ表示されてしまいます。 これを防ぐにはどうしたらいいのでしょうか?
919 :
917 :2007/09/07(金) 01:23:41
>>918 その方法もどうかと思うな。
scanf()は行単位の処理じゃないのに、バッファクリアだけ行単位になってしまう。
それではどうすればいいかってのは、このスレでガイシュツです。
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) { ← ○
>>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;
}
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; }
>>922-924 固定サイズなら無理にmalloc()/free()を使う必要はないと思うぞ。
typedef struct _st {
char ppsz[2][10];
} st;
でいいやん。
メモリ動的確保/解放の練習とかじゃない?
>>927
C89 の規格票ってどこかで見れない?
過去ログにURLが転がってたような。 印刷できないPDFでよければJISCのサイトで閲覧できる
JISCって過去の規格票まで見れたっけ? 現在有効のX3010:2003はC99相当だけど。
最新版以外はなかったことになるから。 ふつーはそれでも問題ないんだよ。非互換な改訂しなければ。 JIS漢字とかJIS漢字とかJIS漢字とか、あとJIS漢字とか
そうなんだよな。それにJIS漢字も追加で。
おいおい、JIS漢字を忘れちゃいないか?
規格票
無粋なヤツだな
無粋
938 :
デフォルトの名無しさん :2007/09/12(水) 03:48:23
今日学校でプロトタイプ宣言に関する問題を習ったんですが 問題:再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい プロトタイプ宣言:int Power(int x,int n); 実行画面 文字列入力==>2 文字列入力==>0 値:1 文字列入力==>2 文字列入力==>3 値:8 文字列入力==>6 文字列入力==>4 値:1296 この問題だけどうしても判らなくて困っています^^; 何方かわかる方がいましたら教えてください
>>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;
}
再帰じゃないじゃん
941 :
939 :2007/09/12(水) 04:06:40
あ、再帰だったんだ、出直してくる。
942 :
939 :2007/09/12(水) 04:16:22
再帰版 int Power(int x,int n) { if(n == 0) return 1; else return x*Power(x,n-1); }
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; }
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);} これで末尾再帰で最適化が利いてループになるはず。
特定の範囲の整数(例えば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)は無しで)
946 :
945 :2007/09/13(木) 09:14:22
>>945 × char *buf[10]
○ char buf[10]
orz
>>945 fgets の後で
fscanf(stdin,"%*[0-9]");
>>947 通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?
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; }
もっといい方法あるのかもしれないけど、こんなんでどうかな 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; }
951 :
945 :2007/09/13(木) 13:55:57
scanf("%*[^\n]%*c");なんてできなかったっけ?
>>952 それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり
読み捨てることが出来ない。
scanf("%*[^\n]"); scanf("%*c");
ならおk
954 :
デフォルトの名無しさん :2007/09/15(土) 02:24:20
うーん勉強になるなあ。ここに書き込みしている人達て通算何年くらい勉強してきたんですか。 俺には凄過ぎっすよ。
955 :
デフォルトの名無しさん :2007/09/15(土) 02:26:09
名プログラマになる為に猛勉強だぜ。
ここは知ったかばっかり
知ったかな〜知ったかな〜うにゃうにゃ はれってほれってひれんら〜
SHRT_MIN >= INT_MIN && SHRT_MAX <= INT_MAX 常に成り立つと思うのですが sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?
はい。
ANSI C99準拠の標準ライブラリについて、詳しく説明しているサイトありませんか? 素直に本買ったほうがいいでしょうか?
っ[JIS X 3010]
963 :
961 :2007/09/18(火) 19:21:05
>>962 ありがとう。でも高いねコレ…素直に本買います。
965 :
デフォルトの名無しさん :2007/09/19(水) 15:50:54
設計(PAD)でファイルを開いて読み込んでファイルの情報を構造体に格納するのって どうやるか教えていただけませんか?
たぶんCの話じゃないと思うぞ
967 :
デフォルトの名無しさん :2007/09/19(水) 17:28:22
今C言語の勉強をしていて、ファイルの情報を構造体に格納して それをメモリに展開するってゆーのをやってまして
fread
そんなもんファイルにどういう形式でデータが記録されていて 格納する構造体はどんなものかによるとしか言えん
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 ビットと判断できるでしょうか?
マジっすか。バイト=8bitだと信じてました。 int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・
973 :
967 :2007/09/19(水) 17:58:00
今PADの最中なんです。 問題としてはファイルにある社員IDと氏名を構造体に格納し、 メモリに展開するというものです
C言語の規格改定って今でも進められているんでしょうか?
>>971 そう思って構わないはず。
>>973 常に8ビットを表す単位が必要なら、オクテットを使う。
976 :
967 :2007/09/19(水) 19:03:57
文字の長さが2-10で変化するってどゆ意味ですか? そもそも文字の長さってなんですか?
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は ↓ GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は 何か気になるから変えてくれたら嬉しい
(char *)*char_list->c という式が表す値は (char *)型のポインタcが指しているデータ (char *)型のデータ のどっちなんでしょうか?
演算子の優先順位から、(char *)(*(char_list->c))
>>982 その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている
みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは
別物として扱われているんでしょうか?
そりゃ意味からして別物だろうが
ついでに言うと、関数呼出演算子の括弧も別物。
>>985 全部一緒くたにして考えてました。orz
最後にもう一つ、
char c = 'a';
char *pc = &c
printf("%d\n", (int)*pc);
予想では上のコードは4バイト分の整数を出力すると思ったのに、
実際にやってみたらa一つ分の97しか出力しませんでした。
これは何故なんでしょうか?
何を言ってるんだ、お前は
*(int*)pc とでもやりたかったのか?
>>986 何が言いたいか分からん。
97は2桁だろ。何が出て欲しいんだか。
>>986 charだろうがintだろうが10進数で出力したら97だろ
>>986 >4バイト分の整数
この部分を具体例をあげつつ詳細に説明してくれ
char c = 'a'; char *pc = &c; printf("%d\n", sizeof((int)*pc)); 4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ
>>986 これでどうだ。
printf("%.8X\n", (unsigned int)(unsigned char)*pc);
ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。
>>973 PADって構造化フローチャートみたいなやつ?
99というのはISOの年度だからANSI C99というのはおかしくないか
おかしいね。 ANSI C89 ISO C90 ISO C95(と言っていいのか) ISO C99
個人的にはC89とかC99の前にANSIとかISOとか付いてる時点でキモい。 まぁキモいだけで、だからどうしようってほどじゃないけど。
埋め
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。