1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ] 言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 26 pc11.2ch.net/test/read.cgi/tech/1206196600/ 過去スレ 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 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 105代目 pc11.2ch.net/test/read.cgi/tech/1208268461/
151 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:25:08 ] system はセキュリティ上の問題があるからな。 一応そこんとこは分かった上でよろ。
152 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:11:28 ] >>148 だからそのコードをキーボードから入力することについての話だったんだが・・・ 何ごちゃごちゃその定義にまで話を持ち込もうとしてんだ??? お前ってさぁ、自分のステータスは良くなくても、所有している スポーツカーがかっこいいだろ?乗るかい?って乗った女性を 家までさらっていくタイプだろ?目的がちがーうって振られるタイプでしょ?
153 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:19:13 ] スレ違い
154 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:25:20 ] ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t EOFの入力は余裕で可能です、ありがとうございますた。
155 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:36:35 ] 入力の終わりを通知することを「EOFを入力する」と定めるなら、余裕で可能です。
156 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:47:55 ] この前だってそういう話で終わったじゃないか。
157 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 03:01:33 ] 荒らしに付き合うやつも荒らし キチガイに付き合うやつもキチガイ
158 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 03:38:01 ] getchar()が云々はどうでも良い。キーボードから入力が可能です 当然EOFコードを検出するのに、ファイルの終わりを示している コードを使うのもありです、本当に本当に、重ね重ね、ありがとうございますた!
159 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:40:33 ] □!!!これを見た貴方は3日以内に死にます!!!■ ■死にたくなければ、このレスをコピーして他のスレに □ □10回貼り付けて下さい。1時間以内にです!もし無 ■ ■した場合は、今日寝ている間に富子さんがやってきて□ □貴方の首を絞めに来ます。富子さんは太平洋戦争の■ ■時に16歳という若さで亡くなった女の子で、未だに成 □ □仏していないそうです。信じる信じないは貴方次第。 ■ ■今年になってからこのレスを無視した人で、“呪われ □ □て死亡した人”が続出しています。これは富子さんの ■ ■呪い。呪われて死んでもいいのならこれを無視するこ□ □とでしょうね。 ■ ■――貴方がこうしているうちに富子さんが後ろから見□ □ていますよ…。 ■ ■□■□■□■□■□■□■□■□■□■□■□■□
160 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 11:08:02 ] おまえらがくだらん煽りあいをしてると初心者の人が質問しにくいだろ
161 名前:その1は宿題スレね mailto:sage [2008/05/02(金) 11:30:28 ] どうせここは隔離スレ(その2)だからどうでもいいよ。
162 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:51:56 ] 一つ目のウィンドウにHello、二つ目のウィンドウにWorld を表示させるにはどうすればいいんでしょう?
163 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:53:07 ] レベル7のエスパーを求む!
164 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:53:47 ] >>152 何か切れてる? Unixなら伝統的に ^D = EOF そそ、だからといって通常に ^D (0x04) が現れても EOF にはならないよ。 とにかくファイルに EOF というコードが有ると勘違いしるのかとおもった。 >>160 おっと、すまん。そのとおりだ。
165 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:07:28 ] >>164 どのOSならとかどーでも良いんじゃい(竹原風に) キーボードからの入力は可能だし、EOFはマクロで値が定義されているし なんならそれに応じた入力をしてやりゃ良いんだよ。所詮俺らが視覚的に 見えているものは、デジタルデータ、0と1の組み合わせの符号、信号。
166 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:52:18 ] 配列の宣言時に[]の中に変数って使えないんだっけ? char num[sum]; みたいな
167 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:52:54 ] >>166 C99じゃあるまいし
168 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:54:49 ] >>163 すまない。俺はまだレベル6だ
169 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:02:16 ] つまりC99では使えると
170 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:06:20 ] 「可変長配列」この辺かな ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719
171 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:14:11 ] >>170 そのページのsizeofのところでふいたw 図からわかるようにって、代入しただけで何がわかるんだよ
172 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:16:40 ] >>171 図の中のコメントに代入されるはずの値が書いてあるから それを見ろということだろ。
173 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:23:54 ] >>166 結論からいうと変数は使えない・・・ので malloc alloc がある。 char* num = (char*)malloc(num*sizeof(char)); ... *(num+5) = 5; // or num[5] = 0; // みたいな... ... free(num);
174 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:26:19 ] C99では使えるっつーの。
175 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:32:18 ] >>165 どうも何かごかいしているね。 EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?
176 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:37:27 ] >>175 君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も 人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。 所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで より幅広い環境で通用するという話。いい加減、大学にも通ってないような 低レベルとは話はしたくないんで。
177 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:38:13 ] >>174 使えた。
178 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:39:06 ] >>175 > この -1 は入力できない値(int)なのよ これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。 入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。 まぁ、こんな似非理系は当然、専門学校程度だろうけど。
179 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:46:30 ] ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t EOFの入力は余裕で可能です、ありがとうございますた。
180 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:47:14 ] >>172 コメントの数字が正しいことはどうやって証明するんだよw
181 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:48:12 ] >>180 …
182 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:50:47 ] プログラムが扱う変数として、EOFの数値データをchar型などで扱うかまで 入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で ループを止める際に、どうやって止めたいんだい、プログラムは?w 論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない 環境をいちいち持ち出されても迷惑。256色しか表現できない環境で 24ビット画像を正確に表示しようとしても無理なようにね。 くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて 定義されたとおりにコンピュータがデータを実装された能力に応じて 展開しているに過ぎない、人間が都合よく解釈できるように。 コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。 あとは規則に則って処理しているだけ。
183 名前:166 mailto:sage [2008/05/02(金) 23:57:21 ] >>173 ありがとう 何故か、当然変数で宣言できると思っててエラーでまくってた
184 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:57:49 ] >>178 そんなむきにならならなくても。
185 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:59:05 ] >>175 > この -1 は入力できない値(int)なのよ 別にint型とは限らなくね?符号ありのchar型にも収まる数値だが? #include <stdio.h> int main(void) { char a=EOF; unsigned char b=EOF; if(a==EOF) printf("a=EOF\n"); if(b==EOF) printf("b=EOF\n"); printf("a : %d / b : %d \n",a,b); return 0; }
186 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:10:02 ] さすがにそれはないわw
187 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:29:06 ] >>185 fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも なければ、stdin から入力できる値でもないと思うのですが。
188 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:30:53 ] >>185 ああ、ようやく普通の人にであえたきが・・。勘違い >>182 系に辟易だったので・・・ で、実はそうではない。上位ビットが負号を示すのに用いられてるわけだけど 負号無しの unsigned char の場合 0x00 = 0, 0xff = 255 になって 負号付きの signed char の 0x80 〜 0xff は -127 〜 -1 とするから -1 という意味合いはある。 だけどこの -1 を EOF とみてしまうと・・・それはとても困る。 なぜなら(0x00〜0xff) の範囲にあるものすべて扱えないといけないから。 (0xff)が出現するバイナリーファイルの入出力はできないって事になるでしょ? キーボードなどから (int(-1)) を入力できないデバイスはどうしたらいいかって事になるけど何度も既出だけど ^D (0x04) を犠牲にしそれを終端と意味付け、これをみて intサイズの -1 を返すという決めをしてる。 例で挙げている char a = EOF; の行でコンパイラから警告がでていない?(オプションによるけども char = int とするときの警告文) 後の比較系は int に負号拡張されるから見かけ動くようにみえてしまうので誤解しやすい。 0x7f (char) が 0x0000007f (int) に・・・同じ値 127 となる。 0x80 (signed char) が 0xffffff80 (int) に・・同じ -127 となる。 0x80 (unsigned char) は 0x000080 (unsigned int) ・・ 128・・という具合に・・ 上位ビットを負号ビットに割り当てたのは負号拡張がとても容易だから。 a b が printf に渡った時点で負号拡張された int となっているからね。
189 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:32:33 ] #include <stdio.h> int main(void) { char a=EOF; unsigned char b=EOF; int aa=EOF; unsigned int bb=EOF; if(a==EOF) printf("a=EOF\n"); if(b==EOF) printf("b=EOF\n"); printf("a : %d / b : %u \n",a,b); printf("aa : %d / bb : %u \n",aa,bb); return 0; } 後は受け付けた変数の型によって、それ相応に解釈されちゃってるけどね。
190 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:44:20 ] >>188 暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ
191 名前:デフォルトの名無しさん [2008/05/03(土) 01:01:03 ] 正直ここで何か聞こうかと思ってスレちょっと読んだが 「C言語きやすく質問おk」と書かれた扉を開けたら 腕組んでイライラした奴らがこっちを見て来た状況と同じくらい 質問しづらいんだが。
192 名前:デフォルトの名無しさん [2008/05/03(土) 01:22:02 ] 喋り方がむかつくってだけで正しい意見に対して脊髄反射で反論始めるとこうなるって良い見本だなw
193 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:33:53 ] >>183 おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。
194 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:53:55 ] >>191 あ!?んだよ!?
195 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:59:58 ] 放置のできないバカはプログラム以前のことを勉強しなおせ
196 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:41:22 ] IDの出ない板はNGにしにくくて困る いっそコテハンつけてその話題をやって欲しいんだが
197 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:47:00 ] とりあえずEOFをNGワードにすればおk 来月ぐらいまで我慢すれば飽きるでしょ
198 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:54:18 ] ちょ、宿題スレで解答書くときEOF使うから困るw
199 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:55:41 ] どうしても駄目なときはうpろだ使え むしろsizeofを間違ってNGしないように気をつけろ
200 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 04:57:32 ] EOFで騒いでいるキチガイ様はこちらの一等席(最高に頭の悪い発言をしてくださいスレ)へどうぞ pc11.2ch.net/test/read.cgi/tech/1179394713/l50
201 名前:デフォルトの名無しさん [2008/05/03(土) 08:33:17 ] --- EOF
202 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 10:55:48 ] ポインタ文字列、char* p = "ABCDE"; って場合は p[0] = 'F'; って変えれないんだよね? char num[80] = "ABCDE"; char* p = num; ってポインタが文字列のはいった「配列」をさしてないと ポインタに添え字つけて一文字代入するのは無理?
203 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 11:01:29 ] うん。規格の範囲内では無理ってことになってる。
204 名前:202 mailto:sage [2008/05/03(土) 11:04:39 ] >>203 ありがとう サンプルソースがなぜかポインタ文字列を直接操作してて エラーでまくるから、自分の環境が悪いと思い込んでた サンプルが間違ってたって事だね
205 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 12:21:00 ] 正確には未定義じゃなかったっけ 運が良ければ動くけどやるべきじゃないね
206 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:08:20 ] ポインタといえばちょっと前の zdnet builder の記事も酷かったな。 202のサンプルと同じ間違いもしっかり犯してたし。
207 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:24:32 ] >>206 過去形にするなや。未だに「レビュー中」のままだぞ。
208 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:43:08 ] >>207 なんでこいつ偉そうなの?w
209 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:48:07 ] 自分の意に沿わない発言は全て「偉そう」ですか。大儀ですな。
210 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:01:49 ] 大儀である。下がってよいぞ
211 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:04:02 ] 大昔、リテラル文字列をいじっていい時代があったんだよ・・・。 リテラル文字列を char* に代入できるのはそれとの互換性のため。 今はもちろんいじっちゃいけないが。 いじっちゃいけないようにすることで、 同じリテラル文字列が登場したらそれを共通化できるようになるし、 もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。
212 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:12:22 ] いやリテラル文字列は const char* constだから 普通にchar*に代入して参照できるわけだが。
213 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:19:39 ] >>212 おかしなこと言わない。 リテラル文字列は const char の配列であってポインタじゃないし (sizeof でサイズを取得できるから)、 char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が 特別に用意されているから。
214 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:20:47 ] const char* constってchar*に代入できたっけ?
215 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:21:06 ] >>213 おしい、後一歩だ、がんばれ
216 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:23:10 ] char* に暗黙にキャストできる、と言った方が良かったか。
217 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:32:05 ] >>207 過去形じゃないよ。現在完了形だよ。
218 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:43:46 ] >>216 ここのところずっとC++しか触ってないからできないもんだと思ってた Cだと警告しか出ないのね
219 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:46:24 ] なんか大卒の奴にいい負けしてかなり悔しいのぅ悔しいのぅな 時代遅れのオッサンが、GW中にどこにも出かけられないから ここで楽しんでいたところ、気分を悪くしてしまったようでw
220 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:53:58 ] >>218 チガウチガウ リテラル文字列を char* に暗黙にキャストできるという話。 これは C も C++ も同じ。
221 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:55:57 ] EOFの次はchar*にリテラル文字列ですか。とことん暇な人が多いですね。
222 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:57:54 ] EOF って何の話?
223 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:59:09 ] Eroi Oneesan Fujikochan
224 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:01:17 ] EOF<ガオー 人
225 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:01:49 ] >>220 「リテラル文字列は const char* const」 「const char* constは普通にchar*に代入して参照できる」 だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが 私が単に読み間違えただけか。
226 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:08:48 ] 普通はconst外ししようと思ったらキャストがいるけど、const char* const→char*だけは歴史的な理由によりそれが要らないってことだろ。
227 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:12:37 ] >>225 >「const char* constは普通にchar*に代入して参照できる」 こんなこと212しか言ってないような、 そして>>220 =216=214と>>212 は別人のような気がする。
228 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:15:30 ] >>214 と>>218 と>>225 が私で、 >>212 と>>216 と>>220 が同一人物だと思ってたんだけど それがすでに勘違いだったのか orz こりゃまた失礼しました
229 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:38:13 ] ttp://www.sgnet.co.jp/c/2-1.htm ここのサイトで #include <stdio.h> void main() { printf( "好きなことを書きましょう" ); } ってなっているので、実際にやってみると testa.c:1: error: missing terminating " character testa.c: In function `main': testa.c:3: warning: return type of 'main' is not `int' というふうにエラーがでます。 で、大学では #include <stdio.h> int main(void) って習ったのですが、どう違うんですか?こっちではうまくいったのですが。
230 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:40:19 ] Cの初心者なんですが、コマンドプロンプトに関して 質問があります。 こちらで聞いてよろしいんでしょうか??
231 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:41:49 ] >>229 そのコンパイラが日本語に対応してないんじゃね?
232 名前:229 mailto:sage [2008/05/03(土) 18:44:18 ] >>231 あ、すいません。 #include <stdio.h> int main(void) { printf("好きなことを書きましょう"); } で、うまく実行できたという意味です。
233 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:44:52 ] 素早い返答感謝です。 実行すると、内部ファイル云々、操作可能なプログラムと 認識されていません、と出ました。 内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・
234 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:46:24 ] 何の話か知らないが内定先に聞けよ
235 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:46:26 ] >>232 ttp://www.kijineko.co.jp/tech/superstitions/void-main.html
236 名前:229 mailto:sage [2008/05/03(土) 18:50:11 ] >>235 難しすぎてわからないのですが… ようは、void main() と int main(void) は同じような意味だから できたほうを使えってことですか?
237 名前:デフォルトの名無しさん [2008/05/03(土) 18:53:32 ] C++とCで仕様がちがうのでは?
238 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:55:36 ] >>236 戻りはint。引数は依存って書いてあるな。void main(void)は不可か
239 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:58:44 ] >>236 全部 int main でおk
240 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:01:50 ] >>229 そのサイトが嘘つき、もしくは正しい知識をもってない。 大学のほうが正解。
241 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:05:22 ] あとint mainでやるなら 正常終了したって事を示す「return 0;」を忘れずに
242 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:08:20 ] C99 なら大丈夫だけどね。 まだ C89 の環境多いから return 0; 書いた方がいいけど。
243 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:13:18 ] >>232 みたいなちょっと「動作確認しました」くらいのやつならC89でもreturn 省略してもいいよ。 逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。
244 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:15:48 ] 質問します。 Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを 使おうとおもってるんですが、printf関数でエスケープシーケンスを 出力すると、一旦出力バッファに貯められてしまうため、時間差で 音を出したくても上手く音が出力されません。 出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?
245 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:31:43 ] >>243 return を省略した際の動作は規格上は未定義。 C99 や C++ だと main 関数は特例として省略が可能だが、 C89 では main 関数にもそれが適用される。 大体の処理系は警告出すだけだがね。
246 名前:230 mailto:sage [2008/05/03(土) 20:03:24 ] 妙な事をきいてしまってすみません。内定先もGW中で 担当の方がいらっしゃらない物で。 失礼しました。
247 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:10:18 ] >>245 動作が未定義ってかリターン値が未定義だろ。 省略しても問題ないよ。 お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。
248 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:17:00 ] >>244 Drawin / *bsd 系なので Linux はどうかしらないが fflush 使うか raw モードにするというのももある // うまく管理して { int fd; struct sgttyb bk, fm; } { if((fd = open("/dev/tty", O_RDWR)) == -1) return -1; ioctl(fd, TIOCGETP, &bk); fm = bk; if(fm.sg_flags != RAW) { fm.sg_flags = RAW; ioctl(fd, TIOCSETP, &fm); } read(fd write(fd でどちらもバッファリング無しで入出力...
249 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:22:02 ] >>236 int main() { .... ; return 0; } ですればどうでしょうね。 return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは? void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。
250 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:25:31 ] めくじらっつーか、gcc じゃコンパイル通らんし。
251 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:37:49 ] >>250 だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。
252 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:38:49 ] >>251 仮にも 「講座」 を名乗るのにそれじゃマズいだろ。
253 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:41:52 ] 問題はおかしいかおかしくないか判断できない初心者がそれを読むってことだろ
254 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:58:37 ] そうガミガミすんなや、GWも後半に入ったというのに # 自分はどこにも行きませんけど
255 名前:229 mailto:sage [2008/05/03(土) 20:59:37 ] いろいろな回答ありがとうございます 大学で3回くらいしかまだ習ってないので(習ったのはprintf int forとかだけですけど) ばりばり初心者だったのですいません とりあえず普通に勉強していこうと思います ありがとうございました
256 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:35:52 ] 質問です。 下のコードは書いているものの一部なのですが、 コメントのつけてある位置でエラーが出てしまい、コンパイルが通りませんでした。 typedef struct {int line, *col;} match_info; match_info *info; match_info *str_search(FILE *fp, char *sstr) { int line_cnt; .... // line_cntはここで値が代入されている info = (match_info *)malloc((line_cnt+1) * (sizeof(match_info))); info+line_cnt = NULL; // ここでエラー .... } エラーの内容は error: invalid lvalue in assignment でした。ちなみにinfo = NULLとしたところコンパイルできました。 info + 1 = NULLと定数を使用するとやはりコンパイルできません。 何故オフセットすると値を代入することができなくなってしまうのでしょうか。 お願いします。 (エラーの出ている箇所はこの部分だけであり、載せていない部分ではエラーはありませんでした)
257 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:38:03 ] >>256 infoはポインタでしかないから、それに何かを足したものはただの値でしかないから代入はできない。 やりたいことは、info[line_cnt] = NULLではないのか?
258 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:39:34 ] *(info + line_cnt)
259 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:42:39 ] >>257 ないな。match_infoが構造体だから代入できない。 まぁ恐らく、 info[line_cnt].line = 0; info[line_cnt].col = NULL; なのだろう。
260 名前:デフォルトの名無しさん [2008/05/03(土) 21:56:30 ] うるせええええええええええええええええええぞ かすどもおおおお スレ違いなんだよ他でやれ
261 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:58:05 ] だからもちつけって (オレモナー)
262 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:09:21 ] >>257-259 お早いレスありがとうございます。 やりたいことは確かに>>259 の通りなのですが、 他の関数でinfoを門番までスキャンさせたくて、門番としてNULLを割り当てようとしました。 ちょうどコマンド引数のargv[argc]に'\0'が入っているような感じに使おうと思っているのです。 >>259 のようにしてしまうと、他の関数ではinfoのメンバーを知らなくてはなりません。 質問では触れなかったのですが、検索用の関数を作っています。 最終的には、main()側でstr_search()や,infoの内容を見る関数をラップした関数を使えるようにするだけで、 他の部分は全てヘッダファイルに移し、隠蔽してしまおうと考えていました。(言葉足らずですみません) つまりinfoは作業用変数としたいのです。 関数の設計も含めて、何か良い方法がありましたら教えていただけないでしょうか。
263 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:11:47 ] 最後の要素のcolかlineに特別な値を割り当てておくしかないだろう
264 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:14:33 ] >>262 できない。 infoが配列の要素を指している以上、 その値は必ず配列上に存在する要素へのポインタにしかなりえない。
265 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:16:02 ] あとはline_cntを公開しておくしかないな こーゆーことやるならC++のほうが圧倒的に楽だけどね…
266 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:18:13 ] >262 文字列の最後を\0で検出できるのは、\0が文字型の特殊な値だから。 同じように任意の型の配列の末尾を検出したいなら、特殊な値を割り当てて検出する以外にない。
267 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:22:50 ] どうしてもやりたいなら、 match_infoの配列ではなく、 match_infoのポインタの配列を使う。 match_info **info; info=(match_info **)malloc((line_cnt+1) * (sizeof(match_info *))); for(i=0;i<line_cnt;i++) info[i]=(match_info *)malloc(sizeof(match_info)); info[line_cnt]=NULL; こうすれば出来るけど、当然一個一個freeする手間がかかる。
268 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:24:02 ] >>262 argv[argc]は'\0'ではなくNULLな。 これはargvがポインタの配列だから実現できる。 infoはmatch_info型の配列だから、 末尾要素をNULLにしようとしても型が違う。
269 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:28:56 ] >>256 それはもしかするとこう? match_info** info; // ← match_info の配列ですね? { info = (match_info**)malloc(line_cnt+1)*szeof(match_info)); int i; for(i = 0; i < line_cnt + 1; i++) info[i] = NULL+ // ...
270 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:30:16 ] >>267 ががん。かぶってしもた・・
271 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:33:43 ] 構造体の中身を公開したくないのに構造体の内容で判定することはできない。 公開するか、ポインタの配列で実現するかの二択。
272 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:57:51 ] >>263-271 みなさんありがとうございます。 argv[]がargv[argc]までスキャンされるのは、 argv[]が文字列の"ポインタ"だからですね。勘違いしていました。 >>267 >>269 でおっしゃられているようにポインタ配列で実装しようと思います。 >>267 >>269 のようにmalloc()がネストされている場合は、 中をfree()してから外側をfree()しなければなりませんか? 手間がかかるようなら、>>263 ,265も考えてみようと思います。
273 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:07:18 ] |>>267 >>269 のようにmalloc()がネストされている場合は、 |中をfree()してから外側をfree()しなければなりませんか? もちろん
274 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:17:03 ] 正規表現のアルゴリズムを勉強したいんスけど、なんかグレートなテキストってないっスかねぇ〜?
275 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:23:46 ] >>274 エディタのマニュアルに書いてないかな
276 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:27:29 ] >>274 grepのソース
277 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:34:41 ] >>274 www.amazon.co.jp/dp/4781905854 この本に一章だけ書いてある。 本自体は有名だけど、この説明がいいかどうかは判断できない。
278 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:40:46 ] >>277 レビューワロタ 参考にしてる人多すぎだろ
279 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:40:52 ] 「詳説 正規表現」のコラムでも、正規表現をさらに学びたい人は >>277 の三章を進めると書いてあるな。
280 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 00:05:26 ] せっ・・・性器表現の勉強を(ry お勧めの参考書を(ry
281 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 00:21:41 ] >>274 手元にある本をあげておきます。 オートマトン・言語理論, 富田悦次・横森 貴, 森北出版 1992, ISBN4627805500 これがベストというわけではありませんが、まず理論的な部分をしっかりおさえておかないと、後々どうにもならなくなると思います。
282 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:45:27 ] #include のことを、シャープインクルードって言っていた香具師、手を上げろ! ノシ
283 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:50:06 ] えっ、違うの!?
284 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:52:10 ] 本場の職人なら、パウンド・インクルードという。
285 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:52:32 ] # #は井桁、ナンバーサインでシャープは♯なんだな。 斜めになっているのが縦棒か横棒か、違うんだなぁ。 シャープは楽譜の記号で使われているんだなぁ。 ぼぼぼ、僕はおにぎりが欲しいんだなぁ。
286 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:18:42 ] C#とかあるし、シャープで伝わるからそう読んでるな むしろ井桁とかだと通じないことがあるし
287 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:29:29 ] シーナンバー・・・うむ・・・いや、いや、そうじゃなくて、C♯はちゃんと シャープと書かれているんでしょう。同一視してはならぬ、決して。
288 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:35:23 ] C#は間違いなく井桁だな まぁシャープの代わりに井桁を使っているから、井桁をシャープと読むのは不適切かも知れないが 井桁が通じないことがあるんだからしょうがない もっと普及させてこい。話はそれからだ
289 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:42:53 ] ♯の半角が存在しないから、代用しているのさ・・・そう思いたい・・・きっとそうだ。 ♯を英語圏にも広めよう!
290 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 07:35:58 ] >>284 マジなのか どうでもいいけど ttp://cplusplus.syntaxerrors.info/index.php?title=Extra_tokens_at_end_of_pound_include_directive
291 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 09:46:44 ] 英語だといろんな呼ばれ方があるみたいだ。「シャープ」も含めて。 en.wikipedia.org/wiki/Number_sign#Other_names_in_English
292 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:17:44 ] 値のビット列表示をしたいのですができません 共用体とビットフィールドを使って実現しようと思ったのですができませんでした 下のプログラムだとどこがだめなんでしょうか? #include <stdio.h> int main(void){ union bits{ char ch; unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; } bits; bits.ch = 'a'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); bits.ch = 'b'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); bits.ch = 'c'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); return 0; } /* 実行結果: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 */
293 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:18:38 ] fgets(str, 32, fp); こんな感じに書いたときに、 strの宣言がcharの配列だったらいいけど、 charへのポインタだったらだめだった。どうして?
294 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:31:08 ] >>293 運が悪くポインタの指す先が書き換えてはいけない場所だったから
295 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:54:19 ] >>292 a, b, c, d, e, f, g, h が union で共用されているから #include <stdio.h> int main(void){ union bits{ char ch; struct{ unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; }; } bits; bits.ch = 'a'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); bits.ch = 'b'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); bits.ch = 'c'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); return 0; }
296 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:56:19 ] >>293 ポインタを初期化していなかったに一票
297 名前:293 mailto:sage [2008/05/04(日) 11:04:20 ] >>294 >>296 そうだよね、何処にあるかわからない入れ物を渡してもダメに決まってるよね。 すっきりしますた。
298 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:10:44 ] >>295 unsigned とかやってるとサイズが4バイトになるから union bits{ char ch; struct{ unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; }; } bits; にしないとマズいかもしれない。 ただ、ビットフィールドを含む構造体のサイズは処理系依存なので難しい所だが。 さらに言えばビットフィールドのビットがどちら側から埋められるかは処理系依存だから、 union bits{ char ch; struct{ #ifdef BITFIELD_LITTLE_ENDIAN unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1; #else unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; #endif }; } bits; として処理系ごとに切り替えられるようにするのが良い。
299 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:13:03 ] unsigned char に対応していない処理系を考慮するなら union bits{ char ch; struct{ #ifdef BITFIELD_LITTLE_ENDIAN #ifdef BITFIELD_INT_SIZE unsigned : sizeof (unsigned int) * CHAR_BIT - 8; unsigned h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1; #else unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1; #endif #else #ifdef BITFIELD_INT_SIZE unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; #else unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; #endif #endif }; } bits; とすることになるが、この共用体のサイズが1であることは期待できない。
300 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:28:45 ] >>295 ,298,299 ビットフィールドが全部同じ位置を使っていたということですね プリプロセッサディレクティブは未学習なのですが、イメージはつかめました ありがとうございました
301 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:05:18 ] 1ビットしかなくて読むだけなのにビットフィールドの共用体なんてフツー使わねえよ。 #define BIT(val, pos) (((val) >> (pos)) & 1) int ch; ch = 'a'; printf("%d %d %d %d %d %d %d %d\n", \ BIT(ch,7), BIT(ch,6), BIT(ch,5), BIT(ch,4), BIT(ch,3), BIT(ch,2), BIT(ch,1), BIT(ch,0));
302 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:08:57 ] >>301 普通って何さ
303 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:38:48 ] >>302 普通って普通さ
304 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 13:43:24 ] まあ確かにビットマスク使ったほうが楽だな
305 名前:デフォルトの名無しさん [2008/05/04(日) 17:45:50 ] コマンドプロントでテキストファイル.Cをコンパイルするにはどうすればいいの? パスはしたの通りです。 C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C C:\Bディレクトリ\コンパイラ
306 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:18:23 ] > コンパイラ /? > コンパイラ /H $ コンパイラ -h $コンパイラ --help
307 名前:デフォルトの名無しさん [2008/05/04(日) 18:53:08 ] えwどういうことw
308 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:55:18 ] >>307 コンパイラによって方法が違うからコンパイラのマニュアルを見るか 有名なコンパイラなら名前を書け
309 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:55:53 ] ヘルプ見ろ
310 名前:デフォルトの名無しさん [2008/05/04(日) 19:05:39 ] え そうなんだ MinGWなんだけど
311 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:12:19 ] MinGWならgccかな > C:\Bディレクトリ\コンパイラ が気になるけどたぶん gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C どっちかかもね?
312 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:20:27 ] gcc --help と叩けば使いかたが出る。
313 名前:デフォルトの名無しさん [2008/05/04(日) 19:31:39 ] > C:\Bディレクトリ\コンパイラ は C:\TYC4TH\gcc ってことです その二つでためしたんですが、 gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合 'gcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと 'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません
314 名前:デフォルトの名無しさん [2008/05/04(日) 19:33:02 ] ってでます><
315 名前:デフォルトの名無しさん [2008/05/04(日) 19:39:10 ] >>312 なんか英語がたくさんでて意味がわからない・・・
316 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:42:10 ] 日本語を含む場合は""で括る 例)gcc "C:\Bディレクトリ\コンパイラ" >'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。 gccコマンドのパスが通っていない、正しくない
317 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:49:07 ] gccインストールしてからMinGWインストールすると パス通すかの確認があった気がしたけど・・・ MinGWをインストールしなおして確認してみるか、 $HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ を追加してみ MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな ちなみにMSYSも入れるとうれしくなれるかも
318 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:49:48 ] >MinGWコンパイラの入ってるパスは コンパイラの入ってるパスは 訂正
319 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:51:13 ] >コンパイラの入ってるパスは コンパイラの入ってるディレクトリは 打つ出し脳
320 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:51:51 ] MinGW - Minimalist GNU for Windows OSはWindowsじゃないの? XP なのか 9x なのかによっても設定方法違うけど
321 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:55:06 ] c:\autoexec.batに PATH=c:\MinGWまでのディレクトリ\bin;%PATH% これを書き込んで再起動すればばよかった、、、はず・・・多分
322 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:57:08 ] 折角隔離スレがあるんだから誘導しろよ。 Cygwin + MinGW + GCC 相談室 Part 3 pc11.2ch.net/test/read.cgi/tech/1177944767/
323 名前:デフォルトの名無しさん [2008/05/04(日) 20:19:39 ] おぉ できたかもです!! みなさんありがとうございます。 さっそく勉強してきます。
324 名前:デフォルトの名無しさん [2008/05/04(日) 20:51:46 ] #include <windows.h> typedef HRESULT (STDMETHODCALLTYPE *LPFNGETCORSYSTEMDIRECTORY)(LPWSTR, DWORD, DWORD *); int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { WCHAR szBuf[256]; DWORD dwLength; HMODULE hmod; LPFNGETCORSYSTEMDIRECTORY lpfnGetCORSystemDirectory; 略 lpfnGetCORSystemDirectory = (LPFNGETCORSYSTEMDIRECTORY)GetProcAddress(hmod, "GetCORSystemDirectory"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (lpfnGetCORSystemDirectory == NULL) { MessageBox(NULL, TEXT("関数がエクスポートされていません。"), NULL, MB_ICONWARNING); FreeLibrary(hmod); return 0; } 略 } 上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。 どなたかご教示お願いします。
325 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 21:53:20 ] >>293 以下の記述で普通に動作しています。 環境 cygwin/WindowsXP, 処理系 gcc 3.4.4 #include <stdio.h> #define N 1024 int main() { char buffer[N], *p; p = buffer; fgets(p, N, stdin); printf(">%s", p); return 0; } /* end */ 動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。
326 名前:325 mailto:sage [2008/05/04(日) 21:54:30 ] 失礼、解決ずみでした。
327 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 01:40:56 ] >>324 関数ポインタとは動作するものではありません もう少し質問内容を吟味してくださらないと答えようがありません
328 名前:デフォルトの名無しさん [2008/05/05(月) 04:08:44 ] >>81 ってどうやるのかな
329 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 06:47:41 ] >>324 何を聞きたいのか今ひとつわからんが、とりあえずMSDN。 msdn.microsoft.com/ja-jp/library/64tkc9y5 (VS.80).aspx
330 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:03:48 ] >>324 GetProcAddress は指定した関数へのアドレスを返すんだけど、 GetProcAddress の戻り値の型は1つに定めないといけないので GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。 実際にこの関数のアドレスを使う際には、 本来の関数ポインタ型へとキャストして使う必要がある。
331 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:15:49 ] stdlib.hにあるsystem関数って、標準ですか? どの処理系でもまともな動作が期待できる?
332 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:04:12 ] >>331 プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。 質問がとんでもなく飛んでいる。 どの処理系・・・列記してみて まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)
333 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:19:24 ] >>331 標準じゃない
334 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:25:08 ] >>324 このソースって凄いね(大文字ばっかで・・・w) 関数のポインターについてだけど ポインターはアドレスを示すのは判りますね。 int body1(char* mes) { printf("body1 : %s¥n", mes); return 0; } int body2(char* mes) { printf("body2 : %s¥n", mes); return 0; } { int (*func)(char*); func = body1; func("message"); func = body2; func("message"); } みたいな。 lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。 あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。
335 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:57:10 ] >>331 関数そのものは標準であり、 どの処理系であろうと「処理系の考えるところのまともな動作」をする それが「プログラマの期待するところの動作」と一致するかはわからない
336 名前:デフォルトの名無しさん [2008/05/05(月) 16:02:52 ] ここのレス見ても何も分からないほどの初心者ですが教えてほしいことがあります。 課題でこのプログラムを組まないといけないのですが、全く分かりません。 問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。 ただし行列a,bは以下のものを使用する。 |0 1 2| |0 3 6| a=|3 4 5| b=|1 4 7| |6 7 8| |2 5 8| aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
337 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:12:06 ] >>336 >aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。 行列の積の定義から勉強しような。 行と列が逆だと思うぞ。
338 名前:デフォルトの名無しさん [2008/05/05(月) 16:23:36 ] >>337 すいません。丁寧に指摘してくださってありがたいです。 一応僕が作ったプログラムを載せておきます。 #include<stdio.h> main(){ int a[3][3]={{0,1,2},{3,4,5},{6,7,8}}; int b[3][3]={{0,3,6},{1,4,7},{2,5,8}}; int c[3][3]={0}; int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) c[i][j]=a[i][j]*b[i][j];} for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%d ",c[i][j]); printf("\n"); }} 足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、 どうすればよいのでしょうか、あつかましいですがよろしくお願いします。
339 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:28:36 ] (っ´▽`)っ #include <stdio.h> int main(void) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}}; int ab[3][3]; int i; int j; int k; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); } } } return 0; } 答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}
340 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:29:04 ] >>338 行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。
341 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:30:14 ] for(n = 0; n < 3; n++){ for(m = 0; m < 3; m++){ for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m]; } } こんな感じ?
342 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:33:49 ] >>338 (っ´▽`)っ x行n列の行列Aのi行j列成分をa(i, j)、 n行y列の行列Bのi行j列成分をb(i, j)、 ABのi行j列成分をab(i, j)と表示するとき、 ab(i, j) = Σ(k=1→n)a(i, k)b(k, j) 線形台数の教科書を見直せ☆
343 名前:デフォルトの名無しさん [2008/05/05(月) 16:51:00 ] >>339->>342 初歩的なことなのにわざわざ教えてくださってありがとうございます。 感謝しています。 あとほんとに初心者的なことなんですが、>>339 さんのプログラムで計算は出来ました。 しかし答えを表示させようと思ったら、なんか変な結果になりました。 以下プログラムと結果です。 (最初のほうは省略) for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); printf("%d ",ab[i][j]);} } } return 0; } 結果 0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149
344 名前:デフォルトの名無しさん [2008/05/05(月) 16:52:39 ] >>342 ゆとり乙 数学3cのレベルです
345 名前:344 [2008/05/05(月) 16:54:36 ] >>342 ごめんなさいゆとりは俺でした 数学3cじゃねええええええええええ あああああああああああああ何か勘違いしてたああああああああ
346 名前:344 [2008/05/05(月) 16:55:21 ] やべえ今までで一番恥ずかしい書き込みだ
347 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:55:51 ] 最近Cを始めた者なんですが CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? ポインタを使うような関数を自分で作る必要がありますか? 何かサンプルなどもありましたらお教えください。
348 名前:336 [2008/05/05(月) 16:55:51 ] 僕はちなみに本当のゆとりです。
349 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:56:55 ] 落ち着け 寿司食うか?
350 名前:344 [2008/05/05(月) 16:58:16 ] 大体3cとかあんまりやってねぇんだよ・・・ ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ? 行列式はなかったよな・・・あぁ・・・俺なにやってんだろう
351 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:58:59 ] > ab[i][j] += (a[i][k] * b[k][j]); > printf("%d ",ab[i][j]);} ~~~ 中括弧の位置
352 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:03:14 ] >>343 (っ´▽`)っ printfを最も内側のループの外に出せ☆ #include <stdio.h> int main(void) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}}; int ab[3][3]; int i; int j; int k; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); } printf("%d\t", ab[i][j]); } printf("\n"); } return 0; }
353 名前:344 [2008/05/05(月) 17:05:08 ] ああああああああああああああああああああああ
354 名前:344 [2008/05/05(月) 17:06:41 ] ダメだ・・・
355 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:08:02 ] 五月蝿い トイレでも篭ってろ
356 名前:344 [2008/05/05(月) 17:08:42 ] 線形台数の教科書読んできますノシ
357 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:10:23 ] >>347 >CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? ない >ポインタを使うような関数を自分で作る必要がありますか? ある 文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること まずCのやりかたというものを覚えるのが先
358 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:12:08 ] >>347 (っ´▽`)っ b = LEFT(a, n) は strncpy(b, a, n); b[n] = '\0'; b = MID(a, m, n) は strncpy(b, &a[m-1], n-m+1); b[n-m+1] = '\0' で。
359 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:13:30 ] (っ´▽`)っ 最後セミコロンが抜けたが気にしない☆
360 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:14:05 ] >>347 >CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? どちらもsprintf()で代用可能。
361 名前:336 [2008/05/05(月) 17:14:14 ] >>351->>352 おかげさまでうまく答えも出ました。本当にありがとうございます。
362 名前:344 [2008/05/05(月) 17:14:54 ] >>361 俺と一緒に勉強しようぜ
363 名前:347 mailto:sage [2008/05/05(月) 17:17:36 ] >>357-360 ご回答ありがとうございました。 サンプルを参考にしながらC勉強をしていきます。
364 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:23:39 ] (っ´▽`)っ 正確には (っ´▽`)っ b = LEFTB(a, n) は strncpy(b, a, n); b[n] = '\0'; b = MIDB(a, m, n) は strncpy(b, &a[m-1], n-m+1); b[n-m+1] = '\0'; だ。 strncpyの第3引数はバイト数。 LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。
365 名前:336 [2008/05/05(月) 17:35:16 ] >>362 共にがんばりましょう。
366 名前:デフォルトの名無しさん [2008/05/05(月) 17:44:26 ] unsigned __int32 hentai, doutei; hentai = 293317826; doutei = 899523; 仮に上のように hentai と doutei に格納された数値において、 hentai += doutei; // 293000000 + 899253 のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。 条件は if ( hentai > doutei && doutei >= 0 && doutei < 1000000) で、思いついたのが hentai = ((hentai / 1000000) * 1000000) + doutei; 納得がいかないのでスマートなやり方教えてくれ。
367 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:50:49 ] >>366 十分スマートと思うが、どういう点で納得がいかないんだ。 hentai += doutei - hentai % 1000000;
368 名前:デフォルトの名無しさん [2008/05/05(月) 17:58:57 ] >>367 おお、サンクス。 除算か乗算どちらかを一回でも削りたかったんだ。
369 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 21:57:45 ] >>363 Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな? >>360 参考までに書いてくれると周りも参考になるとおもう。 せいぜい数行だと思うから sprintf で書いてみてよ。
370 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 22:12:13 ] >>369 360じゃないが、こうじゃないかな。 char* left(char *dst, const char *src, int count) { sprintf(dst, "%.*s", count, src); return dst; } char* mid(char *dst, const char *src, int pos, int count) { return left(dst, src+pos, count); }
371 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:40:11 ] C言語用でお勧めのフリーコンパイラを教えてください
372 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:43:44 ] >>370 おお、%.*s ・・・しらなんだ。
373 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:47:34 ] >>371 ・ GCC (MinGW) ・ Microsoft Visual C++ Express Edition 2008 好きなの選べ
374 名前:デフォルトの名無しさん [2008/05/06(火) 00:05:01 ] >>373 その2つの違いがまったくわかりません… それとMSの方はC++となってますがC言語にも対応してるんですか??
375 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:08:44 ] おまえは紹介されたコンパイラについてちゃんと調べたのか?
376 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:09:31 ] >>374 MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。 gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。 まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。
377 名前:デフォルトの名無しさん [2008/05/06(火) 00:24:49 ] fputc( )の使い方の説明で int fputc(int 文字、FILE *ストリーム); fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。 とあるんですが、上位バイトはどうなるんですか?
378 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:25:59 ] 捨てられる
379 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:26:49 ] ttp://www.bohyoh.com/CandCPP/C/Library/fputc.html
380 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 08:01:36 ] vistaで動くコンパイラだったら何がいい? やっぱりbcc、gcc辺りかな
381 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:42:29 ] VC++ 2008 Express Edition
382 名前:デフォルトの名無しさん [2008/05/06(火) 09:53:56 ] uint16 とか uint8 とかは int とどう違うのですか? 使い方を教えてください。
383 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:54:04 ] Express Editionとgccの好きな方
384 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:56:25 ] uint16_t や uint8_t なら標準(C99)で用意されているが uint16 や uint8 は標準では用意されていない。
385 名前:382 [2008/05/06(火) 09:59:52 ] >>384 もう少し詳しくお願いします。
386 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:11:53 ] >>385 標準で用意されてない以上、 ヘッダファイル内にある定義を見てくださいとしか言いようが無い。
387 名前:382 [2008/05/06(火) 10:22:11 ] >>386 ということは・・・ uint16 uint8 はwindows.hとかでも定義されてる分ではなく、 自分の使っているライブラリかなにかで定義されているということですね。 わかりました。 調べてみます。
388 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:24:30 ] >>387 windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。 そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。
389 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:25:09 ] 処理系独自に定義されてるかもしれないが、 どの処理系使ってるかも知らんし、 結局自分で調べてくれ、というこった。
390 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:51:05 ] struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram hist); int main (void){ struct histgram hist; int z; hist.x = 0; for(z=0;z<100;z++){ hist.y[z]=0; } printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); one(hist); printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); for(z=0;z<9999999999;z++); return 0; } void one(hist){ two(hist); void two(hist){ int z; hist.x = 1; for(z=0;z<100;z++)hist.y[z]=1; } とするとtwo(hist)でエラーが起きます。なぜでしょうか?
391 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:57:38 ] すいません、解決しました。
392 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:00:16 ] INT_MAX 4bites = 2147483647 < 9999999999
393 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:02:26 ] やっぱうまくいきません。 struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram hist); int main (void){ struct histgram hist; int z; hist.x = 0; for(z=0;z<100;z++){ hist.y[z]=0; } printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); two(hist); printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); for(z=0;z<9999999999;z++); return 0; } void two(struct histgram *hist) { int z; hist->x = 1; for(z=0;z<100;z++){ hist->y[z]=1; } } は何がいけないのでしょうか?
394 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:04:25 ] two()は構造体のポインタを受け取る関数 main()で呼んでるtwo()に渡されてるhistは構造体そのもの あと>392
395 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:06:22 ] bites …くそorz
396 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:11:21 ] Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい
397 名前:393 mailto:sage [2008/05/06(火) 14:11:59 ] www9.plala.or.jp/sgwr-t/c/sec15-4.html ここに、393のようにかけと書いてありました… 393を書き直した正解はどうなるのでしょうか? グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく 処理された任意の変数をn個、n-1個上の階層で使用したいのですが
398 名前:393 mailto:sage [2008/05/06(火) 14:12:39 ] >396 ありがとうございます。使ってみます。
399 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:24 ] #define ZETTAI(x) (x < 0) ? -(x) : x int x; x = ZETTAI(-9 - 50) + 5; これでxの中身が59になってしまうのですが、何故でしょうか? -59をZETTAIで59にした後、5を加算しているはずなのですが
400 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:47 ] >>.397 そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、 ポインタを引数としてとるseidesp2()にそのまま渡すことができる。 >>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。 >グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく >処理された任意の変数をn個、n-1個上の階層で使用したいのですが 言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。
401 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:21:07 ] コンパイラのエラーメッセージをちゃんと読め。 プロトタイプ宣言と定義が噛み合っていないぞ。 void two(struct histgram hist); void two(struct histgram *hist)...
402 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:09 ] >>399 x = ZETTAI(-9 - 50) + 5; ↑は↓のように展開されるから。 x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; これはもちろん x = (-59 < 0) ? 59 : -54; と解釈されて、xには59が代入される。 マクロZETTAIの正しい宣言は下のようになる。 #define ZETTAI(x) ((x < 0) ? -(x) : x) もちろん自作などせずにライブラリ関数を使うことが望ましい。
403 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:31 ] >>399 #define ZETTAI(x) (x < 0) ? -(x) : x を #define ZETTAI(x) (((x) < 0) ? -(x) : (x)) にしておてきなさい。
404 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:30:39 ] >>402-403 上手くいきました ありがとうございます ですが、 >x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; 同じxなのに何故一番右のxだけに+5がくっつくのですか?
405 名前:393 mailto:sage [2008/05/06(火) 14:30:43 ] すいません、結構理解に手こずってます。 配列でなく、実体を受け渡しする場合は、 struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram *hist); int main (void){ struct histgram hist; int z; hist.x = 0; printf("before***%d***%d***%d***",hist.x); one(&hist); printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]); return 0; } void one(struct histgram hist){ two(&hist); } void two(struct histgram *hist){ int z; hist->x = 1; } だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。 というエラーが出てしまいました。
406 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:01 ] >>404 元のx=の式の一番右の+5がそのまま残っているだけ。
407 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:58 ] >>405 構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。
408 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:42 ] >>406 つまり #define ZETTAI(x) (x < 0) ? -(x) : x を #define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね? #define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね! 理解できました 丁寧にありがとうございました
409 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:56 ] まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。
410 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:29:22 ] いいから黙ってstdlib.h::abs()を使え
411 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:49:43 ] やっぱ自作するより、ライブラリ探したほうがいいのかな
412 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:26 ] absはintだから・・・
413 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:59 ] そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。
414 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:00:03 ] >>399 悪いことはいわん。inline 使え。 #define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?
415 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:03:58 ] inline は C99 からだから
416 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:56:05 ] >>415 そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?
417 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:00:59 ] VC++ は C89 だ
418 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:03:14 ] まぁ、最適化を当てにして関数にしておけってのはありだがな。
419 名前:デフォルトの名無しさん [2008/05/07(水) 08:24:58 ] すみません質問させてください。 入門書見て書いてるんですが #include <stdio.h> int astoi(const char s[]) { int i; int number = 0; for(i = 0; s[i] >= '0' && s[i] <= '9'; i++) number = 10 * number + (s[i] - '0'); return(number); } int main(void) { char x[]= "1234"; printf("%d", astoi(x)); return(0); } という文字型を数値に変えるプログラムで、 number = 10 * number + (s[i] - '0'); のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか? この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。
420 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 09:07:44 ] >>419 文字を数値へ変換してる asciiコードとかがポイント
421 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:06:21 ] 誰か>>414 の >#define は C言語ではない の意味を説明してくれないか?
422 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:12:54 ] >>421 プリプロセッサの範疇だと言うことだろ。
423 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 12:12:00 ] >>419 s[i]というのは文字コードが格納されている '0'というのも、数値の0ではなくて文字0の文字コードが格納されている '1'は'0'より文字コードが一つ大きいんだ つまり'1'から'0'を引けば数値の1が返るという仕組み
424 名前:デフォルトの名無しさん [2008/05/07(水) 13:12:40 ] >>419 ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ! ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。
425 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:49:07 ] コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?
426 名前:419 mailto:sage [2008/05/07(水) 14:49:58 ] asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。 レスしてくれたみなさん、ありがとうございました!
427 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:49:27 ] プリプロセッサも、C標準に規定されている訳だし、 C言語の一部と考えてもいいんじゃないかな。 プリプロセッサがなきゃコメントすら書けん
428 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:50:27 ] >>426 せめてGoogleくらいは味方にしておこう。
429 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:00:13 ] プリプロセッサの問題点はC言語の一部かどうかじゃなくて コンパイラと完全に独立しているところ
430 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:11:51 ] 問題点ではないだろ
431 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:13:36 ] 問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。
432 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 19:53:41 ] プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。 #include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・ ただ #define で色々マクロ組むのはどうかな。 美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。 #define CONSTANT_VAL 50 ではな const int CONSTANT_VAL = 50; こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。
433 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:00:28 ] それは別に警告出ないと思う。 マクロは使わなくていいなら使わない方がいいってのは賛成だが、 C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。
434 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:01:59 ] プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・ 引数の型気にしなくてもいいマクロとか素敵じゃない?
435 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:03:47 ] マクロはどう展開されてどう実行されるのかを理解して無いと バグを生むことがあるってのがアレなんだろうね
436 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:10:13 ] そんなとうにされつくしてる議論してんなよ・・・・・・・・
437 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:14:03 ] >>436 入門篇って書いてあるし、議論すればえ〜ねん
438 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:16:43 ] >>433 私はこのレベルの警告を出すようにしてる。 >>434 そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。 #defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど a = -3; k = abs(a++); 結果は悲惨になるけど気付きにくいでしょ? これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。
439 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:19:39 ] C++ だとそれを何とかするために関数テンプレートが導入されたが、 C だとやっぱどうしてもマクロになっちゃうんだよなあ。
440 名前:434 mailto:sage [2008/05/07(水) 20:24:50 ] >>438 マクロの怖さを頭ではなく心で理解したわ
441 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:26:02 ] ABSにすれば解決
442 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:52:15 ] 馬鹿が使えば包丁も自動車も凶器になる。
443 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:45:43 ] >>435 それを言ったら無知と無理解はなんだってバグのもとだろ
444 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:51:07 ] 所詮人間一人なんてちっぽけな存在さ。自分一人なんて この世の60億分の1に過ぎない存在。万能、全知全能、 絶対権力者の人間なんて存在しない。 人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。 そんなもん。だから、気ぃ張るなや、適当に生きろ。 どうせお前が強がっても、地球の運命までは変えられないから。 せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ 出来んやろ?なっ?俺はずっと共産党に投票してたけどな。
445 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:09:35 ] マクロを使うと一見上級者のようでかっこいいんだけどね 地道に関数でということかな
446 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:12:57 ] ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが 同じ道路交通法が適用されている道で守るべきルールは同じさ。 それよりも、ドライバーの運転技術はいかがなものか?他に、 アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が 加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。
447 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:15:20 ] ええいお前のたとえは分かりにくい
448 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:35:14 ] linuxのコンソール上でカーソルの処理を行いたいのですが、 カーソルの処理には何を使ったらいいのでしょうか? ncursesはできれば使いたくないです。 ttp://oshiete1.goo.ne.jp/qa3121681.html の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。 よろしくお願いします。
449 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:12:49 ] >434 型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。
450 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:21:56 ] >>434 昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・ 昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。
451 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:23:27 ] FORTRANなら普通の事です
452 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:25:14 ] >>445 マクロ使っても全然上級者には見えないから安心して関数を使おう
453 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:28:26 ] 可読性、保守性の高いソースを書く人のほうが上級者に見える。 まあマクロはその手段の一つなんだけれども。
454 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:31:13 ] 浮動小数点の定数って定義できるんだっけ? C++でも未だにマクロ使ってるんだけど
455 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:35:27 ] 別に定数を定義することくらいはできるけど。 ただ、初期化順でハマることはあるかもしれないね。
456 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:37:42 ] voidポインタの参照先はビットシフトできないのかな?
457 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:40:54 ] >>456 void*をint*にキャストしてシフトすれば?
458 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:43:20 ] >>456 何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。
459 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:57:36 ] キャストしたらできた! これって任意のバイト数を指定することはできないのかな? mallocで指定しても駄目だったし無理か・・・
460 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:59:21 ] >>459 > これって任意のバイト数を指定することはできないのかな? 意味不明
461 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:16:42 ] void*の参照先を任意のビット幅としてビットシフトしたいんです
462 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:18:04 ] 自分でそういうプログラム書け。
463 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:26:54 ] >>461 それ、何のデータ?
464 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:28:38 ] ビットシフトすりゃいいじゃん。
465 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:35:13 ] >>463 void*の参照先ですか? intとかcharとか不定です void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・
466 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:38:59 ] とりあえずバイトオーダをはっきりしておかないとな。 リトルエンディアン環境の場合、数十バイトだろうが その全体でリトルエンディアンになることを仮定していいのか、 それとも4バイト単位でリトルエンディアンになることを仮定するのか。
467 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:44:48 ] >>465 char*にキャストして一バイトごと表示しろよ
468 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:51:12 ] >>466 リトルエンディアンだとおもう よくわからないから続きはwebで勉強してくるわ >>467 おk試してみる
469 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:05:04 ] >>461 できない ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない どうしてもやりたいなら自力でそのような関数を作るしかない
470 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:11:23 ] キャストすればいくらでもできるだろ・・・。
471 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:16:35 ] >>470 んなアホな charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ
472 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:20:12 ] もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな それだったらlhaの解説書見れば早いと思う
473 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:27:33 ] >>471 結局できるんじゃないか
474 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:39:36 ] >>473 「ビットシフト」の言葉の食い違いだったようだ 俺が考えてたのは組み込みのビットシフトのことね そっちは概念としてのビットシフトだよな
475 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:41:10 ] > 組み込みのビットシフ なんじゃこれは?ト
476 名前:デフォルトの名無しさん [2008/05/08(木) 02:38:42 ] プロトタイプ static void mera(const char *); このとき 1) void mera(const char *merami) 2) void mera(const char* merazooma) 1だけのはずが 2のようなものも通ってしまうのはどうして? どちらでも良いという意味ならば、どちらが推奨なの? また、 static void bagi(const char ****); このとき 1) void bagi(const char ****bagima) 2) void bagi(const char**** begiragon) どちらも警告W8075程度で通してしまうのはどうなの? BCC5.5.1
477 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:57:27 ] >>476 > 1) void mera(const char *merami) > 2) void mera(const char* merazooma) 1) は C に多く、2) は C++ でみます。 どっちでも大差ないと思います。
478 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:59:49 ] スペースがあるかないかだけじゃん。何で違うものだと思うの?
479 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:00:44 ] >>477 おお、ありがとう。
480 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:20:48 ] >>476 char *p も char* p も意味は同じ スタイルについては、変数の宣言時にたとえば char* p, * q; などとするのが不自然という理由で char *p, *q; を推奨する人は多い
481 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:31:59 ] 追記 一方で char* p; を推奨する人は、変数名はあくまでpであるから それがchar*であることを示すためにそうすると主張することが多い ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名]; だから int const n, m; とは書けても char* p, q; とは書けない)ので、 構文的には変数名側に寄せることが正しい扱いであると言える
482 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:37:26 ] ×ただし*はcharやint、あるいは ○ただし*はcharやintのようなデータ型、あるいは
483 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:08:15 ] もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、 また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい
484 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:16:42 ] たくさんのレスありがとう、勉強になりなす。
485 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 07:37:37 ] >>476 ×begiragon ○bagicross なんで誰も指摘しないんだよー
486 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 13:10:17 ] >>448 エスケープシーケンスを正しく読めばいいんじゃないかな 確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。 カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ
487 名前:448 mailto:sage [2008/05/08(木) 19:42:21 ] >>486 そうだったのかー!! あれはエスケープシーケンスと制御文字が組み合わさってたん ですね。だからあのプログラムで[Aとかが表示された訳だ。 どうもです。
488 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:43:21 ] XPでコンソールのカーソルを移動させるにはどうすればいいの?
489 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:46:04 ] スレ違い
490 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:46:11 ] >>488 msdn.microsoft.com/ja-jp/library/cc429740.aspx
491 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:34:04 ] mallocして帰ってきたポインタをfreeするとメモリを開放するらしいのですが、 freeにサイズを書かなくてなんでサイズがわかるんでしょうか。 #include <stdio.h> void main() { char *c; c = malloc( 10 ); if( c == NULL )return; strcpy( c , "aiue" ); c--;//ひとつ前のポインタ(サイズは書いていないようだ) c--;//ここにもサイズはない c++;c++;//元に戻す free( c ); c = NULL; return; }
492 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:38:08 ] >>491 管理テーブルが別にあるから
493 名前:491 mailto:sage [2008/05/08(木) 21:52:55 ] >>492 ポインタの前ではなくほかのところにあったんですね。 どうもありがとうございました。
494 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:04:26 ] どうでもいいけど、ポインタを戻すのはよろしくないんじゃね?
495 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:13:52 ] 実際に確保されていることが確実な範囲(+1)を超えた演算の結果は保証されてなかった気がする
496 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:40:41 ] >>492 ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら int* ip = (int*)c; long* lp = (long*)c; こうしておいて printf("%d : ", *(ip - 1)); // c 先頭から int 分戻った場所から数値として表示 printf("%ld : ", *(lp - 1)); // c 先頭から long 分戻った場所から数値として表示 こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)
497 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:50:03 ] >>493 > ポインタの前ではなくほかのところにあったんですね。 それは処理系依存。 ポインタの前にある場合もあるだらう。
498 名前:デフォルトの名無しさん [2008/05/08(木) 23:11:55 ] じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??
499 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:13:38 ] 管理テーブルを保持することよりも、 空きメモリを探す処理とfreeの分、 CPU時間の無駄遣いになることを気にしたほうがいい気がする。
500 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:22:31 ] ということはlinked listとかすごい効率悪いんだな・・・ ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?
501 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:23:16 ] 実装によるとしか mallocのソースでも眺めてみれ
502 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:25:09 ] 入門書クリアしたら次は何がいいかな? アルゴリズム辞典とか眺めるの?
503 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:09 ] linked list はスタック上にメモリをプールしておけばいいぜ。
504 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:32 ] ×スタック上 ○スタック状
505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:50:05 ] >>502 良いソースを読むことだと思う どの言語でも同じだと思うが
506 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:55:07 ] 何か作りたいものがあるから学んでいるのでは? それを作るのにまだ足りないものがあるならそれを学べばOK 足りてるなら作ろう
507 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:06:55 ] 実際に自分の目的とするものを作ること その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること 言語仕様がわかってても要求を実現できない新人多すぎ コーダーじゃねぇんだからさ
508 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:58:14 ] 0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時 N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。 (消失した情報は2を代入すればよい) 上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力) というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。 環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。 なお、ここではN=5、e=0.05、p=0.1としています。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 ; int main(void) { int v[N], u[N] ; int i ; float e, p, x ; for (i = 0; i <= N-1 ; i++ ) { printf("v[%d]=",i) ; scanf("%d",&v[i]) ; while (v[i] && v[i]!=1) { printf("v[%d]=",i) ; scanf("%d",&v[i]) ; } }
509 名前:508続き mailto:sage [2008/05/09(金) 17:58:40 ] p = 0.1 ; e =0.05 ; for(i = 0 ; i <= N-1 ; i++) { srand(time(NULL)); x = (float)rand()/ 32768.0 ; /* xは0以上1未満の乱数 */ if( x < p ) { u[i] = (v[i]+1) % 2 ;} /* xが0以上p未満の時、受信に誤りが生じる */ else if( x >= p && x < p+e ) { u[i] = 2 ;} /* xがp以上p+e未満の時、情報は消失(2を代入) */ } printf("(") ; for(i = 1 ; i <= 7 ; i++) { if (u[i] == 2) printf("X ") ; else printf("%d ",u[i]) ; } printf(")\n") ; return 0 ; }
510 名前:509訂正。失礼しました mailto:sage [2008/05/09(金) 18:01:25 ] p = 0.1 ; e =0.05 ; for(i = 0 ; i <= N-1 ; i++) { srand(time(NULL)); x = (float)rand()/ 32768.0 ; /* xは0以上1未満の乱数 */ if( x < p ) { u[i] = (v[i]+1) % 2 ;} /* xが0以上p未満の時、受信に誤りが生じる */ else if( x >= p && x < p+e ) { u[i] = 2 ;} /* xがp以上p+e未満の時、情報は消失(2を代入) */ } printf("(") ; for(i = 0 ; i <= N-1 ; i++) { if (u[i] == 2) printf("X ") ; else printf("%d ",u[i]) ; } printf(")\n") ; return 0 ; }
511 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:31:39 ] >>508 srand をループで毎回実行しない。最初の1回だけで良い。 32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。 x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?
512 名前:508 mailto:sage [2008/05/09(金) 18:36:04 ] >>511 その場合u[i]は変化しません。 擬似乱数間の扱いが違ってましたか、勉強になります
513 名前:508 mailto:sage [2008/05/09(金) 18:38:06 ] あ、変化しないんだから u[i] = v [i] ; ですね。なんという初歩的なミス、ありがとうございました。
514 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:47:04 ] 久々に突っ込みどころ満載なコードを見た気がする
515 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:57:02 ] >>502 pc11.2ch.net/test/read.cgi/tech/1209810861/ で手伝っていただけるとありがたいのですが、いかが?
516 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:39:27 ] 皆さんに伺いたいのですけど、 www.amazon.co.jp/Programming-Language-Version-Prentice-Software/dp/0131103628 C言語の決定版と言われるこの本、どうお考えでしょうか。 あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。 こちらもできたら評価をお願いできればと思います。
517 名前:デフォルトの名無しさん [2008/05/09(金) 22:54:01 ] 本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。 標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ
518 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:06:49 ] >>516 それ買っておきなさい。 ネットのは怪しいのが多い。 しかし洋書はたけえな。
519 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:09:36 ] >>516 お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ
520 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:43:44 ] >>516 スレチだけど、洋書は輸出費を考慮しても.comの方が安い場合があるぜ。 時間と多少の手間を気にしないんならこっちもチェックしておくといい。 ttp://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/ref=sr_1_1?ie=UTF8&s=books&qid=1210344092&sr=8-1
521 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:04:24 ] C言語そのものはとてもシンプルだと言うこと #include によってもたらされる先輩方の資産と情報に振り回されない 目的をもってプログラムに取り組む ・・・ 例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。 ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。 どちらにしても有る程度は知識得ないといけない訳だけど。
522 名前:デフォルトの名無しさん [2008/05/10(土) 00:05:42 ] 自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ
523 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:06:11 ] >>516 それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない 推薦図書スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1209441159/l50 感想スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1064681919/l50
524 名前:デフォルトの名無しさん [2008/05/10(土) 00:10:00 ] たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。
525 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:14:21 ] シンプルに見えて実はぐちゃぐちゃ それがC
526 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:16:21 ] Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。 それが可能なのがCの最大の利点であり最大の欠点だから。
527 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:20:16 ] まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分
528 名前:516 mailto:sage [2008/05/10(土) 08:23:53 ] レス色々ありがとう。 自分はプログラミングはちょっとやったことありますが、C言語に ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、 って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。 だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと 思ってます。 >>523 こういうスレがあったんですね。ありがとうございます。
529 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 11:02:19 ] ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田
530 名前:デフォルトの名無しさん [2008/05/10(土) 16:04:28 ] 複数行文字列(100行以上)を標準出力に書き出す際、 \ で複数行まとめて書くとインデントが使えず見辛い。 別の方法を考えたところ 1) printfで一行ずつ printf("黒い0服\n"); printf("お茶を1杯\n"); 2) fputsで一行ずつ fputs("赤い2んじん\n", stdout); fputs("橙色の3かん\n", stdout); 3) 配列に格納してwhile puts char *memo[] = { "黄色い4んごう", "五月みどり", "" }; char **memop = memo; while(**memop) puts(*memop++); (1) や (2) は解かりやすいが、(3) の方が見やすい。 ただ (3) のままだと宣言初期化時しか格納できない。 ・分岐後に文字列を格納したい。 ・strcpy は使用を控えたい。 悔しいのでスマートな書き方教えてくれ。
531 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:07:53 ] printf("黒い0服\n" "お茶を1杯\n"); でいいよ
532 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:08:31 ] 別のテキストファイルにして読み込む マジおすすめ
533 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:09:19 ] あぁでもprintfに直接文字列は推奨されないよ %入ってるとまずいからだけど
534 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:12:28 ] putsでいいだろ
535 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:26:36 ] そこでfputsですよ
536 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:37:01 ] ABC & 上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは どの様にすればいいのですか?
537 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:43:21 ] それはシェルの役目
538 名前:デフォルトの名無しさん [2008/05/10(土) 16:45:35 ] >>531 あぁ , 無しで繋げられるのだっけか。 でも , をつけてしまいやすいので使い方だけ覚えとく。 >>532 ,533 メモっとく。 >>534 puts("青6し"); puts("むらさき7ぶ"); か puts( "むらさき7ぶ\n" "灰ヤー" ); のような感じか。 もう少し考えてみるわ、サンクス。
539 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:50:35 ] 本題より例文が気になって仕方がない。むらさきしちぶ?
540 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:54:17 ] 抵抗のカラーコードの語呂合わせだろ。 俺は「青二才のろくでなし」って覚えているんだけど。
541 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:44:45 ] 失礼しms。 ttp://www.uploda.org/uporg1415339.c.html 上記のようなコードを書いたのですが、 bの領域を解放するときに ”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。” のようなエラーが出てしまいます・・・。。。 確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、 double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか? またそのせいでこのエラーがおこっているのでしょうか? ご教授願います。よろしくお願いします。。。
542 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:50:19 ] >>541 > memmove(b, a, sizeof(a[0])*sizeof(a[0][0])); これのせいで同じ領域を二回 free している
543 名前:541 mailto:sage [2008/05/10(土) 20:38:45 ] >>542 memmoveだとだめなのでしょうか?
544 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:42:06 ] >>543 何がやりたいかによる a[y][x] に格納されている double の値をコピーしたいのであれば for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));
545 名前:541 mailto:sage [2008/05/10(土) 20:45:19 ] やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?
546 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:47:01 ] >>545 V / / _,, ァ=ニニ:} _ .V /,.ィ"f= <r'ニ三{ |_ ┐ _l_ l 'vf^<''" 弋z.ミ'テtフ |_ Х □_ 匚 L | У 〉!ト _ i{ ´ ̄r' =|' ./ェ゙‐ェi. 、__`_ヤ ( その通りでございます ) ./iュ.Hヽ.、 ゙,ニ/ -^ ー'-.、,i._`ヽ,.仁リ ー - .、 /、
547 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:50:49 ] >>542 ,544,546 なるほどです。つながりました。ありがとうございました><
548 名前:デフォルトの名無しさん [2008/05/11(日) 01:50:19 ] 初心者です。すみませんがアドバイスお願いします。 char (*pacX)[3]; とした場合、pacXは3要素のchar配列へのポインタになると思いますが、 このような変数「の配列」を以下のように動的に確保するとします。 int iNum = 2; char (*pacX)[3] = new (char)[iNum][3]; この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?
549 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:52:50 ] typedef して考えてみよう。 typedef char CharArray3[3]; CharArray3* pacX = new CharArray3[iNum];
550 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:56:23 ] newてC++やん
551 名前:デフォルトの名無しさん [2008/05/11(日) 02:13:33 ] >newてC++やん すみません、確かにそうですね。 >>549 なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね? イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば delete [] pacX; とすることで開放されるということよろしいでしょうか? で
552 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 02:24:13 ] >>551 そういうこと。
553 名前:デフォルトの名無しさん [2008/05/11(日) 02:28:42 ] >>552 ありがとうございました。
554 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 04:05:19 ] >>548 その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。 int (*func)(int k); // 関数へのポインター int a1(int k) { printf("%d¥n", k * 5); return k; } int a2(int k) { printf("%d¥n", k / 5); return k; } int main() { func = &a1; func(k); func = &a2; func(k); } みたいな・・・ 普通に char *a[3]; でいいと思うけど。
555 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 04:06:45 ] >>554 内容が理解できない人は黙っておいた方がいいよ。
556 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 06:00:32 ] char *a[3] ポインタの配列 char (*a)[3] 配列のポインタ
557 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:22:40 ] CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?
558 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:33:06 ] 実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。
559 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:40:20 ] 単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?
560 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:43:33 ] >>559 どの言語が用意されているかというのは、Web制作板的な視点じゃないか プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。
561 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:47:22 ] >あまり見かけないんだけど とあったからそれに沿うように答えただけなのだが。 性能的には何ら問題ないと思う、とつけたほうがよかったかな?
562 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:06:01 ] なぜCコンパイラ使わせてくれる鯖が少ないか、 というところまで考え出すと、 結局 >>558 に行き着くんじゃないかと思う。
563 名前:デフォルトの名無しさん [2008/05/11(日) 11:41:06 ] 数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8 お願いします。
564 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:45:28 ] >>563 わかりました 消えてください
565 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:48:20 ] 宿題丸投げは宿題スレへ
566 名前:デフォルトの名無しさん [2008/05/11(日) 12:00:34 ] ><
567 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:22:18 ] >>563 max(0, max(3, max(1, max(4, max(7, max(2, max(8))))))); ><
568 名前:デフォルトの名無しさん [2008/05/11(日) 14:42:42 ] 適当に数字を入力して その数字をまたある数で割って割り切れたらその値を出力して 割り切れなかったら余りだけをまた別の小さい値で割りきれるか って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・ 例えば1020を500で割ると2余り20で2が出力され 余り20を10で割って2が出力されるみたいな ヒントでもいいんでお願いしますm(_ _)m
569 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:23:44 ] その日本語を1行ずつCに翻訳していけばいいと思うよ
570 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:24:56 ] ってある数で割るって何で割るんだよ 1020を1020で割って余り0で終了、じゃだめなの
571 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:25:52 ] 意味が分からん ある数って何だよ 入力した値か?
572 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:28:12 ] >>558 速度的にはアレなんじゃね? スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。 2chは、やってるみたいだけど。
573 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:10:07 ] >>568 ユークリッドの互除法?
574 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:12:50 ] 568です 説明が下手ですいません レジのおつりを渡す要領で 適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです
575 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:14:36 ] どこが分からないのかわからない。 それをそのままコードに落とせばいいだけだろ
576 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:33 ] つりの硬貨の枚数が最小になるようにとか、なにがしかの条件がついてるけど、それが説明できてないんだろ?
577 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:49 ] こうだろ #include<stdio.h> int main() { static const int coin[] = {500,100,50,10,5,1,0}; int price, i; printf("金額は?"); scanf("%d", &price); for(i = 0; coin[i]; i ++) { printf("%d円玉が%d枚\n", coin[i], price / coin[i]); price %= coin[i]; } }
578 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:57 ] ちょっと自分でやってみます 迷惑かけてすいませんでした
579 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:20:39 ] 自己解決しました
580 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:31:40 ] エロイ人教えてください! エクセルで作成したファイルをスターファックスで VBAなどで自動送信出来ませんか? キーボードマクロなるフリーソフトを見つけましたが 自分ではうまく設定できません イメージは以下の感じです @送信ファイルをエクセルで作成 AVBAでスターファックスを起動 Bキーボードマクロ等で送信先を自動入力 Cエクセル画面に戻る 初心者丸出しですいませんが宜しくお願いします
581 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:31:49 ] どうでもいいが、とってもありがちな課題だな。
582 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:58:37 ] >>580 こんなソフト作ってくださいスレに行きやがれですぅ
583 名前:580 mailto:sage [2008/05/11(日) 18:05:44 ] >>582 そんなスレあるんですか? 移動します スンマセン
584 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:17:49 ] ある下記のような2つのcsvファイルの「商品コード」という項目を比較して 実績ファイルにある「商品コード」が、商品コードマスタに存在するかどうか をチェックし、あったらその後の処理へ、なかったらエラーを出すといったプログラムを作りたいと考えてます。 (売上ファイル.csv) 顧客コード,商品コード,数量 10000,2544,2 12111,2566,5 12546,2354,8 (商品コードマスタ.csv) 商品コード,商品名,単価 2544,aaaaa,1000 2354,bbbbb,1500 このとき、c言語ではどういった関数を使って どういった流れで考えるとよいでしょうか? 例えば下名はアクセスを使ったことあるので アクセス(VB)でのテーブル同士の比較だったら、 if 商品コード(売上ファイルTBL)=商品コード (商品コードマスタTBL) をレコードのEOFまで繰り返す、という処理でいいと思うのですが、 c言語の場合、しかもカンマ区切りcsvファイルの処理の場合、 どういった方向で考えたらいいのかということを知りたいです。 参考書を見たところ、ファイルポインタをつかう、fopen関数をつかうfgets関数で1行読み込む といった機能を使うのかなと思いましたが、商品コード部分のみを取り出して比較するやりかたがわかりません。 (また、全てのデータの桁数は変わる可能性があります) あつかましいですが、よろしければサンプルコードも提示して いただけたらありがたいです。
585 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 18:28:17 ] >>584 (っ´▽`)っ char shohinCode[256]; char shohinName[256]; int tanka; fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);
586 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:25:26 ] >>584 (っ´▽`)っ #include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void *elem1, const void *elem2); int existInMaster(void); typedef struct shohinM{ char shohinCode[256]; char shohinName[256]; int tanka; } shohinMaster; int main(void) { int line; line = existInMaster(); if(line == 0){ printf("エラーはありません\n"); } else{ printf("%d行目にエラーがあります\n", line); } return 0; } (続く)
587 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:26:07 ] >>586 の続き int existInMaster(void) { int returnCode = -1; FILE *fp = NULL; char line[1024]; int lineCount = 0; shohinMaster *sm = NULL; char shohinCode[256]; char kokyakuCode[256]; int suryo; int count = 0; int i; fp = fopen("./商品コードマスタ.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1)); sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka)); count++; } fclose(fp); qsort(sm, count, sizeof(sm[0]), cmp); (続く)
588 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:26:48 ] >>587 の続き fp = fopen("./売上ファイル.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ lineCount++; sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo); for(i = 0; i < count; i++){ if(strcmp(sm[i].shohinCode, shohinCode) == 0){ break; } if(strcmp(sm[i].shohinCode, shohinCode) > 0){ returnCode = lineCount; goto END; } } if(i == count){ returnCode = lineCount; goto END; } } END: return returnCode; } int cmp(const void *elem1, const void *elem2){ return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode); }
589 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:35:31 ] (っ´▽`)っ さあ感謝しなさい☆ (っ´▽`)っの足を舐めなさい☆
590 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:03:04 ] 変なコテだけど、いいやつだな。
591 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:16:41 ] 無意味にコテつけてる時点で・・・
592 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 20:46:21 ] (っ´▽`)っ >>586-589 には リソース解放漏れがたくさんあるから注意してね☆ 関数existInMasterのEND:の直後に fclose(fp); if(sm != NULL){ free(sm); } を加えるんだ☆
593 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 20:48:10 ] >>591 (っ´▽`)っ 無意味にコテ!? (っ´▽`)っはコテつけるのが当たり前なの! www.google.co.jp/search?lr=lang_ja&num=50&ie=utf-8&oe=utf-8&q=%22%E2%97%860351148456%22
594 名前:584 mailto:sage [2008/05/11(日) 21:03:04 ] ご親切にありがとうございます。 ちなみにこのままコピペしてとりあえず実行してみようと思ったら 100個を超えるエラーが出たのですが、そのままではいけないのですかね? とりあえず、解読動くかどうかより 解読して、流れを理解することをがんばります
595 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 21:05:25 ] >>594 (っ´▽`)っ インデントに全角スペース使ってるからね。 半角スペース、タブ文字は、2chでは表示されないの。 コピーしたら全角スペースを全て半角スペースに置換してね。
596 名前:584 mailto:sage [2008/05/11(日) 21:13:39 ] >>595 了解しました。 なにからなにまでありがとうございます。
597 名前:584 mailto:sage [2008/05/11(日) 21:24:18 ] >>595 すみません、もうひとつ。 今解読中なのですが、理解の手助けに ・処理の流れ ・このプログラムの入力と、出力値 など、簡単に教えていただけませんか? 本当の初心者ですみません。
598 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:26:57 ] HTMLの使用も理解できない馬鹿がいる。
599 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:31:20 ] >>598 それを言うならHTMLの仕様だろ、と。 まぁ、変数宣言の変数名を揃えようとする辺りでお察しだから。
600 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:34:46 ] 灯台や鏡台の先生からは sed の使い方とかは習わなかったんでしょうかね?
601 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:50:09 ] >>597 自分がどういうプログラム要求したか覚えてる・・? 見ていくと何となく流れがつかめるでしょ どこまで理解したか言わないと答え丸写しで理解した気になる子になるよ 初心者≠免罪符
602 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:39:49 ] (っ´▽`)っ /* *戻り値: *エラーなし:0 *エラーあり:エラーがある行番号(見出し行を除く) */ int existInMaster(void) { int returnCode = -1; /*戻り値*/ FILE *fp = NULL; /*ファイルポインタ*/ char line[1024]; /*ファイル読み込みバッファ*/ int lineCount = 0; /*行番号*/ shohinMaster *sm = NULL; /*商品マスタ配列*/ /*以下、売上ファイルレコード格納用変数*/ char shohinCode[256]; /*商品コード*/ char kokyakuCode[256]; /*顧客コード*/ int suryo; /*数量*/ int count = 0; /*商品マスタ配列サイズ*/ int i; /*ループカウンタ*/ /*商品コードマスタを全て読み込み、商品マスタ配列に格納する*/ fp = fopen("./商品コードマスタ.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1)); sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka)); count++; } fclose(fp);
603 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:40:30 ] /*商品マスタ配列を商品コードの昇順に並べる*/ qsort(sm, count, sizeof(sm[0]), cmp); /*売上ファイルを1行ずつ読み込み、商品コードを商品マスタ配列と照合する*/ fp = fopen("./売上ファイル.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ lineCount++; sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo); for(i = 0; i < count; i++){ if(strcmp(sm[i].shohinCode, shohinCode) == 0){ break; } /*商品マスタ配列は商品コードの昇順に並べている*/ if(strcmp(sm[i].shohinCode, shohinCode) > 0){ returnCode = lineCount; goto END; } } /*商品マスタ配列にない場合、行番号を返す*/ if(i == count){ returnCode = lineCount; goto END; } } END: return returnCode; } /*商品マスタ配列を並べる時、商品コードの昇順に並ぶようにする*/ int cmp(const void *elem1, const void *elem2){ return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode); }
604 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:44:43 ] >>597 (っ´▽`)っ>>602-603 これで満足か?
605 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:52:56 ] (っ´▽`)っ 売上ファイルも商品コードの昇順に並べると もっといい感じになるかもね。
606 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 23:32:17 ] 次の様に、単語毎に空白で区切られた文字列があり、一単語ずつ取ってくる処理を 行いたいと考えてます。文字列の中に入っている単語数は不定とします。 char str_str[] = "str1 str2 ・・・・ strN"; 今現在、次に書き込むソースの様な処理で、一つずつ単語を読み込んでいます。 ここで、質問なのですが、sscanf等を使用してもっと上手に処理することはできないでしょうか? 以下の様にダミー変数を利用する方法は考えたのですが、入っている単語数が不定 なため、どうも不恰好なソースになってしまいます。 sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy); すいませんが、アドバイスよろしくお願いします。
607 名前:606 mailto:sage [2008/05/11(日) 23:33:02 ] 現在使っているソースコードは以下になります。 int main(void) { char src_str[]="str1 str2 str3 str4 str5"; char *next; char *buff=src_str; while((next=strsplit(buff, " "))!=NULL){ // 空白文字が2個以上続いた場合はbuffにはナル文字が入っている if(buff[0] != '\0') fprintf(stderr, "buff=%s, next=%s\n",buff, next); buff=next; } return 0; } // 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す char *strsplit(char* str,const char* delim_str) { char* delim_point = strstr(str,delim_str); const size_t delim_len = strlen(delim_str); size_t i; if(delim_point == NULL) return NULL; else { *delim_point = '\0'; for(i=0;i<delim_len;i++) delim_point++; } return delim_point; }
608 名前:606 mailto:sage [2008/05/11(日) 23:35:17 ] すいません、書き込んだ後、インデントがされてないのに気がついつきました。同じソースですが int main(void) { char src_str[]="str1 str2 str3 str4 str5"; char *next; char *buff=src_str; while((next=strsplit(buff, " "))!=NULL){ // 空白文字が2個以上続いた場合はbuffにはナル文字が入っている if(buff[0] != '\0') fprintf(stderr, "buff=%s, next=%s\n",buff, next); buff=next; } return 0; } // 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す char *strsplit(char* str,const char* delim_str) { char* delim_point = strstr(str,delim_str); const size_t delim_len = strlen(delim_str); size_t i; if(delim_point == NULL) return NULL; else { *delim_point = '\0'; for(i=0;i<delim_len;i++) delim_point++; } return delim_point; }
609 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 23:38:06 ] なんというstrtok
610 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 23:38:19 ] >>608 sscanf(str, "%s%n", ...)
611 名前:606 mailto:sage [2008/05/11(日) 23:40:42 ] 実際に処理をしている部分は冗長になってしまうため、以下のコードが 入っている部分で、処理を実施していると考えてください。 fprintf(stderr, "buff=%s, next=%s\n",buff, next); また、src_strの内容が変わってしまう点は仕様として、その様にしてます。 よろしくお願いします。
612 名前:606 mailto:sage [2008/05/11(日) 23:59:40 ] >609 確かに、この処理内容だと、strtokで十分ですね・・・。文字列群で区切るstrでは 不便な事が多く、strsplitという文字列パターンで区切る関数を作成しており、何も考えず そのまま使用していました。ご指摘ありがとうございます。 >610 すいません、その処理はダミー変数を利用する方法とは異なる方法なのでしょうか? つまり、下記の様な処理とは別の処理ということなのでしょうか? sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);
613 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:39:57 ] rand関数は合同乗算法ですか?
614 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:42:50 ] 仕様上特に決まってない。 最近は lagged Fibonacci なこともあるようだ。
615 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:45:03 ] >>613 どういう方法でなければならないという規定はない。 現実には線形合同法がよく使われている。
616 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:48:45 ] >>613 大概そうですよ
617 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:50:38 ] >>614-615 レスありがとうございます。 c言語で書くと a[i+1]=a[i]*j%10*10*10*10 で良いのですか?(a[i+1]=j*a[i] (mod10^4))
618 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:54:19 ] 数学板から飛んできたか a[i+1]=a[i]*j%(10*10*10*10) というか a[i+1]=a[i]*j%10000 でいいんじゃないのか
619 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:55:54 ] すみません質問を変えます。 0から1の範囲の乱数を合同乗算法で書くにはどのように書けばいいですか? >>618 ばれたか・・・正直kingはウザイと思っています。
620 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:58:13 ] 数学板でも思ったんだが、前の質問に答えてもらってるのに、 それに何の反応もせずに「質問を変えます」はないだろ。社会常識的な意味で。
621 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:59:29 ] >>620 すみません・・・
622 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:00:11 ] 整数の 0〜(n-1) の乱数を発生させて double にキャストして n で割ればいいんじゃない
623 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:02:03 ] >>622 レスありがとうございます a=rand()/(RAND_MAX+1.0); としてもいいのですが>>618 さんの方法で書くことはできませんか?
624 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:04:35 ] a[i+1]=a[i]*j%10000; b[i+1]=a[i+1]/(10000.0);
625 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:32:58 ] >>624 ありがとうございます 一応書いてみたのですがエラーが出てしまいます どこがおかしいですか?ちなみに円周率を求めるプログラムです #include <stdio.h> int main(void) { double i,max; double x,y,pi; int a[1000],j; double b; double c=0,d=0; max=100; a[0]=9454; j=9456; for(i=0;i<=max;i++) { a[i+1]=a[i]*j%10000;/*ここでエラーが出ます。*/ b[i+1]=a[i+1]/(10000.0); if((b[i+1]*b[i+1]+b[i]*b[i])<=1.0) { c+=1.0; } else{ d+=1; } } pi=4*c/(c+d); printf("%f\n",pi); return 0; }
626 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:36:24 ] 数字を渡したら曜日を表示する関数を作ったのですが、関数内に char youbi[7][] = {"日曜日", "月曜日",....} と書きました。 これだと関数が呼ばれるたびに変数を作って文字列を入れてることになりますよね? 頻繁に呼ぶ関数にこういうことすると速度などに悪い影響ありますか?
627 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:36:32 ] double i
628 名前:626 mailto:sage [2008/05/12(月) 01:37:21 ] すみません訂正します。 char youbi[][7] です。
629 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:38:28 ] >625 iをintで宣言すること。 >626 ある場合もあるし、無い場合もあるが、大抵の場合気にするほどの差ではない。
630 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:38:30 ] &はアンパサンドだけど |はなんていうんだっけ? なかなか検索ひっかからないんだよね
631 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:39:40 ] >>627 そうですね・・・すみません でも、 配列または、ポインタでない変数に添字が使われました。とエラーがでます・・・ どこを直せばよいですか?
632 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:39:53 ] パイプ
633 名前:626 mailto:sage [2008/05/12(月) 01:41:06 ] >>629 ありがとうございます 気にしないことにします
634 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:41:24 ] >>631 そこまでエラーメッセージ読んでてわからないほうがどうかしてる
635 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:42:22 ] >>631 それくらいコンパイラが懇切丁寧に教えてくれてるだろうに無視すんなよ 頼むからエラーをこぴぺしてくれ
636 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:42:39 ] >631 配列でもポインタでもないものに添え字が使われたから。あとは行番号を見ること。 念のために言っておくが添え字とは[?]の部分のこと。
637 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:43:07 ] >631 double b;
638 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:44:55 ] せめてエラーメッセージの意味を考えることくらいはしてほしいよまったく ただのcharの配列にしか過ぎないのかっての
639 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:45:36 ] >>634 あ、bを配列で宣言するのを忘れてました・・・ ありがとうございます やっぱりプログラムは苦手だなあ 数学板の回答者に戻ります
640 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:46:40 ] オーバーフロー・・・
641 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 02:46:41 ] 数学板ってあんなんでも回答側になれんの?
642 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 05:18:50 ] わざわざ自称している時点で…
643 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:01:05 ] ↓聖徳太子知ってる?知らない?
644 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:28:38 ] 乗算合同法や線形合同法の利点ってメモリ使わないことなのに、 配列に保存してどうすんだよw
645 名前:↑ mailto:sage [2008/05/12(月) 06:56:00 ] ttp://jp.youtube.com/watch?v=RIL28wqOQGA
646 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 07:36:33 ] >>626 staticを付けるといい。 ついでにconstも付けるとさらにいい。
647 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 07:49:12 ] >>612 %nの仕様は調べた? >>626 static const char * const youbi[] = {"sunday", "monday", ...}
648 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 09:15:06 ] リテラル参照はこっちのほうがいいかも? char *youbi[7] = {"日曜日", "月曜日",....} 好みの問題ですかねぇ・・・
649 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 11:15:18 ] >>648 それだと毎回youbiを更新するコストが発生するし、constによる保護ができない。 ついでに言えば、態々7という定数を埋め込む意義が全くない。
650 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 12:37:55 ] 確かにスタックに積む場合にはその分の手間がかかるけど、staticのほうがデータ参照は遅くなるんじゃないかったっけ?
651 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 12:44:16 ] const だけつけとけばコンパイラが何とかしてくれそうな気がするんですがどうなんですか?
652 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 12:50:33 ] 抽象的な質問しないで、具体的に質問してくれ。 つーか、入門者がパフォーマンスを気にするな。
653 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:07:40 ] 曜日文字列を使うような関数が、パフォーマンス気にするほど頻繁に呼ばれてるとは思えないねぇ そうだとしても実測してみなきゃわかんないしね
654 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:11:25 ] >>653 もし頻繁に呼んでるとしたら、いっそ廃止して その上の(おそらくループの本体がある)関数で文字列をautoに積んで インラインで処理させたほうが速いだろうね
655 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:19:00 ] >>629 で終わった話をいつまでグダグダやってるんだ
656 名前:デフォルトの名無しさん [2008/05/12(月) 13:22:59 ] TEST.Cをコマンドプロンプトで指名してコンパイルする時、拡張子が.Cだとコンパイルできなくて.cだとコンパイルできたんだけど、.Cと.cって違うの?
657 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:26:35 ] >>656 少なくともそのコンパイラにとっては違うからコンパイルできなかったのだろう。
658 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:05:58 ] ファイル名の指定を間違ってたんじゃないの ファイル名の大文字小文字を区別する環境としない環境があるから、それも書いてくれ
659 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:16:09 ] Sun辺りは.CはC++の拡張子だった希ガス。
660 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:24:22 ] 上の static const char * const youbi[] って何でconst2つも付けるのかが分からないんですが static const char * youbi[] じゃあダメなんですか? あと、普通の変数でも static const int const とかやる必要はあるんですか?
661 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:30:52 ] static const char *youbi[] youbiの先の文字列が書き換え不可能 static char * const youbi[] youbiが書き換え不可能 static const char * const youbi[] 両方
662 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:36:31 ] static const char *youbi[] は "火曜日" って文字列を "火曜"
663 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:38:16 ] 途中で書いてしまった static const char *youbi[] は "火曜日" って文字列を "火曜" に変えたりするのが不可能で static char * const youbi[] は youbi[1] に別の文字列のポインタを渡すのが不可能になる って事なんですか?
664 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:54:23 ] const char *youbi[] は const char 型のポインタ(文字列定数)を入れる youbi配列で、新たに文字列定数のポインタを入れることは出来て、 char * const youbi[] は youbiの中のポインタ変数固定だから、文字列そのものは書き変えられてもポインタの指す先は変えられないって事なんですね やっと理解出来ました ありがとうございます
665 名前:デフォルトの名無しさん [2008/05/12(月) 16:40:42 ] #include<stdio.h> double f(double x) { double y; y=(((3.1*x-1.8)*x+5.7)*x+1.0)*x-6.2; return (y); } main() { double x,y; int i; for(i=-20;i<=20;i++){ x=0.5*i; y=f(x); printf("x=%7.3f y=%12.3f\n",x,y); } } このプログラムのyの値の総和を計算するプログラムを作れ。 これをだれかお願いします。
666 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 16:42:08 ] >>665 わかりましたちょっとまっててください
667 名前:デフォルトの名無しさん [2008/05/12(月) 16:46:32 ] >>657 なるほど〜 コンパイラの仕様か〜 >>658 指定の仕方は大丈夫なはず コンパイラはMinGW これでいいのかな? >>659 Sunってコンパイラ名・・? コンパイラによって違うってこと?
668 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 16:55:13 ] 宿題丸投げは宿題スレへ
669 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 17:15:43 ] >>667 >>>659 Sunってコンパイラ名・・? コンパイラによって違うってこと? Javaを開発し、OpenOfficeを提供している世界最大級のコンピュータソフト・ハード兼業企業。 古くから、SunOSというUnix系のOSを作っている。
670 名前:デフォルトの名無しさん [2008/05/12(月) 17:55:41 ] あ〜 なるほど OSによって違うってことか〜 勉強になりました
671 名前:デフォルトの名無しさん [2008/05/12(月) 19:47:16 ] 配列に配列を足すことってできないの? a += b; みたいな
672 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 19:58:27 ] Linux上では問題なく動作したのですが、 windows(BCC Developer)だと、ファイルをオープンする事ができなくなりました ファイルパスを絶対パスにしたりと、試行錯誤しましたが解決しません どうか、解決法をお願いします ソース void read_area(struct prefecture *are) { int i; FILE *fpa; if(( fpa = fopen("menseki.txt" , "rw")) == NULL) { printf("ファイルが見つかりませんでした\n"); exit(1); } for(i=0;i<47;i++) { fscanf(fpa,"%s %d",are->name,&are->area); are++; } } txtファイルは、Debugフォルダとその上のファルダに置いています
673 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:00:38 ] >>672 ソースファイルと同じ場所に置けばいけるはずだけど
674 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:01:55 ] exeと同じ場所
675 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:05:20 ] >>673 日本語読めますか? >>672 それが原因かどうかは判らんが、"rw"は間違い。 実装によってはファイルが空になってもおかしくない。 >>671 できません。配列の要素ごとの足し算ならループから書くことになります。 配列の連結と言うことなら、malloc(), realloc()を使うことになるのでその辺りを先ず勉強する必要あり。
676 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:06:59 ] >>671 それだけの日本語ではさっぱりですよ。 たぶんこういうこと? for ( int i = 0; i < SIZE; i++ ) { a[ i ] += b[ i ]; }
677 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:07:58 ] >>673-674 ファイルの置き場所に問題があるのかと思い、ソースがある場所を含め、 プログラムに関係ありそうなフォルダ全てに置いたのですが、解決しませんでした… これは、BCCの環境設定?を変更・追加する必要があるのでしょうか? >>675 Linuxで動いたのは運が良かったからかもしれません… 指摘していただいた点について、もう一度解決法を探してみます
678 名前:677 mailto:sage [2008/05/12(月) 20:16:39 ] "rw"を"r"にした所、正常に動作しました! よく考えてみれば、書き込みする必要がないので、"w"は不要ですね… >>673-675 つまらない質問にも関わらず、素早い対応して頂き、 本当にありがとうございます
679 名前:デフォルトの名無しさん [2008/05/12(月) 20:27:05 ] >>676 そうだけど 構造体のときは不便だなって思った
680 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:28:31 ] そう思ったんならC++へ旅立ってしまえ
681 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:54:06 ] >>679 そんなのラッパー関数かいときゃ次からは楽じゃないか。
682 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 21:25:44 ] >>641 なれるよ 数学なんて実に簡単なことだ
683 名前:デフォルトの名無しさん [2008/05/12(月) 22:34:04 ] C言語勉強したいのですがフリーソフトはないんでしょうか?
684 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:34:47 ] >>683 ぐぐれ
685 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:39:47 ] >>683 マイクロソフトが無料で配布してるよ
686 名前:デフォルトの名無しさん [2008/05/12(月) 22:52:43 ] www.microsoft.com/japan/msdn/vstudio/express/default.aspx これですか?どれをダウンロードすればいいんでしょうか
687 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:53:37 ] >>686 visualC++だ そしてとっととうせろ
688 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:54:42 ] >>686 登録とかめんどくさいからBCC使うといいよ 俺はvisual C++使ってるけど
689 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:01:50 ] BCC もメルアド登録必要じゃね?
690 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:02:36 ] デバッガは登録必要だったような気がするけど コンパイラは要らなかったような…
691 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:03:17 ] >>689 いらない
692 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:06:20 ] あれ? メルアド変わるまでスパムのように来てたんだが。
693 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:12:22 ] VC++も登録いらんだろ isoを落とせば
694 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:13:13 ] それめんどい
695 名前:デフォルトの名無しさん [2008/05/13(火) 08:04:28 ] C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど 単純にC言語のプログラムを作りたい時はどうしたらいいんですか?
696 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:08:04 ] >>695 お使いのソフトウェアのスレへどうぞ。
697 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:14:19 ] >>695 誤 C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど 正 VisualC++でC++プログラム作ろうと思ったらVBの作成画面みたいなんですけど Win32コンソールアプリケーションを選べ
698 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:19:27 ] >>697 それだとスレ違い。ここはCスレ。
699 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:56:55 ] 実行時に与えられる条件により異なる値で初期化して、 以後はconstに扱われるような変数を宣言することはできますか?
700 名前:699 mailto:sage [2008/05/13(火) 13:59:49 ] 追記 環境変数のような働きをするグローバル変数です
701 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 14:34:04 ] >>699 実装によっては可能かもしれないが、直接に行うことは一般的にはできない。 constな変数はそれが作成されたときに(関数の外で宣言される変数ならプログラムの開始時、あらゆる関数の外で)初期化されて 以後のコード中では変更できなくなるため、実質的にコンパイル時に解決可能な式でしか初期化できない。 ポインタを間にはさめば、以下のような方法で似たようなものを間接的に宣言することができる。 value.c) static int value; const int * const vp=&value; value.h) extern const int * const vp; #define VALUE (*vp) このようにしておけば、グローバル変数(のふりをしているマクロ)VALUEの実体であるvalueは、少なくともvalue.c以外で変更されることはない。
702 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:17:07 ] あとは、取得用の関数を公開する形にして 当該の変数をstaticにしてほかのファイルからは見えないようにするとか、 const変数を動的初期化できるC++へ移ってしまうとかが考え付く。
703 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:32:16 ] int GetValue() { static int value=-1; if(value < 0){ /* 最初に呼び出されたときに初期化される */ : : } return value; } #define VALUE GetValue() な手か
704 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:14:38 ] 失礼します。 void hoge(double** matrix) {} 等として受け取ったdouble**の配列の要素数をその関数内で知るすべがあったらご教授願います。
705 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:24:57 ] ありません
706 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:33:22 ] 配列matrixの終端要素になにか特別な値が格納されていれば それを検出することで長さを知ることができる そうでなければ無理
707 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:00:51 ] char name[100]; name="hoge.txt"; みたいに代入したいんですが、エラーになります。 *name="hoge.txt"; でもできません。どうやるんでしたっけ?
708 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:04:40 ] 何で駄目なのかはわかる? strcpy(name, "hoge.txt") とか? strncpy(name, sizeof(name) - 1, "hoge.txt")か
709 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:07:16 ] >>708 すいません。わからないので教えていただけるとありがたいです
710 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:24:03 ] >>709 Cでは配列は二級オブジェクト(メモリ上に存在するが演算の対象にならない)で、 配列名は大抵の場合配列そのものではなく配列の先頭要素のアドレスを意味する。 アドレスに代入することはできないので、name="hoge.txt"; のような文は無効になる。 配列名に対して直接=演算子が使えるのは、宣言時に初期化するときだけである。 配列に対して任意の配列をコピーするにはmemcpyやmemmove、 あるいは配列が'\0'で終わるcharの配列(文字列)である場合にはstr〜系の関数を使う。
711 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:43:39 ] 1) strcpy(name, "hoge.txt"); 2) strncpy(name, sizeof(name)-1, "hoge.txt"); name[sizeof(name)-1]='\0'; 3) name[0]='\0'; strncat(name, sizeof(name)-1, "hoge.txt"); 1)はもっとも単純明快だが、もしnameに割り当てられている領域が コピーしようとしている文字列より小さかったらたぶん問題がおきる そのような場合に文字列を切り詰めて安全を保証したいなら2)または3)を使う
712 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:51:33 ] わかりました!どもうありがとうございました
713 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 18:00:36 ] >>711 横見だが 2 および 3 の引数の並びちがうぢゃろ。 strncpy(name, "hoge.txt", sizeof(name) - 1); name[sizeof(name) - 1] = 0;
714 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:24:12 ] 文字列リテラルをコピーするのにstrn*()を使うのか……
715 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:24:59 ] 当然だろ
716 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:26:55 ] sprintfでおk
717 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:18:04 ] だからオーバーフローが・・・
718 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:20:16 ] オーバーランじゃねーの? それともオーバーフローでもおkなの?
719 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:21:04 ] おk
720 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:22:55 ] ttp://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3 ラン姉ちゃんの方でした、すまそ
721 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:25:09 ] >>717 桁数勘定して sprintf(b, "%100s", s); って, 書けば OK なんじゃないの?
722 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:32:56 ] >>720 バーロー
723 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:55:15 ] 自分の言語/文法理解が間違ってるのかも、と思って駆け込んできた --- #include<stdio.h> int ary_[]={1,2,4,8}; int main(int argc,char** argv){ int* ary=ary_; int i=(*ary++) ^ (*ary++); printf("%d\n",i); return 0; } --- これの実行結果がゼロになるのはなんでだぜ? VC9EE v15.00.21022.08 最適化無指定、/O1 で発現 VC9SP1βはまだ試してない
724 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:57:31 ] >>723 未定義動作だからどうなっても文句は言えない むしろどうなると思ったんだよ・・・
725 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:59:10 ] 副作用完了点
726 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:01:58 ] >>721 いや、そういう意味じゃなくて・・・それらの問題点は プログラムそのものがトラブルを起こしてしまう仕組みを持っていることであって 問題の無い範囲内でユーザが使う分にはなんら不具合には気づかない、起こらないわけで・・・
727 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:06:18 ] >>724 え。一発目の*ary++が1に、二発目の**ary++が2に、… …いや、最適化で順序がどうなっても、i==3にはなると思ったんだ /Fa によると、どちらも*aryになり、そのあとで2回ary++が発生してた どこで未定義なんだろう…。 // ここでリロード >>725 ヒントありがとう ぐぐったら一発 必ずしも都度都度副作用が発生するわけじゃないのか アマだが、聞かねば一生のバグ撒き散らしになるところだったよ 恥晒してよかった
728 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:21:13 ] ary = ary++;
729 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:22:15 ] >>728 いやそれを書き込む意味が和漢ね
730 名前:723 mailto:sage [2008/05/14(水) 00:28:52 ] >>729 これを考えてみろ。ってことだろう 実際にVC9EEにつっこんで結果を見てみた ary = ary; ary++; になった 俺には示唆に富んでると思う
731 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:29:43 ] >>723 未定義だけど、1^1で0になってる気がする
732 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:38:23 ] ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html 調べたら色々書いてあった
733 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:24:07 ] 直前の副作用完了点と次の副作用完了点までの間に、 式の評価によってオブジェクトに格納された値を変更する回数は 高々一度だけでなければならない。更に、変更前の値は、 格納される値を決定するためだけにアクセスしなければならない。
734 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:25:37 ] pc11.2ch.net/test/read.cgi/tech/1201153965/157
735 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 06:32:45 ] 初心者なんですが、お願いします 文字列を式として扱って計算結果を出力する というような便利な関数ってあるのでしょうか?
736 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 07:26:22 ] 標準ではありません。頑張って作ってください。 まぁ、unix系ならシェルで計算すれば済むけどね。
737 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 07:30:10 ] Java、JavaScriptだと eval というものがあるんだが、自分で実装するっきゃないね。
738 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 09:05:47 ] 簡単な計算させる程度なら、bison/flexあたりでどうにか。 変数が入るようなやつなら、いろいろあるけど、いっぺんPerlとか使うといいと思うよ Perlで書く。のではなくて、perl*.dllをつつくように書く あれはインタフェースがCだから。 セキュリティの確保とか結局いろいろ大変になるだろうけど、示唆に富んでていいと思う
739 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 10:10:26 ] >>735 ttp://www.google.com/codesearch?hl=ja&q=+lang:c+eval+show:LKM9fPKCrz0:r3iT8J84R1w:wri6GBkgM20&sa=N&cd=1&ct=rc&cs_p=ftp.gnu.org/gnu/glibc/glibc-2.3.6.tar.bz2&cs_f=glibc-2.3.6/dlfcn/eval.c#l121 LGPLだけど、Google Code Searchで検索すると60行程度で実装している例がある。
740 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:49:08 ] 学校の課題で 「関数の中で宣言した値は、関数の実行が終わった後どうなるのか?たとえば二度目に関数を呼んだとき値を読んでみたら どうなるのか?」 って問題が出たんだけど答えどころか質問の意味すらわかりません。よかったら教えてください。
741 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:53:49 ] ローカル(自動)変数とか、静的(スタティック)変数とかを教える意図の質問じゃないのかな?
742 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:54:37 ] >>740 void hoge(void) { int a; ← A a = 2; a = a * 2; } ←@ void main (void) { hoge(); hoge(); } @関数終わったらaはどうなる? A2回目のhoge呼び出しの時、このaに4が入っていると思うか?
743 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:56:53 ] ローカル変数には初期値入れることになるんだし なんだかなぁって思う問題
744 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:32:20 ] >>741-743 こんな早く答え返ってくるとは思ってませんでした。 有難う、みんな優しいですね。 >>742 @無くなる? A…4じゃないんですか?
745 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:35:20 ] aに何も入れない状態で出力させるのさ。 できれば、hoge()を呼び出す階層を変えて試すのもやってみて (別の関数を呼び出しその中からhoge()を呼ぶ)
746 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:48:58 ] 成程!試してみますね。 ご丁寧に有難うございました。
747 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:16:09 ] 試してみる、はよくない たまたま4が入ってたらどうするんだ
748 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:25:10 ] 高確率で入ってるだろ。 だから深さも変えるといいかな、と。 アドレス表示させる手もあるが。 最適化されてると混乱しそう。
749 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:41:12 ] ちゃんとCの仕様を示して理解させるのが正しい姿勢 とりあえず試してうまくいったから、なんてのを放置すると そのうち必ずなにかやらかす
750 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:42:09 ] >>744 @無くなる A何が入っているかわからない
751 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:50:04 ] >>740 関数の中でstaticをつけずに宣言した変数は、その関数の呼び出し中にのみ存在する変数(auto変数)となる。 宣言した関数から抜けた時点で、変数のために使われていた記憶領域は解放されて意味のないものになる。 このような変数は、明示的に int a=2; などのように初期化しないかぎり、 その宣言時における値は常に不定(何が入っているかわからない)である。 このような変数の中身を、明示的に値を与える前に使ってはいけない。
752 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:50:57 ] 学校の課題なんだから、そんなのは教わるんだろう。 今知りたいのはこの質問の意図するところだべ。
753 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:55:28 ] 仕様を理解してりゃ意図はわかるだろ 意図がわかんないってのは理解してないからだ
754 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:00:37 ] >>740 なお、staticをつけて宣言した変数は、プログラムが実行を開始してから終了するまで存在し、 その開始時に一度だけ、明示的な初期化式があればその値に、なければ「=0;」とか「={0};」と 書いたかのように初期化される。
755 名前:740 mailto:sage [2008/05/14(水) 23:45:33 ] >>753 その通りです。 まだ講義で習ってない範囲(質問する前は習ってない範囲 かすらもわかりませんでした)で何も知りませんでした。 今回皆さんに教えて頂いたお陰でまだ何となくですが、 わかるようになりました。 あとは講義で理解していこうと思います。 補足してくださった方々もわかりやすい説明有難うございました! ここ勉強になりますね。
756 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 01:50:36 ] >>735 宿題スレで頻繁に見られる課題です。実装したくなったときに参考にしてください。 基本形 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6550.txt 逆ポーランド電卓で(基本形の応用) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6551.txt 他にもいろいろ回答されていましたが、私の手元ににはありません。
757 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:16:27 ] >755 忠告だが その講義の教官の言うことは眉唾して聞いたほうがいい 教えてないことを聞くとかありえねー
758 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:56:17 ] 課題自体はすげー授業のそのまんま復習くせーし 話聞いてなかったんだろどうせ
759 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:56:17 ] >>757 両方の言い分を聞かないと分からないぞ ここで教官の言い分を聞く事はまずないだろうけど
760 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:57:06 ] >>757 前半と後半が支離滅裂なんだがw
761 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:58:18 ] >>760 日本語は難しいです
762 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:03:26 ] >>760 日本語読めない人?
763 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:06:17 ] 課題なら別に教えてないことが出てきてもいいと思うけどな 小学校じゃあるまいし
764 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:08:53 ] 横槍だが 眉唾する という使い方がないんです、辞書を引いても分かるように。
765 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:11:29 ] >>764 「眉に唾する」ならいいのかな?
766 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:13:52 ] ttp://www.geocities.jp/tomomi965/kotowaza11/11-54-4.html
767 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:27:57 ] 下記の場合volatileがあるためValueを外部から書き換えるまでループを続けると思うのですが、 volatile ULONG Value; // レジスタ(外部から書き換えられる) void main(void) { Value = 0; while(Value == 0){ ←これ ; } } これを下記のようにポインタを経由すると最適化対象になってしまうのでしょうか? (このポインタもvolatileをつける必要がある?) volatile ULONG Value; // レジスタ(外部から書き換えられる) void main(void) { Value = 0; ULONG* pV = &Value; while(*pV == 0){ ←これ ; } }
768 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:29:31 ] >>767 volatile 修飾する必要があります
769 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 10:13:29 ] >>767 volatileをつけなければ最適化対象になります。 が、最適化対象になるとValueを外部から書き換えるまでループを続けるという動作を必ずしなくなるわけではありません。 つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。 つまり、volatileをつける必要があるとは言い切れません。
770 名前:「言い切れない」は詭弁だ mailto:sage [2008/05/15(木) 12:16:11 ] >つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。 それは普通、つける必要があると言いますね。
771 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:22:57 ] ↓必要条件とか十分条件とか言い出すヤツ
772 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 13:40:39 ] |↑ ++ ビルド毎に出力を確認すればおk てか、Cの話でなくなるが、テストで引っ掛けろ
773 名前:デフォルトの名無しさん [2008/05/15(木) 22:38:30 ] プログラム知識0の俺がCを勉強しようと思うんだが 解説サイトと本どっちがいいの? 色々な掲示板みてたら両方とも良いって書いてたからわからなかった。
774 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:39:35 ] じゃあ、とりあえずお金のかからない方法でやってみて それで不満に感じたら本を買えば良いんじゃないかな
775 名前:デフォルトの名無しさん [2008/05/15(木) 22:49:12 ] レスありがとう その方法が一番いいかな〜 とりあえずググってサイトさがしてみる。 サイトって「C言語 入門」でググって上らへんのなら大丈夫だよね?
776 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:32:03 ] 本はだめな本があるから、本の紹介サイトを見たほうがいいぞ。
777 名前:デフォルトの名無しさん [2008/05/15(木) 23:39:22 ] そうなんだ まだ買わなくてよかった〜 ありがとう それみて本選ぶよ
778 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 05:49:52 ] 本もそうだがサイトは特に多くのところを回った方がいい。 嘘を書いている、情報が古すぎる、環境依存なコード、誉められないコーディングスタイルetc... あと、サイトにすることで有利な点は、疑問点があればここにアドレス張り付ければ一応質問できることかな? 書籍だと同じ本持ってる人間以外には内容をいちいち書いてもらわないと質問できないから。
779 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:21:08 ] 何を学ぶか?で選ぶ資料も違ってくる。 ソートに関しては、すでにどの手法が高速か分かりきっているが 教本によって記述が違っているものも。中には、あれ?って思うものも。
780 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:31:06 ] 宿題スレでHit and Blowのソースコードを書いてもらったものですが、 頭が悪いせいか理解しようとしても意味がよくわかりません。 誰か詳しい解説をお願いします。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6540.txt
781 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:32:00 ] っつか、コードが悪い
782 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:38:15 ] 宿題スレはとりあえず提出できればいいやーって人向けで、 自分で理解するには向いてないと思う つか>>780 のソースは宿題スレではかなり親切な方だと思うけどな 一応コメントついてるし
783 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:46:34 ] 数当てだからといって、4桁の整数にこだわらずに 数字の文字4個の配列を使ってる。そこだろう 数字 + '0' <-> 数字の文字 理解するところまで宿題なんなら、ヒントだと思って考えてみるよろし
784 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 13:24:00 ] >>780 何がわからないのか具体的に説明してくれないと解説のしようもない。
785 名前:デフォルトの名無しさん [2008/05/16(金) 14:41:36 ] すみません。いきなりですが、本当に初心者なので分かりません。C言語では基本的に全て数値としてデータを格納すると聞きました。 ただ逆に数値(1〜9)を””で囲んで文字列とする場合、内部データは本来の数字にNullが付いた物でなく、ASCUコードで あれば文字の1なら10進数の49(16進数の10X3)に変換されるという認識でよいのでしょうか? 又、普通の文字ならは該当する10進数・16進数に変更はなくNuLLが付くだけなのでしょうか?数値ま場合だけデータそのものが 例えば1なら実質先程言った49に変換されるという認識でよろしいのでしょうか?どうかご教授願います。
786 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 14:44:37 ] 16進ダンプとかって最近は見る機会無いのかな
787 名前:デフォルトの名無しさん [2008/05/16(金) 14:48:13 ] >>786 Windowsでは見る機会がないでしょうねぇ〜〜〜禿藁 だからLinuxを使えとあれほどry
788 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:08:13 ] >>785 C言語では(エスケープシーケンスを除き) ど ん な 文 字 も そのマシン上での文字集合に対応するデジタルな値として扱われる。 ASCII文字集合を使用しているすべてのマシンで、"1"は0x31 0x00で、" "は0x20 0x00である。 数字であろうと何であろうと扱いに差はない。
789 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:09:34 ] linuxだと強制的に見なきゃいけない機会でもあんの?
790 名前:デフォルトの名無しさん [2008/05/16(金) 15:11:01 ] ありがとうございました。Cはそなのですね。
791 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:11:26 ] ntsd使うなり、IDEの16進メモリ表示モード使うなり さすがにgdbに張り合ううつもりはないが、ntsdは結構遊べる
792 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:12:46 ] なお、Cの話をする際において安易にNULLという単語を使うべきではない。 CにおいてNULLと書いた場合通常はヌルポインタ定数を表すマクロNULLのことをさす。 ASCIIのNULのことを言う場合にはNULまたはヌル文字と表記するべきである。 ついでに、ASCIIは A.S.C.I.I.(American Standard Code for Information Interchange) であってASCUではない。
793 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:14:25 ] >>789 mpeg とかかまってると, Windows でも強制的に見なきゃいけない機会は結構あるが…
794 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:14:32 ] >>792 お前が出直して来い
795 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:35:15 ] 俺がNULって書いたらナルだろーが! とおっしゃりたいのですか? どっちでもいいじゃん
796 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:42:56 ] 呼び方なんてどうでもいいよ 区別がついてないのはお前の方じゃねーかって話
797 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:44:35 ] 何を指摘したいのかを明確に挙げずに文句つけても話が混乱するだけだぞ 煽りたいだけならよそでやれ
798 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:46:11 ] >ASCIIのNUL ……
799 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:46:33 ] なんかまた変な奴が沸いたな。 相手すんなよ、つけあがるから
800 名前:デフォルトの名無しさん [2008/05/16(金) 15:47:50 ] Windows使ってるとNULLとNULの違いすら分からないようだな。 駄目だこりゃ。
801 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:49:15 ] なんだ またいつものアレか
802 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:54:28 ] >>800 違いですかwww
803 名前:デフォルトの名無しさん [2008/05/16(金) 16:06:33 ] ニート・ヒキは金どうしてる? yutori.2ch.net/test/read.cgi/news4vip/1210919591/ 1 以下、名無しにかわりましてVIPがお送りします。 [] 2008/05/16(金) 15:33:11.35 ID:2pPh1TlA0 自分でソフト作って株の売買自動でやらせてる 種が50万しかなかったし初めて2月目だから 一日三万がいいとこだし金おろせないけど まあ親元だし食ってくのには困らんので満足してる しかし欝だ・・・やることなくて寝てばっかり・・
804 名前:雷 [2008/05/16(金) 16:28:57 ] microsoft visuar studioで *印を出力するプログラムを作成してください 整数型の変数nに7〜15の値を設定する 変数nの値により,以下のような表示を行う(n=7の場合) for文(またはwhile文)とif文の組合せである カウンタ変数が偶数か奇数かで判断 printf文は printf(“n=%d\n”,n); // nの値を出力 printf(“ “); // 空白を出力 printf(“*”); // *印を出力 printf(“\n”); // 改行する だけを使用する n=7 * * * * * * * * * * * * * * * * * * * * * * * * * 上の条件でこういう風に表示するプログラムを書いてください
805 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 16:37:31 ] 宿題なら宿題スレへ
806 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 16:38:00 ] >>804 >>1
807 名前:780 mailto:sage [2008/05/16(金) 18:32:38 ] >>782 >>783 >>784 ありがとうございました。
808 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:33:01 ] float型やdouble型の内部構造がいまいちよく理解できないんだが、どっかわかりやすいとこない? 最上位ビットが符号で使われるのはわかるんだけど、それ以外がよくわからない。 小数点以下の数値をどうやって保持してるの?
809 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:42:45 ] >>808 ja.wikipedia.org/wiki/IEEE_754 実装がこれに準拠しているかどうかは別問題
810 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:12:45 ] >>809 ありがとう。指数表記を使ってるのがわかって疑問が解けました。
811 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:40:19 ] typedef struct{ double x, y; }vector_t; typedef struct{ vector_t vector; double length; }edge_t; edge_t *edge_alloc(char *filename, int *edge_num) { int i, point_num; vector_t *point; edge_t *edge_area, *edge; FILE *fp; 途中略 edge_area=malloc(sizeof(*edge)*(point_num+1)); edge=&edge_area[1]; edge[-1]=edge[point_num-1]; *edge_num=point_num; return edge; } このソースなんですが、edge[-1]とかいう場所に代入していいんですか?
812 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:17:49 ] edge[-1] == (&edge_area[1])[-1]
813 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:32:03 ] えっと〜 ?
814 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:36:28 ] edge[-1] == edge_area[0]
815 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:01:27 ] edge[n]と書くと、配列edgeのn番目、みたいに読める。 しかし、配列の中(最初かもしれないし、最後かもしれないし、途中かもしれない)を 指し示すポインタedgeの、そっからn番目、とも読める。 もちろん、edge[-1]の存在は、ちゃんと担保されてないといけないけど、 文法的にというか、読み方的には、そういう意味 てことで、>>814
816 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:07:28 ] edge[-1] == *(egde - 1) なので文法的に問題は無い 大丈夫かどうかは指してる先がちゃんとあるのかの問題になる
817 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:10:36 ] 値を代入してるわけではないんですか?
818 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:14:13 ] 代入してる場所は代入しても問題ない場所。 上の数レス読んで理解できないならあきらめろ。
819 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:14:29 ] ああそうだ もしかしてと思ってエスパーしてみるが、 edge=&edge_area[1]; の部分で、配列のコピーが発生したりは、してないからね 強いて言うなら、位置情報を代入している。それも、「一個先の位置」ね。
820 名前:デフォルトの名無しさん [2008/05/17(土) 13:18:52 ] 4,5,6進数の九九を作ってください。 4進数なら 1 2 3 1 1 2 3 2 2 10 12 3 3 12 21 こんな感じです。お願いします。
821 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:19:31 ] >>820 宿題スレへどうぞ
822 名前:デフォルトの名無しさん [2008/05/17(土) 13:20:36 ] 4,5,6進数の九九を作ってください。 4進数なら 1 2 3 1 1 2 3 2 2 10 12 3 3 12 21 こんな感じです。お願いします。
823 名前:デフォルトの名無しさん [2008/05/17(土) 13:22:05 ] なんか九九表がうまくできないですけど
824 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:22:10 ] 1 2 3 1 1 2 3 2 2 10 12 3 3 12 21 こうしたいんだろ? それはともかくとっとと消えろよ
825 名前:デフォルトの名無しさん [2008/05/17(土) 13:22:36 ] 今日から、パッケージソフトを作るための勉強をします。 何の言語を勉強すれば、よろしいでしょうか? 個人的には、C++がいいかと。 求人案件などを見ると、求人が多いから。 (ちなみに、どんなソフトを作ろうとしているかというと。 動画編集ソフトを作ろうとしています。)
826 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:23:43 ] >>825 スレタイを百回音読して涙を流しながら去れ
827 名前:デフォルトの名無しさん [2008/05/17(土) 13:25:41 ] >>826 さーせn
828 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 15:46:46 ] Borland BCC32(フリー版)を使ってますが、リアルタイムキー入力を使いたいのですが その関数名を教えて下さい (BasicのINKEY$見たいな物)
829 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:29:04 ] >>828 GetAsyncKeyState