1 名前:静的領域の名無しさん mailto:sage [2008/08/12(火) 18:23:10 ] C言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 114代目 pc11.2ch.net/test/read.cgi/tech/1216746971/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 33 pc11.2ch.net/test/read.cgi/tech/1217073697/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2 名前:静的領域の名無しさん mailto:sage [2008/08/12(火) 18:24:48 ] しまった宿題スレチェックし忘れた C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/
3 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 18:47:27 ] >>1 乙 といわざるを得ない
4 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 18:59:01 ] 立ったな >>1 乙
5 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 19:35:35 ] C言語を勉強したくて本を買ってテキストエディタに書いて練習してます。 コンパイラがあると便利なのですけど、無料のコンパイラとかあるのでしょうか。
6 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 19:41:20 ] Visual C++ 2008 Express Edition
7 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:20:22 ] >>6 ありがとうございます。 いろいろ検索して、LSI C-86 というものを今インストールしてみました。 まったくの初心者なのでこれで十分かと思ってます。 C言語のことほとんど知らないのですが、DOSプロンプトみたいな画面に 文字が出てくるのですね。びっくりしました。
8 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:25:26 ] 3つの数 int i, j, kを 昇順にソートする一番早い方法はなんですか?
9 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:29:00 ] 変数そのものをソートすることは不可能です
10 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:34:16 ] >>8 入れ子のif/else文を書く
11 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:37:32 ] qsortは無駄ですかね?
12 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:42:27 ] 配列にまず入れろって 話はそれからだ
13 名前:デフォルトの名無しさん [2008/08/12(火) 20:42:36 ] プログラミング始めてみた、一つ疑問があるんだけど printf関数とかって どうやってディスプレイに文字を表示させてるんだ?
14 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:45:27 ] 環境に依存した方法で書かれてます
15 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:47:44 ] >>12 そうしてます。質問の仕方が悪かったです。すいません int data[3]に入れています。
16 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:48:20 ] >>7 LSI-C試食版は(スモールモデル限定だから)大きいプログラムには向かないかもしれません。 あと、フリーならば Borland C か cygwin の gcc があります。
17 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:49:45 ] >>11 generic なかきかたには負けてしまいますが、普通の c でかくなら最速だと思います。枯れているでしょうし。
18 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:51:07 ] int型の配列の比較に使える関数ってありますか? 全要素が同じかどうかわかるようなやつです。 strcmpみたいな
19 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:51:37 ] たった、三つくらいならどんなソート方法でも一緒だから 好きにやれば良いよね
20 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:51:38 ] モニタに表示するにはドライバというプログラムをあーしてこーするんだが OSがドライバとの間の仲介をしてくれる これがハードウェアを操作する手順 printf→OS→ドライバ
21 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:55:05 ] >>11 3件しかデータがないなら、オーバヘッドがある分確実にqsort()は無駄です。 >7 LSI-Cは整数型が16ビットしかないので、学習には全くお勧めできません。 >>18 memcmp()でできますが、自分でループを書いたほうがいいかも知れません。
22 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:55:23 ] >>21 自分でループを書いたほうがいい理由はなんですか?
23 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:58:43 ] >>22 自分でmemcmp()に辿り着けないレベルなら、勉強になるジャマイカ。
24 名前:11 mailto:sage [2008/08/12(火) 21:05:43 ] >>19 >>21 そういわれればはそうですね。
25 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:20:58 ] char *buff1,*buff2;に strcat(buff1,buff2)ってできませんか?
26 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:22:39 ] buff1がbuff2をコピーしうるだけの十分なバッファを指してれば可能
27 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:24:26 ] 実行したらエラーになりました・・・ 対策を教えてください
28 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:26:11 ] >>27 実行しない
29 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:26:30 ] >>25 できますが、事前に充分な格納場所を割り当てることを忘れずに。
30 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:30:57 ] buff1に実体がないとエスパー
31 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:02:52 ] うまくできません・・・ buff1="abc"; buff2="testtest"; みたいに結合前に代入しているんですが・・・
32 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:08:25 ] >>31 だからbuff1に十分な場所がないとだめだとみんなが。 そもそもそれ以前の話だけどね
33 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:12:03 ] そのbuff1の領域をあらかじめ広げておく方法がわかりません。 それ以前の話とはchar buff1="abc"; この宣言がよくないですか?
34 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:14:14 ] 広げるっていうのは char buff1[256]; とか[]の中の数字を大きくするか mallocで動的に確保するかしかないよ
35 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:15:42 ] たぶん色々わかってないから説明が必要なんだろうけど、 俺ツタヤ行くから誰かが教えてくれるはず
36 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:16:05 ] realloc()でもすれば?
37 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:21:11 ] >>36 質問内容から察するに 前提条件から書かないと 質問者には意味が分からないはず
38 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:30:39 ] realloc()があればmalloc()もfree()もいらない。
39 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:32:48 ] >>38 何を言っているんだ?
40 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:34:18 ] とりあえず、今日はみんな寝よう
41 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:36:48 ] char * foo = realloc(NULL, 100); // same as char * foo = malloc(100); realloc(foo, 0); // same as free(foo);
42 名前:7 mailto:sage [2008/08/12(火) 22:39:30 ] >>16 >>21 65535までの数しか扱えないみたいですね。 でも、今週から本買って始めた超初心者ですので、とりあえずこれで頑張ってみます。
43 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:40:03 ] >>41 なるほど勉強になった。で、何の話だっけ?
44 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:02:47 ] >>42 別にMSの回し者じゃないが 個人的には>>6 が良いと思うけどなぁ
45 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:40:48 ] rubyみたいに!?も関数名に使えたら便利なのに・・・
46 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:44:17 ] たとえばなにがどう便利になると言うのか
47 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:18:51 ] 関数の外に影響する関数には最後に!つけたり、真偽を返す関数には?をつけたりして可読性をあげるんだよ。あれ便利じゃん?
48 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:21:46 ] そんなもん自分で勝手にサフィクスでもプレフィクスでもつければすむことだろう
49 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:32:12 ] !?がもっともシンプルでもっともわかりやすいんだよ
50 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:35:19 ] >>49 その代わりに否定の!と三項演算子がつかえなくなるのはいやなんですが。
51 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:38:05 ] lispみたいに関数名の最後にpをつければいいじゃん
52 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:42:31 ] >>51 ctype.h関数群の is〜、もありますね。
53 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:54:37 ] >>49 そんなものはただのお前の好みであって便利でもなんでもない
54 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 01:06:02 ] >>50 いや、使えるだろ・・・ くっつけて書かなければ
55 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 01:08:37 ] いちいち空白を入れるのはうざい・・・そう思っていた時期が俺にもありました
56 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:25:39 ] >>54 そう作ればそうでしょうけれども。 現在の仕様では識別子の文字セットと演算子として使用する文字とはまったくかぶらないのでひっつけてかいてもOKなのです。
57 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:47:53 ] !がどういう関数につくのかよくわからないが、?に関しては関数名で自明になるように作るでしょ。 Is〜 Has〜みたいにさ。 ?がついたからわかりやすいんだ!という向きにはひまわりでもやってなさい、といいたい。
58 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 06:21:41 ] まさか関数の命名規則に不満がある人がいるとは思わなかった
59 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 07:41:37 ] コンパイル前にsedで変換すりゃいいだけじゃん。 あ、ゴメン、そういうの出来ないのか、そりゃ〜悪かった。
60 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 07:54:36 ] >>59 IDE使っててそういう発想がなかったのだろうよ。或いはMakefileを書けないとか。 それはさておき。 今のところ$と@は使われていないけれど、変数名なんかに使えたっけ?
61 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 08:57:58 ] [a-zA-Z_][a-zA-Z0-9_]*
62 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:43:24 ] 処理の進行状況を表示したいのですが、 1% 2% ・ ・ 100%みたいに表示するのではなく "1"% ""この数字だけ次々更新していく方法はないんですか?コンソールプログラムです
63 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:47:53 ] >>62 www.kumei.ne.jp/c_lang/intro/no_59.htm
64 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:48:57 ] 簡易的に、\nじゃなくて\r使うとか
65 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:51:30 ] >>62 標準関数では無理 対象となるコンソールのスペックによる
66 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:58:49 ] \rでできました。ありがとうございます
67 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:19:19 ] うわ、いくらこのスレでも>63と>65はものの見事に恥かきっ子w
68 名前:65 mailto:sage [2008/08/13(水) 11:20:30 ] >>67 いや、べつに
69 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:25:29 ] 間違ってもいいから、とにかくいう
70 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:31:07 ] 最後の行という限定条件があるけどね
71 名前:デフォルトの名無しさん [2008/08/13(水) 11:36:11 ] 柴田望洋の明解C言語って本を借りてきたんだけど エディタはどれを使えばいいの? visual C++ってのが無料の統合開発環境らしいんでそれを使おうと思ってるんだけど それでいいですか? CとC++の違いがオブジェクト指向どうこうかいてあったけど プログラムは初めてで何の事だか・・・
72 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:38:52 ] 本が今ひとつであることと、VisualStudioでは標準でC++を作らせようとしていることを除けば特に問題ないかと。 取り敢えず、ソースファイルの拡張子はcppにしないように気をつけてね。 PC自体の知識と意欲があるならLinux使うなりCygwin入れるなりを薦めるけどね。
73 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:39:58 ] >>71 それでいいよ ファイルの拡張子を .c にすればCとして処理される。 標準関数が安全じゃないと警告が出るときがあるけど
74 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:40:12 ] \r知らないくらい許してやって
75 名前:71 mailto:sage [2008/08/13(水) 11:46:14 ] >>72 linuxとかが開発に向いてるってのは聞いたことあるけどプログラム初めてなんで とりあえずお手軽なとこで・・・ >>73 初心者がちまちまやってる分には特に問題なさそうですね どうもありがとうございました。さっそくインストールしてみます。
76 名前:デフォルトの名無しさん [2008/08/13(水) 11:53:19 ] 勝ち誇りage
77 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:08:34 ] VSEE入れてコマンドラインからcl叩く分にはlinuxでgcc使うのと大して変わらんと思うがなあ IDEを使うと便利なんだけど、IDEを使えるようになるまでの苦労というものが初心者にはあるから。。
78 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:43:09 ] 私もVisual C++ 2008 Express Editionをインストールしてみました。 いろんなサイト見て、ひとつ練習にプログラムを作りました。 そのあと次に新しいものを作るとき、また最初からプロジェクトとか 作る必要があるのでしょうか。「新規作成→ファイル」で作れると思ったのですが… 新しいプログラムを作るやり方を教えてください。よろしくお願いします。
79 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:46:24 ] >>78 新規プロジェクトでまずいことでも?
80 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:57:23 ] >>79 いえ、毎回プロジェクトから作っていく以外に方法があるのかと思った次第です。 例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと… 毎回新しくプロジェクトを作るのが当然のことでしたらそれでやるしかありませんので。 特に問題ありません。 今、いつくかのサイトで調べてみましたら、 「作成される実行ファイルは、一つのプロジェクトにつき一つだけです。 」と書いてありました。 毎回プロジェクトから作る必要があるみたいですね。
81 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:01:08 ] >>80 > 例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと… それは可能ですよ。だけど、main関数のあるファイルは追加しない。 追加するとどうなるんだ?mainが2つあるというエラーメッセージが出るんじゃないかな?
82 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:12:24 ] いいかげんスレ違い pc11.2ch.net/test/read.cgi/tech/1217525513/1
83 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:18:19 ] VC++で拡張子が.cのものをコンパイルすると 1>cl : コマンド ライン error D8045 : C ファイル '.\Test.c' を /clr オプションと共にコンパイルできません とエラーになることがあるんですけど対処法を教えてください。
84 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:19:56 ] 素人すぎるだろ プロジェクトとmain関数の意味ググってこいやボケ
85 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:43:21 ] >>83 Win32プロジェクトを作れ
86 名前:デフォルトの名無しさん mailto:yosi0517@gmail.com [2008/08/13(水) 23:15:52 ] Cを覚えるまえにベーシックをやっていたんですがベーシックの頃の癖が抜けません。やはりCから入ったほうがよかったのでしょうか?
87 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:17:50 ] ベーシックの頃の癖ってなんだ?
88 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:19:47 ] 後藤とか?
89 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:20:18 ] グローバル変数じゃないか
90 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:23:33 ] たとえばPRINT""って書いてみたり
91 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:25:43 ] 整数の変数をI%にしちゃうとか
92 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:28:22 ] for i=0 to 9 とか
93 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:30:03 ] どうせポインタがわからないとかそういうんじゃねーの? READ/DATAは当然ないし
94 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:30:42 ] >>84 1プロジェクト複数exeを期待したんだと思うよ コマンドラインから入ったら結構そう期待してしまいそう
95 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:31:27 ] 行の最初に 10 20 30 とか
96 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:32:28 ] 言語の違いなんて気にスンナ ベーシックとFORTRANとC++とJavaとアセンブラの仕事を同時並行した俺がいる こつ、覚えすぎないことw
97 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:33:11 ] GOSUBとかON ERROR GOTO とかかな
98 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:33:54 ] 行番号じゃないのか
99 名前:sage [2008/08/14(木) 02:38:20 ] カンマ区切りのデータを配列に移すとき、 例)abc,def,ghi,jkl.... 皆ならどういう風にするのでしょうか? 条件) ・strtokはなし。 ・分かりやすさ重視。
100 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:41:59 ] そんなもん頭から解釈していく意外にやることなかろう
101 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:45:18 ] 先頭から一文字ずつチェックしてカンマを検出したらその直前までの文字列を格納できる領域を割り付けてコピー以下繰り返し 以外にまっとうで安全な方法があるなら聞きたいわ
102 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:48:23 ] >>101 元データを丸ごと領域確保&コピーしてカンマを\0に置換していったほうがいいんじゃないか?
103 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:53:32 ] strtok使いたくない理由は引用符を特別扱いするからか? それとも多バイト文字を扱うからか? いずれにせよ状態を保持しながら先頭から手動で一文字ずつチェックする以外ないな
104 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 03:08:59 ] awkだと考えるまでも無いんだけどね... 1)複数の、文字列のポインタを格納できる領域を確保(固定サイズである程度大きいものor区切りの数を数える) 2)元の文字列のコピーを作成,区切りを'\0'に置き換えつつ、1)の領域へ区切りの先頭アドレスを格納していく って感じかな
105 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 03:13:54 ] #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int i, arrylength; char basestr[] = "abc,efg,hij,klm, , asjelrhaesh"; char **arry; char *temp; i = 1; temp = basestr; while (temp = strchr(temp, ',')) { temp++; i++; } arry = (char**)malloc(sizeof(char*) * i); arrylength = i; i = 1; temp = basestr; arry[0] = temp; while (temp = strchr(temp, ',')) { *temp = '\0'; temp++; arry[i] = temp; i++; } for (i = 0; i < arrylength; i++) puts(arry[i]); return 0; } 異論は認める
106 名前:デフォルトの名無しさん [2008/08/14(木) 03:26:02 ] for(i=0;i<len;i++){ if(data[i]==','){ j++; continue; } strncat(array[j],data[i],1) }
107 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:52:20 ] カンマで区切るだけでいい(ダブルコーテーションを考慮しない)のなら、sscanf()で%[^,]するのが一番簡単だろ。 カラム数が固定じゃないなら、%[^,],%nで。
108 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 08:06:22 ] 分かりやすさ重視(速度やメモリ効率は無視)なら考えるまでもない。 char** tokbycomma(const char* src) { char** result = NULL; char* tmp; while((tmp = cutbycomma(src)) != NULL){ result = pushback(result, tmp); src += strlen(tmp) + 1; free(tmp); } return result; } cutbycommaとpushbackをどう作ればいいかは自分で考えましょう。
109 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:20:04 ] typedef struct{ double a[10]={0.0} char *mozi; }HOGE; HOGE data[200]; これで宣言したらaは初期化されていますか?
110 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:24:56 ] コンパイルしてみればいい。 typedef struct{ double a[10]={0.0} char *mozi; }HOGE; この段階だと実態は無いのでできない?
111 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:25:47 ] そうですね。できませんねー
112 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:28:51 ] 書くならこっちじゃね? HOGE data[200]; でも仮にかけたとしても200個とか手で書くのか? どうせchar*もNULLでないと困るんだしどこかで memset(data,0x00,sizeof(data)); としておけば全部0でクリアになるよ
113 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:31:09 ] char * cutbycomma(const char * src) { char * tmp = malloc(strlen(src) + 1); int pos; int rtn = sscanf(src, "%[^,\n]%n", tmp, & pos); if (rtn != 1) { /* 抽出不可 */ free(tmp); return NULL; } if (src[pos] != '\0') /* 継続あり */; return tmp; }
114 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:31:25 ] typedef struct{ double a; char *mozi; }HOGE; 構造体はこうでした・・・ for(i=0;i<200;i++){ data[i].a=0.0; } とするのではどっちが早いですか?
115 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:34:00 ] memset()でdoubleが0になることは規格では保証されていない。 それでもいいなら、自前で代入するよりも速いかもしれない。
116 名前:112 mailto:sage [2008/08/14(木) 09:35:42 ] あ、そっかdoubleか、すまん0x00でうめるのはまずいな。 intとか整数型ならいいかもしれんが実数はやめたほうがいい。 よって>>114 のループで
117 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:46:18 ] >>113 毎回使いもしない長さの領域を確保してるじゃん。10点。
118 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:56:03 ] 皆さんのレベルに到達するのに何年ぐらい必要ですか???
119 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:41:01 ] >>118 ひとそれぞれですし、取り組んだ課題によりさまざまな指向性を示すと思いますが、そんなことより、とりあえずやってみましょうよ。
120 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:44:11 ] for(i=0;i<num;i++){ if(条件){ 処理 break; } } この場合のbreak;はif文から抜けるだけですか?それともfor文からも抜けますか?
121 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:52:39 ] for
122 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:53:07 ] break文はfor文やwhile文から抜けるための文です
123 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:47:56 ] まったくの初心者で変な質問してスイマセンが、 今、DOS画面のような画面に計算結果を出力するような練習をしています。 C言語はこういうものだという狭い認識しか無いのですが、 C言語でゲームを作るとかいう場合は、グラフィックで動くソフトか何かを使うのですか? 自分には、「C言語はDOS画面みたいなもので動かす」という固定観念があります。 今のところそれしか見たこと無いので。
124 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:50:29 ] >>123 いやそんなことはないけどね。 ゲーム機の非公式開発なんかもCとかC++でかかれてたりするけど 普通にグラフィック扱ってるし。 むしろフォントの関係上英字が扱えるくらいで日本語とかになると それなりに苦労するくらい。
125 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:07:12 ] 今は、そのDOS画面とやり取りする関数を使ってるだけだからそういういイメージになるんだよ。 まあ標準ライブラリだけだとそうなるけど。
126 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:13:50 ] >>123 あなたは幼稚園程度の英語の知識を身に着けたばかりのような状態です。 例えば不思議の国のアリスを楽しむには、イギリスの生活習慣から当時の政治情勢まで知る必要があるのです。 プログラミング言語も同じようなものです。
127 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:41:09 ] 足し算と補数があれば引き算掛け算割り算を実装できるというのは理解したんですが そのおおもとの、足し算ってどうやって実装してるんでしょうか?
128 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:43:38 ] >>127 CPUにそういう命令があって内部で計算してるの C言語なんかはコンパイルのときにCPUがわかるように変換してる。
129 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:44:55 ] じゃあそのCPUは・・・といわれるとトランジスタを使った足し算用回路が 組まれてて計算してる。
130 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:55:38 ] >>127 半加算器、全加算器でぐぐるといいよ
131 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:35:26 ] HOGE data[200]={0};
132 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:41:19 ] >>131 構造体だとそれなんか警告でるんだけど全部初期化されるのは保証されてるの?
133 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:43:22 ] >>132 それ以前にポインター抱えてる構造体でそんな初期化って
134 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:51:15 ] >>132 警告の意味くらい、理解しなさいよ。 HOGE data[200] = {{0}};
135 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:53:21 ] >>133 ゼロクリアではなく、きちんとヌルポインタで初期化されるよ。
136 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:58:05 ] >>134 それでもでるんですけど
137 名前:1 mailto:sage [2008/08/14(木) 13:58:48 ] いやむしろ悪化してコンパイルすら通らなくなるんですがw 試してから言ってくださいよw
138 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 14:09:51 ] >>136 -- % cat foo.c typedef struct{ double a; char *mozi; }HOGE; HOGE data[200] = {0}; % gcc -c -Wall foo.c foo.c:9: warning: missing braces around initializer foo.c:9: warning: (near initialization for `data[0]') % sed -e 's/{0}/{{0}}/' foo.c > fooz.c % !g:s/foo/fooz gcc -c -Wall fooz.c % gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -- 警告でなくなるけど。
139 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 14:20:22 ] あれだっけ 初期化の指定が少ない場合コンパイラが勝手にやるんだっけ?
140 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 14:26:12 ] -W とかつけてんじゃね?それでも警告ですむと思うんだけど
141 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 14:36:58 ] >>140 >138では-Wallで警告が消えているね。 >>139 コンパイラがっていうか、0で補うのが仕様ですが。
142 名前:140 mailto:sage [2008/08/14(木) 14:53:48 ] >>141 いや>>138 踏まえて言ったんだが
143 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 15:00:14 ] >>132 されてるよ 全部のメンバに対して=0;と書いたように初期化されるから 浮動小数点数でもポインタでも正しく0.0やヌルポインタになる
144 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 15:04:55 ] >>136-137 があほなだけだろ 次の質問どーぞ
145 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:36:59 ] C言語撃退講座 ~K&Rは置いて、俺の話を聞け この本ってどう?
146 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:41:47 ] 推薦図書/必読書のためのスレッド 41 pc11.2ch.net/test/read.cgi/tech/1215510861/ ここで聞けばいいんじゃね
147 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 01:46:50 ] linuxでwin用のアプリをコンパイルすることはできるの?
148 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 02:14:01 ] 理屈の上では可能だが、現実問題としてありえない
149 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 03:54:01 ] いや、結構普通だろw
150 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 03:55:08 ] クロスプラットフォームだっけ? コンパイラがあればできるんじゃね? というかlinux上で動くwinコンパイラなんてあるの?
151 名前:デフォルトの名無しさん [2008/08/15(金) 03:58:51 ] それは可能だろ 機械語を生成するだけだからな でも使った事はないし知らない 32bitPCで64bitや携帯の機械語が生成できるのと同じ
152 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 03:58:56 ] Cygwinターゲットのクロスgccはなんか聞いたことがある。
153 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 04:02:15 ] MinGW
154 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 04:02:22 ] >>147 とりあえず答えておくとmingwとか使えばできます
155 名前:デフォルトの名無しさん [2008/08/15(金) 04:04:44 ] こういうケースだとJavaや.NETはいいな
156 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 11:57:51 ] typedef union _BYTE{ unsigned char byte; unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1; unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; } BYTE; sizeof(BYTE)がどうしても1になってくれないんですけど、どうすりゃいいんでしょう?
157 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:05:14 ] >>156 つーかbitをくくれよ
158 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:06:31 ] 忘れてたよ で、これ1byteにできないの?
159 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:08:13 ] あ、なんか自己解決したわ unsigned char bitn:1;にすればよかったのね
160 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:08:48 ] つーかそんなので悩むなら普通に byte に対してビット演算しろよ byte | 0x01 byte ^ 0x01 とかすればいいだけだろ?
161 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:50:01 ] 共用体でビットフィールド使っても無意味じゃないの?
162 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:52:20 ] ビットフィールド操作は大抵のコンパイラで糞なコードに展開されるわー もうちっと最適化できないもんかね
163 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:56:01 ] 糞だとおっしゃるだけの英知をお持ちならそのご自分の能力でなんとかなさっては?
164 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:57:29 ] そもそもワードを任意のビットで区切ろうという発想が糞 は言いすぎとしても処理効率なんぞ求めんな
165 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:57:57 ] 英知というほどの物じゃないけど、アセンブラでビット操作を書いたら こういう風には書かないだろうなあというコードになる。 C言語の仕様なので我慢して使ってるけど。
166 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:00:22 ] そこまで文句を言うならなぜ自分でアセンブらないの? で、それに対する答えがそのまま>>162 への答えだよ
167 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:02:15 ] インラインアセンブラは時々使うけど可読性が・・・
168 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:10:52 ] 宿題で世界のナベアツプログラムがでたんですが 3の倍数はいいとして 3のつく数の判定はどうすればいいんでしょう
169 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:15:27 ] 非標準だがitoa()を使って文字列に変換しstrchr()で判定する
170 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:18:34 ] >>168 それ、私が新人研修で出した課題だw sprintf()で文字列にしてから、strchr()で探すのが一番手っ取り早い。 真面目にやるなら、一桁ずつ10で割った余りをチェックすればいい。
171 名前:168 mailto:sage [2008/08/15(金) 13:39:07 ] なるほど、ありがとうございます あまりを出して調べるやり方でやってみます。 ああ、でもそれだと32とか321は無理ですよね 一桁ずつというのは、 1、3を引く 2、10で割ってあまりが0か調べる 3、違うなら1へ って感じですかね ちなみに学校の宿題ですw
172 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:55:02 ] 12345 12345%10 = 5 12345/10 = 1234 1234%10 = 4 1234/10 = 123 123%3 = さぇぁ〜ん!
173 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:55:37 ] %3じゃなくて%10ね
174 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:56:41 ] 321と言う数字があったとする 321 ÷ 10 = 32 … 1 32 ÷ 10 = 3 … 2 3 ÷ 10 = 0 … 3 余りに3が出たのでこの数字は3が含まれていると言う事がわかる と言うこと
175 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:57:59 ] >>170 そのやり方だと3の時に3を足さないと結果変わるね。 170の最後の行は 1 0かどうかチェック 2 %3の結果が0かどうかチェック 3 10で割った商と余りを別々に保存 4 余りが3かどうか 5 違うなら商を使って3へ てことだろうから32でも321でも対応できるよ。 ただsprintf使った方がラク。
176 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 14:00:57 ] C言語質問じゃなくてアルゴリズム質問だからスレ違い
177 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 14:45:08 ] cursesを使ってブロック崩しのプログラムを作っているんですが、 return関数やscanfなどの標準入力関数を使うと、 なぜかprintfやmvaddstr関数などを飛ばしてしまい、ハイスコアの名前入力が作れません。 名前入力はどのようにすればいいでしょう? メイン関数は下のようになってます int main(int argc, char **argv){ int score; char tmp[7]; initscr(); /* 画面の初期化 */ noecho(); /* エコーなし */ cbreak(); /* 一度に1文字入力をON */ keypad(stdscr,TRUE);; /* 矢印キーが使える */ if(LINES>MinY&&WCOLS>MinX){ window(); /* 画面描画 */ } else{ printf("Windou size is too small!!!"); // return 0; } score = go(); /* ゲームを実行 */ GameEnd(score); endwin(); /* ウィンドウ終了 */ return 0; } GameEnd関数では、mvaddstrで「GameOver」と出した後、 scoreの値とファイルの値を比較し、ハイスコアであれば mvaddstrで「HighScore!put your name」と書いた後に scanfで名前を受け取ろうとしたのですが、mvaddstrが抜かされてしまう感じです。
178 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:11:06 ] cursesを使ったこと無いから的外れのことを言うかも知れないが scanwを使っちゃ駄目なのか?
179 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:16:08 ] fflush(stdout)とか?
180 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:19:28 ] その肝心の部分を張らずに質問とはいい度胸だ
181 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:21:17 ] 環境依存すぎる まずinitscrやらnoechoやらの仕様を詳細にチェックしなおすこと モードを変えた後で元に戻さないとならないとかないか?
182 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:22:31 ] # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください
183 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:27:15 ] >>179 ぐぐってみますた。バッファフラッシュですね。ちょっとやってっます。 >>178 使ってみましたが無視されてしまいました。 GameEndのソースファイルは今こんな感じです(いろいろ注釈にして試したりしてるのでごちゃごちゃしてますが… endwin()を実行後に、注釈部のscanfなどをやってみてもだめでした・・・ void GameEnd(int score) { int i,j,k; char tmp[7]=" ",file[10][7]; FileRead(file); mvaddstr(LINES/2-2,WCOLS/2-5," GameOver!! "); for(i=0;i<5;i++){ if(score>=atoi(file[1+2*i])){ for(j=4;j>i;j--){ strcpy(file[j*2], file[2*(j-1)]); strcpy(file[2*j+1],file[2*j-1]); } mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\ ars)"); mvscanw(LINES/2+1,COLS/2-15,tmp); FileWrite(file); break; } } return; }
184 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:36:34 ] 本当にちゃんとハイスコア出してるか? あとbreakはそこ一箇所だけでいいのか?
185 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:37:46 ] >>180 ,182 すいません、ごちゃごちゃしてたので貼り忘れてました。 >>179 やってみましたがその部分になると凍結してしまいました… mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\ ars)"); fflush(stdout); fflush(stdin); scanf("%s",tmp); こういう順番でやってみたのですが >>181 やはりそうですよね… 学校の夏休み課題なんですが、cursesについての詳しい内容をほとんど教えられず 書き方だけしか教わってなかったのでさっぱりでした。 最悪カーセスモードを終了してからのscanfでやろうかと思ってるんですが、モードの終了の仕方もわからないで苦戦してます
186 名前:184 mailto:sage [2008/08/15(金) 15:37:54 ] あ、breakはいいのか 見間違えた
187 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:44:26 ] >fflush(stdout); cursesは標準出力じゃないから意味がない。 >fflush(stdin); 入力のフラッシュ動作は環境依存。 >scanf("%s",tmp); %6sにしてバッファオーバフローを避けよう。
188 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:45:19 ] >>185 fflush(stdin) は環境によっては segmentation fault になるんじゃなかったっけ? curses で入力がある限り読み飛ばせば大丈夫そうな気はする curses 使ったこと無いのでちゃんとかけないけど こんな感じかと while(キーボードバッファに何か残っている) 読み込む;
189 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:54:59 ] >>187 ,188 ふむふむ。勉強になります こんな感じに書き換えてみましたがどうしてもここで凍結してしまいます。 scanfをなくすだけでちゃんとmvaddstrの文が表示されて正常終了するのですが… mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\ ars)"); while(fgetc(stdin)!=EOF) echo(); scanf("%6s",tmp);
190 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:59:25 ] >>189 それは駄目だ fgetc(stdin)==EOF になった時点以降は stdin から入力することはできない dos (conio.h) でいうところの while(kbhit()) getch(); っていうのがあるはず
191 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:02:47 ] あーそうそう、curses使っているときに標準入力を使おうとすると、想定外の場所にカーソルが出たり 標準入力の端末動作で画面が崩れたりするからそもそも標準入力は使えないと思う。
192 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:05:28 ] ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
193 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:09:02 ] うおおおお、奥が深い getch()ですね、ラケット移動などのカーソル受付をそれでやってます。 ただ、kbhit()にあたる方が分かりません。 仕様では「ゲーム終了時にTOP5に入っていたら名前を入力してもらう」と書いてあったのであれなんですが 友達はウィンドウモードにする前に、一番最初に名前入れてもらってやったと言っていました。 最悪自分もそうしようかなと思っていますが、、何か腑に落ちない感じがします。
194 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:14:42 ] 良く分からないけどバッファを読み飛ばすなら while(getch() != '\r') 的な感じでどうだろうか?
195 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:17:45 ] >>193 ググってみた while(getch()!=ERR); でよさげ
196 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:22:41 ] >>191 なんと。 授業では入力方法は標準入力しか習ってないので…やはり一番最初に聞くしかない感じですかね >>193 すいません初心者で。以後気をつけます 環境は学校の端末(ice環境)を外部環境(PodeRosa)で動かしてます。 >>194 、195 行の左端に戻る…と。ERRも始めてみました。勉強になります どちらも標準入力は受け付けなかったんですが、mvaddstrは表示されるようになりました! mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\ ars)"); while(getch()!=ERR); echo(); scanf("%6s",tmp); 今はこんな感じです
197 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:26:10 ] そこでscanfじゃなくてcursesでの入力受付使えばなんか出来るんじゃないかな?
198 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:32:20 ] おお、早速以下のコードでやってみました! …が、出ませんでしたorz mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\ ars)"); while(getch()!=ERR); echo(); mvscanw(LINES/2+2,COLS/2-22,tmp); +------------------------------------------------------+ | | | |Time 1 | #### #### #### #### #### #### #### |Level 1 | |Score 10 | GameOver!! |HighS | #### #### #### #### #### #### |Name | HighScore!!Put your name!!(Max 5 chars) | | | | | | | | | | | ssh{*********}262: |
199 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:43:00 ] すいません、大分レス引っ張ってしまって。 いろいろアドバイスくださってありがとうございます。勉強になりました。 とりあえずは期限もあとわずかなので仕様とは少しずれてしまいますが以下のソースで提出だけしておきます ただ、自己満足になりますが悔しいのでいちおう現段階のソースも残しておきたいと思います。 int main(int argc, char **argv){ int score; char tmp[7]; printf("Hello,put your Name!(Max 5 Chars)\n"); fgets(tmp,6,stdin); printf("Let's play!!\n"); sleep(1); initscr(); /* 画面の初期化 */ noecho(); /* エコーなし */ cbreak(); /* 一度に1文字入力をON */ keypad(stdscr,TRUE);; /* 矢印キーが使える */ if(LINES>MinY&&WCOLS>MinX){ window(); /* 画面描画 */ } else{ printf("Windou size is too small!!!"); // return 0; } score = go(); /* ゲームを実行 */ GameEnd(score); endwin(); /* ウィンドウ終了 */ return 0; }
200 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:56:44 ] fgets()の常道では、第2パラメータは第1パラメータのサイズだ。 つまり、fgets(tmp, sizeof(tmp), stdin)でいい。 それから、(文字数オーバーじゃない場合に)末尾に改行文字が残ることにも注意。
201 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:01:18 ] >>85 win32プロジェクトでやってもエラーが出ました。 ちなみに拡張子を.cppでやるとコンパイルできます。 Cなんですけど。
202 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:05:30 ] >>201 それが出るとき、プロジェクトのプロパティの全般の共通言語サポートはどうなってる?
203 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:15:29 ] >>201 共通言語ランタイム サポートのことですよね。 共通言語ランタイム サポートを使用しないになってました。
204 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:23:13 ] これ以上はVC++あたりかな。 /clr のオプションがつくとCとしてはコンパイルできなくなる。 /clrをつけるのが、共通言語ランタイムサポート。 つまり、キミの状態はあきらかにおかしい。 同じ症状を持った人じゃないとわからんな。
205 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 09:52:03 ] なにかオススメのコンパイラはありますか?
206 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 10:59:01 ] >>205 LSI C-86
207 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:23:44 ] >>205 私はgcc(cygwin)を使っています。
208 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:34:52 ] ギャップバッファのサンプルコード等ありましたら教えて下さい
209 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:42:31 ] >>208 www.amazon.co.jp/dp/4938704269 この本に載ってるけど、見てみたらすごい値段になってるな。
210 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 15:20:02 ] >>209 凄く・・・高いです。 どこかのサイトにCで書かれたサンプルコードは無いのでしょうか
211 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:11:22 ] aibm4.main.eng.hokudai.ac.jp/~takty/pro/gapbuf/index.html ほれ。つーか自分でぐぐれよ まー俺もテキストはいじるので研究させもらうわ
212 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:26:47 ] >>211 すまん、それは昨日見たんだが、 C++はどうも・・・ ありがとうございます。
213 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:59:15 ] >>212 おいおい、100行ちょっとのソースも駄目なのかよw
214 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:20:38 ] 本が高かったら図書館に行けばいいじゃない
215 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:25:22 ] >>213 うん、駄目なのよ、C++分からないのよ >>214 既に取り寄せ連絡したから問題無い
216 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:33:43 ] そのソースを解析できないようじゃあ洋書を翻訳したのなんて厳しいんじゃね? ちなみにグーグルにはこんなのもあって books.google.co.jp/bkshp?hl=ja&utm_source=ja-wh
217 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:41:10 ] >>216 書籍だが、C++使える事前提で解説されてるの?
218 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:44:06 ] 100行くらいならCに書き直してやろうかと思って>>211 見にいったら 死ぬほど丁寧に解説されててワロタ あの解説文でわからないなら本読んでも無駄じゃない?
219 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:47:24 ] つーかギャップバッファの代替ロジックもおおよそ浮かんだけどなあ。 イメージはファイルシステムの情報管理の方法だよ
220 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:08:41 ] K&Rみたいな有名本ってほかになんかある?
221 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:16:13 ] >>218 Cに書き直して下さい
222 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:21:46 ] >>218 死ぬほど、とかそんな次元じゃなくて、 STL?template?operator?T& x?ってなんぞ?ってな感じでして、 C言語スレでC++のソースコード見せられるとは予想外でした。 C++じゃ全く読めなくて、すみません
223 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:23:28 ] これってさ双方向リストとかやってればすぐに応用かけそうだよな。 ギャップって呼ばれるのは特に説明がかかれてなかったけど1ギャップ=1バイトではなく 1ギャップ=nバイトの塊だよな?
224 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:25:02 ] >>222 ソースは見ないで、下の解説文だけ読めばいいと思う あれだけ丁寧に解説してあればサンプルソースなんかよりもずっと理解しやすいと思う
225 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:31:13 ] >>223 図をみたら、nバイトとしか解釈しようがないと思うけど。
226 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:35:39 ] テキストエディタで考えると1ギャップ=64バイトから128バイトくらい間が理想か。
227 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:51:30 ] ネタではなく。 かなり前にMicrosoft Visual C++ 2005 Express Editionってのを やってみたんだけど、何をどうやっていかわからずいくつかくだらない ソフトを作って終わってしまいました。 やってみたいことは、ブラウザなどの操作を自動でやらしたい。 メールを受信して、本文中にある一部が定型のアドレスを 抽出し指定時間ごとにブラウザで開きブラウザに定型の文が 表示されたらタブを閉じる。 アプリケーションを操作する。などです。 こんなことできますか?できるなら何の勉強が必要なのか または近道なのか詳細お願いします。
228 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:59:39 ] >>227 C#でやったほうがいいんじゃね? ブラウザの操作は知らんけど、コンポーネントでIEの機能を使えるから、同様のことができると思う。 メールを受信してどうこうは、ググれば簡単に分かると思う。
229 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 22:00:02 ] >>227 ネットワーク系かな
230 名前:デフォルトの名無しさん [2008/08/16(土) 22:32:48 ] スロットのプログラムみたいね〜
231 名前:デフォルトの名無しさん [2008/08/16(土) 23:20:29 ] homepage3.nifty.com/mmgames/c_guide/index.html すいません、上記サイトを眺めて勉強しているのですが、 C言語を業務で行うっていうレベルはどの程度なのでしょうか。 単に数の受け渡しをトレースできれば、 業務に就いたとき問題ないですか。
232 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 23:30:08 ] >>231 そのリンク先の内容が理解できるなら、 業務に問題ないレベルだろうと思う。 >数の受け渡しをトレース ってのはよく解らんのだけど。
233 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 23:32:24 ] ぴんきり
234 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 23:37:46 ] >>231 > 単に数の受け渡しをトレースできれば データフローのことだと思うよ データフローはプログラミングの基本、いやシステム設計の基本でもある
235 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 23:38:27 ] >>231 ちょっと古くなってる部分もあるけど、C FAQくらいは目を通しておくとか。 www.kouno.jp/home/c_faq/ Cを使っている職業プログラマでもC FAQレベルに達してないのはいっぱいいるけど。
236 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 23:52:56 ] C言語やっててトレースなんて単語言った時点でたぶん減点。 ollyでもやってんのか?
237 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 00:49:53 ] >>232-236 ありがとです。 引き続きサイトで勉強してみます。
238 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 01:30:09 ] 文字コードの相互変換をサポートする関数とかってありましたっけ? S-JIS->EUCとか
239 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 01:32:48 ] sjistoeuc関数 使っている環境にあればの話 なければ自作
240 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 06:50:04 ] ちょっと相談させてください。 本格的にc言語を勉強したいと思い下記のサイトをよんだりしていたのですが やっぱり1から勉強するとしても情報が古すぎますか? ttp://www9.plala.or.jp/sgwr-t/index.html ttp://homepage3.nifty.com/mmgames/c_guide/ 今まで子供の頃から端々でプログラムを書いて利用する事はあったのですが 例題の文章を適宜加工して使っていた程度です。 本格的にc言語を学ぶにはどのサイトを参考にするのが現在お勧めなのでしょうか? そもそもビジュアルベーシックとか他の学ぶ方が現在では無難なんでしょうか?
241 名前:デフォルトの名無しさん [2008/08/17(日) 07:36:51 ] 本格的にC言語を学ぶのはよくないですよ。 本格的にアセンブラやっても利用されるのはほんの一部なのと同じような物です。 C言語は生産効率が良くありません。 C++言語からにして、それで不足分があればC言語を勉強したほうがいいですよ
242 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 08:04:59 ] そうなんですか 音楽でいうところのピアノやクラッシックと同じで 基本として完全に把握しておけばその分将来有利だと考えたのですが・・・・ そもそもflashうまくなればcはむしろ必要ない言語なのでしょうか? それでも基本は抑えておいた方が良いのかな? オブジェクト指向プログラムしか扱えない人間はなにかしら欠点抱えるようにおもって勉強しようかと思ったのですが・・・・ 苦しんで覚えるc言語でいうとどの程度までかじる価値があるのでしょうか? それともオブジェクト指向メインでやるなら完全に必要ないとか・・・・・
243 名前:デフォルトの名無しさん [2008/08/17(日) 08:16:20 ] 芸術ではないのでやりたい事が簡単に実現できれば良いんです。 ピアノは演奏自体が大事ですが、プログラムは生産物が大事です。 コードに芸術性を求めても良くないです。 生産性はC++の方が上です。 オブジェクト指向は、プログラムを簡単にするやり方なだけで C++だからといって必ずしも使う必要はありません。
244 名前:デフォルトの名無しさん [2008/08/17(日) 08:23:01 ] ここがいいですよ。 C言語もC++言語も。 あと日本語を読み書きするのに文法の勉強が必ずしも必要ないように 動かして体験して動作が確認できればいいんです。 とくにC++(の実用面)で重要な点はSTLと思います。 www5c.biglobe.ne.jp/~ecb/index.html www.geocities.jp/ky_webid/index.html
245 名前:デフォルトの名無しさん [2008/08/17(日) 08:23:46 ] いくらC言語を習得、熟練しようとも 基礎学力がないと、大作は作れないような気がするのですが どうでしょうか?
246 名前:デフォルトの名無しさん [2008/08/17(日) 08:29:30 ] マシンに近いという意味で、基本といえるのはアセンブラと思います。 C言語も、C++言語も、結局はアセンブラに変換されるので、最も基本だと思います。
247 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 08:45:08 ] そうなんですか アセンブラ+flashあたりが私にとっての理想の組み合わせなのかなぁ とりあえずちょっと位さわりの部分程度は学んでc使える人と会話くらいはできるようになりたいので 苦しんで覚えるc言語をちょこっとやってみようとしたのですが問題が ttp://hp.vector.co.jp/authors/VA017148/pages/cpad.html#cpaddownload きときとCPadの一番重要なC/C++開発環境用だけが何故かリンク切れしてます。 どうすればこのエディタが手に入るでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 08:46:28 ] >>245 もし私への質問でしたら、大作をつくる気はないです。
249 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 11:36:36 ] 素人はrubyでもやってろってこった
250 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:30:13 ] >>249 Ruby の方が100倍難しいぞ 環境設定とか 環境設定とか 環境設定とか
251 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:36:11 ] >>245 大作を作るためのノウハウを修得、熟練しましょう。 特に、C言語の取扱いだけに固執するのではなく、 上流工程と呼ばれるもの(要求分析と設計)も含めて学習を進めるといいでしょう。 ER図やDFDが書けるだけでも世界が変わってくるはずです。
252 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:52:10 ] >>250 環境設定でなんか難しいところがあったっけ?
253 名前:デフォルトの名無しさん [2008/08/17(日) 12:55:04 ] >>252 素人はパス通す事も難しいんだ察してやれ
254 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:59:31 ] 環境変数ってなに?パスって? ってことだろうなあ。
255 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 13:05:07 ] Linux、Windows 両刀なんだ まんどくさい
256 名前:デフォルトの名無しさん [2008/08/17(日) 13:10:22 ] でもwindowsならrubyのインストーラでインストールしたら一発じゃないのかな? コンソールで対話的にどうとかいう辺りで挫折しそうだけど
257 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 13:19:15 ] うるせー オブジェクト指向なのか、構造体指向なのか ハッキリわかりにくいんだよ うんこRuby しかもスレ違いじゃちんこ
258 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 13:47:05 ] こりゃまたわかりやすいのが続いたな
259 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 13:49:16 ] 頭悪い人はプログラム勉強するより、世渡りを勉強してプログラマを使う仕事に就いたほうがいいよ
260 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 13:52:12 ] ボインちゃんを集めてプロのグラマーたちを使うことにしますた!
261 名前:デフォルトの名無しさん [2008/08/17(日) 16:28:12 ] 初歩的な質問なんですが BMP画像を読み込む際に 画像にアルファチャンネルが含まれているかいないかの判断は どうやってやるのでしょうか? 現在の自分のやり方ははヘッダから画像サイズと深度を計算して ファイル総容量と比較しています。 あまりにもアレなやり方なので 他に方法があると思うのですが ヘッダにもそれらしい情報もなく 皆さんはどのように判別されているのでしょうか? よろしくお願いします。
262 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:30:20 ] >>261 ヘッダにカラーフォーマットの情報なかったっけ?
263 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:33:00 ] bmpにαチャンネルなんてあったっけ?
264 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:34:09 ] >>263 一応 32bitなんかだともたせれる
265 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:38:46 ] www.kk.iij4u.or.jp/~kondo/bmp/ ほれbmpフォーマットの解説 場所はあるけどリザーブ状態なんで既存のツールでは拾ってくれないかもね。 つーかPNG使え
266 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:00:32 ] >>262 >>265 あ〜biBitCountって色深度じゃなくて1画素あたりの RGBA総データサイズなんですね。 勘違いしてました。 ありがとうございますた! おかげさまで もう少しスマートにやれそうです。
267 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:38:28 ] char はどの環境でも1byteが保障されてるんですか?
268 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:22:57 ] >>267 Cの世界だと、常にcharは1バイト。 ただ、1バイトが8bitとは限らない。
269 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:29:25 ] 1バイトを16ビットにしてlongを128ビットにすればよかったのに・・・
270 名前:デフォルトの名無しさん [2008/08/17(日) 22:43:54 ] >>268 現在稼働中で 1byte≠8bitな環境ってどんぐらい残ってんだろ?
271 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 02:35:30 ] switch+caseを使って分岐させると、プログラム自体は遅くなってしまうのでしょうか? 言葉など間違ってたらすみません。
272 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 02:44:24 ] >>271 足し算や引き算だって遅くなるぞ
273 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 02:47:27 ] if else if else if else if ... で同じような分岐をするのと比べてならswitch caseが遅いということはないはず
274 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 03:05:08 ] >>271 最適化のこともあるので分かりません
275 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 06:56:05 ] 符号有/無の変数同士の四則演算についての質問です。 long hoge1=-101; ulong hoge2=100; printf("%d",(hoge1+hoge2)); とすると、「-1」が、 if( (hoge1 + hoge2)>0){printf("和が0以上\n")} とすると、「和が0以上」と表示されました。 結果として、printfは正常、if文は異常な動作をしています。 if( (hoge1 + (long)hoge2)>0)・・・のように if文中で使用している変数を型を揃えた場合、if文も正常に動作しました。 おそらく、if文中では変数の型を揃えないといけないものと勝手に理解しましたが、 これはC言語の仕様によるものでしょうか?
276 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 07:14:31 ] 符号付きと符号無しで演算すると有効範囲の絶対値が大きいほうが優先されるのか…知らんかった
277 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 07:17:42 ] >>275 %dはintに型変換されるから。
278 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 08:32:52 ] >>275 printfでは実際の数値はわからない フォーマット指定でいかようにも変わる printf("%d",(hoge1+hoge2)); printf("%u",(hoge1+hoge2)); printf("%hu",(hoge1+hoge2));
279 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 09:37:22 ] >>271 switch case はgccとかなら最適化で速くなるぜ。 使用しているコンパイラで色々試してみるのも一興
280 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 10:47:45 ] >>271 入門レベルで気にするほどは変わりません。最適化で同じになる可能性もあることは既に指摘の通り。
281 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:37:11 ] 添え字でアクセスできる多次元の配列の動的確保ってだいたい下みたいな感じでいいのか? もっとクールでスパーハッカー的なやりかたってある? a = (int **) malloc(sizeof(int *)*A); for(i = 0; i < A; i++) a[i] = (int *) malloc(sizeof(int)*B);
282 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:40:44 ] >>281 pc11.2ch.net/test/read.cgi/tech/1217123234/133/
283 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:43:12 ] >>282 半分動的だけど、半分静的じゃん
284 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:44:53 ] >>283 AもBもコンパイル時には確定しない値(変数)にしたいなら、簡便法はない。
285 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:46:33 ] >>284 C99に足をつっこむという簡単な方法が!
286 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:51:29 ] >>281 要求する領域全体が、メモリ上に連続で確保できる程度の大きさなら、 一遍に割り付けたほうがmallocのコストが低い。 a = (int **) malloc(sizeof(int *)*A); a[0] = (int *) malloc(sizeof(int)*A*B); for(i = 1; i < A; i++) a[i] = a[i-1] + B; もちろんどっちがいいかは場合による。
287 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:53:16 ] >>286 志村、その論点ならmallocもう1個減らせるよ
288 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 16:14:26 ] 質問者じゃないが、なるほど。
289 名前:デフォルトの名無しさん [2008/08/18(月) 18:22:32 ] cygwin環境でgccを使っています。 <ncurses.h>のprintwを使って全角文字を表示しようと文字化けします。 同じ書式で標準出力でprintfを使った場合は、全角文字が表示されているので、 端末などの設定は正しいと思います。 リアルタイムでキー入力を受け付けるgetch()が使いたいので、ncursesは必要です。 解決方法ないでしょうか。
290 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 18:48:10 ] >>289 エディタぽいのつくってるのかな。 全角に半角上書き処理してるんじゃないかとエスパー。
291 名前:289 mailto:sage [2008/08/18(月) 18:56:28 ] >>290 #include <ncurses.h> #include <locale.h> int main(void){ setlocale(LC_ALL,""); initscr(); printw("ほげほげ"); refresh(); usleep(1000000); endwin(); } ここまで短くしても文字化けしてしまいます。
292 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:48:33 ] >>286 ,287 a = (int **) malloc(sizeof(int)*A*B); for(i = 1; i < 20; i++) a[i] = a[i-1] + B; つまりこういうこと? こっちのほうがfreeも一回でいいから便利そうだねd!
293 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:58:22 ] >>292 それは明らかにおかしい。
294 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:06:05 ] よく分からんが malloc(sizeof(int)*A*B + sizeof(int*)*A); って事かな
295 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:12:23 ] 無難に a = (int **)malloc(sizeof(int *)*A); for(int i = 0; i < A; i++) a[i] = (int *)malloc(sizeof(int)*A);
296 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:41:11 ] a = (int **)malloc(sizeof(int) * A * B + sizeof(int *) * A); for(i = 0; i < A; i++) a[i] = (int *)a + A + i * B; 〜 free(a); なんどもサーセン これで正解じゃなかったらあきらめる
297 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:24:01 ] おかしいです^q^
298 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:36:32 ] スレ違いだと思うんですが、system関数でぶち当たった問題なんで質問させてください。 現在、system関数で一行に複数のコマンドを打つ必要に迫られているのですが…ウィンドウズのプロンプトでの命令の区切文字ってあるのでしょうか? unix系だと「;」だったんですが、ウィンドウズの場合は一行一命令という絶望的な解説しか見当たりません。 一応「;」「,」「:」等を試してみましたがダメでした。 知っている方がいらしたら、よろしくお願いします。
299 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:40:18 ] スレ違いです。
300 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:48:44 ] スレ違いだと思うなら質問しないでください。
301 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:51:11 ] この>>300 はおかしい
302 名前:ym [2008/08/18(月) 22:02:21 ] チェック文字列で渡された文字列が全てアルファベットのA〜Zの文字で構成されているかをチェックして 正常終了値;0 異常終了値;−1で判定するプログラムを誰か教えてください。 お願いします。
303 名前:デフォルトの名無しさん [2008/08/18(月) 22:05:12 ] >>296 だから無難に a = (int **)malloc(sizeof(int *)*A); for(int i = 0; i < A; i++) a[i] = (int *)malloc(sizeof(int)*B); てして for(int i = 0; i < A; i++) free(a[i]); free(a); ってすればいいじゃん
304 名前:デフォルトの名無しさん [2008/08/18(月) 22:12:56 ] >>302 #include <ctype.h> int CheckFunc(char *str) { int i; int check; for(i = 0; str[i]; i++){ if((check = isalpha(str[i])) == 0) return -1; } return 0; }
305 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:13:29 ] >>298 NT系限定だけどこれはだめか? cmd.exe /c hoge & foo
306 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:21:05 ] >>302 static int checkstrA_Z(const char *str); int main(int argc, char *argv[]) { if ( argc < 1 ) { return -1; } return checkstrA_Z(argv[1]) } static int checkstrA_Z(const char *str) { for ( ; *str; str++ ) { if ( !(('A' <= *str) || (*str <= 'Z')) ) { return -1; } } return 0; } /* EOF */ 適当に作った、遅かったか。しかも試してないのでサーセン。
307 名前:304 [2008/08/18(月) 22:36:29 ] 修正 >>302 #include <ctype.h> int CheckFunc(char *str) { int i; int check; for(i = 0; str[i]; i++){ if((check = isupper(str[i])) == 0) return -1; } return 0; }
308 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:38:49 ] >>306 なんで素直に { while(*str++){ if (('A' > *str) || (*str > 'Z')) { return -1; } return 0; } としない? 無意味に複雑にするから案の定、バグってるじゃん。
309 名前:298 mailto:sage [2008/08/18(月) 22:40:55 ] >>305 できました!! すれ違いな質問なのに、答えていただきありがとうございました! 他の皆さんにもご迷惑をお掛けしてすみませんでしたm(_ _)m ほいでは。
310 名前:308 mailto:sage [2008/08/18(月) 22:41:56 ] あー全然だめだ308もバグってる。突っ込み歓迎。寝る。
311 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:44:55 ] ('A')
312 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:51:40 ] if文while文for文の条件の中に色々詰め込んでとにかくソース短くしようとする人って何なの?
313 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:55:52 ] while('A' <= *str && 'Z' >= *str) str++; return *str == '\0' ? 0 : -1;
314 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:02:28 ] >>312 一般的に言って、短いほうが間違いがおきにくい。 複数の処理を一箇所にまとめて書くことはソースを縦に縮める効果がある。 一方で大抵の場合は同時に横に広がることでもあるので、 どちらを選ぶかはバランス感覚と好みの問題。 どっちがいいとか悪いとかいうことは、ない。
315 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:10:32 ] 画面は一般的に縦より横に長い、つまりはそう言うこと と、どこかで見た記憶があるけど忘れた
316 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:12:41 ] 「短くしようとする時期がある」とかいう反応が返ってくると思ったのに
317 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:12:57 ] 長く書いてバグを紛れ込ますには馬鹿と相場が決まっている
318 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:14:24 ] 313 - 314 はその調子で何Step組んだことあるの?
319 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:17:16 ] そして>>317 はたった1行の日本語ですら間違えてしまう。
320 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:19:35 ] 文法ミスはコンパイラがエラーを出してくれるから許されるのさ
321 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:19:55 ] Step数(大爆笑
322 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:20:19 ] 日立さん乙ですw
323 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:21:11 ] ステップ数ってあーた・・・・・ ロートルですか?
324 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:23:22 ] ごめん。たしかにロートルだ。 他にソースの長さを測る単位教えて若い人。
325 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:24:15 ] ソース長
326 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:24:50 ] 自分で考えろジジイ
327 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:25:54 ] 行数のことをステップ数いうのがアレなんだろ。
328 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:27:38 ] メインフレーム時代の名残だろうな
329 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:29:33 ] 昔は、行数でプログラムの値段を算出していたんだろ。
330 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:30:23 ] ソースの長さを測る意味がわからん 同じ仕事をやる100行のソースAと1000行のソースBで偉いのはどっち?
331 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:31:06 ] >>330 だから、>>329
332 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:34:17 ] >>331 ということは、長くだらだらと書く奴の方が簡潔に書く奴より高給を貰ってた訳か 狂ってるな
333 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:34:18 ] 可読性の話をしてると思ってたのだが。
334 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:35:49 ] >>332 正直者はいつも馬鹿を見るのがこの世です
335 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:36:21 ] >>332 まー実際は予算も決まってるし、新規で行数書けばその分テスト件数も増やさないといけないとか いろいろあるのよ>日立の場合。
336 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:44:00 ] >>302 n = strspn(s, "ABCDEF・・・XYZ"); if (s[n] == '\0') return 0; else return -1; とすれば、ループもなくなるなと一瞬思ったけど、やっぱ"ABCDEF・・・"と書くのがダサいな。 isupperでまわしたほうがいいか。 あと、正常が0で、異常終了で-1ってのも、出題者のセンスが・・・
337 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:45:35 ] >>332 つか、メインフレームの作業体制は極度に分業が進んでいて コーダーという人は詳細フローを言語のコードに一行ずつ落とすだけ。 そういう環境だから、ステップ単価というのは有効だったんだよ
338 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:49:20 ] >>336 正常0は理にかなってるよ 正常は一通りしかないが、異常にはいろんなケースがある だから正常は0を返し、エラー時はエラーコードを返すほうがいい
339 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:53:14 ] >>338 だからウゼーって 独り言はチラシの裏にでも書いてろ
340 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:54:30 ] >>338 この場合は、エラーは一通りしかないじゃん。 bool値のかわりで、0と0以外のほうがいい。 それに、そういう思想だったら、-1じゃなくて、0とマイナス値としておかないとダメ。
341 名前:デフォルトの名無しさん [2008/08/18(月) 23:56:05 ] 多分この問題の次ではアルファベットじゃなかった文字数を返すようにしましょうって続くんだよ きっとそうだよ
342 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:58:21 ] >>339 完全に反論の余地がない時は黙ってた方がいいですよ
343 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:59:58 ] どう見ても初学者用の問題なのにstrspnとかisupperつかってかえって混乱させようとしてるやつなんなの?
344 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:00:11 ] 入力がヌル文字列の場合はどっち?
345 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:04:42 ] >>343 ああ、そういえば再帰とかつかって、面白い回答にするの忘れてたな。
346 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:05:54 ] 今からでも遅くないからさっさとやれよ
347 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:12:35 ] >>343 標準ライブラリ関数を使うことの何が問題なんだかわからん string.hに定義されてるような車輪の再発明をやらせる方がよっぽど問題だ
348 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:13:05 ] >>342 反論の余地とかそういう問題じゃなくてお前がうざいの
349 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:14:15 ] >>348 しーっ!これ以上書くと頭が悪いことがばれますよ!
350 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:15:18 ] Cだと文字列の理解はC言語自体の理解にも多少は 繋がる気がするから再発明も完全に無駄だとは思わない俺
351 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:16:29 ] 文字列じゃなくて文字配列か
352 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:16:34 ] >>349 お前がな
353 名前:304 [2008/08/19(火) 00:22:21 ] >>302 じゃ初学者用に書くよ int CheckFunc(char *str) { int i; for(i = 0; str[i]; i++){ if ('A' > str[i] || str[i] > 'Z') return -1; } return 0; } >>344 0が返る
354 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:25:07 ] >>353 ○strがNULLだと落ちる ○iは無くても書ける
355 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:26:59 ] 文字列に大文字以外が含まれているかどうか調べる関数って、どういう関数名が適切だと思う?
356 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:27:27 ] >>352 しーっ!これ以上書くと頭が悪いことがばれますよ!
357 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:28:01 ] >>354 引数にNULLを渡してはいけないという仕様です。
358 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:29:43 ] >>313 でおk
359 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:29:59 ] >>357 君の世界ではそれでいいのかもしれないが、俺の世界では文字列のNULLチェックを怠ったばかりに 落ちてしまうソフトが後を絶たないんだなこれが
360 名前:デフォルトの名無しさん [2008/08/19(火) 00:32:54 ] ポインタを渡す関数はnullかどうかひかくしなくてはいけないのですか?それが一般的ナのですか?
361 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:43:45 ] >>359 あなたの世界では、たとえばstrcat()にNULLを渡したときに、落ちずに正常に動作してますか? strcat()がNULLを渡しても動作するとしたら、どう動作すればいいですか?
362 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 01:04:20 ] パルプンテ
363 名前:デフォルトの名無しさん [2008/08/19(火) 01:14:15 ] そうだな、システムコールとかは異常が-1、正常がそれ以外だったりするしね。
364 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 02:40:04 ] >>361 顔が真っ赤ですよ
365 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 03:04:33 ] >>364 しーっ!これ以上書くと頭が悪いことがばれますよ! ってもう遅いけど
366 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 04:02:45 ] ポインタを渡された側がNULLかどうかをチェックしてもあまり役に立つとは思わないけど。 無効なポインタは別にNULLだけじゃないから、無効なポインタは渡す側の責任でしか回避できない。 もちろん渡された側でのNULLチェックで回避できる問題もある。 でも渡される側でNULLチェックを怠ったばかりにおちてしまうような関数の使い方をしているようなプロジェクトなら、 他にも無効なポインタを渡してしまうような潜在的な危険があったりするおそれも。 >>357 の人も引数に渡してはいけないのはNULLとせず、無効なポインタとすべきだったと思う。
367 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 09:43:53 ] NULLは呼んだほうの責任だからな。 まあassert入れといてもバチはあたらんと思うが。
368 名前:デフォルトの名無しさん [2008/08/19(火) 11:44:22 ] Visual Studio 2005とかだと、sprintfの代わりにsprintf_sを使えと警告をされるのですが、いちいち書き換えたくありません。 sprintf_sは、Visual Studioの独自の関数で、2番目に、文字列のサイズを引数に取ります マクロとかで解決できないでしょうか
369 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 11:46:23 ] #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
370 名前:デフォルトの名無しさん [2008/08/19(火) 11:50:42 ] >>369 ありがとうございます。まさにそれを探してました。
371 名前:デフォルトの名無しさん [2008/08/19(火) 12:30:24 ] #include <stdio.h> #ifdef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES #undef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES #endif #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 int main( void ) { char fname[256]; // this causes 4996 warning sprintf( fname, "%s", "hogehoge" ); // this is safe version // sprintf_s( fname, sizeof(fname), "%s", "hogehoge" ); return true; } こんなシンプルなものでもまだwarningでるんですが。。。
372 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 12:32:15 ] #define _CRT_NON_CONFORMING_SWPRINTFS というかMSDN嫁
373 名前:デフォルトの名無しさん [2008/08/19(火) 12:32:37 ] すいません。 #include <stdio.h>を後にしたらできました。
374 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 12:34:47 ] あ。悪い >>372 は関係ないわ #pragma warning(disable : 4996)
375 名前:デフォルトの名無しさん [2008/08/19(火) 12:35:56 ] >>372 どうもありがとうございます。 MSDNは嫁にしたんですが、気づきませんでした。
376 名前:デフォルトの名無しさん [2008/08/19(火) 12:41:29 ] 初心者の底辺なんですがおすすめの開発環境はありますか? それとNetbeansでCをやろうとするとコンパイラが見つからないとエラー吐くんですが、 コンパイラってどこからDLするんでしょうか? 両方ググってはみたものの分かりませんでしたのでお願いします。
377 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 12:42:37 ] >>6
378 名前:デフォルトの名無しさん [2008/08/19(火) 12:56:19 ] やはり、>>371 でうまくいかない理由がわかりません。
379 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:00:12 ] >>378 ヘッダの位置変えたらうまくいくんでしょ? コンパイラだって機械だからねえ。 機械的、要するにソースの上から解釈するってことだけでしょ。
380 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:06:01 ] プロトタイプ宣言の意味とか、プロトタイプ宣言をしない場合はmainより中で使ってる 関数がソースに前に来るとか理解できてるんだろうか?
381 名前:デフォルトの名無しさん [2008/08/19(火) 13:12:34 ] >>379 そのとおりです。ヘッダをトップに持ってきたらうまくいきました。 >>380 理解できているつもりが、宣言の順番を変えるとうまくいかなくなる説明が解釈できません。
382 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:21:26 ] >>381 コンパイラの仕組み勉強してこい。
383 名前:デフォルトの名無しさん [2008/08/19(火) 13:25:32 ] >>382 的確なアドバイス、どうもありがとうございます。 不毛な気がしますが、VCのコンパイラがどのタイミングでCRTライブラリにしてくれるのか、調べてみます。
384 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:30:49 ] たぶんヘッダを解析した段階でコンパイラがリンクするライブラリを決定してしまってるのに 後でスイッチ置かれても切り替えができなってことかな?
385 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:52:31 ] _CRT_NON_CONFORMING_SWPRINTFS をgrepしてそのあたり見てみりゃわかる
386 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:53:35 ] コピペ元間違った _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES こっちな
387 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 13:59:33 ] あと、、defineはコンパイラ等に直接指示するわけじゃないから 切り替えたいときはincludeの前に置くのは常識なんだけどな。 コンパイラ等に指示出せるのはpragma
388 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 14:23:05 ] C言語の入門書を理解したレベルで取れそうな資格ってなにかありますか?
389 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 14:28:15 ] 英検3級
390 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 14:33:19 ] >>388 「C言語プログラミング能力認定試験」という、クソの役にも立たない資格があるぞ。 3級とか、C言語をほとんど知らなくても取れる。2級はプログラムが組めなくても取れる。 が、入門レベルがわかるだけの資格持ってて何の役にたつと思う? やめとけ。
391 名前:デフォルトの名無しさん [2008/08/19(火) 15:30:31 ] >>387 なるほど。みなさん、よくわかりました。 おそらく、 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESがデフォルトでゼロになっていて、その値をマクロの引数にとって何かを展開しているのでだめなんでしょうね。 先手を取って1で定義してあげればよい、と。 #undefの使い方の間違えの典型であることがわかりました。 以上踏まえて、既に定義されているマクロを再定義する場合は#undefを使わないで、そのマクロが定義されている#includeの前におけばよいってことですかね。
392 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 15:50:55 ] >>388 そこから頑張って2種とか取れば良い。 ていうか、会社に理解してもらえない資格は時間の無駄、金の無駄。 CG検定、シスアドとか取ったけど糞の役にもたたねぇ。
393 名前:ym [2008/08/19(火) 16:06:37 ] #include <stdio.h> #include <ctype.h> #define RET_OK 0 #define RET_NG -1 int N60901D01(const char *psChkString { int i; for(i = 0;psChkString[i]!='\0';i++){ if(isupper(psChkString[i])!=0){ return RET_OK; } else{ return RET_NG; } } return RET_OK; } int main(void) { char str[256]; int chk; gets(str); chk = N60901D01(str); printf("\n戻り値は%dです\n",chk); } アルファベットをチェックするプログラムなんですけど、 コンパイルをしたら1文字分しかチェックされませんでした。 どこが間違っているか教えてください。 お願いします。
394 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 16:09:22 ] >>393 >if(isupper(psChkString[i])!=0){ の中で必ず一回目でreturnしてる。
395 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 16:11:53 ] >>393 for文の中で1文字目チェックした後、真でも偽でもreturnしてるだろう。 そこは最後まで回さないと。最後がRET_OKってことは、if文のRET_OKの行を消せばいいような気がする。
396 名前:ym [2008/08/19(火) 16:11:55 ] 必ず1回目でreturnしないためにはどうしたらいいですか?
397 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 16:16:59 ] >>396 >>395 の言うように、 if(isupper(psChkString[i])!=0){ の下の return RET_OK; を消してみ。
398 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 16:17:12 ] return文を消せばいいと思うよ
399 名前:ym [2008/08/19(火) 16:26:09 ] if文のreturn RET_OKを消したらコンパイル成功しました。 ありがとうございました。
400 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 16:37:48 ] え、コンパイル失敗してたの?そういう話?
401 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 16:43:41 ] >>400 3つめのreturn文にいくことはありませんエラーか。
402 名前:デフォルトの名無しさん [2008/08/19(火) 17:43:19 ] 処理開始から処理終了まで何秒経過したかを調べる方法を探しているのですが、 #include <stdio.h> #import <time.h> #include <unistd.h> int main (int argc, const char * argv[]) { clock_t start, end; start = clock(); printf("start:%ld¥n",start); sleep(1); end = clock(); printf("end:%ld¥n",end); printf("CLOCKS_PER_SEC:%ld¥n",CLOCKS_PER_SEC); printf("%ld秒経過しました。¥n", (end - start) / CLOCKS_PER_SEC); return 0; } これを実行すると start:6464 end:6580 CLOCKS_PER_SEC:1000000 0秒経過しました。 こんな結果が帰ってきました。 CLOCKS_PER_SECは1秒あたりのクロック数では無いのでしょうか。
403 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 17:46:26 ] 整数型で出力しちゃあ駄目だろ
404 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 17:49:15 ] printf("%f秒経過しました。\n", (float)(end - start) / CLOCKS_PER_SEC);
405 名前:デフォルトの名無しさん [2008/08/19(火) 17:52:29 ] >>404 ありがとうございます。 start:6894 end:7011 CLOCKS_PER_SEC:1000000 0.000117秒経過しました。 こうなりました。sleep(1)が0.00017秒?なわけ無いんだが… CLOCKS_PER_SECはあてにならないってことなのかな
406 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 17:55:17 ] TimeGetTimeか QueryPerformanceCounter使えよ 1秒単位とか精度が悪すぎる(この場合はな)
407 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 17:55:40 ] int a[4]; int b[4]; int c[4]; : : といった感じに、int型配列が大量に存在している場合に、配列内の数字でソートしたいのですが、 int型配列の数字の大小比較がうまくできません。どなたかご教授お願いします 単純に int(a[0] > b[0]){ってやっていくと死ねる・・・orz
408 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:00:09 ] qsort
409 名前:デフォルトの名無しさん [2008/08/19(火) 18:01:15 ] >TimeGetTimeか QueryPerformanceCounter Winの独自実装ですか… 残念ながらWindowsでは無いです
410 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:04:02 ] それだけだとほとんど0になるはずだよね。 どんな環境でやってるの?
411 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:06:11 ] sleepかけてる間クロックとまってんじゃないの
412 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:07:19 ] sleepで0.00017秒も食ってるから、おかしいと思ってるんじゃないの?
413 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:07:50 ] >>411 だろーね こういうやり方してもテストにならないってこった
414 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:08:41 ] >>412 printf挟んどいてそれはないだろ
415 名前:402 mailto:sage [2008/08/19(火) 18:11:16 ] >>410 gcc 4.0.1 Mac OS 10.5.4 Intel Core Duo 2.4GHz 2GB 667MHz DDR2 SDRAM です。
416 名前:402 mailto:sage [2008/08/19(火) 18:13:05 ] >>411 ,413 sleepするとクロック止まるんですか…、ありがとうございます。
417 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:20:39 ] >>407 何がしたいのかよくわからないが、たぶん配列を大量に作るのがもうおかしいんだろう。 ソートしたいもの全部を一つの配列に入れましょう。
418 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:25:55 ] >>407 はもうちょっとくやしく
419 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:32:50 ] >>418 int a[4] ; a[0] =1 a[1]=2 a[2]= 3 a[3]= 4 int b[4] ; b[0] =2 b[1]=2 b[2]= 3 b[3]= 4 として、a自体を1234、bを2234と考えて、大小比較を行いたいわけなんです この場合はb>aみたいな感じで・・・
420 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:34:33 ] memcmpとかでいいのとちがうん? 配列で連続してればcharで見てやって
421 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:38:18 ] >>419 if ((a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]) < (b[0] * 1000 + b[1] * 100 + b[2] * 10 + b[3])) { // bが大きい } else { // aが大きい } とかじゃ駄目なの?
422 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:38:42 ] >>420 今調べてみましたが buf1 と buf2 を先頭から n バイト分比較します。比較はunsigned char として行われます とあるのですが、int型でも関係なくできるものなんですか? intとcharじゃバイト数が全然違うので、なんか変なことになりそうな気もするのですが・・・
423 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:39:43 ] >>421 配列が何個もあるんです・・・ んで、バブルソートみたいなことをやりたいので、そのように書くととんでもないことになるんですorz 関数として何か簡単に比較できるものがないかな〜という感じで探してたのですが、いいのがなくて('A`
424 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:40:28 ] >>422 同じCPU環境化でメモリに入れちゃえばcharだろうがなんだろうがw 長ささえ同じなら問題ないよ。 エンディアンの問題も関係ないし。
425 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:41:45 ] 4桁固定?例えば0030とか0111とか。 それなら1桁目からソートしていけば良さそうだけど。
426 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:43:56 ] >>424 なるほど・・・。ためしにちょいと動かしてみます〜
427 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:46:24 ] int a[4]={1,2,3,6}, b[4]={1,2,3,5}; int i = 0,c = 0; while(!(b[i]-a[i]) && c < 3)i++, c++; if(b[i]-a[i]==0)puts("同じ"); else if(b[i]-a[i]>0) puts("bのがおおきい"); else puts("aのがおおきい");
428 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:52:21 ] >>419 のサンプルでいけば ビッグエンディアン系だとメモリに格納された場合はこんな感じ a 00000001 00000002 00000003 00000004 b 00000002 00000002 00000003 00000004 で格納する元も両方intで比べる際もcharでもいいしunsigned charでもいいし両者の条件さえ同じなら比較する桁もあうので問題ない リトルエンディアン系でも同じ ビッグエンディアン系だとメモリに格納された場合はこんな感じ a 01000000 02000000 03000000 04000000 b 02000000 02000000 03000000 04000000 intをレジスタ上で扱う場合は@ABC(<-バイトの並びね)だったらメモリにはCBA@とアドレスの最初から格納されるけど 通信でほかに渡したしりなければ同じエンディアン系で処理されるので結果memcmpであろうが比較する桁はいっしょなので 問題ない
429 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:53:30 ] ↑で書いた数字は全部16進数ね
430 名前:こうならないの? mailto:sage [2008/08/19(火) 18:57:27 ] ビッグエンディアン a 00000F01 00000002 00000003 00000004 b 00000002 00000002 00000003 00000004 (a > b) リトルエンディアン a 010F0000 02000000 03000000 04000000 b 02000000 02000000 03000000 04000000 (b < a)
431 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:59:01 ] 例を見る限り、配列に入ってるのは一桁の10進数だろ
432 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 18:59:11 ] >>430 エンディアン系を意識すればいいだけだろw
433 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:02:00 ] >>432 memcmpが意識してくれるの?
434 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:04:58 ] memcmpの結果を意識しろよw 大きいか小さいかイコールでくれるんだろw そんなことも考えれないようなら素直にループで1つ1つやれw
435 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:17:40 ] >>434 こういうのは? リトルエンディアン a 01010000 02000000 03000000 04000000 b 00020000 02000000 03000000 04000000 memcmpの結果 (a > b) リトルエンディアン a 00010000 02000000 03000000 04000000 b 00020000 02000000 03000000 04000000 memcmpの結果 (b < a) でも実際は、どちらも b > a にならなければおかしい
436 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:36:17 ] 誰か、いまだにエンディアンについてよくわかってない俺に図解!マンガでわかるエンディアンを頼む
437 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:42:35 ] >>436 数字があるとするじゃん。 一番上の位から読む?(ビッグエンディアン) それとも一番下の位から読む?(リトルエンディアン) って話。
438 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:44:20 ] >>437 いやそれは違う・・・ メモリ上に複数バイトで構成される数字を格納した際の 格納のされ方の違いだよ。
439 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 19:50:02 ] エンディアン糞フカナイ
440 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 20:45:12 ] >>439 汚ぇなぁ、おい。 >>435 >431 >>416 unix系なら、gettimeofday()がそこそこ使える。こいつは実時間だ。 既に指摘の通り、clock()はCPU時間だから要注意だ。
441 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:00:10 ] >>423 比較する関数を作ればいいだけなんじゃないの? エンディアンを意識してどうこうするよりよほど楽だと思うんだけど
442 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:06:39 ] >>423 こんなんとか int cmp(int a[4], int b[4]){ int i, ret; for(i=0;i<4;i++){ ret=a[i]-b[i]; if(ret) break; } return ret; }
443 名前:デフォルトの名無しさん [2008/08/19(火) 21:38:42 ] いつのことだったか、ガリバーという人が訪ねたある国の人々が、 卵を大きい方の端から割る派閥(ビッグエンディアン)と、 卵を小さい方の端から割る派閥(リトルエンディアン)とに分かれて 争っていたんだそうな(とある国の政治家の風刺でもあるんだが)。 それにちなんで、MSBから先に格納するのをビッグエンディアン、 LSBから先に格納するのをリトルエンディアンと呼ぶんじゃよ。
444 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:46:40 ] 扱う数値の範囲によっては>>442 だとオーバーフローして逆の符号を返す可能性もある
445 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:48:34 ] 計算結果がオーバーフローorアンダーフローしてるかどうかを調べることってできる?
446 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:50:30 ] >>445 標準Cの範囲内では無理じゃないかな?
447 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 22:11:52 ] >>440 ちょw 条件後付
448 名前:440 mailto:sage [2008/08/19(火) 22:38:10 ] >>447 私に言うな。
449 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 22:53:17 ] ふつうに計算じゃなくてビット演算組み合わせればオーバーフローもチェックできるんじゃね?って思った
450 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:01:45 ] >>445 ,446,449 できるよ。 符号付きとなしとで微妙に変わるけど、加減算なら二つの数値の 最上位ビット見ればいい。 乗除算もちょっと手間かかるけどできなくはない。
451 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:09:23 ] 具体的にどうやんの 加算でもいいから教えてくだちい
452 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:16:07 ] 符号付での二つでの足し算で言うと 負と負なら答えは負なので最上位ビットは普通はずっと1、 オーバー フローすると0になる 負と正ならそもそもオーバーフローしない 正と正ならオーバーフローすると最上位は1になる そんな感じ
453 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:17:01 ] 桁あふれか 加算なら結果からもう一回引いてみればいいんじゃね? 元の数字に復元できれば桁あふれ無し。 元の数字にもどら無ければ桁あふれあり
454 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:26:06 ] オーバーフローした結果から引いたらアンダーフローして元に戻ると思うよ ・・・アンダーフローって意味違うような気がした
455 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:27:45 ] 半分のビット数ごとに分けて計算する
456 名前:デフォルトの名無しさん [2008/08/19(火) 23:31:35 ] >>453 お戯れを。
457 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:33:35 ] logで計算する
458 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:38:17 ] logで足し算できるものなら教えて欲しい。
459 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:39:47 ] 指でも折って数えるんだ 足りなくなったら隣の人の借りろ マイナスなど知らん
460 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:44:17 ] >>445 そもそも、どんなデータなんだよ。 そのオーバーフローやアンダーフローを気にしなくてはいけないデータというのは。
461 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:51:07 ] int add(int a, int b, int *p_is_overflow){ int chk_type, result, is_over_flow=0; chk_type=(a<0)*2+(b<0); result=a+b; switch(chk_type){ case 0: if(result>0) is_over_flow=1; break; // a, b ともに 0 以上なので解も 0 以上になるべき case 3: if(result<0) is_over_flow=1; break; // a, b ともに 0 未満なので解も 0 未満になるべき } if(p_is_over_flow) *p_is_over_flow=is_over_flow; return result; }
462 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:52:00 ] >>461 case の 0 と 3 間違えた
463 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 01:01:39 ] >>460 ちょっとした計算を代わりにやってもらうのプログラムなんですが 計算過程を式としては理解しているのですが、 計算途中の値がどの程度の大きさになっているのは知りません 知らないうちにオーバーフローしてるんじゃないかと少し不安なんです もちろん値が狂ったら答えも大抵はおかしくなるでしょうからそうそう困ることはないのですが
464 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 01:04:47 ] 出た答えが正常かおかしいかは判断できるのか? 方程式の解とかで元の式に代入して検算とかできるのなら困らないけど
465 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 01:37:58 ] >>461 の修正版 int add(int a, int b, int *p_is_overflow){ int chk_type, result, is_overflow=0; chk_type=(a<0)*2+(b<0); result=a+b; switch(chk_type){ case 0: if(result<0) is_overflow=1; break; // a, b ともに 0 以上なので解も 0 以上になるべき case 3: if(result>=0) is_overflow=1; break; // a, b ともに 0 未満なので解も 0 未満になるべき } if(p_is_overflow) *p_is_overflow=is_overflow; return result; } 掛け算は a*b/b==a をチェックすればいい 整数同士の除算は一つの例外を除いてオーバーフローしない (0div はあるけど)
466 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 01:57:37 ] その例外は・・・?
467 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 02:00:18 ] ヒント・大抵正の最大値より負の最少値のほうが絶対値が大きい
468 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 02:02:27 ] >>466 読みたくば●を買え C言語なら俺に聞け(入門篇) Part 12 pc11.2ch.net/test/read.cgi/tech/1178620766/951-952
469 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 02:04:57 ] 951 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/15(火) 14:28:25 これでダメな場合って lop==0 の時以外にあるかな? result=lop*rop; if(result/lop!=rop) オーバーフロー 952 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/15(火) 14:54:12 >>951 っ lop=-1 rop=INT_MIN
470 名前:402 mailto:sage [2008/08/20(水) 09:34:26 ] >>440 ありがとうございます。 今作っている物は1秒ごとの判断で良かったので最終的にtime()関数を使うことにしました。 gettymeofday();も今度試してみます。
471 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 10:39:41 ] このプログラムなら正常に動くんですが、main関数内のnibai関数を scanf("%d",&a); nibai(a); printf("二倍した数値は%d\n",a); と書くと2倍してくれないんですが、何故でしょうか? ----------------------------------------------------------- #include<stdio.h> int nibai(int x); int main(void){ int a; printf("数値を入力してください:"); scanf("%d",&a); printf("二倍した数値は%d\n",nibai(a)); return 0;} int nibai(int x){ int wk; wk=x*2; return wk;}
472 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 10:59:39 ] a = nibai(a);
473 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 11:00:37 ] あーなるほど!! ありがとうございます。
474 名前:ym [2008/08/20(水) 13:43:00 ] 受け渡された文字列が'0000'〜'2359'の時刻範囲内かをチェックする プログラムを教えてください。お願いします。 チェック内容は以下の通りです。 1. 受け渡された文字列が全て数値であること。 2. 受け渡された文字列の先頭2文字が'00'〜'23'の範囲であること。 3. 受け渡された文字列の3文字目〜4文字目が'00'〜'59'の範囲であること。 正常終了時:return 0 異常終了時:return -1(時刻範囲外)
475 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 13:45:10 ] 教えて欲しいのではなく宿題を丸投げしたいだけなら 宿題スレへ行ってください。
476 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 13:48:49 ] なんか最近範囲内チェックの質問多いな。全部同じやつか?
477 名前:ym [2008/08/20(水) 13:57:04 ] char hh[3]; char mm[3]; int h; int m; hh[0]=pstime[0]; hh[1]=pstime[1]; hh[2]='\0'; mm[0]=pstime[2]; mm[1]=pstime[3]; mm[2]='\0'; h=atoi(hh); m=atoi(mm); if((h >= 0 && h <= 23)&& (m >= 0 && m <= 59)){ return RET_OK; }else{ return RET_NG; } } int main(void) { char str[256]; int chk; gets(str); chk = N60901D04(str); printf("\nreturn=%d\n",chk); } 受け渡された文字列が'0000'〜'2359'の時刻範囲内かをチェックするプログラムなんですけど、コンパイルをしたら、 アルファベット4文字を入力してもreturn 0(正常)で判定されてしまったん ですけど、プログラムの中のどこが悪かったのか、教えてください。お願いします。
478 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 13:59:57 ] たぶん、数字以外で数値に変更できなかったから0になって0時0分は有効だから、じゃない? isdigit とかで先にチェックするとか。
479 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:00:28 ] >>474 int main(int argc, char *argv[]) { char *p; int n; for(p=argv[1] ; *p ; p++) switch(*p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; default: return -1; } switch(argv[1][0]) { case '0': case '1': break; case '2': switch(argv[1][1]) { case '0': case '1': case '2': case '3': break; } default: return -1; } switch(argv[1][2]) { case '0': case '1': case '2': case '3': case '4': case '5': break; default: return -1; } return 0; }
480 名前:デフォルトの名無しさん [2008/08/20(水) 14:01:42 ] >>477 atoiで変換は失敗すると0を返すからじゃね
481 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:02:11 ] あ、n消し忘れた
482 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:03:47 ] >>479 4桁目のチェックが抜けてないか?
483 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:05:20 ] >>482 必要あるか?
484 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:05:42 ] >>482 あーそうだね switch(argv[1][2]) { case '0': case '1': case '2': case '3': case '4': case '5': if(argv[1][3]) break; default: return -1; } こうか
485 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:07:05 ] >>483 ある [3]が\0のときも無視して通してしまう
486 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:09:08 ] 2桁目も switch(argv[1][0]) { case '0': case '1': if(argv[1][1]) break; だな
487 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:22:21 ] int check_time(const char *hhss) { int i, hour, second; if (strlen(hhss) != 4) return -1; for (i = 0; i < 4; i++) if (!isdigit(hhss[i])) return -1; hour = (hhss[0] - '0') * 10 + (hhss[1] - '0'); second = (hhss[2] - '0') * 10 + (hhss[3] - '0'); return (0 <= hour && hour < 24 && 0 <= second && second < 60) ? 0 : -1; }
488 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:29:42 ] 教えてください int型の2次元配列の先頭のポインターだけをもらってくる関数があります。 配列のサイズはわかっているんですが関数内で見る際にはどう記述すればいいでしょうか? これを関数内でいじりたい unsigned int hoge2div[100][200]; 関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。 (unsigned int* )hoge->ptr = hoge2div; 関数内の定義(ここを直したい。) unsigned int* 2div = (unsigned int* )2div->ptr;
489 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:30:40 ] >関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。 >(unsigned int* )hoge->ptr = hoge2div; こっちが正解です hoge->ptr = hoge2div;
490 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:36:52 ] unsigned int (*p)[DIV1_SIZE]=(unsigned int (*)[DIV1_SIZE])hoge->ptr;