おまいらがワイにC++を1から教えるスレ

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/12/02(水) 07:55:19.15ID:u3DezFu7
全くのプログラム初心者のワイにC++を1から教えてちょんまげ
2020/12/19(土) 14:38:48.95ID:/5LHU1jG
まずは、printf標準関数の使い方をリファレンスで確認しよう。

(日本語)
https://ja.cppreference.com/w/cpp/io/c/fprintf

(英語)
https://en.cppreference.com/w/cpp/io/c/fprintf

初めのうちは理解できないかもしれないが、さっと目を通してもらいたい。
2020/12/19(土) 14:50:34.47ID:/5LHU1jG
リファレンスはここにある:

https://ja.cppreference.com

リファレンスを完全に理解すればおそらくC/C++の達人になれる。まずは「C言語リファレンス」の「言語」から順番に読み進めるとよいだろう。
2020/12/19(土) 14:58:13.77ID:/5LHU1jG
オプションというのは、追加的な選択肢のことで、あってもなくてもいいものである。

戻り値とは関数の実行結果を返すためのものである。
例えば
int n;
n = printf("abc");
とすれば、nがprintf("abc")の"abc"の文字数3となる。
2020/12/19(土) 15:30:02.52ID:/5LHU1jG
では、Windowsをお使いであれば、MSYS2をインストールしよう。

...(中略)...

次にC言語ソースファイルhello.cを作成し、gcc -o hello hello.cを実行すればgccコンパイラがhello.exeを生成する。
C++では拡張子を.cppにしてg++コンパイラでコンパイルする: g++ -o hello hello.cpp

./helloを実行すると
Hello, world
と表示される。./は現在位置のフォルダ(ディレクトリ)を意味する(Bashなどではセキュリティのために必要だが、コマンドプロンプトでは必要ない)。
2020/12/19(土) 15:59:21.66ID:/5LHU1jG
pure C/C++では、ボタンやウィンドウなどのGUI(graphical user interface)は作れない。標準C/C++ではGUIが用意されてないからである。

C/C++でGUIを作るにはC++/Tcl、Win32API、MFC、WTL、GTK、wxWidgets、Qtなどを選び、言語とは別に学習する必要がある。

しかし、GUIの学習は難易度が高く、どれでもいい訳ではない。GUIの特徴を調べて自分に合ったものを選ぶ必要がある。
2020/12/19(土) 18:36:05.93ID:/5LHU1jG
続きを読むには、「ワッフルワッフル」と書き込んで下さい。
2020/12/19(土) 19:23:29.77ID:Sj3ZjFN+
ワッフルワッフルワ
2020/12/19(土) 20:28:41.45ID:AdgNEvZP
(1)
https://sehermitage.web.fc2.com/devel/win_msys2.html
に従ってMSYS2とgccとg++とmakeとcmakeとgitをインストールして下さい。
(2)
$ gcc --version
$ g++ --version
$ make --version
$ cmake --version
$ git --version
を順番に実行して正しくインストールされているか確認して下さい。
2020/12/19(土) 20:40:28.92ID:AdgNEvZP
(3) プロジェクト「hello-cpp」
(3.1) 次のような内容のソースファイル「hello-cpp.cpp」を作成する。
#include <cstdio>
int main(void)
{
printf("Hello, C++!\n");
}
(3.2) 次のような内容のテキストファイル「CMakeLists.txt」を作成する。
cmake_minimum_required(VERSION 3.0)
project(hello-cpp CXX)
add_executable(hello-cpp hello-cpp.cpp)
(3.3) MSYS2で
$ cmake -G "MSYS Makefiles" .
$ make -j3
を実行する。成功すればhello-cpp.exeができる。
(3.4) $ ./hello-cpp.exeを実行すると「Hello, C++!」と表示される。

ここまでのソース:https://github.com/katahiromz/hello-cpp
2020/12/19(土) 20:48:45.69ID:AdgNEvZP
(4) C++/Win32でハローワールド。
(4.1) MSYS2上で
$ git clone https://github.com/katahiromz/HelloWin32
を実行する。現在の位置にHelloWin32フォルダができる。
(4.2) $ cd HelloWin32を実行してフォルダの中に入る。
(4.3) ビルドする。
$ cmake -G "MSYS Makefiles" .
$ make -j3
buildフォルダの中にHelloWin32.exeができる。
(4.4) build/HelloWin32.exeをダブルクリックして動作を確認する。
2020/12/19(土) 20:53:23.93ID:AdgNEvZP
(5) プロジェクトHelloWin32のダイアログを編集する。
(5.1) HelloWin32のリソースファイル「HelloWin32_res.rc」をリソーエディタで
開いてダイアログを編集し、同名で保存する。
例えばボタンの位置を移動させたり、サイズを変更したりする。

リソーエディタ
https://katahiromz.web.fc2.com/re/ja/
(5.2) $ make -j3を実行してリビルドする。新しいbuild/HelloWin32.exeができる。
(5.3) HelloWin32.exeをダブルクリックして前回と比較する。
2020/12/19(土) 21:03:34.66ID:AdgNEvZP
(6) HelloWin32の解説(その1)。
(6.1) HelloWin32.cppのLoadStringDx関数は、LoadString API関数を使用して
STRINGTABLEリソースから文字列を読み込む関数である。
(6.2) DialogProcは、ダイアログのふるまいを決定づけるダイアログプロシージャと
呼ばれる関数であり、後述のDialogBoxWで使用する。
(6.3) OnInitDialog関数はダイアログの初期化を行うもので、
ダイアログにWM_INITDIALOGメッセージが来たときに呼び出される。
(6.4) OnCommand関数は、WM_COMMANDメッセージが来たときに呼び出される。
これは何らかのイベント(ボタンを押すなど)に対して、何かのコマンドを実行する関数である。
(6.5) WinMain関数は、Win32アプリで最初に呼び出される関数である。
(6.6) DialogBoxWはDialogBox関数のUnicode版であり、DialogBox API関数は
DIALOGリソースを元にしてモーダルなダイアログを表示するのに使う。
(6.7) MessageBoxWはMessageBox関数のUnicode版であり、メッセージボックスを表示するのに使う。
2020/12/19(土) 21:12:44.44ID:AdgNEvZP
(7) HelloWin32の解説(その2)。
(7.1) DialogProcのHANDLE_MSGはメッセージの処理を行うためのマクロである。
HANDLE_MSGを使うには<windowsx.h>が必要。
(7.2) MsgCrackというプログラムを使えばOnInitDialogやOnCommandなどのプロトタイプを
簡単に入力できる。

MsgCrack
https://katahiromz.web.fc2.com/msgcrack/ja/
(7.3) lang/ja_JP.rcをテキストエディタで開けばDIALOGリソースやSTRINGTABLEリソースが確認できる。

テキストエディタの「サクラエディタ」
https://sakura-editor.github.io/
(7.4) CMakeLists.txtはcmakeによるビルド方法を指示するファイルである。
MSYS2ではcmakeはMakefileを作成し、makeコマンドがMakefileを元に
実際にビルドする。
(7.5) .gitignoreはバージョン管理システムのGitに無視したいファイルやフォルダを指示するファイルである。
2020/12/19(土) 21:19:37.31ID:AdgNEvZP
(8) メッセージボックスだけの単純なWin32プログラムMsgBoxを作成する。
(8.1) MsgBoxというフォルダを作成する。
(8.2) 次のような内容でMsgBox.cppという名前のファイルを作成する。
#include <windows.h>
int main(void) {
MessageBoxA(NULL, "This is a Windows application", "Info", 0);
}
(8.3) 次のような内容のCMakeLists.txtを作成する。
cmake_minimum_required(VERSION 3.0)
project(MsgBox CXX)
add_executable(MsgBox MsgBox.cpp)

(8.4)
$ cmake -G "MSYS Makefiles" .
$ make
を順番に実行して、MsgBox.exeをビルドする。
(8.5) MSYS2で./MsgBox.exeを実行して動作を確認する。
2020/12/19(土) 21:23:16.13ID:SjgWLpk6
でも何で拡張子.cppでCなん?
それとシープラプラの書式ならCと違ってmainの引数にvoidは書かんよ
2020/12/19(土) 21:30:37.30ID:AdgNEvZP
(9) MsgBoxを少し改変する。
(9.1) 「int main(void)」をINT WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
に変更する(MsgCrackで「WinMain」を検索すること)。
WinMainのブロックの最後に「return 0;」を追加する。
(9.2) CMakeLists.txtの「add_executable(MsgBox MsgBox.cpp)」を
「add_executable(MsgBox WIN32 MsgBox.cpp)」に変更する(WIN32を追加する)。
(9.3) add_executableの前に
「set(CMAKE_EXE_LINKER_FLAGS "-static")」を追記する。
これでダブルクリックで実行できる。
(9.4) $ make を実行すると、新しいMsgBox.exeができる。
(9.5) このMsgBox.exeをダブルクリックして実行しても黒い画面は出ない。
ダブルクリックすると、最初に例の黒い画面が出るアプリのことを「コンソールアプリ」と呼び、
黒い画面が出ないアプリのことを「Windowsアプリ」と呼ぶ。
2020/12/19(土) 21:44:52.15ID:AdgNEvZP
>>44 ほんとだね。C++では引数void必要ないね。C言語でも省略可能だし。
2020/12/19(土) 22:06:18.46ID:/5LHU1jG
定番のWin32学習サイト。

・MSDN
・EternalWindows
・猫でもできるプログラミング
・WisdomSoft(旧)

参考にしてね。
2020/12/19(土) 22:37:48.42ID:addgFCLw
めんどくさーい
2020/12/26(土) 04:56:17.90ID:MmCRaN+2
まずはラムダ式から教えようかな
2020/12/26(土) 05:14:20.66ID:IS/9s11k
ラムダ式があると何が便利かも書いて欲しい。
2020/12/27(日) 00:00:27.09ID:3O0UlW8w
この業界の権威にでもなりたいんでなければC++は開発ブランチだと思って美味しいとこだけcherry-pickした言語使った方がいいと思うよ。
2020/12/27(日) 00:48:15.94ID:JCBOGJxb
>>51
例えば?
2020/12/27(日) 12:32:57.26ID:VwRLyYFg
ワッフルワッフル
2020/12/27(日) 14:30:54.32ID:3O0UlW8w
>>52
Javaが筆頭やね
2020/12/27(日) 15:19:37.66ID:Xx+NlMtq
>>53
どこまでできた?
2020/12/27(日) 15:46:21.74ID:u2IOFb+r
>>51
最近のC++ってC#などから取り入れてる機能も多いだろ
2020/12/27(日) 17:47:43.17ID:3O0UlW8w
>>56
老いては子に教えられ、だね
2021/01/02(土) 18:40:40.10ID:89HkmNsX
>>54
Javaはねーわ
死にゆく言語筆頭じゃん
2021/01/03(日) 20:21:52.71ID:bRO3e+JV
Javaに限定してないが
2021/01/04(月) 04:06:06.18ID:vXy+uC1b
>>59
屁理屈言うなよ
2021/01/04(月) 09:13:24.81ID:v1M5xjgk
>>60
つまりJavaに続くクラスベースの他の言語もいずれ死にゆくからC++以外は学ばなくても良いと言いたいのか?
2021/01/04(月) 11:46:38.28ID:OpGFyjtN
死にゆくのが目に見えてる言語勧めるくらいならそうだろうな
で、Java以外にC++からcherry-pickした死の見えてる言語あるの?
2021/01/04(月) 19:44:51.64ID:RRkyDjZk
ちゃんとリファレンスも示したし、コンパイルのしかたも書いた。自分で学習して、他にもわからないことがあれば質問してね。
64デフォルトの名無しさん
垢版 |
2021/01/04(月) 20:38:52.91ID:wIiDK2+4
Javaの何が凄かったかって、文法がLALR(1)に収まってるんだよな。
文法を作ったことがあれば、天才にしか無理なことがわかるだろう。
そう、奴は本物の天才だ。
誰が作ったのか知らんけど。
65デフォルトの名無しさん
垢版 |
2021/01/04(月) 21:17:14.33ID:wIiDK2+4
割り切りもすごいよな。
プリミティブはコピー渡し、それ以外は参照渡し。
たしかにそれは良い考えだと思うけど、スパッと割り切ったのが凄いな。
我々がその立場なら同じことが出来ただろうか?

まあしかし、C++と比べるものではないよな。
対象領域が被ってるので比べたくなるが、狙いが違うので、綺麗に住み分けが出来ると思う。
2021/01/05(火) 00:51:36.88ID:BHDE7fBu
配置newはどんな時に使うの?
2021/01/05(火) 01:35:28.72ID:tS+yAQzd
>>64
メリットとしては
1. コンパイラがスッキリかける
2. コンパイラを動かすときのメモリが少なくて済む
3. コンパイラの実行速度が速い
が挙げられるけど
実行時のメリットはなんかあるの?
2021/01/05(火) 08:26:22.14ID:3Qznmkzr
>>66
std::vectorなどのコンテナの実装で使うよ。
2021/01/05(火) 12:00:55.46ID:BHDE7fBu
>>68
allocatorでメモリ確保して配置newで初期化?
2021/01/05(火) 16:39:04.88ID:A4RAMnFV
>>69
libc++のソース見ればわかるよ。
2021/01/05(火) 17:07:18.70ID:A4RAMnFV
char buf[sizeof(std::string)];
std::string *pstr = new(buf) std::string;
*pstr = "test";
std::puts(pstr->c_str());
pstr->~basic_string();

汚いコードだね。
2021/01/05(火) 18:13:27.15ID:Nygh6omE
何らかの連続したメモリーブロックを指すポインタがあって、そこをコンストラクタで初期化するときに使うんでないかい?
2021/01/06(水) 00:02:56.17ID:2hpPqzu4
ゲームエンジンの本によく書いてある、タスクシステムとかだろ

例えば、弾100個分のメモリを、事前にキープしておくとか。
1個ずつ確保すると、メモリの断片化が起こるから
2021/01/10(日) 23:10:15.53ID:AxUCQbZG
>>19
大なりと小なり逆だぞ
2021/01/11(月) 00:11:32.57ID:eNWdcNvL
これは恥ずかしい
2021/01/14(木) 16:10:21.69ID:t4C1HzYM
そうでもない
2021/01/14(木) 16:20:55.01ID:D3V1bvbS
足すと引く間違えてるようなもの
2021/01/15(金) 00:27:45.68ID:kCwrH4rk
だいな
2021/01/15(金) 00:29:11.34ID:kCwrH4rk
みっく
2021/01/15(金) 00:56:24.72ID:wdDcsVvR
ディスィザペーン
なんだバカヤロー
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況