0からの、超初心者C++相談室
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr 何にも知らない0からの出発、超初心者のためのC++相談室
102デフォルトの名無しさん
2020/05/08(金) 23:48:12.63ID:xx+9oYGy MSの陰謀。
103デフォルトの名無しさん
2020/05/09(土) 06:15:34.68ID:LKKpAq9a とりあえず stundent は誤りで正しくは student だとして
多くの場合、配列名は「配列の先頭要素を指すポインタ」と解釈される、から。
つまり配列studentについて student == &student[0] が成り立つ。
*演算子を作用させて *student == *&student[0] == student[0]
よって sizeof *student == sizeof student[0]
ここで注意すべき点は「配列名がsizeof演算子のオペランドになった場合は
配列の先頭要素を指すポインタとは解釈されない」ってこと。
sizeof 配列名 == 配列全体が占有するメモリ容量
なぜそうなっているか、という理由は「そう決めると便利だから」かな。
Cの頃からそういう感じでプログラム書いてたから、という歴史的経緯もある。
>>102 初心者をからかっちゃアカンよ。信じちゃうかも知れん。
多くの場合、配列名は「配列の先頭要素を指すポインタ」と解釈される、から。
つまり配列studentについて student == &student[0] が成り立つ。
*演算子を作用させて *student == *&student[0] == student[0]
よって sizeof *student == sizeof student[0]
ここで注意すべき点は「配列名がsizeof演算子のオペランドになった場合は
配列の先頭要素を指すポインタとは解釈されない」ってこと。
sizeof 配列名 == 配列全体が占有するメモリ容量
なぜそうなっているか、という理由は「そう決めると便利だから」かな。
Cの頃からそういう感じでプログラム書いてたから、という歴史的経緯もある。
>>102 初心者をからかっちゃアカンよ。信じちゃうかも知れん。
104デフォルトの名無しさん
2020/05/09(土) 09:28:26.57ID:3rxWY8lS コロチャンもゲイツの陰謀とか言ってる人が居てわろす
温暖化も陰謀ω
温暖化も陰謀ω
105はちみつ餃子 ◆8X2XSCHEME
2020/05/09(土) 10:52:17.88ID:MmeKQuXy >>99
「暗黙の型変換」によって配列がポインタに型変換されるルールがある。
スムーズにポインタとして使えてしまうから混同してわけわからんようになる初心者が多いんだけど、
あくまでも別物であるという理解が出来ているなら入門者としてはかなり優秀だと思う。
ほとんどの場合に配列はポインタに暗黙に型変換されるんだけど、
例外としては
@ sizeof を適用するとき
A 単項の & を適用するとき
B 参照で受け取るとき
があって、これらの状況では型変換されずに解釈される。
----
余談だけど暗黙の型変換とは別に仮引数の調整というのもあって、
関数の仮引数として配列を書いた場合も配列はポインタに調整される。
たとえば
void foo(int a[10]) {}
という定義を書いたら
void foo(int* a) {}
と全く同じように解釈される。
「暗黙の型変換」によって配列がポインタに型変換されるルールがある。
スムーズにポインタとして使えてしまうから混同してわけわからんようになる初心者が多いんだけど、
あくまでも別物であるという理解が出来ているなら入門者としてはかなり優秀だと思う。
ほとんどの場合に配列はポインタに暗黙に型変換されるんだけど、
例外としては
@ sizeof を適用するとき
A 単項の & を適用するとき
B 参照で受け取るとき
があって、これらの状況では型変換されずに解釈される。
----
余談だけど暗黙の型変換とは別に仮引数の調整というのもあって、
関数の仮引数として配列を書いた場合も配列はポインタに調整される。
たとえば
void foo(int a[10]) {}
という定義を書いたら
void foo(int* a) {}
と全く同じように解釈される。
106デフォルトの名無しさん
2020/05/11(月) 03:00:46.06ID:II69MMpE すいませんロベール持ってる人にお聞きしたいのですが
305ページの
for (int i = 0, size = a.Size(); i < size; ++i) という文があるのですが
このsizeというローカル変数は何処に定義されてるんでしょうか?
305ページの
for (int i = 0, size = a.Size(); i < size; ++i) という文があるのですが
このsizeというローカル変数は何処に定義されてるんでしょうか?
107デフォルトの名無しさん
2020/05/11(月) 05:46:42.66ID:k4wInV7m >>106
“ロベール本”を持ってないので答えられない立場かも知れんけど…。
この size は「ここ」で定義されているんだと思うよ。
for の初期化式 int i = 0, size = a.Size(); で、
「int の i」と「int の size」という2つの変数を定義している。
“ロベール本”を持ってないので答えられない立場かも知れんけど…。
この size は「ここ」で定義されているんだと思うよ。
for の初期化式 int i = 0, size = a.Size(); で、
「int の i」と「int の size」という2つの変数を定義している。
108デフォルトの名無しさん
2020/05/11(月) 07:45:03.87ID:II69MMpE109デフォルトの名無しさん
2020/05/11(月) 09:53:48.32ID:MhpqGE2N 型が違うときは?
for (long i = 0, int size = a.Size(); i < size; ++i)
for (long i = 0, int size = a.Size(); i < size; ++i)
110デフォルトの名無しさん
2020/05/11(月) 19:53:43.37ID:8B6Lebzi C++17なら
for (auto [i, size] = tuple(0L, a.Size()); i < size; ++i)
for (auto [i, size] = tuple(0L, a.Size()); i < size; ++i)
111デフォルトの名無しさん
2020/05/21(木) 23:33:00.50ID:fIo5j0A9 class DataStore {
public:
DataStore(int v) : mValue(v) {}
bool operator==(const DataStore& rhs) const;
private:
int mValue;
};
bool DataStore::operator==(const DataStore& rhs) const
{
return mValue == rhs.mValue;
}
int main()
{
DataStore ds1(10), ds2(10);
if (ds1 == ds2) {}
}
というのがあるんですがoperatorに記述されてる仮引数はどっから実引数をコピーしてるのですか?
後演算子のオーバーロードに関して分かりやすく解説してるとこあれば教えていただけると嬉しいです
public:
DataStore(int v) : mValue(v) {}
bool operator==(const DataStore& rhs) const;
private:
int mValue;
};
bool DataStore::operator==(const DataStore& rhs) const
{
return mValue == rhs.mValue;
}
int main()
{
DataStore ds1(10), ds2(10);
if (ds1 == ds2) {}
}
というのがあるんですがoperatorに記述されてる仮引数はどっから実引数をコピーしてるのですか?
後演算子のオーバーロードに関して分かりやすく解説してるとこあれば教えていただけると嬉しいです
112デフォルトの名無しさん
2020/05/21(木) 23:57:47.49ID:ut4Weg2U operatorも、ただの関数
if (ds1.operator==(ds2)) {}
if (ds1.operator==(ds2)) {}
113デフォルトの名無しさん
2020/05/22(金) 00:55:03.99ID:H9gcgSgg const DataStore& rhsの実引数はds1ってことですか?
114デフォルトの名無しさん
2020/05/22(金) 06:44:02.17ID:8neFOyTD この流れだと、仮パラメータ rhs にバインドされる実引数は ds2 でしょ。
クラスのメンバ関数として宣言された2項演算子の operator OP(rhs) は、
lhs OP rhs と書くと lhs.operator OP(rhs) が呼び出される。
…と書いても分かりにくいね。
具体的には ds1 == ds2 と ds1.operator==(ds2) が同じ意味、
ってのが >>112 の人の言ってること。
クラスのメンバ関数として宣言された2項演算子の operator OP(rhs) は、
lhs OP rhs と書くと lhs.operator OP(rhs) が呼び出される。
…と書いても分かりにくいね。
具体的には ds1 == ds2 と ds1.operator==(ds2) が同じ意味、
ってのが >>112 の人の言ってること。
115デフォルトの名無しさん
2020/05/22(金) 09:23:45.22ID:JweU/zGV 余談だけど左右の引数が const な比較演算子は非メンバ関数として実装した方が好ましい場合が多い。
(標準ライブラリでもだいたいそうなってる。)
(標準ライブラリでもだいたいそうなってる。)
116デフォルトの名無しさん
2020/05/22(金) 12:29:55.77ID:6NFPH2hn constかどうかで決めるのはアホ
117デフォルトの名無しさん
2020/05/30(土) 06:36:15.09ID:1Zwy+dfa なぜ文字から'0'を引くと数字を数値に変換できるのですか? char c='8' int a=c-'0'
理屈がよくわからないです。
よろしくお願いします
理屈がよくわからないです。
よろしくお願いします
118デフォルトの名無しさん
2020/05/30(土) 07:25:50.69ID:/FCD7s4m 順番に並んでいるから。
119デフォルトの名無しさん
2020/05/30(土) 07:33:59.81ID:1Zwy+dfa 文字コードが順番に並んでるのは分かったのですが
なぜ'0'引くとキャストせずにint型の変数に代入できるようになるかが分かりません
よろしくお願いします
なぜ'0'引くとキャストせずにint型の変数に代入できるようになるかが分かりません
よろしくお願いします
120デフォルトの名無しさん
2020/05/30(土) 07:57:34.41ID:/LdiluDZ '0'を引かなくてもキャストせずにint型の変数に代入できるよ
c/c++では文字は整数型に文字コードを入れて扱うんだよ
c/c++では文字は整数型に文字コードを入れて扱うんだよ
121デフォルトの名無しさん
2020/05/30(土) 08:07:04.11ID:1Zwy+dfa 苦しんで覚えるC言語という本の255ページに
”数字を使うときには引き算で本来の数値を知ることも出来ます。
数字に持っ文字の番号が割り当てられており例えば'0'は48番に割り当てられてます。
数字から'0'の番号を引き算すれば数値に変換され計算に使用できます。”
とあるんですが
”数字から'0'の番号を引き算すれば数値に変換され計算に使用できま”というのが意味わからないです
”数字を使うときには引き算で本来の数値を知ることも出来ます。
数字に持っ文字の番号が割り当てられており例えば'0'は48番に割り当てられてます。
数字から'0'の番号を引き算すれば数値に変換され計算に使用できます。”
とあるんですが
”数字から'0'の番号を引き算すれば数値に変換され計算に使用できま”というのが意味わからないです
122デフォルトの名無しさん
2020/05/30(土) 08:27:53.58ID:CZP1xQZw 文字が元々数値(文字コード)であることが理解できてないのでは
ASCIIコード表でググってみれ
ASCIIコード表でググってみれ
123デフォルトの名無しさん
2020/05/30(土) 10:03:05.95ID:/LdiluDZ 2に3を足す時、
int a = 2; int b = 3; int c = a + b;
とやるとc == 5になる
int a = '2'; int b = '3'; int c = a + b;
とやってもc == '5'にはならない
今やほぼASCIIだからc == 'e'になる
int a = '2' - '0'; int b = '3' - '0'; int c = a + b;
とやるとc == 5になる
'0'から'9'まで連続していることはcの規格が強制してるから
これが”数字から'0'の番号を引き算すれば数値に変換され計算に使用できます”の意味
int a = 2; int b = 3; int c = a + b;
とやるとc == 5になる
int a = '2'; int b = '3'; int c = a + b;
とやってもc == '5'にはならない
今やほぼASCIIだからc == 'e'になる
int a = '2' - '0'; int b = '3' - '0'; int c = a + b;
とやるとc == 5になる
'0'から'9'まで連続していることはcの規格が強制してるから
これが”数字から'0'の番号を引き算すれば数値に変換され計算に使用できます”の意味
124デフォルトの名無しさん
2020/05/30(土) 16:37:51.27ID:A5Abb6S3 char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) char型
int a = c - '0'; // char型の数値8 で int変数a を初期化・代入
一般にint変数にchar型の値を格納することは認められている。
思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) char型
int a = c - '0'; // char型の数値8 で int変数a を初期化・代入
一般にint変数にchar型の値を格納することは認められている。
思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。
125124
2020/05/30(土) 16:49:13.96ID:A5Abb6S3 すまん 124 は間違ってるみたい、忘れてくれ。
char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) int型
int a = c - '0'; // 数値8 で int変数a を初期化・代入
思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。
'8' - '0' は「char型の8」ではなく「int型の8」だね。(以下検証コード)
std::cout << "sizeof('8') == " << sizeof('8') << '\n';
std::cout << "sizeof('8'-'0') == " << sizeof('8'-'0') << '\n';
char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) int型
int a = c - '0'; // 数値8 で int変数a を初期化・代入
思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。
'8' - '0' は「char型の8」ではなく「int型の8」だね。(以下検証コード)
std::cout << "sizeof('8') == " << sizeof('8') << '\n';
std::cout << "sizeof('8'-'0') == " << sizeof('8'-'0') << '\n';
126デフォルトの名無しさん
2020/05/30(土) 18:38:26.55ID:1Zwy+dfa127124
2020/05/30(土) 19:18:59.52ID:A5Abb6S3 型の検証はC++11なら直接的にできるね。
#include <typeinfo>
...
std::cout << "'8' is " << typeid('8').name() << '\n';
std::cout << "'8'-'0' is " << typeid('8'-'0').name() << '\n';
実装定義の型の名前を得られる。
#include <typeinfo>
...
std::cout << "'8' is " << typeid('8').name() << '\n';
std::cout << "'8'-'0' is " << typeid('8'-'0').name() << '\n';
実装定義の型の名前を得られる。
128デフォルトの名無しさん
2020/06/05(金) 17:55:42.30ID:8OoEw/S/ なかなか、適当なスレを見付けるのが難しいわい
C++ 且つ初心者だから、ここでいいのかな
subroutine で、例えば、boolean と string のふたつの変数の値を
return するには、やっぱり std::map を使うのが一番簡単でしょうかね?
C++ 且つ初心者だから、ここでいいのかな
subroutine で、例えば、boolean と string のふたつの変数の値を
return するには、やっぱり std::map を使うのが一番簡単でしょうかね?
129デフォルトの名無しさん
2020/06/05(金) 18:21:06.88ID:Uv2w5eYU std::pair<>じゃないのか?
https://ja.cppreference.com/w/cpp/utility/pair
https://ja.cppreference.com/w/cpp/utility/pair
130デフォルトの名無しさん
2020/06/05(金) 19:03:13.94ID:8OoEw/S/ うーん、なんとなくそうおもいます、ええ
131デフォルトの名無しさん
2020/06/05(金) 19:06:38.66ID:8OoEw/S/ あ、では、boolean, string, int の三つをreturn するには普通どうやるのが王道でしょうか?
132デフォルトの名無しさん
2020/06/05(金) 19:08:18.91ID:8OoEw/S/ 連投すまん。
std::tuple ですか。
std::tuple ですか。
133デフォルトの名無しさん
2020/06/05(金) 19:12:47.23ID:Uv2w5eYU たぶんそうだとお芋ます、ええ。
あと、コンテナに突っ込みたいときにはstd::variantなんかも良く使います。
今回は関係なさそうですが。
あと、コンテナに突っ込みたいときにはstd::variantなんかも良く使います。
今回は関係なさそうですが。
134デフォルトの名無しさん
2020/06/21(日) 13:29:09.07ID:hTPD8Gtd >>131
王道かどうかは知らんが、C++17以降なら
auto func() {
return std::make_tuple(a, b, c);
}
auto [f, s, n] = func();
っていう風にできるで
王道かどうかは知らんが、C++17以降なら
auto func() {
return std::make_tuple(a, b, c);
}
auto [f, s, n] = func();
っていう風にできるで
135デフォルトの名無しさん
2020/06/21(日) 16:38:41.93ID:rRP2z2l8 std::tie の方が好き
136デフォルトの名無しさん
2020/06/22(月) 16:40:35.96ID:sjaABjGh C++でint[変数]というようなことが出来ないのはstack overflow防止のためなんでしょうか?
137はちみつ餃子 ◆8X2XSCHEME
2020/06/22(月) 16:50:40.23ID:H8+bL0cM138デフォルトの名無しさん
2020/06/22(月) 20:24:27.49ID:83jG8pXe Cの新しいのだと出来る
139はちみつ餃子 ◆8X2XSCHEME
2020/06/22(月) 22:04:26.97ID:H8+bL0cM140デフォルトの名無しさん
2020/06/22(月) 23:23:01.67ID:rtw5aKlF Cは89/90が基本
141デフォルトの名無しさん
2020/06/23(火) 01:32:00.34ID:UY2AjBBL 以下のコードは比較関数をSTLのlistに渡す為のものなのですが
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか?
typedef SubType* LPSUBTYPE;
template<> inline bool greater<LPSUBTYPE>::operator()
(const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const {
…
}
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか?
typedef SubType* LPSUBTYPE;
template<> inline bool greater<LPSUBTYPE>::operator()
(const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const {
…
}
142デフォルトの名無しさん
2020/06/23(火) 09:26:35.36ID:RMSfHJVB143デフォルトの名無しさん
2020/06/29(月) 08:08:09.53ID:PYBXxpGI VC++についての質問になってしまうのですが、C#のようにソースファイルをリンクとして追加することは出来ないのでしょうか?
144デフォルトの名無しさん
2020/06/29(月) 18:23:34.98ID:gWW+3u18 C#と違って「既存の項目」で追加したものに関してはコピーされずに参照扱いだよ
作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど
作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど
145デフォルトの名無しさん
2020/09/08(火) 02:57:29.22ID:ZBc9FXfY 何で構造体のchar配列は直接値が代入できず
strcpyを使う必要があるのでしょうか?
strcpyを使う必要があるのでしょうか?
146デフォルトの名無しさん
2020/09/08(火) 03:20:04.77ID:jacy6RM2 できるよ
struct A {
int x;
char b[4];
} a = {0, 1, 2, 3, 4};
struct A {
int x;
char b[4];
} a = {0, 1, 2, 3, 4};
148デフォルトの名無しさん
2020/09/08(火) 05:56:11.78ID:ZBc9FXfY typedef struct {
char str[32];
}A;
int main(}{
A a;
a.str="aaa";
}
これができないってことです
言葉足らずですいません
char str[32];
}A;
int main(}{
A a;
a.str="aaa";
}
これができないってことです
言葉足らずですいません
149デフォルトの名無しさん
2020/09/08(火) 08:44:00.12ID:h4K4tlm9 int main(void) {
int arr[5];
arr = 3;
}
ができないのと同じ理由です
int arr[5];
arr = 3;
}
ができないのと同じ理由です
150デフォルトの名無しさん
2020/09/08(火) 09:53:15.41ID:zoI9JNor かわいいw
151デフォルトの名無しさん
2020/09/08(火) 10:55:42.52ID:0vfIbeP0 ちょっと忘れたから、推測だけど、
a.str="aaa";
"aaa" を右辺で使うと、先頭要素のアドレスに変換されるとか?
例えば、4バイトのサイズで、10〜13 アドレスに存在する場合に、10が代入されるとか
char str[32];
一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか
a.str="aaa";
"aaa" を右辺で使うと、先頭要素のアドレスに変換されるとか?
例えば、4バイトのサイズで、10〜13 アドレスに存在する場合に、10が代入されるとか
char str[32];
一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか
152デフォルトの名無しさん
2020/09/08(火) 11:16:05.69ID:h4K4tlm9 意図してるだろうことを無理してやるなら
str[0] = 'a';
str[1] = 'a';
str[2] = 'a';
str[3] = '\0';
でできる.そしてこれをするためにstrcopyがある
str[0] = 'a';
str[1] = 'a';
str[2] = 'a';
str[3] = '\0';
でできる.そしてこれをするためにstrcopyがある
153デフォルトの名無しさん
2020/09/08(火) 15:36:44.61ID:JkCXGknl >>148
型が違うし
型が違うし
154デフォルトの名無しさん
2020/09/08(火) 15:57:15.69ID:SNM207t1 出来ない訳じゃないんだよな
typedef struct {
char b[4];
} A;
int main(void) {
A b = {1, 2, 3, 4};
A a;
a = b; // ok
a.b = b.b; // bad
return 0;
}
自分で for で配列要素代入すれば良い訳で
面倒だから memcpy や strcpy 使ってるだけ
typedef struct {
char b[4];
} A;
int main(void) {
A b = {1, 2, 3, 4};
A a;
a = b; // ok
a.b = b.b; // bad
return 0;
}
自分で for で配列要素代入すれば良い訳で
面倒だから memcpy や strcpy 使ってるだけ
155デフォルトの名無しさん
2020/09/08(火) 16:02:13.68ID:JkCXGknl >何で構造体のchar配列は直接値が代入できず
構造体のchar配列だけじゃなくて
ただのchar配列でもダメだろ
宣言と同時に代入してるときはたまたま出来るだけ
int main() {
char a[4] = "abc"; // OK
char b[4];
b = "abc"; // BAD
return 0;
}
構造体のchar配列だけじゃなくて
ただのchar配列でもダメだろ
宣言と同時に代入してるときはたまたま出来るだけ
int main() {
char a[4] = "abc"; // OK
char b[4];
b = "abc"; // BAD
return 0;
}
156デフォルトの名無しさん
2020/09/09(水) 20:41:42.30ID:s+S5qxFe >char a[4] = "abc"; // OK
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート
たまたま、ってw
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート
たまたま、ってw
157デフォルトの名無しさん
2020/09/09(水) 23:49:08.55ID:N/YnHGom はじめたころは、こういうことにいちいちひっかかってたな…
わかっちゃえば、慣れちゃえばどーってことないんだけど
わかっちゃえば、慣れちゃえばどーってことないんだけど
158デフォルトの名無しさん
2020/09/10(木) 00:06:01.62ID:Qspm/kAl 同じようでいて、初期化と代入では見た目の作用がことなることがあるね
159デフォルトの名無しさん
2020/09/10(木) 00:07:00.73ID:Qspm/kAl 見た目「と」作用が
160デフォルトの名無しさん
2020/09/10(木) 15:36:27.72ID:rLZBXCmM a も b も代入禁止だ
161デフォルトの名無しさん
2020/09/19(土) 09:19:26.77ID:z/ngkL1p >>157
常に初心に返ることで新たにわかることもある
常に初心に返ることで新たにわかることもある
162デフォルトの名無しさん
2020/09/21(月) 06:30:22.99ID:GP+Uv9qA C#ですいません
usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて
イマイチ言ってる意味がわからないので
簡単なコードを用いてnamespaceを使う意味を教えて欲しいです
usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて
イマイチ言ってる意味がわからないので
簡単なコードを用いてnamespaceを使う意味を教えて欲しいです
163デフォルトの名無しさん
2020/09/21(月) 10:35:12.49ID:M8W5JifW 文字だけじゃないコード・・・
164デフォルトの名無しさん
2020/09/21(月) 11:38:59.68ID:xNmUS8x8 寿限無名予防以外の目的?
165デフォルトの名無しさん
2020/09/21(月) 11:59:08.18ID:IzAwgxqY166デフォルトの名無しさん
2020/09/21(月) 21:53:00.21ID:GP+Uv9qA >>165
すいません、そういうことです。
usingについてはおかげさまで意味が分かりました。ありがとうございます。
namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、
どっからどの部分までが名前空間なのでしょうか
すいません、そういうことです。
usingについてはおかげさまで意味が分かりました。ありがとうございます。
namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、
どっからどの部分までが名前空間なのでしょうか
167デフォルトの名無しさん
2020/09/21(月) 23:03:56.25ID:IzAwgxqY >>166
namespaceがなかったら
たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで
さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、
自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する
(重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない)
みたいな事態が発生してしまう
さっきの例だと同名のメソッド(Console.WriteLine)を定義してても
System名前空間とMyNS名前空間で分けたからコンパイルが通る
System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの
MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの
namespace Hoge {
// {}内はHoge名前空間に属する
}
namespaceがなかったら
たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで
さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、
自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する
(重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない)
みたいな事態が発生してしまう
さっきの例だと同名のメソッド(Console.WriteLine)を定義してても
System名前空間とMyNS名前空間で分けたからコンパイルが通る
System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの
MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの
namespace Hoge {
// {}内はHoge名前空間に属する
}
168デフォルトの名無しさん
2020/09/22(火) 06:36:29.84ID:ZtayyY2i 完全にC++の感覚でしか説明できんけど、
あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、
ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い
さらに>>164の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る
ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない)
こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと
あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利
あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、
ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い
さらに>>164の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る
ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない)
こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと
あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利
169デフォルトの名無しさん
2020/09/22(火) 13:09:23.63ID:iGBGeTHm 名前空間を使うと検索性が最悪になる
(別の名前空間の同一名称が引っ掛かりまくる)
みんなどう対処しているんだろう
(別の名前空間の同一名称が引っ掛かりまくる)
みんなどう対処しているんだろう
170デフォルトの名無しさん
2020/09/22(火) 17:08:47.15ID:QYfnOwKH >>169
using namespaceするのが問題じゃない?
using namespaceするのが問題じゃない?
171デフォルトの名無しさん
2020/09/22(火) 17:49:49.66ID:ZtayyY2i いやusingに限らず、例えば>>168で言ったライブラリ作る側(名前空間内で作業する側)はいちいちhoge内なのにhoge::とか書かんでしょ
確かに検索で困ることはたまにある・・
確かに検索で困ることはたまにある・・
172デフォルトの名無しさん
2020/09/22(火) 19:24:25.17ID:Xh0fS725 namespace で絞り込んで、識別名をハイライトして、あとは気合
173デフォルトの名無しさん
2020/10/20(火) 13:37:38.41ID:Mso39Itu C++とVisual C++の違いについてです。
C++はプログラミング言語であり、
VC++は統合開発環境であるという説明があります。
でも私にはVC++がC++++のように見えます。
VC++はC++の文法に新たな流儀を付け加えるか置き換えていて
言語そのものの使用を若干変えているように見えます。
C++のキーワードが別のものに置き換わっていたりするからです。
そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。
この理解は正しいでしょうか。
C++はプログラミング言語であり、
VC++は統合開発環境であるという説明があります。
でも私にはVC++がC++++のように見えます。
VC++はC++の文法に新たな流儀を付け加えるか置き換えていて
言語そのものの使用を若干変えているように見えます。
C++のキーワードが別のものに置き換わっていたりするからです。
そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。
この理解は正しいでしょうか。
174デフォルトの名無しさん
2020/10/20(火) 13:38:19.99ID:Mso39Itu 使用改め仕様
175デフォルトの名無しさん
2020/10/20(火) 14:39:40.58ID:C+6cO9mm 多少違うのは
#pragma くらいだろ
勝手に仕様なんて変えない
統合環境とか API とかはもちろん関係無い話
#pragma くらいだろ
勝手に仕様なんて変えない
統合環境とか API とかはもちろん関係無い話
176デフォルトの名無しさん
2020/10/20(火) 20:36:08.28ID:3YoHPXFg IDEはVisual Studio
VC++はMSのC++商品名
C++/CLIとかを混同してね?
これはC++を独自拡張したものだよ
VC++はMSのC++商品名
C++/CLIとかを混同してね?
これはC++を独自拡張したものだよ
177デフォルトの名無しさん
2020/10/20(火) 22:21:46.71ID:qSDH25Or __declspec(dllimport)とかアホみたいに書かされたあの時代のmsvc拡張c++のことでしょ
178デフォルトの名無しさん
2020/10/21(水) 11:12:14.17ID:xBgAWF1Y 描かずに済むけどな
179デフォルトの名無しさん
2020/10/21(水) 13:51:50.76ID:WStrtR1y C++/CLIは拡張ですか?
いくつかの流儀を置き換えていますよね?
ポインタをハンドルと読んだり?
いくつかの流儀を置き換えていますよね?
ポインタをハンドルと読んだり?
180デフォルトの名無しさん
2020/10/21(水) 14:12:49.21ID:xLl2qqDk MS拡張にしろC++/CLIにしろ既存のコードの挙動を変えるようなことはしてないんでは?
拡張でいいんじゃね
拡張でいいんじゃね
181デフォルトの名無しさん
2020/10/21(水) 18:58:32.20ID:VaRlK94m ポインタはポインタとしか言わんよ
ハンドルは
ハンドルは
182デフォルトの名無しさん
2020/11/24(火) 23:02:59.67ID:uO0ONWsd Visual Studio 2019をインストールしました
Windowsスタートボタン→Visual Studio 2019を起動しました
プロジェクト名を入れて下さい→test001
保存フォルダの場所を決めて下さい→Y:\_source\repos
何かのウインドウが開きました(おそらく開発の統合画面?)
さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません
左の縦に、ツールボックスと表示しています
このままでは進まないので、エクスプローラーでreposフォルダの下に
samp01.txtを新しく作りました
何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました
進め方が間違っているように思えますが、samp01.txtに#define...から
描き始めてよいでしょうか?
統合環境が苦手で、フォルダにテキストファイルを作りテキストエディタで
ソースを書いて保存
コマンドラインでコンパイル、エラーがなければリンク...をしてきました
何かの画面には難しそうなソリューションエクスプローラー、その下には
プロパティウインドウが表示されています。
このウインドウにも慣れないといけないので進め方を教えてください
Windowsスタートボタン→Visual Studio 2019を起動しました
プロジェクト名を入れて下さい→test001
保存フォルダの場所を決めて下さい→Y:\_source\repos
何かのウインドウが開きました(おそらく開発の統合画面?)
さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません
左の縦に、ツールボックスと表示しています
このままでは進まないので、エクスプローラーでreposフォルダの下に
samp01.txtを新しく作りました
何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました
進め方が間違っているように思えますが、samp01.txtに#define...から
描き始めてよいでしょうか?
統合環境が苦手で、フォルダにテキストファイルを作りテキストエディタで
ソースを書いて保存
コマンドラインでコンパイル、エラーがなければリンク...をしてきました
何かの画面には難しそうなソリューションエクスプローラー、その下には
プロパティウインドウが表示されています。
このウインドウにも慣れないといけないので進め方を教えてください
183デフォルトの名無しさん
2020/11/25(水) 07:42:29.85ID:+VuDDc3z184デフォルトの名無しさん
2020/11/25(水) 08:12:43.79ID:1cagBqIs185デフォルトの名無しさん
2020/11/27(金) 09:48:07.00ID:sDMv6Edh186デフォルトの名無しさん
2020/11/27(金) 15:09:19.88ID:8PW9KReU ソリューションエクスプローラーのヘッダーファイル、ソースファイルのとこを右クリックで新規選べばまっさらなファイル作れるし
メニューのファイル→追加?(うろ覚え)でも作れる
メニューのファイル→追加?(うろ覚え)でも作れる
187デフォルトの名無しさん
2020/12/06(日) 23:34:56.54ID:TL07p8cG 手順書のページのURLありがとうございます。
Microsoft Visual Studio Community 2019
Version 16.8.2を使用中。
テキストで#include<stdio.h>から入力しましたが煮詰まりました。ソースはネットを検索してコピペなので、
コロンやセミコロンの間違いはないと思われます。
#include<stdio.h>
int main( void )
{
printf( "ようこそC(++)言語の世界へ\n" );
return 0;
}
タスクバー?にファイル(F)編集(E)表示(V)Git(G)プロジェクト(P)デバッグ(D)テスト(S)・・・があります。
手順書では[プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。]とあります。
が、ビルドメニューがありません。
プルダウンのデバッグ(D)からデバッグ無しで開始したいですが
デバッグ無しで開始が薄い文字になっており、クリックできません。
統合開発環境って皆さんが使用して使いやすいはずですよね。
何から順番にクリックしていくのかさっぱりわかりません。
手順通りにしようとして「ここをクリック」のところはたいていその「ここ」の項目が画面になくて
ソースを書いてコンパイルすらできない、ありません。ありません状態。
同じバージョンでもメニューの項目が違っていたら次に何をするかお手上げです。
お助け下さい。
Microsoft Visual Studio Community 2019
Version 16.8.2を使用中。
テキストで#include<stdio.h>から入力しましたが煮詰まりました。ソースはネットを検索してコピペなので、
コロンやセミコロンの間違いはないと思われます。
#include<stdio.h>
int main( void )
{
printf( "ようこそC(++)言語の世界へ\n" );
return 0;
}
タスクバー?にファイル(F)編集(E)表示(V)Git(G)プロジェクト(P)デバッグ(D)テスト(S)・・・があります。
手順書では[プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。]とあります。
が、ビルドメニューがありません。
プルダウンのデバッグ(D)からデバッグ無しで開始したいですが
デバッグ無しで開始が薄い文字になっており、クリックできません。
統合開発環境って皆さんが使用して使いやすいはずですよね。
何から順番にクリックしていくのかさっぱりわかりません。
手順通りにしようとして「ここをクリック」のところはたいていその「ここ」の項目が画面になくて
ソースを書いてコンパイルすらできない、ありません。ありません状態。
同じバージョンでもメニューの項目が違っていたら次に何をするかお手上げです。
お助け下さい。
189デフォルトの名無しさん
2020/12/07(月) 00:14:40.22ID:MnyC2DM9 アドバイスありがとうございます。
ソリューションエクスプローラー フォルダービューを右側に開いています
そこにhello_.cppが表示されています。いま、開いているファイルです。
#includeからreturnまでペーストしています。
ソリューションエクスプローラーでhello_.cppを右クリックしますと[追加]があります。
[追加]->新しいファイル
新しい項目の追加(W)
新しいフォルダー
この3つを表示します。ソリューションエクスプローラーにhello_.cppが表示されているだけでは不足でしょうか
hello_.cppを右クリック新しいファイルを選ぶと名前を入力になりました
aaaと入力するとツールボックスに新しくテキスト入力タブが表示
#includeからreturnまで貼り付けました
デバッグ無しで開始の文字は薄いままです
ビルドメニューはありません
編集や表示、Git、プロジェクトのメニューを色々クリックしています
変わりません…
何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし
全世界のプログラマの人たちも使っているものですし、なんとか
ビルドメニューを出したいです
ソリューションエクスプローラー フォルダービューを右側に開いています
そこにhello_.cppが表示されています。いま、開いているファイルです。
#includeからreturnまでペーストしています。
ソリューションエクスプローラーでhello_.cppを右クリックしますと[追加]があります。
[追加]->新しいファイル
新しい項目の追加(W)
新しいフォルダー
この3つを表示します。ソリューションエクスプローラーにhello_.cppが表示されているだけでは不足でしょうか
hello_.cppを右クリック新しいファイルを選ぶと名前を入力になりました
aaaと入力するとツールボックスに新しくテキスト入力タブが表示
#includeからreturnまで貼り付けました
デバッグ無しで開始の文字は薄いままです
ビルドメニューはありません
編集や表示、Git、プロジェクトのメニューを色々クリックしています
変わりません…
何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし
全世界のプログラマの人たちも使っているものですし、なんとか
ビルドメニューを出したいです
190デフォルトの名無しさん
2020/12/07(月) 00:18:03.60ID:MnyC2DM9 あちこちクリックしていますと、画面の上に
プロジェクト、ビルド、デバッグの文字が出てきました
ビルド->ソリューションでコード分析を実行を選びます
デバッグ->デバッグ無しで開始は薄い文字でクリックできません
何か手順が不足しているようです
プロジェクト、ビルド、デバッグの文字が出てきました
ビルド->ソリューションでコード分析を実行を選びます
デバッグ->デバッグ無しで開始は薄い文字でクリックできません
何か手順が不足しているようです
191蟻人間 ◆T6xkBnTXz7B0
2020/12/07(月) 00:18:08.82ID:LcHpzYm6 ファイルとフォルダの違い
ソリューションの種類が違う
だろうな
ソリューションの種類が違う
だろうな
192デフォルトの名無しさん
2020/12/07(月) 00:59:54.04ID:MnyC2DM9 不慣れでごめんなさい
デバッグ無しで開始は薄い文字でクリックできず変わらず
本日はそろそろ寝ます
後は明日、使い方と用語を調べます
デバッグ無しで開始は薄い文字でクリックできず変わらず
本日はそろそろ寝ます
後は明日、使い方と用語を調べます
193蟻人間 ◆T6xkBnTXz7B0
2020/12/07(月) 01:04:11.74ID:LcHpzYm6 初心者は素直にチュートリアルの手順に従ってればいいんだよ。
194デフォルトの名無しさん
2020/12/09(水) 03:22:01.70ID:WuZTb4kZ 濡れちゃうう!
195デフォルトの名無しさん
2020/12/12(土) 02:59:14.21ID:a7AUwK+L なにからすればいいの
目標がない
目標がない
196デフォルトの名無しさん
2020/12/12(土) 13:02:07.54ID:A7m2fOl0 「何かしたい」というものが無いならば、しなくてどうぞ。
「何かしたい」というものが有る人は、自分で行動する。
「何かしたい」というものが有る人は、自分で行動する。
197はちみつ餃子 ◆8X2XSCHEME
2020/12/12(土) 13:39:37.52ID:UUApGKPR 質問サイトにある質問に (根拠になる一次資料 (主に仕様書の具体的な項目) と共に) 回答するのを繰り返せば
特定のプログラミング言語に詳しくなることは出来るよ。
それでプログラミングを出来るようになるかどうかはわからんけど。
特定のプログラミング言語に詳しくなることは出来るよ。
それでプログラミングを出来るようになるかどうかはわからんけど。
198デフォルトの名無しさん
2020/12/12(土) 13:47:09.92ID:k8hTa554 「人工知能搭載の人型アンドロイドが作りたい」
という目標を持つ者が
「printfで文字列を表示したい」
という目標を持つのはとてもつらい
という目標を持つ者が
「printfで文字列を表示したい」
という目標を持つのはとてもつらい
199デフォルトの名無しさん
2020/12/12(土) 18:31:18.09ID:KTyXxWQ0 今日は国会図書館に行ってきたわ。
200デフォルトの名無しさん
2020/12/12(土) 18:34:21.54ID:KTyXxWQ0 国会図書館は国会議事堂内に分室があって資料を取り寄せて閲覧できるんですよ。
でも、ほとんど利用実績が無いらしいんですね。
でも、ほとんど利用実績が無いらしいんですね。
201デフォルトの名無しさん
2020/12/12(土) 19:52:44.57ID:KTyXxWQ0 国会図書館は若い女性と、男性は老人が多かったです。
土曜日だからかもしれません。
資料のコピーは長蛇の列が出来ていました。
あの列で感染するんでしょうね。
女性のメガネ率は8割超えてました。
おそらくドクター持ちでしょうね。
土曜日だからかもしれません。
資料のコピーは長蛇の列が出来ていました。
あの列で感染するんでしょうね。
女性のメガネ率は8割超えてました。
おそらくドクター持ちでしょうね。
202デフォルトの名無しさん
2021/02/08(月) 19:09:45.85ID:UEWD7mIf m1 macbookでc言語始めるのには何が必要ですか?
c言語を始めるパッケージとかって売ってるんですか?
それともフリーソフトでダウンロード出来るんですか?
学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。
c言語を始めるパッケージとかって売ってるんですか?
それともフリーソフトでダウンロード出来るんですか?
学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】中国、水産物輸入停止と通達 「処理水」理由、日本政府へ ★3 [おっさん友の会★]
- 【速報】中国、水産物輸入停止と通達 日本政府に ★2 [おっさん友の会★]
- 【速報】中国、水産物輸入停止と通達 「処理水」理由、日本政府へ ★4 [おっさん友の会★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 [ぐれ★]
- 中国側が首相答弁の撤回要求、日本側拒否★6 [夜のけいちゃん★]
- 【速報】 米大使「はっきりさせておこう、米国は尖閣諸島含め日本の防衛に全面コミット、中国がどうしようが変わらない」 [お断り★]
- 【速報】高市首相「つい言い過ぎた」 存立危機事態の答弁について [237216734]
- 【ネトウヨ朗報】イギリスのトラス元首相、高市有事で高市早苗の支持を表明 [603416639]
- 【高市訃報】ホタテ業者、死亡😇😇😇 [573041775]
- 【速報】中国、水産物輸入停止★2 [989870298]
- 立憲岡田「高市さんはなぜ慎重な答弁をされなかったのか。非常に残念に思っている」 [834922174]
- 【悲報】斎藤元彦陣営のネット広報担当会社が投稿したnoteで騒然 ★950 [931948549]
