C++相談室 part134
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part133 http://mevius.5ch.net/test/read.cgi/tech/1511509970/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 http://mevius.5ch.net/test/read.cgi/tech/1509780815/ ■長いソースを貼るときはここへ。■ http://codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>749 手っ取り早いのは「マシン語」を書いてみる、マシン語(アセンブリ言語)のルーチンを C にリンクさせる、ていうのが王道ですが、 昨今はマシン語のいい教科書がない、という気がします gcc のインラインアセンブラとかが有望だとは思いますが、まあ簡単にマシン語を記述している教材なんていうものが思いつかない、マシン語の需要というか動機がないのかもしれませんが >>750 うーむ、たしかに static を「ヒープ」とは言わないかもしれませんね… >>752 ありがとうございました。 マシン語の本を探してみます。 >>751 ありがとうございました。 本に書いていない場合には仕方がないのでネットで調べてみることにします。 どうだろ? C++ の言語仕様的にはオブジェクトの寿命に違いがあるだけで、 それを実現するメカニズムについては詳細な規定があるわけではない。 まずは C++ のパラダイムの中で理解を深めれば自然に理解できるんじゃないの? 手を広げすぎても収集が付かなくなる気もするんだけどなぁ。 マシン語に手を出すのは飛躍しすぎだしやめといた方がいい。ある程度C++になれてより深く理解したいと思うようになってからがいいよ。 動的、静的は大雑把に言えば、コンパイル時つまりソースを書いた時点で決まるものを静的、実行時に変化するものを静的と呼ぶ。 変数の型とかメモリ領域の確保の仕方とか、いろんな文脈で使われる。 >>756 決まる、決まらないの主語は何でしょうか? メモリについて知りたいんならC言語から始めたら良い Unixの移植目的で設計されたC言語は、実行効率のためほとんど必然的にメモリが透けて見える言語になったんである 『プログラミング言語C』という名著もある これの後ろの方のmalloc()の実装サンプルまで通読したら シングルCPUの範疇ならメモリについて嫌でもワカル 『プログラミング言語C++』と違って三日もあれば読めれる手頃な分量やしな! >>758 横だが。 何でも、だよ。 型なら静的型、動的型というし、メモリ確保なら静的確保、動的確保という。 マシン語は飛躍しすぎ。 CのエンハンスとしてC++を使うのならマシン語(インラインアセンブラ)もありだが、 C++をJava/C#/C++の並びで使うつもりならインラインアセンブラとか禁止でしょ。 というかそもそもその辺が分からない=全くの初心者がC++からやろうというのが間違い。 PythonかRubyあたりから始めとけ。(どっちも俺は知らんけど) コンパイラがコンパイル時に決めるものが静的、出来上がったプログラムを実行した時に決まるのが動的 C++だとそういう理解の方がわかりやすいと思う マクロ、テンプレート、constexpr、リテラル、式や変数や関数やクラスの宣言型なんかは静的 静的なものは全部コンパイラが決めるからプログラムの実行時にはいちいち計算しないし、バグで決められなかったらコンパイラが怒る 変数やインスタンスの中身、関数呼び出し、仮想クラスのオブジェクト型なんかは動的 実行環境や食わせた入力・ファイルなんかに依存するからプログラムを実行してみないと決まらない 動的なバグはコンパイラは感知できないから客先でプログラムを実行するとクラッシュする 適当だけどだいたいこんな感じ 細かいようだが、 コンパイル時に確定=静的 実行時に確定=動的(=コンパイル時に確定できない) で若干の例外(staticとか)があるが大体あってる。 「プログラミング言語C」はやめとけ。名著だが、あれは 「既にプログラミングを出来る人が、C言語を学ぶ」用であって、全くの初心者じゃ読めない。 「プログラミング言語C++」も止めとけ。あれも「既にCを使える人が…」で以下同文。 他本は総じてゴミなのも事実だが。 特定のアドレスにデータを配置して割り込みかける必要があるからじゃないだろか。 予約語のstaticは転用されまくってわけわからなくなってるので 「静的」とソースコード上のstaticは全く別物だと思った方がいい その辺整理されないんだろうかね そう言うものだという説明で 不本意ながら納得する事何十年 そんなに混乱するか?例外としてしまって問題ないと思うが。 俺は規格には詳しくないが、(というより色々混ざってしまっているが) ・Cのstatic関数=ファイルスコープに限定、externの反対 --- (A) はC++ではなんとかされたのではなかったっけ?(どうせ使わないからどうでもいいが) ・staticクラス、あるいはクラスのstaticメソッド --- (B) は「静的」で矛盾しないから、そもそも問題ない。 ・関数内static変数でプチグローバル(みたいなやつ) --- (C) も普通にクラスにしろ、って話でしかないし、使わないだろ。 結果、普通に使う分には特に混乱しないと思うが。 文法オタクは気にするのかもしれんが。 (C)は「動的関数にしよう」という意図があったのかもしれんが、 結局C/C++の世界は静的関数しかないから、意味無かったし。 というかそもそも俺は動的関数のメリットがよく分からん。 C#は動的関数だが、結局ロード/アンロードはアセンブリ単位=ほぼ起動時に纏めて、 であって、活用してない。 Javaは動的関数でメリットを享受してるんだっけ?(知らんから教えて) https://ideone.com/Epp30z お兄ちゃん助けて、コンパイルが通らないの。 VCで開発してます。 jsonのメモリーモデル研究にとりあえずシェアードPTRの組んでそれからやっぱユニークPTRの変更しました。 色々いじってるのですが、意味不明なエラーが出てさっぱりわかりません。 自前のコードなら自分でどうにかするのですが、コードステップするとライブラリの中でえらーおこしててさっぱりです。 どなたかご教示ください。お願いします。 std::vector<UniqueObject>にstd::pair<UniqueObject,UniqueObject>突っ込もうとしてんじゃん ちゃんとエラーメッセージ読めよ static関数は恐らくリンク工程がdynamicの場合があるため それに対してのstaticなんだろな 毎回思うんだけど、なんでgccで勉強しようとするんだろうな。 エラーメッセージ読めと言われても読めるわけがない。 一番わかりにくいメッセージを出すコンパイラで勉強する子が不憫でならない。 確かに書いてあるな。 じゃあエラーメッセージ読めよ。 いつも大量のWarningが出るのを真面目に対処せず放置してるからErrorが出ても理解できない罠 https://ideone.com/FN5IrI 理屈の一つは多分。 イニシャライザーリストが要素をconstで構築するからmoveできない? 内部でconst_castするわけないしこれ詰んでない? あるぅぇ〜。なんでじゃー。 static_castの動作内容は翻訳時に全て確定する dynamic_castの動作内容は実行時のvtableにより変化する static_assertは翻訳時に検査を行う assertは実行時に検査を行う static link libraryは翻訳時に結合する dynamic link libraryは実行時に読み込む どうやら >>740 の質問は C++ に限定した話ではないみたいだから、 C と C++ の両方を扱うスレッドに移動するのが良いんじゃないかな。 「Cの場合は…」「ここC++のスレッドだし」レベルの齟齬が避けられるし、 このスレッドを見てないC専門の人が有用な情報を持ってるかも知れん。 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 ttp://mevius.5ch.net/test/read.cgi/tech/1509780815/ スレを勃てるまでもないC/C++の質問はここで 25 ttp://mevius.5ch.net/test/read.cgi/tech/1471100645/ >>778 質問者はそれ以前の、プログラミング一般の「静的」「動的」の区別が付いてない。 スレ移動しても意味無い。というかどこのスレでも同じ。 C++のstaticは、Cのグダグダな仕様を引きずっているからおかしくなっているだけで、 C++で新たに設定されたstaticは他言語とも整合取れてる。 これに関しては「Cが悪い」でいいと思うよ。 説明している本が無いのは、そもそもそんなところで引っかからないだろう。 教習所でハイオクの話をしても意味無い。 一通り動く物を組めるようになるまではそれにフォーカスしろ、でいい。 静的動的の区別は大事だし引っかかりやすい所でもあるでしょ テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ 説明してる本がないって本当か?本当なら世の本がクソすぎる で、静的と動的の違いは何なんだよ。 ガンダムで説明してくれ。 ガンダムで説明できないうちは理解できてることにならないぞ。 >>783 じゃあお前が説明しろよ。 お前は馬鹿だから出来ないと思うがな。 そもそも>>763 は誰向けのレスだよ? コーディング規約にchar aznable禁止っていうのを見たことあるから C++にガンダム要素を入れるのはタブー >>780 > テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ ねえよ > 説明してる本がないって本当か?本当なら世の本がクソすぎる 世の本は概して糞だ。これは事実だ。 というかここら辺の認識がずれるのは世代ギャップだ。 現状の本を書いてきている世代は全員CをやってからC++をやっている。 だから「静的」「動的」の区別が付かない状態でテンプレートを触ることがなかった。 当然そこを解説した本もそんなにあるはずがない。 お前らの世代がCをやらずにいきなりC++を始め、それで色々苦労した経験があるのなら、 お前らの世代の連中が本を書かなければならない。ただそれ以前に、 俺はその必要(全くの初心者がCをやらずにC++を始める)があるとは思えないが。 入門書を書いている連中はプログラマでも宣教師でもなく、ただのテクニカルライタだ。 だから需要(売れる)があれば書くだけ。今無いのは需要がないと見られているから。 俺もこの見方については同意する。 最初のプログラミング言語がC++ってのは単純に選択を間違えてる。 C++とJavascript以外学ぶ必要があるとは思えない。 >>789 それはさすがに世間が狭すぎる 土方志望としてもJava程度は触っとけ Javaは当初の理念を失ってしまったように感じる。 JavaはJVM上で動く一言語に成り下がったからな みなさん、ありがとうございました。 カーニハン他の本をまず読んでみようと思います。 >>793 そうなんですか? Robert SedgewickらのAlgorithmsという教科書がJavaで書かれているため、 Javaの本も買って読んでいます。 ところで、学術的?な本では、オブジェクト指向言語としてC++かJavaが 大抵使われていますが、C#は使われていません。これはマイクロソフト という一企業が設計した言語だからでしょうか? たとえば、プログラミングコンテスト関係の本では大抵C++が使われています。 そういう理由から、本当はC++ではなくC# + Visual Studioを勉強したいのですが、 C++の本(ロベール)を買って読んでいます。 そのうち大抵の言語は経験なくてもリファレンス片手に使えるようになるから好きなもん使え >>796 なら素直にC#やっとけ。 その後に必要ならC++で何も問題ない。 C#は商業的につまずいたのでJavaほどの知名度はないが、 言語自体はJavaよりは断然いい。(後発だから当然だが) ねーねー。 STL作った人は、共産主義国で食中毒にあって、ベッドの上で朦朧とした頭で閃いたって話だった気がしたけど、どっかにその話のソースある? ググっても見つからないよー >>801 見つけてきたぞ。何処かで発表か何かするの? http://www.stlport.org/resources/StepanovUSA.html ところでこのインタビューにあるtamagawa numberってなんだろう 皆様ありがとーございます。 論文の枕で書こうかと思いまして char* str = "abc"; とは書かずに、 const char* str = "abc"; と常に書くようにと本に書いてあります。 理由は文字列リテラルは直接書き換えてはいけないからであると書かれています。 ●コンパイルは通っても、実行するとエラーになることもある。 ●同じ内容の他の文字列リテラルまで書き換えられてしまうことがある。 とも書かれています。 禁止されているにもかかわらず、コンパイルが通る可能性があるというのはどういう ことなのでしょうか? (1)コンパイルエラーが発生 (2)コンパイルは通るが実行するとエラーが発生 (3)コンパイルは通り、実行してもエラーが発生しないが、同じ内容の他の文字列 リテラルまで書き換えられてしまうという不具合が起こることがある。 コンパイラーの設計者には、(1)、(2)、(3)の選択肢があるのはなぜでしょうか? 禁止されているのだから、一律にコンパイルエラーにするのが自然に思われます。 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) const char* str = "abc"; const char ca[] = {'a', 'b', 'c', '\0'}; の二つは同じことだと思っていましたが、これは違うということでしょうか? const char* str = "abc"; では、"abc"をある場所に格納しておき、それを使いまわしたりすることがある ということでしょうか? 例えば、 const char* str1 = "abc"; const char* str2 = "abc"; と書いたときに、 str1 == str2 になることがあるということでしょうか? 一方、 const char ca1[] = {'a', 'b', 'c', '\0'}; const char ca2[] = {'a', 'b', 'c', '\0'}; と書いた場合には、それぞれ、別に格納場所が確保されるということでしょうか? 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) すみません。 カーニハンらの本の日本語版のp.127に書いてありました。 char amessage[] = "now is the time"; char *pmessage = "now is the time"; の違いについてです。 そして、文字列の内容を変えようとすると、その結果は不定となる と書かれいます。なぜ不定としているのかについては理由は書いてありません。 >>809 ありがとうございました。 故意に違反状態にするということもあるんですね。 正直言って無駄に分かりにくいところがあるんですね。 うん過去のもうメンテナンス不能なコードは膨大なんでそうするしか仕方ないんだよ >>810 旧K&Rつまり第一版は書換可能だったの >>807 ISO/IEC14882:2017 C.1.1の段落3で char* p = "abc"; // valid in C, invalid in C++ となっているので、C++ではコンパイルが通ってはいけない なぜ通ることがあるのかというと、 JIS X3014:2003 D.4で 定値文字列からの暗黙変換 文字列リテラルに対し,定値から非定値へ暗黙変換することは,推奨しない(4.2参照)。 となっており、C++03に従う限りコンパイルは通ることになっていた名残だ するなと言われてもスーパーセットなんだからC言語の記法がどこまで通じるかは重大な問題だと思う >>820 スーパーセットにするというよりは、 つかず離れずというポジションかなぁ。 C++ が先にやったのを C で取り入れたことも有るし。 可変長配列とか名前付きの構造体初期化とかc++に取り込まれたんだっけ? スーパーセットは20年前にとっくに終わったんじゃないかと。 すでに導入されてたらスマソ >>823 たぶん入ってないな。 可変長配列 (VLA) って確か C でもオプショナルに格下げされてただろ。 (C11 から) C++ のイニシャライザはだいぶん複雑になっちゃったから辻褄の合うようにするの大変だろうし、 もうやらないんじゃないかな。 実用レベルではほぼスーパーセットといっても差し支えない 実用レベル:=C++にも存在する機能に制限されたC C11の_GenericとかそれCで敢えてやる必要あるの?って思う 微妙に使い辛い機能だし分からんでもないけど、本当の名前がちゃんと見えてるのはちょっと安心感 >>828 スイッチで選択するのをスマートにした感じやな。 イマイチ〜〜。 テンプレート一個書いて複数にジェネレートさせる方が好み。 あるクラスAのラッパークラスWで A&を受け取る場合はWの全てのメソッドが使えて const A&を受け取る場合はWのconstメソッドだけが使えるように制限する設計って ありましたっけ? あとは operator -> でポインタ返すやり方とかだな >>831 制限っていうのは、コンパイルエラーにしたいの? A a0; const A a1; W w0(a0);//OK W w1(a1);//NG const W w2(a1);//OK const W w3(a0);//OK で、Wの非constメソッドには必ずconstメソッドが対応して存在している みたいな >>835 NGっていうのは、コンパイルエラーにしたいの? >>836 明確な欠点を指摘出来ない時に使う言葉だな 「ダサい」 クラスを W MutableW (変更可能なW) と分けるのがよく使われる現実的な解だと思う MutableW は W の派生型として実装すると楽 >>835 >で、Wの非constメソッドには必ずconstメソッドが対応して存在している この部分は意味不明なので聞かなかったことにしておく >>831 テンプレートにしておいて SFINAE で分岐するという方法はとれるが……。 C言語ってこんなので就職できるらしい… 【企業】「”C言語…?どこかで見た”程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる? https://asahi.5ch.net/test/read.cgi/newsplus/1522229305/ 本物のC++プログラマーを募集してる某社とはえらい違いだな >>843 言語ヲタなんてプロジェクトに一人いれば十分だし 兵隊は言語の知識よりコミュニケーション能力、報連相、Excel方眼紙スキルが大事よ 上司なんか関係ないやろ お客さんを味方に付けることや 上司も客も関係無いよバカども プログラミングの話だバカども visualstudio2017 Win32アプリケーションでSQLiteを使いたいのですが Nugetにそれらしきものが合ったのでインストールしようとしたのですが以下のエラーでインストールできません。 https://www.nuget.org/packages/SQLite/ パッケージ 'SQLite 3.13.0' をインストールできませんでした。このパッケージを 'native,Version=v0.0' を対象とするプロジェクトにインストールしようとしていますが、 そのフレームワークと互換性があるアセンブリ参照またはコンテンツ ファイルがパッケージに含まれていません。 どうすればよいのでしょうか。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる