質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

751閲覧

「覚えて」という入力の後に、文字を入力し、キーsを押すとメモに入力した文章が書きこまれるようにしたい

KZK13

総合スコア43

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/06/26 17:24

編集2020/06/28 10:05

「覚えて」という入力の後に、文字を入力し、キーsを押すとメモに入力した文章が書きこまれるようにしたいのですが、
うまくいきません。何が原因なのでしょうか。
また入力後にウィンドウが閉じてしまうのですが、これは仕方ないことなのでしょうか。

環境
Windows10
DXライブラリ

少し長いのでこちらに載せます。
コード

編集後
あの後、改めてデバッグしました。
デバッグした結果の画像を添付します。
デバッグ画像

ハンドルされていない例外という意味がいまいちわからなかったのですが、
InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE);により、入力された文字の値が
InputHandle に代入され、キーSにより、InputHandleの数値をGetKeyInputString(buffer2, InputHandle)に書いたようにbuffer2に文字コードの値として変換する。そして、そのbuffer2に入ったものをfprintf(fp, "%s", buffer2)により、開いたtxtに書き込むといった動作を書いたのですが、デバッグでのエラーにより何かしら間違いがあることがわかりました。

buffer2には入力したときの文字がちゃんと入っていることが確認できました。
張れと入力してキーSを押したときのデバッグ
しかし、同じようにハンドルされていない例外とでます。ハンドルされていない例外で調べるとバッファのサイズを指定していないためと出てきますが、char buffer2[256]とサイズを指定しています。何がダメなのでしょうか?

解答して頂いた皆さんの回答を基にくっそ汚いコードですがとりあえず「動く」ものが作れました。
こちらがコードです。
コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/06/26 22:42 編集

低評価 : デバッグの丸投げ 400行に迫るコードを押し付けて「何が原因なのでしょうか」はないだろう。
episteme

2020/06/27 01:43 編集

↑愛想が尽きるね...息をするようにマルチポスト、相手せんほうがよさそうだ。 ルールが守れないならコミュニティから去ってくれんかな。
KZK13

2020/06/27 05:50 編集

epistemeさんに見放されれば、さすがの私も終わりですね。 去るつもりはないですが、低評価を押して逃げるだけの腰抜けピンポンダッシュ民が多いのでなんかつまらないとは思っていますね。
episteme

2020/06/27 07:00

低評価に文句言える質問ではなかろうよ。
KZK13

2020/06/27 07:11

低評価に文句というか、何もコメントや解答なしに低評価だけ押してるのが嫌ってだけです。 epistemeさんみたいに何かしら言ってくれると助かるんですけどね。
episteme

2020/06/27 07:13

コメントなら得られています。 > 複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
m.ts10806

2020/06/27 09:26

いつから見離されてないと勘違いした?
KZK13

2020/06/27 09:38

いつからm.ts 10806さんは私に相手にされていると勘違いした?
m.ts10806

2020/06/27 09:54

何を言っても聞き入れない人に相手されてなくてもなんとも思いませんが。
episteme

2020/06/27 11:41

> 低評価を押して逃げるだけの腰抜けピンポンダッシュ民が多い 居心地悪くなると複数アカウントを渡り歩く腰抜けマルチアカウント民も少なくありませんしね。 あきらかにルール違反だというのに。
KZK13

2020/06/27 11:47

ルールは守らないとだめですよね。
m.ts10806

2020/06/27 11:47

いちいち理由書く必要がないくらい明らかなものにコメントする必要ないですしね。 それが質問と回答の違いです。回答はコメント書くように促されますが質問には「低評価理由」選択するようになってます。 それが「質問者に伝えたい指摘事項」そのままであえればあえてコメントする必要はないでしょう。 既に何度も指摘されてる通り、「押して逃げるだけ」「腰抜け」と言えるほどの質問内容になってません。 今読んでも丸投げです。 自分が全く理解してないコードな状況に進展ないですよね。まぁこれは数年変わってないのでいい加減気づけってことです(見てる人全てが感じてること。質問者だけがずっと気づかない)
m.ts10806

2020/06/27 11:50

>ルールは守らないとだめですよね。 キミのルールは知らん。コミュニティのルールを守れと言われている。 直近で指摘されているコミュニティのルール違反 >https://teratail.com/help#posted-otherservice >teratailでは、マルチポスト※の推奨はしていません。 まぁ「丸投げ」もルール違反。 https://teratail.com/help/avoid-asking 守ってから言えと。
KZK13

2020/06/27 11:58

低評価が多いと凹むけど、逆に言えばそれだけ注目されているのか、、、。
m.ts10806

2020/06/27 12:02 編集

>逆に言えばそれだけ注目されているのか、、、。 あぁ、そう(曲解)なるのね。VIEWの多さと低評価の多さが比例する場合、 さっさと(残ってるアカウント含めて全部)完全に出ていってほしいと願う人がそれだけいるということに他ならない
KZK13

2020/06/27 12:07

出ていくつもりは毛頭ないですけどね。 ただルールは守るようにしないとならないですね。
m.ts10806

2020/06/27 13:08

無理でしょ これまでは当然のこと、現在のものすらルール通り対応するつもりないじゃない 言うだけはもう結構 そんな稚拙な返ししてる間にできることをなぜやらない
guest

回答3

0

何が原因なのでしょうか。

自分が全く理解できていないことが原因。
せめて6~8割くらいは理解できてから残りを埋めるべく質問すべきでしょう。
でないとアドバイスは理解できない。だからこの質問者のような状態になる。

赤の他人を頼るときは普通は「わからないところが明確でちょっと足りてない」部分を補うために使う。
全く理解できないなら手を出すべきではなく、ずっと言われてきたように
基礎のできていないことを自覚し、指摘はアドバイスとして受け入れること。

おそらく、DXLib知らない人でも当質問者よりは理解できるレベルです。

投稿2020/06/26 22:46

編集2020/06/26 22:58
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

また入力後にウィンドウが閉じてしまうのですが、これは仕方ないことなのでしょうか。

作ったとおりに動いています。

入力後にウィンドウを閉じているから。
あなたがそんなコードを書いている限り仕方ない。
※ 僕が[回答ではありません]で示したサンプルはアプリが勝手に終了することはない。

投稿2020/06/26 23:24

編集2020/06/26 23:26
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

[回答ではありません] "きろく"と入力されたとき、直近の5行分を applog.txt に書くサンプル。

C++

1#include <DxLib.h> 2#include <string> 3#include <deque> 4#include <fstream> 5 6int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { 7 8 std::deque<std::string> messages; 9 int InputHandle; 10 11 SetGraphMode(700, 780, 32); 12 ChangeWindowMode(TRUE); 13 if (DxLib_Init() == -1) return -1; 14 SetDrawScreen(DX_SCREEN_BACK); 15 SetFontSize(64); 16 17 InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); 18 SetActiveKeyInput(InputHandle); 19 20 while (!ProcessMessage()) { 21 ClearDrawScreen(); 22 23 if (CheckKeyInput(InputHandle) != 0) { 24 char buffer[256]; 25 GetKeyInputString(buffer, InputHandle); 26 std::string input = buffer; 27 DrawString(0, 0, input.c_str(), GetColor(255, 255, 255)); 28 if ( input == "きろく" ) { 29 std::ofstream stream("applog.txt"); 30 while ( messages.size() != 0 ) { 31 std::string line = messages.front(); 32 messages.pop_front(); 33 stream << line << std::endl; 34 } 35 } else { 36 messages.push_back(input); 37 } 38 while ( messages.size() > 5 ) { 39 messages.pop_front(); 40 } 41 SetActiveKeyInput(InputHandle); 42 SetKeyInputString("", InputHandle); 43 } 44 45 DrawKeyInputModeString(640, 480); 46 47 int height = 100; 48 for ( std::string message : messages ) { 49 DrawString(100, height, message.c_str(), GetColor(200, 200, 255)); 50 height += 60; 51 } 52 DrawKeyInputString(0, 0, InputHandle); 53 54 ScreenFlip(); 55 } 56 57 DeleteKeyInput(InputHandle); 58 DxLib_End(); 59 60 return 0; 61}

[追記] "きろく"の直後から二度目の"きろく"の直前までを applog.txt に書き込むサンプル

C++

1#include <DxLib.h> 2#include <string> 3#include <deque> 4#include <vector> 5#include <fstream> 6 7int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { 8 9 std::deque<std::string> messages; 10 std::vector<std::string> log; 11 bool logging = false; 12 13 int InputHandle; 14 15 SetGraphMode(700, 780, 32); 16 ChangeWindowMode(TRUE); 17 if (DxLib_Init() == -1) return -1; 18 SetDrawScreen(DX_SCREEN_BACK); 19 SetFontSize(64); 20 21 InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); 22 SetActiveKeyInput(InputHandle); 23 24 while (!ProcessMessage()) { 25 ClearDrawScreen(); 26 27 if (CheckKeyInput(InputHandle) != 0) { 28 char buffer[256]; 29 GetKeyInputString(buffer, InputHandle); 30 std::string input = buffer; 31 DrawString(0, 0, input.c_str(), GetColor(255, 255, 255)); 32 if ( input == "きろく" ) { 33 if ( !logging ) { // 記録開始 34 log.clear(); 35 logging = true; 36 } else { // 記録終了 37 std::ofstream stream("applog.txt"); 38 for ( std::string line : log ) { 39 stream << line << std::endl; 40 } 41 logging = false; 42 } 43 } else { 44 if ( logging ) { 45 log.push_back(input); 46 } 47 messages.push_back(input); 48 } 49 while ( messages.size() > 5 ) { 50 messages.pop_front(); 51 } 52 SetActiveKeyInput(InputHandle); 53 SetKeyInputString("", InputHandle); 54 } 55 56 DrawKeyInputModeString(640, 480); 57 int height = 100; 58 for ( std::string message : messages ) { 59 DrawString(100, height, message.c_str(), GetColor(200, 200, 255)); 60 height += 60; 61 } 62 DrawKeyInputString(0, 0, InputHandle); 63 64 ScreenFlip(); 65 } 66 67 DeleteKeyInput(InputHandle); 68 DxLib_End(); 69 70 return 0; 71}

投稿2020/06/26 21:52

編集2020/06/28 00:23
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KZK13

2020/06/27 06:18 編集

サンプルを頂きありがとうございます。 あのmessages.size() != 0の部分が何を表すのか知りたくてmessages.size() を調べたのですが、出てきませんでした。推測ですが、文字のバイト数が0出ないときを表しているのでしょうか?
KZK13

2020/06/27 07:00

というかCですらこのざまの私がC++を解読できるわけがないですね。 どうか編集した後の内容での原因を解決するためのヒントを頂けないでしょうか。力が付くかわかりませんが、毎回答えだけもらっても意味がないので、ほんの少しは成長するためにヒントが頂ければと思います。 出来れば、messages.size() != 0の部分においてもヒントがほしいです。 どうかよろしくお願いいたします。
episteme

2020/06/27 07:10 編集

ヒントは出しません、てか出せません。 あなたのコード、精読してはいないので。
KZK13

2020/06/27 07:18

読むの面倒ですもんね。 ではmessages.size() != 0の部分が何を表すか教えて頂けないでしょうか。
episteme

2020/06/27 07:20

messagesが空ではない / messagesに一つ以上の要素が格納されている
KZK13

2020/06/27 07:34

ご親切にどうもありがとうございます。 std::deque<std::string> messagesよりmessagesに文字(コード)が一つ以上格納されている場合を表しているとわかりました。
KZK13

2020/06/27 07:40

え?!でもstd::deque<std::string> は文字列を扱うって書いてあります! 何が違うのでしょうか!!
episteme

2020/06/27 07:52

言葉とコードをことごとく独自解釈/拡大解釈するあなたにこれ以上の説明は空しい。
KZK13

2020/06/27 07:58

さすがのepistemeさんでも説明が難しいとなると、誰も解決できないので無理ですな。
episteme

2020/06/27 08:01 編集

「あなた」には説明が難しい。 ことごとく独自解釈/拡大解釈するからだ。 あなたではない誰かに対してであれば、1分で理解してもらえる自信がある。
KZK13

2020/06/27 09:15

確かにあなたのおっしゃる通りです。私に説明をするのは難しいと思います。 私にものを教えてきた人のほとんどはとても賢くまさに天才と呼ぶにふさわしい人がほとんどでした。 彼らにこそepistemeという名前が似合うほどだと自負しています。というのも彼らは理解力の低い私の考えや何でつまずいているかを明確に判断して指導してくれるためです。天才は天才のことしかわかないというのは間違えで天才とはどんな人の考えや悩みすらも解決できる人のことを言うのだと思います。 なので少なくとも自分にepistemeと付けて自分に酔ってるような、私のような一部の人間には説明できないなどと自分を基準にしか考えられない人にはつけるべき名前ではないと思いました。'(このことは昔から言いたいと思ってました。) >>あなたではない誰かに対してであれば、1分で理解してもらえる自信がある。 申し訳ないが、それはないです。あなたは自分が賢い人だと思い込んでいて、かつ賢い人を演じるためにわざと難しい言葉を使っている。真にepistemeという名前が似合う賢い人ならば、難しい言葉ではなく、誰にでもわかりやすい言葉で相手に合わせた説明のできる人だと思います。 話を戻します。epistemeさんの説明は私には理解できない。認めます。ですが、私でない誰かには理解できるにしても大変時間がかかると思う。というのも あなたは有名なC++の著者のようだが、なぜあなたの書いていない本の方がレビューや評価が高いと思いますか?答えは簡単です。難しい言葉を使わず簡単にわかりやすく説明しているためです。 逆を言えばあなたの本は難しく、説明がわかりにくいし不親切、なので私でない誰かに対して説明を理解させるのにそんな些細な時間で理解させるのは無理だとわかります。(私は他の回答者様の意見は理解できますが、あなたの意見はわかりにくいです。なのでコードをコピペしてそれっきりなことがほとんどです。) 読者の私も私自身のレベルが低いですが、新・明解C言語シリーズの方があなたの書いた?監修した本と見比べるとわかりやすいです。わざわざ難しい表現をしていないためです。 長文失礼します。要は相手の対応に従わずにカテゴリーがCでありながらもC++で難しく書いたり、自分の意見が理解してもらえないだけで独自解釈など造語を使って説明を放棄するなら迷惑です。 解答はありがたいですが、解答者としての責任は果たしてほしいものです。無責任は嫌いだと誰かも言っていましたよね。 >>愛想が尽きるね...息をするようにマルチポスト、相手せんほうがよさそうだ。 ルールが守れないならコミュニティから去ってくれんかな。 愛想が尽きて結構。相手しなくて結構です。これからは解答しなくていいので、来ないでください。 ではでは。
Zuishin

2020/06/27 09:20

その天才たちに聞けばいいんじゃないですかね。名前をコロコロ変えるような不誠実な真似をせずに。
KZK13

2020/06/27 09:34

あくまで、プログラミング以外の学習過程における天才達です。 言葉が足りずすいません。
Zuishin

2020/06/27 09:54 編集

プログラミング以外のことは知らないけどプログラミングに限って言えば、carnage0216 さんに物を教えるのは、困難で不毛な重労働です。教えられないのが普通なので、教えられないことを怒るのは理不尽です。 半分愛想を尽かしながらでもまだ教えてくれてる人に向かって、世紀の天才じゃないことを責めるって何様ですか? 私は愛想を尽かしたし、他の多くの回答者もそうです。だからこそあなたはその下手くそな変装をしなきゃ質問もできないんでしょ? 自分の置かれた状況をもっとよく見てください。
episteme

2020/06/27 10:39 編集

> このことは昔から言いたいと思ってました。 昔から? あなたteratail歴10日よ? > なのでコードをコピペしてそれっきりなことがほとんどです 理解もできんのに使うのか。そっかー > 相手の対応に従わずにカテゴリーがCでありながらもC++で難しく書いたり これはごめんなさい。 Cの方が難しい(というか面倒)のよ実際。(ひらがなだけで論文書くようなもどかしさ) さらにあなたに合わせるとなると構造体もポインタも使えず面倒この上ないのです。 # ヘタに使うと質問攻めだし > 独自解釈など造語を使って 「独自解釈」は造語か。そっかー
KZK13

2020/06/27 10:42

まあ、結局は出来の悪い私が一番悪いんですよ。そんな自分が嫌になりますけどこればっかりはどうしようもないですからね。 ご迷惑おかけしました。プログラミングってめちゃくちゃ難しいけど面白いので嫌いになれないんですよね。
episteme

2020/06/27 10:53 編集

> 愛想が尽きて結構。相手しなくて結構です。これからは解答しなくていいので、来ないでください。 質問が自由なら回答も自由。僕のタワゴト読まんで結構、理解できる回答のみをアテにしてください。 > プログラミングってめちゃくちゃ難しいけど面白いので嫌いになれないんですよね。 それを支えてくれるコミュニティのルールは守ろうや。
KZK13

2020/06/27 11:02

確かに、そうですね。その自由を損害する権利は私にはありません。 >>それを支えてくれるコミュニティのルールは守ろうや。 マルチポストをした昨日の自分を殴ってやりたいですね。
episteme

2020/06/27 11:11

あと > 入力後にウィンドウが閉じてしまうのですが、これは仕方ないことなのでしょうか。 335行で return 0; してる。つまりmainから抜けるからプログラムが(後始末せずに)終了。
KZK13

2020/06/27 11:47

それについてはデバッグにより数時間前にできました! コメントありがとうございます。
episteme

2020/06/27 12:03

そか、ろくなデバックもせぬまま質問したんだ。そりゃ低評価も当然。
KZK13

2020/06/27 12:08

いえ、そういうわけではなく、デバッグは質問前からしています。 ただ、ウィンドウが閉じるという原因がわかったのが質問後だっただけです。
KZK13

2020/06/27 12:11

ちなみに、epistemeさんのコードは後から入力したものをきろくにより記憶していますが、その逆の きろくと入力した後に入力した文章を記憶するようにはプログラミング的に可能なのでしょうか? あれから自分なりにデバッグして、「覚えて あいうえお」など覚えてと含まれた文章を入力することでメモに書き込むことに成功はしましたが、覚えてと入力した後に、入力した文章を入力する方法がまだ作ることができないので、もしかしたら構成的に無理なのかなと思い質問しました。
episteme

2020/06/27 12:13

デバッグするまでもなく、コード中の唐突なreturnに違和感を覚えないのか。そっかー
KZK13

2020/06/27 12:15 編集

いや、これで違和感を覚えました。ありがとうございます。
episteme

2020/06/27 12:20 編集

> きろくと入力した後に入力した文章を記憶するようにはプログラミング的に可能なのでしょうか? どってことないです。 ごめんなさい僕は教え方ヘタだしCでの実装は面倒なのでこれ以上の説明は勘弁してください。 # ただしゲームのようなリアルタイム性を重要視する場面でファイルにごりごり書くのは  躊躇されますから、実用を考慮するとマルチスレッド使うことになりますかね。  ちょっとばかしややこしくなりますけど。
KZK13

2020/06/27 12:20

そんなに凹まないでください。勉強がめちゃくちゃできるのに教え方が下手な人は良くいますので。
episteme

2020/06/27 12:23

凹んでません、あなたに対しては説明するのも実装例を示すのも面倒なので。
KZK13

2020/06/28 06:02

どうやって編集後に載せて頂いたC++のプログラムを一から作ったのですか?
episteme

2020/06/28 07:02 編集

「どうやって」とは? ("Visual Studio 立ち上げて..."なんて返答を期待してはいないだろうし) 「編集後に載せて頂いたC++のプログラム」ってどれのこと?
KZK13

2020/06/28 07:28

[追記] "きろく"の直後から二度目の"きろく"の直前までを applog.txt に書き込むサンプル のプログラムです。
KZK13

2020/06/28 07:42 編集

epistemeさんのプログラムを参考にとりあえず、書き込むことのできるソースは作れましたのでベストアンサーをこちらに決めます。
episteme

2020/06/28 08:41

「どうやって」に答える必要はなくなったのかな。
KZK13

2020/06/28 09:31

ベストアンサーは決まりましたが、どうやってに関しては面倒でなければご負担にならなければ教えてほしいです。
m.ts10806

2020/06/28 09:32

全く解決したように見えない
KZK13

2020/06/28 09:39

ソース載せたほうがいいですか? 書いたソースは大変きったいないもので皆様に申し訳ないと思い、とりあえず解決したということだけを報告したのですが。
episteme

2020/06/28 09:47

> どうやってに関しては面倒でなければご負担にならなければ教えてほしいです。 "Visual Studio 立ち上げて..."なんて返答を期待してはいませんよね? 僕に何を求めていますか?
m.ts10806

2020/06/28 09:58

自身が理解できたコメント付きでね。それ次第では「どこも解決してない」と総ツッコミを受けることになるし、問答見てても理解できるようには思えない。基礎がないから。
KZK13

2020/06/28 10:06 編集

まあ、ただ単に低評価押したいだけの人もいるからあんまり気にしてないけど。 なんやかんやでみんな見てるんだな~という感じです。 ほんとにやばかったら低評価すらもつかないと思いますからね。
m.ts10806

2020/06/28 10:08

ヤバイから低評価と指摘がつくんでしょ。分かろうよ。 あとこのコードどれくらい理解できてるんでしょうね。 理解できてる人の質問ではないし、 まあそもそもがルール違反を繰り返している、要注意人物なので、調子乗らないように。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問