0からの、超初心者C++相談室

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室
2023/11/26(日) 14:18:15.64ID:k38CbPq9
>>652
伝えようとしない態度を批判してるところに対して伝わらないことを書くのやめろよ。
何が言いたいんだ?
2023/11/26(日) 14:34:29.20ID:mssmbX4x
自己正当化しか考えてない人格破綻者に道理を教えてやる気は無い、自分で考えろ

ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって
C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね
C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。

荒らす気は無いのでこれで終わりにする
2023/11/26(日) 14:42:52.42ID:k38CbPq9
完璧に把握しろなんて一度でも俺が書いた箇所があるなら指摘してくれよ。
書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?
2023/11/26(日) 14:55:17.55ID:k38CbPq9
資料(この場合は入門書)を読んでから手を動かして学ぶというごく普通の手順を主張してるつもりだが、むしろそうじゃない方法でどうするのがよいと考えてるんだ?
学校だって座学でやったことを演習で実践してるだろう。
657デフォルトの名無しさん
垢版 |
2023/11/26(日) 15:50:55.41ID:DTfcWvWZ
気にするなってほぼ嫉妬なんだから
2023/11/26(日) 16:03:14.03ID:t0WQFMSf
>ほぼ嫉妬
俺に言ってんの?
いずれにせよ荒らそうとしてる自覚はあるか?
2023/11/26(日) 16:08:02.37ID:Dy8SO9u0
>>658
どう考えてもお前が荒らしじゃん
人のことをアホ呼ばわりしてるし
2023/11/26(日) 16:22:42.40ID:t0WQFMSf
>>642=645=659 バレバレだからwww
661デフォルトの名無しさん
垢版 |
2023/11/26(日) 18:08:35.12ID:fCQnoW9K
>>655
言語仕様・未定義動作・処理系とか言ってたから完璧に把握しろに近いニュアンスだと感じた
メソッドではなくメンバ関数、用語を正しくつかわないと伝わらないとか言ってることがどんどん変わってる
2023/11/26(日) 18:08:55.12ID:4RSi5A29
お取り込み中すみませんが質問です
ダウンキャストという用語が是か非かです

ボクは不適切な用語だと思っていて
理由は
1) 言語の仕様に出てきていない
2) アップかダウンかについてももちろん仕様に無い
3) アップキャスト相当の操作は通常行わない
です

少なくともC++界隈でちゃんとした定義なんて出てこないですよね?
2023/11/26(日) 20:14:28.93ID:k38CbPq9
>>662
仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
原則としては C++ 用語ではないと考えて良いと思う。
クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
方向をアップ/ダウンで言うのもおかしな話だし。

derived-to-base convertion というような用語は仕様書の文面にもあるので
アップキャストに相当するのはこの用語のはずだけど
base-to-derived convertion という用語は出てこないので
ダウンキャストに相当する直接の用語はなさそう。
冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。

ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。
to が脱落したらだいぶん雰囲気が変わってしまうでないの。
これは真似しないほうがいいかもね。

ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも
アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので
なんだかんだで一語で表せるってのは便利なんだと思う。
私は使わないようにしているけど。
2023/11/26(日) 20:20:37.65ID:k38CbPq9
すまぬ。 綴りが間違えてた。 concertion じゃなくて conversion だった。
2023/11/26(日) 20:28:40.49ID:4RSi5A29
レスサンクス
お手数おかけして痛み入ります

> 3) アップキャスト相当の操作は通常行わない

B *b = (B *)d; // もしもこれが必要な世界だったら
使い分ける?ための用語が欲しくなるのはまだわかるけど
D *d = (D *)b; // こっち方向にしかキャストしないんだから
区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない

…とはいえボクがいくらこう考えても
みんながそうじゃないから蔓延ってるわけで

> 私は使わないようにしているけど。

その一言で何か救われた気分になりました
2023/11/26(日) 20:32:07.21ID:4RSi5A29
一応補足

> B *b = (B *)d; // もしもこれが必要な世界だったら

B *b = d; // こう書くだけじゃ許されなくて
2023/11/26(日) 20:37:16.38ID:Dy8SO9u0
ダウンキャストって言葉は普通に使われてると思うが…
日本語版のウィキペディアなら

C++ - Wikipedia
https://ja.wikipedia.org/wiki/C%2B%2B
に「dynamic_castは基底オブジェクトから派生オブジェクトへの変換(ダウンキャスト)を実行時に安全に行うための演算子である」とある

英語版ウィキペディアなら
Downcasting - Wikipedia
https://en.wikipedia.org/wiki/Downcasting

マイクロソフトのリファレンスなら
dynamic_cast 演算子 | Microsoft Learn
https://learn.microsoft.com/ja-jp/cpp/cpp/dynamic-cast-operator
にアップキャストとダウンキャストのことが書かれてる
2023/11/26(日) 20:47:28.85ID:4RSi5A29
rustに至っては嘆かわしいことに
https://doc.rust-lang.org/std/any/trait.Any.html
> pub fn downcast<T>(self) -> Result<Box<T, A>, Box<dyn Any, A>> where T: Any,

上記トレイトのメソッド名に採用されている
あー虚しい
あーヤダヤダ
2023/11/26(日) 20:59:53.00ID:mssmbX4x
>>667
使われてるけど規格に定義があるような正式な用語ではないってことだろ
2023/11/26(日) 21:20:56.75ID:k38CbPq9
>>665
むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。
ポインタを経由せずに値を直接キャストすることもありうるし
参照の場合かもしれない。

class foo {};
struct bar : public foo {};

int main() {
auto a = bar();
// bar から foo へのアップキャストってどれのこと?
auto b = static_cast<foo>(a);
auto c = static_cast<foo *>(&a);
auto &d = static_cast<foo &>(a);
}
2023/11/26(日) 21:48:36.05ID:Dy8SO9u0
>>669
一応マイクロソフトのリファレンスは正式だと思うが
まあマイクロソフト独自の規格ってなるのだろうけどな
あんなもんは認めないというのなら仕方あるまい
2023/11/26(日) 21:52:47.74ID:DTfcWvWZ
>>663
>仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
>原則としては C++ 用語ではないと考えて良いと思う。
>クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
>方向をアップ/ダウンで言うのもおかしな話だし。
upcastとdowncastって一般名詞なのではないかな?
2023/11/26(日) 21:57:36.24ID:mssmbX4x
>>671
デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない
2023/11/26(日) 22:15:54.01ID:Dy8SO9u0
>>673
デファクトスタンダード
それだ

大正解
2023/11/26(日) 23:34:44.38ID:k38CbPq9
言語仕様の説明をするときには >>670 のようなバリエーションの内のどれのことを言っているかで
事情が変わってくるので結局は具体的な場合を示さなければならず、
「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。
(より詳細な場合分けをするので用語を使う機会がない。)

逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは
充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。

どうせ説明を付け足すなら用語の甲斐がないので
使う意味もそんなにないように思う。

念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので
そうではない状況で文脈を共有できていて
「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。
676デフォルトの名無しさん
垢版 |
2023/11/27(月) 04:54:45.36ID:tiJqQBXv
オナニー解答
677デフォルトの名無しさん
垢版 |
2023/11/27(月) 08:10:08.19ID:8c8BDf1i
相変わらずはちみちはめんどくせーな
678デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:35:39.43ID:7/k6/GSg
>>651
違う言語で比較するときはそういう用語の使い方になるケースが多いと感じる
「學んでいない」のとはまた別の問題だと思う
679デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:39:16.20ID:7/k6/GSg
>>656
あいつは學校行ってないかも知れないな
なんでも試行錯誤で
挙句ChatGPTが完璧に教えてくれると勘違いしている
救えない
680デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:41:27.50ID:7/k6/GSg
>>662
「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
681デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:52:51.04ID:7/k6/GSg
>>675-677
アスペ臭を感じる
682デフォルトの名無しさん
垢版 |
2023/11/27(月) 14:40:19.25ID:UqO8a829
アスペルガー症候群だって良いじゃないか?
何で差別的なことを書くのかね?
2023/11/28(火) 00:01:54.69ID:5UazaCro
クラス内からのみ参照する定数配列のベストな書き方を模索しています。

まず
1、constメンバ変数にする方法。ヘッダに書くだけで手軽だが、オブジェクト生成のたびに領域が取られてしまい資源浪費。

2、staticメンバにする方法。
.h
static const int TABLE[3];
.cpp
const int TABLE[3]={1,2,3};

エラー。ほかに、{1,2,3}の場所をhに移動してみたりしたがすべてエラーになり断念。

3、cppにのみに書きhには書かない。
.cpp
const int TABLE[3]={1,2,3};
エラーにならず良好。ただこれだとクラス無関係のC風の書き方なので、別の翻訳単位とよ間で名前の衝突が起きうる?

名前の衝突なく、メモリ占有はただ一個で、資源節約につながるならconstexprも活用したい。ベストな書き方はどうなりますか。

constexprは上のconstを置き換えて試しましたが2ではエラー解消せずでした。
2023/11/28(火) 00:04:59.65ID:5UazaCro
2のcppは

const int クラス名::TABLE[3]={1,2,3};

も試したはずですがエラー解消しませんでした。
2023/11/28(火) 00:37:23.98ID:dISnZSIc
2で通るはずだけどなぁ・・・ヘッダインクルードしてないとか?はさすがに無いか
あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)
2023/11/28(火) 01:08:09.85ID:dISnZSIc
あ、ごめん2で通るはずってのはcpp側がクラス名::TABLEの場合
687デフォルトの名無しさん
垢版 |
2023/11/28(火) 06:02:30.27ID:fb4KLmhh
2、staticメンバにする方法。
.h
static const int TABLE[3]={1,2,3};
.cpp
extern const int TABLE[3];

もれはやらんけど
688デフォルトの名無しさん
垢版 |
2023/11/28(火) 06:13:38.37ID:fb4KLmhh
あ、ごめん逆だった
.cpp
static const int TABLE[3]={1,2,3};
.h
extern const int TABLE[3];
2023/11/28(火) 10:21:56.36ID:tbacT9e+
>>684
これは通るだろ? コンパイラは何よ?
2023/11/28(火) 10:25:57.66ID:mRTkdYl9
>>684
出来なかったというコードをそのまま提示して欲しい。
状況がよくわからないのに想像で対処法を考えてもしょうがない。
コードがちょっと長くなるなら
codetter とか wandbox とか ideone とかを使って。
691デフォルトの名無しさん
垢版 |
2023/11/28(火) 10:27:57.27ID:vcMwjchf
クラス内の定数を外部に生出しとかしないから
enunとかで宣言はするけど
何番目が欲しいとかはサービス関数作るしなぁ
692デフォルトの名無しさん
垢版 |
2023/11/28(火) 10:30:15.59ID:vcMwjchf
つか、static宣言の内部でしか使わないものを何でヘッダーファイルに書くの?
693デフォルトの名無しさん
垢版 |
2023/11/28(火) 10:32:49.40ID:vcMwjchf
ヘッダーファイルはクラスコードの名刺みたいなもんで
外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ
694デフォルトの名無しさん
垢版 |
2023/11/28(火) 10:35:09.02ID:vcMwjchf
マジックナンバー避ける為に#defineするとかも、cpp側の先頭に書くと、全ビルドしなくて済むしな
695デフォルトの名無しさん
垢版 |
2023/11/28(火) 11:07:40.67ID:t7+ip2Xg
>>692
staticには複数の意味がある

>>683 の発想は h に static 描いてみたら「たまたま」エラーが消えたら ok みたいなやり方なんだろ
696デフォルトの名無しさん
垢版 |
2023/11/28(火) 11:35:51.07ID:vcMwjchf
>>695
staticより「内部でしか使わない」って話の方を拾ってね
2023/11/28(火) 12:43:41.53ID:dISnZSIc
>>696
質問者は「クラス内からのみ参照する」って言ってただろ
698デフォルトの名無しさん
垢版 |
2023/11/28(火) 18:17:05.00ID:vcMwjchf
>>697
それならヘッダーファイルに書く必要無いやんけw
2023/11/28(火) 18:50:50.78ID:dISnZSIc
そら綺麗に一つのcppに全部そのクラスの実装を切り分けてるならcpp内にstaticでいいだろうけどね
700デフォルトの名無しさん
垢版 |
2023/11/28(火) 20:09:09.84ID:vcMwjchf
そんな巨大なクラスは設計が間違ってないか?
2023/11/28(火) 20:12:44.23ID:bqHRuT95
>>680
> 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される

それなw
初心者ほどこの用語を使ってるように見える
初心者が集まるところでこれを流布してるやつがおるんやろな
ポインタへのポインタっていうスケーラブルな定義が理解できてなくて
アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな
2023/11/28(火) 20:20:10.37ID:mRTkdYl9
>>700
この >>699 の言は逆のことを言ってると思う。
ひとつの翻訳単位にたくさんのクラス (の実装部分) を書くこともあるから
ファイルスコープにしたらスコープの範囲が広すぎる (制限にならん) やんけと言ってるように読める。
2023/11/28(火) 20:27:35.33ID:dISnZSIc
>>700
巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど)
例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる
そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ
2023/11/28(火) 20:29:47.21ID:dISnZSIc
>>702
もちろんそれもある
2023/11/28(火) 20:57:18.00ID:dISnZSIc
まぁどれを選ぶかは本人の都合だけど、クラス定義の中にprivateで書くのが自然っちゃ自然な希ガス
706デフォルトの名無しさん
垢版 |
2023/11/28(火) 21:00:29.03ID:HOP5xTTo
>例えばクラステンプレートになると、ソースに実装を書けないから

C++の設計ミスだな
特にテンプレ
707デフォルトの名無しさん
垢版 |
2023/11/28(火) 21:55:43.79ID:vcMwjchf
テンプレートは単なる#defineだからなぁ
あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ
2023/11/28(火) 22:43:12.61ID:mRTkdYl9
一応はモジュールの概念の導入でちょっと良くなっているはずだが皆でこぞって移行するってほどには全然なってないからそこまで魅力的とは思われてないんやろね。
従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。
コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。
2023/11/28(火) 23:00:59.77ID:5UazaCro
どうも>>683です。
2のクラス名あり版でビルド通りました。

-sample.h
class sample_1 {
int a;
static const int TBL[3];
public:
sample_1();
};

-sample.cpp
#include "sample.h"
#include <iostream>

const int sample_1::TBL[3] = {1,2,3};

sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}

-main.cpp
#include <iostream>
#include "sample.h"

int main() {

sample_1 sa;
return 0;
}
2023/11/28(火) 23:06:12.31ID:5UazaCro
sample.hにTBL宣言なしで、

sample.cpp
#include "sample.h"
#include <iostream>

static const int TBL[3] = {1,2,3};

sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}

でもOKでした。こちらのstaticはC式の使い方ですね。

私はTBLが.hに現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。
2023/11/28(火) 23:19:21.29ID:dISnZSIc
解決おめ、自分の用途に合うと感じるならそれがベストと思うよ
2023/11/29(水) 06:23:02.71ID:n75oaT1g
h に static 描くと単に相互干渉しないってだけで
インスタンスは造られまくって無駄リソース出まくるんじゃね
713デフォルトの名無しさん
垢版 |
2023/11/29(水) 09:24:39.36ID:5+1qDy8t
奴は人の書き込み見ちゃいないよw
2023/11/30(木) 22:28:52.60ID:p6G1t8dm
sizeof(クラス名)を活用できる場面はありますか。
メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、
クラス一般について考えると思いつきません。

たとえば
std::string name;
がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。
2023/11/30(木) 22:39:03.15ID:jq+Wc58z
>>714
>std::string name;
>がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
確認してみましょう!
2023/11/30(木) 23:39:52.07ID:3QI4e6Tt
>>714
sizeof 演算子の適用結果は定数であることが保証される。
定数式として使うことができる。
std::string なども型の大きさが変動したりはしない。

C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。
(実際には処理系の拡張として VLA を使える場合もある。)

メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。
それほど機会は多くないだろうけど。

本来 (?) の用途とは違うところで使われる場合もあって、
いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。
2023/11/30(木) 23:55:15.59ID:p6G1t8dm
>>716
高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。
718デフォルトの名無しさん
垢版 |
2023/12/01(金) 10:06:48.86ID:NZuUNSBe
おまえら、stdとboostどう使い分けてる?
2023/12/01(金) 13:58:15.55ID:aU4DjGEJ
>>717
stringも実際には確保したメモリのポインタと文字列サイズを持ってるだけ(だけではないけど簡単に言えば)なので
Cの構造体と大して変わらんのよ
2023/12/02(土) 07:29:47.55ID:qIqFVuKn
まず鍵を与え、文字列を暗号化等して暗号文文字列を返したい。

暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。

どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。
暗号化等には既製ライブラリ使います。
2023/12/02(土) 09:03:43.92ID:w8ZlbPjQ
>>720
設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。
というよりも継承を使うほうが悪い。
「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。

プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?
2023/12/02(土) 11:45:21.73ID:w8ZlbPjQ
他の選択肢としてはストリームのアダプタにするとかいう方法も思いつく。
極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。
自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。
723デフォルトの名無しさん
垢版 |
2023/12/02(土) 12:16:48.61ID:0tC7Yjqi
sqliteとかの(暗号化もあるけど)暗号化しないバージョンのDBを使ってて
書き込むとき勝手に暗号化してくれると有難いな
2023/12/02(土) 13:25:55.77ID:JgaBxQHi
ここはプログラム技術板だぞ 自分で作れ
725デフォルトの名無しさん
垢版 |
2023/12/03(日) 06:49:36.39ID:xZHPSaOR
このスレはC++の話ではない書き込みが多すぎる
2023/12/03(日) 11:07:00.27ID:QTewqrs7
C++の守備範囲が広いんよ
2023/12/03(日) 21:36:41.23ID:kkqQUehZ
>>721
ありがとう。
非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。
string 暗号化(鍵, 平文);
だけあれば十分だと。
2023/12/04(月) 21:09:04.65ID:wzr7hFvb
msys2で開発環境を作りたくて
Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして
g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが
std::ifstream ifs("hoge.txt");
のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。
fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。
どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?
2023/12/04(月) 22:11:21.42ID:+6ZMbPCa
エラーメッセージは?
2023/12/05(火) 00:16:37.88ID:z5PiblaY
msys2 環境は数種類のモードがあるはずだがどれで起動した?
2023/12/05(火) 04:57:07.09ID:DXGBHl1O
実行ファイルの場所がカレントになってないんだろ
getcwd()してみ
732728
垢版 |
2023/12/12(火) 14:02:16.36ID:haJQSzRG
エラーは何もなくて変数に何も格納されてない状態だったので原因よくわかりませんでしたが
今回は>>731さんの言う通りになっていて解決できました
まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します
ありがとうございました!
2023/12/12(火) 15:14:22.81ID:bMo3JLCK
GUIから起動するとカレントディレクトリがホームになるんだったっけ?
2023/12/13(水) 15:23:50.85ID:Xh1qTD5r
OSの事情でカレントが簡単に移動してしまうのがめんどいな
735デフォルトの名無しさん
垢版 |
2023/12/13(水) 16:17:33.78ID:b3+IUHNQ
プログラムの実行に必要な設定ファイルやデータファイルはカレントディレクトリではなく実行ファイルのパスを基準に決めたほうがいいね
2023/12/13(水) 17:12:54.61ID:vPv7AHCs
設定ファイルの類いは AppData フォルダに置くのがこのましいということになってる。
アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。
逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。
Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。
2023/12/13(水) 17:14:51.41ID:Xh1qTD5r
起動時の引数や 自分のフルパスを取得するAPI経由で
実行ファイルのある場所を基点にどうこうすることが多いわ (Windows

unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか
起動時のカレントのまま?
738デフォルトの名無しさん
垢版 |
2023/12/13(水) 17:20:10.83ID:b3+IUHNQ
>>736
それはインストーラー使うアプリでしょ?
XCOPYインストールアプリの話だよ
739デフォルトの名無しさん
垢版 |
2023/12/13(水) 17:23:03.86ID:HyXW4bJ5
カレントじゃ無くて、アプリが実行されたディレクトリに一緒に置いとくもんだろ?
ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?
2023/12/13(水) 18:03:20.75ID:vPv7AHCs
>>739
基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。
scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。
Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。
2023/12/13(水) 23:12:49.25ID:zjCiNOvz
グローバル位置に宣言したオブジェクトはmain前にコンストラクタが実行されますね。
仕様ではmain前に実行ということのほかに何か規定はありますか。

ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。
2023/12/14(木) 00:23:02.09ID:GWgG2Hfk
>>741
ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。

・ 定数初期化が終わってから動的初期化がされる
・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい)
・ 翻訳単位内の初期化順序は定義が現れた順序
・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない

特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、
強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。
2023/12/14(木) 01:04:36.74ID:X6Ol8Z5z
普通は、WSL2 でLinux を使う

MSYS2/MinGW の利点は、
hypervisor で、2つのOS を起動しないから軽い

WSL2 では、Linux側から、Windows 側のアプリも起動できる。
ただし例えば、powershell ではなく、powershell.exe と拡張子も付ける

例えばpowershellで、Windows側のフォルダ内の一覧を表示して、Linuxのgrep で絞り込む

/mnt/c/Users/ユーザー名/Documents$ powershell.exe ls | grep クイ

出力
d----- 2015/10/13 13:52 クイズ

VSCode の拡張機能・Code Runner は、
右クリックメニューから、選択したコード、またはファイル全体を実行する

この設定をチェックしておく
Code-runner: File Directory As Cwd
Whether to use the directory of the file to be executed as the working directory.

そうすると実行時にcd で、そのファイルがある場所へ、カレントディレクトリを移動してから、
そのファイルをコンパイルして実行する

設定項目、executorMap には、多くの言語の実行コマンドが書いてある。
"code-runner.executorMap": {

"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
2023/12/31(日) 22:48:46.98ID:tpduSr4A
相談室から誘導されたのでこちらで
http://mevius.5ch.net/test/read.cgi/tech/1698705458/104

buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?
745デフォルトの名無しさん
垢版 |
2024/01/01(月) 01:29:30.25ID:/rCM9JK/
このスレッドはゼロからC++と言っているが、C言語を知っている前提になっているよなw
2024/01/02(火) 11:00:49.80ID:TDOOgc4U
ワシも割と長く底辺コピペプログラマだけどなんでそんな詳しくなれるの?ってなる
有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか
747デフォルトの名無しさん
垢版 |
2024/01/02(火) 20:21:16.21ID:G9bvfkvl
>>746
頭の出来で決まっているからね

義務教育レベルで脱落した人間、日本語能力に問題がある人間は、プログラマーとしても問題がある。
2024/01/02(火) 21:40:20.68ID:RkRzwbey
知識は入れないと増えないというすごく当たり前の話。
長く放置してたら勝手に増えるなんてことはないよ。
2024/01/03(水) 08:18:02.54ID:3n4RUKo6
ガキの頃からマイコンBASICマガジン見てたけど
PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな
750デフォルトの名無しさん
垢版 |
2024/01/03(水) 08:26:31.48ID:uKn1SmuA
糞コテが
751デフォルトの名無しさん
垢版 |
2024/01/03(水) 13:07:46.32ID:3mJitcl/
>>749
SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?
2024/01/03(水) 13:17:11.92ID:SgwYv7hO
ポケコン触ってたころが一番楽しかったです
手の中に物理キーボードと実行環境があるんだもん
一生遊べるよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。