【初心者歓迎】C/C++室 Ver.106【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2020/07/13(月) 13:53:44.41ID:WBkWHxcT
C言語を256倍使うための本
ttps://www.%61mazon.co.jp/dp/4756100430
詳説 C++ 第2版
ttps://www.%61mazon.co.jp/dp/479732743X
0007デフォルトの名無しさん
垢版 |
2020/07/13(月) 16:28:13.78ID:srh9sya6
メンバに自クラスの配列を持つクラスのメンバ配列の初期化はc++ではどうやりますか?Javaでは下のように出来てます。

☆Javaでこうなっています
class A {
protected A[] node = new A[3];
}

☆c++でこうしたらエラーになりました。
@a.hpp
class A {
public:
static A node[];
};

@a.cpp
#include "a.hpp"
A A::node[] = new A[3];

ちなみに型Aを適当にintとかにしたらc++の方もいけました。
0008デフォルトの名無しさん
垢版 |
2020/07/13(月) 16:38:40.16ID:ny9O75E1
>>7
nodeは静的メンバ変数でいいの?
java同様、staticはすべてのクラスインスタンスで共通の変数って意味だけど。
0009デフォルトの名無しさん
垢版 |
2020/07/13(月) 16:41:24.41ID:srh9sya6
>>8
ダメだとは思ってましたが、つけないと不完全な型名は使用できませんと怒られました。
c++ではメンバに自クラスの変数がいるとダメなのですか?
0010デフォルトの名無しさん
垢版 |
2020/07/13(月) 17:07:02.67ID:WBkWHxcT
うまくいく例
class A {
public:
static A *node;
};

A *A::node = new A[3];
0013デフォルトの名無しさん
垢版 |
2020/07/13(月) 17:30:23.80ID:KVdg44rD
>>9
> c++ではメンバに自クラスの変数がいるとダメなのですか?
そりゃだめだよ、もしそんなのができたら
class A {
A a;
int b;
};
A x;
とした時に x.b; x.a.b; x.a.a.b; ... みたいに無限に int b; を作る羽目になるから。
Javaなどは
class A {
A *a;
int b;
};
みたいなのしかできないから問題ないだけ。
0014デフォルトの名無しさん
垢版 |
2020/07/13(月) 17:33:49.37ID:17o/9bhC
C++のクラス変数とJavaのクラス変数の違い、だっけ。
端的に「C++ではnewなしにクラス変数を宣言して使える」ようにするため。

Javaと対比しながら説明する能力がないんで中途半端で悪いけど。
001514
垢版 |
2020/07/13(月) 19:29:02.10ID:17o/9bhC
× 変数を宣言
○ 変数を定義

中途半端な上に間違っててすまぬ。
あまつさえ細かい訂正のために貴重な投稿枠の浪費までも。
0016デフォルトの名無しさん
垢版 |
2020/07/14(火) 08:27:52.03ID:bhhAeN2N
>>14
クラス変数の問題ではなく、クラスのメンバとして配列を宣言した場合にC++では配列の実体をメンバとして持つのに対し、Javaでは配列の実体は別のところに作られて参照だけを持つというところでないの?
0018デフォルトの名無しさん
垢版 |
2020/07/14(火) 09:28:38.75ID:PHX4w74f
>>16
配列は関係ない
C++はクラス型のクラス変数を定義すると実体を持つから自分自身を定義できないってだけ
JavaやC#は実体じゃなくてポインタを持つだけだから問題ないってこと
0019デフォルトの名無しさん
垢版 |
2020/07/14(火) 12:52:08.42ID:Mma3I+br
C/C++ はヌルポを敢えて使う
0023デフォルトの名無しさん
垢版 |
2020/07/15(水) 12:07:21.21ID:cL9c5hZ8
enum {hoge, fuga, hage};

hoge==0
fuga==1
hage==2
として使えるとして
0,1,2とかの数字から実行時にhoge,fuga,hageの名前を知りたい時って
何か便利なインターフェースありますか?
みんな毎回線形探索のコード描くみたいにやってる?
0024デフォルトの名無しさん
垢版 |
2020/07/15(水) 12:39:32.75ID:fkxllX2L
>>23
連番なら配列に入れときゃいい
番号飛んでいて…
・件数少ないなら線形サーチ
・件数多いならハッシュとかバイナリサーチとか
0026デフォルトの名無しさん
垢版 |
2020/07/15(水) 13:02:12.66ID:cL9c5hZ8
連番じゃないときとか
結構でかい番号だったりするときは困りますね
0027デフォルトの名無しさん
垢版 |
2020/07/15(水) 13:08:43.15ID:ONqo+DKP
##演算子でどうにかなるんじゃね
0028デフォルトの名無しさん
垢版 |
2020/07/15(水) 13:14:49.36ID:jM1x+GOc
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0029デフォルトの名無しさん
垢版 |
2020/07/15(水) 13:38:14.90ID:cL9c5hZ8
線形探索するにしても enum 用に foreach もあるのかなと思ったのですが
http://sanichi999.hateblo.jp/entry/2014/12/19/011820
こんな感じですね
名前とか同じことを何度も書いてる気がしてしまうのと
割と定型な気がするのでコンパイラが提供してくれてないかなと思ったで質問しました
0030はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/07/15(水) 15:30:19.58ID:hr2ndtrb
実行時に列挙定数の名前の文字列が欲しいことがそんなにあるかな?
デバッグプリント用途くらいしか思いつかんのだけど。
0031デフォルトの名無しさん
垢版 |
2020/07/15(水) 16:14:13.34ID:LgiIyt9Z
vector<int> a = {8, 1, 9, 5, 7, 3};
があるときに例えば
vector<int> b = a{0, 2, 5};
とかしたら
b が {8, 9, 3} の配列みたいになってくれる書き方ってありますか?
0037はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/07/16(木) 13:49:08.52ID:MICl0UeU
>>36
エラーメッセージを見ればわかるやろ。
T はパラーメーターパックであって、展開せずに使うということはできへんのや……。
0039デフォルトの名無しさん
垢版 |
2020/07/17(金) 13:55:06.86ID:xXsIieN6
テンプレートが型付マクロにしかみえません
眼科に行った方が良いですか?
0041デフォルトの名無しさん
垢版 |
2020/07/17(金) 17:27:51.73ID:LIcKojh8
マクロといってのcのマクロではなくlispのマクロ的な機能
まあコンパイル時の制限はあるけど
0042デフォルトの名無しさん
垢版 |
2020/07/18(土) 01:05:56.87ID:vSXqjqjP
Win32APIでコンボボックスの値をオーナードローしているんですが、wchar_tで項目追加すると文字の描画ができるんですが、
c_str()だと文字化けします。何故ですか?

・WM_INITDIALOG
 文字化けしないケース
  const wchar_t *a = L"あいうえお";
  SendMessage(hForeColor, CB_ADDSTRING, 0, LPARAM(a));

 文字化けするケース
  std::wstring b = L"あいうえお";
  SendMessage(hForeColor, CB_ADDSTRING, 0, LPARAM(b.c_str()));

・WM_DRAWITEM
 DrawText(lpDraw->hDC, (wchar_t*)lpDraw->itemData, -1, &r2, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
0044デフォルトの名無しさん
垢版 |
2020/07/18(土) 02:35:10.07ID:IdAxqtyn
オーナードローの時、CBS_HASSTRINGSスタイル指定しないと、そんな感じになるっぽいね
CB_ADDSTRINGメッセージに書いてあるね
0045デフォルトの名無しさん
垢版 |
2020/07/18(土) 13:25:54.56ID:94poIsAY
1つの言語をある程度やりこまないと能力値がリセットされますか?
0046デフォルトの名無しさん
垢版 |
2020/07/18(土) 13:38:50.50ID:uRU3MGLx
理解する能力と
使いこなす能力と
創造する能力は
全部別
0047デフォルトの名無しさん
垢版 |
2020/07/18(土) 15:42:57.82ID:94poIsAY
理解力のことです
ごめんなさい
0048デフォルトの名無しさん
垢版 |
2020/07/18(土) 15:58:14.32ID:qVma+RcU
リセットはされない。
複数言語を学ぶときは並行にやって混乱するか順番にやって混乱するかのどちらか。
自分に向いた方を選べ。
0049デフォルトの名無しさん
垢版 |
2020/07/18(土) 16:14:37.72ID:C0jdHcgs
ある程度やりこまなければある程度落ちるのは常識
ある程度やりこめばある程度上がるのも常識
0050デフォルトの名無しさん
垢版 |
2020/07/18(土) 17:22:27.13ID:Bt+NBO6d
>>45
リセットされたのではなく、自分が理解できていたと思い込んでいただけで実際の理解がその程度だったということに気づかされただけだと思うぞ。
0051デフォルトの名無しさん
垢版 |
2020/07/18(土) 18:01:57.62ID:51enBbxV
あるある
0052デフォルトの名無しさん
垢版 |
2020/07/18(土) 18:20:51.79ID:sJrDCvPM
fopenでccs=utf-8を指定して改行コードのCRLFをfputwsで書き込んだら
CRCRLFになったんですけど。バグですか?
0053デフォルトの名無しさん
垢版 |
2020/07/18(土) 18:38:01.13ID:yqiH8/gB
appendで開いてたり
0054蟻人間 ◆T6xkBnTXz7B0
垢版 |
2020/07/18(土) 18:39:23.19ID:5h3AvQ+O
>>52
WindowsではLFがCR LFに変換されるので、仕様ですよ。
CRを出力しないか、バイナリファイルとして出力して下さい。
0056デフォルトの名無しさん
垢版 |
2020/07/18(土) 19:10:12.51ID:tp8HW1uL
バイナリじゃなく、テキスト処理してる場合は、
各OS のAPI を使った時に、

Windows なら、CRLF になって、
Linux なら、LF になるのだろう

Ruby でもそう。
Windows にインストールしたものは、CRLF になって、
Linux にインストールしたものは、LF になる
006056
垢版 |
2020/07/18(土) 19:57:14.80ID:tp8HW1uL
Global New Line みたいな指定もある。
\n が、OS によって自動的に切り替わるもの

Windows なら、CRLF になって、
Linux なら、LF になる
0061デフォルトの名無しさん
垢版 |
2020/07/19(日) 06:39:45.80ID:wsDBDsuq
\nはコンパイラが読み込んだ時点でLFに変換される
そうでないと、'\n'みたいな文字を読み込んだ時に
保存に2バイト必要になってしまう
0062デフォルトの名無しさん
垢版 |
2020/07/21(火) 11:50:35.81ID:IJfaFmgd
C++のenumの仕様について質問させてください

enum Aとenum Bが定義されていた時、
void func(enum A);
void func(enum B);
のようにオーバーロードできるでしょうか。
0063デフォルトの名無しさん
垢版 |
2020/07/21(火) 11:58:59.44ID:+OCbOnRh
enum class
0068デフォルトの名無しさん
垢版 |
2020/07/31(金) 02:13:31.68ID:zHNUGG0v
最近C++勉強し始めて疑問に思ったので教えて下さい
std::vector<int>vec;
auto result = std::find(vec.begin(), vec.end(),3);

上記のようにvectorを宣言だけで初期化せずにfind関数内でbegin()、end()を使用しても例外が発生しません
これは範囲外の要素にアクセスしているわけじゃないという理解でよろしいでしょうか
0069デフォルトの名無しさん
垢版 |
2020/07/31(金) 02:35:13.36ID:E2vmFTLm
そうだね
というか最初はbegin=endだから、findで一度もループ処理が発生しないだけ
0070デフォルトの名無しさん
垢版 |
2020/07/31(金) 08:38:17.94ID:UG/y1RVK
>>68
自分で明示的に初期化していないだけで、vectorの変数を宣言しただけで勝手に(サイズが0のvectorとして)初期化してくれる。
vectorのコンストラクタがそれをやってくれている。
0072デフォルトの名無しさん
垢版 |
2020/07/31(金) 11:04:11.23ID:N0eufbNj
#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;
}
0076デフォルトの名無しさん
垢版 |
2020/08/05(水) 08:45:38.77ID:FS19WAoY
下火っていうか
調理場にあるラップのようなもので特に意識されることはないけど欠かすことのできないもの
でもラップを使った料理っていうとどうしてもお手軽感がぬぐえない
プロの調理師はこういうものはできるだけ人目につかないようにする
0080デフォルトの名無しさん
垢版 |
2020/08/06(木) 11:01:09.05ID:6QU45l4b
boostじゃなくても同じことが出来るものがあったら後者を選ぶな
なんでだろ自分でもわからんω
0081デフォルトの名無しさん
垢版 |
2020/08/06(木) 11:13:25.84ID:YI93igBY
いまならasioなどのために使うのでは。
そしてネットワーキングTSが標準に入ると、また使わなくなる。
そういうサイクルがあるのでは。
0085デフォルトの名無しさん
垢版 |
2020/08/08(土) 10:09:00.08ID:noFfmCPy
>>82
TCHARはオワコン
全く不要
0092デフォルトの名無しさん
垢版 |
2020/08/08(土) 16:39:57.58ID:/RuHG5bH
C++11の前はboostめっちゃ使ってました
0093デフォルトの名無しさん
垢版 |
2020/08/08(土) 16:52:58.78ID:OT1M6D83
Debianがgcc8なのでfilesystemをboostのほう使うとか。
互換性が動機という場合もありますね。
0094デフォルトの名無しさん
垢版 |
2020/08/08(土) 19:24:55.75ID:Sbg9T/ud
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 という整数リテラルが、「適合」するというのは、
正しい仕様でしょうか?
0095デフォルトの名無しさん
垢版 |
2020/08/08(土) 20:40:58.31ID:jGasFcRb
その関数はCの関数なので、そもそもマンぐり返されてないし、より適合するオーバーロード関数の存在なんて考慮してないんじゃね?
0096デフォルトの名無しさん
垢版 |
2020/08/08(土) 21:31:49.81ID:Sl6pvmJG
>>94
> unsigned char 型の仮引数に、int 型の変数を渡そうとすれば、不適格に成り、その関数は対象から除外されます。

これが誤解なのでは?
暗黙変換されるでしょ。
0097デフォルトの名無しさん
垢版 |
2020/08/09(日) 00:18:25.48ID:5wTPapRC
>>96
確認しました。charの仮引数の場所に、int 変数を実引数にして渡しても、
エラーも警告も出ませんでした。
関数呼び出しだけでなく、
int i = 0x123456;
char c = i;
としてもエラーも警告も出ませんでした。
テストは、VS2019のC++で行いました。
0098はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/08/09(日) 00:32:08.26ID:ayHdPpdd
整数型同士はどの組み合わせでも暗黙の型変換はされるんじゃね。
変換後の型が符号付きかつ、変換後の型が表現できる範囲に収まらない値だったときの挙動が未定義ではあるので、
狭い方向への変換のときに警告くらいは出してくれることもあるみたいだが、
オーバーロードの解決の際に排除されることはない。
0099デフォルトの名無しさん
垢版 |
2020/08/09(日) 12:09:42.16ID:5wTPapRC
>>98
ついでに、お聞きしたいのですが、
class CBase {・・・};
class CDerived : public CBase {・・・};
の場合、
CDerive* ---> CBase*
への変換は標準変換は有りますが、
CBase* ---> CDerive*
への変換は標準変換は有りませんよね。
しかし、
CBase *pBase;
に対して、
(CDerived*)pBase
というcastは、down castであり、気をつけなければならないキャストではありますが、組み込みのcastとして、
どのコンパイラでもサポートしています。
(この場合、型の解釈の変更だけでなく、マシン語レベルでの生の値も、offset分だけ変更になることがあるのは
周知の通りです。)
ということは、標準変換ではないにも関わらず、キャストではなぜかサポートしていると言うことになるのでしょうか?
0100デフォルトの名無しさん
垢版 |
2020/08/09(日) 12:11:08.88ID:q7SdW+2C
>>97
viable function とか言うから規格上の確認がしたいのかと思ってたけど、そこは実験でいいのか。
0102デフォルトの名無しさん
垢版 |
2020/08/09(日) 12:26:51.20ID:5wTPapRC
>>100
draftを見たら、実引数から仮引数への標準変換が有る場合には、暗黙の型変換
となりえて、viable function となり、かつ、標準変換には
char ---> int だけでなく、int ---> char の変換も含まれているらしいことが
分かりましたが、確認のため、VC++ 2019でチェックしてみました。

>>101
やはり、「(型)値」の形式を筆頭とする明示的型変換には、標準変換以外でも
「組み込みの変換(キャスト)」
が有るのかも知れませんね。
これは始めて知りました。
0103デフォルトの名無しさん
垢版 |
2020/08/09(日) 12:29:59.88ID:5wTPapRC
>>102
最後、何が言いたいかと言うと、
『「組み込みの変換」には、「標準変換」には含まれていない変換も含まれている。』
ということです。
CBase*--->CDerived*
は、「標準変換」には含まれていませんが、「組み込みの変換」には含まれているということです。

また、それとは別に、int--->charは、危険を招くことがあるにも関わらず、「標準変換」
に含まれてしまっていると言うことです。
0104デフォルトの名無しさん
垢版 |
2020/08/09(日) 13:40:09.55ID:3E+EuOxc
CBase* は CDerived* から変換したものかもしれないから変換可能なのが自然だろう。アップキャストとは違って暗黙にはされないし。
C式のキャストはチェックは継承関係をチェックしないがC++のキャストはするしな。
0105デフォルトの名無しさん
垢版 |
2020/08/09(日) 15:59:54.85ID:EBrjBl58
char と int は cast されてる訳じゃないからな
0106デフォルトの名無しさん
垢版 |
2020/08/09(日) 18:28:19.40ID:5wTPapRC
みなさま、色々と有難うございました。
今回はこれで質問を閉じたいと思います。
0107デフォルトの名無しさん
垢版 |
2020/08/11(火) 07:34:37.14ID:DHq4+2OG
マンぐり返しってなんですか?
0109デフォルトの名無しさん
垢版 |
2020/08/13(木) 15:42:03.16ID:Tr7DEHMo
初心者なんですけど、tupleって使ってますか?
0110デフォルトの名無しさん
垢版 |
2020/08/13(木) 15:49:39.88ID:hDTlT7Ky
tuple も tie も便利よ
0114デフォルトの名無しさん
垢版 |
2020/08/15(土) 19:36:08.85ID:YDp7CJXQ
超ド素人の質問ですみません。
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の中の質問者の現象の再現をしたいのです。
0115デフォルトの名無しさん
垢版 |
2020/08/15(土) 19:50:05.09ID:5gsdnDz9
読んだままだろ
cbの型が合っていないといっているからcbの型をSIZE_Tにすりゃ良いんでないかい
0116デフォルトの名無しさん
垢版 |
2020/08/15(土) 20:10:51.19ID:YDp7CJXQ
ほうほう。で、どうやって?
言っとくが私はC言語をポインタで挫折した男だ!!
0118デフォルトの名無しさん
垢版 |
2020/08/15(土) 20:21:07.23ID:YDp7CJXQ
>>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
0119デフォルトの名無しさん
垢版 |
2020/08/15(土) 20:25:40.50ID:YDp7CJXQ
あ、PSIZE_Tじゃなくて、SIZE_Tにしたら行けました!!
大文字小文字の間違いだったってことですか?
とにかくありがとうございました!!
0120デフォルトの名無しさん
垢版 |
2020/08/29(土) 01:18:06.72ID:2rJgngxa
変数やら関数にtemplate指定するのに一々上に記述するのが面倒なんですが、スコープ内で一括指定するみたいな記法ってありますか?
0122はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/08/29(土) 01:35:50.74ID:2JVy7qNC
typedef でも害はないけどusing を使うのがモダンな方法やぞ。
C と共用するヘッダファイル (または C++11 未満の規格に従わざるを得ない場合) を除いては typedef を使う理由はもう無い。
0123デフォルトの名無しさん
垢版 |
2020/08/29(土) 01:45:55.49ID:2rJgngxa
template<typename foo>
foo bar[256];
template<typename foo>
foo baz();

を仮に
template<typename foo>{
 foo bar[256];
 foo baz();
}
みたいな感じで
0124デフォルトの名無しさん
垢版 |
2020/08/29(土) 10:19:15.51ID:HmjSn9P9
foo bar[256], baz();
0125デフォルトの名無しさん
垢版 |
2020/08/30(日) 16:59:19.60ID:6dVOYYO/
列挙型を宣言した後に構造体型で列挙型の変数を作成、
列挙型の変数はキーボードから入力できないので、構造体型にキーボードから入力するための変数を作成、
その値によって列挙型の変数に代入、
動的にメモリを確保して列挙型を入力、後に出力
これが上手く動作しないです助けてください
0127デフォルトの名無しさん
垢版 |
2020/08/30(日) 17:18:07.67ID:6dVOYYO/
#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";}
}
0129デフォルトの名無しさん
垢版 |
2020/08/30(日) 17:52:49.59ID:sTqYAgvH
複数のLEDをリズミカルに光らせるプログラムを書いております。
現在は赤、青2色で色々遊んでおります。
'' __delay_ms(100);''
って感じの関数(用語?)を覚えまして、各パート毎に点灯時間、消灯時間を打ち込みました。
で、実行してみた所、1パートの青LEDが全て点滅し終わった後で2パートの赤LEDの
点滅に移る形になってしまいました。
赤、青LEDには各1個づつPICマイコンのピンを振ってありますので
スタティック制御ができるんだと思いますが、その制御(点滅)を同時に開始出来る
文(?)を教えて頂きたいと思います。
よろしくお願いします。
0131デフォルトの名無しさん
垢版 |
2020/08/30(日) 18:03:01.59ID:GgAZZaQa
>>129
PICの質問なら電気電子板の方が良いぞ
0132デフォルトの名無しさん
垢版 |
2020/08/30(日) 18:11:43.57ID:bozI2ZZf
tp.ansで入力された値によって対応した識別子を出力させたいのですが、charでは1文字しか出力できないので手詰まりになってます。どなたかご助言頂けないでしょうか。
0133デフォルトの名無しさん
垢版 |
2020/08/30(日) 18:26:31.79ID:zSKZhw1k
>>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'; // 文字列型にして出力
}
0134デフォルトの名無しさん
垢版 |
2020/08/30(日) 20:44:11.23ID:bozI2ZZf
>>133
アドバイスありがとうございますm(_ _)m

ごめんなさい!_が何かは理解できましたが、autoが難解でよくわかりませんでした...
0135デフォルトの名無しさん
垢版 |
2020/08/31(月) 10:54:44.11ID:pX0ZQbZW
auto は甘え
0136デフォルトの名無しさん
垢版 |
2020/09/03(木) 14:13:37.77ID:PYkyhK1l
mainのスレッドをCPUハグなしに無限に一時停止しておく方法はありますか?
0137デフォルトの名無しさん
垢版 |
2020/09/03(木) 14:26:19.18ID:DK3Ul6vK
ハゲ
0140デフォルトの名無しさん
垢版 |
2020/09/06(日) 09:31:49.54ID:2h7jeAag
mainからWinMainを呼ぶことも可能
WinMainが動いてる間はmainは止まってるよ

強制的に一時停止させるならPauseキー
0143デフォルトの名無しさん
垢版 |
2020/09/08(火) 03:22:53.47ID:jacy6RM2
マルチっぽい
0145デフォルトの名無しさん
垢版 |
2020/09/19(土) 19:53:45.14ID:k5fZduun
linuxでvswprint()使ってみたんだが、事前に必要なバッファサイズがわからない場合の求め方がわからん。

1. vsnprintf() と同じように nullptr を渡してみた
⇒必要サイズじゃなくてエラーの-1が返ってきた

2. 仮のサイズで呼び出して領域不足のエラーなら増やす方針にした
⇒エラーが領域不足なのか他のエラーなのか見分けがつかない(errno=0のまま)

どうすりゃいいんだろう?
0147デフォルトの名無しさん
垢版 |
2020/09/19(土) 22:28:47.13ID:4o2U5hp6
cppreferenceにはエラーが消えるまで再確保&呼び出しやり直す必要があるかもねって書いてある
0148デフォルトの名無しさん
垢版 |
2020/09/20(日) 03:23:25.61ID:Suv1r7e5
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でコンパイルしています。
上記のエラーを避けるにはどういう方法があるでしょうか?
0149はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/20(日) 04:34:43.96ID:7quNJlhN
>>148
C++ の規格としてその書き方が採用されたのは C++20 から。
(余談だが C だと C99 から出来る。)

それらの規格に準拠したコンパイラ (より新しいバージョンの g++) を用意するか、
でなければ古いスタイルの書き方で初期化するしかないという普通のことしか言えぬ。
0150デフォルトの名無しさん
垢版 |
2020/09/20(日) 07:17:40.34ID:Suv1r7e5
>>149
どうもです。いえ、何かコンパイラーオプションとかあるのかなと思いまして。
ちなみに新しい書き方の場合
1. 全ての要素を
2. 宣言と同じ要素順序で初期化
しないといけない、で正解ですかね? 1.の縛りは未初期化要素を避けるため?

とりあえず Hoge hoge; hoge.b = 1; とか書き直して逃げておこうかと思います。
0151145
垢版 |
2020/09/20(日) 08:00:08.91ID:OXACXz1O
>>147
ありがとう。なるほど、代替手段が無いとも書いてあるね。
formatにエラーがある場合はどこかで打ち切らなきゃならないか。
0152はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/20(日) 12:32:15.36ID:7quNJlhN
>>150
> 1. 全ての要素を

いいえ。 要素の初期化を一部省略して書いた場合は
デフォルトメンバ初期化子 (があればそれ) で初期化するか
あたかも {} が与えられたかのようになります。

つまり >>148 の例でいえばデータメンバ a は 0 で初期化される
ことが保証されます。

> 2. 宣言と同じ要素順序で初期化

はい。 その通りです。

どうしてこのような制限を入れたのかきちんと議論をみたわけではありませんが、
コンストラクタのメンバ初期化子リストは自由な順序で書けるが
実際の初期化順序は宣言の順序になるというルールが微妙にイケてなかったことの
反省なんじゃないかなと想像します。
0153デフォルトの名無しさん
垢版 |
2020/09/22(火) 21:06:20.18ID:qIJInCqV
gdb で、カレントディレクトリに .gdbinit を作って "b func" を記述したんですが、
funcが共有ライブラリの中にあると、funcがまだロードされてないので無視されますよね?

対話的に追加する場合はyを押して強制追加できますが、.gdbinit の中だとデフォでnが
選ばれるようです。.gdbinit の中での強制(自動)追加は可能でしょうか?
ちなみに ~/.gdbinit で add-auto-load-safe-path というのはやってあります。

ググったらありそうですが見つけられず... お願いします。
0154デフォルトの名無しさん
垢版 |
2020/09/23(水) 18:31:13.84ID:a8yFZa5Q
「C++には特にこれ!と言えるような入門書がない」という書き込みを見たのですが、そうだとしたらC++を習得した人は初学者のときどうやって技術を身につけていったのでしょうか?
0155デフォルトの名無しさん
垢版 |
2020/09/23(水) 18:36:58.57ID:a8yFZa5Q
「ロベールのC++入門講座(ロベール著)」と「明解C++入門編(柴田望洋著)」を買ったけどこれでいいのかな…
0157デフォルトの名無しさん
垢版 |
2020/09/23(水) 18:37:48.29ID:avHWzJtR
1. 既に C を覚えて使いこなしてた
2. Eiffel を学んだ
3. C++ は better than C として使った
4. template を学んだ
5. Perl を学んだ
6. Python を学んだ
7. D を学んだ
8. C# 悪くないね
0158はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/23(水) 18:45:30.79ID:2N0Iktsg
>>155
C++ の規格はちょくちょく改定されてて、特に 2011 年の改定はインパクトが強かったんだ。
入門の範囲にすらいくらかの影響がある程度には。
それより古い本だと (今となっては) 不格好なスタイルになっているかもしれない。
0160◆QZaw55cn4c
垢版 |
2020/09/23(水) 20:09:48.16ID:J9lXF67O
>>158
私は、もう年を取ってもう新しい規格にはついていけないと悟ったので、せめて初心者のための本を買ってレビューする余生を過ごそうと思っています
そういえば江添本を放置してましたね、10/4 の資格試験が終わったら、あらためて江添本をレビューするつもりです
0161デフォルトの名無しさん
垢版 |
2020/09/28(月) 19:18:28.08ID:QruIJ5oN
今読んでいる入門書の例題です
時間計算機で9時45分の1時間25分後を計算するには以下のように入力します
945+125=
11:10
http://codepad.org/jOsbQgsX

ところが実行してみるとVC++では0:10、mingwでは0:70という結果が出ます
掲載されたソースと見比べても違いはないようなのでお手上げです
教えて下さい
0163デフォルトの名無しさん
垢版 |
2020/09/28(月) 19:30:48.89ID:JgS2isID
あと、なんて本?
関数の戻り値型(関数名の前に書くintとかそういうやつ)を省略する入門書なんて珍しいから気になる
0164はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/28(月) 20:34:20.88ID:VnC2vdM3
関数の返却値の型を省略すると int とみなされるのは C89 では保証された動作だったが C99 で廃止された。
だから古い本ならそれほど珍しいわけではない。
そんなに古い本をいまどき手にしてしまうってのはめずらしくはあるが。
0165デフォルトの名無しさん
垢版 |
2020/09/28(月) 20:45:52.82ID:QruIJ5oN
>>162
おっしゃるとおりでした、なぜかreturnの行を完全に打ち忘れました。
見直しの最中にも気づかず・・・

今読んでいるのは「はじめて読むC言語」という1991年の本で名著らしいです。
ネットで「はじめて読む8086」の後に続けて読めば理解が深まると言われ手に入れて読んでいます。

途中コンパイルが通らずさんざん頭を捻って拡張子をcppからcにしたら動くようになったりして
古い本で勉強するのはなかなか大変です。

ありがとうございました。
0166はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/28(月) 23:29:53.28ID:VnC2vdM3
>>165
当時としては名著だったかもしれんが、仕様の改定はあるし、
周辺事情も変わっていくものなので古い資料で入門するのはだいぶん遠回りな気はするぞ。

C は最新規格でも歴史的事情を色々と引きずっているので古い規格から追っていくのも
無駄になるわけではないし、それを楽しめているならそれもよいけれど、
入門の段階で変な苦労を背負いこんで挫折するともったいないので
キツいと思ったら他の学び方もとれるということは覚えておいて欲しい。
0167デフォルトの名無しさん
垢版 |
2020/09/29(火) 06:25:09.45ID:jqf8qavY
いやいや
.cpp を .c と間違えてコンパイル通らないってのは
古い本のせいじゃないぞ

あるあるだけど
0169デフォルトの名無しさん
垢版 |
2020/09/29(火) 19:54:00.24ID:ME3902LM
やさしいCとかはじめてのCとかを買えばいい
0171デフォルトの名無しさん
垢版 |
2020/09/29(火) 20:20:10.22ID:hsV3TmCg
今の本が終わったらK&Rも読もうと思っていたのですが
VS2019環境だと警告まみれになりそうで気が重くなってきました
0173デフォルトの名無しさん
垢版 |
2020/09/29(火) 21:07:40.59ID:74pJkTSC
俺的には絶版だけどダイテル本がすげー勉強になった
問題までキッチリ解いたらかなりの力になると思う
んで詳説Cポインタでポインタをもっと掘り下げて
今は色々プログラミングしながら(つっても長くて2千行程度)もっとシステムコール勉強してるとこ
それ終わったらネットワークプログラミングもやるつもり
0174デフォルトの名無しさん
垢版 |
2020/09/30(水) 00:15:19.73ID:/dbaz1tV
プログラミング言語C 第2版、K & R、1988

C89/90 の本だから古いけど、MISRA-C などの組み込みでは使う規格
0175◆QZaw55cn4c
垢版 |
2020/09/30(水) 07:33:04.37ID:uQY5A/DJ
>>174
C99 は、C++ への互換性を無視するという規格委員会の独善が鼻につき推奨できない
C89 = K&R2 こそ必要にして十分というべきだろう
0177デフォルトの名無しさん
垢版 |
2020/10/01(木) 12:10:36.95ID:OaA9a4hN
原理主義者は読む
というか、原理主義者になりたいので読む
なんつったって聖典だからね
0179デフォルトの名無しさん
垢版 |
2020/10/01(木) 15:17:29.86ID:15Icpaxe
読むのは勝手だけど
昔の仕様を頑なに守り続けるのもどうかと思う
だからと言って新しい仕様が何でも良い訳ではないが
0180デフォルトの名無しさん
垢版 |
2020/10/01(木) 18:56:14.66ID:zaD5zegX
K&R読むと、コンパイラ作るの楽になるように設計してるなーってわかるよね。
あと、こりゃ別にlintいるわーってのもわかる。
0181デフォルトの名無しさん
垢版 |
2020/10/01(木) 19:09:33.99ID:15Icpaxe
PASCALもそうだな
0182◆QZaw55cn4c
垢版 |
2020/10/01(木) 20:04:00.09ID:J8KGCqXI
>>178
私のコメントに興味を持ってくれて嬉しい
しかし、今、リアルの私は終わりのない忙しさで連日睡眠時間が 3 時間という有様だ…
おそらく 11月1日2日3日の連休までにはこの忙しさも収束するだろうから、それまで気長に待っていてくれ給へ
0183◆QZaw55cn4c
垢版 |
2020/10/01(木) 20:08:33.39ID:J8KGCqXI
>>181
PASCAL と C を一緒にしてはいけない
PASCAL は LL(1)パーサですべてが記述されている、という C にはない独自の美しさを誇っている
C はセマンティクスに妥協しまくっておりシンタックスはボロボロだ、こんなものは私の求める美しさではない

高みを目指すのなら、C/C++ の「なあなあですませる」態度に決別するべき
0185デフォルトの名無しさん
垢版 |
2020/10/01(木) 21:47:26.01ID:m2VBA+uQ
struct {
char x;
struct {
char a : 4;
union {
char b : 2;
char c : 2;
};
char d : 2
};
};

こうやるとabcdは正常なんですがxの値がおかしくなります
xの最初4ビットがa
xの最後2ビットがd
xの残り2ビットがbとcで共有
どうやればできますか?
0186デフォルトの名無しさん
垢版 |
2020/10/01(木) 23:40:30.95ID:wapltEmD
>>185
x も union に入れるといいかもしれない。
「xの残り2ビットがbとcで共有」については、間に union 挟む形だと
ビットフィールドの割り付けが途切れちゃうから、 struct {a, b, d} と strunct {a, c, d} に
分ける必要があるかもしれない。

でもこんなことやりたくなるのはハードウェアレジスタの操作やバイナリフォーマットの操作ぐらいな気がして、
そうなると残念ながらビットフィールドや union 使った方法には移植性に難があるのであまりお勧めできない。
0187デフォルトの名無しさん
垢版 |
2020/10/02(金) 05:47:34.60ID:e8oVvNQP
>>186
185じゃないけど、レジスタ設定でおすすめのやりかた教えてください。

ハードウェアありきでレジスタ構造再現するより、目的や意味で分類するソフトありきの方が読みやすいように思えたんですが
このやりかたの利点てなんだろう。処理が早い?
0188デフォルトの名無しさん
垢版 |
2020/10/02(金) 07:00:47.14ID:zVqE2vDD
ポインタって*pは指し示したアドレスの先の値なのに
宣言のときに初期化するとchar *p=xxxx;はアドレスが入るって整合性取れてないなと思ってたら
char* p=xxxx;って意味なのね
0189デフォルトの名無しさん
垢版 |
2020/10/02(金) 07:05:50.26ID:Y0Tw+JWK
>>187
符号なし整数型にビットシフトとビットマスクで。

移植性を考慮する必要が無いなら、出力コード見ながら調整したビットフィールドで望みの動作に
できることも多くて、できてしまえばレジスタの定義も楽でレジスタアクセスするコードも読みやすいから、
それで済ませたくなる気持ちはわかる。

「目的や意味で分類する」というのはレジスタアクセスするコードの上に関数を作る話になると思うので、
レジスタアクセスの方法(ビットフィールドかシフト&マスクかなど)に関わらず好きに関数作って読みやすくすればいい。
0190デフォルトの名無しさん
垢版 |
2020/10/02(金) 09:23:56.92ID:Xjdvbcrc
>>186
> 間に union 挟む形だとビットフィールドの割り付けが途切れちゃう
納得しましたありがとう!
0191はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/02(金) 11:23:13.43ID:UfIjSULq
>>188
そうだけど、宣言の文法上の結合規則では * は p の側に結合する。
宣言は char という型指定子と *p という宣言子から成り立っているのであって、
しかし char* という型の p が宣言されるので整合性という意味では
やっぱりなんだか微妙という感はちょっとある。
0192デフォルトの名無しさん
垢版 |
2020/10/02(金) 11:33:34.73ID:vEIDHK0R
もちろん慣れたら問題無い
char a[] = "A\n";
char *p = a;
*p = 'B';
char *q;
q = a;
printf("%s", q);
0193デフォルトの名無しさん
垢版 |
2020/10/02(金) 14:24:12.68ID:zVqE2vDD
>>191
VS2019がchar *p;をchar* p;に勝手に変更するので
おかしいなと思ってたんだけど知ってみれば納得できるというか
0195デフォルトの名無しさん
垢版 |
2020/10/02(金) 15:08:30.47ID:WC+nGixi
char *p; か char* p; かでごねてる人って
char *p[]; とか char (*p)[N]; とかはどうしてるんだろ
0198デフォルトの名無しさん
垢版 |
2020/10/02(金) 16:39:54.61ID:LbxjABVY
vsならvsに任せる
人間がやったらミスするんだから機械に任せる
vs標準のフォーマットが嫌なら変えればいいが、変えた時点で標準ではないと認識しといて
0200デフォルトの名無しさん
垢版 |
2020/10/02(金) 17:02:53.55ID:WC+nGixi
書き込めないω
0201デフォルトの名無しさん
垢版 |
2020/10/02(金) 17:04:39.22ID:WC+nGixi
ソースの一部が入ると書き込めないな
何が琴線に触れてるんだろ
0202デフォルトの名無しさん
垢版 |
2020/10/02(金) 17:07:42.79ID:Xjdvbcrc
#define LIST { \
{ "a", "b", "c" }, \
{ "aa", "bb", "cc" },
}

char *(list[][3]) = LIST;

これは便利
0204デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:22:01.65ID:F7oAx4CC
3. char* p[];
(3)とか気持ち悪くない?
0205デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:23:49.00ID:F7oAx4CC
4. char(*p) [8];
(4)とかは?
破綻してるよね?

()を半角で書くと書き込めない?
0207デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:41:37.55ID:F7oAx4CC
char(*p)

これがアウトっぽい
0208デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:42:26.39ID:F7oAx4CC
char(*p) [8];

合わせ技がダメなんかな
0209デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:42:43.65ID:F7oAx4CC
あれ
治ったω
ありがとうωωω
0212デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:50:53.80ID:F7oAx4CC
>>210
>>188 はキモくない
0215デフォルトの名無しさん
垢版 |
2020/10/03(土) 10:59:02.83ID:hn+Q4jRt
好きにすればいいじゃない。
世の中的にはCは右、C++は混在が多いんじゃね。
C++なら生配列の使用はなるべく避けるし。
0217はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/03(土) 12:33:15.80ID:6Be2cGN6
>>203-205

ワイは C++ では char* p; と書く派 (C では char *p と書く派) やけど char* p[]; とは書かんな。
ごく単純な char *p; の場合に限って char* p; の方がマシな気がするという話であって、
全体としてはもうどうにもならんほどグダグダやと思うておる。
0218デフォルトの名無しさん
垢版 |
2020/10/10(土) 10:10:01.53ID:sA7w+t8z
>>217
結局、複合型とかconst修飾とか出てくると破綻するんだよね。だから右派。
たまに頑固な左派が「そんな変なものは使わない」とか言うけど、だったら*も止めてスマポだけ使ってろとw
0219デフォルトの名無しさん
垢版 |
2020/10/10(土) 11:19:57.47ID:ejDp+I1j
char* p, *q;
ってなるやんって思うから右派
意味的にchar* p, q;がpもqもchar*型になるなら左
0222◆QZaw55cn4c
垢版 |
2020/10/10(土) 15:34:14.92ID:viEJhGtz
>>221
右派にも親米と反米の二種類がありまして‥‥
0223デフォルトの名無しさん
垢版 |
2020/10/10(土) 16:22:58.24ID:i5KfYhU+
左派の破綻誤魔化しのために
typedef が廃止されて using とか本末転倒過ぎる
0224デフォルトの名無しさん
垢版 |
2020/10/14(水) 05:39:18.23ID:Ci1OYkop
#include<stdio.h>
void main()
{
int a = 9;
double b = 2.3;

printf("%d", a + b);
}

これを実行すると-1717986918になるんですがおかしくないですか
%fだと想定通りになりましたが%dのときは11が出るんじゃないかと思うんですけど
0225デフォルトの名無しさん
垢版 |
2020/10/14(水) 06:57:59.37ID:8wBxOyFV
a + bはdouble型
%fはdouble型を出力する書式だから意図通りに表示される
一方%dはint型を出力する書式だからそこにdoubleを突っ込むとおかしな表示になる
%dで正しく表示したければ次のようにa+bを明示的にintに変換する必要がある
printf("%d", (int)(a+b));
0226デフォルトの名無しさん
垢版 |
2020/10/14(水) 08:29:31.67ID:Ci1OYkop
>>225
丁寧な説明ありがとうございます
%dにしても勝手に整数にはしてくれないんですね、なんか不便な気が。

それにしてもマイナスはどこから出てきたのやら
0227デフォルトの名無しさん
垢版 |
2020/10/14(水) 10:51:20.27ID:GsUUoEHv
9+2.3=11.3
これの double の bit 表現が
int だと敢えて勘違いして観ると
MSB 1 で負の数になるんだろ
0228デフォルトの名無しさん
垢版 |
2020/10/14(水) 10:58:36.84ID:6pvowPnv
%dなのに引数がdoubleなら今どきのコンパイラなら警告出すはず
見てないだけだろ
0229デフォルトの名無しさん
垢版 |
2020/10/14(水) 11:01:15.47ID:GsUUoEHv
#include <stdio.h>

typedef union {
unsigned char u[8];
double d;
int i;
} U;

int main(void)
{
U x;
x.d = 11.3;
printf("%f\n", x.d);
printf("%d\n", x.i);
for(int i = 0; i < 8; ++i) printf(" %02x", x.u[i]);
return 0;
}

/*
11.300000
-1717986918
9a 99 99 99 99 99 26 40
ttps://ideone.com/SNupdr
*/
0230デフォルトの名無しさん
垢版 |
2020/10/14(水) 11:06:44.31ID:GsUUoEHv
ちなみに
-1717986918
は 32bit int で
0x9999999a
つまり
big endian - little endian で byte 順が入れ替わって
さらに 8 byte -> 4 byte で切られてる
0232デフォルトの名無しさん
垢版 |
2020/10/14(水) 12:00:25.99ID:ssGc8zMA
doubleやfloatはビットがこう並んでる
ttps://upload.wikimedia.org/wikipedia/commons/d/d2/Float_example.svg
0233デフォルトの名無しさん
垢版 |
2020/10/14(水) 12:08:46.62ID:ssGc8zMA
平たく言うと、その%dはこのfloatやdoubleのビットの並びを無理矢理整数にしてしまう

つまり、書いた通りにしか動かない
忖度やお察しが起こって無いのが良いところ
0235デフォルトの名無しさん
垢版 |
2020/10/14(水) 13:11:05.57ID:k7r/DRjX
これが不便だと思うなら便利な言語を使うと良いよ
便利ってことは高機能ってことで、高機能ってことは裏でいろんな処理が走る必要があるってこと
そんな処理走ってほしくない環境があるから今でもCが現役なだけ
0236デフォルトの名無しさん
垢版 |
2020/10/14(水) 15:56:29.16ID:wBt5LB5z
このばあい言語でなくライブラリの仕組みね
中で(int)vする指定子が用意されてればいいだけ
0237はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/14(水) 17:04:47.78ID:+PdAwU8N
>>224
この場合は double のビットパターンが整数として読み替えられたということで説明がつくみたいだけど、
言語仕様としては未定義なので別の結果になる可能性もある。

Windows では x86_64 上での引数の渡し方 (呼出規約) は浮動小数点には xmm レジスタを使うが、
引数が浮動小数点だけのときは整数レジスタの方にも値を入れておくというルールがある。
https://docs.microsoft.com/ja-jp/cpp/build/x64-calling-convention?view=vs-2019#varargs
このおかげで浮動小数点を整数として読みだしても一応の整合性はとれるようになってる。

Linux などで使われる規約 (いわゆる System V ABI) ではそういう予防措置っぽいものがないように見える。
http://refspecs.linux-foundation.org/elf/x86_64-abi-0.95.pdf
たぶんそのときにたまたま整数レジスタに入っている値が得られるだけなんじゃないかな。
英語がそんなにわからんから見落としがあったらすまぬ……。

手元に Windows しかないからオンラインコンパイラで試してみたんだけど、
実行のたびに違う値になる。
https://wandbox.org/permlink/voLHWPQmgwYDoSfT


未定義なものが未定義な結果になるのはある意味では「書いた通り」なんだが、
各環境の事情が絡んでくるから読み解くのは難しいね。
0238デフォルトの名無しさん
垢版 |
2020/10/14(水) 17:10:28.03ID:ZV1nncqg
CPUやコンパイラを推測するのに使われるのは?
0241デフォルトの名無しさん
垢版 |
2020/10/22(木) 12:14:45.82ID:A6VvBjuQ
C++を使ってシューティングゲームを作ろうとしているものです。
https://bituse.info/game/shot/
こちらのサイトを参考にしてDXライブラリも使って作業をしているのですが
https://bituse.info/game/shot/5
ただいまこちらの章でエラーが出てしまい行き詰っています。

背景を線画する章なのですがサイトの指示通りに新しいクラスを作って実行すると
1>------ ビルド開始: プロジェクト: gamegame, 構成: Release Win32 ------
1>back.cpp
1>C:\Users\rikua\source\repos\gamegame\back.h(17,7): error C3861: 'LoadGraph': 識別子が見つかりませんでした
1>C:\Users\rikua\source\repos\gamegame\back.h(19,10): error C2065: 'MARGIN': 定義されていない識別子です。
1>C:\Users\rikua\source\repos\gamegame\back.h(23,22): error C2065: 'FALSE': 定義されていない識別子です。
1>C:\Users\rikua\source\repos\gamegame\back.h(23,2): error C3861: 'DrawGraph': 識別子が見つかりませんでした
1>control.cpp
1>main.cpp
1>プロジェクト "gamegame.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

このようなエラーが出てしまいます。

こちらが現在作成しているファイルの全てです。
http://whitecats.dip.jp/up/download/1603336402/attach/1603336402.zip
パスワード1234
どなたか分かる方お願いします・・
0242デフォルトの名無しさん
垢版 |
2020/10/22(木) 12:38:26.86ID:+kcA91Ab
すまん
398MBとか見てそっ閉じしたわ・・・
各ヘッダが何をincludeしてるのか構造見てみて
0243デフォルトの名無しさん
垢版 |
2020/10/22(木) 12:47:21.09ID:vPWH9GQz
他人だけど1234で削除したら削除出来ちゃったωωω
0244デフォルトの名無しさん
垢版 |
2020/10/22(木) 12:48:24.95ID:A6VvBjuQ
>>242
申し訳ありません!
ヘッダは今全部で5つありまして
back.h
control.h
define.h
pch.h
player.h
の5つです

back.h
includeなし

control.h
include "player.h"
include "back.h"

define.h
include <windows.h>

pch.h
include "DxLib.h"
include "define.h"

player.h
#include "pch.h"
#include "player.h"


それぞれは今このような形になっています
0245デフォルトの名無しさん
垢版 |
2020/10/22(木) 12:49:30.64ID:A6VvBjuQ
最後の
#include "pch.h"
#include "player.h"
こちらの#は貼るときに消し忘れなので気にしないでください
0247デフォルトの名無しさん
垢版 |
2020/10/22(木) 12:55:08.56ID:A6VvBjuQ
>>246
申し訳ありません!以後気を付けます
0250デフォルトの名無しさん
垢版 |
2020/10/22(木) 14:25:21.78ID:ttgeK9fh
>>248
帰宅したらすぐに試してみます!ありがとうございます!!
0252デフォルトの名無しさん
垢版 |
2020/10/22(木) 16:24:16.18ID:A6VvBjuQ
>>248
すみません!
player.hの内容は元々includeが一つもありませんでした!
なのでback.hにpch.hを追加して実行してみると
このようなエラーが出てきました

1>------ ビルド開始: プロジェクト: gamegame, 構成: Release Win32 ------
1>back.cpp
1>control.cpp
1>C:\Users\rikua\source\repos\gamegame\define.h(16,13): error C2011: 'SHOT': 'struct' 型の再定義
1>C:\Users\rikua\source\repos\gamegame\define.h(16): message : 'SHOT' の宣言を確認してください
1>main.cpp
1>C:\Users\rikua\source\repos\gamegame\define.h(16,13): error C2011: 'SHOT': 'struct' 型の再定義
1>C:\Users\rikua\source\repos\gamegame\define.h(16): message : 'SHOT' の宣言を確認してください
1>player.cpp
1>プロジェクト "gamegame.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
0253デフォルトの名無しさん
垢版 |
2020/10/22(木) 16:42:21.53ID:A6VvBjuQ
>>252
すみません先ほどのエラーは
違ったものでした

こちらが現在出ているエラーです

>------ ビルド開始: プロジェクト: gamegame, 構成: Release Win32 ------
1>back.cpp
1>control.cpp
1>main.cpp
1>pch.cpp
1>player.cpp
1>control.obj : error LNK2005: "public: void __thiscall BACK::All(void)" (?All@BACK@@QAEXXZ) は既に back.obj で定義されています。
1>control.obj : error LNK2005: "private: void __thiscall BACK::Draw(void)" (?Draw@BACK@@AAEXXZ) は既に back.obj で定義されています。
1>control.obj : error LNK2005: "public: __thiscall BACK::BACK(void)" (??0BACK@@QAE@XZ) は既に back.obj で定義されています。
1>main.obj : error LNK2005: "public: void __thiscall BACK::All(void)" (?All@BACK@@QAEXXZ) は既に back.obj で定義されています。
1>main.obj : error LNK2005: "private: void __thiscall BACK::Draw(void)" (?Draw@BACK@@AAEXXZ) は既に back.obj で定義されています。
1>main.obj : error LNK2005: "public: __thiscall BACK::BACK(void)" (??0BACK@@QAE@XZ) は既に back.obj で定義されています。
1>main.obj : error LNK2005: "public: void __thiscall PLAYER::All(void)" (?All@PLAYER@@QAEXXZ) は既に control.obj で定義されています。
1>player.obj : error LNK2005: "public: void __thiscall PLAYER::All(void)" (?All@PLAYER@@QAEXXZ) は既に control.obj で定義されています。
1>C:\Users\rikua\source\repos\gamegame\Release\gamegame.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
1>プロジェクト "gamegame.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
0254デフォルトの名無しさん
垢版 |
2020/10/22(木) 16:43:57.19ID:fhYgMCzB
>>252
エラーが出る度に頭空っぽのまま教えてくださいって繰り返すのか?
teratailで指摘されてる通り、まずは#includeとかヘッダファイルがどういうもので何のためにあるのか、何故エラーになるのか、解決するにはどうするか、入門サイトなり入門書なりで勉強してきなよ。
それで分からないことが出てきたら、またここで具体的な質問をすれば誰かが回答してくれると思うぞ。
0255デフォルトの名無しさん
垢版 |
2020/10/22(木) 16:48:32.19ID:A6VvBjuQ
たびたびすみません!
control.hの中にお手本にはない同じ文列が2つあったので一つ消すと
エラーがだいぶ減りました!

1>------ ビルド開始: プロジェクト: gamegame, 構成: Release Win32 ------
1>control.cpp
1>C:\Users\rikua\source\repos\gamegame\control.cpp(11,1): error C2600: 'CONTROL::~CONTROL': コンパイラで生成された特殊メンバー関数を定義できません (クラスで最初に宣言されなければなりません)
1>プロジェクト "gamegame.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
0256デフォルトの名無しさん
垢版 |
2020/10/22(木) 16:50:27.84ID:A6VvBjuQ
>>254
ありがとうございます!
もう少し勉強してみてまた質問したいと思います。
0258デフォルトの名無しさん
垢版 |
2020/10/22(木) 17:07:43.70ID:vPWH9GQz
C言語、C++の基本のヘッダファイルの役割は理解していますか?
もし判らないのであれば、そちらの勉強を先にした方がいいと思います。
参考にしているサイトも、
> このページで学習するには、
> C言語とC++についての知識がある程度必要になります。
> 心配な方はトップページなどから、該当言語のページを選んで基礎を学んできてください。
と前置きがありますよ。
基本を理解せずに始めても、何度も同じような質問を繰り返して遠回りになるだけです。

>>246
有賀豚
0259デフォルトの名無しさん
垢版 |
2020/10/22(木) 17:08:41.93ID:vPWH9GQz
>>253 の原因は
player.c の中に back.c の中身がそのままコピーで繰り返されてるから
0260デフォルトの名無しさん
垢版 |
2020/10/22(木) 17:09:40.03ID:vPWH9GQz
>>257
それ以前の問題
こんなソース描いてる香具師が同じプロジェクトに居たら殴る
0261デフォルトの名無しさん
垢版 |
2020/10/22(木) 23:26:21.71ID:VEHOj23m
初心者歓迎のスレでそんなきつい言い方するな
0262デフォルトの名無しさん
垢版 |
2020/10/23(金) 00:01:21.09ID:fm7mdyX7
引っかかってるところよりずっと前で理解してないパターンは面倒くさい。
前提部分からの説明が必要だがそれを学ぶ気がないからこそこういう質問になるわけで、
親切に答えても徒労に終わるパターンなのが見えてる。
0263デフォルトの名無しさん
垢版 |
2020/10/23(金) 04:26:48.30ID:DyKPBSgF
Java から C++ に流れてきた者ですが、Javaのインターフェース的なものは
多重継承で実現、ですかね?

class Rectangle : pubilc Polygon {...}; みたいなクラス(他にも Polygon を拡張した
Triangle とか Hexagon とかあるとします)で面積を返す area() の実装を要請して、
そういうオブジェクトだけに適用できるメソッドを定義したい場合、
class Area { virtual int area() = 0; }
class Rectangle : public Sharpe, public Area { int area(); ..}; 的な?
その後 doSomething(Area& area); といった呼び出しでこれらのオブジェクトを引数に?

この場合 Polygon に area() を追加する手もありますが、Polygon でない図形のクラス
でも area() の実装を要請する場合もあるならば、多重継承ということになるのかなと。
多重継承以外でも何かありますでしょうか。
0264デフォルトの名無しさん
垢版 |
2020/10/23(金) 10:02:28.57ID:fm7mdyX7
>>263
仮想関数は動的ポリモーフィズムのためにある。
(最適化で消えることもあるけど) 実行時にディスパッチする仕組みなので、
使わないで済むならその方がいい。

つまり、その例なら doSomething をテンプレートにして型に制約 (メタ関数かコンセプトで) を付ける方が好ましい。
0266デフォルトの名無しさん
垢版 |
2020/10/23(金) 17:26:34.17ID:2f10zgGH
>>262
>学ぶ気がない
>親切に答えても徒労に終わる

触っちゃいけない質問者って臭いで判るよな
0268デフォルトの名無しさん
垢版 |
2020/10/24(土) 01:05:43.17ID:H3Ix9ZgH
オンラインゲームとかでも初心者狩りとかしてそうw
学ぶ気がないとか他人に原因を押し付けてるけど
0269デフォルトの名無しさん
垢版 |
2020/10/24(土) 02:31:27.76ID:yf0wmlMH
じゃあこのスレでインクルードやら宣言やらの仕組みから解説しろってのかい?
それはさすがに入門書のひとつでも読んでくれなきゃ困るよ。

単純に説明の分量的にもね。
0271デフォルトの名無しさん
垢版 |
2020/10/24(土) 09:29:17.11ID:kz7Ernxq
マジでそれ
答えたくないならスルーすればいいのに余計な事を言うのが害悪
0272デフォルトの名無しさん
垢版 |
2020/10/24(土) 09:38:28.92ID:hkdVUCy1
>>264
テンプレートですか、C++っぽいですね。メタ関数とか、いろいろ自分には新しいトピックが。
area() を実装しているかどうかは... is_callable とかでしょうか。
最悪制約をつけなくても area() がなければコンパイル時にテンプレート展開でエラーに
なって、駄目なことはわかることはわかるんですよね?

>>265
それはルートクラスの設計の話に見えるのですが、今回の場合はもう既に
あるクラスの場合の話でして。その場合はインターフェースクラスを多重継承する
のかな? というのが元の質問です。
0273デフォルトの名無しさん
垢版 |
2020/10/24(土) 10:35:52.36ID:Uy2SF5SV
>>272
まあ仮想関数使って多重継承でいいんじゃね
機能的には必要十分かと

それより設計上の問題として
Polygon : public Area{}
という構造が適切なのかどうなのか疑問

分かりやすさとしては
Rectangle : public Polygon{},Triangle: public Polygon{}・・・
という単なる形状のみの継承クラスと
Graph {Polygon poly; int area();・・・}
という別の目的で機能するクラスに分けたほうが整理されてる気がする
0274デフォルトの名無しさん
垢版 |
2020/10/24(土) 11:55:33.45ID:yf0wmlMH
>>272
制約を付けなくてもテンプレートを展開してダメだったらエラーになることは保証される。
まあ当たり前っていうかそうせざるを得ないもんね。

でも「(制約を満たさないので) マッチに失敗した」と「マッチして展開した結果にエラーがあった」は意味が違っていて、
結果的に失敗させることを意図するならなるべく前者で失敗させた方が使い勝手はいい。
0275デフォルトの名無しさん
垢版 |
2020/10/24(土) 15:57:20.05ID:XyBgTLH4
答えたくなきゃ答えなきゃいいし
余計な事を言いたきゃ言えばいいよ
ここをどこだと思ってんだよw
0277デフォルトの名無しさん
垢版 |
2020/10/25(日) 08:54:37.38ID:63196X63
>>276
は? 学ぶ気がないことが露骨なやつは嫌だよねって話をしてるんだろうが。
初心者叩きとか話をすり替えるなよカス
0279デフォルトの名無しさん
垢版 |
2020/10/25(日) 11:23:24.95ID:L6mzxwj8
こいつには質問しても得るものないから目合わせないでおこう
と思うやつに限ってこういう反応してくるんだよなw
>>277
0280デフォルトの名無しさん
垢版 |
2020/10/25(日) 11:49:00.98ID:KvAimzX1
>>277
>学ぶ気がないことが露骨なやつ

ほんとこれにつきる
0281デフォルトの名無しさん
垢版 |
2020/10/25(日) 18:00:47.89ID:+b3TKvfL
リンカーの話とかもここでおkですか? とりあえずlinux系で、

動的ライブラリlibA.soが、別のライブラりlibB.soに依存しているときには,
libA.so作成時、libA.soにlibB.soをリンクしておけば依存性が解決されますよね?
(libA.soを使うプログラム作成時には、libA.soだけ指定すればよい)

諸般の事情で静的ライブラリlibC.aがあり、これがlibD.soに依存するのですが、
この場合、libC.aにlibD.soをリンクしてlibC.aを生成することはできない? ですか?
libD.soは、libC.aを使ったプログラムの作成時にリンク、ということでおkですかね?
これが正解だと、静的と動的で依存性を解決する場所(?)が違うんだなあと。
0282デフォルトの名無しさん
垢版 |
2020/10/25(日) 19:43:38.96ID:+b3TKvfL
ふと思いましたが、前者の場合、libA.soにあえてlibB.soをリンクしないで生成、
プログラムにlibA.soをリンクするときにlibB.soを指定する方法もありますよね。

そうすると依存性的には静的ライブラリと同じになる。
でも普通はあえてそんなリンクにはしないのかな。
0283デフォルトの名無しさん
垢版 |
2020/10/26(月) 15:01:51.11ID:EltRWJ/H
libD.a は行方不明か?
0287デフォルトの名無しさん
垢版 |
2020/10/27(火) 08:29:34.74ID:GDxeid4H
virtual int d(){cout<<"Ad\n";}
にreturn文ないのが未定義動作でその時の振る舞いはコンパイラの実装依存なのかな
virtual int d(){cout<<"Ad\n";return 0;}
で正常に動いた
0288デフォルトの名無しさん
垢版 |
2020/10/27(火) 08:37:11.64ID:GDxeid4H
ていうかなんでこの手のコンパイルが通るようになってるんだろうね
そっちが気になるわ
0289デフォルトの名無しさん
垢版 |
2020/10/27(火) 08:56:02.30ID:+sRGEqV1
gcc のバグ?それとも ideone のバグ?
0290デフォルトの名無しさん
垢版 |
2020/10/27(火) 09:14:57.09ID:vtWjbkRe
http://codepad.org/qCDIHh55
の件で
delete b; は B:d, ~B, A:d, ~A と呼ばれる様ですが
virtual int d() はポリモフィズムで
B:d, ~B, B:d, ~A と呼ばれるのが正しい気がするのですが
デストラクタ内から呼ばれるときは特別なのでしょうか?
0291デフォルトの名無しさん
垢版 |
2020/10/27(火) 09:57:24.74ID:vyVElDGQ
>>282
libD.aはないですw libD.soです。

なんというか、静的リンクって面倒だっなって思ったのと、自分の認識が正しいかを
確認したかったのですが。

プログラムにlibA.soをリンクするときは、libA.soだけ指定すればいい。llibB.soの依存性は
リンカーが解決してくれる(libA.soにlibB.soがリンクされているので)。

一方プログラムにlibC.aをリンクするときは、libD.soも指定しないとlibD.so内の関数が
見つからないエラーになる。かといってlibA.soのように依存するライブラリーを前もって
リンクしておくわけにはいかない。

で正しいですよね?
0292デフォルトの名無しさん
垢版 |
2020/10/27(火) 10:09:47.62ID:iKqDwwUH
~B の後 ポリモフィズムで実体のない B:d() を呼び出すのは微妙な感じ
B:d() 内部で Bにまつわるメンバを操作を考えると
すでに生命期間切れてるのにアクセスすることにもなる
0294デフォルトの名無しさん
垢版 |
2020/10/27(火) 10:42:51.63ID:oh18ycKo
>>290
コンストラクタ、デストラクタ内では仮想関数はオーバーライド解決されない、ポリモーフィズムは効かないとはっきり決まっておる。
0295はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/27(火) 10:47:51.31ID:0uVZsG3C
>>290
抽象クラスを端的に言えば「実行時の型 (実装) で処理する」ための仕組みなのであって、
delete b; は *b の型が B のつもりで解体するってだけ。
0296デフォルトの名無しさん
垢版 |
2020/10/27(火) 11:47:49.35ID:telUcSp6
はちみつはいつもずれてるな
0298デフォルトの名無しさん
垢版 |
2020/10/27(火) 13:39:09.37ID:GDxeid4H
~B::B()の内部で~A::A()が呼び出しされてるだけだから
B::d() -> B::~B() -> A::d() -> A::~A()
で正しいんじゃないの~A::A()を普通に呼び出して
B::d()が呼ばれたら怖くない?
0299デフォルトの名無しさん
垢版 |
2020/10/27(火) 14:47:50.22ID:telUcSp6
いくつかのクラス (A, B, C) をまとめて class X に対して friend にしたいとき
class X 内で
friend A, B, C;
と描くとエラーになります
friend A;
friend B;
friend C;
と描くしかないですか?

あと前方参照のために
class A, B, C;
みたいに並べるのもだめっぽいのですが
他に良い描きかたあるんですか?
0304デフォルトの名無しさん
垢版 |
2020/10/28(水) 11:08:09.05ID:d52OC3St
>>302
あなたが誰かを勝手にfriendと宣言しても問題ありません。
ただ相手があなたにアクセスしないだけなので、現状と何ら変化はありません。
0305デフォルトの名無しさん
垢版 |
2020/10/28(水) 11:38:33.08ID:Mf8tEr2f
こんなこといいな出来たらいいな
#define A(X, Y, ...) X Y ; A(X, __VA_ARGS__)
A(class, hoge, fuga, hage)
A(friend, hoge, fuga, hage)
0311デフォルトの名無しさん
垢版 |
2020/10/29(木) 09:41:00.08ID:RChHWwPC
>>305
一応出来るよ
トークン連結でA_30,A_29とかあらかじめ作っといたループ部分を呼べば、だけど
0312デフォルトの名無しさん
垢版 |
2020/10/29(木) 12:02:39.93ID:NknHXEaX
下記のようにvectorに追加するときにemplace_backを使って初期値を入れるにはどうすればよいでしょうか?

typedef struct aaa_{
char name; // charもしくはstd::stringでも可
uint64_t count;
} aaa;

std::vector<aaa> v_aaa;


char temp[] = "hoge";

// v_aaaの末尾に初期値を入れて追加。イメージ
v_aaa.emplace_back( aaa({name=temp, count=5}) )
0317はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/29(木) 16:06:03.93ID:WswsrqDV
引数を受け取るところでも RVO の適用対象になるから余計なコピーはたぶんそんなに起こらないはずだと思う。
(ちゃんと検証してないので間違ってたらごめん。)
0319デフォルトの名無しさん
垢版 |
2020/10/29(木) 23:17:56.41ID:BMEZnPdC
>>315
ありがとうございます。できました。
高速化のためにemplace_backを使っているのですが、もしかすると逆に余計なCOPYが発生している可能性もあるんですね。
0320デフォルトの名無しさん
垢版 |
2020/10/29(木) 23:30:45.17ID:BMEZnPdC
もう一つ質問です。

uint16_t num;
std::string str;

という2つの変数があった時、strを数値変換してnumに入れたいのですが、下記はどちらも間違ってはないですか?
どちらも戻り値はintとあったのですが、uint16で受けても問題ないのでしょうか?

num = std::stoi(str);
num = atoi(str.c_str());
0321デフォルトの名無しさん
垢版 |
2020/10/30(金) 00:49:26.28ID:XnkdHuuj
問題があるかどうかはstrの仕様次第
uint16_tの範囲外があり得ないなら大丈夫、あり得るなら勿論ダメ
今時のコンパイラなら大きいものから小さいものへの暗黙の変換には警告が出る
警告消したいなら明示castして
0322はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/30(金) 09:22:29.76ID:WoJDazC2
>>320
int から uint16_t の変換について

変換後の型で表せない範囲の値を変換しようとしたとき、変換後の型が符号なし整数型である場合には、
変換後の型が格納可能な最大値 + 1 で modulo を取った値になることになってる。
(変換後の型が符号付である場合には未定義。)

結果の大きさが確実に uint16_t の範囲に入るという確信がある状況であればもちろん問題ないし、
そうでないときも結果が未定義ではないという意味では問題ないが、
プログラムの意図に合致するかどうかは状況による。

----

文字列を数値に変換することについて、
atoi はエラーハンドリングがちゃんとできない (変換に失敗したら 0 を返すが変換結果が 0 のときと区別できない) ので、
事前に文字列の検証が済んでいるのでなければ stoi の方が好ましくはある。
0324デフォルトの名無しさん
垢版 |
2020/10/30(金) 11:26:35.44ID:7MkyV1Cp
>>322
>変換後の型で表せない範囲の値を変換しようとしたとき、変換後の型が符号なし整数型である場合には、
>変換後の型が格納可能な最大値 + 1 で modulo を取った値になることになってる。
>(変換後の型が符号付である場合には未定義。)

結果的にそうなってるだけで実際は上位bit(byte)棄ててるだけじゃないの
0325デフォルトの名無しさん
垢版 |
2020/10/30(金) 12:42:27.15ID:Avmc/4l5
>>324
結果的にそうならないと規格準拠はうたえないし上位を無視してやるかどうかは実装の話だから処理系による
まあ他にいい方法は思いつかないけど
0326はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/30(金) 13:29:46.50ID:WoJDazC2
>>324
言語仕様で保証されている。
その仕様を実現するためにコンパイラがどうやるかは場合によるだろうけど、
単に上位を捨てることで実現しやすいと想定はしてると思う。
0327はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/30(金) 13:31:26.19ID:WoJDazC2
>>325
1 の補数を使っているときにマイナスの値が絡んでくるとちょっと調整が必要になるんじゃね?
0328デフォルトの名無しさん
垢版 |
2020/10/30(金) 14:26:56.09ID:NkdFBoQj
stoiとか" -1"とか食わせると-1のintになるんでしょ
parserとかゴリゴリ実装してんのかね
0329はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/30(金) 14:36:46.44ID:WoJDazC2
>>328
扱えるのは整数だけだし、マイナスの他には 0 か 0x が付く場合を処理できればいいのでそんなに複雑ではないと思う。
0330デフォルトの名無しさん
垢版 |
2020/10/30(金) 14:48:32.14ID:NkdFBoQj
なるほどね
0331デフォルトの名無しさん
垢版 |
2020/10/31(土) 22:42:02.96ID:R+EB1+ZF
https://ideone.com/o3N4x1

上記の44行目の「ここから〜」と70行目の「ここまで」の部分で変数p_aaa、p_bbbのstr変数を書き換えるという同等の処理をしているのですが、
実際のここの部分は何十行もあるので、メンテナンス性を良くするために、この共通部分を共有できないかと考えています。
関数化すればと思いましたが、引数の構造体が別物のため関数化できません。
何か方法はありますでしょうか?
0333デフォルトの名無しさん
垢版 |
2020/10/31(土) 22:54:20.54ID:u29GL2G8
送信しちゃった
unsigned char* を受けて realloc し、 reallocの戻りの [9][10][11] を書き込みしつつ
reallocの戻りを返す (失敗は exit) そういう関数 common() で
 p_aaa->str = common(p_aaa->str);
 p_bbb->str = common(p_bbb->str);
こうまとめる感じ
0334デフォルトの名無しさん
垢版 |
2020/10/31(土) 23:03:36.76ID:u29GL2G8
ideone のコードがあくまで str の操作に終始してるので >>333 になる
共通のコードが type についても同じ操作するのなら

str, type だけを単発の構造体 BASE にして AAA, BBB は BASE を継承しておく
で、関数は BASE を受ける(必要なら BASE を返す or 参照渡しで書き換え)
0335デフォルトの名無しさん
垢版 |
2020/10/31(土) 23:18:42.13ID:3iDylFBH
offsetofで距離の値をメタ取得しメンバアクセスでなく剥いでchar*にすればいいと思うよ
0336デフォルトの名無しさん
垢版 |
2020/11/01(日) 10:32:39.62ID:6FKS57jf
>>331
テンプレート関数を使って、コードの上では一つの関数に見せかけておくようにする

前準備の箇所も同様

hsgAWF - Online C++0x Compiler & Debugging Tool - Ideone.com
https://ideone.com/hsgAWF
0338331
垢版 |
2020/11/01(日) 11:33:12.85ID:caGW9eb5
>>334
関数にp_aaa->strを渡して値の書き換えを考えたのですが、関数内のreallocでアドレス変わるからその値を変えてもだめだ。
って思っていました。
ご提案の通りアドレス変わったものを戻り値で返してあげればいいですね。
その考えが抜けていました。

>>335
すみません、剥いでchar*にすればいいってところがよくわかりませんでした。。

>>336
今回以外のケースでも使いみちありそうなのでテンプレートについて調べてみました。
関数やclassを定義する先頭に<typename T, typename HOGE>のように可変できる独自の型を作れる。
関数、クラス使用時に関数名のあとに<unsigned char*, int>のように型を指定する。
という理解であってますか?
0340デフォルトの名無しさん
垢版 |
2020/11/01(日) 11:40:17.79ID:6FKS57jf
>>338
テンプレートはだいたいそのようなもの
0341デフォルトの名無しさん
垢版 |
2020/11/01(日) 13:11:03.10ID:BdB3gM+x
こんな感じで定義したいときどうすればいい?

template <X>
class X {
public:
X() {}
~X() {}
};
0343デフォルトの名無しさん
垢版 |
2020/11/01(日) 14:07:18.93ID:BdB3gM+x
>>342

template <class X>
class A {
X *x;
public:
A(X *a) : x(a) {}
~A(){}
};

int x = 1;
A<int> a(&x);
A<A> b(new A<int>(&x)); ←ここエラー

こういうときに
class A {
A *x;
public:
A(A *a) : x(a) {}
~A(){}
};
みたいな A とよく似た B C D ... があるとき
template <class X>
class X {
X *x;
public:
X(X *a) : x(a) {}
~X(){}
};
って描けると便利かなと思いました
0344はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/11/01(日) 14:14:48.71ID:JHJcVuLz
>>343
その説明を見てもイマイチ要求がわからんのやが……。
全く同じ内容で別の型にしたいということなら幽霊型 (phantom type) を使うという手法はあるけど。
0345デフォルトの名無しさん
垢版 |
2020/11/01(日) 14:15:42.25ID:22aX9WTF
>>343
> A<A> b(new A<int>(&x)); ←ここエラー
その記述(特に A<A> という型)でどんな結果を期待していたのかわからない。

> みたいな A とよく似た B C D ... があるとき
A と B は何が違うのか(なぜ A ひとつではダメなのか)わからない。
0346デフォルトの名無しさん
垢版 |
2020/11/01(日) 14:28:09.77ID:BdB3gM+x
>>345
>その記述(特に A<A> という型)でどんな結果を期待していたのかわからない。
class A {
A *x;
public:
A(A *a) : x(a) {}
~A(){}
};
です

>A と B は何が違うのか(なぜ A ひとつではダメなのか)わからない。
上の例だと最小限にしたつもりなので差が無くなってしまってますが
実際は template <class X, class Y> みたいにして Y が違う感じです
0349デフォルトの名無しさん
垢版 |
2020/11/01(日) 16:29:24.33ID:22aX9WTF
>>346
ごめんさっぱり見えてこないや。「最小限にしたつもり」で情報削りすぎてるんだろうな。
質問の基本として、望む結果、そのために書いたコード、実際の(望ましくない)結果、あたりはそろえてもらわないと
うまくお話しできない。
0350331
垢版 |
2020/11/01(日) 19:17:22.75ID:tQIBnCrw
>>340
ありがとうございます。勉強になりました。

ついでに追加で質問があります。
最初に投稿したコード →https://ideone.com/o3N4x1
の36〜37行目で値と0x00を入れるのに2行使ってますが、これ以上簡素化はできないですよね?
36: memcpy(p_bbb->str, bbb_str_temp, 9);
37: p_bbb->str[9] = 0x00;

あと54〜56行では3行に分けて1バイトづつセットしてますが、ここを一気に入れる方法はありませんか?
イメージは21行目のcharを初期化するときのように {0x41, 0x41, 0x00} みたいな書き方ができないかなと思っているのですが。
54: p_aaa->str[9] = 0x41;
55: p_aaa->str[10] = 0x41;
56: p_aaa->str[11] = 0x00;
0351デフォルトの名無しさん
垢版 |
2020/11/01(日) 21:33:20.20ID:6FKS57jf
>>350
こんなんになるんだろうか

lnDOFG - Online C++0x Compiler & Debugging Tool - Ideone.com
https://ideone.com/lnDOFG

Cプログラミング診断室/珠玉の力作/文字列処理
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.9.3.html
0352デフォルトの名無しさん
垢版 |
2020/11/02(月) 16:50:10.64ID:P+uwjz0Z
>>346が言ってるのは多分、テンプレート引数によって異なる識別子のクラスを定義したいってことじゃね?
それは型の次元じゃなくて識別子の次元だからプリプロセッサでやるしかないと思うが
0354331
垢版 |
2020/11/02(月) 21:24:08.49ID:HalV34XN
>>351
charにキャストして書き込みですか。なるほどですね。
ありがとうございます。
0355デフォルトの名無しさん
垢版 |
2020/11/05(木) 02:53:59.36ID:CsR+UXSo
c++14のconstexpr変数について質問です

constexpr変数は内部リンケージですので、グローバル定数をconstexpr変数で作ろうとすると複数の翻訳単位で実態が作成されてしまうと思います
c++17ではinline変数とすることでただ一つの実態を指すようにできますが、c++14ではどのようにすればよいのでしょうか?
コンパイラがよしなにしてくれますか?
0357デフォルトの名無しさん
垢版 |
2020/11/07(土) 10:44:01.28ID:PF2b8VJJ
>>350
ちょい亀だが、興味あったんで調べてみた。

自分の趣味的には可変引数テンプレートを使ってバイト列にダラダラ書き足していく
感じかな?対応関数増やせばいろんな型をバイト列に展開しやすい。
my_append(&p_aaa->str[9], &p_aaa->str[12], 0x41, 0x42, 0x00);

もう一つは std::initializer_list を使ったもの。リストの1つ目は unsigned char* の
書き出し位置を指定して、あとは int 値の羅列。
参照: ttps://stackoverflow.com/questions/25721869/initializer-list-combined-with-other-parameters
my_append_helper() = { &p_bbb->str[9], 0x41, 0x42, 0 };

ttps://ideone.com/OdbRew
0358350
垢版 |
2020/11/07(土) 22:29:19.80ID:CR7v1mZc
>>357

サンプルコードありがとうございます。
引数を可変で受け取ることができるんですね。

これ色んなところで使えそうですが、ぱっと見た感じちょっとクセがあって難しいですね。
思考が追いつかない。。
じっくり考えて理解してみます。
0359デフォルトの名無しさん
垢版 |
2020/11/08(日) 13:25:53.56ID:M0llHupc
float a = 1.234;
float b = 1.234f;
double c = 1.234;
double d = 1.234f;
これらの違いを教えてください
double に 1.234f を使って float に 1.234 を使うのが正しいんでしょうか?
0361デフォルトの名無しさん
垢版 |
2020/11/08(日) 15:36:43.95ID:8e1Utdpy
>>359
何も付けなければ整数リテラルはint 小数リテラルははdoubleとなる。
つまり
float a = 1.234; doubleをfloatに変換して代入
float b = 1.234f; floatをfloatに代入
double c = 1.234; doubleをdoubleに代入
double d = 1.234f; floatをdoubleに変換して代入
でfloatの値を指定したい時だけfを付ける。
0362デフォルトの名無しさん
垢版 |
2020/11/08(日) 15:48:25.65ID:M0llHupc
ありがとうございます
float a = 1.234;
これで警告が出ないのは不思議ですね
0365デフォルトの名無しさん
垢版 |
2020/11/08(日) 16:32:11.23ID:E458/dQk
以下のコンストラクタの書き方は正しいのでしょうか?
Duration(int data) : data_(data), negative_(false) { // メンバ初期化
if (data < 0) { // 条件を満たすとき上書き
data_ *= -1;
negative_ = true;
}
}
0367デフォルトの名無しさん
垢版 |
2020/11/08(日) 17:28:50.68ID:E458/dQk
Duration(int data)
: data_{data < 0 ? -data : data}
, negative_{data < 0} {}
と書けるのを発見しました。お目汚し失礼しました。
0368デフォルトの名無しさん
垢版 |
2020/11/08(日) 18:41:53.30ID:p8PLYZoN
下記のようにfor文の外で構造体を参照できるようにするにはどうすればよいですか?
newで生成するとmallocのように寿命が無いオブジェクトを生成できるとネットで見たのですが、そうなりませんでした。。

std::unordered_map<std::string, XXX*> unmap;
for(){
 xxx = new XXX ←構造体
 map["key"] = xxx; ←構造体のポインタを代入
}
map["key"] ←for文の外でxxxを参照できるようにしたい。
0369デフォルトの名無しさん
垢版 |
2020/11/08(日) 19:17:29.56ID:p8PLYZoN
変数名を間違えてるところがあったので訂正します。

std::unordered_map<std::string, XXX*> unmap;
for(){
 xxx = new XXX ←構造体
 unmap[key] = xxx; ←構造体のポインタを代入
}
unmap[key] ←for文の外でxxxを参照できるようにしたい。
0370デフォルトの名無しさん
垢版 |
2020/11/08(日) 19:27:41.20ID:1+QGrERy
>>368-369
書かれたコードを見る限り参照はできそうなので、何を見て参照できないと言っているのかがわからない。
0371デフォルトの名無しさん
垢版 |
2020/11/08(日) 19:43:01.36ID:p8PLYZoN
>>370
そうなんですね。
もうちょっと複雑な条件があるのかな。。
ちなみに変数unmapはclassのpublicで定義していますがそれは関係ないですかね。
0372デフォルトの名無しさん
垢版 |
2020/11/08(日) 19:45:23.99ID:p8PLYZoN
あと、newで構造体を生成したときにdelete関数を使わずに勝手に消えてしまうケースなどはないでしょうか?
0375デフォルトの名無しさん
垢版 |
2020/11/08(日) 20:39:41.26ID:DU8jO1r3
そもそも何かの勘違いか間違いでfor文のループに入ってないとエスパーしてみる
0376デフォルトの名無しさん
垢版 |
2020/11/08(日) 21:09:27.08ID:p8PLYZoN
>>373
ありがとうございます。参照できてますね。
となると別の問題のようです。
for文内でprintf()すると出力されるのでループ内には入ってるようなのですが。。
どこかで変なことをやらかしてるんだと思います。

すみません、ちょっと考え方を変えようと思います。

>>373 の下記で変数mを定義していますが、このmから m.***() のようにしてXXXを生成できないでしょうか?
これであればmが生きている限りXXXは残ると思うので。

std::unordered_map<std::string, XXX*> m;
0377デフォルトの名無しさん
垢版 |
2020/11/08(日) 21:13:14.38ID:p8PLYZoN
イメージは下記のようなものです。
これで作成したXXXはfor文を抜けても生きているのでこの方法なら解決するかなと思いました。

std::vector<XXX> xxx_vector;
xxx.vector.emplace_back();
XXX* xxx = xxx.back();
0378デフォルトの名無しさん
垢版 |
2020/11/08(日) 21:19:07.78ID:ejbE12Pn
変なことしなくてもnewしたものはdeleteするまで生きてる
そこじゃないとこがbugってるだけ
普通にbugを潰せ
0380デフォルトの名無しさん
垢版 |
2020/11/08(日) 22:35:52.18ID:ygVNfudb
newの戻り値はブロック内だけ有効って思ってるとか?
何が変なのかさっぱり
0382デフォルトの名無しさん
垢版 |
2020/11/08(日) 23:19:38.79ID:p8PLYZoN
すみません、色々調べていたら思いっきり勘違いしていました。
結論としてはnewできちんと保持されていて、
>>373 のコードで言うと、XXX.cの値を設定し忘れていて、forを抜けたあとでXXX.cを見て何もセットされてない!ってなってました。

この修正をすることになったきっかけが、最初
xxx = new XXX;
ではなく
struct XXX xxx;
でやったり、forを抜ける前とあとで
printf(%p\n");
でポインタが変わったり、とかを調査していてそれらとごっちゃになり、newでやっても消えてしまう。
と思い込んでいました。
newに修正したときもちゃんとポインタで調べればよかったのですが、xxx.cの値で確認していたため起きた勘違いでした。
お騒がせしてすみませんでした。
0383デフォルトの名無しさん
垢版 |
2020/11/08(日) 23:53:41.46ID:1+QGrERy
>>382
次からは問題をちゃんと再現できるコードを作って相談しなよ。
そうすればその手の勘違いには自分で気付ける。
0384デフォルトの名無しさん
垢版 |
2020/11/09(月) 12:58:48.22ID:TXQrani0
>>382
プログラム書く前に最低でも入門書読むなり入門サイト見るなりして
基本的知識は持ってないとでたらめコード量産するだけ
お前向いてない

過去にも同じような指摘どっかでされてないか?
0386デフォルトの名無しさん
垢版 |
2020/11/09(月) 17:30:55.44ID:DrhUvdcE
実務で書いてるコードで問題あって
そこから問題が再現するエッセンスとなる最小部分を抽出してテストしてみるかー
抽出の過程でポカ発見は割とある

(最適化無しだと期待通り動いて最適化maxにするとセグフォしやがるタイプの追跡が辛い)
0387デフォルトの名無しさん
垢版 |
2020/11/09(月) 17:42:31.26ID:TXQrani0
>>385
失敗や勘違いは誰にでもあるし
そのことは否定していない
0388デフォルトの名無しさん
垢版 |
2020/11/09(月) 17:44:27.05ID:rzgY+aYD
最初の最初はセーブデータとかもexeファイルの後ろの方に付け足す感じなのかと思ってた
0390デフォルトの名無しさん
垢版 |
2020/11/10(火) 11:40:07.24ID:08CevRpc
atan2(y, x) を多項式近似で高速化しようとしたけど
場合分けが多くて結局遠回りしてるような気がする
本当に高速化出来たんだろうか
0392デフォルトの名無しさん
垢版 |
2020/11/10(火) 12:27:53.72ID:OiV4Kgv1
標準ライブラリもテイラー展開で実装されているだろうから、相当小さい次数で打ち切らないと太刀打ちできないと思われ。
入力される値が有限個なら予め計算しておくのも手。
いずれにしても先に計測だね
0393デフォルトの名無しさん
垢版 |
2020/11/10(火) 13:47:10.62ID:emhcDKaA
必要とする精度によるけど予め飛び飛びに計算しといて間は線形補間とかした方がいいかも
0394デフォルトの名無しさん
垢版 |
2020/11/10(火) 13:47:50.52ID:3xGJBleZ
ttps://github.com/gcc-mirror/gcc/blob/master/libquadmath/math/atan2q.c

2qが何かは知らんがおそらく倍クオリティーのatan2
詳細はさらに不明
有り難すぎて目がつぶれる
0396デフォルトの名無しさん
垢版 |
2020/11/10(火) 17:03:04.32ID:WZfCMWiE
どうしても高速化が必要なら、あらかじめ値域を限定して情報量減らすなりしかないよな。
線形補間で必要精度が達成できる最小限のテーブル実装…て数学か。
0397デフォルトの名無しさん
垢版 |
2020/11/10(火) 21:54:38.23ID:HXXQLae8
後で高額請求されそう
0403デフォルトの名無しさん
垢版 |
2020/12/03(木) 01:52:23.80ID:3onLW5ry
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/iconv.3.html
iconv()関数は…回る仕様なの?つまり…十分なバッファーを取っていても…回っちゃうか?って事…。
回って徐々に変換していくのか…1回で変換するのか…いまいち仕様が…把握できない…。
0404デフォルトの名無しさん
垢版 |
2020/12/03(木) 02:49:09.70ID:3onLW5ry
readで回すケースがあるのか?…僕は…C++なので…std::ifstreamのgetlineで一行づつやるので…
う”ーん…1回でいいんだけど…これ…どうなんでしょうねぇ…。
0406デフォルトの名無しさん
垢版 |
2020/12/03(木) 23:48:30.98ID:3onLW5ry
結局…1行分のバッファをINとOUT両方取って…回しました…SJIS→UTF-8だとOUTのバッファが足りなくなるので…
回したら…いい感じにできた…。余分にバッファ取らなくてもいい…これがいいね…。
0407デフォルトの名無しさん
垢版 |
2020/12/04(金) 23:59:23.75ID:4kKR6ux4
文字列終端の'/0'…ヌル文字…改行コードの\rや\nや\r\nって…文字コードによって…バイト数って変わってくるの?
変わるんだったら…非常に面倒なんだけど…。特に…'/0'は…長さを測れない…。誰か…。
0409デフォルトの名無しさん
垢版 |
2020/12/05(土) 00:26:38.45ID:WkfwE68o
'\0'用に配列のBUFFERは多めに取るか…\rや\nや\r\nは…findで切ろう…。面倒だ…。
0411デフォルトの名無しさん
垢版 |
2020/12/05(土) 01:18:55.72ID:WkfwE68o
改行コードは簡単だけど…char配列の最後の'\0'意外に理解に苦しむ…。
2バイトになるケースがあるのかと…。
0412デフォルトの名無しさん
垢版 |
2020/12/05(土) 01:52:56.87ID:WkfwE68o
http://proger.blog10.fc2.com/blog-entry-67.html
↑だそうだ…UTF-32まで想定して…'\0\0\0\0'にでもしておこうかなぁ…。かなり…馬鹿げてるけど…。
0413デフォルトの名無しさん
垢版 |
2020/12/05(土) 02:01:53.70ID:WkfwE68o
かなりショックだね…これじゃ…辛い…UTF-16のLinuxの場合に問題が出てくるのか…。
UTF-8端末であれば…'\0'で問題ないだろうね…。UTF-16のLinuxってある?
0415デフォルトの名無しさん
垢版 |
2020/12/05(土) 02:08:20.29ID:WkfwE68o
この話の流れだと…UTF-16のLinuxはぶっ壊れるよね…。
0417デフォルトの名無しさん
垢版 |
2020/12/05(土) 02:35:12.49ID:I2yh8xfr
文字処理なんか相当面倒&複雑な割に得られるメリットが少ないので手を出すこと自体が間違い
外部ライブラリに頼るべき典型例
0418デフォルトの名無しさん
垢版 |
2020/12/05(土) 05:47:06.50ID:WkfwE68o
悲惨だ…文字「A」…UTF-16で文字コード「0x0041」を…iconvすると…EINVAL…これもナル文字の影響なのか…。
ちょっと…今日は…ショックを隠しきれない…C++に挑戦してるが…引退が頭をかすめる…。
とりあえず…海外のStackOverFlowで聞いてみようか…。
0419デフォルトの名無しさん
垢版 |
2020/12/05(土) 06:21:37.08ID:WkfwE68o
ライブラリのバージョンが違うのかもしれないiconvctlで制御できそう…。
今使ってるのは…iconvctlがない…。明日は…そのあたりの環境構築から…。
0420デフォルトの名無しさん
垢版 |
2020/12/05(土) 07:23:57.84ID:f0cq7ZxN
そこら辺はRubyのほうが使いやすいだろうな。
0421デフォルトの名無しさん
垢版 |
2020/12/05(土) 11:41:58.40ID:7yX6qRkD
char使えるのはマルチバイト文字だけだぞ
UTF-16や32使うならwchar_tかchat16_tとかchar32_t使え
0422デフォルトの名無しさん
垢版 |
2020/12/05(土) 11:47:00.16ID:f0cq7ZxN
WHATWG、Encoding仕様は、注意深く実装すればプッシュ型に出来るぞ。
プッシュ型の設計は、柔軟な利用法を可能とする。
弱点は、キャッシュに乗りにくく関数呼び出しが増え、実行効率が落ちること。
とはいえ、そろそろプッシュ型の時代が来ても良いのではないか?と思う。
なぜなら、Enter押した瞬間に実行が終わるから。
0423デフォルトの名無しさん
垢版 |
2020/12/05(土) 11:47:58.11ID:pZ+vMW1v
独り言やめてください

・このコードをコンパイル実行し(ようとし)ました
・結果こうなることを期待していました
・実際にはこうなりました

こんな感じでお願いします
0424デフォルトの名無しさん
垢版 |
2020/12/05(土) 11:56:37.74ID:f0cq7ZxN
Enter押した瞬間に実行が終わるとはどういうことかわかるか?

ときどき、あれ?いま押す前に結果が表示されたよな??と思うときがあるって事ですよ。

そのくらい速いって事ですよ。
最近のパソコンは。
0425デフォルトの名無しさん
垢版 |
2020/12/05(土) 14:00:25.14ID:3OUqO/Qz
近頃のRuby on Rails の未経験者なんて、10年やってるプログラマーよりも、レベルが高いぞ。
ポートフォリオに学校で作った、Twitter・メルカリクローンとか

AWS, Linux, Docker, Rails, CircleCI, Terraform, Chef, Itamae とか
0427デフォルトの名無しさん
垢版 |
2020/12/06(日) 11:49:41.53ID:XVsVhGnz
C++の入門書を一通り終わらせました。
次にCUDAでのGPU処理を勉強しようと思います。
試しに行列演算するclassを作ったのですが
classのoperatorをCUDAで処理って出来ないのですか?
0428デフォルトの名無しさん
垢版 |
2020/12/06(日) 13:45:07.78ID:htfQpy13
できないことないでしょ。
でも必要になるまで結果を取得しないfutureみたいなオブジェクトを返却するほうが良さげな気がする
0429デフォルトの名無しさん
垢版 |
2020/12/12(土) 00:35:13.10ID:cOibJfw/
C++何も分からないので教えてください。
コンパイルすら1度もしたことがないレベルの初心者です。
他言語の経験は多少あります。

https://github.com/EpicGames/UnrealEngine/blob/2bf1a5b83a7076a0fd275887b373f8ec9e99d431/Engine/Plugins/Runtime/AR/AppleAR/AppleARKitFaceSupport/Source/AppleARKitFaceSupport/Private/AppleARKitLiveLinkSource.cpp
上記のURLのFAppleARKitLiveLinkRemotePublisher::PublishBlendShapesという関数(?)で
以下のようなコードがあるのですが、これは変数の中に変数を加算(?)しているような処理に見えるのですが正しいでしょうか?

SendBuffer.Reset();
SendBuffer << BLEND_SHAPE_PACKET_VER;
SendBuffer << DeviceId;
SendBuffer << SubjectName;
SendBuffer << FrameTime;

この加算のような処理が、C言語系のポインタ等を扱うレベルの言語を使ったことがないため感覚的によく分かりません。
文字列でも配列でもないような、型の違う変数を、足し合わせていくというような概念がよく分からないのですが
この加算結果はバイナリのようなデータになるのでしょうか?
0431デフォルトの名無しさん
垢版 |
2020/12/12(土) 06:51:59.24ID:P0Jam5CX
>>429
もともとビットシフトの演算子だったが、標準ライブラリなんかで、
std::cout << ”こんにちわ、仕事" << std::endl;
みたいな使い方がされて、それに倣って、データを流し込むという
意味合いでこの演算子がよく使われる。

送信バッファーの末尾にどんどんデータを追記してるんだろうが、
これはライブラリ製作者が決めたことだ。

こういった元の演算子から大きく意味を変える演算子の再定義は
悪しとする批判的な意見もある。他人が読むことガン無視で
俺様仕様に調教していくのも趣味的で否定はせんけど。
0432デフォルトの名無しさん
垢版 |
2020/12/12(土) 10:28:36.80ID:cOibJfw/
>>430>>431
ありがとうございます。
このような演算子でオーバーロードされたデータをUDP経由で受け取って各データを取り出す場合、どのようにして取り出すのでしょうか?
左から何バイトずつ取り出して変数に格納するみたいなことをやる感じになるのでしょうか?
0433はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/12/12(土) 10:46:31.85ID:UUApGKPR
>>432
演算子のオーバーロードとそのクラス内でどのようにデータが保持されているかは直接の関係はない。
クラスのデザインによる。

よう知らんけど >>429 の URL を踏んでも 404 なんやが。
0434デフォルトの名無しさん
垢版 |
2020/12/12(土) 11:55:20.31ID:cOibJfw/
>>433
すみません、UnrealEngineのコードは、GitHubのアカウントとUnrealEngineのアカウントと紐づけないと404になるようです。
紐づけ自体は無料です。

該当箇所のコードは以下のようになっています。ちょっと全体をキャプチャするのは難しいですが...
https://dotup.org/uploda/dotup.org2331244.jpg
0435はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/12/12(土) 12:21:47.83ID:UUApGKPR
>>434
その SendBuffer とやらがどう定義されているかによるので
使われている箇所だけを見てもわからんという話をしてる。

この場合はバッファと名前が付いてるから蓄積はされるんだろうけど、
たとえばネットを抽象化したクラスだったら
すぐさま送信してしまって手元にはデータは残ってないみたいなことだってあるかもしれない。
0436デフォルトの名無しさん
垢版 |
2020/12/12(土) 12:52:05.75ID:cOibJfw/
SendBufferを含む行は以下のようになっています。
これが定義になっているのかは分かりません…

const uint8 BLEND_SHAPE_PACKET_VER = 6;

// FrameTime BlendShapeCount Blendshapes SubjectName DeviceID
const uint32 MAX_BLEND_SHAPE_PACKET_SIZE = sizeof(BLEND_SHAPE_PACKET_VER) + sizeof(FQualifiedFrameTime) + sizeof(uint8) + (sizeof(float) * (uint64)EARFaceBlendShape::MAX) + (sizeof(TCHAR) * 256) + (sizeof(TCHAR) * 256);
const uint32 MIN_BLEND_SHAPE_PACKET_SIZE = sizeof(BLEND_SHAPE_PACKET_VER) + sizeof(FQualifiedFrameTime) + sizeof(uint8) + (sizeof(float) * (uint64)EARFaceBlendShape::MAX) + sizeof(TCHAR) + sizeof(TCHAR);

FAppleARKitLiveLinkRemotePublisher::FAppleARKitLiveLinkRemotePublisher(const FString& InRemoteIp) :
RemoteIp(InRemoteIp),
SendSocket(nullptr),
SendBuffer(MAX_BLEND_SHAPE_PACKET_SIZE)
{
}

FAppleARKitLiveLinkRemotePublisher::FAppleARKitLiveLinkRemotePublisher() :
SendSocket(nullptr),
SendBuffer(MAX_BLEND_SHAPE_PACKET_SIZE)
{
}
0437はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/12/12(土) 13:27:24.85ID:UUApGKPR
>>436
それは FAppleARKitLiveLinkRemotePublisher のコンストラクタの定義。
FAppleARKitLiveLinkRemotePublisher 型のコンストラクタは
データメンバの SendBuffer を MAX_BLEND_SHAPE_PACKET_SIZE で初期化するという意味。

ようするに SendBuffer が何者かはわからん。

> これが定義になっているのかは分かりません

さすがにそれはあまりにも基礎知識すぎてそこから解説する気にはならないな。
どうして入門書を読むことすら一切せずにいきなり質問に突入するのかわからん。
0438デフォルトの名無しさん
垢版 |
2020/12/12(土) 19:18:17.66ID:cOibJfw/
>>437
そうですね…
定義になっていないだろうなとは思ったんですが、これ以外にSendBuffer変数がどこにも見当たらなかったので
もしかしてこれで定義になってるのか…?という疑問の余地があったからそう書いてしまいました

Unrealのコード全体から調べてみると、TArray<uint8> SendBuffer;というのがあったりするので、もしかしてこれかなと思ったりするのですが、違う可能性は高そうです…。
そもそもUnrealの質問をC++のスレで聞くのが間違っていたかもしれないですが、Unrealのスレでもあまりプログラミングの話題は出ないので…
勉強して出直してきます…
ありがとうございました!
0439デフォルトの名無しさん
垢版 |
2020/12/13(日) 10:04:55.76ID:FpioPUML
>>429
多分SendBufferに突っ込まれてるデータを横取りしたいんだろうけど、
SendBufferに<<で突っ込まれてるデータを一つ一つ自分が用意した配列とかに保存すりゃ出来ると思うが

UEが受信したデータを取り出して使いたいのなら、それはSendじゃないとおも
0440デフォルトの名無しさん
垢版 |
2020/12/23(水) 19:05:44.31ID:LkSVqc8p
2D-arrayを初期化する際、

arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

とすべき所を、ついPythonの癖で間違えて

arr[][3] = {(1, 2, 3), (4, 5, 6), (7, 8, 9)};

と書いても、g++でコンパイルは通ってしまいます。当然、値はメチャクチャです。
C/C++ で、配列初期化の中に()を書くと、コンパイラーは何だと思って解釈してるのでしょうか?
0443デフォルトの名無しさん
垢版 |
2021/01/04(月) 09:14:20.49ID:QYpZPDPd
>>390
cスレで言うのもなんだけど、ループで総和計算にcは全く向いてないよ
pc上のgccでさえ、ccとfortranで10-100倍の差がある(-O1で比較)
cからの呼び出しオーバーヘッドも一回なんで気にする必要はない
再帰でたらい回しするようなコードは値渡しのcに多少分がある
0444デフォルトの名無しさん
垢版 |
2021/01/17(日) 18:29:02.52ID:wAwMcmVw
C++にも,pythonのsympyやnumpyのようなライブラリってあるのでしょうか?基本,自作しなければならないのでしょうか
0446デフォルトの名無しさん
垢版 |
2021/01/17(日) 20:18:40.26ID:vSdpivaf
>>444
eigen3とかではダメかな
0447デフォルトの名無しさん
垢版 |
2021/01/17(日) 20:33:13.40ID:wAwMcmVw
>>446
おお!参考になります!
当方,ずっとpythonを使ってたんですが,ちょっと処理が重くなりそうなツールを作ってみたくなり,c++に興味持ち始めました
文法理解以外に,ちょっとした数式計算やグラフ化に手こずる予感がしていたのですが,eigen3使えばなんとかなりそうな気がしてきた次第です
0448デフォルトの名無しさん
垢版 |
2021/01/18(月) 09:48:11.37ID:iMz5nc0d
struct A{const int a; A(const int a):a(a){} };
struct B{ A as[4]; B(const int a):####{}};
上記####の部分は文法的にどのように書くべきでしょうか?
as({a,a,a,a})
みたいに書きたいのですがGNU拡張がどうの言われました
0450デフォルトの名無しさん
垢版 |
2021/01/18(月) 16:21:02.12ID:0ToZeY7a
>>444
PythonNN.dll 経由すれば C++ からも numpy sympy 使い放題
0451デフォルトの名無しさん
垢版 |
2021/01/18(月) 16:59:17.15ID:9EUWE6k9
class Hoge; があるとして
Hoge *funcA()
{
return new Hoge;
}
Hoge funcB()
{
Hoge hoge;
return hoge;
}
Hoge &funcC()
{
Hoge hoge;
return hoge;
}
Hoge funcD()
{
Hoge *hoge = new Hoge;
return *hoge;
}
の違いって何ですか?
0453デフォルトの名無しさん
垢版 |
2021/01/18(月) 21:16:59.14ID:DX7cypHC
ちょっと疑問に思ったんだけど、PythonはC/C++の10倍速くないのか?
0454デフォルトの名無しさん
垢版 |
2021/01/18(月) 21:21:18.08ID:WCGHfsAo
処理系やライブラリがC系で作られてるのだからそれはない

まあバリバリ最適化、場合によってはfortranとかも使ってたりもするから下手な組み方より速かったりするかも知れないが
0455デフォルトの名無しさん
垢版 |
2021/01/18(月) 21:37:02.89ID:DX7cypHC
たいていの言語はC/C++比何倍速いと言うのを売り文句にしてるけどな。
0457デフォルトの名無しさん
垢版 |
2021/01/18(月) 23:35:24.09ID:DX7cypHC
Javaは20倍速いという有名なベンチマークがあったな。
0458デフォルトの名無しさん
垢版 |
2021/01/18(月) 23:36:54.32ID:I5iO9HnU
>>451
funcA: 呼び出し元で delete しないとメモリリーク
funcB: あまり問題ない
funcC: 戻り値にアクセスすると未定義動作
funcD: 呼び出すたびにメモリリーク

new の負荷や Hoge のコピーの負荷が気になったり気にならなかったりするかもしれない。
0459デフォルトの名無しさん
垢版 |
2021/01/18(月) 23:47:52.23ID:DX7cypHC
倍速い プログラミング
で検索して見たら、一等賞はRubyだった。
日本人として誇らしい。
0462デフォルトの名無しさん
垢版 |
2021/01/19(火) 12:20:14.02ID:aQNqCNMI
>>458
funcBってコピーコンストラクタが呼ばれる?
効率悪くない?
0463デフォルトの名無しさん
垢版 |
2021/01/19(火) 13:00:12.23ID:Ts6buLnF
funcCのやったら駄目コード funcDの確実に漏れるコード
と比較すると些細に見える
0464デフォルトの名無しさん
垢版 |
2021/01/19(火) 13:10:52.29ID:WOVrJxAW
>462
保証はないけど、コンパイラが頑張ってくれる場合があるんじゃなかったっけね?
0465デフォルトの名無しさん
垢版 |
2021/01/19(火) 13:23:41.08ID:NMZAA88j
>>451 >>464
Hogeのデストラクタでリソース解放するようなパターンで
2回解放されると困る場合があるな
もちろんブロックしてあったとしても解放一回でも問題ある訳だが
0466デフォルトの名無しさん
垢版 |
2021/01/19(火) 13:53:53.51ID:/3F2YDse
未定義動作はどういう処理されるかわからないので所詮メモリリークするだけとわかっているfuncDのほうが些細に見える
大抵の環境でこの手の未定義でメモリリークよりひどい状態にならないので、そういう環境であるならfuncCのほうが些細であると言える
0469デフォルトの名無しさん
垢版 |
2021/01/19(火) 17:27:42.28ID:HFbnFcCb
馬鹿がCのCGIモジュールで地方自治体のサービスを書いたせいでメモリリークしまくりの
複雑怪奇なコードが多量にある。対処が高価でメモリー潤沢なマシン、アホアホ大手のN
0470デフォルトの名無しさん
垢版 |
2021/01/19(火) 17:39:33.97ID:KGVX5wki
歴史的経緯で仕方がなかったんじゃないの?
全部作り直しますからお金くださいなんて提案はなかなか通らないからね
0471デフォルトの名無しさん
垢版 |
2021/01/19(火) 19:17:03.09ID:AfTAIlvJ
CGIの場合、確保したメモリーを解放しないのは、十分妥当な戦略なので、メモリーリークではないかもしれない。

高価なマシンは、アクセス数の対価では?
0472はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/19(火) 20:50:10.62ID:Zp03eKCw
さっと実行してそのまま終わるコマンドラインツールなんかだと
メモリの free はしなくて良いという論はあるね。

つっても、プログラムは改修されることもあるし、
一部を部品として切り出して転用したいこともある。
駄目だったらまた最初から作り直せばいいじゃんと言えるような
規模でもない限りはやっぱりそれなりに作法に
則っておかないとグダグダになると思うんだよな。
0474デフォルトの名無しさん
垢版 |
2021/01/19(火) 21:55:42.74ID:AfTAIlvJ
記憶域確保のコストは議論されるのに、なぜか解放のコストは議論されない。
0475はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/19(火) 22:18:11.76ID:Zp03eKCw
>>474
何を言ってるんだ? されてるだろ?
だから最後の free をすべきかどうかとかいう論が出てくるんじゃないか。
0478デフォルトの名無しさん
垢版 |
2021/01/21(木) 01:43:06.87ID:Idvi/rDV
Hoge funcB2()
{
return Hoge{};
}

C++17以降はこれが正解
他に対してデメリットしかない
0480デフォルトの名無しさん
垢版 |
2021/01/21(木) 14:04:53.08ID:8mOSdfp6
move constructor と copy constructor があるのは理解したが
どちらがどういうタイミング(条件)で使い分けられるのか
詳しく正しく解説してるサイトはありませんか?
0482デフォルトの名無しさん
垢版 |
2021/01/21(木) 19:38:07.97ID:QF6BlJBZ
>>481
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0483はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/21(木) 21:13:38.93ID:ooF1treM
rvalue を受け取れるところに rvalue を渡したらムーブになるという単純な規則なので詳しい説明を見るまでもないよ。
(一定の条件を満たすとコピーもムーブも省略して直接オブジェクトを構築するといったような例外はある。 いわゆる RVO)

でも何が rvalue なのかとか右辺値参照の仕組みだとかいった前提知識は必要なので、
そこらへんも含めた総合的な説明となると「江添亮の C++ 入門」を一通り読めばいいと思う。

https://ezoeryou.github.io/cpp-intro/
0484デフォルトの名無しさん
垢版 |
2021/01/22(金) 15:56:45.94ID:8dGlMjdy
rvoはあくまでコピーの省略であってムーブの省略ではないぞ
あと江添本ゴリ押しするくらいならこっちにしろ
ttps://cpplover.blogspot.com/2009/11/rvalue-reference_23.html?m=1
0486デフォルトの名無しさん
垢版 |
2021/01/22(金) 17:23:58.50ID:tN/hhIBk
string Hoge(){ return string("HOGE"); } があって
string s = Hoge();
char *p = s.c_str();
で p を使用する側があるとき
const char *Fuga(){ return string("HOGE").c_str(); } を代わりに使おうとすると
const char *q = Fuga();
までは正常(に観える)ですがその後 q の中身が消えてしまいます。
理由は判るのですが Fuga みたいな関数を作りたいときどのように描くのが普通ですか?
0488デフォルトの名無しさん
垢版 |
2021/01/22(金) 17:39:39.87ID:3IahkNr8
例を満たすだけなら
const char* Fugo() { return "HOGE"; }
が一番楽だと思うけど、もうちょっとやりたいことを具体的に
0489デフォルトの名無しさん
垢版 |
2021/01/25(月) 12:00:41.77ID:55szcPbX
ふと思ったのですが、
文字の配列(文字列)を char * で表すとき、最後の要素をヌル文字にすることで、文字列の長さを
別に指定しなくて済んでますよね。
同様に、任意のデータ(例えば構造体とか)の配列をポインタで表すとき、終端に何か特別な
値をセットして、配列の要素数を指定せずに済ませられますかね?
0491デフォルトの名無しさん
垢版 |
2021/01/25(月) 14:11:32.50ID:83sbARL7
番兵を知らないってことはアルゴリズムの教科書を買った方がいい
0492デフォルトの名無しさん
垢版 |
2021/01/25(月) 14:51:09.66ID:/FcSLyrh
ただのnull終端を番兵と呼んでるんなら、
それこそまともなアルゴリズムの本をちゃんと読んだほうがいい。
0493デフォルトの名無しさん
垢版 |
2021/01/25(月) 15:21:22.55ID:g2C+jwSi
strlen()はあるのにobjlen()とかlistlen()とかstructlen()が無いね
0497デフォルトの名無しさん
垢版 |
2021/01/26(火) 01:42:28.90ID:uwBeeshc
配列をポインタで関数に渡すとき、番兵を使ってる例って少ない(無い?)ですよね?
たいていはポインタと、サイズの入った変数、ですよね。
番兵を使った方が関数の引数が減ってシンプルじゃないですかね?

sizeof()は上記目的には使えないですよね。あと配列をmallocで割り当てた場合も。
0498デフォルトの名無しさん
垢版 |
2021/01/26(火) 02:09:38.03ID:QPIgjXP4
そもそもC++スレなんだからコンテナでrange based forとかイテレータとかsize使ってるやつの方が多いんじゃねーの
0500デフォルトの名無しさん
垢版 |
2021/01/26(火) 03:09:22.29ID:I774IjRX
番兵はユニークな値でないと困るけど
一般の配列で絶対に使わない値 が存在しうるかはわからない
文字列は \0 を番兵として使うからなと値域を制限してるから成立してる
0501デフォルトの名無しさん
垢版 |
2021/01/26(火) 07:44:27.25ID:JepoiCxq
>>497
番兵の値がいくつかということはコメントとかに書くくらいしかできないからサイズを使う場合よりも保守性が低いとか、サイズが分からないと直接終端にアクセスする必要のあるアルゴリズムを使う際にいったん末尾まで余計な探索しないといけないとか、デメリットも多いな。ケースバイケースだが、番兵よりサイズの方が扱いやすいことが多いと思う。
0503デフォルトの名無しさん
垢版 |
2021/01/26(火) 09:28:05.96ID:Gs93uoQt
>>497
ポインタの配列とかならまれに見るよ
Win32APIのStartServiceCtrlDispatcherAとか
逆に言うとポインタぐらいしか番兵としてみんなが認める値がない
ポインタならNULLを番兵にするのはだいたい同意するだろうし
0504はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/26(火) 10:58:58.35ID:xZCVqJnF
Go や Rust でスライスが基本的な型として入っているのは
大きさのわからん配列 (の参照) が
問題を生みやすいことを学んだ故だと思う。

C++20 に std::span が入ったのもその必要性・有用性を認めてのことだろうから、
std::span そのものは使えない状況であったとしても
番兵より大きさ (もしくは終端の位置) で管理するスタイルが基本になっていく流れはあるんじゃないかな。
0505デフォルトの名無しさん
垢版 |
2021/01/26(火) 14:04:56.83ID:dpeKzEhO
たとえばある配列をわたされてインデクスiを参照したいとするじゃん
番兵しかなかったら、とりあえずインデクスiまでずーっと舐めないと
途中で番兵でてきたらアウトオブレンジでえらいこっちゃ
配列とサイズで管理しないとランダムアクセスがごっつうおそなってお話にならない
0506デフォルトの名無しさん
垢版 |
2021/01/26(火) 14:07:28.72ID:J69Hx8rV
で、まあ実際ヌル終端文字列の処理ってこんなのばっかりで、文字列をやたらと
きったりはったりする場合は結局文字数とセットにしたほうがいいよね、ってなって
最近のモダン言語はだいたい文字数とセットで管理するほうが主流だよね
0508デフォルトの名無しさん
垢版 |
2021/01/26(火) 14:53:45.91ID:m9QEFa1v
最近のモダン言語は文字数とバイト数がバラバラだけどランダムアクセスできてんの?
0509はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/26(火) 16:04:26.82ID:xZCVqJnF
>>508
文字列をランダムアクセスする必要とかあるの?
ないよね?

っていうのがモダン言語の解じゃないかな。
どうしても必要なら事前に 32 ビット整数 (に相当する文字型) の配列にするし。
0510デフォルトの名無しさん
垢版 |
2021/01/27(水) 11:38:43.30ID:cJSBZXf9
>>500
char * なのに
"hoge\0fuga\0hage\0\0"
みたいな内容期待してるAPIとかあるからな
0511デフォルトの名無しさん
垢版 |
2021/01/27(水) 11:40:55.88ID:cJSBZXf9
>>497
malloc とか new とか
ポインタ - 1 のアドレスにサイズが書き込まれてたりするな
0512デフォルトの名無しさん
垢版 |
2021/01/27(水) 19:33:34.87ID:V9ay2W5A
C++17のvariantというものを初めて使おうとしていますが
自分のコードでは、variantの中身にはすべてset(int i)というメソッド(iの値をセットする)があるので
visit([=](auto& v) { v.set(hoge); }, value);

としたら、「const ...をset()のthisに渡すのはクオリファイアーを無視してる...」的なエラーに。
あれ、自分の元のコードではvalueはconstじゃないはずなんですが....
もしかしてvisit()の変数って強制的にconst扱いですか? constじゃないやり方とかあります?
0513デフォルトの名無しさん
垢版 |
2021/01/28(木) 02:35:10.89ID:RFgYTk8i
>>512
きっと省略したところに問題があるんでしょう。
オンラインコンパイラにエラーを再現させるコードを貼って示してもらえば、何か見えてくると思います。
0514デフォルトの名無しさん
垢版 |
2021/01/28(木) 17:23:11.37ID:ZyxBbWt0
ヌル文字は文字列処理してセパレータが被った時の最終手段なので勘弁して欲しい
0515デフォルトの名無しさん
垢版 |
2021/02/02(火) 16:38:37.97ID:eercxEg/
>>497
そういう時、自分は構造体に配列のポインタとサイズを書き込んで、構造体のポインタを渡している。
実務経験ゼロのアラフィフ日曜プログラマなので、この方法が良いのかどうかはしらない。
理工学部出身なので、学生時代はプログラムしてたよ。
コロナ禍で外出する頻度も減ったので、久々にプログラミングを再開してみた。
0516497
垢版 |
2021/02/03(水) 19:53:19.07ID:RKwHr67Q
>>515
あ、実は既にその方法にしていたりします。
配列のポインタ+サイズの引数だと若干うるさくなることのほかに、構造体でデータ型をネストしたい
(構造体の要素に配列を持たせ、その配列の要素も似たような構造体...)部分などもあり、そうするのが
自然(というか必須?)な感じがしました。
0517デフォルトの名無しさん
垢版 |
2021/02/04(木) 00:19:59.58ID:+sPXCpt8
C標準ライブラリのソースコードを眺めていると、実装した関数をエイリアスで別名をつけていることがあります
C言語のことがよくわかっていない為か、最初からエイリアスの名前で関数を書いた方がいいのではないか?と思えてしまいます
一体、なんのために実装関数名とエイリアス名を分けているのですか?
0519デフォルトの名無しさん
垢版 |
2021/02/04(木) 05:05:52.26ID:YUi6sdWi
初心者だけど目的がないから勉強できん
どうすればええんや
0521デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:36:18.55ID:ZzRKCYY/
>>515-516
APIだとそもそも構造体の先頭数byteにその構造体のサイズが入ってるって普通
0522デフォルトの名無しさん
垢版 |
2021/02/12(金) 15:44:52.65ID:VS77AOFk
Visual C++のアプリ作れって言われたんやけど
アプリ作成の段階でワイ詰んだから質問しに来たンゴ
アホみたいな初心者やけど助けてほしいンゴ

【使用環境】
Visual Studio 2008

【やりたいこと】
VB.netとかで言う「Buttun1_Click」で
「MessageBox.Show("HELLO")」がやりたい
【わからないこと】
@本とかで「Managed C++ アプリケーション」で作れって書いてあるが
 テンプレートにそんなものはない
A「Dialog」をなんか作れることはできたが
 ビルドしたら「error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。」
 が出てくる。
 定義すれば解決!らしいけど定義のやり方がわかんない
Bmain関数をどこに書けばいいかわからない(ファイルが多すぎて)
0524デフォルトの名無しさん
垢版 |
2021/02/12(金) 16:19:00.28ID:IzjdsqjH
勘違いしたふりしてC#で作っちゃえよ
0525デフォルトの名無しさん
垢版 |
2021/02/12(金) 16:32:05.70ID:NMXs/4Zz
本を使う場合はその本のバージョンに全部合わせないと無い項目とかあってしんどいよ
慣れれば無くなってても代わりはこれだろ、って当たりつけられることもあるけど
学習目的で参考する本があるならバージョンは合わせたほうがいい
そのバージョンの入手が難しくなっている場合もあるからその場合は本を変えるしか無い
出版された後にバージョンが変わってしまいそのとおりに学習ができないというケースが多発するので本よりググったほうが楽という面が大きい
0526デフォルトの名無しさん
垢版 |
2021/02/12(金) 16:50:26.27ID:7cf88jb8
環境たる Visual Studio の使い方が バージョンで全然違うからねぇ
それを使えた上で 何かの言語とAPIやフレームワーク駆使して実行ファイルを作るから
ド頭でつまずくと先進むのは難しくなるわな
0527デフォルトの名無しさん
垢版 |
2021/02/12(金) 16:59:13.12ID:jxDcSv/l
>>522
> @本とかで「Managed C++ アプリケーション」で作れって書いてあるが
そんな本は今すぐ捨てろ
今時Managed C++なんてやっても意味ない
あと、できればVisual Studio 2019買ってもらえ
準備ができたらここに書いてあるとおりに実行すればいい
https://docs.microsoft.com/ja-jp/cpp/windows/walkthrough-creating-windows-desktop-applications-cpp?view=msvc-160
0528デフォルトの名無しさん
垢版 |
2021/02/12(金) 18:01:31.31ID:VS77AOFk
個人的には前例になっとるプログラム(機能は違うが、処理内容はほぼ同じ)
がVC++で作られとったからそれを参考にしようと思ったんやが
何せプログラムではなく「プロジェクトの作成」で詰んでしまってなあ・・・

まさに「何していいかわからん」状態ですわ・・・
0529はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/12(金) 18:35:40.44ID:2OOQ6m86
>>522
Windows の GUI アプリのエントリーポイントは (main ではなく) WinMain なので、
スタートアップルーチンは WinMain があるものだと思って呼び出そうとする。
それがないからエラーって言ってる。

WinMain がどういうものかはここに公式な説明がある。
https://docs.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-winmain

それと他の人も書いてるが Managed C++ はやめたほうがいい。
.NET Framework を基盤にするアプリケーションを書くときにネイティブコードとの間で仲立ちする
のが主な目的のもので、普通のアプリケーションをそれで書くのは適してないし、
仲立ち用に使うにしても今では C++/CLI のほうがマシというのが一般的な評価だと思う。
俺自身は使ったことないから聞きかじりの評判しか知らんけど。

>>528
Windows のデスクトップアプリを一から書くなら C# のほうが楽だと思うから
C# スレへ行けと言いたいところなんだが、下手に前例があるのはしんどいな……。
0531デフォルトの名無しさん
垢版 |
2021/02/12(金) 18:43:42.13ID:Ir0s84kv
処理の主体がOSに近い所(GUIで窓の操の面倒をみるのがほとんど)なら
先例をもってくるほうが手近だけど、データ処理ならエッセンスだけ抜き出して
C#でGOするのもアリかもしれん

仕事で言語指定までされてる話ならがんばれ
0532デフォルトの名無しさん
垢版 |
2021/02/12(金) 18:55:05.22ID:RpqVOpxf
C++ で、DLL を作るプロジェクトじゃないの?

漏れなら、Ubuntu 18.04, mruby で、C/Ruby ごちゃ混ぜで書くけどw
0533デフォルトの名無しさん
垢版 |
2021/02/12(金) 19:03:16.62ID:RpqVOpxf
そもそも、Windows で、C/C++ の仕事があるのか?
想像できない

すべてのサーバーが、Linux なのに
0537◆QZaw55cn4c
垢版 |
2021/02/13(土) 01:09:45.11ID:HkWfV2pE
>>522
私ははるか昔に visual c++ にほとほとあきれ返ってしまったので、それいらい cygwin の中にある mingw32 を使って win32api だけを使って書いていた時期がありました
最近は c++11 以降ではスレッドも簡単に書けるようになったので、まあ、しばらくお休みはしてはいるのですが、いつか、c++11 主体で、ときどき win32api を呼ぶ、という感じの混在させたようなものを書いてみようか、などと、鬱々と考えています、考えているだけですけど‥‥
0538デフォルトの名無しさん
垢版 |
2021/02/13(土) 08:57:57.49ID:cPvPYeD3
奥が深いというか複雑なんやなこれ

とりまvs2008なのは会社の環境やから許してくれや
vc++もほとんどいじってなかったしなぁ

あれからとりあえず「空のc++アプリケーション」つくって
「dialog」1つ作って「ボタン」1個置いて
あとは「サブシステム」はちゃんと「windowsアプリケーション」にしたで

ダブルクリックしたらイベント書けるらしいけど
何かいたらいいか分らんかったから
とりあえずMessagebox::show("");
だけ書いた

結局出てきたエラーが
fatal error C1189: #error :
Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version.
Please #define _AFXDLL or do not use /MD[d]
c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afx.h

なんやけどワイはここで詰んだ

前任者マジでこのツールどうやって使ってたんや・・・?
アホやけどほんま教えてほしいやつこれ
0539デフォルトの名無しさん
垢版 |
2021/02/13(土) 09:59:44.52ID:KpUslkW7
プロジェクトのプロパティで/MD[d]とか書いてあるところを血なまこになって探す
見つかったらそこを/MDに変える
0542デフォルトの名無しさん
垢版 |
2021/02/14(日) 02:10:49.62ID:UasGJ1Yn
Linuxって…テキストファイルの最後には…必ず'\n'が入るって仕様なの?
なんか…GTK系は全部…そんな感じ…。最後に'\n'が入ると想定して最後は改行してない…。
気持ち悪いんだけど…。'\n'なしで終わってもいいよね?…どうしよう仕様合わせようか…
'\n'なしで終わったらいいじゃない…。カルチャーショック…。どう思います?
0544デフォルトの名無しさん
垢版 |
2021/02/14(日) 03:47:05.07ID:WdUd6MIw
ファイルの最後で改行して終わるってのはコーディング規約とかでも結構あると思うが
0546デフォルトの名無しさん
垢版 |
2021/02/14(日) 12:32:42.26ID:PhDiV4m5
C++のイディオムでwhile(std::getline(…, …))ってあるけど、
あれもファイル終端にLF無いと破綻するよ
0548はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/14(日) 14:02:31.79ID:kyN0kqqg
Vim で勝手に改行を付け加える仕様がどうこうで揉めたことがあったような。
テキストはどことやりとりするかわからんし、
POSIX の中だけで完結できるわけでもないからなぁ。
どっちも想定しておくに越したことは無いよね。

ちなみに C や C++ のソースコードも昔の仕様だと最後が改行ってのは要求されてたよ。
いつ削除されたんだったか覚えてないけど。
0550デフォルトの名無しさん
垢版 |
2021/02/14(日) 14:28:22.15ID:PhDiV4m5
>>549
ごめんうろ覚えでした
元の文字列に改行があったかがeof()でチェックしないと分からなくなる
前にそれでwhile条件節から外してブロック内でbreakしたほうが便利なことがあった……ってだけでしためんご
0554デフォルトの名無しさん
垢版 |
2021/02/14(日) 18:37:42.96ID:RmY9fsVU
getline や fgets 入力ストリームの最終行が改行を含まずのに閉じられてる場合
バッファの末端に \nが居ないだけで最終行は取り込まれるよね?
0556デフォルトの名無しさん
垢版 |
2021/02/15(月) 19:30:11.12ID:BmI3IhrJ
そういえば他人のコード変更をレビューするとたまに最終行に改行が追加されているのがあって、
「あーこの人が勝手に改行を追加したのかな、まプログラム的には同じだしいっか」とか思って
無視し続けていたが、あれはその人が使っているエディターによって自動的に変更されてた
のかな?
例えば最初にコードを書いた人のエディターは最終文字が改行でなくても構わなかったが
2番目に直した人のは改行を要求するとか...
clang-format あたりでそこら辺は統一できるのかな?
0557デフォルトの名無しさん
垢版 |
2021/02/15(月) 22:19:21.80ID:aLBeV9m+
最近まで、Ruby の1-liner に、バグがあった

末尾の改行コードを削除するために、chomp を使うべき所で、
文字列の末尾の1文字を削除する、chop を使っていた

最終行に改行が無くて、abc なら、ab になっていたw
0558デフォルトの名無しさん
垢版 |
2021/02/16(火) 14:01:37.31ID:kKLrubPe
>>554
fgets はバッファの長さ次第
0559デフォルトの名無しさん
垢版 |
2021/02/16(火) 14:15:32.56ID:kKLrubPe
>>554
getline はデフォルトのデリミタだと ' ' と 改行で切られる (ファイル終端の改行はあってもなくても同じ結果)
また fgets と違って取得した文字列にデリミタは含まれない

ちなみに ifs >> s も getline と似た使い方が出来るが
こっちはデフォルトのデリミタは改行のみ ( ' ' ) は取得される
また取得した文字列にデリミタは含まれない

つまり ifs >> s と getline(ifs, s) は同じではない
0562◆QZaw55cn4c
垢版 |
2021/02/16(火) 21:12:19.85ID:I98rHtI/
>>561
そういうインフラ用途には C/C++ しかないかと‥‥
0563デフォルトの名無しさん
垢版 |
2021/02/17(水) 18:17:22.87ID:8Df3qLX7
v8 って node.js やん
0566デフォルトの名無しさん
垢版 |
2021/02/23(火) 08:35:11.77ID:qdsH3SX7
すみません、C++で0以上の整数の範囲を表す型を使いたいのですが、どうするのがおすすめですかね?
struct { unsigned begin; unsigned end; }; ま、基本的にこれでいいんですが、もしより良い方法があれば...

- もしかして std::pair の方がいいんですかね? ただの struct よりメリットがあったりします?
- 一応、「有効な範囲を指してない」という状態が明確化できたらいいんですが... 最近 std::optinal というのを
知ったのですが、大げさ? 上記 begin と end を signed にして負のときは無効、とかでもいいんですが。
- 2つの範囲に対して各種集合演算的なものもできるとさらに。
0567デフォルトの名無しさん
垢版 |
2021/02/23(火) 12:05:47.24ID:EYNng8zF
lowerbound+offsetの方が融通が効くのでは
範囲としては倍表せるわけだし
wrap around しても2周はしないわけだから、範囲に入ってるかの判定には問題は無い
0568デフォルトの名無しさん
垢版 |
2021/02/23(火) 13:18:31.42ID:iu17pC6m
>>566
> - 一応、「有効な範囲を指してない」という状態が明確化できたらいいんですが...
end < begin なら有効でないってやればいいだけじゃね?
0570デフォルトの名無しさん
垢版 |
2021/03/06(土) 08:41:51.96ID:QrSKtEDt
変な質問ですが
std::vector<int, std::allocator<double> > を定義しようとしたら
static_assertでタイプが違うと指摘されました
じゃあなんでテンプレート変数分けてるんですかね...?
0571デフォルトの名無しさん
垢版 |
2021/03/06(土) 10:56:56.05ID:DM5zd16W
自作のアロケータを使う時に使う、
型が違うのはお約束に反する
0575デフォルトの名無しさん
垢版 |
2021/03/12(金) 20:55:45.62ID:ZDqlVx3B
すみません。C/C++自体というよりは、その学習方法についてですけど、教えて下さい。
ネット上で無料で公開されているC++の学習コンテンツで一番良いもしくは定番のものはどれでしょうか?

私はC, Java, C#の経験があります。しかしながら、Cはほとんど忘れてしまいました。
その状態の人間がC++をネット上の無料のコンテンツのみで学習したいのですが、どのページが良いでしょうか?
開発環境は既に準備しました。


よろしくお願いいたします。
0576デフォルトの名無しさん
垢版 |
2021/03/13(土) 11:40:09.75ID:g/wAdnDh
とりあえずwebのロベールとかでも良いとは思うけど・・
独習とかの本は何か持っといた方がいいと思う
0577はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/13(土) 14:13:55.98ID:aUdFS8U8
ウェブのロベール本ってこれのこと?
http://www7b.biglobe.ne.jp/~robe/cpphtml/
いまどき #include <iostream.h> とか書いてあるのはちょっと微妙だと思うぞ。
どの箇所だったか忘れたけど const の扱いで現行の仕様に合わない部分について
Taratail だったか Qiita だったかで見た記憶もあるし。

個別に見ればささいなことだけど、
入門者はそのささいなこともわかってないから入門者なわけで、
細かい引っ掛かりが多いとしんどいんじゃないか?
0578◆QZaw55cn4c
垢版 |
2021/03/13(土) 14:52:13.00ID:o3uThhpf
>>575
本を買った方がいいでしょう、それも複数買う前提で、この世界では「一冊で完結」は無理です

最初の一冊なら私なら旧独習をお勧めします(私がそうでしたから)、が、新独習の評判は聞いてみたいとは思っています
0580はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/13(土) 15:50:23.66ID:aUdFS8U8
>>579
俺は江添本を (全体を通しては) 読んだことがないのでごり押しするほど強い関心無いんだけど。

ただ C++ は C++11 が大きなターニングポイントになってるので、それより古い前提の説明は論外という立場。
ましてや C++03 にすら合致しないのは論外も論外。
論外のものを除いて入門向けにマシそうな、
しかも無料で読めるものというと江添本以外に実質的に選択肢がないからよく挙げるだけだよ。
0582はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/13(土) 16:33:14.60ID:aUdFS8U8
>>575
話題に上がったから紹介しておくけど、江添本ってのはこれのことね。
https://ezoeryou.github.io/cpp-intro/
入門書であまり取り上げられないけど入門者が躓きがちなコンパイラのコマンドの話や makefile とかいった周辺事情も
取り上げているかわりに、ヘッダファイルを使い分けしなかったり、継承を扱わなかったりで、
網羅的に C++ を理解するための本ではない。 入門者が入門するための本。
それ以上のことは他の本を読めという投げっぱなしだが、
とりあえず無料で基礎をおさえられる (しかも日本語!) という意味では他に紹介できるほどのものはない。

C++ ではありがたいことに無料で利用できるリファレンスは意欲的に整備している方々がいて、
https://ja.cppreference.com/w/
https://cpprefjp.github.io/
あたりを見れば細かいことも書いてるんだけど……。
まあ当たり前だが入門書をひとつも読んでないレベルだとみてもわけわからんと思う。

本気で取り組むなら本の数冊くらいは買ったほうがいいと私も思う。
0583デフォルトの名無しさん
垢版 |
2021/03/13(土) 16:48:52.40ID:g/wAdnDh
そら今時コマンドラインツール使っててソース1つだけで書いてるようなC++オタクには合ってるかもしれんけどな・・
0584はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/13(土) 17:11:08.84ID:aUdFS8U8
他に存在するなら紹介するんだけど、
無料でという制約の中で (個別のブログ記事とかじゃなく) それなりに筋道をつけた入門書で古すぎないものとなると無いだろ。
英語でいいならあったりするかな?
0585デフォルトの名無しさん
垢版 |
2021/03/13(土) 17:54:16.06ID:pYfy5bp8
>>581
自分は半月ほど前に最新版の独習を買って、半分ぐらい(p370あたり)読み進めているんだが、「本書について」によると、C++14とC++17をメインのターゲットにしてるって書いてますね
0586デフォルトの名無しさん
垢版 |
2021/03/14(日) 08:22:46.92ID:Zb/GuQ+J
アドバイスありがとうございます。
とりあえず、教えていただいたロベールさんのページを見たのですが、網羅的に書かれているようなのでまずはこれを読もうと思います。

> いまどき #include <iostream.h> とか書いてあるのはちょっと微妙だと思うぞ。
すみません。これ、何が悪いのでしょうか。。。

あと、教えていただいて気がついたのですが、C++も結構色々なバージョンがあるのですね。
私が今回触らなければならないコードはかなり前のコードなので、もしかすると古いバージョンのC++かもしれません。
その辺も意識して勉強しなくては駄目ですね。
0587デフォルトの名無しさん
垢版 |
2021/03/14(日) 10:23:48.46ID:FJEdpMO0
今はもう標準ライブラリに.hがついてるのは無いからそもそも実行できない可能性ある
0589◆QZaw55cn4c
垢版 |
2021/03/14(日) 14:53:49.63ID:uaeFGveg
>>585
旧独習には「std::stringを自分で実装せよ」という初級者には眩暈がするほどの崇高な課題が採用されていましたが、新独習には「〜を独力で実装せよ」系のお題は採用されていますか?
すくなくとも「〜を独力で実装する」系お題が可能になるだけの基礎知識をつけてくれる本ですか?
0590デフォルトの名無しさん
垢版 |
2021/03/14(日) 17:03:20.15ID:ERa14GlL
>>589
全13章605ページのうち7章380ページまで進んでいますが、そのようなお題にはお目にかかっておりませんな。
練習問題やその章の理解度チェックで色々な問題が出されていますが、何れも本をよく読めば解ける問題ばかりです。
さらっと先まで目を通してみましたが、そのような課題は見当たらないようです。
旧版のどの箇所あたりで出題されたものですか? もしかして、全く別の本のことなのでしょうかねえ。

↓の「おまけ」にあるような解答を求める問題でしょうか?
std::stringの実装に学ぶC++入門 - Qiita
https://qiita.com/YSRKEN/items/dd3b11e4670bb2b829a5

自分はまだ独習中で、C++は未だ*や&、&&、で頭の中がグルグル回ってしまうレベルなもので、理解できそうですが
いきなり自力で作れそうにありませんわw
0591はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/14(日) 18:12:48.12ID:aW+jce3e
>>586
> これ、何が悪いのでしょうか。。。

1998 年に国際規格 (ISO) になって以来、規格に iostream.h というものが有ったことはない。
.h は不要。
諸々の事情から iostream.h も用意している開発環境が多かったせいか
古い書籍では iostream.h としている場合は少なからずあるのだけれど、
主要な処理系の標準への準拠が急速に進んだこともあって、
資料も規格に寄せた書き方が今では普通。
iostream.h は古い本の象徴みたいな感じになってる。

そんでもって規格にない以上は iostream.h が存在しない開発環境も普通にあるってのが問題。
https://wandbox.org/permlink/kwpJf5BumkarYWYD
規格になくてもデファクトスタンダードとしてどこにでもあるってのならまあいいかと思わないでもないけど、
無いこともあるんだ。
そういう環境だともちろんエラーになる。

初心者が入門書の最初に載ってるコードを入力してみてエラーになるってのは良くはないだろ。
そんでもって問題がそれだけとは限らなさそうという……と思わせるサインなんだよ、 iostream.h は……。
0592◆QZaw55cn4c
垢版 |
2021/03/14(日) 20:04:14.75ID:uaeFGveg
>>590
手元の旧独習4版(ハーバード・シルト著)6章末「総合理解度チェック」
・次の演算ができるような strtype クラスを作成しなさい
・+ 演算子による文字列連結
・= 演算子による文字列代入
・<>==による文字列比較
固定長文字列を使ってもかまいません。難問ですが、よく考えていろいろと試してみてください。
必ずできるはずです。
0593◆QZaw55cn4c
垢版 |
2021/03/14(日) 20:13:24.03ID:uaeFGveg
>>590
>C++は未だ*や&、&&、で頭の中がグルグル回ってしまう
これらの「記号」は習得に順序があります。
まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。
次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう
参照 で返す、という場面でも、@参照返しが出来る場合と、A参照返しはできずせいぜい RVO に期待するしかない場合、の@A二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、@Aは結構重要だと思います

&& は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
0594デフォルトの名無しさん
垢版 |
2021/03/14(日) 20:26:39.87ID:ERa14GlL
>>592
やはり「独習」の違う本でしたわw
自分はC++関係の5ちゃんスレすら最近になって見てるんで、知らなかったけど
その本が「独習」のスタンダードなんですねw
独習C++ 第4版
https://poland-it-blog.com/c_plus_books/

自分のは、↓の9位に入ってる本です。(しかも同じ出版社)
https://freelifetech.com/cplusplus-books/
ご紹介の独習はやり応えありそうなので、今の本を2回ほどやってから、次のステップでそちらを検討してみますわ
0595デフォルトの名無しさん
垢版 |
2021/03/14(日) 20:28:56.28ID:EFkbulbJ
QZ案外初心者やなw
でも言ってることは全面的に賛成
ポインタや参照、クラス等の基本を抑えてからでないとスマポや、C++11からの要素(右辺値参照含む)の使い方もわからんと思う
0597デフォルトの名無しさん
垢版 |
2021/03/14(日) 20:46:24.30ID:uaeFGveg
>>595
>でも言ってることは全面的に賛成
ありがとうございます!

>QZ案外初心者やなw
もう永遠の初心者のままだと思っていますが、それならそれで「初心者の気持ちが分かる視点からの意見の表明」という形でコントリビュートするのもありかな…、と。
0598◆QZaw55cn4c
垢版 |
2021/03/14(日) 22:01:53.26ID:uaeFGveg
>>594
>>592 は歯ごたえがありそうでしょう?私もこの課題を最初に見たときは眩暈がしました…
それから 10 年くらいかな??それくらいたってから https://mevius.5ch.net/test/read.cgi/tech/1434079972/37 を書き、なんとか卒業できたような気がします
なおこれは、これでも例外方面に配慮が行き届いていない、とさらに書き直した気がしますが、その書き直しは失くしてしまいました……
0599はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/14(日) 23:21:43.64ID:aW+jce3e
個別の機能を理解してからそれの組み立て方を学習するのがまどろっこしく感じる人もいると思う。
抽象度の高いほう (スマートポインタなど) から解体していく形での
学習のアプローチもそれはそれでありかもしれん。

個人的には個別の機能を先に学んだほうがいいとは思うんだけどね。
実例から学ぶと使い方のパターンとして頭に入ってしまって正確な理屈を
きちんと習得できない気がするから。

そうは言っても途中で学習を諦めてしまうようだと正確さもくそもないから、
人によってわかりやすさは違うし学習にはいろんなアプローチがあるということは
覚えておいてほしい。
0600◆QZaw55cn4c
垢版 |
2021/03/14(日) 23:51:21.81ID:uaeFGveg
確かに、私が理解している狭い範囲においても、イテレータが先かポインタが先か、とか
C++11 / std::thread から入門したけど posix-thread なんか知らん!とか
そんな人から補強説が来るのが楽しみです
0603デフォルトの名無しさん
垢版 |
2021/03/15(月) 21:47:16.57ID:pqfQRyG1
Qちゃんは昔からいるけど態度は変わらんね
ときどき自前のコード上げてるあたりは好ましい
プロへのリスペクトは持ってるし謙虚ではある

餃子ちゃんはマジメというか
いちいち規格に沿って発言してくれるんで好ましい
ただコード上げてるのはみたことないんで実力は不明
アマチュアなのにときどき調子乗っちゃってるのも微笑ましい
0604デフォルトの名無しさん
垢版 |
2021/03/15(月) 23:09:56.95ID:kCaDVUc0
はちみつのコードたまーに見るけどすごい変な癖があるよ
意味があるなしに関わらず固執するタイプなんだろうな
0605デフォルトの名無しさん
垢版 |
2021/03/16(火) 13:45:10.41ID:A61zCves
参照を返す関数の質問です。
オブジェクトの複数のパラメータを設定するときに、obj.param1(...).param2(...).param3(...); みたいに呼ぶ
パターンがあるじゃないですか(ちなみにこれって名前はあります?)

これをやりたいときは
Obj& param1(int val) { mParam1 = val; return *this; }
みたいに参照を返すように宣言しないとダメですよね?

Obj param1(int val) { mParam1 = val; return *this; }
だと、obj.param1(...) は動くけどリターン用にオブジェクトの(余計な)コピーが発生する、
obj.param1(...).param1(...) みたいに呼んだ場合はオブジェクトのコピーに2番目の呼び出しが行われ、
結局破棄されてしまうので、objに2番目のparam1()の呼び出しが反映されない。
こんな理解で正しいでしょうか?

実は参照を使う判断にイマイチ迷っているんですが、もしかして毎回(オブジェクトの宣言、引数、戻り値等)、
「このときはここでオブジェクトのコピーが発生するから...」とかイメージすべきなんですかね?
例えば関数の戻り値、関数を出るときに戻り値が臨時で複製されて呼び出し元に渡されるイメージを持って、
「ああこれだと余計なオブジェクトが生成されるよな、じゃあ参照だ。」的な判断?
0608デフォルトの名無しさん
垢版 |
2021/03/16(火) 17:00:51.56ID:7emEuadh
obj + a + b + c
 operator + () は obj そのものを書き換えず、新たな実体を戻す

obj += a
 operator += () は obj そのものを書き換えるついでに、自分自身の参照を戻す

これのどっちに合致したほうが都合がいいかで
複製を戻すか、自分自身の参照を戻すかを分けてる感じ
0610◆QZaw55cn4c
垢版 |
2021/03/16(火) 21:25:10.58ID:EIvloTfy
>>609
その wikipedia の C++ サンプルは int main() が二箇所に現れていますが、これってどう読むのですか?
0611デフォルトの名無しさん
垢版 |
2021/03/16(火) 22:36:52.42ID:ne+I3KBD
すみません。
仮に、本を買って勉強する場合は独習C++というのがいいのですか?
独習C++はCの知識がなくても大丈夫ですか??
0617◆QZaw55cn4c
垢版 |
2021/03/18(木) 23:28:58.79ID:QiBLMBVe
>>605
>これをやりたいときは
>みたいに参照を返すように宣言しないとダメですよね?
>obj.param1(...).param1(...) みたいに呼んだ場合はオブジェクトのコピーに2番目の呼び出しが行われ、
>結局破棄されてしまうので、objに2番目のparam1()の呼び出しが反映されない。

確かに、メソッドチェインを繰り返すたびにコピーコンストラクタが呼び出されるのは、イマイチ、という感覚を私も同様に持ちます
だからメソッドチェインを書くときには私も参照を返すように書きます、結局のところ「参照を返す」というのは「ポインタを返す」ことですから、コンストラクタの走りようがない

しかし「参照を返す『必要がある』」と言い切れるかどうか?
「結局破棄される」というのは最後のメンバ関数が返す実体を回収していないからであり、「参照を返すから」破棄されるわけではないと感じました。
実際、この実体を回収すれば、それはそれで 2 番目以降の呼び出しが意味を持つように書けると思います

https://ideone.com/skVFOr
https://ideone.com/LAKqIj

参照でよくわからなくなったときに私がよくやる「参照返しを全く使わずポインタで押し通す」とすると次のようになるかと思います
https://ideone.com/R82zEE
0622デフォルトの名無しさん
垢版 |
2021/04/09(金) 18:45:41.35ID:WYvZUx+H
>>621
それはメンバ関数へのポインタでしょ
聞いてるのは関数の型でもなく、メンバ関数の型です
0624はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/04/09(金) 21:13:09.06ID:foJJo5gI
C だと関数指示子 (Function Designator) で説明されたりするんだが、
C++ の仕様を Designator で検索しても出てこないな。
シグネチャもまたちょっと違う概念だし、
このあたりのきちんとした解説がまとまったものがあればぜひ読みたい。
0626デフォルトの名無しさん
垢版 |
2021/04/10(土) 01:44:53.83ID:4ITkpFPM
>>622
だから「f の型は void (int)」って書いたのに、なんでそれが答えじゃないと思うの?

typedef void ftype(int);
struct Foo { ftype f; };
void Foo::f(int) {}
int main() { Foo x; x.f(0); }
0627デフォルトの名無しさん
垢版 |
2021/04/10(土) 08:44:20.64ID:gtw6CEDD
関数ポインタを考える以前は関数の型と言えばイコール評価した値の型だったな。
0628デフォルトの名無しさん
垢版 |
2021/04/13(火) 16:10:43.48ID:uVvL/txB
今は関数の型とかもうどうでもよくて
一周回り帰えりキャプチャとかダイナミックスコープとかの有用性や整合性が中心よね
0629デフォルトの名無しさん
垢版 |
2021/04/15(木) 15:55:01.75ID:6RtJrvVe
pod的な意味でなく論理的整合性的な型付けの恩恵受けたいなら、別に包む必要無くても常に即席structで返しててやんでい
0630デフォルトの名無しさん
垢版 |
2021/04/24(土) 08:11:28.54ID:LUJ0Utr0
C++/CLIで、スタティックライブラリからマネージドクラスを公開するのは無理なんでしょうか?
ヘッダファイルに全部実装書けば出来る、ってところまでは調べたんですが、ソースコードをプロジェクト外に置いてるのと変わらないので…。
ダイナミックライブラリでできるならそれでも構わないです。
0631デフォルトの名無しさん
垢版 |
2021/04/24(土) 08:19:46.15ID:nPKzA798
>>630
.NETでstatic libraryなんて作れたっけ?
最終的に.exeと.dllができるのが邪魔だからstatic libraryにしたいというだけなら、
いったんDLLとして作ってILmergeするのが一般的だと思う
0632デフォルトの名無しさん
垢版 |
2021/04/24(土) 08:36:31.23ID:LUJ0Utr0
>>631
Lib自体は作れるし、アンマネージクラスなら公開もできるんですが、マネージクラスだと参照側でメンバーが参照できず、LNK2020が発生してしまうんですよね。
ビルドオプションでなんとかできるものなのかな、と。
0635デフォルトの名無しさん
垢版 |
2021/04/24(土) 15:16:56.42ID:K4uxnQki
そりゃ無理。その仲立ちをするためにC++/CLIがあるのに。
一応nativeのC++からでも自分でCLRを立ち上げたりしてマネージドクラスにアクセスする方法は
あるらしいが、リンクしてそのまま呼ぶという形にはならない。
0636デフォルトの名無しさん
垢版 |
2021/04/24(土) 15:41:46.62ID:at4cvaWV
自作のプログラム、起動時の読み込み処理の前に以下を入れると
for(int i = 0; i < 100; ++i){
OutputDebugString("dummy!!!!\n");
}
起動時に行っている外部データの読み込みが凄く速くて
これを無くすと凄く遅くなるんですが怖い…
3分くらい違いが出るので明らかにおかしい
どっかでメモリでもぶっ壊れてますかね?
どういう理由が考えられるでしょうか?
0637636
垢版 |
2021/04/24(土) 15:43:36.70ID:at4cvaWV
さっきのダミーを入れなくても
普通にコードを追加したりしてても遅くなったり速くなったりする
別に読み込み処理の部分とは関係ないところでも。
なんでだろう?
0639デフォルトの名無しさん
垢版 |
2021/04/24(土) 16:03:17.28ID:lkpB631F
コンパイラはほんと何してるのか分からんから、問題の部分だけ切り出したのを.sへ吐かせて読みなさい
10行程度のcコードなら、edxとか変な名前のは取り敢えず変数だなって思って追えば、アセンブリ知らずとも大体分かるよ
0640デフォルトの名無しさん
垢版 |
2021/04/24(土) 20:39:49.92ID:LUJ0Utr0
>>635
いや、
C++ライブラリ内にマネージクラスを作って
マネージのC++プロジェクトから
呼び出したいだけ
DLLだったら、C#のDLLからマネージクラスを呼び出すのと
理屈上同じだからできそうな気がするのだけれど

以前実装した時はInterfaceだけ公開して
呼び出されるとそのインスタンスを返す、みたいなことをしたんだけれど
0641デフォルトの名無しさん
垢版 |
2021/04/24(土) 21:31:19.65ID:+v1plSJo
>>640
.NETはstatic libraryをサポートしていない
出来上がった.libにはそのマネージドクラスのメタデータとか入ってないんじゃない?
0642デフォルトの名無しさん
垢版 |
2021/04/25(日) 00:05:51.07ID:Oojm0ZzH
>>641
結局そういうことだよね
なんか普通にlibのクラスを呼び出せますみたいなのをサンプル付きで出してた記事があってさ…。

まあstaticメソッドしかないクラスばかりだから、アンマネージクラスで公開するか、namespaceでまとめます。
ありがとうございました。
0643636
垢版 |
2021/04/25(日) 00:07:18.69ID:sRfn5IZk
>>638
C++とWin32APIのプログラムです
>>639
これは自分へのレスですか?

特に遅くなる以外は止まったりする事もないので
困ることはないですがなんか気持ち悪い…
0645デフォルトの名無しさん
垢版 |
2021/04/25(日) 03:43:25.25ID:vJWG11Gh
>>643
関係ないかもしれないが、HDDが寿命で故障寸前の時にHDDの読み込みが
時々極端に遅くなったりする現象を経験したことがある。
その場合は、そのプログラム以外でも同様の現象が起きるが。
0646デフォルトの名無しさん
垢版 |
2021/04/25(日) 03:49:56.55ID:vJWG11Gh
>>645
もし、他のアプリやファイルマネージャーも遅くなることがあるなら、
CrystalDiskInfoなどで診断してみて欲しい。
そのアプリだけ遅くなるが、アプリの動作は正常、というなら、
メモリーやスレッドやOSリソースの使いすぎなども考えられなくは無いが。
何か極端に変わったことしてたりしない?
0647デフォルトの名無しさん
垢版 |
2021/04/25(日) 09:07:00.47ID:x26Nnfhp
OutPutDegugなんちゃらの関数がファイル出力してるなら、単純にそのドライブのアクセス準備が整ってないとか。

以前、SSDに同じファイル名で一時ファイルの作成と削除を繰り返したら、SSDの仕組み上めっちゃ遅くなったことがある。
0649636
垢版 |
2021/04/25(日) 10:38:16.68ID:sRfn5IZk
>>645-647
遅くなる原因の個所が分かった!
画像を読み込む時にメモリを操作して
16bitで読み込む部分があるんだけど
これを32bitで読み込むようにすると
どんなコードでもまったく遅くならない。
メモリの操作の部分がおかしかったみたい。
自分で書いたコードじゃないのでよくわからない。
32bitのやつと16bitのやつを載せるのでおかしい所あったら教えて。
0650636
垢版 |
2021/04/25(日) 10:39:18.00ID:sRfn5IZk
これは遅くならないコード
int X = 0;
for(int y = ImageHeight - 1; y >= 0; --y){
X = 0;
for(int x = 0; x < ImageWidth; ++x){
pPx[X] = ((DWORD*)pSrcBuf)[x + (y * ImageWidth)];
++X;
}
pPx += Pitch;
}
0651636
垢版 |
2021/04/25(日) 10:42:37.48ID:sRfn5IZk
これが遅くなる場合があるコード
WORD px, tmp;
BYTE b;
int X = 0;
for(int y = ImageHeight - 1; y >= 0; --y){
X = 0;
for(int x = 0; x < ImageWidth; ++x){
px = 0x00000000;
pPx[X] = px;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0xff000000) >> 24); //A
tmp = 15 * (b / 255.f);
px |= tmp << 12;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x00ff0000) >> 16); //R
tmp = 15 * (b / 255.f);
px |= tmp << 8;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x0000ff00) >> 8); //G
tmp = 15 * (b / 255.f);
px |= tmp << 4;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x000000ff)); //B
tmp = 15 * (b / 255.f);
px |= tmp;

pPx[X] = px;

++X;
}
pPx += Pitch;
}
0652636
垢版 |
2021/04/25(日) 10:46:22.20ID:sRfn5IZk
pPxは、32bitの時はDWORD*で、16bitの時はWORD*になってた。
全て載せると長くなるので変更すると速度が変わる部分だけ載せたよ。
16bitの方でも>>636のダミーを入れれば遅くならないんだよね。
やっぱメモリが壊れてるのかな?
0653デフォルトの名無しさん
垢版 |
2021/04/25(日) 11:02:40.44ID:vJWG11Gh
>>651
pSrcBuf, pPx, Pitch の型、及び、それらを初期化しているコードが重要。
そこに問題があるとバッファオーバーランしている可能性が捨てきれない。
0654デフォルトの名無しさん
垢版 |
2021/04/25(日) 11:04:39.40ID:vJWG11Gh
>>653
「初期化しているコード」を載せる際、ImageWidth, ImageHeightとの
値の関係が分かるようにしてほしい。
要は、ちゃんとバッファの範囲内に読み書きが収まっているかどうかが知りたい。
0655デフォルトの名無しさん
垢版 |
2021/04/25(日) 11:19:47.09ID:vJWG11Gh
>>652
例えば、pPxの指しているメモリーブロックのバイトサイズが、
Pitch * ImageHeight * (pPx の 1 要素当りのバイト数)
以上に、pSrcBufの指しているメモリーブロックのバイトサイズが、
ImageWidth * ImageHeight * 4
以上になっていることが重要。
0656デフォルトの名無しさん
垢版 |
2021/04/25(日) 11:46:51.84ID:vJWG11Gh
そういえば、pSrcBufを((DWORD *)pSrcBuf)のようにキャストしてから使っている
ことも気になる。
pSrcBuf = new DWORD [ImageWidth * ImageHeight]
ではなく、
pSrcBuf = new BYTE [ImageWidth * ImageHeight * 4]
などとしているのだろうか。
0657636
垢版 |
2021/04/25(日) 12:16:02.68ID:sRfn5IZk
>>653-656
void *pSrcBuf;
LONG Pitch;
pPxは、16bitの時がWORD*で32bitの時がDWORD*
という感じになってた。

初期化の部分がかなり複雑で結構辿って調べる必要があるんだよね…
でも思うのは初期化は、16bitと32bit大体同じで違うのはpPxの型くらいで
それで>>650の32bitのコードだと全然遅くならないから
>>651の16bitのコードの部分自体が何か変だったのかなと思ったんだけど
ここ自体は大丈夫なのかな?
0658デフォルトの名無しさん
垢版 |
2021/04/25(日) 13:26:15.86ID:QOuShU0Z
そもそも遅くなるって何分が何分になるん?
100分が103分ならそんなもんじゃね?
としか思えないし
0661デフォルトの名無しさん
垢版 |
2021/04/25(日) 14:37:31.77ID:sRfn5IZk
>>660
いやそうじゃなくて、>>636のダミーコードを入れると
何故か速い速度になって、それを取り除くと遅くなってしまう感じ。
普通にコード書いてても関係ない部分を追加したりすると遅くなったり
速くなったりするからおかしいなと思ってて。
0662デフォルトの名無しさん
垢版 |
2021/04/25(日) 14:41:04.92ID:9Nm1id/y
>>661
なるほど。では、
>初期化の部分がかなり複雑で結構辿って調べる必要があるんだよね…
であったとしても、原因を特定するには、少なくともまずそこを丹念に
調べる必要がある。
0663デフォルトの名無しさん
垢版 |
2021/04/25(日) 14:41:34.25ID:QOuShU0Z
>>661
とりあえず遅いコードと速いコードを晒してよ
バッファーオーバーランで制御変数壊してるとかあるかも知れんし
0664デフォルトの名無しさん
垢版 |
2021/04/25(日) 14:45:29.68ID:9Nm1id/y
>>661
そういえば、速い時でも30秒もかかっていることはとても気になる。
>>650 のコードだとどれくらいの時間になるの?
経験と勘で言えば、そのような平易なコードで30秒も掛かって、
時と場合により3分もかかるという現象が起きる場合、キャッシュ
が乱れている可能性がある。
もしかして、どこかで極端にメモリーをランダムアクセスしてない?
巨大なメモリーの中を、極端に不連続な場所をあっちこっちアクセスすると
キャッシュが聞きにくくなって、急激に遅くなることがある。
0665デフォルトの名無しさん
垢版 |
2021/04/25(日) 14:57:01.28ID:sRfn5IZk
>>662
確かにそこは念入りに調べる必要がありますね。
>>663
それが本当に>>636をまったく関係ない部分に入れるだけで
速くなったりしてて。普通にコード書いてまったく関係ないところ追加したりすると
速くなったり遅くなったりするんだよね。一旦速くなったら弄らない限り遅くなる事はなくて
逆に一旦遅くなったら弄らない限り速くなったりする事はない感じ。
>>664
読み込んでメモリ操作する部分自体はかなり多い数をやってるので
20〜30秒くらいかかる時もある感じ。
読み込みとメモリ操作の部分で細かくメモリ確保と解放をやってるので
それのせいもあるのかな?
0666デフォルトの名無しさん
垢版 |
2021/04/25(日) 15:04:55.13ID:9Nm1id/y
>>665
>読み込んでメモリ操作する部分自体はかなり多い数をやってるので
>20〜30秒くらいかかる時もある感じ。
話を総合すると、
>>650 のコードが、「20〜30秒くらいかかる」が、
>>651 のコードが、速い時には「30秒」
ということになるが、コードを見る限り、651のコードは650の
コードの10倍以上かかっても不思議ではないコードになっているので、
この速度差はむしろ、少な過ぎる。
むしろ、>>651のコードは「3分」かかっている方が、
長年の経験と勘では正常に思える。
0667デフォルトの名無しさん
垢版 |
2021/04/25(日) 15:13:30.56ID:CFgRAQQ/
読込とか細かいメモリー確保とかコードに無いこと言われてもエスパーじゃないのでどうしょうもないな
悪いけど情報出せないなら他でやってくれ
0668デフォルトの名無しさん
垢版 |
2021/04/25(日) 15:19:48.04ID:sRfn5IZk
>>666
今チェックしたら650の方が少し速かったですw
650が12秒くらいで、651が22秒くらいでした
これが速い場合で、651が遅い場合は2分くらいでした。
650は遅くなることがないです。

>>667
ほんとうにそうですね。
とりあえず晒した所が大丈夫なら
他の部分は自分で調べてみようと思います。
0669デフォルトの名無しさん
垢版 |
2021/04/25(日) 15:45:51.96ID:S2tV53BX
>>668
>今チェックしたら650の方が少し速かったですw
>650が12秒くらいで、651が22秒くらいでした
>これが速い場合で、651が遅い場合は2分くらいでした。
>650は遅くなることがないです。

これだけでも重要なことが分かる。以後は、処理時間に関する(数学的な)定量的な話になる。
まず、650と651の速度差が1.8倍程度しかないことからすると、
pSrcBuf と pPx の読み書きに相当時間が掛かっていることを示唆している。
650と651のソースを比較した時、計算部分の処理がとても増加しているが、
読み書きはキャッシュまで考慮すると、650と651で差が出ない。
651では、pSrcBufからは何度も読み込まれているが、最初に一回読み込まれた後はキャッシュに乗っているため、
複数回読んだからといって時間増大の原因にはなりにくい。
651では割り算や掛け算の計算量が物凄く増えているのにそれが比率にして 0.8 にしかなっていない。
(割り算や掛け算は本質的に遅いことはこの議論に置いて重要である。)
大量の割り算、掛け算に掛かっている時間が 0.8しかないのに、高々1回ずつのメモリーへの読み書きが 1.0 の時間
かかっていることに着目すると、1ピクセルあたり、データバス-CPU間の転送の観点で言って、
pSrcBufからの「一回の」読み込みとpPxへの一回の書き込みに、かなり時間が掛かっていることを意味する。
データがキャッシュに乗っていれば、ここまでの時間が掛からないので、
長年の経験と勘によれば、このような事態が起きたとき、CPUの中のすべてのキャッシュを一掃してしまっていることが多い。
だから、例えば、バックグラウンドで他のアプリが動いていたりすると、キャッシュを
復活させるために物凄く時間が掛かることがある。
それで、他のアプリがメモリーを復活させようとしたかしていないかによって、
OS全体としての処理時間が如実に変わる現象が起きることがある。
これが、今回の奇妙な現象が起きている原因かも知れない。
0670デフォルトの名無しさん
垢版 |
2021/04/25(日) 16:25:58.61ID:sRfn5IZk
>>669
細かい分析ありがとう。
だとしたら>>636のダミーを入れると速くなるのも
そのキャッシュの原因に何か関係してるのかな?
でも今まで>>665でも書いたように一旦遅くなったら
遅くなったままで、速くなったら速くなったままなんだよね… コード弄らない限り。
もしかすると何か条件が重なればコードを弄らなくても遅くなったり
速くなったりすることもあるのかもしれないけど。今のところは確認出来てない感じ。
0671デフォルトの名無しさん
垢版 |
2021/04/25(日) 16:32:43.41ID:S2tV53BX
>>670
それより、650のコードで12秒も掛かっていることにかなり違和感を覚える。
ImageWidth が、ImageHeight が 2000 位までなら、4*10^6 ピクセルくらいで、
32BIT RGBカラーだとしても16MB位。
いまのCPUだと、>>650のコードくらいで12秒も掛かるはずは無い。
大雑多な予測だと、3.0GHzのCPUで、10(ms)くらいまでのはず。
ImageWidth や ImageHeight の値はいくらくらいになってる?
0672デフォルトの名無しさん
垢版 |
2021/04/25(日) 17:04:17.68ID:/0G3TNx0
650は最適化で X も x も同じ値で遷移していくし内側のループは
memcpy 相当のブロック転送におきかわりそうだけど
0674デフォルトの名無しさん
垢版 |
2021/04/26(月) 01:18:20.13ID:0cli3R6k
>>671
大きな画像(2048*2048)とかを結構読み込んでて。
読み込み処理自体は他の部分もあるのでそのくらいになってしまってる感じ。
>>672-673
一応は650にすれば何の異常もなくとても速く動作はするんだけど
出来れば原因が知りたいと思ってて。難しいならもうあきらめるけど。
0675デフォルトの名無しさん
垢版 |
2021/04/26(月) 01:51:09.48ID:u7NjNSbC
>>674
ファイルから読み込んでるらしいけど、fseek をループの中で多数回使うと
使わない場合と比べて劇的に遅くなるけど、seek 系の関数は使ってない?
0676デフォルトの名無しさん
垢版 |
2021/04/26(月) 02:03:22.38ID:+l9LtKe6
ファイル読み込みの部分でHDDキャッシュがかかってるかどうかだったり
よくある話
0677636
垢版 |
2021/04/26(月) 02:36:05.57ID:0cli3R6k
色々と試行錯誤してたら
>>651のコードのこの部分を
for(int x = 0; x < ImageWidth; ++x){
このように書き換えたら普通に速くなったw
for(int x = 0; x < ImageWidth / 1.0f; ++x){

なんか最適化が効いたり効かなかったりみたいな差に感じてしまう。
そういう原因なのかな?
0678デフォルトの名無しさん
垢版 |
2021/04/26(月) 02:37:06.08ID:u7NjNSbC
>>674
2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、
それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も
有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも
言えないけど。
0679デフォルトの名無しさん
垢版 |
2021/04/26(月) 02:39:54.17ID:u7NjNSbC
>>677
使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと
Release版にして最適化は有効にしてる?
DebugPrintを使っているなら最適化はOFFになってるのでは?
0680デフォルトの名無しさん
垢版 |
2021/04/26(月) 02:43:34.12ID:0cli3R6k
>>678
でも>>677の修正で速度が劇的に変化するのはなんでなんだろう?
>>679
Releaseで調べてるよ。OutputDebugStringはReleaseモードでも使えるので。
0681デフォルトの名無しさん
垢版 |
2021/04/26(月) 02:46:30.17ID:0cli3R6k
>>677の修正をしたあと、>>636のダミーコードを
追加したらなんと今度は遅くなったwwなんでだ?w

>>636のダミーコードだけ追加したら速くなって
ダミーコードを削除すると遅くなる
その遅くなった状態で>>677の修正をすると速くなる
その速くなった状態で>>636のダミーコードを入れると
今度は遅くなるww
0682デフォルトの名無しさん
垢版 |
2021/04/27(火) 02:43:12.80ID:qV+SOSDm
状況から察するに、おそらく君が見ている部分じゃない
どこかに根本的な問題がある、という気がする
なんとなくだけど、バッファオーバラン系のような気がする
0683デフォルトの名無しさん
垢版 |
2021/04/27(火) 05:25:14.56ID:Vf/GSwOl
>>682
どこかに問題がありそうですよね。
バッファオーバラン系は問題あっても動いてしまう事があるから怖いですね。
地道に調べて行くことにします。
0684デフォルトの名無しさん
垢版 |
2021/04/27(火) 11:47:32.64ID:V9b4VlmB
それより、12秒間も大量のメモリーを使う状態でCPUがフルパワー状態になっている
とすれば、フル・キャッシュ汚染してる可能性がある。
フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために
速度が不安定になるから、説明可能。
0685デフォルトの名無しさん
垢版 |
2021/04/27(火) 12:52:21.01ID:cPrICHbO
Meltdowm や Spector 対策のパッチの影響とか?
特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。
0686デフォルトの名無しさん
垢版 |
2021/04/28(水) 02:54:54.42ID:XgRH6ChF
>>684-685
みなさんありがとうございます。
色々な問題が考えられそうですね。参考になります。
もう少しコード弄りながら挙動を調べて行きたいと思います。
0687デフォルトの名無しさん
垢版 |
2021/04/28(水) 04:32:07.96ID:v8E9sca8
>>686
なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、
本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。
しょうがないけれども。
それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。
完全にメモリーを逆方向に読んだりすると、低速化の原因になる。
この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が
速くなる。DDR-MemoryはBurst転送が基本なので。
キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから
外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは
速度低下の原因になる可能性が出てくる。絶対ではないが。
0690デフォルトの名無しさん
垢版 |
2021/04/28(水) 13:14:16.90ID:WdoV9Bq9
>>689
コンパイラのくせに生意気だぞ
0691デフォルトの名無しさん
垢版 |
2021/04/28(水) 13:16:59.82ID:jQpDsyge
>>689
実は昨日の夜から、俺もそう思ってた。
今は、
読む方が逆方向で、書く方が順方向になってしまっているが
読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの
仕組みから行って速くなる可能性が高い。
0692デフォルトの名無しさん
垢版 |
2021/04/28(水) 14:04:09.00ID:4fcF+gv5
Windows の bitmap で ファイル中の配置や CreateDIBSection() で戻ってくるメモリの配置だな
デフォで bottom - up の方向 カメラのフレームとかは top - down な方向

ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして
0693デフォルトの名無しさん
垢版 |
2021/04/28(水) 15:30:36.23ID:WdoV9Bq9
走査線と描画が重なったらチラツキが激しくなるから下から描いていくんだよ
0694デフォルトの名無しさん
垢版 |
2021/06/14(月) 15:32:51.34ID:TE2ntQhj
for(int a=0; ...; ...){...} とかはループ内だけのスコープで int a が使えるのに

int a;
while(a){...}
とか
int a;
do{...}while(a);
とかは
while(int a=...){...} ←これだけはOK?
とか
do{...}while(int a=...);
とか
do{int a; ...}while(a);
みたいに書けないのはなぜ?
0695デフォルトの名無しさん
垢版 |
2021/06/14(月) 15:40:36.46ID:peg/OyGg
do{...}while(int a=...);  宣言より前に変数を使用する
do{int a; ...}while(a);  スコープの外に変数を持ち出す
0696はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/06/14(月) 17:56:57.54ID:fvxG9/iR
>>694
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。
たとえば while の文法は
while ( expression ) statement
というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。
で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。
そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、
繰り返しの構文のときだけ特別扱いということは出来んのだわ。

> while(int a=...){...} ←これだけはOK?

これは C++ では良いけど C では駄目
0697デフォルトの名無しさん
垢版 |
2021/06/14(月) 18:58:23.47ID:HtMoZ8Hn
小さいスコープの中だけで使う自動変数だってんで
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある
0698デフォルトの名無しさん
垢版 |
2021/06/14(月) 21:48:16.36ID:OzvaLd6A
C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?
0699デフォルトの名無しさん
垢版 |
2021/06/14(月) 21:53:52.73ID:VOy4fGQR
標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど
0700デフォルトの名無しさん
垢版 |
2021/06/14(月) 22:00:33.63ID:eQ9/Z+Eb
>>694,696
C++でもwhileの判定式中の宣言は毎回新しくなるんで、使いみち思いつかん。
while(int i=10) { i--; } は、無限ループになる。

できるとしたら、処理が終わったらすぐに始末したいobjに対して、
{ myclass obj(); while(obj) { obj.some_op(); } }
(obj は operator bool() とか実装してる前提)
が、
while(auto obj = myclass()) { obj.some_op(); }
こんな風にかけてちょっと{}がスッキリするくらい?(実際はobjが毎度構築される)
0701デフォルトの名無しさん
垢版 |
2021/06/14(月) 23:04:55.36ID:wv1U8ajF
カラス括弧!
初めて見た!
0702デフォルトの名無しさん
垢版 |
2021/06/15(火) 08:13:38.32ID:4rRZmg7L
>>700
まあ while(...){} は for(; ...;){} で書けるしメリットないかな
ただ
do{ int a = …; }while(a); の方は書けたら嬉しいな
使用頻度は低いけど
0705デフォルトの名無しさん
垢版 |
2021/06/18(金) 08:43:02.57ID:R4m5mk7U
それdoよりどういうメリットある?
わざわざdefault:書かないとならないしインデント深くなりそうだし。
0706デフォルトの名無しさん
垢版 |
2021/06/18(金) 11:21:27.64ID:FZUuAAIq
マクロで展開するならインデントは無視できる
0707デフォルトの名無しさん
垢版 |
2021/06/18(金) 11:50:10.76ID:7Huy+AZL
do{}while(0) は最後に ; 書く前提だし矛盾ないけど
switch(0)default:{...} は ; の扱いの困らない?
0709デフォルトの名無しさん
垢版 |
2021/06/18(金) 12:32:57.03ID:6AzE04jr
{ } 内スコープからの脱出で break; 使いたいってのと
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0)

do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ

if (<condition>) foo(arg); else <elsecase>; とかが
0712デフォルトの名無しさん
垢版 |
2021/06/18(金) 14:44:41.04ID:tzOvIsZE
>>710
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダサいと思うから do { ... } while(0); にするわ
0713デフォルトの名無しさん
垢版 |
2021/06/18(金) 20:29:59.97ID:R4m5mk7U
>>706
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。
セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと
やっぱりインデントが変になるとか。
0714デフォルトの名無しさん
垢版 |
2021/06/19(土) 12:53:56.96ID:EDF+B3Dq
#define breakblock switch(0)defalut:
でいいやん
できないとか怪しげとか意味不明
マクロ化する必然性がそもそもわかんないけど
0715デフォルトの名無しさん
垢版 |
2021/06/19(土) 13:08:34.87ID:AhXAE8oj
そこまでして switch(0) 使う理由がよくわからん。
do while(0) と比べてどういうところが良いの?
0716デフォルトの名無しさん
垢版 |
2021/06/19(土) 13:21:09.67ID:ylfkd6bV
マクロの例でもわかるように波括弧を単独で使える
変な処理が始まってんの一目瞭然
continueもgotoで(goto使わない別ルーチン探せよw

#define breakblock(a) uniqelonglongprefix##a:switch(0)default:
#define bbcontinue(a) goto uniqlonglongprefix##a
0717デフォルトの名無しさん
垢版 |
2021/06/19(土) 14:04:38.18ID:AhXAE8oj
>マクロの例でもわかるように波括弧を単独で使える

ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。
わからんでもないが、自分はマクロや default: より気にならないからいいや。
0719デフォルトの名無しさん
垢版 |
2021/06/20(日) 18:26:02.94ID:3hmKhJNO
でもその構文はdefineで置き換え前提で使ってるとしか思えない
0720デフォルトの名無しさん
垢版 |
2021/06/20(日) 19:15:11.97ID:XoXh1cqB
goto書くと死んじゃう人は大変だなぁ
Dijkstraもそこまでは言ってないらしいぞ
0721デフォルトの名無しさん
垢版 |
2021/06/20(日) 22:56:11.58ID:R7oo70Ox
ナンチャラカンチャラの人のdefine使用意図が無意味すぎてどうもc言語エアプなんじゃないかと疑う
0722デフォルトの名無しさん
垢版 |
2021/06/21(月) 16:42:57.66ID:iJjBc6fp
switchのやつは最後にbreakかfall throughってコメント書いとかないと文句言うチェッカとかありそう
0724デフォルトの名無しさん
垢版 |
2021/07/05(月) 16:13:31.07ID:3/iVgePD
別のところで質問したのですが、初心者歓迎スレのほうがいいと思いこちらで質問し直します。

Macのclang++でコンパイルしています。
cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
0725デフォルトの名無しさん
垢版 |
2021/07/06(火) 01:49:57.37ID:w3zU8vH7
>>724
手元のM1のでやったら普通にエラーになるけど?
printf("%d",rand());
だけ書いたやつ。

clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。

すまん、役に立てなくて。
0726はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/07/06(火) 05:58:16.49ID:kwaneL8R
>>724
ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。
たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。
ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので
rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。

-M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを
抽出できるからそれで確認できるよ。
0727724
垢版 |
2021/07/06(火) 08:23:42.24ID:9fUGxcs8
>>725
ありがとうございます。M1のclangではエラーが返るのですか…。コンパイラのバージョンの問題ですかね?
>>726
ありがとうございます。-M試してみました。
インクルードはiostreamだけにしていたのですが、ぞろぞろヘッダーファイル出てきまして、その中にcstdlibもstdlib.hもありました。
iostreamのインクルードを外すと当たり前でしょうが、それらのヘッダーファイルは表示されなくなりました。
つまり、iostream以下のヘッダファイルの依存関係にcstdlibがいたということですよね?
これは処理系依存なのでしょうか?
0728はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/07/06(火) 08:56:08.30ID:kwaneL8R
>>727
処理系依存だと思う。
iostream が暗黙に include すると仕様に明記しているのは
ios, streambuf, istream, ostream の 4 つ。
https://timsong-cpp.github.io/cppwp/n3337/iostream.objects.overview

あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている
ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、
それ以上のことについてはっきりしたことは書かれてない。

rand が必要なら (たとえ実態として間接的に cstdlib が include されていても)
プログラマは明示的に cstdlib を include するほうがいい。

というか、そもそも論としてはいまどき rand を使うのは避けるほうが賢明な考えだと思うけどね。
0729724
垢版 |
2021/07/07(水) 08:49:49.95ID:O+5oUfAp
>>728
なるほど、そもそも論まで含めてよくわかりました!
ありがとうございました!
0730デフォルトの名無しさん
垢版 |
2021/07/09(金) 19:37:14.99ID:We+HIKc2
C言語にpthreadを使ってマルチスレッドにするときの初歩的な質問をしたいのですが、
大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という
説明はわかった気がします。
では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を
知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の
別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。
それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。
0733デフォルトの名無しさん
垢版 |
2021/07/09(金) 21:31:49.00ID:RRTM5Oms
>>730
スレッド実行中に書き換わる可能性があるなら必要。
変数を読むといってもCPUは一度内部のレジスタに読み込まないと処理できないので、
スレッド1でレジスタに読み込む→スレッド2で変数を書き換える→スレッド1に結果が反映されない
という事態が発生する可能性がある。
0734デフォルトの名無しさん
垢版 |
2021/07/09(金) 22:32:02.32ID:eGF9BJZ0
>>733
それ反映する必要ないだろ
単にスレッド1が先に読んだだけだし
それより読み書きがアトミックでないなら読み出し時にも排他しないと書き換え中の変な値を読んじゃうかと
0736デフォルトの名無しさん
垢版 |
2021/07/10(土) 04:35:16.68ID:jD2ZKaD3
ええ場合もある
「単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ」はそれでええ場合のように聞こえるな
0737デフォルトの名無しさん
垢版 |
2021/07/10(土) 05:28:04.15ID:TJHT9gxK
ええ場合も何も読んだ後で書き換えられたのをどうやって反映させるつもりなんだよ…
0738デフォルトの名無しさん
垢版 |
2021/07/10(土) 05:33:10.76ID:Tru2G6zE
関連する操作すべてを優先順付きキュー経由にし
巻き戻し必要な操作にはジャーナル機能も入れ
やり直し再キューすんのよ
0739デフォルトの名無しさん
垢版 |
2021/07/10(土) 05:36:14.97ID:N1Z7WBqy
別スレッドからflgをいじって停止できるように

while (flg) {...}

と書いても、{...}の内部でflgをいじってないなら、
最適化で単なる無限ループに書き換えられて、flg変えても止まらない、
みたいな話なかったっけ。
0741デフォルトの名無しさん
垢版 |
2021/07/10(土) 07:11:18.51ID:JKFXuD7+
スレッドAが 16bit長の整数を書き換える
スレッドBが 同じ16bit長の整数を読み込もうとしたとき
8bit長でしかアトミックな操作が保証されてないシステムだと

初期状態 0x0000 で スレッドA が 0xFFFF と書き換える

 A書き込み 上位FF
  (スイッチ)
B読み込み 上位FF
B読み込み 下位00
  (スイッチ)
 A書き込み 下位FF

こういうことが起き得るという話でいいんかな
0742デフォルトの名無しさん
垢版 |
2021/07/10(土) 08:27:22.56ID:N9R+gZBb
>>734
いや、先に読んだだけっていっても、例えば
i f (v==1)
みたいな条件式を評価した段階では1だったけど、その先で急に2に変わった、とかだったらまずいだろw
0743デフォルトの名無しさん
垢版 |
2021/07/10(土) 08:34:33.02ID:EesV0O7a
質問者の文言が

>単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ

>読みに行った瞬間の値を知りたいだけ

なので必要なし
以上
0745デフォルトの名無しさん
垢版 |
2021/07/10(土) 08:48:41.36ID:N9R+gZBb
>>744
ifの中ではもう一度vの値を読んだときには2になってたりするわけよ
vが1の前提で書いたコードの中に2を突っ込んだらまずいよ
0747デフォルトの名無しさん
垢版 |
2021/07/10(土) 09:15:23.13ID:nctQkkF+
質問者が言ってないことに加えて勝手に仮定を追加してまずいとか言ってる>>745はもう黙ってほしい
0749はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/07/10(土) 09:56:52.21ID:11oc3t46
>>730
結論から言うとロックは必要。
同一のメモリに対するアクセスの少なくとも一方が書き込みである場合には衝突すると定義されている。
https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#4
その場合にはデータ競合が発生する。
https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#21

同時に起こりうるアクセスの内でひとつでも書き込みが存在したらそれはデータ競合の可能性があるってこと。

ミューテックスはミューテックスの所有権を取り合うことで競合を阻止する仕組み。
ロックというのは「ミューテックスをロックする (ロックしている間は自分がミューテックスの所有権を持っている)」
ということであって、対象となるデータそのもののアクセスを直接的に制御してるわけじゃないので、
書き込み側でロックするだけでは意味がない。
0752デフォルトの名無しさん
垢版 |
2021/07/12(月) 12:14:53.15ID:uJpO0uZ2
「衝突しても問題ない」&atomicも使わない=「データ競合となっても問題ない」=「動作が未定義でも問題ない」なら
確かにロックは不要だけど。
0753730
垢版 |
2021/07/12(月) 15:19:59.68ID:VxiBn2TN
730です、どうもお騒がさせしております。
どうやら読み出しだけのときも基本的にはミューテックスを使うべきのようですね。

私の場合は域変数をカウンタとして使っていてその値をログ出力する、というような状況で、
なんとなくミューテックなしでもいいかと思ったのですが、ミューテックスを使わない場合は
気持ち悪い値がプリントされている感じですかね。
一般的な状況では、ミューテックスを使わなくても実害がないかを考えるよりはちゃんと
ミューテックスを使った方がよさそうですね...
0754デフォルトの名無しさん
垢版 |
2021/07/13(火) 17:41:58.36ID:DZW75fJj
「今値を書いてるから 書き終わるまで待て」と待たす相手は
次にそこへ書き込むヤツだけじゃなく
そこを読込もうとしたヤツも対象にしとけば ちゃんと書き終わった値が読込める
中途半端に書いてる最中であっても意図的に抜き出したいのなら 書き終わるまで待たずに読む

そしてみゅーてっくすの激しい握り合い
0757デフォルトの名無しさん
垢版 |
2021/07/13(火) 20:55:03.74ID:Cs3wNevb
>>756
>>749のリンク先読めばわかると思うけど競合が発生して結果が未定義になるのは
> at least one of which is not atomic
のケースね
0758デフォルトの名無しさん
垢版 |
2021/07/13(火) 21:33:13.25ID:+UxqO86S
>>757
そこで言ってる "atomic" の意味は std::atomic<int> ならOKで int はダメという話なんだけど、
「単純なカウンタみたいなアトミックに読み書きできるような変数」って言い換えちゃったらどっちもOKに読めちゃうでしょ。
0759デフォルトの名無しさん
垢版 |
2021/07/13(火) 21:39:13.87ID:Cs3wNevb
>>758
intがダメなのは>>741みたいなケースね
> 「単純なカウンタみたいなアトミックに読み書きできるような変数」
でだめだと言うなら実例教えて
0760デフォルトの名無しさん
垢版 |
2021/07/13(火) 22:40:14.76ID:31Jksjnm
単純なカウンタがアトミックに読み書きできるかは
基本型の宣言だけではわからんから
アトミック化の指示ができるならやっとけ ということでいいんでないの?
0761デフォルトの名無しさん
垢版 |
2021/07/13(火) 22:49:59.37ID:Cs3wNevb
>>760
そのスタンスでいいと思うよ
俺はアトミックに読み書きできるケースなのに嘘とか言ってる>>756がなんか特殊なケースを知ってるのかな?って思ってるだけ
0762デフォルトの名無しさん
垢版 |
2021/07/13(火) 23:59:32.08ID:31Jksjnm
指示ができない場合にはアトミックに操作できる保証なんてないから
排他したほうがいいぜって立場
0763デフォルトの名無しさん
垢版 |
2021/07/14(水) 00:44:44.53ID:pCGEFvrX
>>759
生の int に複数スレッドから排他なしでアクセスしてたらその時点で未定義動作=ダメなんだってば。
未定義動作となる場合に必ず期待に反するコードが生成されるわけでもないんで、実例を出せというのも意味が無い。
(実例が無いからといって「敢えて」未定義動作に誘導するというのは意味が無いどころか有害。)

・・・スレッドサニタイザで引っかかってウザい、とか言えば「実例」として納得してくれるの?
0764デフォルトの名無しさん
垢版 |
2021/07/14(水) 01:04:57.94ID:b90ql0x3
生のintへのアクセスがアトミックに行えるかって処理系が保証したりしないのけ
0766デフォルトの名無しさん
垢版 |
2021/07/14(水) 06:51:23.81ID:3FmZNcD6
>>764
保証してる処理系なら std::atomic<int> でオーバーヘッドは生じない、つまり排他は要らんってことでしょ
>>756がなんか実例知ってるかと思ってたけど単なる規格厨だったなw
0767デフォルトの名無しさん
垢版 |
2021/07/14(水) 12:49:26.09ID:pCGEFvrX
>>766
オーバーヘッドが生じるかどうかで考えてるなら(それもおかしいんだけど)、こんな例を見れば考えを改めてくれたりするの?
https://godbolt.org/z/6oM5oevsY
#include <atomic>
int load(std::atomic<int> const& x) { return x; }
int load(int const& x) { return x; }

↓ARM64 gcc 11.1 -O2
load(std::atomic<int> const&):
&nbsp; ldar w0, [x0]
&nbsp; ret
load(int const&):
&nbsp; ldr w0, [x0]
&nbsp; ret
0769デフォルトの名無しさん
垢版 |
2021/07/14(水) 19:20:02.20ID:pCGEFvrX
>>768
766 が「オーバーヘッドは生じない」ならば「排他は要らん」という論理らしいので
「オーバーヘッドは生じない」を否定すれば「排他は要らん」とかいう嘘を言わなくなってくれるかなと思って書いてみた。
オーバヘッドの発生と排他の要・不要とが 766 の頭の中でどう繋がってるのかは知らない。
0770デフォルトの名無しさん
垢版 |
2021/07/14(水) 19:25:42.08ID:VBWUb4q7
>>769
まあメモリーバリアも一種のオーバーヘッドと言えなくもないがそういう話でないことぐらいはわかりそうなもんだけどねw
で、排他が必要な例は見つかったの?
0771デフォルトの名無しさん
垢版 |
2021/07/14(水) 20:14:07.80ID:pCGEFvrX
>>770
ごめんよ。元から意味が分からなかったところ「オーバーヘッド」の意味が何か文字通りの意味じゃなかった
みたいだし、もうどういう話なのかさっぱりだわ。
767 の「オーバーヘッド」が何を指すのか、それと排他の要・不要との繋がりがわかるようだったら解説よろしく。

「排他が必要な例」と言われても、こっちとしては複数スレッドで生の int を読み書きするなら
常に排他が必要という認識なんで文字通り「排他が必要な例」なら無数にあるんだよね。
そういうのを挙げても謎理論で「不要だろ」とか「コレジャナイ」って言うだけで話は進まなさそう。

ここまでの流れを読めば >>755 をうっかり信じちゃう人もいないだろうし、もう放置でいいかなという気になってる。
0772デフォルトの名無しさん
垢版 |
2021/07/14(水) 20:22:20.00ID:cMMfM4oH
>>771
あえて指摘しなかったけどstd::atomicでは既定のメモリーオーダーがseq_cstであることを知らんのか?
自分で「あんたの言うオーバーヘッド」かかる書き方してオーバーヘッドかかるから排他ガーとか意味不明なんですけど?w
そもそもstd::atomicは必ず排他かかるわけでもないし人を嘘つき呼ばわりするならもう少し勉強した方が恥をかかなくて済むと思うよ
0773デフォルトの名無しさん
垢版 |
2021/07/14(水) 20:35:16.14ID:pCGEFvrX
>>772
ごめんそれは知ってるよ。でもそれを知ってる知識レベルの人が >755 のような主張をしてるとは思わなかったんだ。
あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。意味不明なのには同意する。
「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。
0774デフォルトの名無しさん
垢版 |
2021/07/14(水) 22:17:32.53ID:cMMfM4oH
>>773
> ごめんそれは知ってるよ。
えっ?
知ってて>>767ってそれこそ意味不明なんですけどw
結局何を言いたかったの?

> あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。
ああマジで日本語の理解力がないのね
(もちろん環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない
って話ね
念の為に言っておくけど>>764が言うようなハード上の排他制御は別の話ね

> 意味不明なのには同意する。
同意なんていらんから>>767を書いた意味を説明してよ

> 「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。
嘘だと言うなら根拠を示したほうが良いと思うよ
まあ示せないからグダグダ言うとか関係の無いメモリーオーダーの話とかにそらそうとしてるんだろうけど…
0775デフォルトの名無しさん
垢版 |
2021/07/14(水) 23:08:12.27ID:pCGEFvrX
>>774
「767を書いた意味」なら>>769で説明した。

「環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない」これは正しい。
でもそれは生の int でデータ競合を避けられる理由にはならない。
>>755 が嘘だという根拠は >>749 に挙げられた規定による。その条件
"at least one of which is not atomic" について、生の int へのアクセスは
"not atomic" に該当するから排他なしのアクセスでは未定義動作となりダメだと言っている。
規格文面の "atomic" は、規格が規定する C++ 抽象機械上の概念という認識。

対して 755 は、規格文面の "atomic" は各処理系でのメモリアクセスが実際にアトミックかどうかに依ると考えてそう。
残念ながら規格の文面で明確にその解釈を否定できないんだけど (https://cplusplus.github.io/LWG/issue2506)
少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や
現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。
0776デフォルトの名無しさん
垢版 |
2021/07/15(木) 05:14:12.89ID:oWQENBCT
>>775
> 「767を書いた意味」なら>>769で説明した。
あああのメモリーバリアと排他の区別もついてないアホ丸出しの説明ねw

> 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や
> 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。
百歩譲ってstd::atomic使えと言うのはいいけど、排他は必須じゃないだろ
0777デフォルトの名無しさん
垢版 |
2021/07/15(木) 06:52:54.80ID:DRiXJTFv
charはatomicなの?規格にどれがatomicだってあるの?
どれがatomicかなんて、CPU毎に違って当然だと思ってたわ
0779デフォルトの名無しさん
垢版 |
2021/07/15(木) 08:52:46.15ID:JIUDKEB4
>>776
うん。データ競合を回避するにあたって std::atomic を使えば排他は必須じゃなくなるよ。
ミューテックスを使うなどの排他(順序付け)でも回避できて、どっちかでもいいし両方でもいい。

>>755 が嘘だという点には異論なくなったみたいだね。よかったよかった。
0780デフォルトの名無しさん
垢版 |
2021/07/15(木) 09:20:51.24ID:oWQENBCT
>>775
排他は要らんケースがあると言うだけの話
ちなみに>>755では生intなんて一言も書いてないけどね
std::atomic<int>でも多くの環境では
> 単純なカウンタみたいなアトミックに読み書きできるような変数になるしな

まあ結局規格ガーって言うしかないレベルの低い規格厨が関係のないメモリーバリアーとか出してきて恥を晒しただけだったなw
0782デフォルトの名無しさん
垢版 |
2021/07/30(金) 19:50:56.40ID:VEABT8DF
C++ のバイナリ互換性についてお聞きしたいのですが。C++ のライブラリの中に以下のようなものが
あったとします。
class A { char *p1; };
class B { /* 略 */ };
class C { A a; B b; };

で、class A に新たな要素を追加して
class A { char *p1; char *p2; };
としてからライブラリを再ビルドし、以前のアプリのバイナリと混在させると、class C 内で a のサイズ
が変わる結果 b へのオフセットが変わりクラッシュするようです。

そこでふと思ったのですが、class A に最初から
class A { char *p1; char *p2; char *p3; char *p4; };
等と最初からある程度要素を確保しておき、必要に応じ上の方から使っていく、みたいなやり方は
アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)
0785まあ俺が言うのもなんだがw
垢版 |
2021/07/31(土) 22:17:00.01ID:m7lSxL/B
>>782
クラス定義が変わったのにそれを使う一部のコードを再ビルドしないってこと?

> そこでふと思ったのですが
> (中略)
> アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)
ありかも知れんが、なんでそんな前近代的なやり方しないといけないのかを考えたほうがいいと思う
0786デフォルトの名無しさん
垢版 |
2021/08/01(日) 03:13:38.20ID:/oR3uo3Y
C++ポケットリファレンス読んだ方いらっしゃいますか?
独習C++ 詳説 C++ 第2版の次に読もうかと思ってるのですが
0787デフォルトの名無しさん
垢版 |
2021/08/02(月) 10:21:16.05ID:WSe94FPO
近年の現場と言うか、
大手の製品開発や比較的規模の大きい案件とかで使われてるC++のバージョンってどの辺ですか?
未だにC++03ってわけないですよね?
0788デフォルトの名無しさん
垢版 |
2021/08/02(月) 10:29:43.05ID:WSe94FPO
>>786
C++プログラミング言語自体の研究という訳ではないのなら、
入門書以降は何か作る系の書籍のほうが良いのではないでしょうか?
物理シミュレーションだったりゲームだったり
人工知能だったりOSだったり様々あると思うので、
興味のある分野を極めていくのが良いと思います。
作りたいものがあるが何から手を付けて良いか分からないのなら
設計理論系の書籍等も良いと思います。
OOPを極めたいという考えであるならデザインパターン等も良いと思います。
0789デフォルトの名無しさん
垢版 |
2021/08/02(月) 10:37:42.71ID:dQnVwxld
どの道、

class C { A* a; };
と、ポインターに変えても、

class A { char *p1; char *p2; };
と、新しいメンバーp2 には、C を再コンパイルしないとアクセスできない
0790デフォルトの名無しさん
垢版 |
2021/08/02(月) 11:23:37.60ID:lIzbW3kq
class A;
class C { A* a; }; だけで完結してるなら まぁ問題をおこしにくそうではあるけど
そこまでして C に関わるコンパイルを止めたい理由がわからん
0791デフォルトの名無しさん
垢版 |
2021/08/03(火) 10:56:52.82ID:Ljn/RAt1
>>787
最低でも C++11
それでも古いと思う
0792デフォルトの名無しさん
垢版 |
2021/08/09(月) 22:11:24.65ID:PKIz3Xw3
C++って競プロ以外に何に向いてるの?なんで競プロに使われるの?
0793はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/10(火) 01:15:34.32ID:7+xjomdk
>>792
実行速度が速いことが多いから速度が評価の一部である以上は有利になる。
(速ければ速いほど良いというわけではないが、上限が設定されているのが普通)
0794デフォルトの名無しさん
垢版 |
2021/08/11(水) 12:58:25.34ID:MU7UJMps
std::map<std::pair<const char *, int> > hoge;
のように const char * を key とするとき
hoge.insert(std::make_pair("A", 41));
hoge.insert(std::make_pair("C", 43));
hoge.insert(std::make_pair("B", 42));
と追加すると
hoge["C"] で 43 が得られると期待できますが
このとき make_pair したときの "C" と hoge["C"] の "C" のポインタは値が違ってても
同一 key とみなされますか?(ポインタの値ではなく文字の中身の一致を見てくれますか?)
あるいは char * だとまた変わりますか?
0795デフォルトの名無しさん
垢版 |
2021/08/11(水) 13:12:29.99ID:Z6PNV5dP
ポインターは先頭アドレス

2つのオブジェクトの内容が同じでも、
別々のオブジェクトなら、ポインターも異なる

ポインターが同じとは、同一のオブジェクトを指している場合だけ
0796デフォルトの名無しさん
垢版 |
2021/08/11(水) 13:28:06.66ID:MU7UJMps
追伸
一つの fuga.cpp 内で
二か所以上で "C" が使用されていたとき
同じアドレスにしてくれる機能もあるみたいですが
fuga.cpp と hage.cpp みたいに別のソースで
それぞれ "C" を使ってたりすると
勝手に同じアドレスにしてくれたりはないみたいで
いろいろトラブルのもとになりそうです
(どっちみち変数になってると手も足も出ませんし)
key は std::string にしておくか
あるいは
std::hash<>

std::equal_to<>
を定義して自分で比較する方が安全な模様
0797デフォルトの名無しさん
垢版 |
2021/08/11(水) 13:42:41.83ID:EWMgwFeS
>>796
「あるいは」以降ってunordered_mapの話じゃないかい
mapならstd::less<>を定義する……というかデフォルトのstd::less<>が使われないようにユーザ定義比較関数をコンストラクタで渡す

俺もこういう場合はキーにstd::string使うからいいけども
0798デフォルトの名無しさん
垢版 |
2021/08/11(水) 14:06:43.19ID:MU7UJMps
今回の問題は
>一つの fuga.cpp 内で二か所以上で "C" が使用されていたとき同じアドレスにしてくれる機能もあるみたいですが
>fuga.cpp と hage.cpp みたいに別のソースでそれぞれ "C" を使ってたりすると勝手に同じアドレスにしてくれたりはないみたいで
これでした
stringにしたら解決です
ほんとうにありがとうございました
0802はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/13(金) 00:46:25.67ID:BE9FMbqU
>>801
トークンとしての名前は無いと思う。
演算子としての名前なら右シフト演算子とか、
iostream 的な用途の場合は抽出演算子とも言う。
0805デフォルトの名無しさん
垢版 |
2021/08/21(土) 20:09:51.28ID:7GAoG1Iq
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
0806デフォルトの名無しさん
垢版 |
2021/08/22(日) 10:20:28.75ID:0Cz6ueFz
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
0807デフォルトの名無しさん
垢版 |
2021/08/22(日) 10:29:54.67ID:0Cz6ueFz
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴 バージョン1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html

第二プログラミング言語として Rust はオススメしません Nim をやるのです
https://wolfbash.hateblo.jp/entry/2017/07/30/193412


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
0809デフォルトの名無しさん
垢版 |
2021/08/22(日) 13:21:27.56ID:cx6/dnxW
unordered_map で erase(key) を実行した場合
要素のデストラクタは呼ばれるのでしょうか?
必ず自分で呼ばないとだめ?
あるいは勝手に呼んでくれるオプションとかある?
0811デフォルトの名無しさん
垢版 |
2021/08/22(日) 13:51:18.62ID:cx6/dnxW
つまり
unordered_map<hoge, fuga *>
みたいなときって
fuga *f があるとすると
delete f されるっていう認識で OK?
0812デフォルトの名無しさん
垢版 |
2021/08/22(日) 13:56:28.38ID:M38WAZ3o
ポインタ型のデストラクタは基本的に何もしない。
デストラクタで破棄したいならunique_ptrなどスマポを使う。
0817ハノン ◆QZaw55cn4c
垢版 |
2021/08/22(日) 22:10:22.39
>>816
しかし、MyStr のコンストラクタの引数が std::string とか、もう何やっているのかわからなくなる‥‥
0819ハノン ◆QZaw55cn4c
垢版 |
2021/08/22(日) 22:23:59.15
>>818
そういう意味でしたか、const に対する注意力がまだ足りないのは私の課題ですね
0820デフォルトの名無しさん
垢版 |
2021/08/23(月) 11:12:35.74ID:PZenUrJ/
linuxのg++8.3でstd::stringのメンバ関数の
insert(const_iterator, char)を使うとコンパイルが通らないのですが、バグでしょうか?
-std=gnu++1zつけてます。
0823デフォルトの名無しさん
垢版 |
2021/08/24(火) 09:47:42.50ID:HAU1OEWW
>>821
こんな感じです。
g++のバージョンは8.3で-std=gnu++1z でコンパイルしています。

-- ソースファイル
#include <string>
int main(int argc, char** argv) {
std::string str="abcd";
std::string::const_iterator it = str.cend();
str.insert(it, 'a');
return 0;
}

-- エラーメッセージ
testinsert.cpp: In function ‘int main(int, char**)’:
testinsert.cpp:6:21: error: no matching function for call to ‘std::basic_string<char>::insert(std::basic_string<char>::const_iterator&, char)’
str.insert(it, 'a');
^
In file included from /opt/rh/devtoolset-8/root/usr/include/c++/8/string:52,
from testinsert.cpp:1:
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:4419:7: note: candidate: ‘void std::basic_string<_CharT, _Traits, _Alloc>::insert(std::basic_string<_CharT, _Traits, _Alloc>::iterator, std::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; typename _Alloc::rebind<_CharT>::other::pointer = char*; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’
insert(iterator __p, size_type __n, _CharT __c)
^~~~~~
0824デフォルトの名無しさん
垢版 |
2021/08/24(火) 12:50:48.93ID:MkJE9y3A
>>823
コンパイルできないのはバグだが終端イテレータの扱いについては
変遷があって有効なイテレータと見做されない時期もあった。
最後に文字をくっつけるのであれば push_back か append を使ったほうが無難。
0825デフォルトの名無しさん
垢版 |
2021/08/24(火) 14:09:58.40ID:+43LntiD
>>824
> 終端イテレータの扱いについては
> 変遷があって有効なイテレータと見做されない時期もあった。
要出典
0826デフォルトの名無しさん
垢版 |
2021/08/25(水) 14:20:52.77ID:cqt8yWy6
>>824
アドバイスありがとうございます。
やっぱり規格的におかしいと思って調べてみたところコンパイラがc++11に対応していないだけでした。
ありがとうございました
0828デフォルトの名無しさん
垢版 |
2021/08/25(水) 17:29:41.65ID:+rMtuhpY
const_iteratorだとダメでiteratorだと通るぽい

↓のコード、手持ちのg++ (GCC) 7.3.1で-std=gnu++1zでコンパイル、実行できたが
https://cpprefjp.github.io/reference/string/basic_string/insert.html
「(6) 指定したイテレータが指す要素の前に、文字を挿入する」の
s.insert(s.begin(), 'b');

s.insert(s.cbegin(), 'b');
にするとコンパイルエラーになる
0829デフォルトの名無しさん
垢版 |
2021/08/25(水) 19:02:32.36ID:s4ke0ECA
C++を勉強しているんだけど難しすぎる。
目標は研究に使う数値計算ライブラリを作ることでそのために、
オブジェクト指向とテンプレートプログラミングとSTLを勉強しているんだけど量が多すぎて発狂しそう。
本当にC++を仕事で使っている人はこの量の仕様を覚えて使いこなしてるのか・・・
0830デフォルトの名無しさん
垢版 |
2021/08/25(水) 19:16:48.44ID:I0Do+yHA
基本的に自分がよく使う範囲だけ覚えて
必要があればそれ以外の範囲を調べて使う
膨大なようで、所詮言語だから使ってれば覚える
0831デフォルトの名無しさん
垢版 |
2021/08/25(水) 19:55:14.87ID:s4bO6YKI
生半可に上辺だけ触って判った気になって
コード描けますとかいうやつと仕事したくないわ
0832デフォルトの名無しさん
垢版 |
2021/08/25(水) 21:53:18.83ID:gHVAu5z0
>>827
>>828
言葉足らずですみません。
CentOS7のdevtoolのg++はABI互換性の関係から古いlibstdc++としかリンクできないようにされていて
つまるところC++11の機能はほとんど使えなくなっている、ということでした。
本来ver8.3ならC++17にも対応しているはずなのにほとんど意味ないわけです…。
だったら-std=c++11とかつけたときに警告してくれとでも思わないわけもないですが。
0833デフォルトの名無しさん
垢版 |
2021/08/25(水) 23:11:46.20ID:3/bOIe3o
>>829
もしEigenとかみたいなメタプログラミング使った数値計算ライブラリを考えてるならやめとけ
無駄に開発期間が数倍から10倍程度に膨れ上がるだけ

とりあえずテンプレートとか使わずに(あるいはメタじゃないレベルにおさえて)普通に書いたら?
0834デフォルトの名無しさん
垢版 |
2021/08/26(木) 06:13:02.19ID:H9rsGF96
>>829
仕事をすると言っても、他の人がこさえたライブラリを使う場合はそこまでは求められんだろう。
反対に根っこ部分のライブラリとか、チーム内でのルールに関わると知識と経験がいるんじゃないかな?

よく理解できている方法でしっかり組み立てられるようになってから、徐々に細かい話に手を出したらいいと思う。
他の方法は解ってるし悪いわけでもないが、記述が気に入らないので延々とtemplate弄り倒す沼もあるから注意してね。
0835デフォルトの名無しさん
垢版 |
2021/08/26(木) 09:00:20.61ID:b62pz5ME
数値計算に使うのならまずはSTL抑えておくだけでいいんじゃね?
C++言語自体の習得より、GPGPU、分散処理、SIMD、メモリ管理とかのノウハウ習得にまずは時間を割り当てるほうがよいと思う
0836デフォルトの名無しさん
垢版 |
2021/08/26(木) 09:28:17.30ID:eI1EN0aq
物理の計算とか、いろんな数学的な量が出てくるけど、そういうのの演算がすべて
プログラム上では同じ形で書ければかっこいいなあと思ったり。
例えば、(スカラー)積なら、オペランドが実数、虚数、ベクトル、行列、テンソル....等々どれでも
乗算オペレーターで扱えるとか。
「普通」の数値ライブラリだとオペランド毎に積を扱う関数がうんざりするほどあってそれを適切に
選ばないといけなかったりするので。
0837デフォルトの名無しさん
垢版 |
2021/08/26(木) 12:08:14.60ID:p2DPtxMk
829です。
皆さんいろいろとアドバイスありがとうございます。

自分が作ろうと思っているのは、Eigenを用いた金融系の数値計算ライブラリなのですが、テンプレートを用いたらいろいろな型を代入できて便利かな〜くらいの感じで作ろうとしていました。

templateの使い方自体は少し勉強してみましたが、メタプログラミングの概念自体もよくわかっていないので、ひとまずtemplateは後回しにしようかと思います。

オブジェクト指向で書くかどうかは実際にコードを書いてみてから考えてみたいと思います。
0838デフォルトの名無しさん
垢版 |
2021/08/26(木) 16:35:43.38ID:9wBQWoih
Eigen利用するだけか
それならまぁ無駄に時間かかるということも無いと思う(変なとこに拘らなければ
0839デフォルトの名無しさん
垢版 |
2021/08/26(木) 16:43:57.74ID:WPRv8+9f
>>836
コンピューターというか主要な高級プログラミング言語が出来て50年以上経つが
だれもそういうことをやってないのは何故だと思う?
0840デフォルトの名無しさん
垢版 |
2021/08/26(木) 16:45:12.60ID:WPRv8+9f
ちなみに SciPy とか SymPy は良く出来てる方
0841デフォルトの名無しさん
垢版 |
2021/08/27(金) 14:40:33.39ID:RrJjtAzF
>>839
template使ったらもう型にとらわれなくていいんじゃね?はC++学習者の必ず通る道やからしゃーない
0842デフォルトの名無しさん
垢版 |
2021/08/27(金) 15:05:57.44ID:nK81wxcE
で、結局なんでできないの?

C APIのほうが汎用性が高いから?
行列やテンソルは乗算方法が複数あるから?
結果の表現形式も有理数とか複数あるから?
結果をエレベーションする必要があるから?
0844デフォルトの名無しさん
垢版 |
2021/08/27(金) 17:53:48.43ID:nK81wxcE
>>843
Cで開発するときに、常にヘッダファイルに書いておく必要があるかどうかって話なら、将来c++から呼び出す可能性があるなら書いておけば?
最悪なくてもインクルードする側でどうにかなる
0845デフォルトの名無しさん
垢版 |
2021/08/27(金) 19:22:59.35ID:ghUXxVcH
>>843
32bitとはいえマイコンで-std=gnu++17とか指定するのは微妙な背徳感を感じてしまうチキンだが、
Cのライブラリも一緒に使うから、普通に使ってるな。基本ヘッダファイルでほとんど事足りるんだけど、
weak指定のCの割り込みハンドラとか再定義するときは混乱しないように明示的にextern "C"付けてる。
0846デフォルトの名無しさん
垢版 |
2021/08/29(日) 01:50:34.33ID:TPHdi4yb
>>841
operator置き換えまくりとかな
0848デフォルトの名無しさん
垢版 |
2021/08/30(月) 14:54:09.69ID:a7szkEqk
C++17は甘え
0851デフォルトの名無しさん
垢版 |
2021/11/24(水) 18:53:15.36ID:ONXwk6fD
void *q = (void*)p;
void *r = reinterpert_cast<void *>(p);
void *s = static_cast<void *>(p);
どっちが良い?
0853デフォルトの名無しさん
垢版 |
2021/11/25(木) 14:45:18.21ID:Ts2h3uwp
>>838
Eigen の MatrixXtype と Matrix<type, Dynamic, Dynamic> が便利なのは判ったが
自分でそいつらを引数に持つテンプレート関数書こうとして
template <typename T, int R, int C>
void func(Matrix<T, R, C>&m){ ... }
で定義したら
a が Matrix3d a; とか RC 固定されてるときは func(a) で問題無いが
a が Matrix<type, Dynamic, Dynamic> a(3, 3); だと
実際に func(a) とかで呼ばれるときに
Matrix<type, -1, -1>
で呼ばれてて Row 数も Column 数も判らないので
結局呼ぶときに
func<type, 3, 3>(a)
みたいに確定して呼ぶことになるんだが
そういうもの?
0854デフォルトの名無しさん
垢版 |
2021/11/26(金) 19:09:15.51ID:ZkEvf+9l
Eigen使ったことないけど、それ多分動的なサイズ指定だよね
コンパイル時にサイズ分かってない奴じゃね
0855デフォルトの名無しさん
垢版 |
2021/11/27(土) 15:14:48.94ID:dxTMcmeT
fstream で open するオプションで
ios:in ios:out ios:binary とかと
ios_base:in ios_base:out ios_base:binary とかと
何が違うのでしょう?
0857デフォルトの名無しさん
垢版 |
2021/12/06(月) 10:19:18.78ID:aQJDsz9k
一般的にプリプロセッサのビットシフトに制限てありますか?
#define HOGE (1<<27)
だとダメで
#define HOGE (0x8000000)
だとOKだとかありますかね?
0858デフォルトの名無しさん
垢版 |
2021/12/06(月) 10:50:06.54ID:7ju/18KI
>>857
プリプロセッサはその define値をその記述通りの文字列(というか文)としか見てなくて、単にその定義名の所へはめ込むだけじゃない?
あとは嵌め込まれた後の文脈でコンパイラが解釈するんじゃないかな。
0860はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/06(月) 13:31:07.92ID:Fu08U5Ef
>>857
定義での制限はないが、マクロの制御定数式として表れる場合、
つまり

#if HOGE > 0

みたいな前処理指令があった場合に全ての符号付整数型が intmax_t 、
全ての符号無し整数型が uintmax_t と同じ表現を持つというルールがあるので
通常の式とは解釈が違う。
(大抵の場合に intmax_t は long long int と同じ大きさだと思う。)

つまり普通の式としてならオーバーフローする場合でもプリプロセッサではオーバーフローしないこともあるので、
制限としてはむしろ緩い。

https://wandbox.org/permlink/Ns4Qt2xG3wj1WVBH
0861デフォルトの名無しさん
垢版 |
2021/12/08(水) 17:56:15.71ID:ouf8qdPn
std::listのsortを使ってるのですが
同値だった場合の順序が維持されず困ってます。
何かよい手はないですか?
比較関数を渡してるのですがその中で何とかならないでしょうか?
0862はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/08(水) 18:22:21.80ID:cTje1973
>>861
言語仕様上は std::list::sort は安定ソートなので
そうなってないなら標準ライブラリの実装が間違っているか使い方が間違っている。
0864デフォルトの名無しさん
垢版 |
2021/12/09(木) 05:48:07.42ID:4Thv0Igk
純粋仮想関数の通知メソッドの中から他所のアドレスを知りたい時C++だとどう書くのが一般的ですか?
0866デフォルトの名無しさん
垢版 |
2021/12/14(火) 05:24:10.27ID:pHnakqcn
私の同僚のプログラマがC++で、あるソフトのプラグインをdll形式で作成しており
そのdllファイルは6割くらいの環境では問題なく動作しています。

しかし、ユーザーの環境次第で動かないことがあり
dllをインストールした状態でソフトウェアを起動しようとすると、ソフトウェア自体が起動しないというバグを抱えており
この問題の解決方法は数か月以上、見つかっていません。

そのdllはWindowsのみで動作するものであり、MacやLinuxには対応していません。
Windowsの何らかの設定に関係するバグなのでしょうか…?

バグの原因が一切分からず、彼の作業が進まないので私の作業も進まず、困っています。
私自身はC++でそのソフトのプラグインを作成したこともないですし、彼に何のアドバイスもできないので
このスレッドのお力をお借りしたいです。

dllを作成する際にユーザー環境でデバッグしてログを取得する方法など
何でも良いのでアドバイスがあったら教えてください。
エスパーを求めています。
0868デフォルトの名無しさん
垢版 |
2021/12/14(火) 06:41:07.66ID:9Wj0xfjq
64bitと32bitの違い・・・ではないか
それかintel/amdどちらかにしかない命令使ってるとか、何か依存する部分があるとか??
0869デフォルトの名無しさん
垢版 |
2021/12/14(火) 08:10:32.07ID:o0cf+I8x
まずはエラーメッセージをだな

でもランタイムライブラリのオプションがMTじゃなくてMDになってると予想
0870デフォルトの名無しさん
垢版 |
2021/12/14(火) 08:23:33.51ID:T7uEaOwT
>>866
例外で落ちたりもせず、ただ起動しないの?
起動しない環境の特徴も分からない?
なにかしらのセキュリティソフトが入ってるとか。
0872デフォルトの名無しさん
垢版 |
2021/12/14(火) 11:09:39.54ID:RuQEsKMi
そのプラグイン dll が vcのランタイムを要求してて 実行環境にvcのランタイムが入っていない

プラグインdllの性質上 ソフトが自前で LoadLibary するが、そこで失敗する
この際何が主因なのかわからないまま

静的なリンクなら ○○が見つかりませんdialog がでてすぐわかる

プラグインdll を Dependency Walker なりで そのDLLが必要としてる DLL を確認してみたら?
0873デフォルトの名無しさん
垢版 |
2021/12/14(火) 11:37:46.60ID:zJGtuVBB
>>872
ソフトの仕様や実装次第だけど、プラグイン読み込みに失敗して起動しないアプリもちょっと手抜き過ぎだよね
0874デフォルトの名無しさん
垢版 |
2021/12/14(火) 11:41:07.01ID:RuQEsKMi
>>873
わかったとしても、「モジュール <プラグイン>.dll が見つからない」 としか書きようがなくてややこしい
※ 本当に見当たらないのは <プラグイン>.dll がさらにロードしようとしてる MSVCR○○.dll とかだから
0876デフォルトの名無しさん
垢版 |
2021/12/18(土) 10:46:11.74ID:RFbyER+p
グローバル変数かstatic変数使ってないか?
昔他所のモジュールと変数の書き換え合戦が起きて正常に動作しない事があった
0877デフォルトの名無しさん
垢版 |
2021/12/19(日) 15:15:53.34ID:bLFtEsOT
>>876
static なら他所と競合しないんじゃない?
あとグローバル変数が仮に extern だったとしても、意図的にエクスポートしてなければ他所の DLL と競合はしないような。
0878デフォルトの名無しさん
垢版 |
2021/12/19(日) 17:40:07.63ID:150MzqYw
拡張子dllでも独自の実装してるホストプログラムあるからなぁ…
それこそホストの開発者に聞くしかない
0879デフォルトの名無しさん
垢版 |
2021/12/19(日) 23:17:52.32ID:mIjShW6/
自前でできることは

1) DllMain の DLL_PROCESS_ATTACH、 DLL_PROCESS_DETACH に
printf を仕込んで 最低限 load がなされてるかを確認

2) load されてるのなら
 最初に呼ばれるであろうexportしてる関数にがんがん printf を仕込んで 何処で死んでるかを確認
0880デフォルトの名無しさん
垢版 |
2021/12/24(金) 03:18:25.98ID:pnvTuQZD
規格厨ほど仕事ができなくね
どうでもいいようなことにこだわってないで
さっさと仕事終わらせろよ
0882デフォルトの名無しさん
垢版 |
2022/01/17(月) 19:13:47.29ID:Xn5FtFWo
メンバ関数へのポインタで質問なのですが
class MyClass {
public:
  void (MyClass::*p)();
  void func();
};
int main() {
  MyClass obj;

このようなクラスがあったとして
main関数でobjのメンバの関数ポインタpへfuncのアドレスを入れる書き方と
pを使ってfuncを呼ぶ書き方を教えて下さい
0884デフォルトの名無しさん
垢版 |
2022/01/17(月) 20:40:50.75ID:iHDNpEw/
C++でオブジェクト指向を学びたいなと思ってるのですが、みなさんはどのように学びましたか?
既存のゲームの機能追加などをサークルでやっていて、C++自体には慣れてきて次のステップに進みたいと思いました.
0885デフォルトの名無しさん
垢版 |
2022/01/17(月) 20:47:51.30ID:h5bglXe3
ただただ自分でクラス設計考えて実際に書いて、さらにそれをあちこちで使ってみるだけ
実際に書く、利用する、をサボると机上の空論しか語れない頭でっかちになる
0886デフォルトの名無しさん
垢版 |
2022/01/17(月) 20:50:24.57ID:Xn5FtFWo
>>883
ありがとうございます
0887デフォルトの名無しさん
垢版 |
2022/01/26(水) 21:23:31.72ID:HoA8G4VO
初心者です。
自作クラスをVector型に押し込めようとしたのですが、そこで発生したエラーの解決方法を2時間くらい調べたのですが分かりませんでした。
class myClass
{
myClass(int A){num = A;}
void show() {
cout << "" << "="<<num<<endl;}
~myClass(){}
int num;
};
int main() {
myClass a1(1), a2(2), a3(3), a4(4), a5(5);
vector<myClass> myClassList;
myClassList.push_back(a1);
//中略
//削除するオブジェのインデックス番号を記録
vector<int> delList;
for (int i = 0; i < myClassList.size(); ++i)
{
if (myClassList[i].num == 2 || myClassList[i].num == 4) {
cout << "i" << "=" << i << endl;
delList.push_back(i);
}
}
cout << "削除開始" << endl;
for (int i = 0; i < delList.size(); ++i)
{
std::erase(myClassList, delList[i]);//コイツでエラー
}
return 0;
}
二項演算子 '==': 'myClass' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。
0889デフォルトの名無しさん
垢版 |
2022/01/26(水) 22:43:54.69ID:HoA8G4VO
>>888
オペレータに何を定義すれば良いか分かりません
0890蟻人間 ◆T6xkBnTXz7B0
垢版 |
2022/01/26(水) 22:53:20.32ID:bGQQ0+uk
>>889
eraseの仕様を見れば内部で要素を比較していることがわかる。
そこでmyClassとintの比較を定義する必要がある。
bool operator==(int n) const
{
return n == num;
}
0891蟻人間 ◆T6xkBnTXz7B0
垢版 |
2022/01/26(水) 22:55:52.03ID:bGQQ0+uk
あるいは
friend bool operator==(const myClass& my, int n)
{
return my.num == n;
}
0892デフォルトの名無しさん
垢版 |
2022/01/26(水) 23:02:17.85ID:HoA8G4VO
蟻人間さん、ご丁寧に教えてくださり、本当にありがとうございます。
無事問題が解決しました
0894デフォルトの名無しさん
垢版 |
2022/01/28(金) 15:24:34.96ID:HENDwGdD
msvcのコンパイルが遅いのとメモリ大量に使うのとで大変辛いのですが、コンパイルだけ別の端末で出来たりしませんか?
0897はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/28(金) 16:23:28.54ID:hT9TavA0
>>896
std::variant (C++17 以降) のこと?
それとも COM で使う VARIANT のこと?
それとも特定の実装 (または規約) ではなく動的型一般のこと?
0899はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/28(金) 17:44:30.90ID:hT9TavA0
何がわからないの?
基本的な数値型や配列以外の場合にどう文字列化すればいいかわからないってこと?
0901はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/28(金) 23:10:21.87ID:hT9TavA0
>>900
VARIANT は基本的な型だけでなく COM のオブジェクト (を指すポインタ) を含むこともある。
COM におけるオブジェクトは「少なくとも IUnknown インターフェイスは実装されている」という保証 (規約) があるだけで、
それをどのように表示できるのかは汎用的には決めようがない。

基本的な型だけでも簡易的に文字列化するものがあるとちょっとしたデバッグ用途などでありがたいというのはわからんでもないけど。
0903はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/28(金) 23:39:29.92ID:hT9TavA0
ログ用途だとアドレスだけでは意味が薄そうに思うけど……
(実行のたびに値は変わるだろうし、検証に使えない。)
少なくとも整数などではないという区別が出来れば十分ということはあり得るかな。

タイプライブラリがちゃんと用意されているなら型名などが取得できる場合もあるので可能ならそういう情報も欲しいけど、
いずれにしても「文字列にする」という要求はユースケースが多用すぎて標準的な機能として決め打ちはしづらい。
0904デフォルトの名無しさん
垢版 |
2022/01/28(金) 23:47:34.07ID:Bry4gZCu
>>903
Aのルーチンで使ってるオブジェクトとBのルーチンで使ってるオブジェクトが同じかどうかはわかる
それ以上のことを知りたいなら個別に表示ルーチンを組むしかない
0905デフォルトの名無しさん
垢版 |
2022/01/29(土) 16:18:19.62ID:F6gMvu/h
ガチガチの初心者です

#include<iostream>

double func(double x){
if (x>0) return x;
else return 0;
}

double dfunc(double x){
if (x>0) return 1;
else return 0;
}

int main(){
for (double x=-1.0; x<1; x+=0.1){
std::cout << std::scientific;
std::cout << x << ",";
std::cout << func(x) << ",";
std::cout << dfunc(x) << std::endl;
}
return 0;
}

を分割コンパイルするためにmain.cpp、func.cpp、func.fにソース分割したいのですがどのようにすればよいでしょうか
0907デフォルトの名無しさん
垢版 |
2022/01/29(土) 16:44:31.98ID:F6gMvu/h
>>906
すみません、書き方が悪かったです。分割の仕方?切り貼りして保存する3つのファイルの中身の書き方が知りたいです。
0912デフォルトの名無しさん
垢版 |
2022/01/29(土) 17:27:47.66ID:CzloZbS7
>>905
どんな入門書にも書いてあるようなことを質問するのは嫌がられる。
学ぶ気がなく代わりにやらせようとしているように見えるので。
そんで関連する事柄が多いので質問が具体的でないと単純に情報量的にとてもここには書けない。

細々としたところで引っかかるのは当然あることだしそういうのは喜んで回答するから
何がわからずに引っかかってるのかもうちょっと具体的にして欲しい。

わからないことをまとめられないなら
とりあえず自分なりにやってみたらどうなったのか見せれば、
何がわかってないかこっちで推測できる可能性がある。
0913デフォルトの名無しさん
垢版 |
2022/02/02(水) 00:03:59.30ID:9peRckoc
if (fp = fopen("file.txt", "W+"))

って書くと↓が出るんだけど?

warning: suggest parentheses around assignment used as truth value
0915蟻人間 ◆T6xkBnTXz7B0
垢版 |
2022/02/02(水) 00:57:41.77ID:gV8dH/Sr
if文では、代入と比較の混乱が深刻で、警告を出さなければいけなかったと聞いてるが。
0918はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/02(水) 11:07:29.08ID:5i7w7V2o
>>913
強めの警告オプションを付けてたら言語仕様上の問題がないものでも良くない作法に対しては警告が出ることはある。
a && b || c
とかいう式でも (人間が) 優先度を勘違いしやすいから括弧を付けることを勧められるし、
インデントの付け方がずれてる場合とかも警告は出る。

余計なお世話だと思うなら大抵はオプションで抑制できるよ。
0919デフォルトの名無しさん
垢版 |
2022/02/02(水) 16:52:47.21ID:Os1L/Ifx
括弧でくくっただけじゃ文句いわれたこともあるので二重否定しとく
if (!!(fp = fopen("file.txt", "W+")))
0920はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/02(水) 17:18:37.99ID:5i7w7V2o
C++17 以降では if 文の括弧の中に初期化を書けるようになった。
初期化の内容と判断に使う式をセミコロンで区切って書ける。

if (fp = fopen("file.txt", "W+"); fp)

このとき変数の宣言を書いてもよく、

if (FILE* fp = fopen("file.txt", "W+"); fp)

というようにすると、この変数のスコープを if 文の内側だけに制限できるので便利。
便利だから C にも導入して欲しい。
0921デフォルトの名無しさん
垢版 |
2022/02/02(水) 17:39:51.00ID:il4bRKm2
if括弧中で初期化なんて前からやってたことだし
今じゃ代入も初期化になったのか
0922はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/02(水) 18:18:35.55ID:5i7w7V2o
>>921
以前は「条件が宣言でもよい」だったところに
あらたに「初期化文と条件のふたつを書ける」「初期化文は式、もしくは単純宣言である」というルールが追加された形。
0923デフォルトの名無しさん
垢版 |
2022/02/08(火) 08:24:13.76ID:vXrgdSa9
デストラクタだけ書いてあってムーブできないクラスをメンバ変数にすると色んな所でコンパイルエラーが出て困りました
値ではなくポインタで持つか、自分のクラスででムーブコンストラクタを書いたらとりあえずはエラーが出なくなったのですが、
こういうクラスは一体どう使われるのを想定して実装したんでしょうか?
0924デフォルトの名無しさん
垢版 |
2022/02/08(火) 18:34:16.03ID:SQWxHGFm
基底クラスからたくさん派生クラスを作りました。
基底クラスの1つのvirtualメソッドを、各派生クラスでoverrideしました。
基底クラスを指す箱から、派生クラスのメソッドを呼ぶ方法を教えてください。

多少スタイルを変えても実現する方法があればお願いします。
ただし、場合分けやインデックスで対応するのは(派生クラスが増えたときに修正箇所が分散するので)厳しいです。
コンパイラは最近のvisual studioのC++を使っています。

struct Basic{
 virtual void work(){cout<<"Basic";}
};
struct B1:public Basic{
 void work()override{cout<<"B1";}
}b1;
struct B30:public Basic{
 void work()override{cout<<"B30";}
}b30;

void main(){
 Basic basic_array[9];
 basic_array[0]=b30;
 basic_array[0].work();//基底クラスのメソッドが呼ばれて Basic と表示されてしまう。
}
0925デフォルトの名無しさん
垢版 |
2022/02/08(火) 19:25:55.42ID:WarIH046
Basicの配列にはBasicのオブジェクトしか入らないから、b30もコピーしたときにBasicになってしまったからだよ

Basic*の配列にするかvector<uniq_ptr<Basic>>を使えば
0926デフォルトの名無しさん
垢版 |
2022/02/08(火) 19:56:37.56ID:SQWxHGFm
>>925
ポリモーフィズム成功しました。基底クラスのポインタを使って解決しました。
また、基底クラスの変数にコピーすると派生クラス独自のメンバが全て無くなることが理解できました。

ありがとうございました。

void main(){
 Basic*basic_array[9];
 basic_array[0]=&b30;
 basic_array[0]->work();//B30のメソッドが呼ばれた。
}
0927デフォルトの名無しさん
垢版 |
2022/02/11(金) 14:30:39.44ID:/nAwqwYv
>>925
> vector<uniq_ptr<Basic>>を使え

動的にインスタンスを作り始めた途端に、コンテナとスマートポインタが必要になりました。
見事すぎる回答に改めて感謝します。
0928デフォルトの名無しさん
垢版 |
2022/02/18(金) 10:16:19.82ID:+V9f8lU9
例外で飛んじゃうと後始末ができなくてメモリリークしちゃうんだけど

クラスでラップしてデストラクタっていちいちやる感じ?
0929デフォルトの名無しさん
垢版 |
2022/02/18(金) 10:30:02.61ID:+V9f8lU9
try~catchで囲えば処理できるけど
すべての例外が出る可能性のあるコード全部try~catchしちゃっていい?
0930デフォルトの名無しさん
垢版 |
2022/02/18(金) 11:08:23.85ID:v7utSHD9
>>928
「いちいちやる」っていうか、同種のリソースを扱うときはいつも必要になる対応だからデストラクタでいいんだよ。
大抵はunique_ptrとか標準にあるもので済むし。
0932デフォルトの名無しさん
垢版 |
2022/02/18(金) 12:17:15.52ID:+V9f8lU9
>>931
今回のとこちょっとなんだけどなぁ
例外発生するとこ全部でやらなあかんやんコレ
クソ杉ちゃう?
0934デフォルトの名無しさん
垢版 |
2022/02/18(金) 12:27:42.18ID:+V9f8lU9
えー、わからんのー?

つまり例外が発生しうるとこすべてで
尻切れトンボされる可能性があって
以前のようにmalloc-freeのコードが混じってるとそいつらは問答無用でメモリリークしちゃうって話よ
0936はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/18(金) 12:48:02.74ID:fowo2HBL
>>932
対処する必要があるところで catch して解放するだけだろう。
それがどうして出来ないんだ?
0937デフォルトの名無しさん
垢版 |
2022/02/18(金) 13:19:45.68ID:+V9f8lU9
まあ、それよ
そういう対応が必要になるって話よ
追加するやつ全部trycatchで包むか
mallocfreeをクラスで包むか
入れたのは20行程度なのにルーチンの流れまで変える必要があったりなかったりで(# ゚Д゚) イラッ!
0938デフォルトの名無しさん
垢版 |
2022/02/18(金) 13:39:34.12ID:v7utSHD9
>>934
malloc-freeしてる既存コードに例外発生する処理を混ぜるなんて特殊状況ならしょうがない。
面倒な状況なのはわかる。あきらめて心を殺してtry catchするか小さいRAII用クラスを作るか。
あるいはmalloc-freeしてるところも標準コンテナやunique_ptrに置き換えていけばすっきりするかもね。
0940デフォルトの名無しさん
垢版 |
2022/02/19(土) 10:43:55.59ID:MFjncly/
メモリ解放以外にデストラクタでやることはあるわけだしな
集約して定義しとけよという
0944デフォルトの名無しさん
垢版 |
2022/03/10(木) 00:03:44.70ID:IfzvyEOT
日付のフォーマットなんて都度調べるもんな
覚えてる変なやつもいるんだろうね
0946デフォルトの名無しさん
垢版 |
2022/03/10(木) 07:16:50.83ID:ZtFzrJEF
>>945
これやったら秒とミリ秒を別で取得してるので
秒が59.999(ミリ秒はイメージ)のときに
ミリ秒は00.002ってなるときに前回の値が59.857ぐらいだったとすると

59.002ってなってしまうので逆転が起きたときは前回の値と比較して
逆転してたらミリ秒を強制的に999にするとかダサイことやってるんですけど
マジでこんな方法しかないでしょうか?
0949デフォルトの名無しさん
垢版 |
2022/03/10(木) 18:51:28.19ID:xl0leRXC
>>947
timespecで取得できるのがミリ秒だけだと思ってました
自分のプログラムでtime_tで取得できる関数と複合してたのが原因でした
0956デフォルトの名無しさん
垢版 |
2022/03/17(木) 11:34:53.41ID:qJRouQ9M
【質問】
switch constexpr って無いんですか?

【背景】
if constexpr(false){
}
if constexpr(false){
}
if constexpr(true){
}
if constexpr(false){
}
という記法に疲れました。
switch(定数) で実現可能ですが、コンパイラがwarningを出すので避けたいところです。
0958デフォルトの名無しさん
垢版 |
2022/03/17(木) 11:44:52.12ID:qJRouQ9M
>>957
早速の回答ありがとうございます。
否定的な解決で残念ですが、前向きに生きていきます!
0959デフォルトの名無しさん
垢版 |
2022/03/19(土) 13:40:31.67ID:nPptgbtB
クロスプラットフォーム対応のキーボードイベント入力・マウスイベント入力があるライブラリで、規模がそこまで大きくないものって何かありますか?
0961デフォルトの名無しさん
垢版 |
2022/03/21(月) 11:06:17.41ID:Prmlj1K5
>>960
情報ありがとうございます
ncursesだとWindowsで動かしにくいみたいなんでフォークのpdcursesでやってみます
0963デフォルトの名無しさん
垢版 |
2022/03/26(土) 23:30:57.78ID:po6dvxnc
日本語で記述された問題や目的から有用なページを紹介するのはグーグル先生は苦手なんだよ。
核心的なキーワード抜きだと特に。
0965デフォルトの名無しさん
垢版 |
2022/03/29(火) 22:17:14.91ID:JBheGd8b
スマホが普及しきった2015年くらいからGoogle検索の難易度一気に上がったな
昔はガバガバキーワードでもGoogle先生が忖度してくれていた
0968デフォルトの名無しさん
垢版 |
2022/03/30(水) 12:23:34.00ID:eoFMqmT7
広告出してくれるインチキ医療サイトや適当プログラミングスクール優遇しまーす!!

無能
0969デフォルトの名無しさん
垢版 |
2022/03/31(木) 16:42:12.47ID:Pfu/lGwO
初心者歓迎ということで、ちょっと聞いてみたいのですが、c++の世界ではboostというライブラリは有名なのでしょうか?
c++で勤怠管理できるwebシステムを作るんだといってコンストラクタがなんだかわからないまま
boostを読んでヘッダファイルをいくつか読んだあたりで英語読めなくて投げ出したことがあります。
0971デフォルトの名無しさん
垢版 |
2022/03/31(木) 17:01:55.62ID:Pfu/lGwO
>>970
ありがとうございます!!
それに、あなた有識者の方ですね?
もしよければ少しだけ詳しく評判を教えていただければ幸いです。
0972はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/03/31(木) 17:23:59.00ID:Dq8nC8PK
>>969
かなり有名で活発。
最初から標準化委員会の人がかかわってるし、 Boost が出自の機能が標準入りしたこともある。
ただ、実験的な要素も多分にある。
急に仕様がかわることもある。

適切な場面では適切だし適切でない場面では適切でないというごく普通の話なんで、
評判がどうこうというより何をしたくて Boost に関心を持ってるのか説明したほうがいいよ。
0973デフォルトの名無しさん
垢版 |
2022/03/31(木) 17:31:25.58ID:Pfu/lGwO
>>972
ありがとうございます。
boostは今はそんなに興味は持っていないんですが、今ちょうどMIMEタイプらへんのところを読んでいて、
そういえばboostにMIMEタイプって書いてあったなぁ、boostって業界だとどんな感じなんだろ?という感じです。
何となくなのですが、仕様が良く変わるから使いにくいと言う感じなのかな?と理解しました。
0974はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/03/31(木) 17:51:26.52ID:Dq8nC8PK
>>973
標準ライブラリほどには互換性は意識されないってだけで、
特に実験的な部分を除いては頻繁に変わるというほどでもないけど。
アップストリームでの変更の影響を避けるために
必要な部分だけ抜き出して自分のプロジェクトツリーに入れておくという運用もよくあるし。
(そのためのツールも用意されている。)
https://www.boost.org/doc/libs/1_78_0/tools/bcp/doc/html/index.html
0975デフォルトの名無しさん
垢版 |
2022/03/31(木) 18:00:17.34ID:Pfu/lGwO
>>974
更に詳しく有難うございます。確かに抜き出しちゃえば変わらないですもんね。
他でも応用できそう。
0976デフォルトの名無しさん
垢版 |
2022/03/31(木) 18:34:15.90ID:YOGNRVrk
boost自体は使う必要はないけど、boostのドキュメントを読めないやつも不要だよな

ドキュメントもしっかりしてるから、使うだけなら簡単に使えるし
0977デフォルトの名無しさん
垢版 |
2022/03/31(木) 19:04:21.70ID:Pfu/lGwO
>>976
ありがとうございます。
boostくらい軽く読めないならエンジニアになるなと言うことですね。
初めて3か月くらいなもんでポートフォリオの一つもないですけれど、
本当に読んでおきますね。
0978デフォルトの名無しさん
垢版 |
2022/03/31(木) 19:25:23.71ID:R4GrqV7T
これから年単位でトレーニングが続くのに初心者がいちいちポートフォリョーポートフォリョー言うのは大変めんどくせえ感
0979デフォルトの名無しさん
垢版 |
2022/03/31(木) 23:41:57.85ID:Sxv2nhUu
boost有用性は分かっていてもコンパイル時間やらなんやらで本チャンに適用しにくいんだよなぁ
0981デフォルトの名無しさん
垢版 |
2022/04/09(土) 01:43:32.41ID:fJGplIUn
VC++である動画を再生するのにコーデックのDLLが必要なのですが
予めレジストリにDLL情報を登録して、実行ファイルと同じディレクトリにDLLを置けば動きます。
でも他の環境でレジストリに登録するのが大変なので(権限がらみで面倒)、登録なしでどうにか動かす事が出来ないでしょうか?
DLLを参照とかしても無理でしょうか?
0982デフォルトの名無しさん
垢版 |
2022/04/09(土) 09:41:01.85ID:nJhutFId
レジストリで何を登録してるんだろう?
関数をexportするだけのsusieプラグイン
なんかはレジストリ登録不要で利用できるけど
0983デフォルトの名無しさん
垢版 |
2022/04/09(土) 13:44:11.76ID:unOoTfDz
COMだろ
仕様が公開されてればLoadLibrary()して使えるんじゃね?
0986985
垢版 |
2022/04/09(土) 18:31:18.53ID:fJGplIUn
今見たら、Video For Windowsの機能を利用してるみたいでした。
こんな古いのを使ってるから専用のコーデックを使わないといけないのか。
コーデックはH.264用のDLLみたいですね。どうにかならないかな。
HKEY_LOCAL_MACHINEにプログラムから簡単に登録出来ればいいんだけど。
なんか良い案はないでしょうか。
0987蟻人間 ◆T6xkBnTXz7B0
垢版 |
2022/04/09(土) 19:04:00.95ID:3yKii3E5
権限が必要ならプログラムのマニフェストで権限を要求。
自動化が必要なら、必要なコマンドラインを調べてバッチプログラム化する。
0989デフォルトの名無しさん
垢版 |
2022/04/09(土) 19:45:37.96ID:s5Ocn4sk
一般的な動画再生ソフトでもコーデックをインストールしないと見れないのがあるが
一方、コーデック内臓もあるので技術的にはインストール不要だとおもうが
やり方はしらん、どっちも
0990985
垢版 |
2022/04/10(日) 14:43:33.45ID:pRTmUSXM
とりあえずはマニフェストの設定変更で、起動した時に権限要求するようにしました。
調べて更に良い方法あればまた変更するつもりです。みなさんレスありがとうございました。
0991デフォルトの名無しさん
垢版 |
2022/04/14(木) 15:42:21.39ID:VkbtJkFZ
SIMDの勉強中で、下のようなことをしたいのですが、コンストラクタでエラーになります。
プリミティブ型をアライメント指定してnew,deleteするにはどうすればいいですか?
class MyClass {
public:
MyClass() : member(new (std::align_val_t{32}) int[1000]) {}
~MyClass() { delete[] member; }
int* member;
};
0992デフォルトの名無しさん
垢版 |
2022/04/14(木) 16:34:45.62ID:4tVKG4Xu
コンパイラの吐き出すエラーは見た?
std::align_val_t を使えるのは C++17以降みたいだけど
そこらへんは大丈夫?

(※ ideone は C++14までやよね?)
0993991
垢版 |
2022/04/14(木) 16:56:57.03ID:VkbtJkFZ
>>992
C++20です。
visual studio 2022でエラーC2956が出ます。
エラーのリンク先には構造体をnewしたい場合の対処法が書かれてます。
対処法:構造体の宣言時にalignas()でアライメント指定する。
プリミティブ型を宣言することができない(?)ので、この対処法では解決できませんでした。
0994デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:16:32.90ID:KM+JgYPL
うめ
0995デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:16:44.85ID:KM+JgYPL
埋め
0996デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:16:54.57ID:KM+JgYPL
ume
0997デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:17:03.44ID:KM+JgYPL
0998デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:17:12.94ID:KM+JgYPL
ウメ
0999デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:17:37.65ID:KM+JgYPL
生め
1000デフォルトの名無しさん
垢版 |
2022/04/15(金) 15:17:46.37ID:KM+JgYPL
産め
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 641日 1時間 25分 58秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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