【初心者歓迎】C/C++室 Ver.106【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 http://codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1556142878/ C++のenumの仕様について質問させてください enum Aとenum Bが定義されていた時、 void func(enum A); void func(enum B); のようにオーバーロードできるでしょうか。 最近C++勉強し始めて疑問に思ったので教えて下さい std::vector<int>vec; auto result = std::find(vec.begin(), vec.end(),3); 上記のようにvectorを宣言だけで初期化せずにfind関数内でbegin()、end()を使用しても例外が発生しません これは範囲外の要素にアクセスしているわけじゃないという理解でよろしいでしょうか そうだね というか最初はbegin=endだから、findで一度もループ処理が発生しないだけ >>68 自分で明示的に初期化していないだけで、vectorの変数を宣言しただけで勝手に(サイズが0のvectorとして)初期化してくれる。 vectorのコンストラクタがそれをやってくれている。 >>69-70 わかりやすい説明ありがとうございました なんかスッキリしました #include <vector> #include <algorithm> #include <iostream> int main() { std::vector<int>vec; vec.reserve(10); auto result = std::find(vec.begin(), vec.end(),3); std::vector<int>vec2; vec2.resize(10); auto result2 = std::find(vec2.begin(), vec2.end(),3); return 0; } 下火っていうか 調理場にあるラップのようなもので特に意識されることはないけど欠かすことのできないもの でもラップを使った料理っていうとどうしてもお手軽感がぬぐえない プロの調理師はこういうものはできるだけ人目につかないようにする 聞き方が悪かった boostは習熟したほうがいいですか? boostじゃなくても同じことが出来るものがあったら後者を選ぶな なんでだろ自分でもわからんω いまならasioなどのために使うのでは。 そしてネットワーキングTSが標準に入ると、また使わなくなる。 そういうサイクルがあるのでは。 >>42 win32api使うならTCHAR使いましょうよ MBCS対応する気ないならTCHAR使う意味ないよ MBCS_Support_Deprecated_In_MFCだし WCHAR決め打ちで行くんならDrawTextWにしないと >>86 wchar_tでいいよ ちなみに>>84 みたいなのはバカのやること Debianがgcc8なのでfilesystemをboostのほう使うとか。 互換性が動機という場合もありますね。 C++ の仕様に関する質問です。 OpenGL では、 typedef unsigned char GLboolean; #define GL_FALSE 0 #define GL_TRUE 1 void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); となっていますが、 glVertexAttribPointer(locAttr, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); と書いた場合、第四引数の GL_FALSE は 0 なので、int 型の整数リテラル(32BIT)ですが、対応する仮引数は、 GLboolean 型(8BIT)となっています。 overload resolution で、best matching アルゴリズムで最適な関数を探す際、対象の関数のプロトタイプ宣言の仮引数の型と 実引数の型を比較して、1つでも型が不適格のものが見つかった場合、「viable function」ではないとみなされ、候補から除外されます。 例として、unsigned char 型の仮引数に、int 型の変数を渡そうとすれば、不適格に成り、その関数は対象から除外されます。 しかし、この場合の様に、0 や 1 という整定値ならどうなるでしょうか。つまり、 unsigend char 型の仮引数に int 型の整数であるところの 0 という整数リテラルが、「適合」するというのは、 正しい仕様でしょうか? その関数はCの関数なので、そもそもマンぐり返されてないし、より適合するオーバーロード関数の存在なんて考慮してないんじゃね? >>94 > unsigned char 型の仮引数に、int 型の変数を渡そうとすれば、不適格に成り、その関数は対象から除外されます。 これが誤解なのでは? 暗黙変換されるでしょ。 >>96 確認しました。charの仮引数の場所に、int 変数を実引数にして渡しても、 エラーも警告も出ませんでした。 関数呼び出しだけでなく、 int i = 0x123456; char c = i; としてもエラーも警告も出ませんでした。 テストは、VS2019のC++で行いました。 整数型同士はどの組み合わせでも暗黙の型変換はされるんじゃね。 変換後の型が符号付きかつ、変換後の型が表現できる範囲に収まらない値だったときの挙動が未定義ではあるので、 狭い方向への変換のときに警告くらいは出してくれることもあるみたいだが、 オーバーロードの解決の際に排除されることはない。 >>98 ついでに、お聞きしたいのですが、 class CBase {・・・}; class CDerived : public CBase {・・・}; の場合、 CDerive* ---> CBase* への変換は標準変換は有りますが、 CBase* ---> CDerive* への変換は標準変換は有りませんよね。 しかし、 CBase *pBase; に対して、 (CDerived*)pBase というcastは、down castであり、気をつけなければならないキャストではありますが、組み込みのcastとして、 どのコンパイラでもサポートしています。 (この場合、型の解釈の変更だけでなく、マシン語レベルでの生の値も、offset分だけ変更になることがあるのは 周知の通りです。) ということは、標準変換ではないにも関わらず、キャストではなぜかサポートしていると言うことになるのでしょうか? >>97 viable function とか言うから規格上の確認がしたいのかと思ってたけど、そこは実験でいいのか。 >>100 draftを見たら、実引数から仮引数への標準変換が有る場合には、暗黙の型変換 となりえて、viable function となり、かつ、標準変換には char ---> int だけでなく、int ---> char の変換も含まれているらしいことが 分かりましたが、確認のため、VC++ 2019でチェックしてみました。 >>101 やはり、「(型)値」の形式を筆頭とする明示的型変換には、標準変換以外でも 「組み込みの変換(キャスト)」 が有るのかも知れませんね。 これは始めて知りました。 >>102 最後、何が言いたいかと言うと、 『「組み込みの変換」には、「標準変換」には含まれていない変換も含まれている。』 ということです。 CBase*--->CDerived* は、「標準変換」には含まれていませんが、「組み込みの変換」には含まれているということです。 また、それとは別に、int--->charは、危険を招くことがあるにも関わらず、「標準変換」 に含まれてしまっていると言うことです。 CBase* は CDerived* から変換したものかもしれないから変換可能なのが自然だろう。アップキャストとは違って暗黙にはされないし。 C式のキャストはチェックは継承関係をチェックしないがC++のキャストはするしな。 char と int は cast されてる訳じゃないからな みなさま、色々と有難うございました。 今回はこれで質問を閉じたいと思います。 回答ありがとうございます 使って人いて安心しました 自分は構造体で間に合ってるからまだタプルの恩恵に与ったことない 超ド素人の質問ですみません。 https://stackoverflow.com/questions/18647965/createprocess-problems-when-using-proc-thread-attribute-preferred-node-or-proc-t このURLのサンプルコードをコンパイルすると、以下のエラーが発生します。 引数の型がおかしいんでしょうか? 何が悪いのか?どう修正したら良いかわかりません。教えて下さい。 [bcc32c エラー] File1.cpp(37): no matching function for call to 'InitializeProcThreadAttributeList' processthreadsapi.h(650): candidate function not viable: no known conversion from 'std::size_t *' (aka 'unsigned int *') to 'PSIZE_T' (aka 'unsigned long *') for 4th argument このURLの中の質問者の現象の再現をしたいのです。 読んだままだろ cbの型が合っていないといっているからcbの型をSIZE_Tにすりゃ良いんでないかい ほうほう。で、どうやって? 言っとくが私はC言語をポインタで挫折した男だ!! PSIZE_Tとやらじゃね main関数の中の size_t cb; これを PSIZE_T cb; にするだけ? >>117 ありがとう。 でもエラーが以下に変わっただけでした。 processthreadsapi.h(650): candidate function not viable: no known conversion from 'PSIZE_T *' (aka 'unsigned long *') to 'PSIZE_T' (aka 'unsigned long *') for 4th argument あ、PSIZE_Tじゃなくて、SIZE_Tにしたら行けました!! 大文字小文字の間違いだったってことですか? とにかくありがとうございました!! 変数やら関数にtemplate指定するのに一々上に記述するのが面倒なんですが、スコープ内で一括指定するみたいな記法ってありますか? typedef HogeT<Fuga> Piyo; とかこういうこと? typedef でも害はないけどusing を使うのがモダンな方法やぞ。 C と共用するヘッダファイル (または C++11 未満の規格に従わざるを得ない場合) を除いては typedef を使う理由はもう無い。 template<typename foo> foo bar[256]; template<typename foo> foo baz(); を仮に template<typename foo>{ foo bar[256]; foo baz(); } みたいな感じで 列挙型を宣言した後に構造体型で列挙型の変数を作成、 列挙型の変数はキーボードから入力できないので、構造体型にキーボードから入力するための変数を作成、 その値によって列挙型の変数に代入、 動的にメモリを確保して列挙型を入力、後に出力 これが上手く動作しないです助けてください #include<iostream> using namespace std; enum Type{Tec, Des, NA}; struct Human{ Type type; char ans; }; int n; char* pA; void dataInput(Type& tp){ for(int i=0;i<n;i++){ cin>>tp.ans; pA[i]=tp.ans;} } void showData(Type& tp); int main(){ cin>>n; pA=new char[n]; Type tp; dataInput(tp); showData(tp); return 0;} void showData(Type& tp){ for(int j=0;j<n;j++){ cout << pA[j] << "\n";} } 複数のLEDをリズミカルに光らせるプログラムを書いております。 現在は赤、青2色で色々遊んでおります。 '' __delay_ms(100);'' って感じの関数(用語?)を覚えまして、各パート毎に点灯時間、消灯時間を打ち込みました。 で、実行してみた所、1パートの青LEDが全て点滅し終わった後で2パートの赤LEDの 点滅に移る形になってしまいました。 赤、青LEDには各1個づつPICマイコンのピンを振ってありますので スタティック制御ができるんだと思いますが、その制御(点滅)を同時に開始出来る 文(?)を教えて頂きたいと思います。 よろしくお願いします。 >>129 PICの質問なら電気電子板の方が良いぞ tp.ansで入力された値によって対応した識別子を出力させたいのですが、charでは1文字しか出力できないので手詰まりになってます。どなたかご助言頂けないでしょうか。 >>132 これじゃダメ? #include <iostream> #include <string_view> enum class Type{ Tec, Des, NA }; struct Human{ Type type; } Type to_type(std::string_view s) noexcept { if (s == "Tec") : return Type::Tec; if (s == "Des") : return Type::Des; // Expects(s == "NA"); return Type::NA; } std::string to_string(Type t) { if (t == Type::Tec) return "Tec"; if (t == Type::Des) return "Des"; return "NA"; } int main() { int n; std::cin >> n; // サイズとか要らないので読み飛ばす std::string str; std::cin >> str; auto data = to_type(str); // 列挙型にして保持 std::cout >> to_string(data) >> '\n'; // 文字列型にして出力 } >>133 アドバイスありがとうございますm(_ _)m ごめんなさい!_が何かは理解できましたが、autoが難解でよくわかりませんでした... mainのスレッドをCPUハグなしに無限に一時停止しておく方法はありますか? >>136 目いっぱいsleep_forしてループで回す >>136 無限に実行されるサブスレッドの終了を待つ。 mainからWinMainを呼ぶことも可能 WinMainが動いてる間はmainは止まってるよ 強制的に一時停止させるならPauseキー cmakelistsでメモリ関連の設定の仕方をご教授いただけないでしょうか。 linuxでvswprint()使ってみたんだが、事前に必要なバッファサイズがわからない場合の求め方がわからん。 1. vsnprintf() と同じように nullptr を渡してみた ⇒必要サイズじゃなくてエラーの-1が返ってきた 2. 仮のサイズで呼び出して領域不足のエラーなら増やす方針にした ⇒エラーが領域不足なのか他のエラーなのか見分けがつかない(errno=0のまま) どうすりゃいいんだろう? cppreferenceにはエラーが消えるまで再確保&呼び出しやり直す必要があるかもねって書いてある C++のコードを拾ってきてコンパイルしたら、構造体の初期化で non-trivial designated initializers not supported というエラーになってしまいます。 例えば typedef struct _Hoge { int a; int b; int c; } Hoge; みたいなときに Hoge hoge = { .b = 1, .c = 2, }; みたいにメンバーが省略されていると駄目のようです。 でも元のプロジェクトではコンパイルできてるっぽいです。 自分の側では諸般の事情(?)でg++ 7.5.0で-std=c++1zでコンパイルしています。 上記のエラーを避けるにはどういう方法があるでしょうか? >>148 C++ の規格としてその書き方が採用されたのは C++20 から。 (余談だが C だと C99 から出来る。) それらの規格に準拠したコンパイラ (より新しいバージョンの g++) を用意するか、 でなければ古いスタイルの書き方で初期化するしかないという普通のことしか言えぬ。 >>149 どうもです。いえ、何かコンパイラーオプションとかあるのかなと思いまして。 ちなみに新しい書き方の場合 1. 全ての要素を 2. 宣言と同じ要素順序で初期化 しないといけない、で正解ですかね? 1.の縛りは未初期化要素を避けるため? とりあえず Hoge hoge; hoge.b = 1; とか書き直して逃げておこうかと思います。 >>147 ありがとう。なるほど、代替手段が無いとも書いてあるね。 formatにエラーがある場合はどこかで打ち切らなきゃならないか。 >>150 > 1. 全ての要素を いいえ。 要素の初期化を一部省略して書いた場合は デフォルトメンバ初期化子 (があればそれ) で初期化するか あたかも {} が与えられたかのようになります。 つまり >>148 の例でいえばデータメンバ a は 0 で初期化される ことが保証されます。 > 2. 宣言と同じ要素順序で初期化 はい。 その通りです。 どうしてこのような制限を入れたのかきちんと議論をみたわけではありませんが、 コンストラクタのメンバ初期化子リストは自由な順序で書けるが 実際の初期化順序は宣言の順序になるというルールが微妙にイケてなかったことの 反省なんじゃないかなと想像します。 gdb で、カレントディレクトリに .gdbinit を作って "b func" を記述したんですが、 funcが共有ライブラリの中にあると、funcがまだロードされてないので無視されますよね? 対話的に追加する場合はyを押して強制追加できますが、.gdbinit の中だとデフォでnが 選ばれるようです。.gdbinit の中での強制(自動)追加は可能でしょうか? ちなみに ~/.gdbinit で add-auto-load-safe-path というのはやってあります。 ググったらありそうですが見つけられず... お願いします。 「C++には特にこれ!と言えるような入門書がない」という書き込みを見たのですが、そうだとしたらC++を習得した人は初学者のときどうやって技術を身につけていったのでしょうか? 「ロベールのC++入門講座(ロベール著)」と「明解C++入門編(柴田望洋著)」を買ったけどこれでいいのかな… >>154 絶対確実というようなものは挙げられないけど、ほどほどのものはたくさんあるよ。 1. 既に C を覚えて使いこなしてた 2. Eiffel を学んだ 3. C++ は better than C として使った 4. template を学んだ 5. Perl を学んだ 6. Python を学んだ 7. D を学んだ 8. C# 悪くないね >>155 C++ の規格はちょくちょく改定されてて、特に 2011 年の改定はインパクトが強かったんだ。 入門の範囲にすらいくらかの影響がある程度には。 それより古い本だと (今となっては) 不格好なスタイルになっているかもしれない。 >>156 なるほど ほどほどのもので学んでいった感じですかね >>158 参考になります! ありがとうございます >>158 私は、もう年を取ってもう新しい規格にはついていけないと悟ったので、せめて初心者のための本を買ってレビューする余生を過ごそうと思っています そういえば江添本を放置してましたね、10/4 の資格試験が終わったら、あらためて江添本をレビューするつもりです 今読んでいる入門書の例題です 時間計算機で9時45分の1時間25分後を計算するには以下のように入力します 945+125= 11:10 http://codepad.org/jOsbQgsX ところが実行してみるとVC++では0:10、mingwでは0:70という結果が出ます 掲載されたソースと見比べても違いはないようなのでお手上げです 教えて下さい >>161 addclockとsubclockにリターン値がないよ return hour * 100 + minute; が必要なんじゃないの? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる