【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
at TECH
[前50を表示]
550:デフォルトの名無しさん
07/05/20 06:03:52
整数12ビットの列を扱うには、構造体のビットフィールドを使うしかないのでしょうか?
551:デフォルトの名無しさん
07/05/20 06:33:12
16bitなり32bitなりで読み込んで
必要な部分だけマスクして取りだしゃいい。
それでも外部に記録されているものを読み書きする場合には
エンディアン依存は避けられないが
ビットフィールドよりはまし。
552:デフォルトの名無しさん
07/05/20 13:14:54
charを介して変換すればマシンのエンディアンには依存しない
どう変換するかは元データのエンディアンによる(6ビット1バイトだとすれば)
553:デフォルトの名無しさん
07/05/20 17:36:09
どうせ外部とのI/Fなら、コンパイラもセットで依存し捲くってもいいというコンセンサスを得た上で
ビットフィールドを使うのが一番楽だと思うが。
#後は野とn(ry
554:デフォルトの名無しさん
07/05/20 22:00:06
そしてBeOSの悲劇
555:デフォルトの名無しさん
07/05/21 16:02:25
1000までの素数を求めて出力するプログラムの作成を教えてください。
mod使う方法で。
556:デフォルトの名無しさん
07/05/21 16:14:04
mod 素数 C言語あたりでググったほうがはやい
557:デフォルトの名無しさん
07/05/21 16:15:12
つか、Cでmod使えとは。
>>555
宿題スレへ行け。そしてもう来るな。
558:デフォルトの名無しさん
07/05/21 16:18:27
#define mod(a, b) ((a) % (b))
559:デフォルトの名無しさん
07/05/21 17:27:29
inline int mod(int a, int b) { return (a % b); }
560:デフォルトの名無しさん
07/06/04 00:15:06
ファイルの行数を数えてその分配列を確保したいのですが、
このような配列の使い方(foo関数の部分)をしていいのでしょうか?
malloc()した方がいいんでしょうか。
よろしくお願いします。
int main()
{
int line_count;
file_line_count(&line_count); //ファイルの行数を数える関数
foo(line_count);
}
void foo(int line_count) //foo関数
{
int array[line_count]:
^^^^^^^^^^^^^^
:
:
}
561:デフォルトの名無しさん
07/06/04 00:33:19
>>560
対象とする規格による。いわゆる C99 なら標準で認められている。
C99 より前の C の規格や現行の C++ では認められていない。
562:デフォルトの名無しさん
07/06/04 00:34:16
>>560
そのような可変長の配列はC99で採用された仕様だから、
一部のC89信者に蛇蠍の如く忌み嫌われる。
まぁ、C99限定でいいのなら使っていいと思うよ。
但し、スタックサイズに注意すること。
563:デフォルトの名無しさん
07/06/04 02:47:44
関係ないけどファイルの行数を数える関数で戻り値使わないでポインタ渡しなのが気持ち悪い・・・
564:デフォルトの名無しさん
07/06/04 02:51:17
昔あった、関数は全部voidで宣言しろっていうとんでもないコーディングルールを思い出した
565:デフォルトの名無しさん
07/06/04 04:45:24
>>564
戻り値を表示できるデバッガが無かったとか?
566:デフォルトの名無しさん
07/06/04 08:22:36
でも結構しっかりしたC用のAPIだと戻り値はエラー状態を表すのに使われていて、
本来戻り値になるであろうものもポインタの引数になるというのはよく見かける。
567:デフォルトの名無しさん
07/06/04 08:33:37
MPI とかそんな感じだったような。
568:デフォルトの名無しさん
07/06/04 09:41:44
余計 void はありえないなw
569:デフォルトの名無しさん
07/06/04 11:30:55
戻り値のチェックを忘れる馬鹿がいるから、とかじゃね?
570:デフォルトの名無しさん
07/06/04 11:36:05
is〜な問い合わせ関数でも、戻り void でステートをポインタ引数に取るのか…
たまんねーコーディング規約だな
571:デフォルトの名無しさん
07/06/04 23:25:39
>>570
うんにゃ
ポインタは渡さない
後はわかるな?
572:デフォルトの名無しさん
07/06/04 23:33:04
よりよってグローバル変数かよ。
573:572
07/06/04 23:33:55
"に"が抜けた。
×よりよってグローバル変数かよ。
○よりによってグローバル変数かよ。
574:デフォルトの名無しさん
07/06/04 23:52:32
>>572-573が妙にイラッと来る
575:デフォルトの名無しさん
07/06/05 00:02:58
×>>572-573が妙にイラッと来る
○>>572-573が妙にムラッと来る
576:560
07/06/05 00:03:24
>>561
>>562
有難うございます。
色々つっこまれてる。(;゚□゚)
577:デフォルトの名無しさん
07/06/05 05:00:17
>>571
まあ、N88-BASIC のコードを移植するプロジェクトならアリかもしれんが・・・。
578:デフォルトの名無しさん
07/06/05 13:40:27
>>572
eax だってグローバル変数だー (i86系)
579:デフォルトの名無しさん
07/06/05 13:42:30
スマン環境依存スレじゃなかった
580:デフォルトの名無しさん
07/06/05 13:42:38
>>578
いくらなんでもスレ違い。どっか他所でやってくれ。
581:デフォルトの名無しさん
07/06/05 13:53:48
レジスタはスレッド切り替わる時に退避されるからスレッドセーフで、
グローバル変数なんかとは格が違う。
582:デフォルトの名無しさん
07/06/05 14:01:55
>>581
>580
583:デフォルトの名無しさん
07/06/13 23:07:43
スレリンク(prog板:758番)
char *data = 30000;
↑これに対して↓を行うと
gcc -fsyntax-only -x c -std=c99 -pedantic -Wall -Wextra
:1: warning: initialization makes pointer from integer without a cast
と警告は出るけどエラーにはならない。あれ?と思って規格を見た。
6.7.8 Initialization p11 に
"the same type constraints and conversions as for simple assignment apply"
とあったので 6.5.16.1 Simple assignment の Constraints を見たけど、
左辺ポインタで右辺が整数というのは認められないように見える。
規格ではエラーになるべきなんじゃないの?
ちなみに C++ では思ったとおりエラーになった。
584:デフォルトの名無しさん
07/06/13 23:09:15
暗黙の・・・
585:デフォルトの名無しさん
07/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
07/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:デフォルトの名無しさん
07/06/22 04:02:02
環境依存の方法を使うのが普通じゃないかな。
588:デフォルトの名無しさん
07/06/22 04:04:05
>>586
全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。
589:デフォルトの名無しさん
07/06/22 04:14:58
fpos_tって別の変数にキャストしたりするとき困らない?
fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。
590:デフォルトの名無しさん
07/06/22 04:19:29
横からすみません。
この>>585って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?
591:デフォルトの名無しさん
07/06/22 05:16:26
標準Cでは2GBを超えるファイルのサイズを知る手段はないって結論になる。
fpos_tがキャスト可能であることは保障されていないことだし。
ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?
592:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/22 07:49:47
相乗り質問ですいませんが
ファイルサイズ自体を知りたいのではなくて
ファイルサイズがある一定値を超えているか否かを判定したい場合も、
やはりstatなりftellなりでバイトサイズを一度取得してから
if文で判定するしかないですよね。
2GBだろうが3GBだろうが、とにかくある値を
超えてるか超えてないかだけわかればいいのですが。。。
594:デフォルトの名無しさん
07/06/22 08:16:12
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて
エラーが出るかを拾うってのはどうだろう
やっぱ2GB超えちゃうとダメなのかな
595:デフォルトの名無しさん
07/06/22 08:36:48
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、
stat64 なりで調べた方がいいと思うよ。
596:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/22 09:31:14
そもそもfseek()はエラーを返せない。
598:デフォルトの名無しさん
07/06/22 09:54:27
stat構造体のst_sizeはoff_t型だから、……
long int型になるのかな、
そうするとlong int型に格納しきれないバイト数のファイルは
桁あふれするのかな? 0? 再現させてテストしたいが
環境が手元にないのだが。。。。。。
599:デフォルトの名無しさん
07/06/22 10:00:42
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。
off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。
600:デフォルトの名無しさん
07/06/22 10:07:58
あ、Windowsだとstatは失敗しないな。たぶん。
で、結果がどうなるかは処理系(ライブラリ)依存。
何故ならstatはエミュレーションしているので、
stat("c:/*", &st)が成功してしまったりする処理系があるから。
601:デフォルトの名無しさん
07/06/22 11:44:19
ファイルサイズというのが何を意味するかによる。
OS上でのサイズのことなら、
そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。
Cの入出力関数で読んだときのバイト数のことなら、
読めないようなものは無視してしまえばいい。
まあ、なんでファイルサイズを知りたいのかってとこまで
一回さかのぼって考えてみるのも一計。
602:デフォルトの名無しさん
07/06/22 22:25:44
サイズは「サイズ」以外ないだろ。
「文字数」とは違う。
603:デフォルトの名無しさん
07/06/23 08:17:34
昔のCP/Mはセクタ数でしか管理してなかったなぁ
604:デフォルトの名無しさん
07/06/23 08:53:01
>>603
今のCP/Mとやらはどう管理しているの?
605:デフォルトの名無しさん
07/06/23 09:23:37
>>603
最終セクタの0x1Aまでがファイルの「サイズ」だろ?
606:デフォルトの名無しさん
07/06/23 09:45:36
でもそれは管理されてない。
607:デフォルトの名無しさん
07/06/23 09:54:38
ん、「管理されているかどうか」という話なの?
「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの?
だったらそれでいいけど。
608:デフォルトの名無しさん
07/06/23 09:57:38
あっと、
「ファイルのサイズとはOSに管理されていなければならない」という
話の流れとは関係ないことを言いたかっただけで
「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。
609:デフォルトの名無しさん
07/06/23 10:25:40
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。
610:デフォルトの名無しさん
07/06/24 03:19:11
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、
テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。
統一した「ファイルサイズを得る方法」なんてあるわけがない。
あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。
611:デフォルトの名無しさん
07/06/24 03:23:51
ファイルサイズを取得する関数が標準で用意されなかったのは、
そのあたりが理由なのかな?
612:デフォルトの名無しさん
07/06/24 04:03:56
>>611
そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。
613:デフォルトの名無しさん
07/06/24 04:31:09
MS-DOS 1.0 もディレクトリないんだっけ?
614:デフォルトの名無しさん
07/06/24 04:43:31
汎用機もねーよ
615:デフォルトの名無しさん
07/06/24 22:22:42
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
616:デフォルトの名無しさん
07/06/24 22:24:17
そのネタ飽きた
617:デフォルトの名無しさん
07/06/25 10:05:04
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな
128バイトのブロック単位だったからファイルの後ろにはゴミがついていた
Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・
618:デフォルトの名無しさん
07/06/25 10:55:57
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。
619:デフォルトの名無しさん
07/06/25 11:58:13
リソースフォークの話は出してくるやつが出ると思った
リソース/データフォークのサイズもファイルサイズの指定の意味で
書いたんだがわからなかったんだろう
620:デフォルトの名無しさん
07/06/25 15:09:30
>リソース/データフォークのサイズもファイルサイズの指定の意味で
>書いたんだがわからなかったんだろう
これ日本語なの?
621:デフォルトの名無しさん
07/06/25 19:06:14
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。
622:デフォルトの名無しさん
07/06/25 19:07:17
どうと思う!
いや、どうかと思う、だorz
623:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/01 14:41:45
>>623
starcat なる謎の関数の仕様をよーく確認しろ。
625:デフォルトの名無しさん
07/07/01 14:42:52
星猫
626:デフォルトの名無しさん
07/07/01 14:46:52
スマンstrcatだったMSDN見ても問題ないと思うのだが?
文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが
627:デフォルトの名無しさん
07/07/01 14:48:00
>>626
じゃぁ strcat の仕様をよーく確認しやがれこのバ
628:デフォルトの名無しさん
07/07/01 14:48:55
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。
629:デフォルトの名無しさん
07/07/01 14:50:02
それでもstarcatならきっとやってくれるさ
630:デフォルトの名無しさん
07/07/01 14:50:05
MFC 使える環境なら CString か std::string 使えば?
そっちの方が幸せになれるよ。セキュリティ的にも。
631:デフォルトの名無しさん
07/07/01 14:56:52
>>628
ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630
だからMFCなら全然無問題なのだが、Cの事も知りたいからよ
632:デフォルトの名無しさん
07/07/01 14:56:54
>>626
strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。
633:デフォルトの名無しさん
07/07/01 14:59:06
>>631
ならリテラル以外で問題が再現するコードを書いてみやがれ
634:デフォルトの名無しさん
07/07/01 15:00:41
>>631
C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。
635:デフォルトの名無しさん
07/07/01 15:04:06
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。
しかし、やりたいことがよく判らないからサンプルを書けない。
例えばディレクトリとファイル名を連結したいだけならこうなるのだが。
sprintf(path, "%s\\%s", dir, file)
636:デフォルトの名無しさん
07/07/01 15:08:05
>>631
どうせ初期化してないのに strcat とかしたんじゃないのか?
637:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/01 15:53:40
MFC使っているならCStringもありさ
640:デフォルトの名無しさん
07/07/01 19:19:12
strcpy -> strncpy
strcat -> strncat
sprintf -> snprintf
641:デフォルトの名無しさん
07/07/01 20:09:50
>>640
残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。
642:デフォルトの名無しさん
07/07/01 21:07:18
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。
何より楽だし。
643:デフォルトの名無しさん
07/07/01 22:28:15
バッファオーバーフロー脆弱性の話を聞くたびに、
敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。
それができないなら C++ にしる、と。
644:デフォルトの名無しさん
07/07/01 23:19:51
>641
C99は未だ存在しないのか・・・
645:デフォルトの名無しさん
07/07/01 23:22:59
C99 が使える環境では snprintf を使って、
使えない環境なら等価な関数に #define すればいいんじゃない?
646:デフォルトの名無しさん
07/07/01 23:26:40
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?
647:デフォルトの名無しさん
07/07/01 23:33:00
VC++ には _snprintf がある。
648:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/02 00:38:37
>>648
必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。
650:デフォルトの名無しさん
07/07/02 00:48:37
>>649
そいつらの代替実装の話だろ。
651:デフォルトの名無しさん
07/07/02 00:48:40
問題は移植性の低さだな
標準とはいえC99未対応のCコンパイラは多い
652:デフォルトの名無しさん
07/07/02 01:00:52
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?
653:デフォルトの名無しさん
07/07/02 01:09:55
>>652
あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか
654:デフォルトの名無しさん
07/07/02 03:06:17
その場合は自分でラッパ関数を定義すればいいんじゃないかな?
655:デフォルトの名無しさん
07/07/02 21:29:01
*BSD LIBCあたりから掻っ払って来りゃええやん。
656:デフォルトの名無しさん
07/07/04 22:59:02
ねぇねぇおまえらちょっと教えてくんない
ファイルの行数を取得する標準関数なんてないよね
そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数
数えるとかやってんの?
どうよ
657:デフォルトの名無しさん
07/07/04 23:03:13
そうする
658:デフォルトの名無しさん
07/07/04 23:34:14
それ以外の方法があるなら是非とも教えてもらいたいもんだ
659:デフォルトの名無しさん
07/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とか調べてURLリンク(support.microsoft.com)
char szItem[7][((const int)maxLine++];
こうしてもなおんないんだよねぇこれってどうよ
660:デフォルトの名無しさん
07/07/04 23:52:13
スマン訂正
int maxLine;
罰char szItem[7][((const int)maxLine++];
丸char szItem[7][(const int)maxLine++];
661:デフォルトの名無しさん
07/07/04 23:59:58
C99じゃない限り配列の大きさはコンパイル時に固定=定数
662:デフォルトの名無しさん
07/07/05 00:07:53
あきらめきれなくて
回避策はないのかと聞いてみる
663:デフォルトの名無しさん
07/07/05 00:09:15
URLリンク(www23.atwiki.jp)
のwikiに載っていたリサージュのプログラムで
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
の2の値を自由に変えられる(自分で入力できる)ように
したいんですけど、どうやったらいいですか?
664:デフォルトの名無しさん
07/07/05 00:10:28
>>662
malloc使えばいいんじゃない
665:デフォルトの名無しさん
07/07/05 00:12:44
>>664
クワシク
666:デフォルトの名無しさん
07/07/05 00:17:10
そこらへんの入門書に書いてある。
残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。
667:デフォルトの名無しさん
07/07/05 00:53:10
>>662
寧ろ、C++でstd::vector使えばいいんじゃない?
668:デフォルトの名無しさん
07/07/05 01:32:50
ドウシテC99ヲツカワナイノデスカ
669:デフォルトの名無しさん
07/07/05 16:48:51
ドウシテC99ガフキュウシテルトオモウノデスカ
670:デフォルトの名無しさん
07/07/05 16:50:55
C99 使うくらいなら C++ 使う
671:デフォルトの名無しさん
07/07/05 16:52:17
んだな
672:デフォルトの名無しさん
07/07/05 23:13:16
単項演算子の+って、どう言ったときに役に立つのでしょうか?
Cだけの話ではないかもしれませんが。
673:デフォルトの名無しさん
07/07/05 23:13:35
メジャーなコンパイラでC99に対応してないのってあるの?
俺趣味グラマでgccしか使わんからわからん。
674:デフォルトの名無しさん
07/07/05 23:16:17
>>673
VC++
675:デフォルトの名無しさん
07/07/05 23:20:05
>>672
桁合わせくらいには役に立つことはあるかも。
676:デフォルトの名無しさん
07/07/05 23:47:34
>>672
-があるから+も装備したらしい
677:デフォルトの名無しさん
07/07/06 00:45:33
昔、
#ifdef xx
# define SYM 10
#else
# define SYM
#endif
のような時に
int num = SYM +0;
というような使い方をした覚えがあるような無いような。
678:デフォルトの名無しさん
07/07/06 01:20:07
マクロ関連で役に立つことがたまにありそうではあるな。
679:デフォルトの名無しさん
07/07/06 01:35:03
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?
680:デフォルトの名無しさん
07/07/06 01:36:20
単項+のオペランドも式だし、
単項+のオペランドになれない式もあるだろ。
681:デフォルトの名無しさん
07/07/07 03:44:31
#ifdef xx
# define SYM 10
#else
# define SYM 0
#endif
では、何故ダメだったのか教えてほしい。
682:デフォルトの名無しさん
07/07/09 22:11:51
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。
○×ゲームを作るプログラムを作っていたんですが。
1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。
line1[10]=" 789\n",
line2[10]=" 456\n",
line3[10]=" 123\n",
という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが
何故Tabキー使っては駄目なのか教えていただけませんか?
683:デフォルトの名無しさん
07/07/09 22:17:17
>>682
書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな
684:デフォルトの名無しさん
07/07/09 22:37:32
いやコンパイルエラーになるんだろ。
たぶん、構文的に駄目になっているのだろうとしか言えない。
後できちんと規格書に当たってみる。
とりあえず、文字列リテラルの中でタブ文字を表現したければ、
タブを直接入力する代わりに\tを使えばいいと言っておく。
685:デフォルトの名無しさん
07/07/09 22:44:18
>>683
ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。
strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?
686:デフォルトの名無しさん
07/07/09 22:48:07
>>685
やってみたほうがよく分かる
687:デフォルトの名無しさん
07/07/09 23:05:02
>>684
指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686
ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)
688:デフォルトの名無しさん
07/07/09 23:12:54
環境もないのに実習なんて言うのか?
689:デフォルトの名無しさん
07/07/09 23:28:53
>>688
ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。
690:デフォルトの名無しさん
07/07/09 23:30:22
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。
691:デフォルトの名無しさん
07/07/09 23:32:15
>>689
今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める
692:デフォルトの名無しさん
07/07/09 23:36:48
>>691
今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\
693:デフォルトの名無しさん
07/07/09 23:38:11
とりあえずお前はCの勉強する前にPCの勉強をしろ。
694:デフォルトの名無しさん
07/07/09 23:40:29
>>692
Windows Vista と予想
695:デフォルトの名無しさん
07/07/09 23:49:11
やっぱり聞くんじゃなかったかな。
もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。
696:デフォルトの名無しさん
07/07/09 23:54:59
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。
697:デフォルトの名無しさん
07/07/09 23:59:16
寿司食いたい
698:デフォルトの名無しさん
07/07/10 09:13:41
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?
699:デフォルトの名無しさん
07/07/10 10:29:56
スペースをタブにできるなら、スペースを\tにもできるだろう
700:デフォルトの名無しさん
07/07/12 10:53:19
ファイルがテキストファイルかバイナリーファイルかを
Cプログラムで判定したいのだけれど、方法を教えてくれ。
701:デフォルトの名無しさん
07/07/12 11:01:37
>>700
ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。
702:デフォルトの名無しさん
07/07/12 11:23:16
つ[/usr/bin/file]
703:デフォルトの名無しさん
07/07/12 11:33:10
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど
それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。
704:デフォルトの名無しさん
07/07/12 12:26:31
>>702
ここをどこだと思ってるんだ
705:デフォルトの名無しさん
07/07/12 12:27:18
そもそもテキストファイルとは何なのか。
706:デフォルトの名無しさん
07/07/12 12:28:40
SUBをファイルの終わりとして認識すべきファイルのこと。
707:デフォルトの名無しさん
07/07/12 15:25:59
>>706
CP/M の世界から、ようこそ!
708:デフォルトの名無しさん
07/07/13 00:46:50
発注元がどうしても欲しい、というのでフローチャートを書いているのですが
#if を if文とフローチャート上で区別する方法はありますか?
具体的には
#if defined(MODEL_xx)
if (zzz) {
processYYY();
}
#endif
ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。
709:デフォルトの名無しさん
07/07/13 00:58:46
両方納品するんならフローチャートは2セット要るんじゃないか?
710:デフォルトの名無しさん
07/07/13 09:42:40
>>708
定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。
711:デフォルトの名無しさん
07/07/13 10:21:15
if文は実行時に働くものだからフローチャートの一部だが
#ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで
よってフローチャートもその数だけ必要になる
っていうかCの話かこれ?
712:デフォルトの名無しさん
07/07/13 16:31:31
char型のcharってcharacterの略で%nのnはnewlineの略ですよね?
こういう略してある語の元の単語が載ってるサイトってないですかね?
探してもこの2つしかわからなくて
713:デフォルトの名無しさん
07/07/13 16:36:42
念のために言っとくが\nな
語なんてそんなに多くないから何がわからないか聞けばここで全部答えてもいいぞ(一回にまとめるなら)
714:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/13 20:07:17
printfはprint formatted
717:デフォルトの名無しさん
07/07/13 20:26:52
stdioはStandard IO(InputOutput)
718:デフォルトの名無しさん
07/07/13 20:42:49
714は挙げていないけど、%gはe、fの次の文字だからという理由。
ANSI C言語辞典にはそう書いてある。
719:デフォルトの名無しさん
07/07/13 22:22:38
>>712
新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。
720:デフォルトの名無しさん
07/07/14 00:13:43
俺あれもってるけど、一度も引いたことないわ
manかぐぐればいいだけの話しだしな
721:名無し
07/07/14 05:10:14
URLリンク(hpcgi3.nifty.com)
ここの「ファイル入出力」ってやつ分かりません。
助けてください
722:デフォルトの名無しさん
07/07/14 05:18:33
>>721
初心者スレへどうぞ。
723:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/16 03:37:42
マルチすんな
725:デフォルトの名無しさん
07/07/16 10:19:32
elxe
これなに
726:デフォルトの名無しさん
07/07/16 10:23:46
マルチ先で指摘済み
スレリンク(tech板)
727:デフォルトの名無しさん
07/07/16 21:36:40
C99で、
for(int i = 0; i < 10; i++) /* something */ ;
みたいにforの中で変数宣言できますけど、
while( int i = f() ) /* something */ ;
みたいなことはできないんですね。不便。
728:デフォルトの名無しさん
07/07/16 22:26:34
>>727
C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど
729:デフォルトの名無しさん
07/07/16 22:27:05
条件判定のところで変数宣言して何の意味があるんだい?
730:デフォルトの名無しさん
07/07/16 22:28:33
判定のたびにブチ壊しては作り直すのであろうよ
おほほほ
731:727
07/07/16 22:49:06
while( obj = nextObj() ) {
// something
}
みたいなことしません?
732:デフォルトの名無しさん
07/07/16 22:55:17
int obj;
while( obj = nextObj() ) {
// something
}
でいいじゃんとか思ったら負け?
733:デフォルトの名無しさん
07/07/16 23:03:09
>>727
for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。
対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。
734:デフォルトの名無しさん
07/07/16 23:04:35
for(i=0;i=f();i=0){
とでも書いとけ
735:デフォルトの名無しさん
07/07/16 23:08:04
そんなにループ内だけで変数を使いたいなら関数にでもしてしまえばよろしい
736:734
07/07/16 23:10:44
まちがったが訂正はしない
わかって
おねがい
737:デフォルトの名無しさん
07/07/16 23:15:49
{
int obj;
while( obj = nextObj() ) {
// something
}
}
みたいにブロックで囲めばいいじゃん。
738:デフォルトの名無しさん
07/07/16 23:25:36
つーか
for (int obj; obj = nextObj(); ) {
// something;
}
でおk
739:デフォルトの名無しさん
07/07/17 08:18:31
はんのーした香具師らは負け組
740:デフォルトの名無しさん
07/07/17 10:40:12
>>733
>それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?
741:デフォルトの名無しさん
07/07/17 15:04:07
>>740
そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。
742:デフォルトの名無しさん
07/07/17 15:10:43
>>741
> while に書いたステートメント
> 変数の宣言は値を返さない
現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。
743:デフォルトの名無しさん
07/07/17 16:31:46
なんというマジレスの嵐
744:デフォルトの名無しさん
07/07/17 17:23:12
for (;int i = hoge();)
745:デフォルトの名無しさん
07/07/17 17:32:03
寿司食いたい
746:デフォルトの名無しさん
07/07/17 17:35:08
>>745
ガリでも食ってろ
747:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/17 19:16:46
>>749
スマソ。そしてありがとう。
そうやったら、できました。
751:c言語初心者
07/07/17 19:38:16
突然すいません!!学校の問題でc言語の問題が3つ出たのですがまったくわからないです。問題書き込むんで誰か解いてもらえませんか?
よろしくお願いします。
752:デフォルトの名無しさん
07/07/17 19:40:08
OKとりあえず宿題スレ逝け。
753:c言語初心者
07/07/17 19:43:22
宿題すれってあるんですか??
754:デフォルトの名無しさん
07/07/17 19:45:11
C言語なら俺に聞け(入門篇) Part 16
スレリンク(tech板)
755:c言語初心者
07/07/17 19:50:54
ここならしていただけるんですか??
756:デフォルトの名無しさん
07/07/17 19:53:03
>>755
>>751
> 学校の問題
C/C++の宿題を片付けます 93代目
スレリンク(tech板)
757:デフォルトの名無しさん
07/07/17 19:55:22
ただし回答者の気が向いたら
気に入られなければスルーされる
758:デフォルトの名無しさん
07/07/18 05:49:19
スレ立てられなかった。誰かキボン。
スレタイ: 【初心者歓迎】C/C++室 Ver.40【環境依存OK】
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
age 推奨ですが、自己判断で。
◆ 前スレ: 【初心者歓迎】C/C++室 Ver.39【環境依存OK】
スレリンク(tech板)
◆ アップローダー (質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
759:デフォルトの名無しさん
07/07/18 11:05:17
>>758
何故このスレで……
760:デフォルトの名無しさん
07/07/18 13:58:47
もう立ってるね
761:デフォルトの名無しさん
07/07/19 01:02:10
cの入門書とポインタ攻略本を読んでほぼ理解できたんだけど次に何読めばいいかわからん
何かお勧めの参考書教えてください
762:デフォルトの名無しさん
07/07/19 01:05:40
アルゴリズムとデータ構造
763:デフォルトの名無しさん
07/07/19 01:10:14
30日でできる! OS自作入門
764:デフォルトの名無しさん
07/07/19 01:13:03
K&R
765:デフォルトの名無しさん
07/07/19 01:41:38
アルゴリズム辞典
766:デフォルトの名無しさん
07/07/19 10:10:47
>>761
>読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。
767:デフォルトの名無しさん
07/07/19 21:12:03
ケースセンシティブにもう少しもないものだ
768:デフォルトの名無しさん
07/07/20 01:15:22
たしかにw
まぁ、ポインタは理解したんだろう。
面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。
769:デフォルトの名無しさん
07/07/20 01:38:29
えーとintの配列へのポインタを受け取って関数へのポインタへのポインタを返す関数・・・
770:デフォルトの名無しさん
07/07/20 11:12:34
typedef って便利だよな。
771:デフォルトの名無しさん
07/07/20 13:33:33
俺は、typedef void (*func)(int)っていうのを見て
何をtypedefしてんだ?と思った時期もありました。
772:デフォルトの名無しさん
07/07/20 16:53:23
void (*const *foo(const int (*p)[10]))(void (T::*)(int (U::*)()));
773:デフォルトの名無しさん
07/07/20 17:03:50
typedef様様だな
774:デフォルトの名無しさん
07/07/20 17:16:19
>>771
それ何をtypedefしてるの?
初めて見た
775:デフォルトの名無しさん
07/07/20 17:29:32
>>774
intの引数が1つで値を返さない関数を func にtypedef
例えば、、、
void foo(int);
func f = foo;
とか
776:デフォルトの名無しさん
07/07/20 17:38:57
なるほどー
自分に使う機会が来るかはわからんけど覚えておこう
thx
777:デフォルトの名無しさん
07/07/20 18:12:25
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
778:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/07/20 20:18:26
>>777
ビットフラグのクリアとか?
780:デフォルトの名無しさん
07/07/20 20:45:24
>>777
ビットの配列を作るときに使う
781:デフォルトの名無しさん
07/07/20 20:45:55
「作る」じゃなくて「操作する」だな。すまん。
782:デフォルトの名無しさん
07/07/20 21:50:27
>>779-781
ビットシフトはなんの役に立つのでしょうか?
でぐぐれ
783:デフォルトの名無しさん
07/07/20 21:56:19
そういえばどうしてローテートはないんだろ
784:デフォルトの名無しさん
07/07/20 22:20:58
>>777
コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?
785:デフォルトの名無しさん
07/07/20 23:02:06
不定期テンプレ
786:デフォルトの名無しさん
07/07/20 23:14:02
ただの荒らし
あるいは風物詩
あるいは新参の受ける洗礼
787:デフォルトの名無しさん
07/07/21 00:56:47
>>783
ローテートをサポートしない CPU も多いんじゃね?
知らんけど。
788:デフォルトの名無しさん
07/07/21 01:07:00
>>784
少ないなw
789:デフォルトの名無しさん
07/07/21 02:04:14
&a->bって&(a->b)か(&a)->bかどっち?
790:デフォルトの名無しさん
07/07/21 02:09:29
「演算子 順位」とかでぐぐれ
791:デフォルトの名無しさん
07/07/21 02:19:04
&(a->b)ですね。ありがとう。
792:デフォルトの名無しさん
07/07/21 02:25:36
つか、やってみりゃ分かるだろ。
793:デフォルトの名無しさん
07/07/21 02:39:22
その態度は良くない。
・規格を読んで正しい挙動を把握する
・実際に処理系で実験してみる
・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)
794:デフォルトの名無しさん
07/07/21 03:25:22
規格読んで来て、理解して&(a->b)を常に&a->bとか書くように
なる人と仕事組んだら俺泣きそうw
795:デフォルトの名無しさん
07/07/21 04:28:59
&a->b は普通に書くだろw
796:デフォルトの名無しさん
07/07/21 04:41:50
>・規格を読んで正しい挙動を把握する
=「演算子 順位」とかでぐぐれ
>・実際に処理系で実験してみる
=つか、やってみりゃ分かるだろ。
797:デフォルトの名無しさん
07/07/21 04:45:12
正しい挙動を把握してから実験で確認するのと、
実験して結果を見て予想するのは、大きな違いがある。
798:デフォルトの名無しさん
07/07/21 05:26:51
その態度はよくない。
実験して結果を見て法則を導くスタイルが無いと。
799:デフォルトの名無しさん
07/07/21 05:30:11
はいはい、そうですね
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5330日前に更新/213 KB
担当:undef