1 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 20:41:54 ] C言語の*入門者*向け解説スレッドです。 初心者、初級者の方は他の質問スレのほうが良いかもしれません。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 130代目 pc12.2ch.net/test/read.cgi/tech/1250204272/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 53 pc12.2ch.net/test/read.cgi/tech/1253110182/ 過去スレ 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
823 名前:デフォルトの名無しさん [2009/10/26(月) 23:10:19 ] >>822 >>817 の時点ではおkだが、>>819 が痛いんだよ
824 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:16:37 ] リテラルに関しては特別である件について int array[]={0,1,2,3,4,5,}; の要素がLValueになれない処理系はモグリだが char array[]="012345"; の要素がLvalueになれない処理系がモグリだと 決めつけられないとオモ char array[6]="012345"; でLValue禁止はモグリだが
825 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:18:10 ] >>824 そういう処理系がある可能性もあるから 名前が知りたいだけですよ
826 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:20:33 ] GCCやらVCみたいなメジャーなやつで警告でないなら、べつに気にしない。
827 名前:デフォルトの名無しさん [2009/10/26(月) 23:20:49 ] >>824 > 決めつけられないとオモ 何が「特別」なのかどう頑張っても足掻いても完璧にわかってないな
828 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:32:44 ] char s[]="12345" がconst char s[6]={'1','2','3','4','5',0}と 等価だって保証されてる?
829 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:35:06 ] >>828 constはつかないんじゃないの?
830 名前:解説 mailto:sage [2009/10/26(月) 23:49:59 ] >>824 とか リテラル表現を見つけるとCコンパイラは機械的にそれを void *型のconst ポインタ値に置換するというウワサ (void*)の(char*)のキャスト省略は認容されているからprintfとかに 与えても文法上合法だし、その処理系に付属しているライブラリ関数 ならば期待した動作をする。 問題はvoid*が指しているアドレスに実際に何が書かれているかに ついての規定が不可能になってきていること。 エンコーディング(フォントの種類とかサイズランク (微妙に書体が変わるんで)まで規定できる新しいコード体系とか) によっては連続したメモリ領域にマップしないほうが良い場合もあり 得るし実際しないだろうし。 そいった状況になったらchar s[]="うんたらかんたら"; がchar s[]={ 文字配列要素定義列 }; という解釈をしてもらえるという保証が無くなる可能性がある
831 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:52:37 ] Cの規格上ではつかないよ。 char s[]="12345"; は左辺のために新たに確保された領域に 右辺の値がコピーされるから、つける必要もないし。
832 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:56:35 ] >>830 そういうヘボい実装をしている処理系を知っているなら教えて欲しい ○○向け○○コンパイラとか
833 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:57:07 ] あ、ちなみに処理系よってはANSIやJIS規格に従わないコンパイラなんていくらでもある。 だから、>>819 や>>824 はその処理系の名前を具体的にあげてくれればいい。 それだけで話は終了する。これは一般論じゃないから。
834 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:59:02 ] 特定の文字エンコーディングに依存する実装のほうがヘボい だろ。Cの現状的には
835 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:06:57 ] >>830 そもそも > char s[]="うんたらかんたら"; > がchar s[]={ 文字配列要素定義列 }; > という解釈をしてもらえるという保証が無くなる可能性がある char s[] = "うんたらかんたら"; と char s[] = {'う', 'ん', 'た', 'ら', 'か, 'ん, 'た, 'ら'}; は違うんじゃないの?
836 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:23:33 ] >>834 そうだろうね。いずれにせよ>>830 は 実例をひとつ挙げればそれですむ話を延々としているだけ。 誰もそういう実装のコンパイラが存在しないとは考えていないわけで 規格に合致しないコンパイラがあるなら その名前を挙げてくれと言っているにすぎない。
837 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:40:30 ] >>835 リトルエンディアンですねわかります
838 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 00:48:46 ] もっと重要な違いがあるだろ
839 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 01:40:42 ] compile error
840 名前:皐 mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 02:43:41 ] このプログラムソースの解説をお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> int c; char *p, o[] = "= +-*/^ "; double x[26]; int get(void) { do c = *p++ & 0xff; while (isspace(c)); return c; }
841 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 02:48:25 ] うちではインデントのないソースコードは見ないことになっている
842 名前:皐 mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 02:49:29 ] インデントとはなんですか?
843 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 03:00:59 ] pにアドレスを入れていないのに *p++ してるから、いわゆる糞ソース
844 名前:皐 mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 03:02:54 ] ソース長いんです。 分割でのっけます。 double expr(const char *s) { double v; if (*s == '=') { char *q = p; int n = get(); v = (islower(n) && get() == '=') ? (x[n-'a'] = expr(s)) : (p = q, expr(s+2)); } else if (*s) for (v = expr(s+2); c == s[0] || c == s[1]; ) switch (c) { case '+': v += expr(s+2); break; case '-': v -= expr(s+2); break; case '*': v *= expr(s+2); break; case '/': v /= expr(s+2); break; case '^': v = pow(v, expr(s)); break; }
845 名前:皐 mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 03:03:51 ] 3番目です。 else if (get() == '.' || isdigit(c)) v = strtod(p-1, &p), get(); else if (c == '(') v = expr(o), c == ')' ? get() : (c = 1); else if (c == '-') v = -expr(s); else if (c == '+') v = expr(s); else if (!memcmp(p-1, "sqrt",4)) p += 3, v = sqrt(expr(s)); else if (!memcmp(p-1, "exp", 3)) p += 2, v = exp(expr(s)); else if (!memcmp(p-1, "log", 3)) p += 2, v = log(expr(s)); else if (!memcmp(p-1, "sin", 3)) p += 2, v = sin(expr(s)); else if (!memcmp(p-1, "cos", 3)) p += 2, v = cos(expr(s)); else if (!memcmp(p-1, "tan", 3)) p += 2, v = tan(expr(s)); else if (!memcmp(p-1, "atan",4)) p += 3, v = atan(expr(s)); else if (islower(c)) v = x[c-'a'], get(); else v = c = 1; /* error */ return v; }
846 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 03:05:07 ] あー大体わかった。多分逆ポーランド記法で演算器じゃないか?
847 名前:皐 mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 03:05:34 ] これで最後になります。 int main(void) { char buf[1024]; double v; while (printf("> "), fgets(buf, sizeof buf, stdin) && *buf != '.') { p = buf; v = expr(o); if (c) puts(" error"); else { p = buf; if (!islower(get()) || get() != '=') printf(" %.15g\n", v); } } return 0; }
848 名前:皐 mailto:cherry-blossom_hoyu@mail.goo.ne.jp [2009/10/27(火) 03:11:17 ] はい、電卓を作ろうと思ったので、いろいろとソースを見てたのですが、プログラムの意味が全く分からないんです。 関数電卓で、まず四則演算と三角関数を1つの式で計算しようと思っています。
849 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 04:05:09 ] 文字列の先頭へのポインタSがあったとして、 Sの示す文字列の3文字目を表す場合どう表現すればいいんでしょうか? S[2]と書いたら、それはint型だとか言われました
850 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 04:15:38 ] typedef unsigned orzchar_t; orzchar_t s[] = {0x1a33, 0x48b1, 0x5273, 0x542e}; orzchar_t *S; S = s; (void)S[2]; とか、そういうことは無いよな wchar_t使っていると怪しい とりあえず、コード片でも貼るといいお
851 名前:849 mailto:sage [2009/10/27(火) 04:22:34 ] お察しの通りwchar_tを使ってます wchar_t wcStr[sizeof(szStr)]; WCHAR* strprev = wcStr; これでif文の中でstrprev[2]としたらint型だと言われました
852 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 04:43:09 ] 多分>850そのままだと思うんですが、 どうすればSからsのn番目の要素を取り出すことができるんでしょうか?
853 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 05:22:08 ] 既に出来ているから安心汁
854 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 05:31:00 ] codepad.org/iPSWOKX6 wchar_t を使う場合、 1. locale を正しくセットすること、 2. wchar_t対応のライブラリを使うこと 3. wchar_t と char をごっちゃにしないこと の3点が重要です^^ ちなみに、wchar_tは符号なし1バイト整数以上のサイズであれば良いとしか規定されていないので shift_JISすらまともに扱えない環境も普通に存在します^^
855 名前:デフォルトの名無しさん [2009/10/27(火) 05:54:01 ] 皆様よろしく。 Cを独学し始めたばかりの初心者です。目的はVBAで書いたコードをCに書き直すこと です。VBAも独学なので冗長な表現や不要な処理が多々あると思われますが、 とりあえず動いているのでよしとしています。 と、ここからが本題なのですが、とりあえずVBAコードをまとまりのある ブロックに分けてCに書き直し、コンパイル→実行して意図通りに動いているか 確かめています。すでに4,5個分はチェックできました。 使っているエディタ?は「C言語を始めよう!」というフリーのものですが、 今引っかかっているブロックでは「問題が発生したため、block3.exe を終了します。 ご不便をおかけして申し訳ありません。エラー報告する しない云々・・」という おなじみの表示が出てしまって、実行できません。 BCCを使っているみたいで、コンパイルエラーは出ないのですが実行できないのです。 これはコードの問題なのか、エディタもしくはそれ以外の問題なのかが目下の悩みです。 この「C言語を始めよう!」は、コード書く→コンパイル→実行という とてもシンプルで使いやすいのですが、他の「統合開発環境」と名の付くソフト (たとえばWildStudioなど)はビルドやらプロジェクトやら、意味が分からんことばかりで 使い方を学ぶまで時間がかかりそうで尻込みしています。 コードがまずいのだろうと思われますが、それを確かめるためにも、初心者やさしいエディタ (開発環境)があれば、教えてください。ただしフリーのもので。
856 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 05:58:00 ] メモ帳
857 名前:855 mailto:sage [2009/10/27(火) 06:12:06 ] メモ帳にコード書いて・・そのあとが分かりません。コンパイル、実行は どうやってするの?
858 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 06:37:47 ] >>856 は意地悪なようだが>>855 が教えてくれと言ったこと(だけ)にはちゃんと答えている。
859 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 06:43:29 ] それこそが彼が意地悪たる所以である
860 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 06:59:56 ] いや、メモ帳はフリーではないだろう。
861 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 07:00:47 ] チラシの裏 ttp://yuukiremix.s33.xrea.com/chirashi/ これならフリーソフトだよ。
862 名前:849 mailto:sage [2009/10/27(火) 07:21:53 ] 色々ためしたけどやはりよく分かりません setlocaleもやってみましたが全く変化ありません どうすればwchar_tのn番目の要素とL""の比較ができるんでしょうか? デバッグ中は期待通りの文字列が見えるのに、一文字だけ取り出そうとするとint型になってしまいます コマンド引数に/Zc:wchar_tを指定しても変わりありませんでした (VC++では規定で有効らしいので当たり前ですが)
863 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 07:24:46 ] >>862 できるわけないだろ…。
864 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 07:27:38 ] /D_UNICODE
865 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 07:48:32 ] const wchar_t* str = L"あいうえお"; const wchar_t comp = L'う'; // == L"う"[0] if (str[2] == comp) {}
866 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:04:52 ] >865 それだとif文で左辺がint型、右辺がconst wchar_t*型でエラーが出ます Unicodeを調べて両辺int型でやればなんとかうまくいくようです wchar_t型の文字のUnicodeを求める関数などはあるのでしょうか?
867 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:43:52 ] ある
868 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:44:54 ] >>866 >右辺がconst wchar_t*型で ???
869 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:50:47 ] >>866 うん。明らかに君の使っているコンパイラは標準に合致してない。 別のコンパイラに変えるしかないよ。 そのコンパイラではどうやってもwchar_t同士の比較はできない。
870 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 09:39:44 ] >>866 wchar_t が unsigned なのかも
871 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 10:50:58 ] >>855 アドバイスするとしたら わざわざC言語使わなくてもVBAでいいんじゃない? ってことくらいかな。 あと、異常終了するのはまず間違いなくコンパイラやエディタのせいではない と思っていい。
872 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 10:51:53 ] ヘッダで #define wchar_t int とかやってたりしてな。
873 名前:855 mailto:sage [2009/10/27(火) 12:25:42 ] >>871 >わざわざC言語使わなくてもVBAでいいんじゃない? プログラムをLinuxで走らせたいのです。 >異常終了するのはまず間違いなくコンパイラやエディタのせいではない やはり、コードですかね。問題は。 もうちょっとがんばってみます。 ありがとうございました。
874 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 12:36:59 ] >>873 スクリプト系言語にしたら? LinuxならRubyでもPythonでも選り取り緑でしょ。
875 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 12:42:06 ] C言語を始めよう!はwindowsじゃないの?
876 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 13:06:26 ] >>873 Linuxで動かすつもりなら、Linuxで開発したほうが楽だと思うけどね。 Windowsと違うところ結構あるし。 あと、まさかWindows特有の機能使おうとはしてないよね?
877 名前:855 mailto:sage [2009/10/27(火) 13:16:49 ] >>875 >>876 あの〜、この辺まったく知らないんですが、Windows上で動くcプログラムでも Linuxで動かないってことあるんですか?あ、もちろんWindows特有の機能ってのは 使わない上での話ですが。 「Linuxで走らせる」っていうのも先の目標でして、実際はKnoppixのデスクトップ画面 を、自身のPCで見たことがある程度の者です。
878 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 13:23:29 ] >>877 > Windows上で動くcプログラムでも > Linuxで動かないってことあるんですか? あるねぇ。 > あ、もちろんWindows特有の機能ってのは > 使わない上での話ですが。 あなたのレベルでは、Windows特有の機能かどうかの判断は難しいと思う。
879 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 13:40:23 ] >>877 自分のLinux上で動くcプログラムが 他人のLinuxで動かないってこともある
880 名前:855 mailto:sage [2009/10/27(火) 13:44:25 ] >>879 ほんとですかw。どーゆーこと?って感じですね。
881 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 13:52:13 ] 理由がわからん香具師はおとなしくスクリプトつかっとけ Windows の VB に相当するのは Python だ
882 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 13:54:20 ] 標準ライブラリからちょっとでも逸脱しなければ大抵大丈夫だと思うが
883 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:05:01 ] >>794 引数に配列名を持ってくるときは自動的に配列の1番目の要素のアドレスを表すので&は不要ということはわかりましたが そこを直してもやはりダメでした というかunsigned charに対するフォーマット指定子は%sでよいのでしょうか? もちろん文字列入力を行うということなのですが・・・
884 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:11:01 ] 問題はI/O。標準ライブラリでのI/Oって、stdin, stdout, stderrとfopen系のストリームくらい。 ディレクトリ操作すら標準化されてない。GUIなど無論。
885 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:12:13 ] >>883 "%s"は試したの?
886 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:13:27 ] どうダメだったの? scanf("%s", tripkey); これでダメなら原因は別のとこにある。
887 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:36:11 ] >>885 試しましたがダメでした >>886 同じようにコアを吐きます とりあえずソース全部です・・・ この部分だけでなく他にもおかしいところが多々あって見苦しいとは思いますが・・・ ttp://ccfa.info/cgi-bin/up/src/up1812.txt
888 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:44:20 ] >>887 crypt()周辺がおかしいんで内科医? crypt()の仕様はどうなってんのよ。 つーか、手元にcrypt()がないからコメントアウトしたら、実行しても少なくともコアは吐かないんだが。
889 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:47:29 ] >>877 C言語を始めよう!ってなんじゃろうと思って調べたら統合開発環境だた
890 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:47:45 ] いろいろ間違ってるが、crypt(tripkey, salt);のように*をはずしたら最後までいったな
891 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:52:14 ] >>887 cryptの呼び出しは strcpy(trip_f, crypt(tripkey, salt)); こんな感じ?
892 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 15:56:14 ] >>887 printf("トリップキーを入力:"); scanf("%u", &tripkey); printf("トリップキー入力"); ←これが表示されずにコアを吐く fflush(stdout); ←これを追加したら↑これ出ないかな
893 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 16:33:35 ] >891 本来ならそんな感じで呼び出すはずだけど 僕の環境では /usr/include/unistd.h:1073:extern char *crypt (__const char *__key, __const char *__salt) /usr/lib/i386-redhat-linux4E/include/unistd.h:1019:extern char *crypt (__const char *__key, __const char *__salt) となっていたから diff 96c96 < *trip_f = crypt(*tripkey, *salt); --- > strcpy(trip_f, crypt(tripkey, salt)); 結果 ./up1812 トリップキーを入力:foo トリップキー入力トリップキー前処理salt作成1回目:OK2回目:OK3回目:OK4回目:OK5回目:OK◆yaoo
894 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 20:59:52 ] typedef struct data{ ___char mozi[100]; //文字列格納用 _______int year[100];//点数格納用 }Data; Data data[100];構造体を100個用意 data[0].mozi="aaaaaaaa";←*1 printf("%s",data[0].mozi); これでコンパイルすると*1の部分が「左辺値が必要」といわれてしまいます。 どうやったら文字列を格納できるのでしょうか?
895 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 21:10:43 ] strcpy
896 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 21:12:36 ] strcpy(data[0].mozi,"aaaaaaaa");
897 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 21:14:53 ] >>895-896 ありがとうございます。 配列=配列ができないのと同じ原理なんですね。
898 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:46:47 ] char *a[8]; char (*b)[8]; この違いを教えてください。
899 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:47:50 ] Cってカンタンだよね。 すぐにUSB接続デバイスとか 作れそう。
900 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:54:26 ] >>899 DDK次第
901 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:55:55 ] 道路の交通量調査などに使われてる(?)紅白で野鳥の会の人が使ってる(?) カウンターの様な機械をC言語で作ってみたいと思っています。 コマンドプロンプト上で、Enterを押せば数字が増えていくというモノです。 Enterの入力があれば用意した変数に1を足して出力 とするプログラムはすぐに書けると思うのですが、 C:\>counter.exe Enterの入力回数:1 Enterの入力回数:2 Enterの入力回数:3 ・・・・ Enterの入力回数:100 の様な感じになると思います。 C:\>counter.exe Enterの入力回数:XXX として、Enterを押せばXXXの部分の数字だけを書き換える という事は出来るのでしょうか? 説明が下手なのですが、内容を察して教えて下さい。 もしよろしければコーディングまでよろしくお願いします。
902 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:58:31 ] CLSして再描画する?
903 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:03:20 ] #include <stdio.h> int main(void) { int counter=0; while(1){ int c = getchar(); if(c=='\n'){ counter++; } system("clear"); printf("counter:%d\n", counter); } return 0; } ※windowsならsystem("cls");
904 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:05:15 ] >>901 非標準な事をすれば可能 環境を書いてくれないと無理
905 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:11:20 ] >>901 conio.h があるなら #include<stdio.h> #include<conio.h> #define KEY_ENTER 0x0d #define KEY_ESCAPE 0x1b int main(void){ int count=0, key; while(1){ key=getch(); if(key==KEY_ENTER) printf("\rEnterの入力回数:%d ", ++count); if(key==KEY_ESCAPE) break; } return 0; }
906 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:11:30 ] >>901 本当はこうなってるんじゃないの? C:\>counter.exe Enterの入力回数:1 Enterの入力回数:2 Enterの入力回数:3 ・・・・ Enterの入力回数:100 表示が本当に >>901 の通りなら入力にエコーが無いから 単に改行しなければ良いだけだろ
907 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:12:57 ] int counter=0; これってCだと必須なんだ。 変数を宣言しないと つかえないから。
908 名前:894 mailto:sage [2009/10/27(火) 23:17:53 ] /**おまじない省略**/ struct suji{ char moji[100];//文字列格納 int su[100];//数字格納用 }; int main(void) { ____struct suji score[100];//100の構造体を用意 ____FILE *fp; ____char *tp; ____char str[256];//ファイルの行を格納する配列 ____int i=0,k=0; ____ if((fp= fopen("input.txt", "r")) == NULL)exit(1); ____________while( fgets(str,256,fp) != NULL)//ファイルの中身がなくなるまで ____________{; /************文字列格納******************************/ ________________tp=strtok(str,","); //文字列格納 tp=ポインタ ________________strcpy(score[i].moji , tp); //文字列コピー ________________printf("%s\n" , score[i].moji); //テスト表示 ________________i++;//構造体を一つ進める /***************数字格納******************************/ ____________________while(tp!=NULL){//一行読みきるまで ____________________________score[i-1].su[k] = atoi(strtok(NULL , "," ));//i-1は上でi++してるため無効化する作業 ____________________________printf("%d\n" , score[i-1].su[k] ); //テスト表示 ____________________________k++; ____________________} _____________} ___________fclose(fp); ___________return 0; }
909 名前:894 mailto:sage [2009/10/27(火) 23:18:57 ] 上のプログラムはCSVファイルを一行ごとに構造体配列に格納するプログラムを目指してます。 input.txtには、文字列,数字1,数字2・・・,数字n(文字列は行の先頭に一つだが、数字はいくつでも可能)といった形式で入っています。 このプログラム、コンパイルは正常にできますが実行するとエラーで強制終了となります。 何がおかしいかご教授ください。 CSVファイルが aiueo,10,23,53,55,60 kakikukeko,22,33 の2行だったら格納後、適当なメンバを参照すると score[0].enzan=aiueo score[0].su[0]=1 score[0].su[1]=2 score[1].enzan=kakikukeko score[1].su[1]=33 という具合になる予定です。
910 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:20:25 ] score[0].su[0]=10 score[0].su[1]=23 の間違いです。
911 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:23:32 ] >>898 全然違う。後者に使い道はない。
912 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:28:16 ] 今、大学の課題を考え中なのですが、 「定義域 -1.5<=x<=1.5の時 関数 y=3x^3-0.2x^2+0.3x-0.7 の値を出力するプログラムを作れ。 なお、xは-1.5から0.1刻みで増やすこと」 という問題なのですが、 ↓のようなプログラムを実行させると なぜか、x=1.5のときだけ出力されません・・・
913 名前:つづき mailto:sage [2009/10/27(火) 23:28:59 ] #include <stdio.h> main() { float x, y, step; x=-1.5; step=0.1; y=0.0; while(x>=-1.5 && x<=1.5){ y=3.0*x*x*x-0.2*x*x+0.3*x-0.7; printf("%4.1f %9.5f\n", x, y); x = x + step; } } ちなみに、 whileの中の条件式を x>=-1.5 && x<1.6 (右の不等式のイコールをとって、1.6にしてみた) とか x>=-1.5 && x<=1.51 とかにかえると正しい結果が得られました。 どこで間違ってるのでしょう?? どなたかご教授願います m(_ _)m
914 名前:デフォルトの名無しさん [2009/10/27(火) 23:40:45 ] >>911 使い道はある (単純な二次元配列でも使うし固定長配列へのポインタを関数の引数にする場合にも使う) >>898 >char *a[8]; char *a; が8個 char *a[8] = {"abcd", "ef", "gh", "ijkl", "mnopq", "rst", "uv", "wxyz"}; >char (*b)[8]; char [8]へのポインタb または char [8]がn個 の配列 char (*b)[8] = {"abcdefg", "1234567", "zyxwvut"};
915 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:41:31 ] 浮動少数は厳密なものじゃなく近似値だから ピッタリでは判定できないことが多いよ。
916 名前:デフォルトの名無しさん [2009/10/27(火) 23:46:56 ] while(!((x+1.5)<0.0 || (x-1.5)>0.0)){
917 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 23:49:58 ] >>913 0.1を正確に表せないから。 step=0.1; としても、0.1よりちょっとずれた値になるので、何度も足してると誤差が蓄積する。 誤差少なくするなら、 double x; int n; for(n = 0; n <= 30; n++){ x = -1.5 + n*0.1; ... } みたいな。
918 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 00:16:08 ] >>917 へぇ〜 そんな話、聞いたことありませんでした!! ありがとうございました!! ところで、 どうして、その1次関数で 誤差を少なくすることができるのでしょうか?? 何度も何度も聞いてしまってスイマセン・・・ m(_ _)m
919 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 00:27:33 ] >898 型が違う。 aはcharを指すポインタの配列(要素数は8) bはcharの配列(要素数8)を指すポインタ aに+1するとsizeof(char*)増加(32ビット環境なら通常4) bに+1するとsizeof(char[8])増加(8)
920 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 00:30:01 ] >897 >配列=配列ができないのと同じ原理なんですね。 というか、文字列リテラル("aaaaaaaa")の型はconst charの配列 なので、問題の箇所は「配列=配列」そのもの。
921 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 00:35:35 ] >911 >>898 >全然違う。後者に使い道はない。 いやいや、普通にあるでしょ。 char a[N][8]; を引数にとる関数の仮引数の型がそう。
922 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 01:10:00 ] ならなんで char *(b[8]); じゃないの?
923 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 01:28:14 ] fclose() が NULL を受け付けないおかげで fclose(func(fopen(fname,"r"))); みたいに出来ないから困る。 free(func(malloc(s))); ならできるのにな。