1 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 13:44:34 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 7 pc10.2ch.net/test/read.cgi/tech/1170064980/ 過去スレ Part 1 pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 pc10.2ch.net/test/read.cgi/tech/1167325490/ 関連スレ C/C++の宿題を片付けます 83代目 pc10.2ch.net/test/read.cgi/tech/1170830498/ くだすれC言語(初心者用) pc10.2ch.net/test/read.cgi/tech/1153542424/l50 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 pc10.2ch.net/test/read.cgi/tech/1170338926/ 【初心者歓迎】C/C++室 Ver.35【環境依存OK】 pc10.2ch.net/test/read.cgi/tech/1171888583/ 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html
2 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 14:30:24 ] 2だ〜 プログラミング勉強しようと思う新1大学生何だけどお薦めの本教えてください。 勉強する順序ってC→C++でいいの?
3 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 14:34:48 ] 順序は目的次第。 C言語よりC++を先に習っても問題ないですか? pc10.2ch.net/test/read.cgi/tech/1130416484/l50
4 名前:デフォルトの名無しさん [2007/02/20(火) 14:56:55 ] プログラムを面白く習うならCよりもC++の方が書籍が充実してるなぁ。 小林健一郎や、米村貴裕の本はおもしろい。
5 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 15:07:09 ] ↑の2人ってC言語の本は書いてないの? 出版社は翔泳社がいいっていわれたんだけど・・・
6 名前:デフォルトの名無しさん [2007/02/20(火) 15:14:55 ] C言語からやったほうがC++の理論をより深く理解できるんじゃないか? たいしてプログラミングやったことないのにオブジェクト指向学んでもなぁ・・・
7 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 17:16:43 ] C++は基本以外にいろいろあるから Cで基本を押さえてからのほうがいいと思うよ
8 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 18:34:42 ] C99は後回しでもおk?
9 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 18:44:40 ] 何が言いたいのかわからん
10 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 18:55:53 ] C言語からC++に移るのって簡単?
11 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 19:13:48 ] CのようにしかC++を使わないのなら簡単。 が、拡張された機能を使おうとすると大変。 増改築を繰り返して迷路になってしまった旅館って感じの言語仕様だからね。
12 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 20:07:05 ] 迷路っていうかからくり屋敷って感じだ
13 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 20:49:01 ] ああゲーム作りてえ卒論とかマジうぜえゲームを作る時間を俺にくれええ
14 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 20:49:37 ] すいません 18年度 第3回 C言語プログラミング能力認定試験 の問題なんですが 解答を教えて下さいm(_ _)m 問6(プログラム説明) 入力した文字列の英大文字を英小文字に 英小文字を英大文字に変換し 表示する(省略) (アルゴリズム) @文字列を入力する A入力された文字列の文字を1字ずつ変換し 出力領域に代入する 英大文字であれば 英小文字に変換し 出力領域に代入する 英小文字であれば 英大文字に変換し 出力領域に代入する それ以外の文字であれば そのまま出力領域に代入する B出力領域の内容を表示する (実行結果) 文字列を入力して下さい Iam21YearsOld iAM21yEARSoLD すいません長くて.. プログラムは次です
15 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 20:53:34 ] 宿題スレというのがあるからそこで聞くといいよ
16 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:30:24 ] (プログラム) /* 大文字・小文字の変換 */ #include <stdio.h> #include <ctype.h> main() { char str_i[256]、 str_o[256]; int i、j; /* データ入力 */ printf("文字列を入力して下さい"); scanf("%s"、str_i); /* 変換 */ for(i=0、j=0;str_i[i] != '\0';i++){ if(isupper(str_i[i])) str_o[j++]= 【38】; else if(【39】) str_o[j++] = 【40】; else str_o[j++] = 【41】; } 【42】; printf("%s"、str_o); }
17 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:31:46 ] 【38】の解答群 ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j]) 【39】の解答群 ア isalnum(str_i[i]) イ isalpha(str_i[i]) ウ islower(str_i[i]) エ isupper(str_i[i]) 【40】の解答群 ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j]) 【41】の解答群 ア str_i[i] イ str_i[++i] ウ str_i[i++] エ str_i[j++] 【42】の解答群 ア str_o[--j] = '\0' イ str_o[++j] = '\0' ウ str_o[j] = '\0' エ str_o[j+1] = '\0' 以上です 携帯から長々とすいませんm(_ _)m 【38】〜【42】の答えを教えて下さいm(_ _)m
18 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:32:47 ] C/C++の宿題を片付けます 83代目 pc10.2ch.net/test/read.cgi/tech/1170830498/
19 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:38:21 ] >>14 38. ア 39. ア,イ,ウ 40. ウ 41. ア 42. ウ
20 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:49:01 ] >>16 C始めて1週間だけど多分できた。islowerとASCLLコードを使うんじゃないかな? 【42】;のところは何も書かないでも出来ちゃったけど
21 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:52:02 ] リロードしてなかった(´・ω・`) 選択肢にないのを記述してた…
22 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:58:41 ] 低レベルエスパー >>20 ○ ascii × ascll
23 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:04:38 ] >>22 書き込んでから気づいた ハジカシス
24 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:22:59 ] 16 の問題を書いた者ですm(_ _)m すいません どこか間違いらしきとことかありますかね? 19さんの解答で当たってますか? 【39】は どれも当てはまるという事なんですかね? もう一回プログラムを確認してみます
25 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:27:09 ] 1つ言うと「、」じゃなくて「,」
26 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:32:15 ] そうですか 間違いすいませんm(_ _)m プログラム自体は間違い無いですかね 要は 入力された文字列を 大文字から小文字 小文字から大文字 に変換するプログラムなんですけど ウは 2つ正解があるんですかね? 【39】はどうなんだろう...
27 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:37:34 ] だから宿題スレに行けってのに何スルーしてんだコラ
28 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:38:37 ] C言語よりまず先にマナーを勉強するべきだと思う
29 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:45:34 ] 問題としてはウが正解なんだろうけど、アとイでも実行結果は同じになる。
30 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:17:10 ] 宿題スレに書かなくて大変すいませんでしたm(_ _)m ウは3つ正解ですか??
31 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:20:22 ] ウは選択肢であって設問ではないから、「ウは3つ正解ですか???」というのは 日本語としておかしい。
32 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:23:23 ] 解答を全部ウにしたら3つ正解ってことじゃね?
33 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:24:39 ] 釣りか
34 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:47:20 ] 実は >32さんの言う通りで 答えを全部ウにしました... 3つ正解だといいんだけど..
35 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:25:53 ] 全部不正解ならいいのに
36 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:29:56 ] #include <stdio.h> #include <string> typedef struct _CALORIE{ char name[40]; float value; } CALORIE; int calregist(CALORIE *, int); float calcalc(CALORIE *, int); int main(){ CALORIE cal[500] = { {"米飯", 150.3}, {"中華麺", 57.1}, {"蕎麦", 133.3}, {"うどん", 100.0}, {"素麺", 133.3}, {"食パン", 250.3} }; int cal_num = 6; int mode = 0; printf("カロリー計算ツール\n");
37 名前:デフォルトの名無しさん [2007/02/21(水) 00:30:31 ] while(1){ printf("登録は1を、計算は2を、終了は0を入力して下さい : "); scanf("%d", &mode); if(mode == 0) break; else if(mode == 1) cal_num = calregist(cal, cal_num); else if(mode == 2) printf("総カロリー:%6.2fkcal\n\n", calcalc(cal, cal_num)); } return 0; } /************************************ calregist() カロリーリストへ登録する [引数] pcal -- カロリーリストへのポインタ num -- 登録前のリストの要素数 [戻り値] 登録後のリストへの要素数 *************************************/ int calregist(CALORIE *pcal, int num){ printf("食品名を入力して下さい : "); scanf("%s", (pcal+num)->name); printf("その食品のカロリーを入力して下さい。[kcal/100g] : "); scanf("%f", &((pcal+num)->value)); printf("登録しました。\n\n"); return num+1; }
38 名前:デフォルトの名無しさん [2007/02/21(水) 00:31:09 ] /************************************ calcalc() カロリーを計算する [引数] pcal -- カロリーリストへのポインタ num -- リストの要素数 [戻り値] カロリー数 *************************************/ float calcalc(CALORIE *pcal, int num){ char name[40]; /* 入力した食品名 */ float gram; /* 入力したグラム数 */ float totalcal = 0.0; /* 合計カロリー */ int i; printf("--食品一覧----------\n"); for(i=0; i<num; i++) printf("%s\t", (pcal+i)->name); printf("\n-------------------\n"); while(1){ printf("食品名(endで計算) : "); scanf("%s", name); if(strcmp(name, "end") == 0) break; printf("グラム数 : "); scanf("%f", &gram); for(i=0; i<num;; i++){ if(strcmp(name, (pcal+i)->name) == 0){ totalcal += (pcal+i)->value * gram / 100.0; break; } } } return totalcal;
39 名前:デフォルトの名無しさん [2007/02/21(水) 00:32:25 ] } c:\source>bcc32 CL.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample21.c: エラー E2188 sample21.c 74: 式の構文エラー(関数 calcalc ) エラー E2379 sample21.c 74: ステートメントにセミコロン(;)がない(関数 calcalc ) *** 2 errors in Compile *** エラーの解決ができませんので、ご指摘お願い致します。
40 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:37:02 ] >for(i=0; i<num;; i++){
41 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:38:45 ] > #include <string> #include <string.h> ちゃんとコンパイルかけたソースそのまま貼ったか? > for(i=0; i<num;; i++){ for(i=0; i<num; i++){ BCC って不親切なエラーメッセージ出すな。
42 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:39:10 ] 長いのはどっかのうpローダーに上げた方がいいと思う
43 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:45:31 ] TIFFファイルを解析して表示させるプログラムのサンプルってどこかにないでしょうか。 ググって探してみたんだけど、どこにも…。
44 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 00:49:04 ] >>43 libtiffに不満があって自分で作っちゃおうって人?
45 名前:43 mailto:sage [2007/02/21(水) 00:59:00 ] >>44 libtiffは知らなかった…。 見た感じ不満はなさそうなんだけど、 ただ、出来れば標準ライブラリ以外は使いたくないと思ってて。
46 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:08:44 ] >>45 自力でtiffを解析するサンプルを載せてるようなサイトはあまりないかも。 となると、tiffの仕様を読んで自分で作るしかないような。 tiffの仕様はlibtiffのサイトから辿れるよ。
47 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:17:16 ] つーか、libtiffをサンプルとするのに何が不満なんだろう。
48 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:17:18 ] 文末にセミコロン;つけるときとつけないときがあるよね?つけるときが多いけど。 それのつけるときとつけないときってどう違うの?イマイチわからない。凄く初歩的でごめん。
49 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:20:24 ] >>48 適当にソースを眺めてれば、規則性がわかるんじゃね?
50 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:21:10 ] >>48 日本語で例えると、 読点:「,」→「、」 句点:「;」→「。」 てな対応になってる。
51 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:21:12 ] libtiffをサンプルにするならlibtiffを使えばいいじゃん libtiffからソースをパクって使うってことかね
52 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:21:14 ] 文の終わりにはセミコロンがつきます
53 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:21:37 ] 文末には必ずつける。以上。 但し、プリプロセッサディレクティブは文ではない。
54 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:22:37 ] > 文末にセミコロン;つけるときとつけないときがあるよね? んなこたあない。 文末を表す記号がセミコロンだ。
55 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:23:53 ] もしかして:Pascal
56 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:25:15 ] ブロックの後ろにはつけないから、それを言ってるんじゃね?
57 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:30:34 ] C言語の構造は、 式文→式; 複文→{ 複数の文 } if文→if (式) 文 while文→while (式) 文 関数定義→いろいろ宣言 文 のように文法的にどういう形になるか決められていて、 それによって;がいるか要らないかは判断できる。
58 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:31:16 ] ごめん書き方がわるかった。 >>56 多分それだ。ブロックって言うと・・・例えばどんなのだっけ。
59 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:43:18 ] ヘッダファイルって#defineの集まりだと思っていい?
60 名前:43 [2007/02/21(水) 01:43:34 ] >>46 ありがとう。 その辺から辿ってみるよ。 >>47 別に不満はないよ。 ただ、存在を知らなかったってだけ。
61 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:43:44 ] >>59 よくない
62 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:44:22 ] >>58 >>57 で言うと、複文のこと。
63 名前:36 [2007/02/21(水) 01:45:36 ] >>40 できますた、ありがとうございました。。 >>42 やり方がわかりませんでした。
64 名前:デフォルトの名無しさん [2007/02/21(水) 01:50:36 ] >>58 例えばこんなのが不自然とかは分かるのか? if (条件式); 処理; for (i=0; i<N; i++) { 処理1; 処理2; };
65 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:59:53 ] >>64 あ、なるほど。さすがにそれはわかる。 要するに文の途中だから;は入れれないとかそういうやつか。
66 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:06:29 ] >>64 ifの方は不自然とかいう問題以前のような気がする。
67 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:12:26 ] 不自然ではないがナンセンスだな
68 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:13:43 ] >>65 > 文の途中だから;は入れれない >>64 はどっちも文法上は正しいコードだぞ
69 名前:デフォルトの名無しさん [2007/02/21(水) 02:17:17 ] if (条件式); if文で何も処理しない 処理; 普通の文 for (i=0; i<N; i++) { ありがちなN回ループ 処理1; 処理2; }; ループ後に何もしない処理
70 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:20:27 ] ;だけからなる空文(なにもしない)というものがある。 if (式); は、if (式) 文 の文の部分が;だけからなる空文 if (式) { ... };は、ifに支配されている文は {...} で終わり、そのあとに if文の次に評価される空文が1つついている解釈になる。 いずれも、文法的には正しい。 式の評価自体に繰り返す意味があって、それ以上実行する必要がある ものがない場合は、 while (式) ; のようなループ制御文の文が空文になることも実際にある。
71 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:22:58 ] >>70 のような;は見落としやすいので、 while (式) ; のようにぽつんと単独で目立つように書くのがいい。
72 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:36:42 ] { 〜〜〜〜〜 while (式) ; } はwhile (式) ;から}までを繰り返すってこと?
73 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 02:40:49 ] ('A`)エー while (条件式) { 処理1; 処理2; … 処理N; } 条件式が真の間のみ、処理1〜Nを繰り返す なんか参考書とか買って嫁
74 名前:デフォルトの名無しさん [2007/02/21(水) 02:41:30 ] >>72 ブロックの有無は関係ない。while()は次に続く文を実行するだけ。
75 名前:36 [2007/02/21(水) 03:04:44 ] >>num -- 登録前のリストの要素数 これは、どんな感じなのか、イメージが掴めないので 例を出して説明して戴けないでしょうか? >>return num+1;を返しますが、この+1とは・・・? ご助言、宜しくお願い致します。
76 名前:デフォルトの名無しさん [2007/02/21(水) 03:15:04 ] >>75 初期状態では6個登録されているようなのでnum = 6 (呼び出し元ではcal_num == 6) で、登録して要素が一つ増えたからnum+1 (戻ってきてcal_numが事実上1増えた)
77 名前:36 [2007/02/21(水) 03:22:44 ] >>76 あ〜っ!そういう事だったんですね。 とてもわかり易い説明、ありがとうございました。 あと、幾ら考えてもわからないのが >>while(1){ printf("食品名(endで計算) : "); scanf("%s", name); if(strcmp(name, "end") == 0) break; printf("グラム数 : "); scanf("%f", &gram); for(i=0; i<num;; i++){ if(strcmp(name, (pcal+i)->name) == 0){ totalcal += (pcal+i)->value * gram / 100.0; break; この中の >>if(strcmp(name, "end") == 0) >>printf("グラム数 : "); scanf("%f", &gram); for(i=0; i<num;; i++){ if(strcmp(name, (pcal+i)->name) == 0){ totalcal += (pcal+i)->value * gram / 100.0; break; この二つです、何を言ってるのやらです。 因みに、>>*gramはポインタでなく、"掛ける"ですよね?
78 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 03:28:59 ] strcmpは引数の指しているNUL終端文字配列を比較し、一致すると0を返す。 if(strcmp(name, "end") == 0) は「nameが"end"だったら」 (pcal+i)->name は (*(pcal + i)).name の略記法であり、結局は cal[i].name のこと。 該当するnameのものをforループで探し、 見つかったら( if (strcmp(name, (pcal+i)->name) == 0) ) 計算、もう探す必要はないのでbreakする。
79 名前:36 [2007/02/21(水) 05:02:11 ] ポインタや引数など理解できてないなで出直してきます m(__)m
80 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 06:01:36 ] >>78 せっかくポインタ使うんだからむしろこうしたほうがいいかも。 for(i=0; i<num; i++){ if(strcmp(name, pcal->name) == 0){ totalcal += pcal->value * gram / 100.0; break; } pcal++; }
81 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:12:41 ] 返却値に何も記入しないで return; とすると1が戻ってきますが、これはJISとかISOで規定されているのでしょうか?
82 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:22:09 ] 規定されていない
83 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:52:40 ] すみません教えてください(;´д⊂) linuxでwrite()を使ってファイルの書き込みを行なっているのですが、 2G以上のファイルの書き込みを行なおうとハングって落ちちゃいます。 write()では2G以上のファイルは使用できないのでしょうか?
84 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:57:30 ] >>83 どうやってopenしてる?
85 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:58:46 ] 2Gなら64bit APIは関係ないし、単に32bit-signed intが負になってるだけじゃ?
86 名前:デフォルトの名無しさん [2007/02/21(水) 16:13:30 ] >>84 open()はこんな感じで行なってます。 INT64 fd = open(path, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR);
87 名前:デフォルトの名無しさん [2007/02/21(水) 16:22:07 ] #include <stdio.h> int main(void) { int ch; FILE *sfp, *dfp; char sname[64], dname[64]; /* ファイル名 */ printf("コピー元ファイル名:"); scanf("%s", sname); printf("コピー先ファイル名:"); scanf("%s", dname); if ((sfp = fopen(sname, "r")) == NULL) /* コピー元をオープン */ printf("\aコピー元ファイルをオープンできません。\n"); else { if ((dfp = fopen(dname, "w")) == NULL) /* コピー先をオープン */ printf("\aコピー先ファイルをオープンできません。\n"); else { while ((ch = fgetc(sfp)) != EOF) fputc(ch, dfp); fclose(dfp); /* コピー先をクローズ */ } fclose(sfp); /* コピー元をクローズ */ } return (0); } コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。 拡張子を付けて出力する為にはどのようにすればよいのでしょうか?><
88 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:24:26 ] ファイルポインタは正負あるし、2Gオーバーだと64bit必要。 #define _LARGEFILE_SOURCE だったっけ。
89 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:26:01 ] >>87 黙って終わってしまい何もコピーできてないのか、 何かエラーがでるのか、それくらい書いてよ。
90 名前:87 [2007/02/21(水) 16:29:12 ] さらに上記のプログラムをもとに、すべての英小文字を英大文字に変換しながらコピーするプログラムを作成せよとのお題が出ました。 これはASCIIコードから操作すべきなのでしょうか?
91 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:32:02 ] >>90 #include <ctype.h> islower toupper
92 名前:87 [2007/02/21(水) 16:34:00 ] >>89 殿 拡張子抜きのファイルは確かに作れるんですが、 .txtだとか.c といった風に拡張子を付けると駄目になります。; エラーは自分で書いた、「コピー先ファイルをオープンできません」が出ます。
93 名前:87 mailto:sage [2007/02/21(水) 16:36:55 ] >>91 殿 K&R、202ページにて発見いたしました。これから読もうと思います。ありがとうございました。
94 名前:83 mailto:sage [2007/02/21(水) 16:38:47 ] >>88 #define _LARGEFILE_SOURCE は指定しています。 ちょっと調べまして、 #define _FILE_OFFSET_BITS 64 も入れてみましたが結果は変わらずです。(´・ω・`)
95 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:40:38 ] >コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。 >>87 をコピペしてコンパイルしたけどできたよ。エラーでないよ。
96 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:41:02 ] >>92 errnoでも調べとけよ
97 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:42:17 ] ファイルの20バイト目に文字列を挿入するようなプログラムを考えているのですが、 ファイルを丸ごとプログラムで読み込むようなことをしないで 実行するような方法はないでしょうか?
98 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:42:44 ] >>94 open64とか使わなくていいんだっけ?
99 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:43:42 ] 可能性 1. ファイル名に出来ない文字を打った ,カンマ と .ピリオド 間違い等(いつもと違うキーボード使ってるなら) 2. ファイル名の長さ制限に引っかかった
100 名前:87 mailto:sage [2007/02/21(水) 16:46:48 ] >>95 できた;おれも試したらできました。よかった;;
101 名前:87 mailto:sage [2007/02/21(水) 16:48:42 ] >ファイルの20バイト目に文字列を挿入するようなプログラムを考えているのですが、 > >ファイルを丸ごとプログラムで読み込むようなことをしないで >実行するような方法はないでしょうか? まさかhtmlを埋め込もうとしてる?
102 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:50:39 ] >>97 fopen "a"
103 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 16:53:44 ] >>97 書き込んだ位置以降を後ろにずらしたいなら移植性の高い方法では多分無理。
104 名前:97 mailto:sage [2007/02/21(水) 17:06:46 ] >>101 データベースを更新したりするようなプログラムを考えてます。 その際に挿入とかがどうしても必要になってきまして;; >>103 では、諦めた方がいいのでしょうか; 今ところ、 作業ファイルのようなものを仮に作成して、 その中でDBをいじって、 更新するときに、作業ファイルを丸ごと元ファイルに書き込むことを考えてますけど、 これくらいが、一番安定でしょうか?
105 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:30:52 ] 最後に作業ファイルが要らなくなるなら、 作業ファイルを閉じた後、元ファイル名へ名前を変えるだけでいいと思う。
106 名前:97 mailto:sage [2007/02/21(水) 17:37:13 ] 名前そのものを入れ替え・・・ そうですね そうします
107 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 19:51:49 ] >>97 ファイルを全部読まなくてもいいんじゃないか? 1バイト読んで作業ファイルに1バイト書いて、というのを繰り返して 20バイト目に来たら作業ファイル側だけに新たな文字列を書いて、 それが終わったらまた1バイトづつ移して最後にクローズしてリネーム。 但し本当にこの通りに1バイトづつやるのであれば fopen(), getc() putc() でやること。(open(), read(), write() 使わない方が良い。 バッファリングされないから)。
108 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 21:32:53 ] ライブラリってヘッダファイルのこと?
109 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 21:33:44 ] 再利用するために書かれたプログラム群のこと
110 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 21:42:09 ] ヘッダファイルにあるのは関数や変数の宣言。 その定義がライブラリに含まれているという場合もある。
111 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 21:47:16 ] >>109-110 ありがとう。でもまだよく分らない(|||´・ω・`) もうちょっと調べてくる
112 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 22:59:23 ] exitと入力されたら終了するようにしたいのですが、これだとexitと入力しても終了されません。 if文では文字列は扱えないのしょうか? それとも文字列cの最後の\nか\0かに関係がある? while(1){ char c[10]; printf("exitで終了\n"); fgets(c,sizeof(c),stdin); if(c == "exit"){ printf("終了します\n"); break; } }
113 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:01:56 ] >>112 >if(c == "exit"){ if(strcmp(c,"exit")==0) か if(stricmp(c,"exit")==0) としる
114 名前:113 mailto:sage [2007/02/21(水) 23:04:32 ] >>112 書き忘れたけど if(c == "exit") だとポインタの比較であって文字列の比較にならない strcmp か stricmp で比較する
115 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:08:23 ] "exit\n" じゃないとダメな気がする
116 名前:デフォルトの名無しさん [2007/02/21(水) 23:11:06 ] ""は勝手にヌル終端文字に変換されるんじゃなかったっけ?
117 名前:113 mailto:sage [2007/02/21(水) 23:13:12 ] >>115 確かに >>112 ↑で
118 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:16:20 ] ありがとうございます。 if(strcmp(c,"exit\0")==0) で無事できました。ずっと悩んでたんでかなり助かりました
119 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:16:41 ] なんてこった\nと\0見間違えたorz c[strlen(c)-1]='\0'; これで\n消せばいいんじゃね?
120 名前:デフォルトの名無しさん [2007/02/21(水) 23:16:41 ] >>112 #include<stdio.h> #include<string.h> int main(void) { while(1){ char c[10]; char a[10]; printf("exitで終了\n"); fgets(c,sizeof(c),stdin); sscanf(c,"%s", a); if(strcmp(a,"exit") == 0){ printf("終了します\n"); break; } } これで上手くいくと思うよ。俺んとこだと、sscanf を sscanf_s にしろと言われるが、 どっちでもいい。
121 名前:113 mailto:sage [2007/02/21(水) 23:22:56 ] >>118 ホントにそれでいけたの?
122 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:24:08 ] すみません打ち間違えてました\0=\n ソースの方にはちゃんと\nって打ってた
123 名前:113 mailto:sage [2007/02/21(水) 23:31:23 ] >>122 そですか でも strcmp は大文字小文字を区別します stricmp の方は大文字小文字を区別しませんのれ EXIT でもおkにするなら stricmp に変える
124 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:38:14 ] EOF 打たれたらどうするんだろ
125 名前:デフォルトの名無しさん [2007/02/21(水) 23:45:21 ] 引数の値渡しと参照渡しが理解できませんので 簡単に説明お願い致します。特にポインタを使った 参照渡しが解説を読んでもピント来ません。
126 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:55:33 ] Cって値渡ししかないんじゃなかったっけ? ポインタを使ってもアドレスという値を渡してるだけだし。
127 名前:デフォルトの名無しさん [2007/02/21(水) 23:56:43 ] www9.plala.or.jp/sgwr-t/c/sec09.html (2)2次元配列データの取り扱い方の欄で int no[3][4]の図解の説明で、どうして [0][0]は1 no[1][2]は6で足して7になるのでしょうか?
128 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:02:52 ] >>126 「参照を値渡しする」ことを「参照渡し」と言ってしまう人が多いんだよ。
129 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:03:18 ] >>125 ・文系向け 銀行に行きます。値渡しは行員が貸金庫からお金を出してきてくれます。お金を使える事はできても貸金庫内は弄れません。 参照渡しは行員が貸金庫の場所を教えてくれます。中身が何であろうと、どう使おうと自由です。 ・理系向け 値渡しが変数のアドレスに格納されている値を関数に渡すのに対し、 参照渡しは変数のアドレスを渡します。アドレス値そのものの書き換えはできなくても ポインタが指す値や配列などの前後の値を自由に読み書きできます。 実質的にはポインタを渡す場合は、 変数の内容を書き換えしたいときか、配列・文字列を扱うとき、構造体などの大きなデータを渡すとき などです
130 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:04:30 ] >>127 1と6を足したら7だと思うが、どうなると思ったの?
131 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:05:13 ] >>127 1+6=7になるからじゃないのかい? no[0][0]=1; no[1][2]=6; no[2][3]=no[0][0]+no[1][2]; の代わりに、 a=1; b=2; c=a+b; でcになぜ7が入るの?って聞いているようなもの。
132 名前:113 mailto:sage [2007/02/22(木) 00:05:29 ] >>125 Cだと参照渡しできません >>127 1+6 は 7 ですよ まぁそんなこと聞きたいわけじゃないと思いますけど もうすこし、解説読んだほうがいいかと
133 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:06:43 ] >>132 C++では参照という言葉に言語固有の限定した意味があるから、 そこから離れて説明しないといけないぜ。
134 名前:127 [2007/02/22(木) 00:06:58 ] >>130 このページの図解では、[0][0]は1 no[1][2]は6 何故[0][0] = 1; no[1][2] = 6;なのかがわからないのです 唯単に宣言しているからでしょうか?
135 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:08:02 ] 代入してるから
136 名前:113 mailto:sage [2007/02/22(木) 00:11:00 ] リロード遅れた >>128 あれま 私はてっきり void func(int &) がしたいのかと思ったよ void func(int *) ってことかね? >>133 ちょっと面倒ですね >>134 例、たとえだと思いますよ 別にno[1][0] = 1; no[1][3] = 6; no[0][2]=no[1][0] + no[1][3] 、でも良かったんだと思います
137 名前:125 [2007/02/22(木) 00:14:15 ] >>129 わかりやすい説明、ありがとうございます >ポインタが指す値や配列などの前後の値を自由に読み書きできます。 >変数の内容を書き換えしたいときか これの内容について、更に解説戴けると幸いです。
138 名前:127 [2007/02/22(木) 00:16:01 ] ありがとうございました、皆さん
139 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:25:42 ] >>136 ここはいちおうC言語スレなんで
140 名前:113 mailto:sage [2007/02/22(木) 00:32:15 ] >>139 どちら様?
141 名前:デフォルトの名無しさん [2007/02/22(木) 00:52:56 ] 今月すごい暇だからCを学ぼうと思うんだけど 何からはじめたら良い?
142 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:57:23 ] あと一週間しかないじゃん
143 名前:デフォルトの名無しさん [2007/02/22(木) 01:00:55 ] 今月は凄い暇だけど来月は割と暇 本当にやることないからちょっと齧ろうと思うんだけど甘いか?
144 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:04:46 ] とりあえず、入門サイトをググって最低限の環境整えてやってみろ で、面白ければ(多分無い)もしくは嫌いではなければ入門書買うなりなんなりと
145 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:08:26 ] >>143 いや、そんなことはない。 一週間超暇でCの学習に集中するなら、かなり進むことができる。 いい参考文書、いい先達、モチベーションの強固な維持、そして少しのプログラミングセンスがあれば。
146 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:12:49 ] >>141 学生? なんとなくでも「こんなことしてみたい」って目標があるならまだしも とりあえず、だと飽きると思うな…… 他のプログラミング言語の経験があるなら全く問題なく出来るとは思うけど。 寧ろ、「エクセルでできる〜」とか「エクセルでわかる〜」とかで 遊んだ方が為になることも多いかも試練(スレ違いスマソ
147 名前:デフォルトの名無しさん [2007/02/22(木) 01:13:55 ] >>144-145 おk、適当にやってみる 本当にただの思いつきで今までプログラムなんてやったことないから多分続かないけど ところでオススメの参考書ってある?
148 名前:デフォルトの名無しさん [2007/02/22(木) 01:16:10 ] >>146 一応まだ学生 長い春休みなんだけど遊ぶ人もいないくて暇 どうせだったらこの時間を有意義に使おうとおもって エクセルからはじめたほうがいいってことかな?
149 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:18:24 ] すごいな。プログラミングの単位落とした俺でも春休みは遊びまくるってのに。
150 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:21:22 ] >>147 読んでないけど結城浩のC言語プログラミングレッスン2冊あたりは どうだろうね。 まー、ここにも行ってみそ。 推薦図書/必読書のためのスレッド PART33 pc10.2ch.net/test/read.cgi/tech/1167140188/
151 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:21:46 ] いや、関連性は一切無い。 たまたま俺がやってて楽しかったからだw ttp://www.amazon.co.jp/Excel%E3%81%A7%E9%81%8A%E3%81%B6%E6%89%8B%E4%BD%9C%E3%82%8A%E6%95%B0%E5%AD%A6%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E7%94%B0%E6%B2%BC-%E6%99%B4%E5%BD%A6/dp/4062574306 まあVBAは絶対にオススメしないけど。 マジレスすると、Cやって役に立つような職業よりも エクセルが役に立つ職種が多い気がする ただそれだけ。 これまでプログラミング経験が無いんだったら、Cは最初には向かないかもしれん。 pc10.2ch.net/test/read.cgi/tech/1075035410/ pc10.2ch.net/test/read.cgi/tech/1152778344/
152 名前:デフォルトの名無しさん [2007/02/22(木) 01:25:26 ] >>149 マジか いや遊びまくりたいところなんだけどいつも遊んでた奴がバイトはじめたりなんだかんだで なんか家でずっと一人でネットばっかやってるのが虚しくなったからさ >>150 ありがとう、後でじっくり読んでみる >>151 そうなのか プログラムっていったらCとかしか聞いたことなかったから解らんかった 初めてやるならなにがいいのかな?
153 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:30:12 ] >>152 やる気があるならC言語が最適
154 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:36:48 ] どうせ時間は腐るほどあるので長い目で見てCでもやってみます みんなありがとう
155 名前:デフォルトの名無しさん [2007/02/22(木) 01:43:43 ] int型数値を3,221のように3桁カンマ区切りで文字列変換してくれる標準関数ってありましたっけ? なければ自分で作ります
156 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 01:54:55 ] printfで'フラグを使える処理系もあるが、標準Cにはない。
157 名前:デフォルトの名無しさん [2007/02/22(木) 02:09:19 ] www9.plala.or.jp/sgwr-t/c/sec10-3.html 文字列とポインタがわかりません、説明は読みました 前の変数と配列のポインタは理解できました >>>10−3.ポインタと文字列 普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、 文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを 直接ポインタに指定することができます。 これがわかりませんので、解説よろしくお願いいたします。
158 名前:157 [2007/02/22(木) 02:15:12 ] 因みにポインタのポインタは理解できました(図解を見て) ポインタと文字列で >>>>>>10−3.ポインタと文字列 普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、 文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを 直接ポインタに指定することができます。 これで、普通の"変数や配列のポインタ"と、"ポインタと文字列 "の違いがわかりませんです。
159 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:34:05 ] 変数や配列のポインタ"と"ポインタと文字列の違い → ありません。全てアドレス値です。そもそも文字列というのはchar型配列(の先頭のポインタ) "ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい ""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える よってconst char *hoge[N]みたいなので文字列定数の配列が作れます。
160 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:34:35 ] 本来、 int *array = { 1, 2, 3, 4, 5 }; // エラー こういうことはやったらおこられるが、 文字列ならおkとかそういう意味。 char *p = "ABC"; // おk 別にポインタそのものには違いはない。
161 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 03:18:34 ] >>156 サンクス自分で作る
162 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 03:23:01 ] >160 その説明だと、 char *p = "ABC"; *p = 'D'; とか平気でやるようになりそうだ。
163 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 03:32:47 ] >>157 は前スレの人だな 未だまともな本買わずに、サイトとか見てるのか。
164 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 03:46:10 ] >>162 それがダメなのはchar *pが暗黙にconstとして宣言されているからですか?
165 名前:157 [2007/02/22(木) 03:59:51 ] >>159->>159 では、大した違いが無く気にせずでいいんですね。 サンクスでした >>163 良い本が見つからず、どれを買うか悩んでいます ここで紹介された本は書店では見当たりません 今のところ、上で挙げたサイトが最良です
166 名前:157 [2007/02/22(木) 04:12:50 ] >>>配列を使わずにメモリ上に取られた文字列のアドレスを 直接ポインタに指定することができます この解説が >>>"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい ""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える >>int *array = { 1, 2, 3, 4, 5 }; // エラー こういうことはやったらおこられるが、 文字列ならおkとかそういう意味。 char *p = "ABC"; // おk この二つでいいのですよね? もう一度だけ、例文を用いて解説して戴けると、ありがたいです。
167 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 04:13:33 ] >>164 その場合の挙動が標準規格で未定義だからです。
168 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 05:02:54 ] >>167 ありがとうございます。 足を踏み入れてはいけないところに行ってしまったみたいで ちょっとびびりますた。
169 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:05:45 ] クリップボードに文字を出力など、クリップボードを弄りたいんですがどうすればいいんでしょうか?
170 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:09:12 ] >>169 OSは?
171 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:09:34 ] WinXPです
172 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:10:42 ] じゃあこっちじゃない? Win32API質問箱 Build50 pc10.2ch.net/test/read.cgi/tech/1171721448/
173 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:14:54 ] ありがとう。そっちいってきます
174 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 11:36:45 ] struct nannka{ char name[20]; char name2; int No; int time; char nurupo[10];・・・・ } みたいな感じでcharやintなんかがごっちゃになってる構造体を ポインタ操作か何かで 順番に指定していくことってできますか?
175 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 11:50:34 ] 構造体を順番に指定するのと、構造体の要素を順番に指定するのは全く違う。
176 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 11:58:59 ] >>174 >構造体を順番に指定 struct nannka a, b, c; struct nannka p[] = {&a, &b, &c}; >構造体の要素を順番に指定 struct nannka a; void * p[] = {a.name, & a.name2, & a.No, & a.time, a.nurupo};
177 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 12:13:48 ] 要素の方です。 ありがとうございます。 早速試させていただきます。
178 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 12:22:01 ] 指定したからと言って何ができるわけでもないことに注意。
179 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 14:07:52 ] char name[20]; char name2; int No; int time; char nurupo[10]; こういう型の異なる構造体のメンバにポインタを使って順番にアクセスする意味があるのだろうか? 結局、そのメンバが文字列なのか整数型なのか判断する必要があるわけだし 名前でアクセスしたほうがソースも見やすいと思うけど
180 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:19:21 ] fgets(buff, sizeof(buff), stdin); sscanf(buff, "%s", buff); これは反則技ですか?
181 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:24:40 ] fgets(buff, sizeof(buff), stdin); むしろ一般的(?)。これだけで十分だな。最後に\nがくっ付くので注意
182 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:29:03 ] ごめん、説明が足らんかった。 sscanf(buff, "%s", buff); の方。 同じものにsscanfをしていいのかどうか
183 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:38:44 ] >>182 領域が重なっていると鼻から悪魔
184 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:49:57 ] ホワイトスペースで区切りたいってことか?やる意味がよく分からん
185 名前:デフォルトの名無しさん [2007/02/22(木) 16:54:47 ] >>180 反則技 あぶないコーディング
186 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:55:38 ] 改行\nを除きたいだけです 別に buff[strlen(buff)-1] = '\0'; 等でも やりたい事はできるのだけど、 sscanf使ったらどうなるのかな、って思っただけ。
187 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:56:55 ] >>182 実用上問題ないけど、かなり危険な気がする でも、その例が思い浮かばない ループで\nを取り除いたほうがいい気がする >>184 \nを取り除きたいんじゃないの?
188 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 16:59:22 ] strcpyなんかと同じで、コピー元オブジェクトとコピー先オブジェクトのメモリ領域が重複していている場合の動作は未定義
189 名前:デフォルトの名無しさん [2007/02/22(木) 17:38:36 ] >>186 それやるなら fgets(buff, sizeof(buff), stdin); sscanf(buff, "%s", command); でいいんじゃない? buffは入力データを格納する領域の名称 入力データを加工したらもうbuffではないでしょう
190 名前:デフォルトの名無しさん [2007/02/22(木) 17:58:26 ] C言語でマルチスレッドを使う方法と httpsの使い方を教えてください
191 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 18:19:34 ] >>190 目的の環境に合わせて適切なライブラリを入手せよ。 C言語自体には、それらの取り扱いは規定されていない。
192 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 22:33:45 ] JavaのSystem.CurrentTimeMillies()と同等の関数名を教えてください。
193 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 22:38:56 ] 標準Cでは秒未満の時刻情報を扱う手段はないが、 #include <time.h> time_t time(time_t *timer);
194 名前:デフォルトの名無しさん [2007/02/23(金) 00:35:51 ] char *p = "ABC"; と char [10] = "ABC"; char *p; p = s; の違いは何なのでしょうか?
195 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:41:17 ] >>194 前者はコンパイルができて後者はエラーになってコンパイルが通らない。
196 名前:194 [2007/02/23(金) 00:42:34 ] >>195 どうしてなんでしょうか? 同じポインタですよね?
197 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:44:43 ] >char [10] = "ABC"; ↑変数名がないからエラーになる。ポインタは関係ない。
198 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:46:45 ] そこは s[10] くらいエスパーしたれよw
199 名前:194 [2007/02/23(金) 00:47:28 ] 訂正 char *p = "ABC"; と char s[10] = "ABC"; char *p; p = s; の違いでした。
200 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:47:29 ] ワロス
201 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:50:03 ] >>194 pの指しているものが文字列リテラルか文字配列かの違い。
202 名前:194 [2007/02/23(金) 00:54:10 ] >>201 もう少し簡単にお願い致します ”リテラル”、入門書にも載っていません(索引も調べましたが)・・・・ 文字列リテラルか文字配列とは・・・?
203 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:56:41 ] 文字列リテラル…変更できないNUL終端文字列
204 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:57:21 ] >>194 char *p = "ABC"; ←"ABC"という文字列を指しています。普通はこのポインタを介しての変更はしません。 char s[10] = "ABC"; char *p; p = s; ←今は"ABC"の入った配列の先頭を指しています。指してる配列の中身を変更できます
205 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:58:58 ] 入門書も不親切なのが多い。 記憶クラスやらスコープやらの説明をする前に、変数を宣言すると メモリ上に型に応じた領域が確保されるというのをちゃんと教えて くれないといかん。 あと、初期値の設定なんて0/NULLにしておくくらいしか普通使わなく ないか?
206 名前:194 [2007/02/23(金) 01:07:15 ] >>203 >>204 >>205 ありがとうございます char s[10] = "ABC"; char *p; p = s; は、a[0] A を指していて char *p = "ABC"; pの中に"ABC"が入るって事でしょうか?
207 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:12:00 ] pはポインタだから、格納できるのはアドレスだけ あくまで"ABC"っていう文字列リテラルの先頭を指しているだけで、 中に入っているわけじゃない。 こういうのって実行時にプログラムが、どんな風に展開されてるかを イメージできないと理解しにくいんでない?
208 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:15:05 ] char *p = "ABC"; だと、 ヒープにおかれた "ABC" の先頭アドレスが p に代入される。 char s[10] = "ABC"; だと、 スタックに s がつまれ、"ABC" で初期化される。
209 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:15:28 ] >>206 (こいつだめだ・・・まるでわかってない・・・俺が教えてやんよ!) 前者はそんな感じ(中身のAを指してるわけじゃないが) 後者は例えば文字列リテラルという型LITERALがあったとしよう。 char *p = "ABC";っていうのはいわば前者と同じ感じで LITERAL lite = "ABC" char *p = &lite; //&liteはアドレス こんな感じで、配列だろうと文字列リテラルだろうとメモリ上にあるからアドレスがあるわけだ
210 名前:194 [2007/02/23(金) 01:16:53 ] >>207 難しいです、というかイメージが付きにくいです >>文字列リテラルの先頭を は"ABC"の{'A',B',C,','\0'};リテラルの先頭とは \0←を指しているのでしょうか?それとも'A'でしょうか?
211 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:18:57 ] Aに決まってるだろ・・・
212 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:18:59 ] ポインタはただの矢印だって。 矢印に 'A' が入るんじゃない。 矢印のさしている先に 'A' があるんだよ。
213 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:19:21 ] アラビアか
214 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:19:59 ] ヘブライだよ
215 名前:デフォルトの名無しさん [2007/02/23(金) 01:28:19 ] fabs()とabs()は動きが違うのか?
216 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:30:56 ] >>208 堂々とした間違い。
217 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:31:54 ] >>215 int か double か
218 名前:194 [2007/02/23(金) 01:32:10 ] 皆さん、ありがとうございました・・・ ヒープやスタック、とか説明が高度で付いていけません 双方共に同じ先頭を指してるのに何が違うのかイメージがつかないです もう一度だけ>>char s[10] = "ABC"; だと、 スタックに s がつまれ、"ABC" で初期化される。 の>>スタックに s がつまれ、"ABC" で初期化される。 というのを解説お願い致します。 あとは出直してきます
219 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:33:27 ] >>215 int abs(int); double fabs(double);
220 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:34:02 ] >>218 そこ間違ってるから気にする必要はない
221 名前:194 [2007/02/23(金) 01:34:36 ] 皆さん、ありがとうございました・・・ ヒープやスタック、とか説明が高度で付いていけません 双方共に同じ先頭を指してるのに何が違うのかイメージがつかないです もう一度だけ>>char s[10] = "ABC"; だと、 スタックに s がつまれ、"ABC" で初期化される。 の>>スタックに s がつまれ、"ABC" で初期化される。 というのを解説お願い致します。 あとは出直してきます
222 名前:194 [2007/02/23(金) 01:35:18 ] >>220 ありがとうございました、出直してきます
223 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 01:38:01 ] >>218 分解して考えると分かるかも char s[10] = "ABC";は char s[10]; strcpy(s, "ABC"); この場合は、char s[10]の領域の内容を s[0]='A' s[1] = 'B' s[2]='C' s[3]='\0' s[4]〜以下不定 で初期化。 char *p = "ABC"; これを分解すると char *p; p = "ABC"; こうすれば、pは単なるポインタだってわかるはず。"ABC"はコンパイル時に プログラム(exeファイルとか)内のどこかにおかれる文字列定数の先頭 のアドレスの意味になる。
224 名前:36 [2007/02/23(金) 02:12:00 ] 質問なのですが、num -- 登録前のリストの要素数 とは どのことでしょうか?要素とは何でしょうか?
225 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 02:29:08 ] >>224 "米飯", 150.3 ←要素 "中華麺", 57.1 ←要素 "蕎麦", 133.3 ←要素 "うどん", 100.0 ←要素 "素麺", 133.3 ←要素 "食パン", 250.3 ←要素 要素数=6
226 名前:36 [2007/02/23(金) 02:45:37 ] >>225 さんkすです! 要素だから[]だと思っていました
227 名前:デフォルトの名無しさん [2007/02/23(金) 04:10:56 ] 構造体はポインタは使えますか? それとも構造体配列でないとポインタは使えないでしょうか?
228 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 04:22:18 ] 構造体を指すポインタ? 使えるよ。
229 名前:36 [2007/02/23(金) 04:35:43 ] この構造体のポインタは CALORIE cal[500] = { {"米飯", 150.3}, {"中華麺", 57.1}, ←アドレス:1000: cal[0] {"蕎麦", 133.3}, {"うどん", 100.0}, ←アドレス:1001: cal[1] {"素麺", 133.3}, {"食パン", 250.3} ←アドレス:1002: cal[3] }; なのでしょうか? 或いは、これら全体でアドレス:1000: cal[0]なのでしょうか? {"米飯", 150.3}, {"中華麺", 57.1}, {"蕎麦", 133.3}, {"うどん", 100.0}, {"素麺", 133.3}, {"食パン", 250.3} }
230 名前:36 [2007/02/23(金) 04:45:12 ] 訂正です {"米飯", 150.3}, ←アドレス:1000: cal[0] {"蕎麦", 133.3}, ←アドレス:1001: cal[1] {"素麺", 133.3}, ←アドレス:1002: cal[3] {"中華麺", 57.1}, ←アドレス:1003: cal[4] {"うどん", 100.0}, ←アドレス:1004: cal[5] {"食パン", 250.3} ←アドレス:1005: cal[6]
231 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 04:51:10 ] 構造体の配列でも普通の変数の配列と違いはないよ。
232 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 04:54:46 ] 構造体CALORIE型の配列名calは、そのままCALORIE*という型の ポインタに代入することが出来る。 指しているのはcalの先頭要素。 ポインタに加減算をすることで次/前の要素をポイントできる。
233 名前:36 [2007/02/23(金) 05:06:02 ] では、ポインタはアドレス:1000を指してると解釈して良いですね?
234 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 05:09:16 ] 構造体がどうこうより、ポインタの理解が怪しい気がするが。
235 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 05:10:52 ] ポインタを学ぶときは、アドレスという物理的な概念は忘れた方がいい。
236 名前:36 [2007/02/23(金) 05:22:03 ] >>234 では違っているのでしょうか? >>235 え?そうなんですか? ポインタはアドレスが重要と思っていましたが では、アドレスでなくインデックス番号を重視すべきですかね?
237 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 05:37:31 ] ポインタはデータがある場所を指しているのは確かだが、それを 実現するためにCではアドレスという機械寄りの概念を露出させ てしまっているだけ。Pascalではもっと抽象化されているし、ポ インタ=アドレスという理解だとJavaにはポインタがないという勘 違いも生む。 場所さえ指せればよいのだから、使い手にとっては、それがメモリ 上のアドレス値であるというのは余計な情報。
238 名前:36 [2007/02/23(金) 05:41:47 ] ( ̄□ ̄;)!! 初めてのプログミングがCだったのが間違いでしたかね Javaの方が簡単と聞きますし
239 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 05:43:37 ] ×「ポインタ=アドレス」じゃなくて ○「Cではポインタをデータのあるメモリ上のアドレスとして表現している」 と理解してればいいんじゃね?
240 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 05:49:55 ] >233のポインタってどのポインタよ?
241 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 06:11:30 ] アドレスの話をしたいんなら、こういうのやってから家 CALORIE *hoge=cal; int i; for(i=0;i<cal_num;i++){printf("%6s(%3.0f) %p\n",hoge->name,hoge->value,hoge);hoge++;} (int mode = 0; の直後) で、表示されたモノは一旦忘れてw 真面目な話、例として↑のコードで CALORIE *hoge(CALORIE型のポインタ)はメモリのどこかに格納されているデータ、CALORIE型の変数(配列)にアクセスできる。 この場合、最初に設定されているアクセス先は配列cal[500]の先頭(つまり要素cal[0])で、 hoge++ で、次々とcal[1], cal[2], cal[3] ... とアクセスして表示している。 冗談で %p で番地を表示しているけど、実際のコーディングでこのアドレスを意識する必要性は無い(と思う と偉そうに言う俺もほぼ初級者。。。
242 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 07:16:17 ] int main() { char a[4] = "ABC"; char *p = "ABC"; printf("&a = %p\n", &a); printf("a = %p\n", a ); printf("&a[0] = %p\n", &a[0]); printf("\n"); printf("&p = %p\n", &p); printf("p = %p\n", p); printf("&p[0] = %p\n", &p[0]); return(0); } // 3つとも配列aの先頭アドレス &a = 0x22cce4 a = 0x22cce4 &a[0] = 0x22cce4 &p = 0x22cce0 // ポインタ変数pのアドレス p = 0x402000 // ポインタ変数pの値 &p[0] = 0x402000 // "ABC"が格納されている場所の先頭アドレス=ポインタ変数pの値
243 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 07:25:55 ] >242 そう書くと&a、a、&a[0]どれも同じに見えてしまう。
244 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 09:34:35 ] >>242 リテラル使って初期化したら初心者には余計わかりづらいと思うんだが。
245 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 12:33:20 ] >>243 &a、a、&a[0]は、どれも同じ。 a も p も表示させるとアドレスだが、a は配列aの先頭アドレスであって、 &a の示すアドレスに0x22cce4というアドレスが格納されているのではない。 そのため、a = p という代入はできない。 一方で、p は変数pのアドレスではない。 &p の示すアドレスに0x402000というアドレスが格納されている。 この0x402000は "ABC" というデータが格納されている領域の先頭アドレスに なっている。 変数p にはアドレスを格納できるので、p = a という代入はできる。
246 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 12:37:12 ] >>245 間違ってるぞ
247 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 12:57:00 ] どこが間違ってるか書かないと 間違ってるとは言えない
248 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 13:02:59 ] アドレスとしては一緒だが&aは配列のアドレス、aと&a[0]は配列の先頭要素のアドレスであって 型が違う。 p = &a と代入すると警告が出るはず。
249 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:26:12 ] #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_LINE 79 void main(void) { char s[] = "0123456789" "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "[]@;:-+*^~|_,.\\/\"\'%%$#&()!"; char ps[MAX_LINE]; int si = sizeof(s); int i; srand(time(NULL)); for( i = 0; i < MAX_LINE; i++ ) ps[i] = s[rand() % si]; printf(ps); } なんとなく思いつきでランダムな文字列を79個配列にコピーして それを表示するプログラム作ってみたんですが、実行する毎に79文字表示されなかったり エラーが出たりします。 間違いを教えて頂けないでしょうか?
250 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:37:27 ] エラーメッセージ書けよ。 79文字表示されないのはs[si-1]が'\0'だから。
251 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:40:13 ] >>250 のもそうだが、安定しないのは文字列に % が入ってるから。 printf("%s", ps); でやってみ
252 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:41:17 ] sizeof(s) は ¥0 までのサイズになるので、 rand() % si のとりうる範囲は[0,sの文字列長+1] よって ps[i] の途中に ¥0 が入る可能性がある。
253 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:42:52 ] 微妙に訂正。 「¥0 までの」ってのは「¥0 を含んだ」ね。 素直にstrlen使おう。
254 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:43:44 ] 短くなるのは\0混じりだからだな
255 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 14:47:53 ] >>250-254 ご丁寧にありがとうございます。 エラーは例の「ご迷惑をおかけして(ry」のヤツです。 NUL文字について忘れてました。
256 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 15:08:53 ] 質問です unsigned long a ; if( a>>31 & 1 == 1 )やif( a>>31 & 1 !=0 ) とすれば、aの31ビット目が1であるかどうか判定できますでしょうか?
257 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 15:35:09 ] 31ビット右にシフトして、1と論理積とったらわかるんじゃないかな
258 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 15:35:20 ] >>256 何でそんな質問に到ったのかわからんので想像で答えるが 演算子の優先順位に注意
259 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 16:24:17 ] &1で1ビットだけとったら値はbooleanになるんだから ==1はいらないんじゃないすか、と主観で語ってみる。
260 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 21:55:40 ] boolつうか非ゼロな
261 名前:36 [2007/02/24(土) 00:25:43 ] 度々で申し訳ありませんが、最後の質問です /************************************ calregist() カロリーリストへ登録する [引数] pcal -- カロリーリストへのポインタ num -- 登録前のリストの要素数 [戻り値] 登録後のリストへの要素数 *************************************/ これの >>calregist() カロリーリストへ登録する カロリーリストとは {"米飯", 150.3}, {"中華麺", 57.1}, {"蕎麦", 133.3}, {"うどん", 100.0}, {"素麺", 133.3}, {"食パン", 250.3} これであっていますよね?
262 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:26:17 ] Aが1、または2または3の場合、正常それ以外は異常という判定で 以下のようにコーディングしたら先輩からそんな糞コードかくなと怒られてしまった。 実際はもっと条件が複雑で、逆の条件を考えるのが億劫だったからこうしたんだけど やっぱりダメですか? if (a == 1 || a == 2 || a ==3) { /* 何もしない */ } else { /* エラー */ return 1 } 正常の場合、処理が続く
263 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:32:05 ] >逆の条件を考えるのが億劫だったから 全体を !() でくくればいいだけじゃね
264 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:34:40 ] >>261 カロリーリストはこの場合はCALORIE cal[500]だと思われ。{"米飯", 150.3},(ryもその一部 日本語に惑わされずに順に追ってけば分かると思うが >>262 if (A != 1 || A != 2 || A !=3) { /* エラー */ return 1; }
265 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:36:35 ] ミスった。Aが1でも2でも3でもない場合 if (A != 1 && A != 2 && A !=3) { /* エラー */ return 1; }
266 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:38:55 ] >>265 誰もそんなこと聞いてないと思うが
267 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:53:21 ] #define unless(cond) if(!(cond))
268 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 01:07:35 ] Aが整数なら if(A<1 || 3<A) でいいんじゃないか
269 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 01:08:54 ] だからそういう問題じゃないだろうと…
270 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 01:14:03 ] >>269 じゃあ書いたら 思い浮かばない?
271 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 01:20:09 ] >262 先輩の言うことは聞いとけ。 っていうかその程度の条件が億劫ってやヤバすぎだろ。
272 名前:262 mailto:sage [2007/02/24(土) 01:21:31 ] !()は自分もすぐに思いついたのですけど 一応、独自のコーディングルール!?に引っかかって使えないのですよね。 なんとか正しい条件は書けて、テストも上手くいったけど 何度条件判定見直しても、わけわかんねって感じです。 既存のコードの修正なんで、ロジックも変にいじれないしつらい・・・
273 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 01:30:43 ] >>271 ( (a < 4 || a > 5 && a % 6) && g(a) ) の否定は?って聞かれて正しい答えが2,3秒で思い浮かぶならいいけどさ。 そうじゃなければ、エンバグのもとになるんじゃないかな。
274 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 05:29:55 ] >265見たいな糞コード書かれるよりは>262の方がよっぽどマシだな。 コメントはアレだけど。
275 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 05:37:56 ] >>274 後学のために>>265 のどの辺がどう糞コードなのか教えて欲しい。 おれにはそうは見えないのだが。
276 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 05:41:21 ] if (a == 1){ //処理1 } else if (a == 2) { //処理2, 3略 } else { //鰓 return 1 } 良く分からんけど、こういう処理をするんじゃないの? (switch使っても一緒?
277 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 05:46:58 ] !()使えないってのも腐った規約だな。
278 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 05:57:52 ] 漏れは>>262 みたいなよりは>>265 みたいに書いてくれた方がいいな
279 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 06:06:59 ] >Aが1、または2または3の場合、正常それ以外は異常という判定 これは誰がどう見ても、 if (A == 1 || A == 2 || A == 3) 正常; だよな。でだ。 if (A != 1 && A != 2 && A != 3) 異常; と書いてあったらそれが >Aが1、または2または3の場合、正常それ以外は異常という判定 だと瞬時に判断できるか? 条件の部分がもっと複雑だったらどうする? 一々ドモルガンの定理でひっくり返すのか? >Aが1、または2または3の場合、正常それ以外は異常という判定 だけしか書いてなくて、Aが整数かどうか判らないのだから>268でいいかどうかも判らないしな。
280 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 08:15:58 ] char str[256] = "123"; int num; num=(int)str; コンパイルは通るのですがうまくキャストされてません。 ※if(num==123)がfalseになる strは毎回あたいが変わるものとしてどうしたらいいでしょうか?
281 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 08:53:34 ] >>279 整数でないならますます>>268 みたいに判別すべきじゃないのか?
282 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 09:26:29 ] >>281 値のリストが膨大でも? >>280 キャストでは無理。atoi()か、できればstrtol()を使え。
283 名前:282 mailto:sage [2007/02/24(土) 09:27:35 ] >>281 あー、元レスを中途半端に誤認した。無視してくれ。
284 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 09:58:20 ] テキストファイルを最初100行分メモリ領域確保して、その後10行毎に メモリ領域確保しながら読み込む事を考えています。 (1)と(2)とではどちらが一般的なルーチンなのでしょうか? (今(1)なのですが、野暮ったい感じがします・・) (1) 100行分領域確保 ループ{ 10行毎に領域確保 ファイル1行読込 } (2) ループ{ もしループ初回なら100行分領域確保 10行毎に領域確保 ファイル1行読込 }
285 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 10:16:36 ] >>280 #include <stdio.h> #include <math.h> int main(void) { char str[256] = "123"; int num, len, tmp, i; tmp = *(int *)str; len = strlen(str); num = 0; for (i=0; i<len; i++) num += ((tmp >> i*8) & 0xFF - '0') * (int)pow(10, (double)(len-1-i)); printf("%d\n", num); return(0); }
286 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 10:19:12 ] >>280 charの配列を宣言したとき、その変数はポインタになる。 num=(int)str; ↑つまりこれはnumに文字列"123"へのアドレスをint型として代入しただけ。 そもそもCでは代入演算子を使って文字列を一気に変数ぶち込む、というのが出来ない。 >>282 の言うとおりatoiあたりを使うしかない。自分で関数作ってもいいけど。 >>284 その辺は個人のコーディングスタイルの問題じゃなかろうか。 個人的には1の方が見やすい。
287 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:21:14 ] >>284 野暮ったく思う理由は? 別に(1)でいいと思うけど。 #領域確保が関数化されていなくて複雑な手順だというのなら、(2)の方がましだが…… >>285 勘弁してくれ。
288 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:38:50 ] >>286 >>287 野暮ったいというのは、(2)のループ内の領域確保部分を関数化 した方が見やすいかと思ったからです でも面倒になってきたんで(1)で行きます ありがとうございました
289 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:51:13 ] >>288 関数化したなら、その関数を(1)の形で呼ぶだけでいいじゃん。
290 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:55:00 ] >284 ループの先頭で初回にしか分岐しない条件入れるのって気持ち悪くない?
291 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:55:10 ] >>288 bufsize=256文字分領域確保 ループ{ ファイル1字読込 bufsize文字になったらbufsize+256文字分に領域拡大 push(...); } push(...) { もし1行目ならdatasize=100行分領域確保 datasize行になったらdatasize+10行分に領域拡大 1行追加 }
292 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:14:12 ] 質問です。 ゼロ除算を避ける方法ですが、分母 a が int 型の整数なら、 a==0 のときだけ場合分けすれば問題なしです。 分母 a が double 型のときはどうなのでしょうか? a==0.0 のときだけ場合分けすればよろしいのでしょうか? 同じ 0 でも、0.0+1e とか 0.0+10e とかありそうで不安です。
293 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:16:21 ] fabs(a)<1e-10
294 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:25:28 ] DBL_EPSILON使えよ。
295 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:37:57 ] >>294 gcc(mingw) の include ディレクトリの中を grep で捜したけど無いぞ どのファイルに書かれているのかkwsk
296 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:43:21 ] <float.h>
297 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:47:46 ] doubleで0除算しても整数除算と違ってエラー終了しないことが多いがね。
298 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:53:40 ] >>295 俺の環境では include/c++/3.4.2/limits にあったが
299 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:57:58 ] >>298 スレタイ嫁
300 名前:295 mailto:sage [2007/02/24(土) 13:05:36 ] >>298 そこにもなかった return __DBL_EPSILON__; と書いてある行はあったが定義の場所が不明 Borland C++ Compiler ver5.5 なら float.h に DBL_EPSILON の定義が書いてあった
301 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:17:54 ] >>300 中のぞいてみれば分るが、君がmingwのincludeディレクトリだと信じている ディレクトリの中のfloat.hは#include_nextで別のところのfloat.hを読んでるはずだ。
302 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:24:38 ] >>301 thx include\..\lib\gcc\mingw32\3.4.2\include\float.h にあったよ
303 名前:280 mailto:sage [2007/02/24(土) 15:04:34 ] >>282 >>285 >>286 勉強になりました、ありがとうございます
304 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:27:48 ] >>292 ==0.0の時でいいんじゃね?それは実際の表記であって値は同じじゃね?
305 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:40:42 ] 機械イプシロンについて高校生でも理解できる解説きぼんぬ。
306 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:46:00 ] >>292 浮動小数点の0除算は正負のInfかNaNが返るだけだから、そんなことする必要なくね?
307 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:48:16 ] >>305 どこが判らんの?
308 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:54:56 ] >>305 人間イプシロンの機械版だよ
309 名前:268 mailto:sage [2007/02/24(土) 17:55:04 ] >>281 有効なのは1、2、3 だから 2.5とかはダメかもしんないので
310 名前:268 mailto:sage [2007/02/24(土) 17:59:16 ] >>279 >Aが1、または2または3の場合、正常それ以外は異常という判定 >だけしか書いてなくて、Aが整数かどうか判らないのだから>268でいいかどうかも判らないしな。 だから「整数なら」って書いたんだけど
311 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:03:26 ] そんなピントのずれた話題をずるずる引っ張るなよ…
312 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 19:54:53 ] 文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、 その添字を返し、含まれていなければ-1を返す関数 int str_char(const char str[], int c) {} を作成せよ。 のint cってchar cではないんでしょうか?
313 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:24:09 ] >>312 標準関数では、古いCとの互換性などの観点から引き数にintより小さい型は使わない。 それに倣ったか深く考えてないか、その辺だろ。
314 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:36:16 ] >>313 どもです。 う〜ん仕様変えるのはアレなのでこのまま頑張りますか…
315 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:44:33 ] char cでは無い unsigned char か int
316 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:53:07 ] >>315 ありがとうございます。それでやってみます〜
317 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 01:43:38 ] コマンドプロントから実行っていうのは飽きてきたんで、C言語でWindowsの ウィンドウを作りたいんですが、なにを勉強すればいいんでしょうか? オススメの書籍、サイトありましたら教えてください
318 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 02:03:51 ] wisdomsoft (旧
319 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 02:35:08 ] >>317 いわゆるpetzold本しかないんじゃね? 「プログラミングWindows」という本だ。 amazonとかで探してみれ。 ただし、期待しているものとは違っている可能性がある。
320 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 02:39:07 ] C++ じゃない純粋な C だけの Windows プログラムの本って そういや見たことないや
321 名前:デフォルトの名無しさん [2007/02/25(日) 02:41:04 ] www9.plala.or.jp/sgwr-t/c/sec15-4.html このページの、【2.アドレス渡し】の下図で seito2[0] 1000番 seito2[1] 1001番 seito2[2] 1002番 なのでしょうか?
322 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 02:57:27 ] 違う。 seito2[1] は seito2[0] のアドレス + sizeof(seiseki) (場合によってはさらに詰め物) のとこにある。
323 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 02:59:51 ] ただし、ポインタの加減算は指しているデータの型でスケールす る(拡大される)ので、 seiseki* p = &seito2[0]; なときに p + 1 == &seito2[1]; となる。つまりは、 *(p + 1) == seito2[1]; というか配列という記法は上のような式の左辺を見やすくするための 便法でしかない。
324 名前:デフォルトの名無しさん [2007/02/25(日) 03:04:28 ] >>322->>323 www9.plala.or.jp/sgwr-t/c/sec10-2.html では、配列とポインタと同じ事でしょうか? となると seito2[0] 1000番 seito2[1] seito2[2] seito2[1] seito2[2] のアドレスは幾つになるのでしょうか?
325 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 03:09:10 ] いくつ増えるかは - CPUが何か - sizeof(seiseki) がいくつになるか (単純に構造体のメンバーのサイズの合計とはならない可能性がある) によって違う。
326 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 03:15:57 ] size = sizeof(seito2) とすると seito2[0] 1000番 seito2[1] 1000+size番 seito2[2] 1000+size*2番
327 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 03:26:39 ] あるテストをしました。 テストを受けた人間の情報を管理する為に、個別に個人情報紙(構造体)を作りました。 個人情報紙(構造体)には"テストの成績番号""名前""点数"を書く事にしました。 今回のテストの情報用紙を束ねた物には、seito2という名前を付け管理する事にします。 では、seito2を束ねた順に横に並べてみましょう。 この並べ始めた地点をseito2[0]と呼ぶ事にします。 次は当然seito2[1] その次はseito2[2] になります。 用紙のサイズは全部同じにしてあるので 用紙のサイズ * 見たい生徒の番号(何番目に並べたか) で見付ける事も出来ます。 なんかめんどくなった。 見てわからんなら実際にメモ用紙にでも書いて並べてみれ
328 名前:デフォルトの名無しさん [2007/02/25(日) 03:26:40 ] >>325->>326 では、CPUなどによって違うのですね ありがとうございました。
329 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 04:34:32 ] >321 そこのサイト学生番号とアドレスの数字が近すぎてよくないな。 本来無関係なのに数字同士が近いと初心者が勝手に関連づけることはよくあるから。
330 名前:デフォルトの名無しさん [2007/02/25(日) 04:42:09 ] 教えてください。 Linuxで以下の条件コンパイルができました。 (gcc -DDEBUG1 ファイル名 などでコンパイルが通る) #if (DEBUG1 || DEBUG2) ・・・ #endif これは #if defined(DEBUG1) || defined(DEBUG2) ・・・ #endif と等価ということでしょうか?
331 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 05:10:18 ] >>330 -DDEBUG1でやってみたら? #include <stdio.h> int main() { #if (DEBUG1 || DEBUG2) printf("hello %d\n", DEBUG1); #endif return 0; }
332 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 05:10:27 ] C言語でGUIを作るにはWin32APIを勉強すればいいんでしょうか?
333 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 05:23:08 ] >330 違う。 #define DEBUG1 0 #define DEBUG2 0 で両者の動作を比較してみな。
334 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 05:33:33 ] >>332 という質問するからにはWindows限定で良いんだろうから (1) 窓の生成からメッセージレベルまで全部操作したい → Win32API (2) C++&既製ライブラリでWin専用アプリをバリバリ作り倒したい → MFC(Visual C++ 6 or .NET使用) (3) 今後の.NETの展開に期待しつつ、簡単にGUI開発したい → C# (Visual C#) Visual Studio .NET(有料)なら全部可 BCC5.5forWin なら、(1)のみ可 pc10.2ch.net/test/read.cgi/tech/1171721448/ pc10.2ch.net/test/read.cgi/tech/1171389245/ pc10.2ch.net/test/read.cgi/tech/1152778344/ 俺の独断だし勘違いあるかもしれんけど 環境依存ネタはスレ違いなので、以下は該当スレで……
335 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 05:57:58 ] >>334 ありがとうございます APIを勉強してみます
336 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 06:57:46 ] >>324 結論、そのサイトはあなたの学習にとって、著しく遠回りを強いているということですね。
337 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 07:09:51 ] >>336 確かに。 無料サイトだけで理解できたならそれで良いかもしれんが、 実際>>324 はそこのページとかで悩み続けて徒に時間を浪費してるわけで ちょっと分厚い参考書読むとか、視点を変えてPCアーキテクチャをちょびっと学ぶとか 色々あるだろうに。 もし、このスレの頭の方からポインタについて質問し続けてる人だったら ホント他のやり方で学んだほうが良いんじゃないかと
338 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 09:57:23 ] pc10.2ch.net/test/read.cgi/tech/1167140188/ 素直に本買えと
339 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 10:29:47 ] そーいや ATL/WTL とかはどこに行ったの?
340 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 12:45:40 ] >>305 1 + n == 1 が成り立たない最小の n > 0 だったかと。 機械イプシロンより小さい値を足しても、 精度が足りなくて 1 のまんま。
341 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 13:04:59 ] 0.5 + DBL_EPSILON != 0.5 1.0 + DBL_EPSILON != 1.0 2.0 + DBL_EPSILON == 2.0 2.0 + 2 * DBL_EPSILON != 2.0 n が1より大きい場合は該当の値も機械イプシロンより大きくなると 思っていいのかな。
342 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 14:19:01 ] >>339 ほら、あんたの後ろに。
343 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:21:32 ] /\___/ヽ ヽ / ::::::::::::::::\ つ . | ,,-‐‐ ‐‐-、 .:::| わ | 、_(o)_,: _(o)_, :::|ぁぁ . | ::< .::|あぁ \ /( [三] )ヽ ::/ああ /`ー‐--‐‐―´\ぁあ
344 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 19:25:16 ] >>341 思っていいけど、連続的に変化する訳じゃなくて、 もっと離散的に変化すると思われる。
345 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:50:24 ] ん?
346 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:59:01 ] こんな感じの話だ。二進数ね。 1.0000000000000000000000000000000000000000000000000000e+00000000000 +.0000000000000000000000000000000000000000000000000001e+00000000000 ------------------------------------------------------------------- 1.0000000000000000000000000000000000000000000000000001e+00000000000 ↑↓同じイプシロン 1.0000010101010101010101010101010111101011010001110110e+00000000000 +.0000000000000000000000000000000000000000000000000001e+00000000000 ------------------------------------------------------------------- 1.0000010101010101010101010101010111101011010001110111e+00000000000 ↑↓違うイプシロン 1.0000000000000000000000000000000000000000000000000000e+00000000001 +.0000000000000000000000000000000000000000000000000001e+00000000001 ------------------------------------------------------------------- 1.0000000000000000000000000000000000000000000000000001e+00000000001
347 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:52:22 ] どうもありがとうございます。 >>331 -DDEBUG1 で、たまたまDEBUG1が0ではなかっただけでした。 てっきりゼロのマクロかと思ってたのでprintがコンパイル対象になってるのが 疑問でした。 >>333 下は定義されていればそれだけで真ということですね。これからは -DDEBUG1=0 -DDEBUG1=1 とかでコンパイルすることにします。
348 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 00:09:38 ] >>347 マニュアルに書いてあることなんで、(ry
349 名前:デフォルトの名無しさん [2007/02/26(月) 01:12:38 ] #include <stdio.h> int func1 (void){ return 10; } main(){ int d; d = func1(); printf("%d\n", d); return 0; } どうして、10になるのかわかりません これは、int d; に10は代入されていないのに・・・・
350 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:17:21 ] d = func1()でdにfunc1()の戻り値を代入してる。 func1()の戻り値は10なのでdに10を代入してることになる。
351 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:25:25 ] これまた初歩的なのが来たな。なんか嬉しいぞww わかりにくかったら関数を変数と同じように考えるといい。でその値はreturn文で決まると このような記述が出来ないとそもそも関数の戻り値が利用出来ない。 if文での条件式に関数そのものがif(func(hoge))みたいに使われることも多々ある。
352 名前:349 [2007/02/26(月) 01:29:52 ] >>350 もう少し簡単にお願い致します。。。 >>351 >>わかりにくかったら関数を変数と同じように考えるといい >>349 のソースを使い例をお願いします。
353 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:30:10 ] 2
354 名前:デフォルトの名無しさん [2007/02/26(月) 01:40:18 ] データが取り得る最大値の配列を作成しそれに初期値を持たせたいのですが、 データの型がchar型やfloat型やint型が混在している場合は どのように配列を作成するのが好ましいのでしょうか。 ご教授お願いします。
355 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:48:37 ] >>354 VBを使う
356 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:54:37 ] >>352 関数は終了時に return で値を返す事が出来る。 func1 の return に注目。 そして、d = func1() は func1 が返した値を入れている。 他にも出来る事はあるけど、今はこの使い方を理解しよう。 func1 を手本に新たに func2 を作って d = func2 にしてみれ。
357 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:55:49 ] >>354 すまんが、何を言いたいのか分からん…
358 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:58:12 ] >>357 variant型をよこせと…
359 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 02:09:53 ] unionでもつかっとけば?
360 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 02:11:20 ] >>354 メモリが勿体無いがdoubleで配列作ってに格納する時にdoubleにキャストする >>352 考え方・理解の仕方ってだけで実際に変数になるわけじゃないからな 何歳か知らんが数学やったのなら>>349 はy=f(x)と同じ状態だな
361 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 02:12:37 ] >>359 で、使うときにどのメンバを使っていいのか間違えて NaN
362 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 02:16:27 ] typedef struct { enum { t_empty, t_double, t_int, t_char } type; union { double v_double; int v_int; char v_char; } value; } variant_t; int main() { variant_t data[] = { { t_empty}, { t_double, { .v_double = 2.3 } }, { t_int, { .v_int = 42 } }, { t_char, { .v_char = '!' } }, }; for(int i = 0; i < sizeof(data)/sizeof(*data); ++i) { if((data+i)->type) switch((data+i)->type) { case t_double: printf("%d: double(%f)\n", i, (data+i)->value); break; case t_int: printf("%d: int(%d)\n", i, (data+i)->value); break; case t_char: printf("%d: char(%c)\n", i, (data+i)->value); break; } } }
363 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 02:21:48 ] きっつー。 釣られてやるのも適当にしよーよー
364 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 02:52:11 ] #define variant(t, v) ((variant_t) { t_ ## t, { .v_ ## t = (v) } }) data[0] = variant(char, 'A'); 複合リテラルって今ひとつ使い勝手が分からなかったんだが、 こういうことできるのが便利なんだな。
365 名前:デフォルトの名無しさん [2007/02/26(月) 16:32:34 ] CまたはC++で有効なファイルかどうかチェックする関数ってある? .NETでいうSystem.IO.File.Exists(System.String)に相当する関数
366 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 16:35:28 ] あるよ
367 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 16:40:03 ] ここにあるよ
368 名前:デフォルトの名無しさん [2007/02/26(月) 16:56:41 ] 質問です。こちらのサイトだけでC言語をマスターできますか? www.plustarnet.com/aspil/Programming/ 今日から勉強しようと思ってるんですが、もっといいサイトがあったら教えてください。
369 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:03:09 ] 先ずは日本語をきちんと読めるようになってからにしましょう
370 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:06:15 ] >>368 そのサイトはやめといたほうがいいんじゃないかな。
371 名前:368 [2007/02/26(月) 17:08:59 ] >>370 どういう意味ですか?
372 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:13:23 ] ひどい
373 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:22:59 ] 質問です。 幾らか容量が分からないものを扱う時の宣言ってどうすれば良いですか? 例えば typedef struct TESTD{ int ShainCode; int KanriNo; int ClientNo; }TestDef; みたいなのが有ったとして これが顧客が無限に増え続ける様に作りたいんですけど・・・
374 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:25:17 ] 最初に固定数宣言しておいて、読み込みながら領域再確保する
375 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:38:01 ] >>374 すいません 具体的にコード教えてください
376 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 17:44:49 ] reallocでググってろ
377 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:04:06 ] reallocは静的配置は無理じゃないですか?
378 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:08:03 ] 無限に増え続けるものをどうやって静的配置するのさ
379 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:08:38 ] 固定数宣言って静的配置じゃないんですか?
380 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:19:29 ] 静的配置なものをどうやって拡張するのかと小一時間問い詰めたい
381 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:27:26 ] TestDef *hoge = NULL;
382 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:33:01 ] でもそれだったら 増やすとき全部の構造体が増えない? 聞いてる人は顧客のところだけ増やしたいんじゃないの?
383 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:36:04 ] 無限はあり得ないだろ常識的に考えて
384 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:41:32 ] >>382 無限大には対応できないけど、これでおk? typedef struct TESTD{ int ShainCode; int KanriNo; int *ClientNo; int ClientCount; }TestDef;
385 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 18:45:33 ] 徐々に意味不明になってきたな 日本語って本当に難しい・・w
386 名前:デフォルトの名無しさん [2007/02/26(月) 20:01:42 ] >>366 >>367 ファイルポインタがNULLだったらファイルが存在しないってやるしかないのかな? 具体的に関数としてそういう物があるなら教えてください。
387 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:07:02 ] open()だろ。常識的に考えて。
388 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:20:56 ] それはPOSIX関数だろ…
389 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:25:18 ] POSIXでいいならstat
390 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:34:31 ] POSIXならaccess(2)じゃないのか?
391 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:38:40 ] ああ、そうだった。そうだった。 窓の世界に移り住んで久しいから、忘れてしもた
392 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:58:25 ] >>373 可変にしたいやつをポインタで表して、それのためのメモリを malloc() で 確保すれば良い。長さを変える時は realloc() を使う。 ファイルから読んで一つづつ追加する場合は初期化時にポインタを NULL に しておくと最初から realloc() で追加ができるので少し楽。
393 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 21:35:39 ] >>373 TestDefが無限に増えつづけるようにしたいのなら >>374 も言ってるけど、最初に適当に1000件分とか読み込んで、 1000件以上なら500件分毎にでも領域確保すればいいよ。 counter1 = 0; counter2 = 1000; ptr = malloc(sizeof(struct TestDef) * 1000); TestDef読込ループ(最後のTestDefまで) { if(counter1 = counter2) { counter2 = counter2 + 500; realloc(ptr, sizeof(struct TestDef) * counter2); } TestDef1件読込 counter1 = counter1 + 1; }
394 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 21:50:20 ] ちょ 志村reallocの戻り値〜
395 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:24:21 ] メモリブロック変わったらまずいねぇ
396 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:25:22 ] >>393 増加量を500とか決め打ちにするとコピーにO(N^2)のコストがかかるからお勧めできない。 次のバッファサイズ = 現在のバッファサイズ * 2 とかだとO(N)で出来るのでお勧め。
397 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:25:29 ] 教えてください。 【キーボードからデータを5つ入力する。 次に入力するデータは、 何番目に入力したデータと一致するか表示するプログラム。】
398 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:33:17 ] 宿題なら宿題スレがあるよ。
399 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:34:07 ] >>397 未来予知?
400 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:35:27 ] >>396 顧客の増加の仕方によると思います 今3000件として顧客の増加率が低いのに6000件分も領域確保するのは無駄が多すぎ
401 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:40:05 ] >>399 6番目に入力したデータは何番目と一致するかってやつだとは思うんですけど、 全然わかんないんで誰か教えてもらえませんか?
402 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:46:04 ] >>401 データってなに? 文字?文字列?整数?浮動小数点数?
403 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:48:31 ] >>402 整数です!
404 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:48:42 ] >>396 >>400 そういうのはrealloc()の中でやってるから、変にに工夫しないで一件ずつふやせばいいよ。 そっちのほうがコードすっきり。
405 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:51:38 ] リスト構造にしとけば
406 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:58:01 ] >>396 そういう増加量の予測(?)の仕方ってどういう範疇を勉強すればいいのですか? ぐぐるんで、キーワードだけでも教えてください
407 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:59:54 ] >>404 だから顧客の増加率によるんだって 数件ならいいけど数百、数千なんて規模(数千は無いと思うけど)って場合1件づつだとオーバーヘッドが増すでしょ >>403 テキトー↓ int main() { int i,a[5],b; printf("5件分入力する(データとデータはスペースで空ける)>"); scanf("%d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4]); printf("いれろ>"); scanf("%d",&b); for(i=0;i<5;i++) if( b==a[i] ) break; if( i<5 ) printf( "%dは%d番目と一致",b,i+1); else printf( "%dと一致するもんはねぇ",b); return 0; }
408 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:07:51 ] >>407 数百レベルなら、オーバーヘッド気にしなくて一件単位で確保していけばいいよ。 標準入出力のバッファリングは効率悪いから、ラッパー作って独自でバッファリングを 実装してるような話じゃん。
409 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:11:34 ] >>408 メモリ確保の話だけど
410 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:15:40 ] >>409 「ような」
411 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:18:33 ] >>410 もう少し噛み砕いてっ
412 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:21:40 ] 「reallocが内部実装で上手くやってるであろうことを自前で呼び出し側 で細々と書くのは、せっかくIOをライブラリ実装側でバッファリングして いるのに自前でさらに外側にバッファリング処理を書くようなもの」とい いたいのでしょう。
413 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:35:37 ] >>412 私は馬鹿なようなので >「せっかくIOをライブラリ実装側でバッファリング」 メモリ確保とどういう関係が?
414 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:36:14 ] 顧客の増加率によるってのは確かにそうおもう 自分がC言語で作って使ってる動的配列構造体は、 コンテナに相当する配列が一杯になったら次にどんだけ 増加させるかの部分を、ある程度までは*2で、ある程度 を越えると+nのようになるようにしてる(デフォルトでは)。 この「ある程度」はアプリによると思う。また、ここのある 程度を計算する部分を関数コールバックによる実装で作 っておくとアプリによって簡単に変更できていいんじゃ ないかな C++ならvector等を使えるけど、Cなら汎用的な動的配列 や汎用リスト、動的ハッシュイブラリみたいなの 自分で実装しておかないといろんなアプリ作るの大変だよ
415 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:39:02 ] 教えてください。
416 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:43:09 ] reallocが内部で定数倍の拡張をしている実装ってあるのか? 一応調べてみたけど、手元のgccとvcではしてなかった。多分メモリ効率を考えてと思う。 どっちも固定量の増加で1ずつ増加する素直なコードだと数が増えると速度が目に見えて遅くなった。 自分が二倍伸張で書き直すと単純にほぼ線形時間で実行できた。 とりあえずreallocの伸張を信用することはあまりできなさそう。
417 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:57:45 ] >>414 うんうん 私的には初期の段階(それこそ現在の入力数は数百程度)は*2でもいいと思う. 倍にしても大きな無駄領域生まないから. 店舗の顧客数にしても初期は新規会員がどっと来るからある程度予想して多めにしておくとか. ある程度になると、小売ならちらほら程度だし、大手で各店管理じゃない)ならかなりの数になるだろうし. で、過去の入力数とその間隔、もしくは単位時間当たりの入会数から動的に算出すればいいんじゃないかと. >>416 そうだよね.指定したサイズのメモリ領域しか確保しないと思ってたんだけど↑のレスで、あーまた私わぁ〜勘違いしてたのかぁって思ったんだけど. んで、私が言いたかったのは 「1件ごと reallocで確保する.で、たとえば予定の追加件数が200件あったとしてメモリ上に断片化が発生してた場合などに 数件ないし十数件ごとにブロックの変更があった場合、realloc内部で領域コピーが多発する」 ってことです
418 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 00:02:24 ] >>413 「たとえ話」なんだから直接関係があるわけがないでしょう。
419 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 00:06:49 ] >>418 はっ! そか、たとえ話か メモリのことをIOに例えてたのね もう、明らかに関係があるのかと思ってしまったorz
420 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 00:38:42 ] >>414 いつも*2でいくか、+nでいくか迷うけど、組み合わせるという手もあったのか! でもしばらくは、*2でいくか、+nでいくか、組み合わせるかで試行錯誤することに なりそうorz
421 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 00:44:05 ] こんな文面も見つけました. どこまで正しいか判らないですけど 連続領域でなくても、ブロック単位で確保して連結リストで管理ってのもいいかなと思いますけどね www.ncad.co.jp/~komata/c-kouza6.htm より以下抜粋 realloc()はmalloc()で割り当てた領域を拡張しますが、malloc()は大抵少し大きめに確保するのですが、その先が既に使用中の場合は拡張できず、新しい領域を求めてヒープを拡大し、そこに元のデータをコピーし、元のデータを開放します。 従って、realloc()とmalloc()がループで回るような場合はほとんど拡大ができず、毎回realloc()は新しい領域を求めてしまうことになり、メモリーのすき間がたくさんできてしまうことになります。 (中略) これを回避するにはrealloc()する単位を大きめに取り、realloc()を呼び出す回数をできるだけ減らすしかありません。 それでも無駄は完全には無くせませんが、空きになるサイズが大きくなるので他のmalloc()がそこを使用できる確立が上がり、コピーの回数も減らせますので、速度も上がります。
422 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 01:20:30 ] >>373 からここまで話を盛り上げられるおまいらが大好きだ
423 名前:デフォルトの名無しさん [2007/02/27(火) 04:32:35 ] 二つ質問があります 1:C言語に於いて、参照とはどういう意味なのでしょうか? 2:ifについて if〜 return 1; if〜 return 2; とは、どういう意味でしょうか? if〜 else if〜 とは違うのでしょうか?
424 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 05:11:45 ] >>423 1 C言語だけに限れば変数の中身にアクセスするとかそんな感じ? "参照"単体ではうまく説明できん。 2 return文が入ってので何を質問してるのかよく分からないが、 前者は もし〜ならreturn 1; もし〜ならreturn 2; であるのに対し後者は もし〜なら・・・ でなく〜なら・・・ というように前者はreturnが無ければ両方のif文が実行され 後者は当てはまる条件のところ以外は実行されない(switch文と同じ感じ) 後者にも同様にreturn文が入っているのなら、if文の内容しだいだが動作は同じ (だが同じものとして覚えてはいけない。なぜならreturn文が入っているからに過ぎない)
425 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 07:33:12 ] >>423 CにC++のような参照はないから、普通に国語辞典の一番か二番あたりにに載ってるような意味だろう。
426 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 10:07:17 ] >>422 質問が曖昧だといつもこうやってぐだぐだになるんだよなあ・・・
427 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 10:28:35 ] ファイル分割してグローバル宣言したいのですが、 //a.cpp #include "game2.h" #include "main.h" extern int errorRog[1024]; ・・・{ errorRog[0] = 0; //こちらで操作すると //Error: 外部シンボル '_errorRog' が未解決 } //b.cpp #include "game2.h" #include "main.h" errorRog[0] = 0; //こちらで操作すると未定義 と注釈の通りで、原因は重複してヘッダを呼び出してるのがマズいんでしょうか? できればヘッダにexternを組み込ませたいのですが それ以前の問題でgame2.hには //game2.h typedef struct { LPSTR cName; //名称 int cHp; //体力 }castData; typedef struct { castData cs[MAX_INPUT]; //キャスト }cardData; a.cpp,b.cpp共に呼び出す必要のある構造体の宣言があるのですが 重複して呼び出したらダメですよね?
428 名前:427 mailto:sage [2007/02/27(火) 11:36:30 ] あ、何か勘違いしてたかも。すみません
429 名前:427 mailto:sage [2007/02/27(火) 12:20:49 ] ごめんなさい。externについて勘違いしていたようで 本コードにも宣言しないといけないんですね。
430 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 12:36:58 ] C言語のmakefile本を買いたいんですけですけどオススメってありますか? K&Rのプログラミング言語C第2版的な位置付けの本がいいです。 そうでなくても、これ読んでないとモグリみたいなのを教えてください・・
431 名前:デフォルトの名無しさん [2007/02/27(火) 14:52:46 ] int a; int *pa = &a; これおかしくね? *pa = &a; 何で値にアドレスを代入するの
432 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 14:59:15 ] その*はポインタの指す値を得る演算子ではなく、int*という型の一部。
433 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 15:56:17 ] >>427-429 extern をヘッダファイルに書けば万事解決
434 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 15:59:04 ] >>373 です。 レス遅れてすいません。 皆さんレスどもです。 頑張ります。
435 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 16:46:42 ] >>431 規格でそう決まっているから、としか言いようがない
436 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 16:50:48 ] >431 代入と初期化は別だから
437 名前:デフォルトの名無しさん [2007/02/27(火) 16:55:02 ] >>387-390 ありがとうございました。 教えていただいたキーワードで検索したところ、ほかにも方法があったのでURL貼っておきます www.tohoho-web.com/lng/199911/99110136.htm
438 名前:デフォルトの名無しさん [2007/02/27(火) 16:55:50 ] int x; int &rx = x; これおかしくね? &rx = x; 何でアドレスにint型の変数を代入するの
439 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 16:58:04 ] >438 スレタイ嫁
440 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 17:09:41 ] >>431 int *pa = &a; は、int *型の変数paにaのアドレスを代入してる 間接参照演算子の * とは全くの別物
441 名前:デフォルトの名無しさん [2007/02/27(火) 18:01:31 ] #include <stdio.h> #include <ctype.h> int main(void) { char str[80], *p; printf("文字列を入力してください:"); gets(str); p=str; while(*p) { *p++ = toupper(*p); } printf("%s\n", str); /* 大文字の文字列 */ return 0; } 実行結果 hiro→HIRO 参考書のとおりにやったんですが、僕は実行結果がhIROになるとおもってました。 なぜかというと最初のp=strでstr[0]のアドレスがpに入りますよね。でwhileループで 一番最初に*p++ = toupper(*p)としていますが、この一文は最初にp++でpをインクリメントしてしまい pはstr[1]を指し、str[0]を飛ばしてしまうとおもったのですが・・ わかりません。よろしくお願いします。
442 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:04:33 ] 後置インクリメント演算子では後でインクリメントされる。 *++p = toupper(*p);と書けば先にインクリメントされるので、 お前が想像しているとおりになるだろう。
443 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:09:01 ] >>441 p++は副作用(オブジェクトの値の変化)を起こす式だから、 文の終わりやカンマ演算子などの副作用完了までの間に pの値を参照することはできない。 そのようなコードを書いた場合、どのような挙動になるかは定義されていない この場合、 p++; *p = toupper(*p); とするのが正しい。
444 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:13:40 ] >>443 前置インクリメント演算子くらい知っとこうや。
445 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:14:50 BE:69876566-2BP(222)] >>441 p++とtoupper(*p)のどちらが先に評価されるかは未定義。
446 名前:441 mailto:sage [2007/02/27(火) 18:19:33 ] みなさん。どうもありがとうございます。 なんか、むずかしいですね。とりあえず、>>442 さんのいうとおりにやると 僕の予想したようになりました。独習Cを読んでいるんですが、後置の場合 式の評価の後にインクリメントされるとかいてあったので、納得できました。 今回の件は一応はなっとくできました。ありがとうございました。
447 名前:441 mailto:sage [2007/02/27(火) 18:21:09 ] >>443 さん446さん、厳密に言うと未定義なんですね。これから勉強して いくうちにわかると思いますので頭の片隅においておきたいとおもいます。 ありがとうございました。
448 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:23:13 ] >>444 前置にしたって未定義に変わりはないがな
449 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:24:58 ] >>445 へー
450 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:28:31 ] どちらが先に評価されるかが未定義なだけではなく、 未定義なコードを一箇所でも書くと、 コード全体で何が起こるか未定義になるよ。
451 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:30:31 ] つまり、導き出される答えは 「プログラムは奇跡で出来ている。」
452 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:32:25 BE:29115353-2BP(222)] >>446-447 いやいやいやいや。 この問題の本質はインクリメントが前置か後置かじゃないから。 右辺のpを先に評価するような処理系なら左辺のインクリメントを前に置こうが 後ろに置こうが結果は同じ。
453 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 18:35:10 ] >>450 ソース読んでもどの順番か未定義にだったらお手上げだしね。(動かしつつ直せばいいけど) >>441 の参考書が悪いってことでFA?
454 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 20:04:33 ] >>422 realloc()を使ってお手軽にすませましょうってコードで、増分どうこうって工夫してもしょうがないだろって ことだったんだけどな。
455 名前:デフォルトの名無しさん [2007/02/27(火) 22:28:49 ] stdargのva_startやva_endてどこで何回書いてもいいですか?こんなかんじ、 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> char *strdup_printf (char *format, ...) { va_list argp; char *buf=NULL; int size=512, inclen = 512; buf = calloc(1, size); if (!buf) return(NULL); va_start (argp,format); n=vsnprintf(buf, size, format, argp); va_end (argp); while(n<1) { size += inclen; buf = realloc(buf, size); if (!buf) return(NULL); va_start (argp, format); n=vsnprintf(buf, size, format, argp); va_end (argp); } 以下略
456 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:07:35 ] manによれば、va_start/va_endは何度でもペアで使うことが出来る。
457 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:15:02 ] >>455 複数回使える。 当然char* format の中身は"%s%s%d%s"みたいな形だよね?
458 名前:デフォルトの名無しさん [2007/02/27(火) 23:31:18 ] >>456 ,457 ありがとうございます。m(__)m >当然char* format の中身は"%s%s%d%s"みたいな形だよね? そゆことです。
459 名前:デフォルトの名無しさん [2007/02/28(水) 01:00:20 ] return -1 を返すとは、どういう事なのでしょうか? return 0; を返すと何が違いますかね?
460 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 01:04:30 ] int x; x = nanika(); nanikaがreturn -1としていたらxの値は-1になる。return 0なら0。 返ってくる値を特に利用しないのなら何を返しても良いし、return; だけで何も返さないことにしてもよい。 返ってくる値の意味は作り手が決める。
461 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 01:05:40 ] >return -1 >を返す つまり、 return(return -1) どうみてもコンパイルエラーです、本当に(ry
462 名前:デフォルトの名無しさん [2007/02/28(水) 01:10:19 ] >>460 >>461 特に意味はないのですね、ありがとうございました。
463 名前:デフォルトの名無しさん [2007/02/28(水) 01:24:23 ] #include <stdio.h> #include <stdlib.h> int compare(const void *a, const void *b){ int x = *((int *)a); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/ int y = *((int *)b); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/ if(x > y) return 1; else if(x < y) return -1; else return 0; }
464 名前:463 [2007/02/28(水) 01:24:54 ] main(){ int nums[10] = {4,8,3,7,5,2,9,1,6,10}; int a = 7, i; int *p; qsort(nums, 10, sizeof(int), compare); for(i = 0; i < 10; i++) printf("%d", nums[i]); printf("\n%dを検索します\n", a); p = (int *) bsearch(&a, nums, 10, sizeof(int), compare); if(p == NULL) printf("%dは見つかりませんでした。\n", a); else printf("%dは配列nums[%d]にあります\n", a, p-nums); return 0; } 実行結果 c:\source>huroku 12345678910 7を検索します 7は配列nums[6]にあります
465 名前:463 [2007/02/28(水) 01:31:23 ] わからない箇所が、複数あるので質問させて頂きます。 >>int compare(const void *a, const void *b){ の const void *bに入れる値はmainの中の何処にあるのでしょうか? >>*((int *)a); は何なのでしょうか?ダブルでポインタのマークがありますが・・・・ 詳しい解説お願いします。 クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare); は、const void *a,を指すのでしょうか? 検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare); は、const void *b,を指すのでしょうか? ご助言、宜しくお願い致します。 なるべく簡単に・・・・初心者向けにご返答戴ければ、尚幸いです。
466 名前:デフォルトの名無しさん [2007/02/28(水) 02:23:02 ] #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_NUM 100 int main(){ int n = -1; int answer; /*乱数の発生*/ srand(time(NULL)); answer = (rand() % MAX_NUM) + 1; printf("数当てクイズ!1〜%dの数字を入力してね\n", MAX_NUM); while(n != answer){ scanf("%d", &n); if(n == answer-1 || n == answer+1) printf("美味しい!\n"); else if(n > answer+1) printf("もっと小さい数です\n"); else if(n < answer-1 ) printf("もっと大きい数です\n"); } printf("正解です!\n"); return 0; } このソースに於いて、if(n == answer-1 || n == answer+1)の answer+1やanswer-1の-1、+1はどうして付くのでしょうか? そもそも、これらは何なのでしょうか?
467 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 02:25:30 ] >>466 宝くじ一等前後賞のチェック 宝くじ一等は関係無いけど
468 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 02:26:54 ] >>466 「美味しい」じゃなくて「惜しい」だね。
469 名前:466 [2007/02/28(水) 02:30:30 ] >>467 ??? >>468 お恥ずかしいです
470 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 02:33:53 ] >>469 例えば、answer が 10 だとすると、 「惜しい!」ってぇのは何と何だ?
471 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 02:37:59 ] >>465 >>>int compare(const void *a, const void *b){ >の const void *bに入れる値はmainの中の何処にあるのでしょうか? qsort関数の最後の引数としてcompare関数の名前(関数ポインタ)を渡している。 これはqsort関数が配列の要素を比較するときに使う関数。 qsort関数では、aとbに並べ替え対象の配列の要素のいずれかを入れて、渡され た関数を何度も呼び出す。 >>>*((int *)a); >は何なのでしょうか?ダブルでポインタのマークがありますが・・・・ int x = *((int*)a)を分けて書くと、 int* a_int = (int*)a; int x = *a_int; qsortは、さまざまな型のデータを並べ替えることが出来なければならないの で、比較関数を呼ぶ際には、比較対象の2データを指すポインタを汎用のvoid* 型で渡すように作られている。 受け取った側ではintの値として比較したいので、まずvoid*型のポインタを int*型にキャストし、*で値を取り出している。 bsearchも同じような形で比較用の関数を何度も呼ぶ。 >クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare); >は、const void *a,を指すのでしょうか? >検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare); >は、const void *b,を指すのでしょうか? 意味が分かりません。
472 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 02:59:52 ] >>465 >>const void *bに入る値はmainの中の何処にあるのでしょうか? mainの中には無い。qsortのための比較関数を(関数ポインタ)。 第一引数int x = *((int *)a); が第二引数y = *((int *)b);より 小さい/等しい/大きいの順番で返す値も 0より小さい/等しい/大きい整数を返す。 bsearchも同様。bsearchは配列が整列済みでないと駄目。 >>*((int *)a) かっこは中から見れば良い。まず、int型のポインタにキャストした。 そしてそのポインタが指してる値を知るには*を付けるということ。 例えば((int *)a)だけだと、int型のポインタにキャストしただけで 要は、それだとaが指してるアドレスを取り出すことになる。 そこで*をつけて、そのアドレスの指し示してる値を取り出す。
473 名前:463 [2007/02/28(水) 04:13:41 ] >>471->>472 真にありがとうございます。 凄いとても難しいですね、ちょっとどころか 理解できないようなので出直してきます。。。 ポインタがとかの応用がさっぱりです。 >>int* a_int = (int*)a; int x = *a_int; こんなのも参考書には、載っていません 因みに上のソースはその参考書なのですが・・・
474 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 05:04:58 ] >>473 ちなみに、malloc()の戻り値もvoid*型だよ 今の規格では、キャストしなくても良い、本来は int *a = (int *)malloc(100 * sizeof(int)); ってするところint *a =malloc(100 * sizeof(int));でも良いようになってる (ちなみに上記はint型サイズ100個分のメモリをヒープから借りる) ま、とりあえずvoid型のポインタを使うときは、malloc()とかでない限り 本来の型にキャストすべし。 ま、勉強していくうちに、そのうちなれるよ。
475 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 05:10:17 ] >int x = *((int *)a); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/ きっちり説明してあるように見えるのは気のせいか?
476 名前:473 [2007/02/28(水) 05:19:47 ] 丁寧にありがとうございます。 ひぃ〜難しい、void型のポインタとかを今参考書の索引を漁っていますが やはり載っていない、キャスト演算やmalkcoのメモリー獲得も 本の解説と照らし合わせてますが、さっぱりなので参考書を買い直し ここで解説して頂いた事を再度見直してみます。 ありがとうございましたノシ
477 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 06:06:52 ] 参考書に全て載っていると思うのが間違い。 とは言え、当てにならない参考書だねぇ。
478 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 10:47:00 ] List9-9に示した関数をもとにして、文字列を後ろから逆に表示する ("SEC"を受け取ったら"CES"と表示する関数put_rstringを作成せよ。 という問題でオレはこうやったんですが eggrice.no.land.to/up/src/tohoh0137.txt もうすこしいい方法ないでしょうか? stdio.hのみでおねがいします。
479 名前:デフォルトの名無しさん [2007/02/28(水) 11:21:43 ]
480 名前:デフォルトの名無しさん [2007/02/28(水) 11:22:14 ] void revstr(char *str){ char *endc = str; char *startc = str; //終端文字検索 while(endc != '\0')endc++; endc--; for(;startc < endc;startc++,endc--){ char tmp = startc; startc = endc; endc = tmp; } }
481 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 11:41:24 ] 長い文字列から文字数の分だけ取得したいのですが、 strncpy(cD->cs[nxt].cBmp , //現在読み込んでいるポインタ-文字の長さ readStr + i - txtLen , txtLen); 位置(i)も文字数(txtLen)も合っているのに取得できません。 何ででしょうか?教えてください。
482 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 11:44:51 ] >>481 こうだろ 文字の長さ-現在読み込んでいるポインタ
483 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 11:47:06 ] >>478 #include <stdio.h> void put_rstring(char *c) { int i = 0; while(*(c + i)) i++; while(i > 0){ i--; putchar(*(c + i)); } }
484 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 12:04:01 ] >>480 >>483 ありがとうございます。 添字のカウントの仕方は大体同じなんですね。
485 名前:481 mailto:sage [2007/02/28(水) 12:07:31 ] >>482 う〜ん。分からん。 ポインタが先じゃないとおかしいのでは? 他の文字列なら代入できたのですが、cD->cs[nxt].cBmpがおかしいとか?
486 名前:481 mailto:sage [2007/02/28(水) 12:22:39 ] サーセン。。。 NULL文字入れるところ = '\0' じゃなくて == '\0' やってた。なぜエラー出ないんだ・・・。 情報不足マジですみません。 でも午前中ずっとこれに悩んでたんです。
487 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 12:24:47 ] >>485 もうちょいソースくらはい。
488 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 12:28:23 ] >>486 その場合、比較演算子として真:1 偽:0のどちらかを返す。 エラーは出ません。