!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part161
https://mevius.5ch.net/test/read.cgi/tech/1653135809/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C++相談室 part162
■ このスレッドは過去ログ倉庫に格納されています
1sage (ワッチョイ fbf0-ofdD)
2022/10/31(月) 14:29:35.57ID:J5sgTSch0119デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 12:53:27.82ID:+zOZoQ9YM >>118
[参考]
p.724,
「文字列リテラルは、テンプレート引数には『渡せない』」
ただし、これがどう関係しているのかは不明です。
A&& a の部分に文字列リテラル"Here"を渡してはいますが。
[参考]
p.724,
「文字列リテラルは、テンプレート引数には『渡せない』」
ただし、これがどう関係しているのかは不明です。
A&& a の部分に文字列リテラル"Here"を渡してはいますが。
120デフォルトの名無しさん (アウアウウー Saa9-qc8G)
2022/11/15(火) 12:56:01.43ID:f326q+3ca ある型が来たらそれに応じた変換をするのが、何か問題なんでしょうか
121デフォルトの名無しさん (スップ Sd43-m1Df)
2022/11/15(火) 12:57:17.27ID:slZuGS0Ed make_uniqueの実体化の所でTT=Xref<String>、T=Stringって明示的に指定してるじゃん
「演繹」なんかするまでもないから規格に書いてるはずもない
天才のくせにそんな事も分からないの?
「演繹」なんかするまでもないから規格に書いてるはずもない
天才のくせにそんな事も分からないの?
122デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 13:00:23.02ID:+zOZoQ9YM123デフォルトの名無しさん (スップ Sd43-m1Df)
2022/11/15(火) 13:02:34.01ID:slZuGS0Ed 引用の範囲超えてるんで著作権侵害の疑いで削除依頼出しますね
124デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 13:03:00.86ID:+zOZoQ9YM125デフォルトの名無しさん (ワッチョイ 23a5-gPc0)
2022/11/15(火) 14:16:43.16ID:D78/LkiC0 new TT{i, forward<A>(a)}
既出だが、こう書いてあってもXrefのメンバの型がどうなるか分からんわけでしょ
先日の質問と合わせて、型パズルをスラスラ解けるような資質がない
資質がないんでXrefの『関係ない』としたところを「・・・」で埋めてる
既出だが、こう書いてあってもXrefのメンバの型がどうなるか分からんわけでしょ
先日の質問と合わせて、型パズルをスラスラ解けるような資質がない
資質がないんでXrefの『関係ない』としたところを「・・・」で埋めてる
126はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/15(火) 15:01:57.79ID:5Bng48RE0127デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 16:18:06.60ID:Q+AZCxhHM >>126
命題『A が const char (&)[5] に推論される』・・・☆
とし、背理法で考えます。
☆が正しいと仮定すると、
forward<A>(a)は、forward<const char (&)[5]>(a)となりますが、すると、
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
に対して、forward<const char (&)[5]>(a)
が呼び出されることになります。
しかし、
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
とBJ stroustrup氏が書いています。
ならば、T=const char (&)[5]の時に、
typename remove_reference<T>::type
がstringにならなければなりません。つまり、
typename remove_reference<const char (&)[5]>::type
がstringになってないと矛盾する事になります。
もし、矛盾するならば、背理法により、☆は否定されることになります。
(矛盾しそうです。)
命題『A が const char (&)[5] に推論される』・・・☆
とし、背理法で考えます。
☆が正しいと仮定すると、
forward<A>(a)は、forward<const char (&)[5]>(a)となりますが、すると、
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
に対して、forward<const char (&)[5]>(a)
が呼び出されることになります。
しかし、
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
とBJ stroustrup氏が書いています。
ならば、T=const char (&)[5]の時に、
typename remove_reference<T>::type
がstringにならなければなりません。つまり、
typename remove_reference<const char (&)[5]>::type
がstringになってないと矛盾する事になります。
もし、矛盾するならば、背理法により、☆は否定されることになります。
(矛盾しそうです。)
128デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 16:42:50.09ID:Q+AZCxhHM129デフォルトの名無しさん (アウアウウー Saa9-qc8G)
2022/11/15(火) 16:49:22.19ID:f326q+3ca メロスはポリモーフィズムがわからない
130デフォルトの名無しさん (ワッチョイ a51f-IHKV)
2022/11/15(火) 17:18:50.72ID:eijjsxUX0 Perfumeの楽曲だろ?
131はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/15(火) 18:04:53.44ID:5Bng48RE0 >>127
> ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
> が呼び出される。
文字列リテラルは左辺値。 右辺値だと書いてあるのならそれが間違っている。
配列がポインタに (暗黙的でも明示的でも) キャストされる文脈では
そのポインタは xvalue (おおよそ右辺値のような扱いになる分類) になるが、
今回は変換が入らずに参照で受けているのでそうはならない。
/// この場合は rvalue 扱い
#include <cstdio>
void foo(const char *&x) { std::printf("lvalue"); }
void foo(const char *&&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
/// この場合は lvalue 扱い
#include <cstdio>
template <class T> void foo(const T &x) { std::printf("lvalue"); }
template <class T> void foo(const T &&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
> ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
> が呼び出される。
文字列リテラルは左辺値。 右辺値だと書いてあるのならそれが間違っている。
配列がポインタに (暗黙的でも明示的でも) キャストされる文脈では
そのポインタは xvalue (おおよそ右辺値のような扱いになる分類) になるが、
今回は変換が入らずに参照で受けているのでそうはならない。
/// この場合は rvalue 扱い
#include <cstdio>
void foo(const char *&x) { std::printf("lvalue"); }
void foo(const char *&&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
/// この場合は lvalue 扱い
#include <cstdio>
template <class T> void foo(const T &x) { std::printf("lvalue"); }
template <class T> void foo(const T &&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
132デフォルトの名無しさん (ワッチョイ d55f-cfOC)
2022/11/15(火) 18:53:35.18ID:mUSyU2rD0 文字列リテラルが左辺値ってなんで?
133デフォルトの名無しさん (ブーイモ MM39-fwKM)
2022/11/15(火) 20:56:02.85ID:aOXxipO5M 文字列リテラルは実際は配列
⇒アドレスで区別できるメモリ上のオブジェクト
⇒つまりlvalue
⇒アドレスで区別できるメモリ上のオブジェクト
⇒つまりlvalue
134デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/15(火) 20:56:58.78ID:kbPjYi7D0 文字列リテラルはメモリ上に永続的に保持されるんだから勝手に持ってっちゃダメでしょ
135デフォルトの名無しさん (ワッチョイ c5c2-H0Ic)
2022/11/15(火) 21:11:40.64ID:DJ4SZBHq0 文字列リテラルは配列型のlvalue
文字列リテラルが左辺値変形されて生じたポインタはrvalue
文字列リテラルが左辺値変形されて生じたポインタはrvalue
136はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/15(火) 23:54:26.84ID:5Bng48RE0 配列 (文字列を含む) と関数は値として扱えない、勝手にポインタに型変換するという
C から引き継いだ変則的なルールに辻褄を合わせているので全体的に変則的で
分かりにくいんだよ……。
C から引き継いだ変則的なルールに辻褄を合わせているので全体的に変則的で
分かりにくいんだよ……。
137デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:19:44.88ID:g3O9ReAZM >>131
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
と書かれています。
なので、"Here"がなんらかのメカニズムでstd::stringに変換されていると
解釈しました。
実験すれば白黒はっきりさせることが出来るかも知れません。
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
と書かれています。
なので、"Here"がなんらかのメカニズムでstd::stringに変換されていると
解釈しました。
実験すれば白黒はっきりさせることが出来るかも知れません。
138デフォルトの名無しさん (ワッチョイ 23a5-iu/k)
2022/11/16(水) 00:20:20.66ID:DtzZSdSg0 マジで間違った方向に引きずり回してんのか
やっぱりすげーな
こいつは上級者だ
やっぱりすげーな
こいつは上級者だ
139デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:29:08.01ID:g3O9ReAZM >>138
C++の父であるところのBJ Stroustrup氏が直々に書いていることなのですが。
C++の父であるところのBJ Stroustrup氏が直々に書いていることなのですが。
140デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:32:07.57ID:Nbbm6FAB0 禿本手元にないから確認はできないけど、「"Here"が右辺値」なんて基本的な間違い書くとは思えないんだけど
侵害くんの読み間違いか書き間違いか、本当に書いてあるなら翻訳ミスじゃないの
侵害くんの読み間違いか書き間違いか、本当に書いてあるなら翻訳ミスじゃないの
141デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:32:57.76ID:Nbbm6FAB0 >>139
"Here"の配列→(配列とポインタの糞ルール)→const char*→(stringの変換コンストラクタ)→string
と変換された結果のstring一時オブジェクトが右辺値だってクドクド書いてない?ちゃんと読んだ?
"Here"の配列→(配列とポインタの糞ルール)→const char*→(stringの変換コンストラクタ)→string
と変換された結果のstring一時オブジェクトが右辺値だってクドクド書いてない?ちゃんと読んだ?
142デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:38:01.28ID:g3O9ReAZM 原書(英語版)はこうなってます:
23.5.2.1. Reference Deduction
...
template<typename T>
class Xref {
public:
Xref(int i, T* p) // store a pointer: Xref is the owner
:index{i}, elem{p}, owner{true}
{}
Xref(int i, T& r) // store a pointer to r, owned by someone else
:index{i}, elem{&r}, owner{false}
{}
Xref(int i, T&& r) // move r into Xref, Xref is the owner
:index{i}, elem{new T{move(r)}}, owner{true}
{}
~Xref()
{
if(owned) delete elem;
}
//...
private:
int index;
T* elem;
bool owned;
};
...
23.5.2.1. Reference Deduction
...
template<typename T>
class Xref {
public:
Xref(int i, T* p) // store a pointer: Xref is the owner
:index{i}, elem{p}, owner{true}
{}
Xref(int i, T& r) // store a pointer to r, owned by someone else
:index{i}, elem{&r}, owner{false}
{}
Xref(int i, T&& r) // move r into Xref, Xref is the owner
:index{i}, elem{new T{move(r)}}, owner{true}
{}
~Xref()
{
if(owned) delete elem;
}
//...
private:
int index;
T* elem;
bool owned;
};
...
143デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:38:41.12ID:g3O9ReAZM >>142
template<typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept; //§35.5.1
template<typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // simple variant of make_shared (§34.3.2)
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
We want make_unique<T>(arg) to construct a T from an arg without making any spurious copies. To do that, it is essential that the lvalue/rvalue distinction is maintained. Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here". The more interesting (subtle) case is: auto p2 = make_unique<Xref<string>>(9,x); Here, x is an lvalue, so forward(string&) is called, passing along an lvalue: forward()’s T is deduced to string& so that the return value becomes string& &&, which means string& (§7.7.3). Thus, Xref(int,string&) is called for the lvalue x, so that x is copied.
Stroustrup, Bjarne. The C++ Programming Language (p.689). Pearson Education. Kindle 版.
template<typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept; //§35.5.1
template<typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // simple variant of make_shared (§34.3.2)
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
We want make_unique<T>(arg) to construct a T from an arg without making any spurious copies. To do that, it is essential that the lvalue/rvalue distinction is maintained. Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here". The more interesting (subtle) case is: auto p2 = make_unique<Xref<string>>(9,x); Here, x is an lvalue, so forward(string&) is called, passing along an lvalue: forward()’s T is deduced to string& so that the return value becomes string& &&, which means string& (§7.7.3). Thus, Xref(int,string&) is called for the lvalue x, so that x is copied.
Stroustrup, Bjarne. The C++ Programming Language (p.689). Pearson Education. Kindle 版.
144デフォルトの名無しさん (ワッチョイ d55f-NNfd)
2022/11/16(水) 00:40:39.32ID:85X5ndMu0 C++ど素人なんですが、この画像のようなファイル群がある時に、Visual Studioでexe化するにはどうしたら良いですか?
まず、ファイルはsln形式などになってないですが、そういったものはつくる必要はなく、ExpressionApp.cppだけ開いてビルドボタンを押したりすれば良い感じなのでしょうか?
まず、ファイルはsln形式などになってないですが、そういったものはつくる必要はなく、ExpressionApp.cppだけ開いてビルドボタンを押したりすれば良い感じなのでしょうか?
145デフォルトの名無しさん (ワッチョイ d55f-NNfd)
2022/11/16(水) 00:41:05.14ID:85X5ndMu0146デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:41:14.43ID:Nbbm6FAB0 えぇ…禿さん耄碌してんなあ
147デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:41:57.33ID:Nbbm6FAB0 >>145
cmake使え
cmake使え
148デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:42:22.40ID:g3O9ReAZM >>140
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here".
>>141
テンプレート関数なので、Aという方引数が決定されるメカニズムが重要となります。
Aがstringに決定されたならば、文字列リテラルからstringへの変換法則はおなじみの
ものとなります。
それよりも、まず、どうしてAがstringに決定されたのかの「仕組み」が分かりません。
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here".
>>141
テンプレート関数なので、Aという方引数が決定されるメカニズムが重要となります。
Aがstringに決定されたならば、文字列リテラルからstringへの変換法則はおなじみの
ものとなります。
それよりも、まず、どうしてAがstringに決定されたのかの「仕組み」が分かりません。
149デフォルトの名無しさん (アウアウウー Saa9-89mF)
2022/11/16(水) 00:44:42.87ID:P8Ivr6rPa >>144
プロジェクト作ればいいよ
プロジェクト作ればいいよ
150デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:50:02.83ID:g3O9ReAZM >>143
142と143の間に、次の記述が挟まっています。
So:
string x {"There and back again"};
Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
Xref<string> r2 {9,x}; // r2 just refers to x
Xref<string> r3 {3,new string{"There"}}; // r3 owns the string{"There"}
Here, r1 picks Xref(int,string&&) because x is an rvalue.
Similarly, r2 picks Xref(int,string&) because x is an lvalue.
Lvalues and rvalues are distinguished by template argument deduction:
an lvalue of type X is deduced as an X& and an rvalue as X.
This differs from the binding of values to non-template argument rvalue references (§12.2.1)
but is especially useful for argument forwarding (§35.5.1).
Consider writing a factory function that make Xrefs on the free store and returns
unique_ptrs to them:
142と143の間に、次の記述が挟まっています。
So:
string x {"There and back again"};
Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
Xref<string> r2 {9,x}; // r2 just refers to x
Xref<string> r3 {3,new string{"There"}}; // r3 owns the string{"There"}
Here, r1 picks Xref(int,string&&) because x is an rvalue.
Similarly, r2 picks Xref(int,string&) because x is an lvalue.
Lvalues and rvalues are distinguished by template argument deduction:
an lvalue of type X is deduced as an X& and an rvalue as X.
This differs from the binding of values to non-template argument rvalue references (§12.2.1)
but is especially useful for argument forwarding (§35.5.1).
Consider writing a factory function that make Xrefs on the free store and returns
unique_ptrs to them:
151デフォルトの名無しさん (ワッチョイ d55f-NNfd)
2022/11/16(水) 00:50:03.82ID:85X5ndMu0152はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/16(水) 00:51:20.49ID:eOApcCVI0 >>137
文字列リテラルが lvalue なのはややこしい解釈の余地はなく直接的に明記されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.prim.general#1
少なくとも
> "Here"は右辺値なので
というのは確実に誤った記述だよ。
最初の段階で誤っているのだからそこから後の理屈の立て方に筋が通るはずがない。
>>148
A は string に決定されない。
そういう仕組みは無いのでそれを前提として考えるな。
文字列リテラルが lvalue なのはややこしい解釈の余地はなく直接的に明記されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.prim.general#1
少なくとも
> "Here"は右辺値なので
というのは確実に誤った記述だよ。
最初の段階で誤っているのだからそこから後の理屈の立て方に筋が通るはずがない。
>>148
A は string に決定されない。
そういう仕組みは無いのでそれを前提として考えるな。
153デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 01:10:00.99ID:g3O9ReAZM >>152
>A は string に決定されない。
>そういう仕組みは無いのでそれを前提として考えるな。
なるほど。しかし、だとすれば、
「Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue,
so that Xref(int,string&&) is called to move from the string holding "Here".」
の部分はどう説明できますか?
>A は string に決定されない。
>そういう仕組みは無いのでそれを前提として考えるな。
なるほど。しかし、だとすれば、
「Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue,
so that Xref(int,string&&) is called to move from the string holding "Here".」
の部分はどう説明できますか?
154デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 01:14:18.30ID:g3O9ReAZM >>153
今思ったんですが、もしかしたら、
>Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
の部分が、
Consider: auto p1 = make_unique<Xref<string>>(7,string{"Here"});
の書き間違いだったのかもしれませんね。
なお、直接関係有りませんが、>>150の
>Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
>Here, r1 picks Xref(int,string&&) because x is an rvalue.
は、確認しましたが、kindle版は確かに正確にこう書かれていますが、
このr1の定義部分に「x」は存在しておらず、代わりに"Here"が存在していますので
そこも書き間違いかも知れません。
今思ったんですが、もしかしたら、
>Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
の部分が、
Consider: auto p1 = make_unique<Xref<string>>(7,string{"Here"});
の書き間違いだったのかもしれませんね。
なお、直接関係有りませんが、>>150の
>Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
>Here, r1 picks Xref(int,string&&) because x is an rvalue.
は、確認しましたが、kindle版は確かに正確にこう書かれていますが、
このr1の定義部分に「x」は存在しておらず、代わりに"Here"が存在していますので
そこも書き間違いかも知れません。
155デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 01:26:05.39ID:g3O9ReAZM もしくわ、
>auto p1 = make_unique<Xref<string>>(7,"Here");
は、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書きたかったのでしょうか。つまり、もし、
auto p1 = make_unique<Xref<string>>(7,string{"Here"});
または、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書いてあったならば、辻褄が合いそうです。
>auto p1 = make_unique<Xref<string>>(7,"Here");
は、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書きたかったのでしょうか。つまり、もし、
auto p1 = make_unique<Xref<string>>(7,string{"Here"});
または、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書いてあったならば、辻褄が合いそうです。
156デフォルトの名無しさん (ワッチョイ a501-WFXv)
2022/11/16(水) 05:12:39.73ID:c3tWnPnh0 文字を反転させる関数を作っているのですがうまく行きません
voidの部分がおかしいと思うんですが正直手詰まりです
誰か解決策はありますでしょうか
実行するとrevarce関数が飛ばされて終了してしまいます
void revarse(char* p, char* r);
int main(void)
{
char str1[64];
char str2[64] = {};
printf("文字列を入力\n>>");
scanf("%s", str1);
revarse(str1, str2);
printf("%s", str2);
rewind(stdin);
getchar();
return 0;
}
//反転させる関数
void revarse(char* p, char* r)
{
int len = strlen(p);
for (int i = 0; i <= len / 2; i++)
{
*(r + i) = *(p + (len - i));
}
}
voidの部分がおかしいと思うんですが正直手詰まりです
誰か解決策はありますでしょうか
実行するとrevarce関数が飛ばされて終了してしまいます
void revarse(char* p, char* r);
int main(void)
{
char str1[64];
char str2[64] = {};
printf("文字列を入力\n>>");
scanf("%s", str1);
revarse(str1, str2);
printf("%s", str2);
rewind(stdin);
getchar();
return 0;
}
//反転させる関数
void revarse(char* p, char* r)
{
int len = strlen(p);
for (int i = 0; i <= len / 2; i++)
{
*(r + i) = *(p + (len - i));
}
}
157デフォルトの名無しさん (ワッチョイ b5da-ltfr)
2022/11/16(水) 05:28:39.68ID:PEnRRRQh0 おい、もうテメーの日記帳に書いとけや
158デフォルトの名無しさん (ワッチョイ 23ad-Y93w)
2022/11/16(水) 05:33:02.42ID:5+x4ry0S0 >>156
文字列pが "12345" だとして考えてみ?
len=5 だろ?
*(p + (len - i));
これって i=0 の時 *(p + (5 - 0)) => *(p + 5) ってことになる
ゼロベースだからインデックス5にはNULL文字'\0'が入っている
それを*r にコピーしている
つまりコピーされるのは常に長さ0の文字列
そりゃ出力したってなにも表示されないさ
あとlen / 2はおかしいだろ
練習するならマルチバイトはまず置いておいてシングルバイト文字のみ扱え
文字列pが "12345" だとして考えてみ?
len=5 だろ?
*(p + (len - i));
これって i=0 の時 *(p + (5 - 0)) => *(p + 5) ってことになる
ゼロベースだからインデックス5にはNULL文字'\0'が入っている
それを*r にコピーしている
つまりコピーされるのは常に長さ0の文字列
そりゃ出力したってなにも表示されないさ
あとlen / 2はおかしいだろ
練習するならマルチバイトはまず置いておいてシングルバイト文字のみ扱え
159デフォルトの名無しさん (ワッチョイ a501-WFXv)
2022/11/16(水) 05:50:25.16ID:c3tWnPnh0160デフォルトの名無しさん (スッップ Sd43-XKJd)
2022/11/16(水) 06:49:36.90ID:f7msq55Zd 実習問題臭いのが気になる
161デフォルトの名無しさん (ワッチョイ 6d6b-6rMO)
2022/11/16(水) 08:13:10.02ID:6xMrEJ8a0 int と N 要素の vector<double> から N+1 要素の tuple<int, double, double,...> を作る方法ってありますか
162デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 08:25:10.43ID:Nbbm6FAB0 Nがコンパイル時に決まってないと無理
163デフォルトの名無しさん (ワッチョイ 23a5-gPc0)
2022/11/16(水) 13:34:55.97ID:DtzZSdSg0165デフォルトの名無しさん (ワッチョイ 23a5-gPc0)
2022/11/16(水) 13:43:50.52ID:DtzZSdSg0 わからん
166はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/16(水) 14:24:03.96ID:eOApcCVI0167デフォルトの名無しさん (アウアウウー Saa9-FFna)
2022/11/16(水) 17:43:24.39ID:z+sJwdsYa168はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/16(水) 17:43:42.62ID:eOApcCVI0 >>148
clang に抽象構文木を見る機能があるのを思い出した。
それを通したらこんな感じ。
https://wandbox.org/permlink/NNaci7k0QcpFXc9G
表示の正確な読み取り方はワイも知らんのやが lvalue "Here" と出てるのはわかるし、
関数に渡したときに const char (&)[5] として受け取られているのはわかるやろ。
clang に抽象構文木を見る機能があるのを思い出した。
それを通したらこんな感じ。
https://wandbox.org/permlink/NNaci7k0QcpFXc9G
表示の正確な読み取り方はワイも知らんのやが lvalue "Here" と出てるのはわかるし、
関数に渡したときに const char (&)[5] として受け取られているのはわかるやろ。
169デフォルトの名無しさん (アウアウウー Saa9-FFna)
2022/11/16(水) 17:47:22.63ID:z+sJwdsYa >>161-162
Nim
Nim
170デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/19(土) 11:03:08.07ID:GrOHAxDN0 >>161
vectorの取りうるサイズがある程度決まってるのなら
予めdoubleの数が異なるtupleを用意しておくという手はある
#include <iostream>
#include <any>
#include <vector>
#include <tuple>
using namespace std;
using Vector = vector <double>;
using Int_Double_1 = tuple <int, double>;
using Int_Double_2 = tuple <int, double, double>;
any make_tuple_from_int_vector (int p0, const Vector &p1)
{
if (p1.size () == 1)
return make_tuple (p0, p1 [0]);
else if (p1.size () == 2)
return make_tuple (p0, p1 [0], p1 [1]);
else
return any ();
}
int main ()
{
Vector v1 (1, 10);
Vector v2 (2, 100);
auto v3 (any_cast <Int_Double_1> (make_tuple_from_int_vector (1000, v1)));
auto v4 (any_cast <Int_Double_2> (make_tuple_from_int_vector (10000, v2)));
return 0;
}
vectorの取りうるサイズがある程度決まってるのなら
予めdoubleの数が異なるtupleを用意しておくという手はある
#include <iostream>
#include <any>
#include <vector>
#include <tuple>
using namespace std;
using Vector = vector <double>;
using Int_Double_1 = tuple <int, double>;
using Int_Double_2 = tuple <int, double, double>;
any make_tuple_from_int_vector (int p0, const Vector &p1)
{
if (p1.size () == 1)
return make_tuple (p0, p1 [0]);
else if (p1.size () == 2)
return make_tuple (p0, p1 [0], p1 [1]);
else
return any ();
}
int main ()
{
Vector v1 (1, 10);
Vector v2 (2, 100);
auto v3 (any_cast <Int_Double_1> (make_tuple_from_int_vector (1000, v1)));
auto v4 (any_cast <Int_Double_2> (make_tuple_from_int_vector (10000, v2)));
return 0;
}
171デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/19(土) 16:17:21.48ID:F8GIHVyHa 本当の目的を聴きたい
172デフォルトの名無しさん (ワッチョイ cf5f-pHhH)
2022/11/19(土) 19:46:58.80ID:IQ1PkgMa0 true &&false計算するのと1&&0計算するのはどっちが早いとかある?
173デフォルトの名無しさん (ワッチョイ 5701-kfYZ)
2022/11/19(土) 19:50:29.13ID:o7Lf802R0 はちみつもたまには役に立つな。
褒めてつかわす。
下がって良いぞ。
褒めてつかわす。
下がって良いぞ。
174デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/19(土) 23:24:23.61ID:G53M1f4ia >>172
trueは1なので同じです
trueは1なので同じです
175はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/20(日) 00:27:52.78ID:RgPem6BD0 >>172
オペランドがリテラルならコンパイル時に畳み込まれるので同じ。
そうではなく型による差について問うているのなら
少なくとも現代的な処理系・実行環境だとまず差は出ないよ。
うまいこと最適化されてそんな差はどうでもよくなる。
言語仕様通りの素朴な解釈だと両オペランドを bool に型変換するという工程が入るので
int の && のほうが余計に処理をすることにはなるが……。
ちなみに C と C++ では規則が違うので詳細を調べるなら混同しないように注意。
(文言は違うけど結果的な挙動はほぼ差はないんだけど。)
オペランドがリテラルならコンパイル時に畳み込まれるので同じ。
そうではなく型による差について問うているのなら
少なくとも現代的な処理系・実行環境だとまず差は出ないよ。
うまいこと最適化されてそんな差はどうでもよくなる。
言語仕様通りの素朴な解釈だと両オペランドを bool に型変換するという工程が入るので
int の && のほうが余計に処理をすることにはなるが……。
ちなみに C と C++ では規則が違うので詳細を調べるなら混同しないように注意。
(文言は違うけど結果的な挙動はほぼ差はないんだけど。)
176デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/20(日) 13:22:48.35ID:9/YCbfcZM >>172
どちらも、最適化されれば false(偽) になって同じコードになる。
どちらも、最適化されれば false(偽) になって同じコードになる。
177デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/20(日) 13:29:22.75ID:9/YCbfcZM >>176
[補足]
最適化には高レベルから低レベルまでさまざまな層で行なわれる。
高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
コードになる。
&& や || は、シーケンスポイントがあり A && B は A が偽ならば B を評価しないし、
A || B は、A が真なら B を評価しないので、マシン語レベルで条件 jump 命令が
生成されることが有るが、&& や || は、「高レベル」でも最適化する方法が
知られているので、このような場合、条件 jump 命令が生成されない。
また、仮に高レベルでは条件 jump 命令が生成されてしまった場合でも、
低レベルで最適化する際に、必ず真になったり必ず偽になるような条件 jump は、
無条件jumpになったり、削除されたりする。
そして、直後の命令への無条件 jump は、削除される。
二段階の無条件 jump は一段階の jump に修正される。
このような最適化を何度も何度も繰り返すので、結果的に同じことをするコードは、
同じコードになることが多い。
[補足]
最適化には高レベルから低レベルまでさまざまな層で行なわれる。
高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
コードになる。
&& や || は、シーケンスポイントがあり A && B は A が偽ならば B を評価しないし、
A || B は、A が真なら B を評価しないので、マシン語レベルで条件 jump 命令が
生成されることが有るが、&& や || は、「高レベル」でも最適化する方法が
知られているので、このような場合、条件 jump 命令が生成されない。
また、仮に高レベルでは条件 jump 命令が生成されてしまった場合でも、
低レベルで最適化する際に、必ず真になったり必ず偽になるような条件 jump は、
無条件jumpになったり、削除されたりする。
そして、直後の命令への無条件 jump は、削除される。
二段階の無条件 jump は一段階の jump に修正される。
このような最適化を何度も何度も繰り返すので、結果的に同じことをするコードは、
同じコードになることが多い。
178デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/20(日) 13:42:45.47ID:9/YCbfcZM >>177
誤:最適化には高レベルから低レベルまでさまざまな層で行なわれる。
正:最適化は高レベルから低レベルまでさまざまな層で行なわれる。
誤:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
正:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで修正されて短い
誤:最適化には高レベルから低レベルまでさまざまな層で行なわれる。
正:最適化は高レベルから低レベルまでさまざまな層で行なわれる。
誤:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
正:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで修正されて短い
179デフォルトの名無しさん (スプッッ Sd22-FDdn)
2022/11/22(火) 08:37:00.41ID:JLBL5Nrvd windowsでstd::create_symlinkを使おうとすると
特権がいるって言われるけど、何でそんな決まりになってんの?
mklinkコマンドも特権モードじゃないとシンボリックリンク作れないし
それのどこがそんなに危険な操作なのか理解に苦しむ
特権がいるって言われるけど、何でそんな決まりになってんの?
mklinkコマンドも特権モードじゃないとシンボリックリンク作れないし
それのどこがそんなに危険な操作なのか理解に苦しむ
180デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 09:20:47.14ID:+RKYLIKe0 権限のないディレクトリにシンボリックリンクを作ろうとしてるのでは?
181デフォルトの名無しさん (スプッッ Sd22-FDdn)
2022/11/22(火) 09:57:07.23ID:ROGUGHEjd C:じゃないHDDだし俺専用PCだし
所有権でややこしいことにはなりっこない
所有権でややこしいことにはなりっこない
182デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/22(火) 10:05:16.45ID:emKQg5jla 特権の問題じゃなくて変なもん作ろうとしとる
183デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 10:21:25.02ID:5norvibI0 ディレクトリの権限関係なくWindows のシンボリックリンクの作成自体に管理者権限が必要、理由は知らん
ディレクトリにリンク張るならジャンクション(こっちは管理者権限不要)使えってことかも
ジャンクションの作成はコマンドからならmklink /jで行けるけどコードからやるのはちょっと面倒みたい
https://stackoverflow.com/questions/29291059/issue-creating-windows-ntfs-directory-junction-in-c-c
ディレクトリにリンク張るならジャンクション(こっちは管理者権限不要)使えってことかも
ジャンクションの作成はコマンドからならmklink /jで行けるけどコードからやるのはちょっと面倒みたい
https://stackoverflow.com/questions/29291059/issue-creating-windows-ntfs-directory-junction-in-c-c
184デフォルトの名無しさん (スッップ Sd02-TJ0J)
2022/11/22(火) 16:05:23.29ID:glPNIX2fd 一般人に使わせるとショートカットと混同して危険だからそうしてるってどっかで見た
何が危険なのかは分からなかった
何が危険なのかは分からなかった
185デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 16:27:39.36ID:tXIkHCtk0 >ユーザー権利を持つユーザーは、誤って、または悪意を持ってシステムをシンボリック リンク攻撃に公開する可能性があります。
>シンボリック リンク攻撃は、ファイルのアクセス許可の変更、データの破損、データの破棄、または DoS 攻撃として使用できます。
というのが、Microsoft の公式見解
>シンボリック リンク攻撃は、ファイルのアクセス許可の変更、データの破損、データの破棄、または DoS 攻撃として使用できます。
というのが、Microsoft の公式見解
186デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 16:40:48.52ID:+RKYLIKe0187デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 16:44:11.97ID:5norvibI0188デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 16:48:44.26ID:tXIkHCtk0 シンボリック リンクの作成 (Windows 10) - Windows security | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/create-symbolic-links
https://learn.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/create-symbolic-links
189デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 17:02:07.48ID:5norvibI0 >>188
リンク先には攻撃方法は書いてないな
シンボリックリンク攻撃 でググるとこれが出てきた
特にWindows特有というわけじゃなさそう、て言うかWindowsは/tmpみたいな誰もが共通的に使うディレクトリはないからより攻撃は難しそうだが
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html
リンク先には攻撃方法は書いてないな
シンボリックリンク攻撃 でググるとこれが出てきた
特にWindows特有というわけじゃなさそう、て言うかWindowsは/tmpみたいな誰もが共通的に使うディレクトリはないからより攻撃は難しそうだが
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html
190デフォルトの名無しさん (ワッチョイ cf5f-HmgA)
2022/11/22(火) 19:09:40.02ID:zDRYE0v60 他の人の書いたコードを読み解いています。
下の例では、キーが押されたら何かを切り替えてるのはわかるのですが、ここで使われている
・0xFの意味
・(1 << 0)などの右シフト?
がどういう使われ方をしてるのかが分からないので知りたいです。
16進数で掛け算して値を使っているのでしょうか?
単純な1,2,3,4などの数値で切り替えていないのも意図がよく分からないのでずが深い意味はありそうでしょうか?
// VIEW_MESH | VIEW_IMAGE | VIEW_PLOT | VIEW_LM
int _viewMode = 0xF;
enum
{
VIEW_MESH = (1 << 0),
VIEW_IMAGE = (1 << 1),
VIEW_PLOT = (1 << 2),
VIEW_LM = (1 << 3)
};
switch (key)
{
case 'i': _viewMode ^= VIEW_IMAGE; break;
case 'l': _viewMode ^= VIEW_LM; break;
case 'm': _viewMode ^= VIEW_MESH; break;
}
下の例では、キーが押されたら何かを切り替えてるのはわかるのですが、ここで使われている
・0xFの意味
・(1 << 0)などの右シフト?
がどういう使われ方をしてるのかが分からないので知りたいです。
16進数で掛け算して値を使っているのでしょうか?
単純な1,2,3,4などの数値で切り替えていないのも意図がよく分からないのでずが深い意味はありそうでしょうか?
// VIEW_MESH | VIEW_IMAGE | VIEW_PLOT | VIEW_LM
int _viewMode = 0xF;
enum
{
VIEW_MESH = (1 << 0),
VIEW_IMAGE = (1 << 1),
VIEW_PLOT = (1 << 2),
VIEW_LM = (1 << 3)
};
switch (key)
{
case 'i': _viewMode ^= VIEW_IMAGE; break;
case 'l': _viewMode ^= VIEW_LM; break;
case 'm': _viewMode ^= VIEW_MESH; break;
}
191デフォルトの名無しさん (ワッチョイ e2ad-szhu)
2022/11/22(火) 19:21:19.72ID:3Sn7h5kH0 >>190
>・0xFの意味
16進数、10進数の15、2進数の1111
> ・(1 << 0)などの右シフト?
左シフト、1 << 0に関して言えば0ビットシフトなのでつまりシフトしない、二進数で0001、10進数で1
(1 << 1)は1ビット左にシフトなので二進数で0010、10進数で2
(1 << 2)は2ビット左にシフトなので二進数で0100、10進数で4
(1 << 3)は3ビット左にシフトなので二進数で1000、10進数で8
>・0xFの意味
16進数、10進数の15、2進数の1111
> ・(1 << 0)などの右シフト?
左シフト、1 << 0に関して言えば0ビットシフトなのでつまりシフトしない、二進数で0001、10進数で1
(1 << 1)は1ビット左にシフトなので二進数で0010、10進数で2
(1 << 2)は2ビット左にシフトなので二進数で0100、10進数で4
(1 << 3)は3ビット左にシフトなので二進数で1000、10進数で8
192デフォルトの名無しさん (ワッチョイ e2ad-szhu)
2022/11/22(火) 19:40:28.84ID:3Sn7h5kH0 >>190
^= は複合代入演算子
_viewMode ^= VIEW_IMAGE は _viewMode = _viewMode ^ VIEW_IMAGE と同じ
^ は排他的論理和(ビットXOR)、二進数で 1001 ^ 1100 は 0110 になる、要はビットが同じなら偽、異なっていれば真という演算
>case 'i': _viewMode ^= VIEW_IMAGE; break;
_viewModeには1111が代入されている、VIEW_IMAGEは0010
1111 ^ 0010 は 1101 になる
その演算結果1101を_viewModeに代入する
一連のコードはビットをフラグとして扱っていて、初期値として全フラグを立たせ、keyに対して特定のフラグをへし折っている
^= は複合代入演算子
_viewMode ^= VIEW_IMAGE は _viewMode = _viewMode ^ VIEW_IMAGE と同じ
^ は排他的論理和(ビットXOR)、二進数で 1001 ^ 1100 は 0110 になる、要はビットが同じなら偽、異なっていれば真という演算
>case 'i': _viewMode ^= VIEW_IMAGE; break;
_viewModeには1111が代入されている、VIEW_IMAGEは0010
1111 ^ 0010 は 1101 になる
その演算結果1101を_viewModeに代入する
一連のコードはビットをフラグとして扱っていて、初期値として全フラグを立たせ、keyに対して特定のフラグをへし折っている
193デフォルトの名無しさん (ワッチョイ cf5f-HmgA)
2022/11/22(火) 20:24:07.39ID:zDRYE0v60194デフォルトの名無しさん (ワッチョイ 227c-stRS)
2022/11/22(火) 22:10:58.50ID:TSfOUCtJ0 論理演算とか知らない奴がプログラムやっているんだな・・・
195デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 22:14:00.95ID:+RKYLIKe0 始めたばっかりなんでしょ
ビットをフラグとして使うとか最初は面食らったな
ビットをフラグとして使うとか最初は面食らったな
196デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/22(火) 22:48:40.37ID:s23xOfAqp ファミコンでもあるまいし、いまどき1ビットに意味をもたせなんて、通信制御くらいしか思い付かないなぁ
197デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 23:01:34.34ID:tXIkHCtk0 マシン語のレベルで、演算結果を示す幾つかの1ビットデータがあって
それらにキャリーフラグ、ゼロフラグなどの名前が付いてたのが呼び方の元
それらにキャリーフラグ、ゼロフラグなどの名前が付いてたのが呼び方の元
198デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/22(火) 23:04:06.68ID:s23xOfAqp 恋愛ゲームのフラグと同意語だよな
199デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 23:10:53.75ID:+RKYLIKe0 flagでしょ
大元は手旗信号
大元は手旗信号
200デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 23:22:36.31ID:5norvibI0201デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/22(火) 23:49:48.37ID:s23xOfAqp >>200
そうか?普通#defineされてる名前を使うからあんま意識しないよ?
そうか?普通#defineされてる名前を使うからあんま意識しないよ?
202デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 23:59:07.88ID:tXIkHCtk0 後方互換性や制御系の都合かもね
203デフォルトの名無しさん (ガックシ 068e-mZSb)
2022/11/23(水) 00:01:47.87ID:6zcmIvp36 >>201
defineされてようが複数のフラグをand/or で繋いだりするのは桁で管理してるからじゃん
defineされてようが複数のフラグをand/or で繋いだりするのは桁で管理してるからじゃん
204デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/23(水) 00:20:21.73ID:E00oDXjza chmodとかどうやってんの
205デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/23(水) 00:43:41.07ID:cGYFLLo00 さっきのビット演算、XOR 使うってことは
key によって特定のビットをトグルで ON/OFFする処理
の一部を抜粋した様に見える
key によって特定のビットをトグルで ON/OFFする処理
の一部を抜粋した様に見える
206デフォルトの名無しさん (ワッチョイ 77f0-yHLe)
2022/11/23(水) 05:44:17.85ID:agXFLOTv0 >>196
ご冗談を
ご冗談を
207デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/23(水) 08:43:03.58ID:g5bfG+kA0 >>201
複数フラグを同時に使う時は FlagA | FlagB とかやるんだが意識してないお前はどうやってるんだ?w
複数フラグを同時に使う時は FlagA | FlagB とかやるんだが意識してないお前はどうやってるんだ?w
208デフォルトの名無しさん (ワッチョイ e2ad-szhu)
2022/11/23(水) 09:08:55.00ID:a3Z+vFOW0209はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/23(水) 10:34:19.99ID:TBut/iDU0 現代的な C++ なら std::byte とか std::bitset を使って欲しいところではある。
210デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/23(水) 12:32:20.17ID:A/L1k8HF0 std::byte なんてあるんだ
211デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/23(水) 12:34:44.63ID:DxhXFxCJa istringstreamとかifstreamとかistreamとか
入力系からreadした場合実際に読めたバイト数は
.gcount()で取得出来ますが
ostringstreamとかofstreamとかostreamとか
出力系にwriteした場合実際に描き込めたバイト数はどうすれば取得出来ますか?
.pcount()とかは無いようです
入力系からreadした場合実際に読めたバイト数は
.gcount()で取得出来ますが
ostringstreamとかofstreamとかostreamとか
出力系にwriteした場合実際に描き込めたバイト数はどうすれば取得出来ますか?
.pcount()とかは無いようです
212デフォルトの名無しさん (ワッチョイ fb7c-IsEx)
2022/11/23(水) 12:40:51.08ID:fdWr7Y/z0 writeに文字数与えてるだろ?成功したらその数だよ
失敗したら未定義
失敗したら未定義
213デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/23(水) 12:46:45.47ID:DxhXFxCJa Nを指定して成功していたら必ずNは判りますが
未定義: 失敗したとき0かどうかは判らない
定義済(0): 0からNの間の値になる可能性は無い
の未定義にあたるということですかね
途中までならその途中までの数字が知りたいと思うのは不自然?
ありがとうございます
未定義: 失敗したとき0かどうかは判らない
定義済(0): 0からNの間の値になる可能性は無い
の未定義にあたるということですかね
途中までならその途中までの数字が知りたいと思うのは不自然?
ありがとうございます
214デフォルトの名無しさん (ワッチョイ 0646-7h5B)
2022/11/23(水) 13:01:17.94ID:KaofbnpA0 write(2)じゃなくてfputs(3)に相当するから
書き込んだバイト数なんて概念はないのでは
書き込んだバイト数なんて概念はないのでは
215デフォルトの名無しさん (ワッチョイ fb7c-IsEx)
2022/11/23(水) 13:59:19.61ID:fdWr7Y/z0 書き込みエラーなんてプログラムからは何が起きてるかわかんないんだよ
最悪壊れかけのディスクにちょうどトドメ刺して何もかも吹っ飛んだのかもしれない
エラーが起きた時点でプログラム側で保証できることなんてほとんどないし、たまたま途中の何文字まで書けたかなんて大抵は無意味な情報
逆に読み込みで何文字読んだって情報は、プログラム側で管理してるメモリの話だからプログラムからも分かるし必要でもある
最悪壊れかけのディスクにちょうどトドメ刺して何もかも吹っ飛んだのかもしれない
エラーが起きた時点でプログラム側で保証できることなんてほとんどないし、たまたま途中の何文字まで書けたかなんて大抵は無意味な情報
逆に読み込みで何文字読んだって情報は、プログラム側で管理してるメモリの話だからプログラムからも分かるし必要でもある
216デフォルトの名無しさん (オッペケ Srdf-KP+k)
2022/11/23(水) 14:04:25.04ID:8VVNMMLlr テキストアライメント関係の 始端よせ/中央/終端よせ の類で
0~3の 2 bit値を ビットパターンマスクの途中に織り込んでくるのはどっきりする
0~3の 2 bit値を ビットパターンマスクの途中に織り込んでくるのはどっきりする
217デフォルトの名無しさん (ワッチョイ 4228-17Q5)
2022/11/23(水) 23:37:54.49ID:t8T/jR0m0 質問なのですがenum class初心者なのですが
enum classはint以外の整数型としても定義できるそうなので
整数型への自動変換ぐらいしてくれるのかと思いきや、
enum Foo { A, B, C, D, N };
int arr[Foo::N];
arr[Foo::A] = 1;
arr[Foo::B] = 999;
みたいに配列の添え字に使うケースで
error C2677: 二項演算子 '[': 型 'Foo' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
というコンパイルエラーになります……orz
Visual Studio 2019なのですがおれ環?
enum classはint以外の整数型としても定義できるそうなので
整数型への自動変換ぐらいしてくれるのかと思いきや、
enum Foo { A, B, C, D, N };
int arr[Foo::N];
arr[Foo::A] = 1;
arr[Foo::B] = 999;
みたいに配列の添え字に使うケースで
error C2677: 二項演算子 '[': 型 'Foo' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
というコンパイルエラーになります……orz
Visual Studio 2019なのですがおれ環?
218デフォルトの名無しさん (スフッ Sd02-TJd5)
2022/11/23(水) 23:45:44.60ID:MlF8tgQAd enum class Fooって書いてみやがれ
■ このスレッドは過去ログ倉庫に格納されています
