X



C++相談室 part134
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 5fcb-Q2eK)
垢版 |
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の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
0752 ◆QZaw55cn4c (ワッチョイ ba60-fzSc)
垢版 |
2018/03/23(金) 20:45:34.35ID:J4dYcx4H0
>>749
手っ取り早いのは「マシン語」を書いてみる、マシン語(アセンブリ言語)のルーチンを C にリンクさせる、ていうのが王道ですが、
昨今はマシン語のいい教科書がない、という気がします

gcc のインラインアセンブラとかが有望だとは思いますが、まあ簡単にマシン語を記述している教材なんていうものが思いつかない、マシン語の需要というか動機がないのかもしれませんが
0755はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-zkh5)
垢版 |
2018/03/23(金) 22:32:48.28ID:ehYNLgPn0
どうだろ?
C++ の言語仕様的にはオブジェクトの寿命に違いがあるだけで、
それを実現するメカニズムについては詳細な規定があるわけではない。

まずは C++ のパラダイムの中で理解を深めれば自然に理解できるんじゃないの?
手を広げすぎても収集が付かなくなる気もするんだけどなぁ。
0756デフォルトの名無しさん (アウアウカー Sac3-E6if)
垢版 |
2018/03/23(金) 22:56:58.27ID:io4DvPx8a
マシン語に手を出すのは飛躍しすぎだしやめといた方がいい。ある程度C++になれてより深く理解したいと思うようになってからがいいよ。

動的、静的は大雑把に言えば、コンパイル時つまりソースを書いた時点で決まるものを静的、実行時に変化するものを静的と呼ぶ。
変数の型とかメモリ領域の確保の仕方とか、いろんな文脈で使われる。
0759デフォルトの名無しさん (ワッチョイ 7abd-aumg)
垢版 |
2018/03/24(土) 00:54:38.69ID:LvcaB4Q+0
メモリについて知りたいんならC言語から始めたら良い
Unixの移植目的で設計されたC言語は、実行効率のためほとんど必然的にメモリが透けて見える言語になったんである
『プログラミング言語C』という名著もある
これの後ろの方のmalloc()の実装サンプルまで通読したら
シングルCPUの範疇ならメモリについて嫌でもワカル

『プログラミング言語C++』と違って三日もあれば読めれる手頃な分量やしな!
0760デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 01:27:57.09ID:eFb1d56B0
>>758
横だが。

何でも、だよ。
型なら静的型、動的型というし、メモリ確保なら静的確保、動的確保という。

マシン語は飛躍しすぎ。
CのエンハンスとしてC++を使うのならマシン語(インラインアセンブラ)もありだが、
C++をJava/C#/C++の並びで使うつもりならインラインアセンブラとか禁止でしょ。

というかそもそもその辺が分からない=全くの初心者がC++からやろうというのが間違い。
PythonかRubyあたりから始めとけ。(どっちも俺は知らんけど)
0761デフォルトの名無しさん (ワッチョイ 36e7-0D9k)
垢版 |
2018/03/24(土) 01:40:25.62ID:nPxx/G4d0
コンパイラがコンパイル時に決めるものが静的、出来上がったプログラムを実行した時に決まるのが動的
C++だとそういう理解の方がわかりやすいと思う

マクロ、テンプレート、constexpr、リテラル、式や変数や関数やクラスの宣言型なんかは静的
静的なものは全部コンパイラが決めるからプログラムの実行時にはいちいち計算しないし、バグで決められなかったらコンパイラが怒る

変数やインスタンスの中身、関数呼び出し、仮想クラスのオブジェクト型なんかは動的
実行環境や食わせた入力・ファイルなんかに依存するからプログラムを実行してみないと決まらない
動的なバグはコンパイラは感知できないから客先でプログラムを実行するとクラッシュする

適当だけどだいたいこんな感じ
0762デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 02:04:25.06ID:eFb1d56B0
細かいようだが、

コンパイル時に確定=静的
実行時に確定=動的(=コンパイル時に確定できない)

で若干の例外(staticとか)があるが大体あってる。

「プログラミング言語C」はやめとけ。名著だが、あれは
「既にプログラミングを出来る人が、C言語を学ぶ」用であって、全くの初心者じゃ読めない。
「プログラミング言語C++」も止めとけ。あれも「既にCを使える人が…」で以下同文。
他本は総じてゴミなのも事実だが。
0763デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 02:06:26.05ID:Z79Bg+7E0
特定のアドレスにデータを配置して割り込みかける必要があるからじゃないだろか。
0766デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 02:29:56.73ID:eFb1d56B0
そんなに混乱するか?例外としてしまって問題ないと思うが。
俺は規格には詳しくないが、(というより色々混ざってしまっているが)

・Cのstatic関数=ファイルスコープに限定、externの反対 --- (A)
 はC++ではなんとかされたのではなかったっけ?(どうせ使わないからどうでもいいが)
・staticクラス、あるいはクラスのstaticメソッド --- (B)
 は「静的」で矛盾しないから、そもそも問題ない。
・関数内static変数でプチグローバル(みたいなやつ) --- (C)
 も普通にクラスにしろ、って話でしかないし、使わないだろ。

結果、普通に使う分には特に混乱しないと思うが。
文法オタクは気にするのかもしれんが。

(C)は「動的関数にしよう」という意図があったのかもしれんが、
結局C/C++の世界は静的関数しかないから、意味無かったし。
というかそもそも俺は動的関数のメリットがよく分からん。
C#は動的関数だが、結局ロード/アンロードはアセンブリ単位=ほぼ起動時に纏めて、
であって、活用してない。
Javaは動的関数でメリットを享受してるんだっけ?(知らんから教えて)
0767デフォルトの名無しさん (ワッチョイ a304-h0dl)
垢版 |
2018/03/24(土) 02:33:41.17ID:y/z0A0hW0
https://ideone.com/Epp30z
お兄ちゃん助けて、コンパイルが通らないの。

VCで開発してます。
jsonのメモリーモデル研究にとりあえずシェアードPTRの組んでそれからやっぱユニークPTRの変更しました。
色々いじってるのですが、意味不明なエラーが出てさっぱりわかりません。
自前のコードなら自分でどうにかするのですが、コードステップするとライブラリの中でえらーおこしててさっぱりです。
どなたかご教示ください。お願いします。
0771デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 03:55:06.40ID:Z79Bg+7E0
毎回思うんだけど、なんでgccで勉強しようとするんだろうな。
エラーメッセージ読めと言われても読めるわけがない。
一番わかりにくいメッセージを出すコンパイラで勉強する子が不憫でならない。
0772デフォルトの名無しさん
垢版 |
2018/03/24(土) 04:28:06.63
>>771
VCで開発って書いてんだろーが
0773デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 04:30:46.18ID:Z79Bg+7E0
確かに書いてあるな。
じゃあエラーメッセージ読めよ。
0775デフォルトの名無しさん
垢版 |
2018/03/24(土) 06:12:32.26
いつも大量のWarningが出るのを真面目に対処せず放置してるからErrorが出ても理解できない罠
0777デフォルトの名無しさん (ワッチョイ f397-zkh5)
垢版 |
2018/03/24(土) 06:25:04.10ID:0qB0BmlJ0
static_castの動作内容は翻訳時に全て確定する
dynamic_castの動作内容は実行時のvtableにより変化する

static_assertは翻訳時に検査を行う
assertは実行時に検査を行う

static link libraryは翻訳時に結合する
dynamic link libraryは実行時に読み込む
0778デフォルトの名無しさん (ワッチョイ a393-4ZrE)
垢版 |
2018/03/24(土) 06:57:20.04ID:XPzSeRia0
どうやら >>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/
0779デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 09:00:52.23ID:eFb1d56B0
>>778
質問者はそれ以前の、プログラミング一般の「静的」「動的」の区別が付いてない。
スレ移動しても意味無い。というかどこのスレでも同じ。

C++のstaticは、Cのグダグダな仕様を引きずっているからおかしくなっているだけで、
C++で新たに設定されたstaticは他言語とも整合取れてる。
これに関しては「Cが悪い」でいいと思うよ。

説明している本が無いのは、そもそもそんなところで引っかからないだろう。
教習所でハイオクの話をしても意味無い。
一通り動く物を組めるようになるまではそれにフォーカスしろ、でいい。
0780デフォルトの名無しさん (ワッチョイ 36e7-0D9k)
垢版 |
2018/03/24(土) 09:28:18.28ID:nPxx/G4d0
静的動的の区別は大事だし引っかかりやすい所でもあるでしょ
テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ

説明してる本がないって本当か?本当なら世の本がクソすぎる
0781デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 10:20:48.01ID:Z79Bg+7E0
で、静的と動的の違いは何なんだよ。
ガンダムで説明してくれ。
0783デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 10:38:33.14ID:Z79Bg+7E0
ガンダムで説明できないうちは理解できてることにならないぞ。
0788デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 11:28:25.89ID:eFb1d56B0
>>780
> テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ
ねえよ

> 説明してる本がないって本当か?本当なら世の本がクソすぎる
世の本は概して糞だ。これは事実だ。

というかここら辺の認識がずれるのは世代ギャップだ。
現状の本を書いてきている世代は全員CをやってからC++をやっている。
だから「静的」「動的」の区別が付かない状態でテンプレートを触ることがなかった。
当然そこを解説した本もそんなにあるはずがない。

お前らの世代がCをやらずにいきなりC++を始め、それで色々苦労した経験があるのなら、
お前らの世代の連中が本を書かなければならない。ただそれ以前に、
俺はその必要(全くの初心者がCをやらずにC++を始める)があるとは思えないが。

入門書を書いている連中はプログラマでも宣教師でもなく、ただのテクニカルライタだ。
だから需要(売れる)があれば書くだけ。今無いのは需要がないと見られているから。
俺もこの見方については同意する。
最初のプログラミング言語がC++ってのは単純に選択を間違えてる。
0789デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 11:30:12.41ID:Z79Bg+7E0
C++とJavascript以外学ぶ必要があるとは思えない。
0791デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 12:18:09.21ID:Z79Bg+7E0
Javaは当初の理念を失ってしまったように感じる。
0794デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/24(土) 18:05:30.46ID:upExxHyGa
みなさん、ありがとうございました。

カーニハン他の本をまず読んでみようと思います。

>>793

そうなんですか?

Robert SedgewickらのAlgorithmsという教科書がJavaで書かれているため、
Javaの本も買って読んでいます。

ところで、学術的?な本では、オブジェクト指向言語としてC++かJavaが
大抵使われていますが、C#は使われていません。これはマイクロソフト
という一企業が設計した言語だからでしょうか?
0800デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 18:50:18.42ID:eFb1d56B0
>>796
なら素直にC#やっとけ。
その後に必要ならC++で何も問題ない。

C#は商業的につまずいたのでJavaほどの知名度はないが、
言語自体はJavaよりは断然いい。(後発だから当然だが)
0801デフォルトの名無しさん (スププ Sdba-kSjP)
垢版 |
2018/03/24(土) 19:07:41.38ID:weQnYJFBd
ねーねー。
STL作った人は、共産主義国で食中毒にあって、ベッドの上で朦朧とした頭で閃いたって話だった気がしたけど、どっかにその話のソースある?
ググっても見つからないよー
0807デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/25(日) 11:36:01.08ID:Lywxeunja
char* str = "abc";

とは書かずに、

const char* str = "abc";

と常に書くようにと本に書いてあります。

理由は文字列リテラルは直接書き換えてはいけないからであると書かれています。

●コンパイルは通っても、実行するとエラーになることもある。
●同じ内容の他の文字列リテラルまで書き換えられてしまうことがある。

とも書かれています。

禁止されているにもかかわらず、コンパイルが通る可能性があるというのはどういう
ことなのでしょうか?

(1)コンパイルエラーが発生
(2)コンパイルは通るが実行するとエラーが発生
(3)コンパイルは通り、実行してもエラーが発生しないが、同じ内容の他の文字列
リテラルまで書き換えられてしまうという不具合が起こることがある。

コンパイラーの設計者には、(1)、(2)、(3)の選択肢があるのはなぜでしょうか?

禁止されているのだから、一律にコンパイルエラーにするのが自然に思われます。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0808デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/25(日) 11:39:58.12ID:Lywxeunja
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)
0810デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/25(日) 11:44:30.72ID:Lywxeunja
すみません。
カーニハンらの本の日本語版のp.127に書いてありました。

char amessage[] = "now is the time";
char *pmessage = "now is the time";

の違いについてです。

そして、文字列の内容を変えようとすると、その結果は不定となる

と書かれいます。なぜ不定としているのかについては理由は書いてありません。
0814デフォルトの名無しさん
垢版 |
2018/03/25(日) 13:01:03.23
C++相談室で出す話題でもなかろに
0818デフォルトの名無しさん
垢版 |
2018/03/25(日) 15:22:53.51
C++スレでK&Rの話すんなや
0819デフォルトの名無しさん (ワッチョイ f397-zkh5)
垢版 |
2018/03/25(日) 17:38:21.10ID:S7OmeNGW0
>>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に従う限りコンパイルは通ることになっていた名残だ
0823デフォルトの名無しさん (ブーイモ MMe7-Dh3i)
垢版 |
2018/03/25(日) 18:55:57.82ID:HW+VfLnzM
可変長配列とか名前付きの構造体初期化とかc++に取り込まれたんだっけ?
スーパーセットは20年前にとっくに終わったんじゃないかと。

すでに導入されてたらスマソ
0824はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-zkh5)
垢版 |
2018/03/26(月) 05:22:15.91ID:S9VCdiyC0
>>823
たぶん入ってないな。

可変長配列 (VLA) って確か C でもオプショナルに格下げされてただろ。 (C11 から)
C++ のイニシャライザはだいぶん複雑になっちゃったから辻褄の合うようにするの大変だろうし、
もうやらないんじゃないかな。
0826デフォルトの名無しさん
垢版 |
2018/03/26(月) 11:51:36.03
実用レベルではCがC++のサブセットだし🙄
0831デフォルトの名無しさん (ワッチョイ b69b-g2oz)
垢版 |
2018/03/27(火) 01:36:13.83ID:tW2Kdf3t0
あるクラスAのラッパークラスWで
A&を受け取る場合はWの全てのメソッドが使えて
const A&を受け取る場合はWのconstメソッドだけが使えるように制限する設計って
ありましたっけ?
0834デフォルトの名無しさん
垢版 |
2018/03/27(火) 06:53:48.55
>>831
制限っていうのは、コンパイルエラーにしたいの?
0837デフォルトの名無しさん
垢版 |
2018/03/27(火) 07:35:02.82
>>835
NGっていうのは、コンパイルエラーにしたいの?
0840デフォルトの名無しさん (ワッチョイ 0723-14g7)
垢版 |
2018/03/27(火) 11:34:17.37ID:bA2HN2rY0
クラスを
W
MutableW (変更可能なW)

と分けるのがよく使われる現実的な解だと思う
MutableW は W の派生型として実装すると楽

>>835
>で、Wの非constメソッドには必ずconstメソッドが対応して存在している

この部分は意味不明なので聞かなかったことにしておく
0843デフォルトの名無しさん (アウアウウー Sac7-fzSc)
垢版 |
2018/03/28(水) 18:32:49.43ID:rzqMRle+a
C言語ってこんなので就職できるらしい…

【企業】「”C言語…?どこかで見た”程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる?
https://asahi.5ch.net/test/read.cgi/newsplus/1522229305/

本物のC++プログラマーを募集してる某社とはえらい違いだな
0845デフォルトの名無しさん
垢版 |
2018/03/28(水) 20:50:12.70
>>843
言語ヲタなんてプロジェクトに一人いれば十分だし

兵隊は言語の知識よりコミュニケーション能力、報連相、Excel方眼紙スキルが大事よ
0848デフォルトの名無しさん
垢版 |
2018/03/28(水) 22:29:42.33
上司なんか関係ないやろ

お客さんを味方に付けることや
0850デフォルトの名無しさん (ワッチョイ a37f-zkh5)
垢版 |
2018/03/28(水) 22:46:49.55ID:2H+8IznE0
上司も客も関係無いよバカども
プログラミングの話だバカども
0852デフォルトの名無しさん (ワイモマー MMb3-TX0Y)
垢版 |
2018/03/29(木) 00:40:46.75ID:zCjdEvGWM
visualstudio2017 Win32アプリケーションでSQLiteを使いたいのですが
Nugetにそれらしきものが合ったのでインストールしようとしたのですが以下のエラーでインストールできません。
https://www.nuget.org/packages/SQLite/

パッケージ 'SQLite 3.13.0' をインストールできませんでした。このパッケージを 'native,Version=v0.0' を対象とするプロジェクトにインストールしようとしていますが、
そのフレームワークと互換性があるアセンブリ参照またはコンテンツ ファイルがパッケージに含まれていません。

どうすればよいのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています

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