おまいらがワイにC++を1から教えるスレ
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/12/02(水) 07:55:19.15ID:u3DezFu7 全くのプログラム初心者のワイにC++を1から教えてちょんまげ
30蟻人間 ◆T6xkBnTXz7B0
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
初めのうちは理解できないかもしれないが、さっと目を通してもらいたい。
(日本語)
https://ja.cppreference.com/w/cpp/io/c/fprintf
(英語)
https://en.cppreference.com/w/cpp/io/c/fprintf
初めのうちは理解できないかもしれないが、さっと目を通してもらいたい。
31蟻人間 ◆T6xkBnTXz7B0
2020/12/19(土) 14:50:34.47ID:/5LHU1jG リファレンスはここにある:
https://ja.cppreference.com
リファレンスを完全に理解すればおそらくC/C++の達人になれる。まずは「C言語リファレンス」の「言語」から順番に読み進めるとよいだろう。
https://ja.cppreference.com
リファレンスを完全に理解すればおそらくC/C++の達人になれる。まずは「C言語リファレンス」の「言語」から順番に読み進めるとよいだろう。
32蟻人間 ◆T6xkBnTXz7B0
2020/12/19(土) 14:58:13.77ID:/5LHU1jG オプションというのは、追加的な選択肢のことで、あってもなくてもいいものである。
戻り値とは関数の実行結果を返すためのものである。
例えば
int n;
n = printf("abc");
とすれば、nがprintf("abc")の"abc"の文字数3となる。
戻り値とは関数の実行結果を返すためのものである。
例えば
int n;
n = printf("abc");
とすれば、nがprintf("abc")の"abc"の文字数3となる。
33蟻人間 ◆T6xkBnTXz7B0
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などではセキュリティのために必要だが、コマンドプロンプトでは必要ない)。
...(中略)...
次にC言語ソースファイルhello.cを作成し、gcc -o hello hello.cを実行すればgccコンパイラがhello.exeを生成する。
C++では拡張子を.cppにしてg++コンパイラでコンパイルする: g++ -o hello hello.cpp
./helloを実行すると
Hello, world
と表示される。./は現在位置のフォルダ(ディレクトリ)を意味する(Bashなどではセキュリティのために必要だが、コマンドプロンプトでは必要ない)。
34蟻人間 ◆T6xkBnTXz7B0
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の特徴を調べて自分に合ったものを選ぶ必要がある。
C/C++でGUIを作るにはC++/Tcl、Win32API、MFC、WTL、GTK、wxWidgets、Qtなどを選び、言語とは別に学習する必要がある。
しかし、GUIの学習は難易度が高く、どれでもいい訳ではない。GUIの特徴を調べて自分に合ったものを選ぶ必要がある。
35蟻人間 ◆T6xkBnTXz7B0
2020/12/19(土) 18:36:05.93ID:/5LHU1jG 続きを読むには、「ワッフルワッフル」と書き込んで下さい。
2020/12/19(土) 19:23:29.77ID:Sj3ZjFN+
ワッフルワッフルワ
37蟻人間 ◆T6xkBnTXz7B0
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
を順番に実行して正しくインストールされているか確認して下さい。
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
を順番に実行して正しくインストールされているか確認して下さい。
38蟻人間 ◆T6xkBnTXz7B0
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
(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
39蟻人間 ◆T6xkBnTXz7B0
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をダブルクリックして動作を確認する。
(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をダブルクリックして動作を確認する。
40蟻人間 ◆T6xkBnTXz7B0
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をダブルクリックして前回と比較する。
(5.1) HelloWin32のリソースファイル「HelloWin32_res.rc」をリソーエディタで
開いてダイアログを編集し、同名で保存する。
例えばボタンの位置を移動させたり、サイズを変更したりする。
リソーエディタ
https://katahiromz.web.fc2.com/re/ja/
(5.2) $ make -j3を実行してリビルドする。新しいbuild/HelloWin32.exeができる。
(5.3) HelloWin32.exeをダブルクリックして前回と比較する。
41蟻人間 ◆T6xkBnTXz7B0
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版であり、メッセージボックスを表示するのに使う。
(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版であり、メッセージボックスを表示するのに使う。
42蟻人間 ◆T6xkBnTXz7B0
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に無視したいファイルやフォルダを指示するファイルである。
(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に無視したいファイルやフォルダを指示するファイルである。
43蟻人間 ◆T6xkBnTXz7B0
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を実行して動作を確認する。
(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は書かんよ
それとシープラプラの書式ならCと違ってmainの引数にvoidは書かんよ
45蟻人間 ◆T6xkBnTXz7B0
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アプリ」と呼ぶ。
(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アプリ」と呼ぶ。
47蟻人間 ◆T6xkBnTXz7B0
2020/12/19(土) 22:06:18.46ID:/5LHU1jG 定番のWin32学習サイト。
・MSDN
・EternalWindows
・猫でもできるプログラミング
・WisdomSoft(旧)
参考にしてね。
・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が筆頭やね
Javaが筆頭やね
2020/12/27(日) 15:46:21.74ID:u2IOFb+r
>>51
最近のC++ってC#などから取り入れてる機能も多いだろ
最近のC++ってC#などから取り入れてる機能も多いだろ
2020/12/27(日) 17:47:43.17ID:3O0UlW8w
>>56
老いては子に教えられ、だね
老いては子に教えられ、だね
2021/01/02(土) 18:40:40.10ID:89HkmNsX
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++以外は学ばなくても良いと言いたいのか?
つまりJavaに続くクラスベースの他の言語もいずれ死にゆくからC++以外は学ばなくても良いと言いたいのか?
2021/01/04(月) 11:46:38.28ID:OpGFyjtN
死にゆくのが目に見えてる言語勧めるくらいならそうだろうな
で、Java以外にC++からcherry-pickした死の見えてる言語あるの?
で、Java以外にC++からcherry-pickした死の見えてる言語あるの?
63蟻人間 ◆T6xkBnTXz7B0
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++と比べるものではないよな。
対象領域が被ってるので比べたくなるが、狙いが違うので、綺麗に住み分けが出来ると思う。
プリミティブはコピー渡し、それ以外は参照渡し。
たしかにそれは良い考えだと思うけど、スパッと割り切ったのが凄いな。
我々がその立場なら同じことが出来ただろうか?
まあしかし、C++と比べるものではないよな。
対象領域が被ってるので比べたくなるが、狙いが違うので、綺麗に住み分けが出来ると思う。
2021/01/05(火) 00:51:36.88ID:BHDE7fBu
配置newはどんな時に使うの?
2021/01/05(火) 01:35:28.72ID:tS+yAQzd
2021/01/05(火) 12:00:55.46ID:BHDE7fBu
>>68
allocatorでメモリ確保して配置newで初期化?
allocatorでメモリ確保して配置newで初期化?
71蟻人間 ◆T6xkBnTXz7B0
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();
汚いコードだね。
std::string *pstr = new(buf) std::string;
*pstr = "test";
std::puts(pstr->c_str());
pstr->~basic_string();
汚いコードだね。
72蟻人間 ◆T6xkBnTXz7B0
2021/01/05(火) 18:13:27.15ID:Nygh6omE 何らかの連続したメモリーブロックを指すポインタがあって、そこをコンストラクタで初期化するときに使うんでないかい?
2021/01/06(水) 00:02:56.17ID:2hpPqzu4
ゲームエンジンの本によく書いてある、タスクシステムとかだろ
例えば、弾100個分のメモリを、事前にキープしておくとか。
1個ずつ確保すると、メモリの断片化が起こるから
例えば、弾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
ディスィザペーン
なんだバカヤロー
なんだバカヤロー
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★2 [Hitzeschleier★]
- 「暖房が使えない」「食費が高くて子どもの栄養が…」 物価高に苦しむ子育て世帯、政府に期待する支援は [蚤の市★]
- 【米国】「トランプ・ゴールドカード」の受付開始 1億5600万円でアメリカの永住権を獲得 ウェブサイトで申し込み [ぐれ★]
- 【東京】テレ朝本社から社外スタッフの男性が転落し死亡 テレビ朝日がコメント 通行人の男性巻き込まれ軽傷 六本木 [ぐれ★]
- パワフル女性世界3位に高市首相 米誌フォーブス選出 [蚤の市★]
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★5 [BFU★]
- 高市「野党はもう債権とか為替の話はしないで!よく分からないから答えない!」 [884040186]
- エナジードリンク、危険だった。飲酒喫煙もせずランニングが趣味の54歳の若者が毎日たった8本飲むだけで脳卒中に [742348415]
- Twitter医師ら「死ぬほど勉強して博愛精神求められるとかそらみんな美容外科なるわ。嫌なら普通の医療も保険診療廃止しろ!」 [762037879]
- はるととかいうスマブラやってる不登校のガキしね
- 【サナ活】高市さん、米国でも大人気な模様。パワフル女性世界3位に高市首相 米誌フォーブス選出 [535898635]
- ホロライブvtuberさん、ソシャゲに登場するも演技力で界隈に衝撃が走る [329329848]
