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
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や携帯の機械語が生成できるのと同じ