Re: 導入やら初歩的な質問 ( No.1 ) |
- 名前:sia 日時:2018/05/12 03:58
ttps://qiita.com/sasakenotolab/items/9fe86626d206ce4d6668
ないのに関しては見つけました
変わってはいますがコンソールを選んで
空では動きましたが
コピペのハローワードを実行しましたがが上手く動作しない場合何が原因でしょうか汗?
致命的な命令はエラーとか書いてありますが
ハローワードがエラーなわけないし・・
お勧めのバージョンありますか?
|
Re: 導入やら初歩的な質問 ( No.2 ) |
- 名前:sandbox 日時:2018/05/12 06:10
新しいプロジェクト
Visual C++
Windows デスクトップ
Windows デスクトップ ウィザード
Windows デスクトップ プロジェクト
からコンソールアプリケーションを選択して
#include "stdafx.h"
int main()
{
return 0;
}
では動いたということでしょうか。
これをハローワードにしたらエラー、ということですが
・どういうプログラムを書いたか
・どういうエラーが出たか
を正確に書いてください、
|
Re: 導入やら初歩的な質問 ( No.3 ) |
- 名前:sia 日時:2018/05/13 02:10
#include<stdio.h> /*おまじない*/
main()
{
printf("Hello World\n"); /*Hello Wordと画面に表示させ改行する。*/
}
ソースファイルに追加で新しい項目c++のファイルで作り上記をコピペして保存
F5等押したりソリューションとかビルド押してますが1>------ ビルド開始: プロジェクト: Project1, 構成: Debug Win32 ------
1>Source.cpp
1>c:\users\harun\source\repos\project1\project1\source.cpp(3): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>プロジェクト "Project1.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
と言う風になります
このコンソールやwinアプリケーションとはどう使い分けたらいいんでしょうか?
winアプリケーションではprintfが使えないんですか?
|
Re: 導入やら初歩的な質問 ( No.4 ) |
- 名前:sandbox 日時:2018/05/13 06:29
ファイルを追加する時、デフォルトでは Source.cpp ですが、拡張子.cppなのでC++として処理されます。
C++ではmain関数の型指定がないとエラーになります。なので、以下のようにすればOKです。
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
「return 0;」の行は無くてもエラーにはなりませんが、習慣づけのために書いておきましょう。
ちなみに、Source.cpp を追加する際にファイル名を Source.c にして作成すればCとして処理されるので
int無しでもエラーになりませんが、よほどの理由が無い限りC++で学習した方がよいと思います。
使い分けですが、ウィンドウを使ったプログラムを作るかどうかで決まります。例えばDXライブラリを使った
プログラムはもちろん、(siaさんの目標の1つである)テキストエディタを作成しようとするならWindowsデスクトップ
アプリケーションです。
VisualStudio自体はWindowsデスクトップアプリケーションですが、C++をビルドする時にはコンソールアプリケーション
である cl.exe を呼び出しています。コンソールアプリケーションは文字通りあまり目にすることはありませんが
実は裏方として常にお世話になっています。
C/C++言語の勉強としてはコンソールアプリケーションで作るとよいでしょう。
Windowsデスクトップアプリケーションでもprintfは使えますが、残念ながらそのままでは何も表示されません。
以下のようなコードを追加すると表示用のコマンドプロンプトがいっしょに作成され、printfの結果が
表示されます。開発時には役立つでしょう。(逆に言えば、printfではウィンドウに文字を書くことはできません)
// ヘッダー追加
#include <io.h>
#include <Fcntl.h>
// グローバル変数 に宣言
FILE* pFile;
// プログラムの最初あたり
if (AllocConsole()) freopen_s(&pFile, "CONOUT$", "w", stdout);
// プログラムの最後あたり
if (pFile != NULL) fclose(pFile);
FreeConsole();
 |
Re: 導入やら初歩的な質問 ( No.5 ) |
- 名前:sia 日時:2018/05/14 00:54
お返事ありがとうございます!
習慣づけることがまだ全然わかってないので型を指定するとか基本の形は気を付けようと思います
コンソール用とウィンドウでは文字表示もやらも別に用意されているということでしょうか?
表示と言う話と目標の話もでたので聞きたいのですが
テキストエディタのような文字の表示は普通の文字表示と何か違うのでしょうか?
ただ見たままなら位置をずらして文字を書くってことなんでしょうけど
根本的に違うんだろうなと思っます
|
Re: 導入やら初歩的な質問 ( No.6 ) |
- 名前:yumetodo 日時:2018/05/14 09:15
>コンソール用とウィンドウでは文字表示もやらも別に用意されているということでしょうか?
標準入出力をなにと紐付けるかの問題です。
DxLibで生成したWindow上に標準入出力を紐付けるのは非現実的なコード量が必要です(自力でコンソールを実装する必要がある)。
なのでコンソールWindowを生成しそれに紐付けるコードを書いているわけです。
|
Re: 導入やら初歩的な質問 ( No.7 ) |
- 名前:sandbox 日時:2018/05/14 23:39
コンソールアプリでは printf() ですが、
Windowsデスクトップアプリ だと例えば TextOut(), DrawText() 等があります。
特に後者は改行も処理してくれるなど、わりと使える関数(Windows API)だと思います。
が
例えば良いテキストエディタであれば、C++言語のソースを読み込んだときには自動で色分けや太字などの
処理をしてくれます。(#include, #define, if などの「予約語」は太字になり、文字列は赤字になり、など)
こういった処理はDrawText()ではできないでしょうから、結局「高機能版DrawText()」のようなものを自分で作る
必要があります。
とはいえあまりに最初から目標が高すぎると大変なので、最初はWindows 10付属の「メモ帳」と同じようなものを
作ってみることから目指すことからでしょうね。
が
管理人さんがもう一つの掲示板でコメントされていましたが、テキストエディタを作るのって本当に大変だと
思います。(まず、読み込もうとするファイルが正しいテキストファイルなのかの
判定からして超難度です)
ぜひとも頑張ってください。
※そのまえに、Windowsデスクトップアプリを作ることに慣れなければ、ですね
|
Re: 導入やら初歩的な質問 ( No.8 ) |
- 名前:sia 日時:2018/05/15 00:28
コンソール云々はもっと深い知識ないとわからないですね汗
別れているものだとか思ってなかったので
ええと、自己判別して表示する命令作るってことですよね
まだ自分で考えてやる部分に関しては自由だしどう表現するかは難しくは考えてないのでいいのですが
知識の方が追い付いてなくて
はい、もちろん慣れるの前提なのはわかっているのですが
文字を表示するっていうのは
ゲーム画面の文字表示と
テキストの文字表示は
一緒のものですか?
何言ってるか分からないとは思いますが
改行だとかも画面サイズと文字サイズで割り出して入力のカーソルの点滅やらとか
これもAPIで用意されているとかじゃなくて自分で作るものなのでしょうか?
表示の方法が変わらないのであれば今まで通りというかゲーム作るみたいに普通にやればいいだけなんだと整理は付きます
知らない知識と概念があるのか確認したいのです
|
Re: 導入やら初歩的な質問 ( No.9 ) |
- 名前:yumetodo 日時:2018/05/15 16:08
>最初はWindows 10付属の「メモ帳」と同じようなもの
高度すぎるのでUTF-8でBOMがついているテキストファイルのみに限定した、かつテキストファイル表示のみものを目指しましょう。
DxLibの文字列描画系関数は、改行には対応しているもののそれ以外の制御文字への対応はガバガバなので
ttp://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=3778
結局自分で描画制御回りを作らないといけないと思います。
またUnicodeの結合文字列の描画にDxLibは対応していないので、コレへの対応は実質諦めるべきです。
というかGetDrawStringCharInfoToHandle関数からして結合文字列に対応していないので(結合文字列のcodepoint数は不定なのに固定長で処理している)無理ゲー。
参考までに、以前
DxLibで中寄せで文字列を描画するのはどのくらい大変なんだろうか? - Qiita
ttps://qiita.com/yumetodo/items/8180d48b6fca18d78a90
という記事を書いているのでよければ。
|
Re: 導入やら初歩的な質問 ( No.10 ) |
- 名前:sia 日時:2018/05/16 02:20
何が高度なのでしょうか?
Unicodeやらとか書式ではなく
表示をしりたいのですが…
|
Re: 導入やら初歩的な質問 ( No.11 ) |
- 名前:yumetodo 日時:2018/05/16 03:35
>何が高度なのでしょうか?
「Windows 10付属の「メモ帳」と同じようなもの」の場合編集機能を有すること、複数の文字コードに対応していることが上げられます。
>Unicodeやらとか書式ではなく
>表示をしりたいのですが…
なのでUnicodeの話が出てくるんですね。
>改行だとかも画面サイズと文字サイズで割り出して
計算するに当たり、GetDrawStringCharInfoToHandle関数とGetDrawStringCharInfoToHandle関数が使えると思います
>入力のカーソルの点滅やらとか
編集機能は後回しにしてまず表示できるようになるべきでは
|
Re: 導入やら初歩的な質問 ( No.12 ) |
- 名前:yumetodo 日時:2018/05/16 03:36
ミスった
誤: GetDrawStringCharInfoToHandle関数とGetDrawStringCharInfoToHandle関数
正: GetDrawStringCharInfoToHandle関数とGetFontLineSpaceToHandle関数
|
Re: 導入やら初歩的な質問 ( No.13 ) |
- 名前:sandbox 日時:2018/05/16 21:08
表示方法ですが、siaさんが書かれている方法でいいです。要は縦スクロールゲームのようなものです。
API一発で書く、というものではありません。(この前書いたように、DrawText系 APIではそこそこ書けますが)
広大な上下マップのうち、今どこを表示すべきかを自分で管理し、一画面分書く、という流れです。
(※おそらく、HSPでそのようにやっていた(or やりかけた)んですよね?)
カーソルの点滅はキャレット(カレット)といいます。これはAPIがありますが、単に点滅するだけです(たぶん)。
Windows APIとC++でガリガリ作る場合は使うことになるでしょう。(GitHubにNotepad++というテキストエディタを
おいている方がいるのでソースを見ましたが、キャレット系APIを使っていました)
もしDxLibやその他のゲーム向けライブラリで作る場合は、自前で書いてもよいと思います。
Windowsでプログラムを作るときは毎回一から全て作るのではなく、「コントロール」という部品(ラベルとか
テキストボックスとかスクロールバーとか)を使って作ることも多いです。テキストボックスを使えば簡単な
テキストエディタはできますが、やはり凝ったことは難しいです。
ただ、yumetodo さんが書かれているように、とりあえず
@文字コードを限定して
Aテキストエディタではなくテキストビューワー(見るだけ)から始める
方がよいと思います。
|
Re: 導入やら初歩的な質問 ( No.14 ) |
- 名前:yumetodo 日時:2018/05/17 00:32
スクロールとかが必然的に必要なので、とりあえずはテキストが全部収まるサイズのscreenを作って、
そのscreenの一部を実画面に描画する、という実装になるかなと思います。
テキストビューワーならカーソルの点滅は考えなくていいですね。
|
Re: 導入やら初歩的な質問 ( No.15 ) |
- 名前:sia 日時:2018/05/17 01:13
ふむぅ、キャレットですか
はい、とりあえずビュアーとか作りながら
知らなすぎるので部品探してみたりします
サイトあり過ぎてとか自分が探すの下手なんでしょうけどそれも含めて自分なりにまとめようと思います
お二方共ありがとうございました
|