X



【初心者歓迎】C/C++室 Ver.103【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0515デフォルトの名無しさん
垢版 |
2018/10/21(日) 19:42:24.72ID:zGGokTqn
tupleの要素取り出すときstd::get<>以外の方法ありますか?
tuple[index]みたいに取り出せたら良いんですけど
0517デフォルトの名無しさん
垢版 |
2018/10/22(月) 16:17:14.28ID:H1W4+XYR
>>515

tuple の要素が char * だとして

std::vector<char *> vec;
int i = 0;
std::_For_each_tuple_element(t, [&h, &i](auto&& v){
printf("%d: %s\n", i++, v);
vec.push_back(v);
});
0518デフォルトの名無しさん
垢版 |
2018/10/22(月) 16:18:27.73ID:H1W4+XYR
ああ
色々間違ってるけど適当に読み替えてくれ
0519デフォルトの名無しさん
垢版 |
2018/10/22(月) 18:32:15.28ID:N4Dlk9u9
std::apply 呼んだ方が良いかな
0521デフォルトの名無しさん
垢版 |
2018/10/23(火) 08:46:28.85ID:0c85p6oM
すごく初級の質問なんですが、
int * x =3;
auto y=*x;
としたときに、コンパイラがyの型をintと推測するのはなぜでしょうか?
ポインタのポインタになるので、最初の*でint型の変数のアドレスを示すことになるまでは分かるのですが、
その後の*でアドレスのアドレス?を指すことになるので、元のint型の値を指すのは違うように思えてしまいます。
0522デフォルトの名無しさん
垢版 |
2018/10/23(火) 08:57:12.64ID:el+h+kWN
x は 0x00000003をアドレスとして認識
y(*x) は int型アドレス0x00000003にある値を指す
アドレス(x)のアドレスを指す場合は &x になる
0523デフォルトの名無しさん
垢版 |
2018/10/23(火) 11:21:13.83ID:1h9PfZX9
多分、変数yの型が省略されているから、
デフォルトのintと推定して処理しているのだろう
0525デフォルトの名無しさん
垢版 |
2018/10/23(火) 12:26:32.22ID:0c85p6oM
>>522
ありがとうございます。
ということは*がついてる変数は、変数がアドレスのときはそのアドレスに収納されてる値を指し、変数がアドレスに収納されてる値のときは、そのアドレスを指すという理解でよろしいんでしょうか?
0526デフォルトの名無しさん
垢版 |
2018/10/23(火) 12:51:45.73ID:wh2qZljY
>>525
違うよ。
型名の一部としての*と、式の中の演算子としての*が別物だと言うのは分かる?
1行目の方は「intをさすポインタ」という型を表すためのもの。
2行目は「xというint型の変数の値に対して、その値が指しているメモリ領域上にあるint型の値を参照する」という演算を行うというもの。
0527デフォルトの名無しさん
垢版 |
2018/10/23(火) 13:02:04.09ID:LNtdy1l4
この変数はポインタです 宣言の *
ポインタで指している先の内容を得ます 式の *
0529デフォルトの名無しさん
垢版 |
2018/10/23(火) 14:23:01.94ID:LNtdy1l4
Firefox だと右上メニューからエンコーディングで明示的に EUC-JP 指示で化け解消
(unicode にチェックが入ってたが、自動だとそっちに誤爆判別してた?)

Chrome での明示的なエンコーディング変更は拡張プラグインつっこまないとできないっぽい
0530はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/23(火) 16:21:42.79ID:L3KABBTH
C/C++ のポインタの表現が分かり難いってのは確かにあると思う。

宣言のときも * は変数名の側にくっついているものと考えれば理解しやすいんじゃないかな。
int * x; と宣言したとき、 *x が int であるような x を宣言したことになる。
0531デフォルトの名無しさん
垢版 |
2018/10/23(火) 16:53:31.99ID:yFsvvFWj
Cの頃は
int *hoge;
と書くことが多かったのに、

C++になってから
int* hoge;
と書く人が増えた。

悪い習慣だと思う。
0532デフォルトの名無しさん
垢版 |
2018/10/23(火) 17:02:30.81ID:oFF/C26V
Javaとかから入る人が増えたからかね?
その習慣はあかん。
ポインタは型じゃないから、例えば

int* a,b;

って書くとaは「int型のポインタ」で、bは「int型の変数」になる。
0533デフォルトの名無しさん
垢版 |
2018/10/23(火) 17:05:53.09ID:J7zWeAP4
ハゲのせい
0534はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/23(火) 18:09:41.43ID:L3KABBTH
>>532
いや、そこらへんは C/C++ のおかしなところで、ポインタはあくまでも型だ。
その上で文法上は * は変数名の側と結合するの。

もういっそ
std::add_pointer<int> a, b;
のスタイルを普及させればいいんじゃないのかなーと思う。
C++ だとなるべくスマートポインタを使う習慣が出来つつあるから、
その記法とも一貫性があるし。
0535デフォルトの名無しさん
垢版 |
2018/10/23(火) 19:19:19.30ID:6eYDBZzc
>>532
ポインタは型じゃないって言ったとき
じゃあなんて言うんだっけ
仕様でも厳密にはなんか型とは別のカテゴリとして扱われてたよな
仕様に詳しい人教えて
0536デフォルトの名無しさん
垢版 |
2018/10/23(火) 19:36:08.31ID:ArZ/Inm7
型変換は (型)式 と書くわけで型を単体で書く書き方はあるのに変数宣言は
型 変数[, 変数]...
じゃないからねえ

void f(void);

void (*f_ptr)(void) = f; // ふむ
void (*g_ptr)(void) = (void(*)(void)) f; // 関数ポインタ型の記法はこうか…
void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!

みたいな
0537デフォルトの名無しさん
垢版 |
2018/10/23(火) 19:49:01.78ID:36KTqSlz
初期化リストで二次元配列を0で初期化したいときはどう表記したら良いですか?
0538デフォルトの名無しさん
垢版 |
2018/10/23(火) 20:01:35.24ID:ArZ/Inm7
初期値式リストの個数が足りない場合残りの要素は0で初期化されるので

int a[5][6] = {};

でok
0541デフォルトの名無しさん
垢版 |
2018/10/23(火) 22:10:00.30ID:cC1ZIpo7
初期化値リストをつければ足りないところは0で埋められる
付けなければ初期化されない
太古から変わらない仕様
0542デフォルトの名無しさん
垢版 |
2018/10/23(火) 22:13:12.65ID:HIyGo7BY
あ、でも c だと空の初期化リストは書けないから {} じゃなく {0} にしなきゃダメか
0543はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/24(水) 00:07:31.69ID:PadB6FUj
>>535
変数宣言の基本的な形式

型指定子 宣言子1, 宣言子2, …;

で言うと * は宣言子の一部ということになるが、
型指定子でないから型 (の一部) ではないというわけではない。
これは文法上の呼び名に過ぎず、
意味論的にはポインタは型の一部だよ。
0544デフォルトの名無しさん
垢版 |
2018/10/24(水) 00:25:51.42ID:shD/xjVg
視点の問題ではあるが宣言の構文上のポインタは型の種類ではなく入れ物の種類ともいえる
int *a, b;

int pointer a, int variable b;
を意味する省略構文であり意味論的に
variable:値をいれるもの
pointer:間接的に他の入れ物を指すもの
と区別されてると見ることもできる
0545デフォルトの名無しさん
垢版 |
2018/10/24(水) 00:41:21.11ID:ht/B3MxL
>>544
そういうのは単純なポインタ(foo*)の時にだけ通じる話で、配列や関数ポインタや引数込みでのそれらの再帰的な組み合わせとかも考えたら、きちんとBNFで理解して型の宣言の構文を定義通りに覚えるのが一番誤解がなくてシンプルだと思うよ。
0546デフォルトの名無しさん
垢版 |
2018/10/24(水) 00:41:23.34ID:8GMcdoBP
>>543レスサンクス
自分でも調べてみた
手元のc99ドラフト版から適当に抜粋

declaration:
 declaration-specifiers init-declarator-list ;

declaration-specifiers:
 storage-class-specifier declaration-specifiers
 type-specifier declaration-specifiers
 type-qualifier declaration-specifiers
 function-specifier declaration-specifiers

init-declarator-list:
 init-declarator
 init-declarator-list , init-declarator

init-declarator:
 declarator
 declarator = initializer

declarator:
 pointer direct-declarator

pointer:
 * type-qualifier-list
 * type-qualifier-list pointer

宣言時の * は declarator なんやね構文としては
0547デフォルトの名無しさん
垢版 |
2018/10/24(水) 00:47:37.13ID:pa4PW987
>>535
詳しい人とかハードル上げられるとな。。。
プログラミング言語C売っちゃったから、厳密な仕様は記憶の彼方だが、ポインタは厳密なカテゴリ的にもポインタだったと思う。

ここからは私の解釈だが、ポインタはアドレスを入れる「変数」。
当たり前じゃんと言われればそうなんだけど、感覚的にも型というより変数って感じ。

ポインタに型があるとすればOSがアドレスを扱うビット数と同じになる。
intとかの型はポインタが指す先にどの大きさのどういう扱いのデータがあるかを知る為で、ポインタ型そのものの大きさは変わらない。

んで、普通の変数とポインタはCだと大分違うように思うけど、アセンブリ言語だと

LD GR0,TEXT ; 変数TEXTの内容を読む。
LDA GR0,TEXT ; 変数TEXTのアドレスを読む。

程度の違いしか無いわけね。

この場合、内容もアドレスもレジスタが読むけど、Cにレジスタに相当する変数を用意する為にポインタが生まれたんだと思う。
0549デフォルトの名無しさん
垢版 |
2018/10/24(水) 00:54:55.11ID:pa4PW987
x Cにレジスタに
o CにLDA使用時のレジスタに
0551デフォルトの名無しさん
垢版 |
2018/10/24(水) 01:36:02.36ID:uSP3iZ9v
>>538
ありがとうございます説明が足りなかったかもしれません
メンバ変数の配列をコンストラクタでリスト初期化する場合どうしたらいいですか?
Hoge::Hoge() : mPiyo(0) ←これの二次元配列版を知りたいのです
0555デフォルトの名無しさん
垢版 |
2018/10/24(水) 11:21:48.24ID:wUNs4a59
> void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!

当然知ってると思うけど

void (*h_ptr)(void) = f;

これは * と () の優先順位が原因だ

よく * と [] で混乱してるひともいるけど

char **hoge;
char *hoge[];
char (*hoge)[123]:
char (*hoge)[]: // エラーかい!
0556はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/24(水) 11:24:53.60ID:PadB6FUj
>>551
今では (C++11 以降では) 宣言時に初期化も書けるから、

struct Hoge {
int a[10][10] = {};
public:
Hoge(void);
};

って感じでも書ける。

複数のコンストラクタがあるときに、
どのコンストラクタが起動したときでも初期化はしないといけないみたいなときには、
この方式で書いた方が何度も同じことを書かなくてよいので面倒くさくなくて良いかも。
0557デフォルトの名無しさん
垢版 |
2018/10/24(水) 11:47:35.18ID:uSP3iZ9v
>>556
なるほど
コンストラクタにつらつら書くよりもヘッダで宣言時に初期化した方が綺麗ですね
0558はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/24(水) 11:57:27.21ID:PadB6FUj
アセンブラとかから C に入門したら色々と自動化されてて
ありがたいなーってなってポインタで躓いたりしづらいけど、
レイヤが違うという意識を持ってないと変に機械の理屈に引きずられることもある。

言語の理屈だとポインタはアドレスを入れるものじゃなくて、
ポインタを値として見たものをアドレスと呼んだりもするってだけ。
結局はポインタにアドレスが入ってるんだけど、まずポインタありき。

ポインタに対する演算ってのは指す先をいくつ進めるとか、
指す先の間隔がいくつだというものであって、
アドレスを演算して実現するってのは実装上の都合。
アドレスが連続しているということさえ保証はない。

たとえば

char a[2];

とあったときに

(intptr_t)(&a[1])-(intptr_t)(&a[0])

が 1 になることは言語仕様では保証されない。
(これが 1 にならないような変な環境はまず無いと思うんだけど。)

具体的に機械でどう動いているかから見ると肌感覚として理解しやすい場合もあるのはわかるが、
言語の理屈と混同しないように、一旦それは抽象の壁の向こうに押しやる必要もある。
0559デフォルトの名無しさん
垢版 |
2018/10/25(木) 06:51:43.64ID:GIa2VIfF
ラムダ式でthisを指定してそのクラスのメソッドを呼び出したところ、そのクラスのメンバ変数がすべて0になっててコンストラクタも動作してない状態になってたのですが、使い方間違ってますか
0560デフォルトの名無しさん
垢版 |
2018/10/25(木) 07:15:13.40ID:kug3Loto
>>559
インスタンスが既に破棄されているのでしょう
c++ ではオブジェクトの寿命管理は自分でやる必要があります
(参照があるから破棄されないということはない)
0561デフォルトの名無しさん
垢版 |
2018/10/25(木) 11:40:30.80ID:5Cy/pQlU
>>559
[&*this]
こうしたっていう意味?
0562デフォルトの名無しさん
垢版 |
2018/10/25(木) 22:05:25.00ID:GIa2VIfF
ラムダ式にはthisを指定しました
インスタンスは生きています
ラムダ式内から直接呼ばずにグローバル変数に保持したインスタンス変数経由で同じメソッドにアクセスしたら正しい値が読み取れました
0563デフォルトの名無しさん
垢版 |
2018/10/25(木) 22:40:27.12ID:ovezBLdW
auto f = [this]() {... };
てな感じにキャプチャはしてるんだよね。してないとコンパイルエラーになるし。

デバッガでみておかしいだけならデバッガがうまく動いてないだけでは?
cout << this->hoge;
とかして見てみたらどうでしょう。
0564デフォルトの名無しさん
垢版 |
2018/10/26(金) 16:36:40.82ID:8hqqerJ0
>>562
>ラムダ式内から直接呼ばずにグローバル変数に保持したインスタンス変数経由で同じメソッドにアクセスしたら

warning読み飛ばしてるだけだと思うが
warningにそうしろって書いてあるはず
0565デフォルトの名無しさん
垢版 |
2018/10/26(金) 16:37:20.12ID:8hqqerJ0
あとグローバルにしなくても
ラムダ式を呼ぶ側の関数内のローカル変数で保持しても多分いける
0566デフォルトの名無しさん
垢版 |
2018/10/28(日) 23:19:51.00ID:CM0THx8+
複数のファイルをコンパイルするとき、ソースファイルの読み込み順番ってc++ではどのように決定されるのでしょうか?
0568デフォルトの名無しさん
垢版 |
2018/10/29(月) 00:15:12.84ID:LkYf8yJz
>>566
それぞれ別の翻訳単位として、独立に処理されるぞ。
依存関係があって先に読み込ませる必要があるファイルは、#includeで明示的に指定した順に読み込ませる必要があるよ。
0569はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/29(月) 01:17:32.57ID:wGJRVi/I
先に読み込ませれば (ヘッダを include したり宣言を書いたりしなくても) 定義したものが利用可能になると思ったってことなのかな?
0570デフォルトの名無しさん
垢版 |
2018/10/29(月) 11:30:00.64ID:VxCr7qKV
ならんやろ
0571デフォルトの名無しさん
垢版 |
2018/10/29(月) 12:50:50.62ID:X5D3cySa
ソースファイルの読み込み=ソースのコンパイルとして
makeなり 統合環境なりが 依存関係チェックして必要と思われた順にコンパイラを起動しコンパイルしてる
0572 ◆QZaw55cn4c
垢版 |
2018/10/29(月) 19:30:19.13ID:MQrExvvX
>>571
>makeなり 統合環境なりが 依存関係チェックして必要と思われた順

別に make による依存度チェックが必須だとは思っていません
最悪、アプリケーションを構成する全ソースを全部コンパイルしたっていい
やっていることがよくわからないのなら、全部再コンパイルするバッチを書いてもいい、と思っています
0573デフォルトの名無しさん
垢版 |
2018/10/29(月) 19:53:08.30ID:QH06ucqh
>>572
確かに、時間が無駄になるだけで、それにより動作が変わってしまう等の害を及ぼすことはないからなー

結局 >>566 が聞きたかったことは皆目見当がつかんけどもw
0574デフォルトの名無しさん
垢版 |
2018/10/29(月) 19:59:30.68ID:+o2CKGU+
vectorで複数のstd::stringの各要素を収納して管理してみたいのですが、
実際、vectorの特定の要素にアクセスしてstringのデータを入れようとするとエラーになってしまいます。
例えば、次のようなコードの場合です。
std::string A = "bookA";
std::string B = "bookB";

std::vector<std::string> booktitle;
booktitle[0] = A;//コンパイルエラー

vectorで複数のstd::stringのデータを収納したい場合にはどうしたらいいのでしょうか?
0576 ◆QZaw55cn4c
垢版 |
2018/10/29(月) 20:48:05.90ID:MQrExvvX
>>573
FreeBSD 2, 3, 4 (くらいかなあ) 時代には、OS カーネルを再度コンパイルすることはあたりまえだったんですけれども、最近はそういう話はすたれてしまいましたね…
0577デフォルトの名無しさん
垢版 |
2018/10/29(月) 21:00:10.54ID:+o2CKGU+
>>575
ありがとうございます。
例えば、vectorにpush_backで100個のstd::stringのデータを入れたけれど、38個目のデータを別のものに変更したいという場合、
38個目のstd::stringのデータを直接指定して別のものをいれるということはできないんでしょうか?
0579デフォルトの名無しさん
垢版 |
2018/10/29(月) 22:57:36.19ID:oZEcP9DN
>>577
c の普通の配列みたいに中身に拘らずとりあえずサイズ100の配列を用意したい場合は
v.resize(100) でいけるのでその辺りも併せて覚えておきましょう
0580デフォルトの名無しさん
垢版 |
2018/10/29(月) 23:25:38.01ID:Id14AobK
関数の中でポインタ変数を作ったら、その関数から出る時、ポインタ変数は消えるけど、ポインタ変数の中身はどっか別にあって消えないってことで良いんですかね?
その中身を消すのがdelete関数ってことですか?ややこしいな・・・
0581デフォルトの名無しさん
垢版 |
2018/10/29(月) 23:52:04.87ID:JGxixszg
そのとおり
記録には残らないが記憶に残る
0582デフォルトの名無しさん
垢版 |
2018/10/30(火) 00:19:02.74ID:tYtIFLkW
ありがとう。すみませんもう一つ。
ポインタ変数のアドレスを格納するのに、なぜ二重ポインタが必要なのかがいまいちわかりません。
単に”番地”を格納するだけなら普通のポインタでも良いような気がしてしまいます。
0583デフォルトの名無しさん
垢版 |
2018/10/30(火) 00:27:02.34ID:Md8WzUxK
それは、32ビット浮動小数点のビットパターンを32ビットintに入れておけば
float型とかいらないと言ってるようなもの
0584デフォルトの名無しさん
垢版 |
2018/10/30(火) 00:36:21.09ID:H/liFP07
アドレス値がほしいとき
引数でアドレス入れる変数のアドレスを渡すことがある
0585デフォルトの名無しさん
垢版 |
2018/10/30(火) 00:46:04.26ID:0KkuIlNz
>>582
情報量としては実際のところメモリアドレスなので同じだけれど型が違う

pがint へのポインタなら
*p はアドレス位置にある int を返すし、
p++ すると int のサイズ分増えるし、
p[i] はintのサイズかけるiのメモリ位置にある int になる

上記の int を char やポインタ型に入れ替えると動作が異なることがわかる。
なんの型で読み書きするのかとかサイズの計算なんて人がコードで書けばいいじゃん、
という流儀もあるだろうがcは違う

例外としてなんの型だか不明なものを扱うときには、
とりあえずvoid*で保持しておいて計算やアクセスするときに
明示的に型を指定して用いることもある
0586デフォルトの名無しさん
垢版 |
2018/10/30(火) 00:55:27.51ID:H/liFP07
アドレス渡さないと変数(今回の場合アドレスを格納する領域)に値を格納できない
コレはどんな変数でも同じ

アドレスを格納する変数もただの変数だからな
0587デフォルトの名無しさん
垢版 |
2018/10/30(火) 07:33:46.97ID:rZekkOWs
>>580
>ポインタ変数の中身はどっか別にあって消えないってことで良いんですかね?
(ポインタ変数の中身はポインタだが、ポインタが指してる先と読み替えよう)
指してる先はどっか別にあってって、言語が自動で作ってくれるわけじゃないよ
ポインタが指す先もプログラマが作らなきゃならない
だから消える所に作れば(自動変数な)消えるし、消えない所に作れば(静的変数やnewな)消えない

>>582
二重ポインタ(って表現もナニだが…)も
ポインタを指してるってだけの普通のポインタだから
0588デフォルトの名無しさん
垢版 |
2018/10/30(火) 12:09:39.01ID:yVkeMr3S
「戻り値ではなく、引数の書き換えで呼び出し元に新たな値を渡したい」

・関数側宣言はポインタで受けて 呼び出し側は変数に&つけてポインタを渡す (c/c++)
 関数実装の際 *でデリファレンスして代入

・関数側宣言は参照で受けて 呼び出し側は変数をそのまま渡す (c++)
 関数実装の際 そのまま代入
0589デフォルトの名無しさん
垢版 |
2018/10/30(火) 15:15:26.58ID:p4LrBCE7
>>582
freeしたあと確実にNULL代入したいためにポインタのポインタで管理しておくことはある
0590デフォルトの名無しさん
垢版 |
2018/10/30(火) 15:17:35.76ID:p4LrBCE7
あと二重ポインタとかダブルポインタとかいう用語は使わない方が良い

ポインタのポインタ(たまにポインタの配列)
配列のポインタ

のどっちかにしろ
0591デフォルトの名無しさん
垢版 |
2018/10/30(火) 15:22:49.70ID:yVkeMr3S
void my_free(void** ptr) { free(*ptr); *ptr = NULL; }
.......

char *data = malloc(size);
.......
.......
my_free(&data);
/* これ以降 data = NULL になってるから参照するとヌルポになる */
0592デフォルトの名無しさん
垢版 |
2018/10/30(火) 15:59:22.21ID:KCmKruF1
ポインタほんとむずい
0596デフォルトの名無しさん
垢版 |
2018/10/30(火) 21:19:57.26ID:4lskY4LV
自分がそう呼ぶかどうかはともかくとして、
ダブルポインタやdouble pointer でググればわかるようにそう呼称されることも大変多いわけだから
ポインタのポインタをダブルポインタと呼ぶことが多いことを知らんでいるわけにはいかんのが現実
0599デフォルトの名無しさん
垢版 |
2018/10/30(火) 21:46:50.04ID:QNssPyY0
使うのはポインタのポインタまでにしとかないと書いててワケわからなくなるぞ
0600デフォルトの名無しさん
垢版 |
2018/10/30(火) 21:51:59.77ID:ri95Blut
素朴な疑問だけど、ビット演算の | と論理演算の ||
前者を「オア」と呼んで後者を「ダブルオア」と呼ぶ?
0601 ◆QZaw55cn4c
垢版 |
2018/10/30(火) 22:01:11.64ID:ojdn3tn8
>>600
|| は論理演算子の「論理or」
| はビット演算子の「ビット or」…あまりそういういいかたはしないような気もしますが
0602デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:05:37.02ID:ri95Blut
ダブルポインタの流れで気になったのよね
言葉だけの疎通で どう言ってたかな?と

※ 「ビットor」 「or」 後者は前後の文意で汲んでくれ のような使い方してるわ
0603デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:10:43.59ID:4lskY4LV
明示的にビット毎のorを指すときは bitwise or と書くけど日本語ではなんていうんだ
教科書なら「ビット毎の論理和」でいいんだろうけど古臭い

声に出して読むときは2つ組みの方をオアオアとかアンドアンド
0605デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:30:53.82ID:4lskY4LV
>>604
世間で使われてる用語を使わず「理屈で言えばこうだ」と
勝手に言葉を作ってると造語症と思われるぞ
0607デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:43:13.11ID:J31Dj26+
double linked list のdoubleは行きのポインタ(リンク)と帰りのポインタでdoubleだし
日本語より論理的と言われがちな英語も割といい加減だよね
日本語では双方向リストと実に論理的な呼称
0608デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:47:46.33ID:fzlT+aGo
いや double pointer, triple pointer と増やしていけるし数学的なのかな
これ式で日本語でたまに使われるのは2重(2段)ポインタ、3重ポインタか
0610はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/30(火) 23:08:47.77ID:/tj4m1Wy
>>603
JIS だと「ビット単位のOR演算子」と「論理OR演算子」と書かれている。
あくまで訳語のひとつでしかないけど、JIS の性格を考えれば公式訳と言ってよかろ。

| と || の代替表記として bitor と or があるので、発音するときはこれでいくのもアリかもね。
0612はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/30(火) 23:23:20.21ID:/tj4m1Wy
C99 をざっと見た感じでは double を指すポインタは "pointer to double" という書き方になっているけど、
カジュアルな場面で double pointer と言わないとも言い切れないだろうし、
これについては >>595 の言い分に説得力を感じる。

英語がよくわかる人の肌感覚ではどんなもんなんやろね?
0613デフォルトの名無しさん
垢版 |
2018/10/30(火) 23:38:22.13ID:EION13qU
ポインタへのポインタでしかないもんを
ダブルポインタと言い換えるの気味悪い
0614デフォルトの名無しさん
垢版 |
2018/10/30(火) 23:42:13.26ID:H/liFP07
だからな

ただの変数だからな
ただのポインタも例外じゃない
0617デフォルトの名無しさん
垢版 |
2018/10/31(水) 13:47:07.97ID:XAA9QXm2
悪貨は良貨を駆逐する
0619デフォルトの名無しさん
垢版 |
2018/11/01(木) 11:03:26.87ID:z733lC2q
初心者だから何でも許されるというのは間違った考え
安田はジャーナリストとしては初心者
無能に仕事を任せるのは損失
0622デフォルトの名無しさん
垢版 |
2018/11/01(木) 22:02:58.74ID:ydgxPLcy
プログラム全体でただ1つだけ走らせることが出来る、ある機能を提供するライブラリを作りたいんですけど
シングルトンで実装するのが一般的なんですかね よくわからん
0623デフォルトの名無しさん
垢版 |
2018/11/01(木) 23:40:18.35ID:BwvtJmQs
それただのcの関数やんけ
staticのメンバ関数で十分
0624デフォルトの名無しさん
垢版 |
2018/11/02(金) 00:29:41.77ID:Jt96ZoUI
スレッドの数なのか変数の数なのか
なんでライブラリがそんなことを強制せにゃならんのか
0626デフォルトの名無しさん
垢版 |
2018/11/02(金) 00:38:05.60ID:KoqyjIsr
リエントラントな関数にしとけば平気
0627818
垢版 |
2018/11/02(金) 08:51:49.18ID:PHrFLYGt
>>819
そんな考えだったら、スレタイの、【初心者歓迎】をはずせ。
0629627
垢版 |
2018/11/02(金) 11:02:16.38ID:PHrFLYGt
失礼しました。
0630627
垢版 |
2018/11/02(金) 11:07:37.07ID:PHrFLYGt
>>818>>819さん、ごめんなさい。
0632デフォルトの名無しさん
垢版 |
2018/11/02(金) 13:50:23.22ID:33vh4D4i
vector<int> v{1, 2, 3, 4};
と定義して &v[0] からのバイト列にアクセスすると
01 00 00 00, 02 00 00 00, 03 00 00 00, 04 00 00 00
と連続して確保されているようですが
●これは仕様上保証されていますか?

また
vector< vector<int> > w{{1, 2}, {3, 4}};
と定義して &w[0][0] からのバイト列にアクセスすると
01 00 00 00, 02 00 00 00, ?? ?? ?? ??, ?? ?? ?? ??
後半がランダム?

になるようですが
連続に
01 00 00 00, 02 00 00 00, 03 00 00 00, 04 00 00 00
と確保されるように2次元のvectorを定義するにはどうすれば出来ますか?
それとも出来ないのでしょうか?
0635デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:03:14.42ID:Jb5Djrng
vector の連続性について
 ttp://cranehouse.dojin.com/program/vector.html
 ttps://www.wdic.org/w/TECH/std::vector#xE3x83xA1xE3x83xA2xE3x83xAAxE3x83xBCxE3x81xAExE9x80xA3xE7xB6x9AxE6x80xA7
0636デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:52:24.63ID:kca9Lljk
vectorには本体データの他に管理データもあったりするので
そのvectorを作ると間にゴミに見えるデータが入りうる
0637デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:54:42.97ID:KQJo2ZCc
ありがとうございます

int (*hoge)[要素数]; じゃなくて
int *hoge[]; みたいにポインタの配列になってるということでしょうか?
0638デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:59:33.45ID:Jb5Djrng
w[0] が返す vector の次元(大きさ)と
w[1] が返す vector の次元(大きさ)は異なっててもいい
から、そもそも論で 2次元配列 とは等価にならんし
0640デフォルトの名無しさん
垢版 |
2018/11/02(金) 15:14:04.01ID:KQJo2ZCc
とりあえず「出来ない」という方向で仕様検討します
0641デフォルトの名無しさん
垢版 |
2018/11/02(金) 16:46:54.30ID:ggr9EF3w
>>632 >>640
array< array<int, 2>, 2 > w{ {{1, 2}, {3, 4}} };
0642はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/02(金) 17:22:12.50ID:0I6l0gim
適当なラッパーを作って
期待する形のバイト列にするイテレータをくっつける
とかいった方法が考えられるかなぁ。

まあ場合によるけど、
大きさがコンパイル時に確定してよいのなら、
>>641 の方式が確実だと思う。

多次元配列を作る場合ってほとんどの場合はコンパイル時か
オブジェクト構築時には大きさが決まってると思うんよね。
後から伸ばしたり縮めたりってあんまりしなくなくなくなくない?
0643デフォルトの名無しさん
垢版 |
2018/11/02(金) 18:31:51.95ID:ibjOz3iU
1次元での連続性の要求は理解できるけど、2次元以降の多次元で配置の連続性の要求って何処からきてる?

思い浮かぶのが画像データぐらいだけど、それなら1次元+演算でも代用可能だし…
0645デフォルトの名無しさん
垢版 |
2018/11/02(金) 23:47:26.58ID:NDSywfh9
環境に関して質問です。
windows10でcの環境作りたくて、コンパイラにminGWを入れたのですが、実行時エラーがでなくて不便です。
例えば、
char c='x';
printf("c: %s",c);
のように出力時のフォーマットを間違えたら、LinuxではRuntime error〜となにかしらエラーがでていたのに、エラーも何も出ずに(c: すら出ないで)終了します。

minGWの仕様なのか否か。
または、
windows10でminGWを使い、実行時エラーを出す方法を教えてください。
0646はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 00:16:22.42ID:q3m1JbMq
>>645
言語仕様的には未定義なので、実行した結果がどうであっても言語仕様通り。
ランタイムに捕捉できることを期待しない方が良いと思う。
C/C++ っていうのはそういうもんだから。
0647デフォルトの名無しさん
垢版 |
2018/11/03(土) 00:23:55.55ID:v6aDDcip
>>645
minGWを使ったことないんで間違っているかも知れないが
GCCならGDB使えば実行時エラーを捕捉出来るんじゃないか?
0648デフォルトの名無しさん
垢版 |
2018/11/03(土) 00:52:51.51ID:JdxI4C+o
>>647
gdbで捕捉できるんですが、gcc実行のみでRuntimeErrorを表示させるにはコンパイラ変えるしかないですかね?
もともとvmにLinux入れて、c言語を学ぼうとしてた初心者の集まりなんですが、vm重いからwindowsに移行しようと、環境設定が簡単な方法をいろいろ試してるところです。
なので、Linuxでできてたことができなくなることが不安という感じです。
0649デフォルトの名無しさん
垢版 |
2018/11/03(土) 01:02:20.38ID:v6aDDcip
>>648
例えば、GCCの代わりにVC使ったとしても
エラーを捕捉出来るかどうかは分からないよ
どちらかと言えばOS側の仕様な気がするし
0650デフォルトの名無しさん
垢版 |
2018/11/03(土) 01:09:09.93ID:JSD3MLAZ
たまたまアクセスしたアドレスがアクセス違反でもない限り、そもそもエラーにしようがない気がするのだけど、どうやって補足してるの?
0652デフォルトの名無しさん
垢版 |
2018/11/03(土) 04:50:14.05ID:AAuGyX2A
>>645
エラーレベル上げるとかそう言うフラグがコンパイラに無かったかな?
その初期値が違ってるだけじゃ無いの?
0653デフォルトの名無しさん
垢版 |
2018/11/03(土) 04:51:37.68ID:AAuGyX2A
あ、実行時か。
Cは実行時エラーの処理も自分で補足して書くものよ?
そう言う言語としか言えない。
0654デフォルトの名無しさん
垢版 |
2018/11/03(土) 09:37:50.89ID:1nZCEE4t
不定や未定儀を自らトラップするコードを記述するのは難易度高いな… 例外が捕まれば御の字だが
0655はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 10:13:55.37ID:q3m1JbMq
アドレスが 0 付近のページはプログラムミスでアクセスされやすいってことはわかっているので、
Windows でもなんか特別に予約してたような気がしたんだが、手元の資料で見つからんな……。
0658はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 11:26:29.27ID:q3m1JbMq
>>657
NULL はあくまでも「無効なポインタ」を表し、意味のある番地ではない。
けど、うっかり意味のある番地としてアクセスしたら 0 番地だから、
その付近へのアクセスがあったらたぶん駄目なプログラムとして検出しようねっていう話。
0659はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 11:29:39.54ID:q3m1JbMq
今回の場合は char をポインタとして解釈してしまった場合ってことになるけど、
(0 ではないが) 0 に近いアドレスなので、その付近のページは
トラップ用に予約しておいたらあかんプログラムの検出に便利やんというわけ。
0660はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 11:36:04.04ID:q3m1JbMq
本筋とは関係ないけど念のために補足しておくと、ヌルポインタがゼロというのは、
そういうアーキテクチャがほとんどだと思うけど言語仕様の保証はない。

整数のゼロと互換性はあるという扱いで、
つまりは、ヌルポインタを整数にキャストするとゼロだし、
ゼロをポインタにキャストするとヌルポインタになることは保証されるが、
ヌルポインタのビットパターンが整数のゼロと等しいことは保証されない。
(なので移植性が必要ならポインタの配列を memset とかで初期化したりするのは駄目)
0661デフォルトの名無しさん
垢版 |
2018/11/03(土) 13:12:43.48ID:LENdvKRs
>>ゼロをポインタにキャストするとヌルポインタになることは保証されるが

そうだっけ。定数のゼロだけでは?
0662はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 14:56:28.34ID:q3m1JbMq
>>661
そういや C++ ではそういう変更もされたような気がするな。
以前は確かに定数に限らずゼロはヌルってことだったはずだが。

C では今でもヌルはゼロ (と相互に変換される) だと思う。
0664デフォルトの名無しさん
垢版 |
2018/11/04(日) 13:52:28.75ID:5RY1Lh2I
>printf("c: %s",c);

va_list な関数でフォーマットからパラメータの妥当性チェックって
コンパイル時に出来るもんなのか?
0669デフォルトの名無しさん
垢版 |
2018/11/05(月) 22:44:26.18ID:3jCTliha
面倒なので出力書式には%sのみを使うこととし引数の型の分だけstringに変換する同名関数用意して必ず文字列にしてしまうという力技
0670デフォルトの名無しさん
垢版 |
2018/11/06(火) 11:51:03.34ID:rqFrnjhJ
>>669
オブジェクト指向的にはそれが正解なんだよな
0672デフォルトの名無しさん
垢版 |
2018/11/06(火) 13:01:56.11ID:tKDIv/D4
cout << left << hex << showbase << setfill('0') << setw(8) << i << eol;
より
cout << i.tostring("0x%-08x") << eol;
とかなら %書式 にはあまりこだわらないんだけど
前者の仕様だと %書式 の方が描きやすいから
結局普及しない原因
0673デフォルトの名無しさん
垢版 |
2018/11/07(水) 23:51:04.79ID:JJvWWnsQ
よくint型のサイズとかエンディアンが処理系依存って解説を目にしますが
この「処理系」ってコンパイルするマシンのCPUですか?
それともプログラムを実行するマシンのCPUですか?
0674デフォルトの名無しさん
垢版 |
2018/11/07(水) 23:57:40.81ID:vv5bGR61
>>673
コンパイルするプログラムや出来たプログラムを実行するOSやハードウェアなどの諸々の環境
0676デフォルトの名無しさん
垢版 |
2018/11/08(木) 00:05:29.53ID:M68F6j6d
ターゲットになる処理系にあわせてコンパイルするからな
べつにターゲットになる処理系でコンパイルする必要はない
0677673
垢版 |
2018/11/08(木) 00:44:14.28ID:ZMRuomnT
ありがとうございます
ちょっとプログラムを見直してみます
0678デフォルトの名無しさん
垢版 |
2018/11/08(木) 10:49:50.86ID:2uuB+50R
>>673
CPUで変わるのはもちろんだが
クロスコンパイルも可能なので
コンパイル時のオプションでも変わる
0679デフォルトの名無しさん
垢版 |
2018/11/08(木) 21:31:49.37ID:2V1Zc+AV
constexpr char *mes[] ={(char *)"error", (char *)"ok" ,(char *)"abc"};
みたいにキャストしないとワーニングがでるんだが、めんどくさいね。なんか方法ないの?
0680デフォルトの名無しさん
垢版 |
2018/11/08(木) 21:41:57.89ID:YKdO2F6s
constexpr const char *mes[] ={"error", "ok" , "abc"};

constexprが何にかかっていたか考えてみれ
0681デフォルトの名無しさん
垢版 |
2018/11/09(金) 03:42:19.86ID:RK/u55Qe
constつけたらワーニングが無くなるのだろうか? 何故なくなるの?

ポインタにかかるのか、ポインタの中身にかかるのか?という問いだろうけれども恐らくはポインタ自体
にかかるのだろう。そしてconstがポインタの中身にかかる。順番が逆だといろいろ不都合がしょうじる
から、このようになる筈だ。
しかし、constを追加しただけでwarnningが消える理由はなんなのだろうか? (char*)でキャストするのと
同じ効果を持ちうるのはなぜか? constにはそんな意味はない。「単に書き換えできないようにする」
と言う意味だろう。書き換えできないsringももちろんあるから矛盾が生じるのだ。その矛盾を
解決する可能性があるとすれば書き換えできないstringがすなわちchar*と同じである場合に限る。
つまり
const string とは char* の事なのだ。
あってる?
もしあってるとすれば、
constexpr (char*) char *mes[] ={"error", "ok" , "abc"};
でもOKな筈だね。そうでないと矛盾する。この方が分かりやすいね。
0682デフォルトの名無しさん
垢版 |
2018/11/09(金) 04:05:10.44ID:RK/u55Qe
そしてワーニングはすべてきえたが、エラーになった。w
0683デフォルトの名無しさん
垢版 |
2018/11/09(金) 04:08:12.56ID:RK/u55Qe
constexpr const char *mes[] ={"error", "ok" , "abc"};
これをクラスのなかで定義したいのだが、クラスの中で定義するとエラーになる。クラス内だけで使いたいのに
外部に引き出すのは面倒だ。どうしたらいいの?
0685はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/09(金) 11:35:02.44ID:yH/J6wNO
>>681
書いている意味はさっぱりわからんが、文字列リテラルの型は const char[] だ。
そんでもって >>679 の場合の文字列リテラルは暗黙の型変換で const char* になる。
const char* を char* に入れようとしたら型が合わないがキャストで無理やり合わせることも出来るという簡単な話。

だが、型から const を剥がしたからといって文字列リテラルを書き換えてよくなるわけではない。 (← 重要!)

const を剥がすだけなら問題はないが、
書き換えたら駄目 (未定義) にもかかわらず型から const を外すのは馬鹿馬鹿しい間違いの元。
よくわからんままキャストしたら警告が消えた〜〜っていうのはC/C++ の歴史で何十年も繰返してるので
古参ならうんざりするほど見てきた駄目なパターンだと思う。
とりあえずキャストってのはほんとにやめて……。

(ちなみに C では文字列リテラルの型は char[] だが、書き換えるのは未定義ってことになってるという更なる闇がある)
0686デフォルトの名無しさん
垢版 |
2018/11/09(金) 11:51:24.81ID:p9aTnaT/
x ワーニング
△ ウォーニング
0692デフォルトの名無しさん
垢版 |
2018/11/09(金) 12:46:06.80ID:p9aTnaT/
KING KONG
0696デフォルトの名無しさん
垢版 |
2018/11/09(金) 17:01:38.84ID:s4ONASkx
今調べてきた。確かにwikiとかでもウォーニングってなってんな
発音記号もcの逆みたいのが使われている
でも実際の発音を聞くと、あの方が近いぞ。まあどっちでもええわ
0699デフォルトの名無しさん
垢版 |
2018/11/09(金) 20:21:57.93ID:GUqFOdkW
5chで発音ガーとか何回見たことか…
なのでそういう奴が居そうなスレでは原語(warning)で書くのが基本
0700デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:19:39.32ID:RK/u55Qe
「文字列リテラル型」って表現はよくわからない。文字列はリテラルじゃないの?
文字列のリテラル型というのであればリテラル型でない文字列ってあるんだろうか?
リテラルって何? 英語をやくしたら文字列って意味だろ。
0702デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:29:35.20ID:RK/u55Qe
A character literal is a type of literal in programming for the representation of a single character's value within the source code of a computer program.

「文字列リテラル」ってキャラクターリテラルのことだろうか?
それなら日本語にすると「文字列」でOKと思う。文字列リテラルって文字列列ってことか?
つまりA character literal literal **str のこと?
0704デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:31:35.81ID:RK/u55Qe
それなら文字列配列だよな。
0706デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:33:25.58ID:RK/u55Qe
>>703
アッごめん。704は無視して。
リテラルって、堅物って意味のほうか? そうなんだ。
0707デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:39:02.77ID:RK/u55Qe
literalって頭が固くて融通が利かないって意味があるみたいだから、”abc”というように値が固定した
文字列って意味なんだね。
ということは
char literal 'a'
char literal "abc"
int literal 0x111
ということか。
0708デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:40:08.63ID:RK/u55Qe
まちがってる
char [] literal --> "abc"
0710デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:56:52.98ID:9K071fMF
"literal"って「文字通り」ってことだろう。
ソースコード中に埋め込まれた、値そのものを表す記述のこと。
0712はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/10(土) 01:32:44.99ID:BAJLxFPC
リテラル型という用語もあるが、リテラル型がいわゆる「リテラル」とは限らないので気を付けてな。
0713デフォルトの名無しさん
垢版 |
2018/11/10(土) 04:45:24.06ID:p/77GMIT
>よくわからんままキャストしたら警告が消えた〜〜っていうのはC/C++ の歴史で何十年も繰返してるので
>古参ならうんざりするほど見てきた駄目なパターンだと思う。
>とりあえずキャストってのはほんとにやめて……。

void uprint( char * message);
こういう関数って普通にあると思うが、そうすると
uprint((char *)"abc");
こんなふうにキャストしないでwarnigを取る方法ってありますの? 
そもそも関数の定義の仕方が悪いって意見? C++ってcと混在一体で使うところに多大な
メリットがあるわけで、cだとstringとか使えないし、どうすりゃいいのよ。
0714デフォルトの名無しさん
垢版 |
2018/11/10(土) 04:56:10.50ID:p/77GMIT
あっ、わかった。C++の場合はvoid uprint( const char * message); も作っておけばいいのか。
納得。
0715デフォルトの名無しさん
垢版 |
2018/11/10(土) 06:25:16.23ID:7XNdxnac
>>702
>for the representation of a single character's value
a がついてるだろ。 つまりこれは1文字のことを言ってるんであって、複数文字ではないよ
で、主語を見ると、A character literalってあるから、そもそもこれは1キャラクタのリテラルの定義
なので、複数キャラ、単語等のリテラルの定義は他にあるはず
0717デフォルトの名無しさん
垢版 |
2018/11/10(土) 07:11:22.05ID:p/77GMIT
charactor literalって命名は違和感あるな。
float literal 123.4 だぜ。 おかしいだろ。 float leteral なら"123.4"なら許せる。そもそもliteral使うところが
おかしい。
英語にだってconstantって言葉あるんだから、constantをつかったらいいのに。ところがconstはconstant
のことかと思いきや、read only 変数のことなんだよね。w
0718デフォルトの名無しさん
垢版 |
2018/11/10(土) 09:00:12.85ID:jxhvzDRc
何がおかしいのかさっぱり分からん。
"文字通りの"という意味に囚われてるのかもしれないが、ソースコード上に123.4とあったらまぎれもなく文字通りだろう
0719デフォルトの名無しさん
垢版 |
2018/11/10(土) 09:56:00.85ID:0TCzpeyH
>>713
勘違いしてね?

void f(char * message)
void c_f( const char * message)
のとき、
char *p = "abcde";
f("abc");
c_f("abc");
f(p);
c_f(p);
は全部警告なしで通るぞ。 問題があるのは、
const char *cp = "abcde";
としたときの
f(cp);
だけがエラーあるいは警告になる
2017の最新のVC++
0720デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:11:13.71ID:D3ftxXru
>>717
リテラルという言葉に「文字列」的なイメージを持っているならそれはなくした方がいいよ
0721デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:14:48.88ID:D3ftxXru
>>717
さらに追加
言うように3や3.14を定数と呼ぶとしても、リテラルと呼ぶことを排除できないと思うよ。
例えばこうなる。

「ソース中に3や3.14などの定数を記述する場合は数値リテラルを用いる。
数値リテラルは8進数、16進数、10進数の3種に大別されそれぞれ以下の形式である」

など。
0722デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:16:41.25ID:p/77GMIT
そうなの? TIのCCSってのを使いはじめたところだが、warning出まくりでいやになる。
TI独自の問題? それとも警告レベル下げてるんじゃない。
問題なしだなんてとんでもない。問題大ありだよ。
そもそもC++ってCompileが全く通らない。なんでこんなにいちいちエラーをだすのかと腹が立つ。w
0725デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:23:27.63ID:p/77GMIT
>>721
>「ソース中に3や3.14などの定数を記述する場合は数値リテラルを用いる。
>数値リテラルは8進数、16進数、10進数の3種に大別されそれぞれ以下の形式である」

違和感あるのは俺だけ?
「ソース中に3や3.14などの定数を記述する場合がある。。
定数は8進数、16進数、10進数の3種に大別されそれぞれ以下の形式である」
このほうが自然とおもうが、、、
0727デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:47:21.32ID:9vqEahoA
>>725
一般的な意味での定数なら8,16,10進数に限らず3進数だろうが78進数だろうが好きに考えることができるけど、ここで8,16,10進数だと限定していっているのは、あくまでもC/C++の構文の要素である「数値リテラル」な訳だから、全く別の概念として明確に区別して考えた方がいいよ。
言語仕様のBNFとか見てくればもう少し理解できるようになるかも。
0728デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:43:56.10ID:p/77GMIT
Wikiの説明はわかりやすいね。
でもconstのサンプルにはメッセージテーブルとかが良くかいてあるけど、ROM配置
じゃなくてRAM配置になるんだね。組み込みだとRAMが少ないから使えない。
constは役立たずというか貴重なRAMを消費する邪魔もの。
0729デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:44:26.40ID:/RO766KL
そういう話ではなく
コンピュータサイエンスにおける「リテラル」の用法についての批判でしょ。

恐らくコンピュータサイエンスを学び始めたばかりの日本人が、
リテラルという用語を使い始めた英米の専門家に対して行う、
英語として不自然である、という批判。
0730デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:47:06.40ID:p/77GMIT
>>724
組み込み観点ではそういう考え方はまずいんじゃない?
なるべくconstは使わない方が良いような気がする。RAMが貴重だからね。
0732デフォルトの名無しさん
垢版 |
2018/11/10(土) 12:03:55.29ID:jxhvzDRc
>>728
一体どこをどう読んだらそんな結論になるんだよ。
頼むから断定調で嘘を撒き散らさないでくれ
0739デフォルトの名無しさん
垢版 |
2018/11/10(土) 19:49:46.05ID:p/77GMIT
>頼むからまずはcの基本を勉強してくれ

これが基本じゃなのか? 高度な質問をしているつもりはないが、、、
頼むからまずは基本に答えてくれよ。

まずVSなど他のC++はしらない。自分の感想はTIのCCSコンパイラについてだけ。しかし一般的に
組み込み系には通じると思う。

const 定義すると.bssに配置される。.bssはRAMである。組み込みマイコンではRAMとROMに分かれて
いるがRAMは非常に貴重だ。ちなみに今使ってるCPUは4kしかない。ROMは256kバイトある。
constでメニューテーブルなどを書くのは愚の骨頂だろ。そもそもconstなどなければこういう間違いは起こらない。
故にconstは有害だ。
どうだ理路整然としてるだろ。
0742736
垢版 |
2018/11/10(土) 19:56:06.79ID:hWkce6N8
>>627は、俺だ。
0743デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:01:42.68ID:2010ximS
constだけで飯が3杯食えるスレってあったよな確か。
飯一食1000円とすると、3杯で3000円。
constには3000円の価値があるってことだ。
しらべえによると、3文は90円だそうだから、早起きの33倍、constのほうが価値があるってことだ。
0744デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:03:36.88ID:p/77GMIT
>>741
そういうトイレは有害だ。ただしい。

結局んところconstはリードオンリーの意味しかない。リードオンリーのテーブルを作るのであればconstexprを
使えばいい。
リードオンリーの変数って何か意味があるんだろうか? 先ずは変数でありながら変更できない
のだから、実質的には変数ではない。本質的に存在自体が矛盾している。
たとえばリードオンリーであってもロックしたりアンロックできるのであれば意味がある。一旦ロックしたら
そのまんまってのでは、録に役にたたない。
0745デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:04:25.53ID:2010ximS
>>744
ヒント:メモリーフェンス。
0746デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:09:30.23ID:p/77GMIT
>>740
ん。それは矛盾するだろ。基本的にC++のconstは変数だ。だから初期値は代入する。
それ以後はアクセスできない。少なくともRAMに配置する変数だ。ということは言える。
.bssに配置されるのかどうかはリンカでコントロールできるのかもしれない。ROMにだって無理やり配置は
可能だ。そういう無理やりのことをいってるのではない。あくまで自然なありかたとしてのconstだ。
0747デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:10:49.63ID:p/77GMIT
>>745
言いたいことはわかるが、チャンと説明してみて、自分の間違いに気が付いた方がいい。
0748デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:11:09.68ID:2010ximS
変数じゃなくてもメンバはconstで修飾できるぞ。
0750デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:24:15.32ID:p/77GMIT
>>749
それは知らなかったが、その肝はなんなの? 結局はリードオンリーってディフェンスしたいって
ことではないの? 

物理的に書き込み可能ならリードオンリーにしてもディフェンスになんかならないでしょ。
ディフェンスするならライトプロテクト機能がどうしても必要だからね。
アクセスできないようにするには、Privateにして不可視にすればいい。これでディフェンスになる。
グローバルにさらしてなお且つリードオンリーにしておきたい変数がはたして必要だろうか?
 必要性はないと思う。
具体的にどんな意味があるのよ。
0751デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:25:53.82ID:2010ximS
知らないで難癖付けてたのかよ。
0752デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:26:38.74ID:p/77GMIT
>変数じゃなくてもメンバはconstで修飾できるぞ。

出来て何の意味があるのかということが知りたい。意味がないなら邪魔だな。
0753デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:30:17.34ID:2010ximS
高橋マナ著やさしいC++から始めたほうがよい。
0754さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/11/10(土) 20:37:38.39ID:GxjHn4EZ
メンバ関数プロトタイプの後ろをconstで修飾すれば、その関数の中ではthisがconstなポインタになり、
その関数の中ではconstではないメンバー関数は呼べなくなる。
つまり、constキャストを使わないと、thisを変更できなくなる。
0755デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:38:58.59ID:AVLSNDa3
>>752
あなたの言葉を借りるとconstはコンパイル時に「ディフェンス」するので
ランタイムで「ディフェンス」するよりも少ないコストで問題を発見できる
これは意味があることだ
0756さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/11/10(土) 20:43:43.52ID:GxjHn4EZ
関数の仮引数の型をconstで修飾すると、対応する実引数は変更できなくなる。
ただし、その仮引数にconstではない引数を渡すことはできる。
const付ければ多分変更されない。変更しようとすると、多分コンパイルエラー。
0758さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/11/10(土) 20:51:32.82ID:GxjHn4EZ
void func(const int& n)
{
...
}

funcの内部では(constキャストしないと)nは変更できない。多分。裏技使えば出来るかも。
0761デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:06:11.15ID:p/77GMIT
>>754
 説得力がありそうな意見だが、残念ながら意味がよくわからないので一寸調べてみた。
2のことかな。

メリット
1.参照渡しに const 修飾子をつけることにより、引数の中身を書き換えないことを宣言することができる。
  ポインタ渡しに const 修飾子をつけることにより、引数の中身を書き換えないことを宣言することができる。
2.const オブジェクトを引数にすると、そのオブジェクトのなかで呼び出せるメソッドは const メンバ関数のみ。

1はたしかにメリットがあると言わざるを得ない。
2は使い方次第だな。自分の場合はわざわざそこまで面倒なことはしない。
0762デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:07:06.71ID:p/77GMIT
>>755
一理ある。
0763デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:11:56.84ID:p/77GMIT
>>759
自分も最近しったんだが、組み込みで使うとC++は非常に効果を発揮する。(らしい。あまりできてない、、、)
すくなくても、クラスやnamespaceを使えるだけでも大いに助かる。Cと滅茶苦茶相性がいい。
ごちゃ混ぜでもスパゲティでも何ら問題ない。
組み込みでは絶対にC++を使うべき。
0764デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:18:06.51ID:p/77GMIT
>マニュアルで .cinit section を検索しろよ
ありがと。検索してみます。
0765デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:30:31.24ID:0TCzpeyH
>>752
お前、ほんとド素人なんだよな
しったか素人は単なる荒しと変わらんわ。 邪魔にしかならない
0767デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:35:12.51ID:D3ftxXru
>>746
君は何も知らずに妄想だけから判断して>>730の考えに至ったわけじゃん。>>714からの流れでね。

関数の引数を char* と const char * にしたときの違いは、
君が勘違いしている、ではなく、なにかを読んで知ろうともせず
自分だけの想像で決めつけているような「このポインタが定数(変更不可)かどうか」ではなく、
ポインタが差している char 値が変更不可かどうかなんだ。

で、
君の考えはおそらくここに書いてないものも含めて8割がた
間違ってるから誰にもそれを一々教えることは無理なんだよ。
だから本を読むとかして基本を学んで欲しい。
今の君は想像で英語に文句つけてるくせにアルファベットも知らない子供みたいな状態。
0768デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:35:33.57ID:p/77GMIT
>高橋マナ著やさしいC++から始めたほうがよい。

C++は使い始めたばかりでよくわからないが、多重人格的で昔のC++と最近のC++が混在している
気がする。C++は糞って言ってる人は昔のC++をみていて、C++は最高って言ってる人は最近追加
された仕様を見ていると思う。
だからC++は基礎からやると駄目な言語だね。基礎は飛ばしてしまったほうがいい。
追加された仕様部分が秀逸だね。
だからあくまでも自分の意見だが「やさしい、、、、」ってのは寧ろ難解で駄目なのが多い気がする。
特にC++の生みの親が書いたような本が最も駄目だと思う。
0769デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:37:16.52ID:0TCzpeyH
ID:p/77GMIT

もうこいつの相手をするのはやめよう。 単なる荒しだわ。 ここで終わり
0770デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:37:40.22ID:D3ftxXru
>>767
>君が勘違いしている、ではなく、なにかを読んで知ろうともせず
>自分だけの想像で決めつけているような

ここ表現が変か
何も調べてないんだから単なる妄想であって勘違いですらないということ。
0771デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:39:45.42ID:p/77GMIT
>>767
だれも最初は子供だからね。
視野が狭いのであって、思考がまちがっているんではないというところに気が付いてほしい。
だから視野が広がれば正しい結論にいたる。
そして結論は761
0772デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:45:54.25ID:9vqEahoA
>>768
C++は近年追加された仕様の方が複雑怪奇で迷走しているという意見もあるし、勝手な思い込みで基礎を蔑ろにするのはやめた方がいい。
constの理解についても、組み込みのCをやった経験に基づく自分の経験と思い込みを当然のものとして他人の話を聞くから理解が進まないのでは?
RAMにおくかROMに置くかとかも本来はC言語としては未定義とか処理系依存な部分であって、組み込みにおける常識をベースにCの言語仕様を理解しようとするから齟齬が生まれるのだと思う。
0774デフォルトの名無しさん
垢版 |
2018/11/10(土) 21:48:35.96ID:dq/THaAw
組み込みだってconst変数がRAMに置かれるなんて常識は無いよ。この人の思い込み。
0775デフォルトの名無しさん
垢版 |
2018/11/10(土) 22:12:42.07ID:mjExs0JA
このスレにいるような低学歴知恵遅れは
引数だけでなくメソッドにもconstつけるべきというのすら分かってない
クラスの引数にconstつける意味を分かってなさそうだからな
0776デフォルトの名無しさん
垢版 |
2018/11/10(土) 23:08:29.94ID:yzCMB8/E
セクション配置の話なのにメソッドのconst関係ねーだろ
意味わかってないのはてめーだ、いつものことだが
0777デフォルトの名無しさん
垢版 |
2018/11/10(土) 23:17:52.02ID:mjExs0JA
やっぱり低学歴知恵遅れはなにも分かってない
0778デフォルトの名無しさん
垢版 |
2018/11/11(日) 02:36:59.36ID:ARqR0CiK
bss セクションは、リンカの文書を見れば?

メモリ配置と、文法のconst は関係ない。
基本的に、言語の文法と実装は、関係ない

実装は、JavaScript の文法に関係ない、DOM とか

できる限り、const を使うべき!
使っても、マイナスにはならないから

たぶん、Effective 本にも書いてある
0779デフォルトの名無しさん
垢版 |
2018/11/11(日) 05:11:06.80ID:mI2pOyKp
>組み込みだってconst変数がRAMに置かれるなんて常識は無いよ。この人の思い込み。
そのことを初心者にもわかるように詳しく説明してみてください。といっても解り過ぎている人には
初心者が何がわからないのかわからないとおもう。解らない人はどこまでもわからない。なので
質問を変えて差しあげます。

質問1.constは多用な機能がある。そしてその機能を実現するには最初の一回だけは書き換え
可能である必要があると思うが、もしconstをROMに配置してその機能をどう実現すればいいのだろうか?
 実現不可能だとおもう。
このことが正しいならconstは当然RAMに配置されるのが常識だろう。いかがだろうか?

質問2.もしconstが一度も書き換え可能である必要がないとすれば、constはROMに配置
されるべきだろう。だからconstは必ずROMに配置すべきだというのが常識となる。この考えは
どこがまちがっているだろうか?

質問3.質問1と質問2の前提はどちらが正しいのだろうか?
0780デフォルトの名無しさん
垢版 |
2018/11/11(日) 05:52:29.65ID:mI2pOyKp
完璧な質問のつもりだったが、質問を書いてみて今初めて見落としている穴が分かった。
0782デフォルトの名無しさん
垢版 |
2018/11/11(日) 09:46:34.66ID:mI2pOyKp
>>772
C++は低レベルの処理に向いているのだから当然のように処理系のハードとの接点が多い。
処理系依存の部分はC++でフォローできないというだけで、だからといって処理系を意識しないでいい
ということにはならない。C++を使う場合には処理系を強く意識する必要がある。

>できる限り、const を使うべき! 使っても、マイナスにはならないから

処理系を強く意識するなら、こういう結論にはならないと思う。constは意に反してRAMに配置され得る。
組み込み系においては、RAMを多用すればすぐにRAMがパンクする。
constはいくつかのメリットがあることは解ったが、無条件に使えばやはり有害になる。少なくとも自分が使った
限りでは滅茶滅茶有害だった。
では被害を少なくするにはどうすればよいか? それに答えてほしい。

static const char* s_A; // -> BSS section
static const char* s_B = "b";// -> Data section
static const char* const s_C = "c";// -> Data section
static const char s_D[] = "d";// -> Read only Data section
static char s_E[] = "e";// -> Data section
static char s_F[128]; // -> BSS section

const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。
0784デフォルトの名無しさん
垢版 |
2018/11/11(日) 13:40:16.62ID:96wp+TZd
'\0' と L'\0' って違うんだな
0785デフォルトの名無しさん
垢版 |
2018/11/11(日) 13:56:09.62ID:D6x0hMat
すいません、C++でゲームやGUIアプリなどを開発したいのですが
メソッド抽出やクラス設計といったプログラム設計に関する書籍って
どんなものを読めばいいんでしょうか?おすすめとかありますか?
ググっても、プログラム設計の本があまり見つかりませんでした・・
デザインパターンに関するものはあったんですが
もうすこし初歩的な内容のものがあれば教えてくださいm(__)m
0787はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/11(日) 14:45:39.68ID:u4gHMHSK
>>786
ワイド文字の内訳は未定義で、 Unicode になるとは限らないし、その大きさも決まってない。
2 バイトになって欲しいなら L ではなく u を使うと UTF-16 になることは保証されるよ。
0788デフォルトの名無しさん
垢版 |
2018/11/11(日) 14:47:19.00ID:FGv1lmue
>>782
挙げられた例でconstの付加によりRAM使用量が増えている例が見られなくて
「マイナスにはならない」が正しいように見えるんだけど、何を見て有害だと言ってるの?
0789デフォルトの名無しさん
垢版 |
2018/11/11(日) 16:46:50.89ID:FyMTXkCl
>>782
> const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。

s_Bはconst宣言されてない只の変数だからいいとして
"b"がconstだけど.bssに配置されるってこと?
0790デフォルトの名無しさん
垢版 |
2018/11/11(日) 17:54:46.45ID:96wp+TZd
>>785
他の言語で造ったことあるか?
それがまだでいきなりC/C++ならやめとけ
0792デフォルトの名無しさん
垢版 |
2018/11/11(日) 21:59:31.70ID:YkGULP39
それ、C++でもないただのCでEmacs風エディタ作るっていう古臭い本だろ。
しかも一般的な設計論みたいなものはほとんどなくてエディタの実装テクニックがメイン。
0794はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/12(月) 01:54:44.09ID:Y5bf1y1v
>>793
普通はな、本を勧める状況ってな、
相手は読んだことがないのが当たり前なんだよ。

主題が違う本を挙げるからには、
どういう点で好ましいのかくらいは書いてくれ。
0797デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:29:20.92ID:AHq3PbYw
初心者です。
bool変数hogeの真偽で反対の代入をする場合につきまして、
int a, b;
if (hoge) { a=1; b=2; } else { a=2; a=1; }

int a=1, b=2;
if (! hoge) { a=2; a=1; }
はどちらのほうが好ましい書き方ですか?
完全に好みの問題ですか?
0799デフォルトの名無しさん
垢版 |
2018/11/12(月) 15:37:05.52ID:D6ILV7Jx
>>797
偽(false)の時だけならif(!hoge){...}の方。
0800デフォルトの名無しさん
垢版 |
2018/11/12(月) 15:38:56.82ID:Tf74ZWQr
新スレを作りました。利用してください。

0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/

***********************************************************************

1 名前:デフォルトの名無しさん[] 投稿日:2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室

***********************************************************************
0802785
垢版 |
2018/11/12(月) 18:39:23.46ID:x/TsFEZq
>>791
ありがとうございました。読んでみます。
プログラミングの良書って絶版になること多い気がしますが気のせいですかね・・。
0804デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:59:20.33ID:CbD+/v6g
int a=1;
int b=2;
if (!hoge) {
 const int c = a;
 a=b;
 b=c;
}

俺だったらこうかな。
0805デフォルトの名無しさん
垢版 |
2018/11/13(火) 18:27:28.63ID:90McxFB4
>>796
+1
0806デフォルトの名無しさん
垢版 |
2018/11/13(火) 18:30:06.08ID:90McxFB4
>>797
int a, b = 2 - !!hoge, 1 + !!hoge;
0809デフォルトの名無しさん
垢版 |
2018/11/13(火) 22:19:44.32ID:kE0CzrCg
>>797
多人数で開発する場合は、前者のほうが好まれると思います。
可読性が高いのでコードレビューしやすいですし、改修もしやすいです。
後者は、1行目と2行目の間で、aかbの値を変更する改修が入ってしまうと
2行目のif文に入らない場合に、望む結果が得られません。
プログラマになりたいとかでなければどっちでもいいと思いますが
難しい書き方をすると、時間経って読み返したときに、
自分でも何を書いたかわからなくなりますよw
0810 ◆QZaw55cn4c
垢版 |
2018/11/13(火) 23:35:32.38ID:q+gBL2L3
>>797
else を使わなくて済むのなら、そうしたほうがいい、とはよくききます
0812はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/14(水) 02:13:50.61ID:I7yQY6ax
>>797
状況によっても違ってくると思う。 一般的には前者だろうけど、
{ a=2; a=1; } が例外的な場合として特別扱いしてるってことを強調したい理由があるなら後者で書くこともあるかもしれん。
0813デフォルトの名無しさん
垢版 |
2018/11/14(水) 02:36:40.11ID:JMGKlnVy
いや、効率を考えたら断然最初の else を使う方では?
後者のやり方では hoge が偽の場合、無駄な代入をすることになる
もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど
0814デフォルトの名無しさん
垢版 |
2018/11/14(水) 02:38:54.17ID:JMGKlnVy
すまん自己レス
> もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど

これはムリだった。てことでやっぱり前者
0816デフォルトの名無しさん
垢版 |
2018/11/14(水) 11:29:46.12ID:Hh1ptiAj
設計者の意図が伝わりやすいのは前者
0817デフォルトの名無しさん
垢版 |
2018/11/14(水) 11:45:30.11ID:ND9bKuyE
int a=1;
if(!hoge){
a=2;
}

のa=1は通常の代入じゃないからね。
これは基準値で初期化しんだからよ。

こっちのが効率は良いよ。
0819デフォルトの名無しさん
垢版 |
2018/11/14(水) 12:07:57.04ID:XWwMTSMS
多分タイポでa,bの値を条件によって入れ替える処理だと思うぞ。
0820デフォルトの名無しさん
垢版 |
2018/11/14(水) 12:08:42.29ID:zVp4oIsl
int a = 1 * (!hoge) + 2 * (!!hoge);
線型代数
0822デフォルトの名無しさん
垢版 |
2018/11/14(水) 13:41:43.62ID:B+lK3N2V
>>815
どういう最適化?
初期化されても参照される前に代入が起こる可能性があるから
hoge の判定の後まで初期化を遅延させる、つまり実質 else を使ったのと
同じコードが生成されるということかな?
そこまで出来そうな気もしなかったのだけど
0823デフォルトの名無しさん
垢版 |
2018/11/14(水) 15:05:08.52ID:sW4kyFkZ
初期値として意味があるなら後者でいい気はするが
なんか例が微妙というか、プログラムの流れがなんか不自然
0824デフォルトの名無しさん
垢版 |
2018/11/14(水) 15:14:44.43ID:XWwMTSMS
だよね。
だからやっぱタイプミス(タイポ)で条件によってa,bを入れ替える/入れ替えないを切り替える処理と見た方が自然。
0825デフォルトの名無しさん
垢版 |
2018/11/14(水) 20:24:55.58ID:PBXirj6B
>>822
797の後者のコードがLLVM IR 2命令に最適化される
%2 = select i1 %0, i32 1, i32 2
%3 = select i1 %0, i32 2, i32 1
%0がhoge、%2がa、%3がbにあたる
0826デフォルトの名無しさん
垢版 |
2018/11/14(水) 21:42:49.91ID:1o5yT6ol
>>825
ありがとう。なるほど、すばらしい
これをまんまC/C++に書き戻すと

int a = hoge ? 1 : 2;
int b = hoge ? 2 : 1;

ということかな
でもこれだとhoge を2回チェックしてるので却って非効率な気もするけど
まぁ LLVM はまだ中間形式だから、これをターゲットコードに落とすところで
hoge の判定を一回で済ませるようにさらに最適化するのは簡単そうではあるね
0827デフォルトの名無しさん
垢版 |
2018/11/14(水) 21:44:23.61ID:1o5yT6ol
とは言え C/C++は効率ファーストな言語なんで、最適化を当てにして
ユルいコードでOK、てのも如何なものかという気はする
最適化は所詮、処理系依存だし

まぁ >>823 の言うように、その値で初期化することに強い意味があるなら
その書き方を優先する、そういうトレードオフがあることは認めるけど
0833デフォルトの名無しさん
垢版 |
2018/11/15(木) 16:41:41.66ID:APQKN+QS
>>829
もちろん原則論に過ぎないよ
あと、原則論と言えば「変数は定義時点で必ず初期化せよ」というのもあるわけで
初期化忘れを防ぐためにそういうコーディングルールを設けている所も多いはず
その場合は後者の方が望ましいことになる
初心者はむしろ効率より堅牢性を重視した方がいいかもね
0834デフォルトの名無しさん
垢版 |
2018/11/15(木) 18:14:33.63ID:/yCJioVE
>>830-831
副作用でるやつ
0835デフォルトの名無しさん
垢版 |
2018/11/15(木) 22:00:21.20ID:cIF0PQeg
inline void debug_pulse(int no){
#if(DEBUG == 1)
switch(mode){
case 0: pulse(A0); break;
case 1: pulse(A1); break;
case 2: pulse(C5); break;
case 3: pulse(F0); break;
}
#endif
}

1.この場合 debug_pulse(3);は pulse(F0)と同じになる。
2. #define DEBUG 0 にすると全て跡形もなく消える。
1,2は正しい?
0841デフォルトの名無しさん
垢版 |
2018/11/16(金) 05:03:45.34ID:qDPFPFK+
>2.この世の全てが無くなるとは思えない。質問が不適切。
質問の意図は
inline void debug_pulse(int no){ }はコードを生成しない。これは正しいか?
である。
質問の理解が不適切。
0845デフォルトの名無しさん
垢版 |
2018/11/17(土) 10:49:41.98ID:B4GISbTr
modeがどうかは質問の趣旨と関係ないのでどうでもいいが(modeがglobalとか適当に)

inline void debug_pulse(int no){
switch(mode){
case 0: pulse(A0); break;
case 1: pulse(A1); break;
case 2: pulse(C5); break;
case 3: pulse(F0); break;
}
}



inline void debug_pulse(int no){
}



にしかならないから

1.は「ならない」
2.は「消える」
0846デフォルトの名無しさん
垢版 |
2018/11/17(土) 10:50:51.46ID:B4GISbTr
ああ 2. で消える条件は
debug_pulse() を呼んでる部分が無いことが前提だから

2. 「消える」「消えない」どっちとも言えない

だな
0848デフォルトの名無しさん
垢版 |
2018/11/17(土) 13:20:26.13ID:yMNF1uQT
inlineをどう扱うかなんてコンパイラ次第
どんなコードが吐かれるかが知りたければ
吐かれたコードを見るのが一番
0849デフォルトの名無しさん
垢版 |
2018/11/17(土) 22:18:09.47ID:PyYM1CbT
inline void debug_pulse(int no){
#if(DEBUG == 1)
switch(no){
case 0: pulse(0xA0); break;
case 1: pulse(0xA1); break;
case 2: pulse(0xC5); break;
case 3: pulse(0xF0); break;
}
#endif
}
1.この場合 debug_pulse(3);は pulse(0xF0)と同じになる。
2. #define DEBUG 0 にすると全て跡形もなく消える。
1,2は共に正しい?
0850デフォルトの名無しさん
垢版 |
2018/11/17(土) 22:20:38.34ID:/DEd7oJ8
そもそもpulseがなんなのかわからんから
なにが書いてあるのか意味不明
0852デフォルトの名無しさん
垢版 |
2018/11/18(日) 03:24:10.19ID:P3SzQi6N
次スレからは、

【初心者歓迎】C/C++室 Ver.103【環境依存OK】 を、
【上級者用】C/C++室 Ver.104【環境依存OK】

にした方がいいな。
0854デフォルトの名無しさん
垢版 |
2018/11/18(日) 13:06:07.95ID:OtDWWVpG
いいかお前ら、これから>>852が理解できないことは一切書いちゃだめだぞ。
ここが初心者専用でなく初心者歓迎であってもだ。
回答するのはお前らだからな。
0855 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 14:38:54.74ID:KS5/UdBT
>>852
@すでに上級者スレはありますが?
Aそもそも上級者と初心者の境目をどう定義しますか?
0857852
垢版 |
2018/11/18(日) 16:35:58.45ID:P3SzQi6N
>>855
過去レスから、自ずと答えが出るだろ。
0863デフォルトの名無しさん
垢版 |
2018/11/18(日) 21:35:53.00ID:2nMU53A+
そもそも論言っていい?w
なんで初心者でも上級者でも質問したらきちんと回答してくれるこのスレがあるのに、自分が気に入らないからって勝手に新スレ作るの?
そういうのを躊躇なくやれちゃう人が本当に怖い・・・
0866 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 22:09:26.83ID:KS5/UdBT
>>863
そうそう、そうですよね
初心者には初心者のための回答がつき、上級者には上級者にふさわしい回答がつけば、それで必要にして十分ですよね
なんでスレを分ける必要があるのですか?>>852
0869 ◆QZaw55cn4c
垢版 |
2018/11/19(月) 00:28:37.15ID:MufxDZB0
>>867
>他者排除姿勢
とても興味があるのであえてお聞きしてもいいですか?
私のどういう点に「他者排除姿勢」を感じたのでしょうか
0874デフォルトの名無しさん
垢版 |
2018/11/19(月) 15:26:04.17ID:3MOWhUti
#include <stdio.h>

int main() {
float f = 262143.98;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
return 0;
}

// why 厚切り json
0876デフォルトの名無しさん
垢版 |
2018/11/19(月) 15:40:16.18ID:oi0OLObs
オーバーフローじゃなくて
マシンイプシロンの問題
0878デフォルトの名無しさん
垢版 |
2018/11/19(月) 22:43:09.35ID:dp3XdjsI
様々な処理系依存についてそれぞれ具体的に何に依存してるのかってどこで調べられますか?
ソフトを作って配布するにあたって、ユーザーの環境をwindows7以降のPCに限定するとして
ユーザー側の環境に依存するもの
ユーザー側の環境に依存するがwin7以降のPCでは共通なので実質非依存とみなせるもの
コンパイル側の環境に依存するのでコンパイルしてしまえば非依存とみなせるもの
に分けて調べたいです
0880デフォルトの名無しさん
垢版 |
2018/11/20(火) 06:11:07.08ID:N6+XqoZ1
>>878
まとめて書いてある所なんか無いよ

普通はコンパイラの範疇なものは実行環境に依存しない
一緒に提供しない外部のコードを使う部分(DLL, API, ドライバ)は依存する
と思っておけば良いけど
環境を判断して動作を変えるコードもあるし
実行速度は当然環境に依存する
特定の環境の場合にタイミング依存で発生する問題もある

確実に実行環境に依存しないなんて確証を得られるコードなんてごく限られた範囲になるんで
そんなものに頼らず
出来るだけより多くの環境で評価するのが望ましい
0881デフォルトの名無しさん
垢版 |
2018/11/20(火) 10:23:14.85ID:jmuJusIM
README (.txt) (.md) (.rst)
0882デフォルトの名無しさん
垢版 |
2018/11/21(水) 12:28:30.64ID:kLl3Gqvz
某本で読んだんだけど、クラスの中にポインタ変数もたせる場合って、コピー禁止にするのが一般的?
コピーコンストラクタを書くのがめんどそうだし、そもそもクラスを代入やコピーをあんましないよね?
0883はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/21(水) 12:44:01.50ID:5XDVWHjZ
>>882
そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話で、クラスの性質による。

コピーできない (コピーすると不整合が起こる) ようなデザインならコピーするなって言うだけじゃなくて
コピー禁止 (コピーコンストラクタの削除) にしておいたほうがうっかりコピーしなくて安全だねってだけの話。
0884デフォルトの名無しさん
垢版 |
2018/11/21(水) 22:50:19.46ID:QmHGv3o9
排他主義は当然
低学歴知恵遅れは板から排除するベキ
0885デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:19:14.19ID:xWgjQGqb
>>883
> そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話
これ、全く尤もだし大事な事だと思うんですけど、判断基準を学校や職場で教えてないんですかね?
メモリが少ない組み込み環境だと選択肢はあるけど、C++でアプリを組むような環境だと、
- シングルトンはコピーしない
- それ以外はコピアブル(ディープコピー)にする
一択だと思うんですが。
0887デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:42:08.80ID:yscr9wE/
>クラスの中にポインタ変数もつ
これは、pimpl (pointer implement)デザインパターンだろ

pimpl インスタンスの遅延初期化だろ。
こういうのは普通コピーしないし、コピーするとインスタンスを共有して危険になるとか

遅延初期化するようなものは、非同期読み込みとか、何か失敗する可能性が高い、ヤバイもの

1回目は、ファイルから読み込んで、2回目は、キャッシュから読み込むとか、挙動が変わったり

pimpl を使っていれば、普通と違うから、ヤバイと思っておいた方がよい。
pimpl を使うには、何か理由がある
0888はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/21(水) 23:50:56.39ID:5XDVWHjZ
>>885
原則としてはその意見は正しいと思う。
特別な理由がない限りコピーは出来るべきだ。

その上でコピー可能にするための手間と使い勝手のトレードオフ、
要するに「割に合うか」という判断は実務的なことだから、一律には言えないと思う。
コピー可能に出来るけど、コピーする箇所が一個もなかったわっていうような結末だって
有りうるだろうし。

そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
0889デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:57:54.13ID:xWgjQGqb
>>887
pimplはAPIと実装を切り離して抽象化するためのもんだから、遅延とかキャッシュとか
実装詳細が関係しちゃいけないんじゃないですかね。
例えばマルチエージェントシミュレーションとかで、個々のエンティティの実装をpimplで隠した上に、
エンティティの複製は普通にやりますし。
0891デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:03:02.39ID:hDud6tbH
>>888
> そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
私は古い教育しか受けてないので、過去については全く同感なんですが、
最近はもっと抽象化してるんじゃないかな、と思ったんですよ。
0892デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:06:21.53ID:LhS8U5R1
今はmoveがあるからとりあえずコピー禁止で作るな。
複製したオブジェクトが必要になる機会はあんまりない気がする。
vectorに突っ込んで連続したメモリに割り当てたいときとかかな。
0893デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:16:19.69ID:hDud6tbH
>>892
read-copy-updateとか、マルチスレッディングで使うんですよ。
(スレッド間で同じ領域にアクセスすると、誰かが書き込むときにロックが掛かるから、
ポインタの参照先もコピーしてしまった方が良い)
0895デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:35:05.56ID:hDud6tbH
>>892
私も>>888で言われるまで気付かなかったんですけど、個々のエンティティはコピーしても
シミュレーション系全体をコピーする、とか、大きなオブジェクトをコピーするときって確かに無いですよね。
むしろ万一コードが走ったらレスポンスが遅くなるから禁止すべき。
0896デフォルトの名無しさん
垢版 |
2018/11/23(金) 18:17:04.79ID:Fjl6cL2Z
でかいオブジェクトはコピーじゃなくてデータベースに入れてリビジョン管理するべきだよな
0898デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:15:24.82ID:CDKSSVF4
>>891
コピーコンストラクタって言語機能があるから勘違いしがちだけど
コピーってオブジェクト指向一般的に言えば全くもって汎用的な処理じゃないんだよね
むしろ無理にコピー可を要求するとおかしくなったりパフォーマンスに悪影響することの方が多いぐらいだ
だから、C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
なんでまあ、基本的にはコピーはサポートしなくていい
そのクラスの要件としてコピーのサポートが必須だとはっきり分かったときだけサポートすりゃいい
0899 ◆QZaw55cn4c
垢版 |
2018/11/24(土) 14:34:42.64ID:nrZVZwkF
>>898
>C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
それはクラスは問答無用でヒープに置くことに統一した結果なのでは?
0900デフォルトの名無しさん
垢版 |
2018/11/24(土) 15:11:34.85ID:CDKSSVF4
C#には構造体があるがそれもコピーコンストラクタなどサポートしてないね
オブジェクト指向にはほとんど不要だから
0903デフォルトの名無しさん
垢版 |
2018/11/25(日) 09:06:53.31ID:lehzCciN
コピーコンストラクタなんて使ったことないよ
関数の引数も構造体はポインタで渡すべきだし、関数からの返り値も構造体で返すべきではない
あんなのは使うべきではない
0906デフォルトの名無しさん
垢版 |
2018/11/26(月) 03:48:18.53ID:bwBfDzyf
あるクラスのオブジェクトを静的/動的に確保した場合の互いのメンバ関数処理速度の差ってどれくらいなもんですかね
処理の規模にもよるのですか?
0908デフォルトの名無しさん
垢版 |
2018/11/27(火) 09:16:27.15ID:SZiCwtOh
今プログラミング言語C++4第四版読んでるのですが、中級者なのですが1ページから読んでます
テンプレートはあまり使ったことがなく、テンプレートの章を読んでいるのですが理解出来ているのか出来ていないのか分かりません
皆さんこの本はどんな感じで読みましたか?
0909デフォルトの名無しさん
垢版 |
2018/11/27(火) 09:40:16.02ID:jIxWA8zR
テンプレートは大分前に読んだが、ぜんぜんスマートだとは思わんかったしプログラムもでかくなりそうだったし
くだらねえと思って、読むのやめたよ。 別に使わなくてもプログラム出来るしな
0911デフォルトの名無しさん
垢版 |
2018/11/27(火) 17:54:30.60ID:7Rl1V70s
テンプレートは書くのはちょっと難しいというかアレだが
使うのは簡単だから、まずstd::vectorとか使ってみれば?便利だから
使い方が分かれば作り方もわかるようになるだろう

あとコピーの話でもめてたようだが、オブジェクトのコピーはC++の特徴だからなぁ
C言語からのもので、構造体が値型と同じようにコピーできるっていう
そのおかげでスタックにオブジェクトを確保してRAIIが出来るまぁこれも特徴的だわ
一方で配列が=でコピーできないのもC言語からのもので
構造体より配列の方が他の言語で言うところのオブジェクトと似たような仕様になってるw
参照するとポインタに格下げになるのもJavaやC#のオブジェクトと一緒だね
0912デフォルトの名無しさん
垢版 |
2018/11/27(火) 18:01:09.09ID:7Rl1V70s
もしC言語の構造体が配列の仕様と同じように
アクセスしようとするとポインタに格下げになってコピーできない仕様だったのなら
C++のクラスはもうちょっとモダンな仕様になってたかもしれないよね
値渡し出来ないからコピーの事を考えなくてもよいし
GCないからキツイか
0913デフォルトの名無しさん
垢版 |
2018/11/27(火) 19:03:17.02ID:NSs5prW8
>>911
> 使い方が分かれば作り方もわかるようになるだろう
コンパイラの使い方が分かっても作り方が分かるやつはそんなに多くないが…
0914デフォルトの名無しさん
垢版 |
2018/11/27(火) 19:33:57.58ID:7Rl1V70s
その場合でも、例えばC言語のコンパイラを作りたいとき
C言語の使い方を理解せずにC言語のコンパイラを作るより
C言語の使い方を学習してからC言語のコンパイラを作る方が
賢明だろ
0915 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 20:17:27.09ID:X/MEoliS
>>906
性的・童貞的の差異よりも仮性・真性の差異を問題にすべきかと
0916 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 20:18:05.47ID:X/MEoliS
>>909
lisp のマクロとC++のテンプレートとは、どっちの方がイケてますか?
0917 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 20:18:59.91ID:X/MEoliS
>>911
>配列が=でコピーできないのもC言語からのもので
私はときどき夢想します、配列が=でコピーできたとしたら、どんな世界観がふりかかってくるのでしょうか?
0920 ◆QZaw55cn4c
垢版 |
2018/11/27(火) 21:04:08.91ID:X/MEoliS
>>915
訂正します
静的・動的の差異よりも仮想か非仮想かを問題にすべきかと思います
0922デフォルトの名無しさん
垢版 |
2018/11/27(火) 22:10:55.41ID:F5dyxMID
>>910
ちょっとだ
まってて
0923デフォルトの名無しさん
垢版 |
2018/11/28(水) 14:52:38.77ID:SOoAorbX
>>918
実体化を明示すれば書けるよ
使う奴を全部列挙しなきゃならないけど、ロジックを共用できるのは大きい
0924デフォルトの名無しさん
垢版 |
2018/11/28(水) 23:40:54.22ID:eIhtGkxx
#include <stdi.h>
int main(void)
{
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
printf(" %2d", i * j);
}
printf("\n");
}
return 0;
}
あるサイトを参考に
簡単な九九の表を作ると
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15...
...
...
(略)
このようになると思いますが、
隣の数字を参照にして足して
3 5 7 9 11 13 15 17
6 10 14 18 22 26 30 34
9 15 21 27 33...
...
...
(略)
と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。
0926デフォルトの名無しさん
垢版 |
2018/11/29(木) 00:21:59.55ID:kX/wXhND
>>924
別スレにも書き込んでたけどそっちでは相手にされてなかったね。
上記サイトと書いておいて、そのサイトが抜け落ちてるよ。コピペしたなら推敲もしような。

やりたいことは i*j+i*(j+1)を出力するということか?
0931デフォルトの名無しさん
垢版 |
2018/11/29(木) 12:32:34.75ID:f12HiZt9
この手の表現はネット検索でも探しにくいからなぁ。
検索ワードに含めることができない文字を使ってるかも知れんし。

Wikipedia で「顔文字」の「欧米型の顔文字」に例示されてるね。
P は大文字が普通なのか。小文字 p だと思ってたわ(てへぺろ)。
0933デフォルトの名無しさん
垢版 |
2018/11/29(木) 14:47:03.14ID:xfZAdJ8f
こないだTWITTERで orz の話題が流れてたわ。

「絵文字があるのにそういうので遊んでたんですね!」 → 「無かったんだよ (#^ω^)ピキピキ」
0934デフォルトの名無しさん
垢版 |
2018/11/29(木) 21:00:05.47ID:wegp6ebJ
全くの素人なんだがスタックサイズ以上の巨大なクラスをローカル変数として宣言したら即オバーフロー起こす?
0937デフォルトの名無しさん
垢版 |
2018/11/30(金) 08:17:26.96ID:J8op9N/7
スタックサイズのオーバーフローって普通、いちいちサイズ確認しながらエラー判断じゃなくて、
割り込み処理でやってるんだろ
0938デフォルトの名無しさん
垢版 |
2018/11/30(金) 12:27:47.34ID:lE6q+nZQ
環境依存
個々の話をしたいなら
> そのような質問は必ず環境を書きましょう
0939デフォルトの名無しさん
垢版 |
2018/11/30(金) 14:20:25.90ID:fQi4U1HQ
宣言しただけでアクセスもせず関数も呼ばないなら、
エラーにならないのがほとんどかもな。
0940はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/30(金) 17:07:30.48ID:R1lF+QB2
自動変数を宣言しただけで使わないなら
最適化で消えちゃうこともあるかもな。
0942デフォルトの名無しさん
垢版 |
2018/12/01(土) 21:49:38.80ID:FAoigf3s
TinySchemeのカスタムインタプリタ作った時、例外の扱いやら引数チェックやら面倒で面倒で。
どうせみんなやってるんだから、標準のAPIがあれば車輪の再発明をせずにすむのに。
0943デフォルトの名無しさん
垢版 |
2018/12/01(土) 21:54:14.62ID:o8nGgYR0
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main(void)
{
string str;
getline(cin, str);
//cin >> str;
transform(str.begin(), str.end(), str.begin(), toupper);
cout << str << endl;
return 0;
}
このコードの「getline(cin, str);」と「cin >> str;」と「cout <<」
の部分にエラーが出るのですが何が原因かわかりますか?
別個にstd::を付けてもだめでした。解かる方いましたらよろしくお願いします。
0946はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/12/01(土) 22:08:39.24ID:OSJOUMnn
>>943
toupper は <locale> にある関数テンプレートと、 <cctype> に普通の関数がある。
どれだかわかんなくて混乱している。

toupper を [](char ch){return std::toupper(ch);} という風にラムダ式でくるむのが一番楽な方法だと思う。
0947デフォルトの名無しさん
垢版 |
2018/12/01(土) 22:24:03.10ID:FAoigf3s
> Guile
Cygwinの中じゃなきゃ動かないじゃないですかw
WindowsのGUIアプリのカスタマイズに入用だったんですよ。
0948はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/12/01(土) 22:59:29.94ID:OSJOUMnn
>>947
Windows だけでいいなら、
言語処理系を組込んでしまうよりはインターフェイスを COM にしておいて
適当な (OLE オートメーションに対応した) 言語を使ってもらう方が簡単かも。
0949デフォルトの名無しさん
垢版 |
2018/12/01(土) 23:02:01.99ID:o8nGgYR0
>>945
コンパイル通りましたありがとうございます!
>>946
レスありがとうございます。ラムダはC#のをちょっとかじったくらいなのでよくわからないです。
0951はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/12/02(日) 01:23:40.96ID:AEdnuZu9
Windows なら WSH がすごく良い仕組みなので、
その枠組みをぜひ活用して欲しいと思ってる。
0953デフォルトの名無しさん
垢版 |
2018/12/02(日) 16:20:56.00ID:qwr+Mk5T
今は日本語や漢字にとどまらず、Unicodeで許されるあらゆる言語の文字を使ってるから、表現性はとても豊か(何がだ)
0954デフォルトの名無しさん
垢版 |
2018/12/02(日) 16:34:18.61ID:FIqRJPSc
[](){}と括弧揃い踏みなところがラムダ式の素晴らしいところ
キャプチャの必要性が分かるまで15時間も掛かった
0955デフォルトの名無しさん
垢版 |
2018/12/02(日) 19:18:33.98ID:dV4bdQkD
>>950>>951
今思えば全く勉強不足だった...
階層的データ構造(CADとか)はS式と思い込んでいたのよ
0956デフォルトの名無しさん
垢版 |
2018/12/03(月) 00:53:09.20ID:G9VPwKeW
#include <iostream>
#include <string>

using namespace std;

int main(void)
{
string x;
cin >> x;

for (int i = 0; i != x.size() - 1; ++i)
{
cout << stoi(x[i]) << endl;
}
}
0957デフォルトの名無しさん
垢版 |
2018/12/03(月) 00:54:55.68ID:G9VPwKeW
⬆が動かないのですがどこが間違っているのかご教示下さい

C11は対応しています
0960デフォルトの名無しさん
垢版 |
2018/12/03(月) 06:05:42.99ID:szUqPRvW
>>956 が動かないってのはコンパイルエラーということだよね。

string x; だから x[i] の型は char で、
一方 stoi() が要求する引数は string であるからして...
0961デフォルトの名無しさん
垢版 |
2018/12/03(月) 15:49:30.56ID:bFjQrMvM
こういうことをしたいのではないか?

ここを    cout << stoi(x[i]) << endl;
こうする   cout << (isdigit(x[i])? x[i] - '0': 0) << endl;
0962デフォルトの名無しさん
垢版 |
2018/12/05(水) 04:14:09.40ID:yf36y6mU
クラスの中の宣言部分で
var a = new classA(32);
がある時にこの生成時間を測るには
p1out = 1;
var a = new classA(32);
p1out = 0;
ってやってP1.1をオシロで確認したらいいのだろうか?
0965デフォルトの名無しさん
垢版 |
2018/12/05(水) 11:50:29.68ID:UMfTWITZ
スタック領域に確保した変数のメモリはその変数のスコープ終了時に開放される
静的領域はスコープが終了しても開放されない
0966デフォルトの名無しさん
垢版 |
2018/12/05(水) 14:18:35.25ID:2sSegHBZ
だがちょっとまってほしい
本当にそれだけだろうか?
0968デフォルトの名無しさん
垢版 |
2018/12/05(水) 16:03:55.84ID:ccXzaFBs
静的領域は、アプリの実行前に確保する。
サイズも変動しない

スタック領域は、アプリの実行中に確保・解放する。
サイズも変動するし、領域を使い果たすと、stack overflow というエラーが起きる

事前にサイズがわからず、サイズが変動して、エラーが起きる可能性もあるので、
組み込み制御装置では、制限される事もある
0970デフォルトの名無しさん
垢版 |
2018/12/05(水) 17:12:15.31ID:ifntcr/4
組込だとスタック4つまでとかあるね。
下手に関数の中で関数呼び出し出来ない。

今はだいぶ緩和されてるけど、数が増えただけでPCほど緩くはない。
0971デフォルトの名無しさん
垢版 |
2018/12/05(水) 21:08:04.50ID:vV3Kttot
int num;
unordered_set<int> ust;
auto itr = ust.find(num);
itr == ust.end() ? ust.insert(num) : ust.erase(num);
とすると、
error: operands to ?: have different types
というエラーがでます
三項間演算子を使わずにif文を使って書くと普通に上手く行くのですが、なぜエラーがでるのでしょうか
0972デフォルトの名無しさん
垢版 |
2018/12/05(水) 21:30:51.95ID:8vnwU0Eo
この前パソコンで100回くらいの再帰を書いたけど大丈夫だった
それともgccがよしなにやってんの?
0974デフォルトの名無しさん
垢版 |
2018/12/06(木) 06:42:35.96ID:6JYs1FEy
三項演算子が絡んだ式の (条件 ? 値A : 値B) 部分で
値Aと値Bの型が異なると、三項式(と言う呼び方で良いものか)全体としての
結果の型が確定しないからダメって感じかねぇ。

どうせ値を使っていない式文だからいいじゃん、は通らないと。
0975デフォルトの名無しさん
垢版 |
2018/12/06(木) 08:07:06.33ID:puhZa8TL
>>974
そうだね。
値A、値Bともに(void)でキャストすればコンパイルできた気がする。
そんなことするくらいなら素直にif/elseにすべきだけど。
0978デフォルトの名無しさん
垢版 |
2018/12/06(木) 09:05:40.26ID:THHCczvq
スタック領域は同じコンパイラでもオプションで変えられる事も多い(組み込みには言及しない)
末尾再帰だとループに展開されたりもするから(外から見た挙動が同じならC/C++はコンパイル後の表現を縛らない)、再帰イコールしぬとは限らない
0981デフォルトの名無しさん
垢版 |
2018/12/07(金) 14:38:45.55ID:lkrG/qbb
型の違いでっていうのも判るが
結局評価だけして代入しないなら
(副作用を期待しないって条件付きだが)
最適化で消される行かも知れんな
0982デフォルトの名無しさん
垢版 |
2018/12/13(木) 22:22:08.57ID:JDKMBsk/
https://ideone.com/pUrvlb
VisualStudioCommunity2017 ver15.9.4でこのコードをビルドすると
「error C2440: '<function-style-cast>': 'int' から 'Lit' に変換できません。」
というエラーが10行目で出るんだけど、何が悪いんだろうか。
0983デフォルトの名無しさん
垢版 |
2018/12/14(金) 01:28:14.98ID:l0obV/M9
Parser() { reg(Lit{ 1 }); } → Parser() { ::reg(Lit{ 1 }); }
コレでいける
理由は知らん
0985デフォルトの名無しさん
垢版 |
2018/12/27(木) 10:14:18.41ID:aMHl4+JJ
ubuntuで日本語含むファイル名を操作したいのでwoendirとかないのか探したんだけど見つからず、
wchar_tでファイル名処理した場合、いちいちmbstiwcsで変換するしかないの?
0986デフォルトの名無しさん
垢版 |
2018/12/27(木) 10:19:33.81ID:0qVX2+Xi
変換出来ない文字はどうすんの?
0989デフォルトの名無しさん
垢版 |
2018/12/27(木) 12:49:46.03ID:aMHl4+JJ
utf8のままどーやってopendirするのさ?
それができないから困ってるのに

DIR *dir = opendir("hogehoge");
struct dirent *dp;
dp=readdir(dir);
としたとき,dp->d_nameに入ってるファイル名ってのはcharだよね
このファイル名に手を加えようとする(renameとか)と、utf8の場合、いったんmbstowcsでwchar_tにでもコピーするとか、
wstringにでもコピーしないと文字コードと格闘する羽目になるよね。
もし、
wDIR *wdir = woprndir(L"hogehoge");
struct wdirent *wdp;
wdp = wreaaddir(wdir);
とかできればsonomama
wdp->d_nameはwcha_tなので文字の先頭バイト見て何文字なのか判断するなんて余計な操作しなくて済むと思ったわけ。
0990デフォルトの名無しさん
垢版 |
2018/12/27(木) 13:00:04.82ID:aMHl4+JJ
bashで
for i in *; do
$newname=`echo $i| myprogram`
mv $i $newname
done

で済ませてたんだけど、myprogramの方は単に文字処理だけで、
置換とか文字列削除とかややこしいところはwstringに変換してた。
bashに任せてたディレクトリオープンや、ファイル操作までC/C++でやらせようとなると、
再度wcstombsとか余計なコピーが必要になってなんだか思いっきり損してる気分になったので、
なんかほかの手がないものかと?
0991デフォルトの名無しさん
垢版 |
2018/12/27(木) 13:49:46.07ID:SzdNjvIa
>>989
utf8 を wchar_t* に入れるのはただのアホやろ
0994デフォルトの名無しさん
垢版 |
2018/12/27(木) 17:54:58.01ID:o7TBUkJP
無責任なこと書くけど、
Linuxならmountコマンドにオプション加えれば
ファイル名の文字コードをうまいこと透過的に変換してくれんか?

ファイルの実体に手を触れずにファイル名のコード系だけ変えたいなら、
struct dirent の d_name のバイト列をどう解釈するかの問題で、
ロケール関係ない話になりそうだし。
0997デフォルトの名無しさん
垢版 |
2018/12/28(金) 01:33:23.72ID:qtS4fp6w
>>991
それは違うだろ
ファイル名をcharに入れてregex_replaceあたりの正規表現で再びcharに入れる場合はともかく
全角半角変換みたいに文字コードそのものをいじりたい場合はwchar_tに入れるだろ
全角文字コード -= '!'-'!'
みたいな変換しようすれば
char *pBuf = Bufとして、
*pBufの値に応じて
((*pBuf<<16) +(pBuf[1]<<8)+(pBuf[2] )&(0x00ffff
みたいなバイトの組み立てが必要になるじゃん
*pBufの文字コードに応じて
pBuf +=3だのpBuf++だのインクリメント幅の調整も要るし
いったんwcha_tに入れるのは何も間違ってないと思うが
0998デフォルトの名無しさん
垢版 |
2018/12/28(金) 02:13:55.81ID:qtS4fp6w
シェルからファイル名をfgetwsで受け取ってるうちはwchar_tとwstringで処理してから
またシェルに出力を返せばすむけど
opendirにwchar_t版がないんで、正規表現以外の処理して、
シェルに任してた部分をC++で全部書こうとすると、
>>993のいうようにmbstowcsとwcstombsで処理を挟んでやらんとどーしよーもないと思う
0999デフォルトの名無しさん
垢版 |
2018/12/28(金) 05:55:59.60ID:ufThBpcD
c++builder10.3 community
IID_PPV_ARGSを使わない場合どうしたら良いか教えてください
何を入れたら良いのかわからないです
#include <windows.h>
#include <tchar.h>
#include <shlobj.h>
#include <shellapi.h>
#include <commoncontrols.h>
void __fastcall TForm1::Button1Click(TObject *Sender) {
IImageList *piml;

SHGetImageList(SHIL_JUMBO, IID_IImageList, (void**)&piml);// pimlがNULLになる

SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml));// 成功
}
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 180日 2時間 20分 26秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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