C++相談室 part152

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/07/12(日) 13:42:20.13ID:TX1mpKr6
https://mevius.5ch.net/test/read.cgi/tech/1589424805/
154デフォルトの名無しさん
垢版 |
2020/08/24(月) 14:23:21.21ID:2j0RwZQH
「#pragmaは禁止」とあったので、そうだと判断しています。

もしこれが必ずしも#pragma pack(1)も禁止というわけではないなら、一度担当者に確認してみようと思います。
155デフォルトの名無しさん
垢版 |
2020/08/24(月) 14:33:52.11ID:2j0RwZQH
>>153
ありがとうございます。
そのようにしようと思います。

様々なアドバイスをいただき、私の考え方や疑問に思う部分が誤っていたと感じました。
これからはもっと広い視野で考えられるように頑張ります。
2020/08/24(月) 14:38:21.49ID:lUUB+Gis
#include <pshpack1.h>
2020/08/24(月) 20:32:07.30ID:0b6x/pxR
環境依存しない方法なんてないよ
int, short, longのバイト数すら環境依存なんだから
環境依存が嫌ならC++使うこと自体が間違い
2020/08/24(月) 20:39:16.80ID:hO98kfNk
#include <cstdint>知らなさそうだね
2020/08/25(火) 00:20:38.83ID:GVKOVEUV
明示的にパディング入れる方がかえって小細工になったりして…
パディング前:
struct Foo {
 int16_t m_someWord;
 // ここに明示的にパディングを入れる
 int32_t m_someDoubleWord;
 int16_t GetSomeWord() const { return m_someWord; }
};

明示的パディング後(1):
struct Foo {
 int32_t m_someWordInDWord; // 32 bit境界に隙間無くパディング入ったやたー!
 int32_t m_someDoubleWord;
 int16_t GetSomeWord() const { return (m_someWordInDoubleWord >> 16); } // OOPS! 欲しい16 bitの位置がホストのエンディアン次第で変わるorz
};

明示的パディング後(2):
struct Foo {
 uint8_t m_someWordInBytes[4]; // 32 bit境界に隙間無くパディング入ったやたー!今度はしくじらないのですよ
 int32_t m_someDoubleWord;
 int16_t GetSomeWord() const { return ((uint16_t)m_someWordInBytes[1] << 16) | (uint16_t)m_someWordInBytes[0]; } // |||OTL
};
2020/08/25(火) 07:35:37.57ID:IvfDNlgu
int16_tが欲しいのに他の型使ったらそりゃ。
161デフォルトの名無しさん
垢版 |
2020/08/25(火) 09:32:18.95ID:ILy/WoQ4
逆だな。
C言語を使うといくらでも環境依存のものを作れそうな気持ちにさせる
2020/08/25(火) 09:50:55.63ID:DOmxfygr
環境非依存て聞こえはいいけど色んな機種の機能の積集合でできることだかんな
2020/08/25(火) 10:21:10.89ID:z55E+4lG
Unix文化とWindows文化の違いがあって、
Unixでは、OSよりもC言語によって、ハードウェアの違いを吸収する思想だった。
この思想では、バイナリ互換ではなく、ソース互換を目指し、
異なるOSやCPUに対しても、Cのソースを再コンパイルして対応しようとした。

一方、Windows文化では、最初から互換性のあるCPUを使うことが前提であり、
OSがCPU以外のハードウェアの違いを吸収することで、バイナリレベルで互換性を
維持する思想であった。
この思想では、異なるOSやCPUをターゲットにすることは想定されていない変わりに、
ハードウェアの違いは、互換性のある(単一の)OSをハードウェアに乗せることに
よって吸収しようとした。

なので、GNUやgccなど、Unix文化からきたプログラムでは、徹底的に#ifなどで
場合分けして互換性を維持しようとしているのに対し、Windowsから来たプログラム
ではそのような場合分けはしていない。

また、Unix文化でも、#if によってソースを場合分けすることで対応していることが
ほとんどで、何の場合分けも無いソースで対応できている訳ではない。
2020/08/25(火) 11:00:39.10ID:8PaZBEwq
[要出典]
165デフォルトの名無しさん
垢版 |
2020/08/25(火) 11:11:45.82ID:Zt9gBA2M
htons とか ntohl とか最強
2020/08/25(火) 12:41:01.28ID:72rzjRbk
C++を検索するときの技で上手い方法ありますか?
ググる、アマゾン、図書館での検索など
勉強しようとしても検索できないです
2020/08/25(火) 12:45:40.95ID:KRGfI1UY
コンパイラーのエラー文で投げたら大抵その言語で釣れると思うけどなぁ
168デフォルトの名無しさん
垢版 |
2020/08/25(火) 12:56:51.05ID:qQcORjN3
ぐぐるときは
hoge -ruby -java -javascript -php -sejuku -techacademy -teratail
2020/08/25(火) 13:08:39.95ID:3B5pz6IO
−ヤフーゴミ袋
2020/08/25(火) 13:10:33.24ID:V6jdFuMQ
>>166
検索して出てきた情報を理解するための基礎的な力が無いんじゃね?
ググれば何でも即解決できるわけではないよ
愚直にC++の入門書を買って順を追って系統立てて、C++の基本的な概念や用語を理解していく必要がありそう
もしかすると、C++より前に他の言語でそれをやってプログラミングの基本的なところから土台を踏み固めておかないとダメかも
2020/08/25(火) 13:25:38.78ID:YCpmFLs5
「勉強」がどのレベルなのか分からないとなんとも言えない
直感で言うとC++の入門書なんでもいいから一冊買ってやりなさい
2020/08/25(火) 13:56:10.27ID:xuORV4zd
>>166
俺も >>170 に同意だわ。
基礎的な考え方が身に付いてないと個別の説明を見ても意味わからん。
検索するにしたって検索に適当な語句を選択するだけの知識は要るしな。

用語は大事。
概念を分割して定義を積み重ねるのが体系化だし、
定義は用語の定義として現れることが多い。
用語がわかると色々わかる。
2020/08/25(火) 14:26:43.50ID:72rzjRbk
「C++」で検索ができないんだが
PCの設定がダメなのかな
これから情報を得るために検索くらいしたいんだけど
本買いたくても出てこない
図書館へは行ったけどC++は貸出中で予約も数件入ってるらしい
+のフォントが変なのか?
2020/08/25(火) 14:29:17.40ID:y+wyfPxz
>>168
-qiitaが抜けてる
2020/08/25(火) 14:32:45.54ID:xuORV4zd
>>173
俺の手元だと、グーグルでもアマゾンでも C++ で検索できてるがなぁ……。
ダブルクォートで囲って "C++" にしたらより確実に C++ が含まれるページが検索される。
2020/08/25(火) 14:43:38.93ID:z55E+4lG
twitter は、C++ や C# を検索できない。"C++" や "C#" としても駄目。
なので、cpp OR cplusplus とすると良いと言われているが、
個人的には、これは、twitter を作った人の C++ や C# を弱まらせるための策略
だと思っている。
2020/08/25(火) 14:49:20.21ID:8QbTjnzx
なんか流れにしれっとキチガイ混じっとるな
2020/08/25(火) 14:50:58.98ID:H1PjAHfj
アメリカはそういう国で、
彼らは、自分のためなら何をやっても文句は言わせない的な心持でいる。
2020/08/25(火) 14:57:06.54ID:72rzjRbk
>>176
ありがと
cplusplusで検索できました
2020/08/25(火) 15:16:32.29ID:YCpmFLs5
勘違いで御高説垂れてた奴wwww
2020/08/25(火) 20:28:52.64ID:Ascep3nh
何故かyahooでリアルタイム検索ではC++で検索できる
2020/08/25(火) 23:48:37.58ID:zCjig7ks
シープラプラとか
チンチンブラブラみたいな名前付けやがって
たぬき砲でいいよなもう
2020/08/25(火) 23:56:18.23ID:zCjig7ks
Cよりもちょっと背伸びした意識高い系狙ってみましたみたいなキモいネーミングセンス
2020/08/26(水) 00:15:37.56ID:DrItK79l
>>183
ちょっとどころじゃねーよ馬鹿
お前みたいな低能にはC++は無理
2020/08/26(水) 00:16:50.63ID:1Tu0I/K+
あーキモい(゚〇゚)キモい
2020/08/26(水) 01:00:49.72ID:Yn/rXsvn
キーッ! もういい! (駄洒落)
187デフォルトの名無しさん
垢版 |
2020/08/26(水) 01:32:11.23ID:NYX2/iU2
CRTP(奇妙に再帰したテンプレートパターン)ってどんなときに使うの?
template <class Derived>
struct Base {
static void interface() {
...
Derived::static_interface();
...
}
};
struct Hoge : Base<Hoge> {
static void static_interface() { ... }
};
通常の継承とは依存関係が逆になってるというのはわかるけど
具体的にどんなケースで便利なのかいまいちピンとこない...
188デフォルトの名無しさん
垢版 |
2020/08/26(水) 02:37:52.45ID:oEB3gdtA
速度重視のときじゃないかな。
ATL/WTLがCRTP使ってると思ったけど。
メリットとデメリットを比べるとデメリットが上回ってるような気がするな。
ぼくは構文解析器の合成にCRTPを使いましたが、合成の頻度が非常に少ないので、使った感じです。
189デフォルトの名無しさん
垢版 |
2020/08/26(水) 02:49:00.89ID:oEB3gdtA
仮想関数の代わりにCRTPを使うと呼び出しコストが無くなる・・・的な使い方で、便利にはならないと思う。

というより、めんどくさくなるだけ。
190デフォルトの名無しさん
垢版 |
2020/08/26(水) 07:05:25.59ID:NYX2/iU2
なるほどどうしてもパフォーマンスが気になるときに使うものって感じですかね
2020/08/26(水) 10:20:21.13ID:2Yv7E1bU
というより、動的な多態は不要だが静的な多態が必要で、
かつ派生クラスの型情報がどうしても必要なときに使うもんだと思う
クラステンプレートであれこれやってるうちに必要な場面が出てくるかと
192デフォルトの名無しさん
垢版 |
2020/08/26(水) 11:43:55.11ID:KrF5vX4s
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ

VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
2020/08/26(水) 13:51:37.26ID:CU/Sbvp9
派生クラスの型情報を静的に使うというのはstatic_castでのダウンキャストだな
2020/08/26(水) 18:43:05.84ID:UQhlb7Hi
Derivedを引数にとる比較演算子を生成するみたいなことは継承だと無理そう。
2020/08/26(水) 19:52:17.80ID:IvFDW58Y
基底と言いつつテンプレートでガッツリ派生型の名前が入ってるわけで
他の派生型を持つ基底を一括してコンテナに入れるとかできないしあまり意味を感じないな
2020/08/26(水) 23:36:52.30ID:BTqRZu5v
そもそもポリモ目的でやるもんじゃないでしょ
基底クラスは結局全部別モンになるわけだし
ボイラープレートコードをまとめたクラスをミックスインするときに使うもの
2020/08/27(木) 06:37:57.11ID:7Sruawh3
>>195
basic_iosとios_baseみたいにテンプレート化する必要のある部分と不要な部分に分けるとか
2020/08/28(金) 17:02:52.88ID:BFWbiW8H
関数へのポインタが、メンバ変数に有る場合、例えば、
class CXxx {
public:
  void (*pfn)(int a);
  void (*pfn)(float b);
};
の様な場合、
pXxx->pfn(5);
pXxx->pfn(10.0f);
とした場合に、関数呼び出しに使われる関数ポインタが自動的に選択されるでしょうか?
つまり、関数ポインタについても、関数と同様な「オーバーロード解決」が行われますか?
そもそも、上の様なクラスは、定義時にエラーになるでしょうか?
2020/08/28(金) 17:09:28.47ID:47MLab1u
自分で動かしてから質問しろよ
2020/08/28(金) 17:09:34.31ID:namGYget
同じ名前のデータメンバーをふたつ定義してるからアウト
2020/08/28(金) 17:26:26.84ID:bCpDWR5V
>>198
それコンパイル通るかやってみ
2020/08/28(金) 17:41:13.83ID:AJ/VhFe8
ここに質問するより少ない手数で試せるだろうに何やってんだろうね
2020/08/28(金) 17:44:35.89ID:TvC7lNeF
>>198
関数は多重定義できるが
関数へのポインタは多重定義できない
2020/08/28(金) 17:48:03.23ID:TvC7lNeF
ちかっとエスパーすると
class CXxx_base {
public:
  virtual void fn(int) = 0;
 virtual void fn(float) = 0;
};
class CXxx : public CXxx_base {
public:
  void fn(int) override { }
 void fn(float) override { }
};
pXxx->fn(5);
pXxx->fn(1.0.f);
これでおまえさんの考えてることはできるんじゃないか?
2020/08/28(金) 19:11:25.34ID:KPVk+Ml/
>>198
机上の空論持ってくるな
きちんと検証してから持ってこい
206デフォルトの名無しさん
垢版 |
2020/08/29(土) 11:57:26.58ID:HmjSn9P9
関数へのポインタって関数じゃなくてただのメンバ変数だからな
207デフォルトの名無しさん
垢版 |
2020/08/29(土) 14:38:37.69ID:EjjA84a9
>>196
>ボイラープレートコードをまとめたクラスをミックスインするときに使うもの
ちょっとかっこいい(型情報ある)マクロみたいな感じか
208デフォルトの名無しさん
垢版 |
2020/08/30(日) 13:47:11.43ID:6dVOYYO/
構造体を使った配列の記憶にて
配列に順に入力しても出力が上手くいきません助けて偉い人
2020/08/30(日) 13:49:26.97ID:KF/F+MKa
スルーで
210デフォルトの名無しさん
垢版 |
2020/08/30(日) 13:51:20.52ID:GgAZZaQa
100歩譲っておま環
211デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:21:16.52ID:6dVOYYO/
void dataInput(Student& st){
string ans;
for(int i=1, i<=n;i++){
cin>>st.id;
pN[i]=st.id;
cin>>st.ans;
pA[i]=st.ans;
}
};
void showData(Student& st);
int main(){
cin>>n;

pN = new int[n];
pA = new int[n];

Student st;
dataInput(st);
showData(st);

return 0;
}
void showData(Student& st){
for(int j=0; j<=n; j++){
cout << pN[j] << pA[j] << "\n";
}
}
定義はファイル別にしてある
正直すまんかった
2020/08/30(日) 14:23:30.40ID:KF/F+MKa
デバッガで自分でトレースしろ
213デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:28:47.09ID:GgAZZaQa
死ね
214デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:54:19.28ID:6dVOYYO/
hファイルの方
struct Student{
int id;
char ans;
};

int n;
int* pN;
char* pA;

cppファイル冒頭
#include <iostream>
#include <string>
#include "funk.h"
using namespace std;
215デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:13:34.04ID:6dVOYYO/
デバッグしたけど問題は見つかりませんでしたと出た。出力に問題があるっぽい
216デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:22:13.56ID:6dVOYYO/
自己解決しました!iとjの初期値を1から0にしたら解決できました。
217デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:22:13.70ID:6dVOYYO/
自己解決しました!iとjの初期値を1から0にしたら解決できました。
2020/08/30(日) 15:57:12.85ID:HKGZh04b
きちんと検証しろ
ソレができないなら初心者スレか日記帳にでも書いとけ
2020/08/30(日) 17:44:09.91ID:oWP9MzfY
これはひどい
2020/09/04(金) 17:01:57.31ID:8b49PodW
hage
2020/09/04(金) 17:03:42.03ID:LCYaN/vD
どっちのだよ
2020/09/04(金) 17:11:42.93ID:ML6iv+hM
https://dotup.org/uploda/dotup.org2246504.jpg
223デフォルトの名無しさん
垢版 |
2020/09/07(月) 16:37:42.90ID:AmzB5PF6
githubなりに落ちてるc++で書かれたアプリなりを読んで勉強しているんだけど、
include無限ループに陥って萎えてしまうのですが、どうしてますか?

mainのinclude沢山→その指定先にもinclude沢山→stlなりのライブラリ(ここは読まずネットでドキュメント読む)
で相当時間食ってしまうまのですけど、コツとかありますか?
2020/09/07(月) 16:42:08.11ID:bjXgxZkO
includeガードしろ
2020/09/07(月) 16:54:18.66ID:4QMtZq9v
ていうかなぜ初学者なのにいきなりそんな重厚長大なアプリからチャレンジしようとするのか
自分の力量を過大評価しているのではないか
まずヘローワールドとかそういう簡単なとこからはじめなさい
226デフォルトの名無しさん
垢版 |
2020/09/07(月) 16:57:38.12ID:x8yvSFtj
コンパイル時にg++とかなら-Eオプションつければ
実際のプリプロセッサの処理の結果が確認できる
2020/09/07(月) 16:58:04.33ID:3Ozv9Uf+
読まなきゃいいじゃん
何のために全部読もうとしているのか自問自答したら?
2020/09/07(月) 17:02:08.59ID:qk/9c7gK
>>223
身の丈に合わない巨大なプロジェクトを読もうとしてるか、または愚直に頭から全部読もうとしてないか?
お前さん自身がコンパイラじゃないんだから、頭からすべて把握して読んでいく必要はないぞ。
まともなソースならオブジェクト指向で書かれてるのだから、上位層で大筋を把握しながら必要に応じて深いところに入っていって、有用そうな所や興味があるところだけ詳しく読めば?
ヘッダファイルは使ってるライブラリとかの当たりをつける程度でざっと読み飛ばして、定義を調べたくなったときにIDEの機能で見に行けばいいだろう。
229デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:05:02.17ID:Egt+Qwmp
吊りかも知れないが勉強中とのことなので
マジレスすると

#include の行を一つづつ消してみて(mainに近い方だけ)
消したらどんなコンパイルエラー出るかを観察する
2020/09/07(月) 17:07:22.95ID:6+huFxV7
>>228
sshのソース読んでも全くオブジェクト指向じゃないぞ。
231デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:13:56.93ID:x8yvSFtj
あらゆるところで参照したいヘッダファイル↓があるとして
./include/common/hoge.hpp

詳細な実装(深い階層にいるやつ)
./include/hage/chibi/debu/unko.hpp
からそれを読み込むときって

#include "../../../../common/hoge.hpp"
みたいにしてしまっているのですが、もっとまともなやり方はありますか?
232デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:18:55.68ID:x8yvSFtj
ちなみにCMakeを使っています
2020/09/07(月) 17:21:09.32ID:ualItUCM
なぜSTLは
#include <vector>
などで読み込めるのでしょうか
不思議ですねぇ
234デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:27:17.02ID:x8yvSFtj
./include/common
をインクルードパスに含めるのは思いついた上で微妙な気がしたから
聞いてます
2020/09/07(月) 17:43:09.75ID:3Ozv9Uf+
まとも〜とか微妙〜とか
そういう表現どう思う?
236デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:44:59.68ID:x8yvSFtj
./include/hage/chibi/
配下ではどこからでも見れるようにするとかしたいときはそこの
CMakeLists.txtにインクルードパス指定する
とかしかないんですかね
237デフォルトの名無しさん
垢版 |
2020/09/07(月) 19:33:13.69ID:u0REhpNo
インクルードガード標準搭載の言語多いのに
ほんと無駄な時間使わせてる言語なんだなって再確認できて辛い
2020/09/07(月) 20:11:18.48ID:bJcKHVeO
>>237
マクロによるインクルードガードなんて決まりきった定型文だし、正直 #pragma に載せる必要もないかと…
2020/09/07(月) 20:19:27.09ID:h3kjQIhT
まあね、GUIDなら衝突の確率340澗分の1だかんな
それすらも衝突したらどうすんだと・・・ほとんど病気だねw
240デフォルトの名無しさん
垢版 |
2020/09/07(月) 20:40:39.15ID:x8yvSFtj
>まとも〜とか微妙〜とか
なんとも思わねえよばあか
2020/09/07(月) 21:32:21.88ID:kH2Fy/8z
そっか君プログラマ向いてないね
知らなくて驚くかもしれないけどコンピュータには感覚じゃなくて理屈しか通じないんだよ
2020/09/07(月) 21:58:09.22ID:PI/34Ato
>>237
C++20 にはモジュールが入ったから……。
243デフォルトの名無しさん
垢版 |
2020/09/08(火) 00:30:42.07ID:h4K4tlm9
誰がプログラマって言ったよ?
理屈しか通じないんだろ?
頭悪そう
244デフォルトの名無しさん
垢版 |
2020/09/08(火) 00:32:32.14ID:h4K4tlm9
自分で言ってることに矛盾してる時点で才能ないよ君
2020/09/08(火) 16:47:11.08ID:FxZYRSTV
is_integralみたいな型判定をメタ関数に渡すとこを書いてて思ったんだが
変数テンプレートをテンプレート・テンプレートパラメータとして渡せるようにはなってないんだよなぁ
ということは、と思ってコンセプトの予定されてる内容調べたら、コンセプトも同様なんだな・・残念
246デフォルトの名無しさん
垢版 |
2020/09/10(木) 08:49:56.48ID:ke8OXyHN
C++でもNPMみたいなパッケージマネージャ使いたい
ヘッダと実装別で書かなきゃいけないのも無駄
このへん解決したAlterC++みたいなの作って
2020/09/10(木) 09:32:44.42ID:xgcscVfX
>>246
>>242
2020/09/10(木) 09:34:27.99ID:LwYTdpan
>>246
ヘッダファイルを実装とは別に用意する仕組みは効率よく差分ビルドするための仕組みとして機能していたんだけど、
テンプレートが登場してからは足を引っ張るようになってるとは思う。
まあ単純に面倒くさいってのもわかる。

パッケージマネージャはディストリビューションに乗ってるものを使いたまえよ。
実行環境の管理と開発環境の管理は要求されるものが本来は違うのだけど、
C/C++ は特権階級的な立場だから実行環境を開発環境として使えるようになってることが多い。

あえて分離したいなら CONAN が有名かなぁ……。 使ったことないけど。
https://conan.io/
249デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:27:37.52ID:ke8OXyHN
>実行環境を開発環境として使えるようになってることが多い
これは古い慣習でそうなってるだけで実は分けたほうが便利な気がする
システム汚さないし、依存関係の解決も楽
そもそも実行環境に不要なはずのものがいることがおかしい

ConanもC++20のModuleも良さそうだけど結局バベルの塔だからなぁ
2020/09/10(木) 13:37:57.10ID:wdhKSMlq
>>249
俺も同意見
開発環境、それとテスト環境もVMwareのゲストにしてる
おっかない実験もするし
251デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:58:43.59ID:h1ZKqHov
>>246
VCPKGがあるじゃないか。
2020/09/10(木) 15:13:20.95ID:LwYTdpan
>>249-250
それは重々承知なんだけど C/C++ では分ける体制になってないから
無理して分けるとそれはそれで変になるって話。
2020/09/10(木) 16:03:33.34ID:wdhKSMlq
変になるって、具体的に何?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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