C++相談室 part152

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/07/12(日) 13:42:20.13ID:TX1mpKr6
https://mevius.5ch.net/test/read.cgi/tech/1589424805/
82デフォルトの名無しさん
垢版 |
2020/08/12(水) 21:37:06.56ID:CtzJaQ9q
>>81
あ・・・・・・(´・ω・`)
できました。ありがとうございます。

ついでに聞きたいのですが、
std::stringに変換することなくfind関数を使用するにはどうすればいいんでしょうか?
std::mapであれば、std::less<>を用いることでfind関数を使用した時std::string_viewでも検索できるようになりますが、
std::unordered_mapの場合はどのようにすればいいんでしょうか?
2020/08/12(水) 21:43:02.63ID:3e1Z4brU
>>82
https://wg21.link/P0919
https://cpprefjp.github.io/lang/cpp20.html
> 順序付き連想コンテナと同様に、非順序連想コンテナの検索処理で、一時オブジェクトが生成されるコストを抑える拡張を追加。...
84デフォルトの名無しさん
垢版 |
2020/08/12(水) 21:49:15.10ID:CtzJaQ9q
>>83
これは・・・・・・
C++20から使えるかも?ってことですかね?(´・ω・`)
85デフォルトの名無しさん
垢版 |
2020/08/13(木) 10:37:08.60ID:m1xh97jB
std::unordered_map<const std::string, int> a;
86デフォルトの名無しさん
垢版 |
2020/08/13(木) 11:17:58.00ID:hnCcHlo3
C++2a
https://cppinsights.io/

https://arnemertz.github.io/online-compilers/
https://riptutorial.com/ja/cplusplus/example/17403/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9

https://wandbox.org/
http://coliru.stacked-crooked.com/
87デフォルトの名無しさん
垢版 |
2020/08/16(日) 03:35:19.99ID:Qk/OMLZN
今年学生でコロナ下でオンラインばかりなので合間を縫って独学に勤しんでます。

優しいc++を読み終えました
現在atcoderのabcやオライリーから出てるmodern c++ チャレンジ等をやっていますが、何をもってプログラミングが出来ると言うのでしょうか?
テトリス等もサイトを参考に書いたりしてみました。

自分はlinux上で動作する音楽プレイヤーソフトを作成したいと思うのですが、文法等はある程度理解していてもいざ自分で一から作れと言われると出来ません。c/c++で書かれているgithubのソースコード等は読めるんです
読めると言うのは、知らない文法やライブラリ等検索出来るためなんとなく実装内容がわかるって意味です
しかし自分で一からとなると何から始めればいいのか…


皆さんはこの壁をどう超えましたか?それとも壁に出会いませんでしたか?もしそれなりの規模の開発をする際止まった経験があるならばアドバイスを欲しいです
長文すみません
2020/08/16(日) 03:47:01.77ID:Degs0Zl8
初心者は、Ruby on Rails で、web アプリのポートフォリオを作る

むしろ、コーディング・テストよりも、
アプリの設計・構築運用など、Linux の勉強の方が多い

文法・コーディングだけだと、ちょっとしたコマンドぐらいしか作れない

Rails みたいなフレームワークを使わないと、
データベースを含んだ、webアプリなどは作れない
2020/08/16(日) 05:51:14.48ID:1OSQgfCu
>>87
linuxの統合開発環境がどんなのか知らんけど、とりあえず空のプロジェクトから作るのは出来るんでしょ?
そっから必要なものを一つずつ実装してくだけだよ
千里の道もうんたらで
2020/08/16(日) 06:33:25.81ID:wVZFHsSL
>>87
> 何をもってプログラミングが出来ると言うのでしょうか?

何かを作るぞ! と頑張って、目標を達成できること

「何か」はゲームでもいいしドローンの自動運転でもいいから
自分の好みで勝手に決めればいい

87は音楽プレイヤーだろ?
いきなり市販のプレイヤーに匹敵しなくてもいい
こんなことできないかな〜とアイディア先行で実験してみて
うまくいったら見栄えも気にして仕上げにかかる
てなことを小刻みに繰り返すとアジャイルっぽくなる
2020/08/16(日) 07:20:43.69ID:5tP8nVqa
第二不完全性定理の制約を受けず、
停止性問題を解けること、

って無理ゲーじゃん?!?
なんで人間ってプログラミングできるの?!!?!
92デフォルトの名無しさん
垢版 |
2020/08/16(日) 09:23:07.48ID:ng3yYkoc
ユニバーサル文法があるから

その辺りは余り深く考えても意味が無い
出来るから出来る
出来ない奴は出来ない
2020/08/16(日) 10:39:09.01ID:5tP8nVqa
ユニバーサル文法を操るメンタルオーガンが実在したとしても
そいつがたんなる機械なら解決にならないんじゃ…
2020/08/16(日) 12:13:35.40ID:INgchOov
>>87
まず作りたいものの機能をもった最も簡単なプログラム作ったら?
例えば音楽プレーヤーがお題なら音声ファイル名を与えると再生するだけのコマンド
あとは機能を付け足してく
95デフォルトの名無しさん
垢版 |
2020/08/16(日) 14:54:00.65ID:43uVw8aV
>>87
強いて言えば
「バグ取りを自分で出来ること」
2020/08/16(日) 15:36:41.55ID:1Qmt1HH2
>>87
アプリ作り上げるのに言語の詳しい知識って実はあんまり要らないんだよね
c++だとtemplateにはまって一日つぶすとかざらにあるんだけど、
これってただの自己満だよな〜って思う
愚直なコードでとりあえず解決しておいて、その分
アプリとして作り込むのに時間かけた方がよかったんだろなーと

まぁそれはさておき、音楽プレーヤなら
- GUIフレームワーク
- CODECライブラリ
- linuxシステムコール、libc
あたりの知識がないと進められないでしょう
GUIフレームのお作法の理解とか、
CODECもフォーマット特有の制約が上位まで波及したりするから結構知識いるよね
まず何を使うかの選定からでしょう

あと、たぶんお前さんの作りたいものは既に世の中にごまんとあるはず
それを承知で勉強と割り切って作るのはいいんだけど、
あんまり大きいものは最初の目標にしないように
すぐに情熱失ってやめてしまうのがオチ
97デフォルトの名無しさん
垢版 |
2020/08/16(日) 16:32:23.69ID:Qk/OMLZN
87のものです 皆さん有難うございます
再生させる機能やタグの取得等の割りかし簡単そうなものから実装していき
あわよくばイコライザーやスペクトラム等の機能も追加していこうと思います

あと、linuxだとuiや機能が優れた音楽プレイヤーって実は少ないんですよね…GitHub等でも探したのですが…foobar2000とかしかなくて正直ダサくて…
ないから自分で勉強がてら書いてみたいなと思った次第でした
2020/08/16(日) 17:31:00.86ID:PN3bHl0Q
>>87
〉何をもってプログラミングが出来ると言うのでしょうか?

他の人も似たようなこと言ってるけど、「ソフトを完成させる段取りを知っていること」が一つの目安。
実現機能を明確化して、実装する機能に分解して、必要なリソース・ライブラリを集めて、全部の機能を実装して、誤動作しないようにバグ取りをする。
これができれば言えるんじゃない?

少なくとも「プログラムするためには何が必要か」がわかるようになる。
99デフォルトの名無しさん
垢版 |
2020/08/16(日) 18:12:46.45ID:8WlfPd5U
C++のGUIライブラリとして、こういうものがあるけどね。
お気に召すかわからんけど。

https://ja.uncyclopedia.info/wiki/Progress_display
2020/08/16(日) 18:35:06.05ID:wVZFHsSL
>>96
ダウト
「こうしたい」と、せっかく閃いたアイディアを
表現力が足りないばかりに諦めたり
誰かさんみたいにtemplateがロクに使えなくて一日つぶすとかってのは
言語の詳しい知識が足りないことに他ならない
それを何やかんやと言い訳考えることこそ自己満以外の何物でもない
言語の基本をしっかり固めるのを軽視するとこうなるという典型だ
101デフォルトの名無しさん
垢版 |
2020/08/16(日) 19:20:29.73ID:x8ZjthFZ
progress_displayいつになったら規格に取り込まれるんだ
2020/08/17(月) 02:08:49.38ID:u6ES7f8s
>誰かさんみたいにtemplateがロクに使えなくて一日つぶす
そんなこと一言も言ってなかったと思うが(俺96じゃないよ)
いつものアホが沸いたのかな?
2020/08/17(月) 02:55:30.59ID:vOFQCRbE
というか他人が思ったことに対してダウト〜っていうセンスに痺れるわ
2020/08/17(月) 05:56:47.89ID:TQifZMS/
>>102
strcmp的なやつとは話にならねえ
2020/08/17(月) 07:50:57.12ID:p3n8cAbg
strcmp的なやつって笑える表現だな

a="templateにはまって一日つぶす";
b="templateがロクに使えなくて一日つぶす";
ここでstrcmp(a,b)が偽になる以上どういう意図のなのか説明が必要だろ

>言語の基本をしっかり固める
とはまったく逆の事をしてることに気づけ
2020/08/17(月) 08:11:11.90ID:TQifZMS/
へーえ、おまえさんとこではstrcmp(a, b)がint(0)を返すのか
ユーザーがあまりにも馬鹿過ぎると標準ライブラリまでバグるとは知らんかったわ
2020/08/17(月) 16:39:05.57ID:p3n8cAbg
strcmpてのは三値を返すんだから0が真で非0が偽
2020/08/17(月) 19:38:46.36ID:fdEh9bfN
>>107
普通は零が偽、非零であればなんでも真、なんですけど
2020/08/17(月) 19:41:49.25ID:aDjhg6Zt
>>107
無茶苦茶言わないで、そこは「strcmp(a,b)==0が偽」の書き間違いだと認めるぐらいしようぜ。
2020/08/17(月) 19:49:37.18ID:I0An2PUB
揚げ足とりこそC++erの本懐よ
2020/08/17(月) 20:13:14.96ID:Km1hLS23
strcmp を定義するのは言語仕様なんやから
あえて言語仕様と異なる用語を使うんなら
その適用範囲 (プロジェクト単位?) と共に定義を明文化するのは最低限の要求やろ。
当事者が合意した範囲内でなら一見して変な用語でも使うのは好きにすりゃええ。
たとえばハードウェアに近い部分なら負論理がソースコード上に露骨に現れることだって無いとは言いきれん。

ただそれは特殊な例を総合的に見てあえて奇妙な用語を使った方が良くなる場合にとる選択肢であって、
「三値を返すんだから」というようわからん理屈では正当化でけへんし、
言語のスレとしては許容でけへんわ。
2020/08/17(月) 20:18:38.27ID:vrG6zXoN
急にバリバリの関西弁でどないしたんや
113デフォルトの名無しさん
垢版 |
2020/08/17(月) 20:25:51.22ID:ltcLkjuo
個人的には整数のサイズにこだわるときは
#include <cstdint>
してint8_tとか使ってるなぁ
2020/08/17(月) 21:37:15.36ID:S/xJ/Voo
そもそも3値な時点でbooleanの真偽かどうか議論すること自体無意味
2020/08/17(月) 22:07:28.50ID:cXN7EgSQ
真偽値じゃないものを真偽値扱いしてもエラーとして検出されない、根が深い問題なんだよな。
型が無いB言語に末代まで祟られているとも。
2020/08/17(月) 23:56:15.69ID:Km1hLS23
整数の暗黙の型変換はそれなりに上手くいってると思うけど
bool が整数型扱いってのがいきすぎた一般化だったのかもな。
117デフォルトの名無しさん
垢版 |
2020/08/18(火) 00:15:03.69ID:6UORXKST
学術の巨大掲示板群 - アルファ・ラボ 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/19(水) 03:53:13.32ID:itvjYGVQ
45歳こどおじ高卒無職歴約10年
10年以上前にIT系業界にいたが主にPC保守やユーザサポートをトータルしても10年くらい
コード開発の実務は30代の頃VB約3ヶ月でばっくれ
30代の頃エクセルVBA約3ヶ月でばっくれ
両方超ブラックだった
なんか疲れて実家帰ったらいつの間にか10年経ってた

暇なんで趣味で勉強してみた
2年前くらいに3ヶ月ほどjavaとpythonとc++
各言語のpaizaでC問題全部回答B問題10問くらい解けたからもうやってない
ガチで就職探したけど当然無くて諦めて勉強もやめてた

んでまた競プロサイトで練習始めたんだけど結局アルゴリズム意味不明で詰んだ感じ
暇なんで暇つぶしの惰性で練習してる感じ

こんなレベルで就職あるかな?
無職10年は適当にバイトしてたとかでごまかすコミュ力はあると自負してるつもり
こんな新人来られてもやっぱ迷惑だよね
てか俺が採用担当だったら絶対に採用しない

死んだほうが良いかな?
転生してやりなおしたい
2020/08/19(水) 06:19:51.21ID:AaZqqXX6
マ板でどうぞ
2020/08/20(木) 05:04:54.05ID:DqyqYTXG
if (!strcmp(a, b)) goto hell;
121デフォルトの名無しさん
垢版 |
2020/08/20(木) 11:16:03.05ID:RX/3qqm6
hell終わるど
2020/08/23(日) 16:03:07.43ID:SVuEjc7r
例えば、
x<1 || y>3
と書いた場合、人間なら、この < や > は、大小比較をする比較演算子だと
思うでしょうが、コンパイラにとっては、1 || y を実引数とするところの
template展開だと勘違いする可能性があります。
どうやってこれを区別しているのでしょうか?
123デフォルトの名無しさん
垢版 |
2020/08/23(日) 16:05:12.45ID:Exm+Pt+Z
どちらかというと
< <>, <> >
みたいなときに
<<>, <>>
って書くと期待通りに動かないのが面倒だと思う
2020/08/23(日) 16:08:14.77ID:SVuEjc7r
x がtemplate名であるかどうかを検査するのでしょうか?
2020/08/23(日) 16:18:37.58ID:SVuEjc7r
pure C で、構文ツリーを作りたいとき、出現してきた名前トークンがどう宣言されて
いるかを知らなくても、構文ツリーを作れてしまいます。
ところが、もし、xがtemplateの名前として宣言されているかどうかを知らなければ、
< が、比較演算なのが、template引き数の始まりを示す括弧なのかの区別が
付かないのであれば、そうはいかなくなります。

pure C の場合:
 構文ツリーを作る ---> ツリーの中にある中の名前の宣言を調べ、種類を見る。
で済んだところが、C++の場合、下手すれば、
 構文ツリーを作る際に、出現した名前の宣言も逐次、調べる。
ということになります。
2020/08/23(日) 16:40:37.67ID:VT3zweO2
その場合、トークンとしての'<'が比較演算子なのかテンプレートの括弧なのかは区別しないで
構文解釈の結果として文脈によって決定するのが常套手段だろうね。
https://github.com/antlr/grammars-v4/blob/master/cpp/CPP14.g4

>ところが、もし、xがtemplateの名前として宣言されているかどうかを知らなければ、
>< が、比較演算なのが、template引き数の始まりを示す括弧なのかの区別が
>付かないのであれば、そうはいかなくなります。

そうならない仕様にはしているはず。
どうしても区別がつかない部分は前にtemplateキーワードを置く必要があるとか。
2020/08/23(日) 17:11:53.76ID:SVuEjc7r
>>126
>その場合、トークンとしての'<'が比較演算子なのかテンプレートの括弧なのかは区別しないで
>構文解釈の結果として文脈によって決定するのが常套手段だろうね。
ここは、x<・・・> の x がtemplate名かどうかを区別できるところの
意味解析の段階ではなく、本当に構文解析の段階ですか?
2020/08/23(日) 17:21:37.10ID:PNDTq65a
xがtemplate名かどうかは識別子の辞書を見たらワカル
辞書の中身はその時点までのソースコードの内容と
言語規格上の定義(形式言語ではなく、自然言語で書かれた仕様)に依存するから
言語の「意味」に依存するところがあるからこれを意味解析に含めるかどうかは議論の余地があるが、
普通のコンパイラ屋のマインドとしては
識別子の辞書を見てxが(例えば)template名であると判明したら
xがtemplate名xという「字句」であるという前提の下に字句解析した結果を文法パーサに入力するので
構文解析の範疇だと思われ
2020/08/23(日) 17:23:59.45ID:SVuEjc7r
>>128
昔読んだコンパイラの本には、これまでに行われた宣言の情報を参照するのは、
意味解析だ、とあったと記憶しています。
逆に、それが意味解析でないのなら、何が意味解析になるのでしょうか。
「解析」ですから、コード生成では有りませんし。
2020/08/23(日) 17:26:01.74ID:PNDTq65a
それよか
std::vector<std::string>> x("Hello");
と書いたら
std::vector<std::string> > x("Hello");
とコンパイラに解釈させるという方がよっぽど凶悪
これこそ構文の意味を知らねば「>>」という単一の字句なのか、「>」という字句2個なのか
定まらないという意味で字句解析→文法解析の流れをぶち壊しにしてくれる
2020/08/23(日) 17:28:17.74ID:PNDTq65a
>>129
構文解析、でええやん?
>>130みたいな凶悪なケースと違って
辞書の参照、というただ1点のチートだけやれば、
BNFで形式的に完全に表せる世界に持ち込める
2020/08/23(日) 17:29:06.23ID:PNDTq65a
訂正orz
誤: >>130みたいな凶悪なケース
正: >>129みたいな凶悪なケース
2020/08/23(日) 17:31:18.68ID:PNDTq65a
訂正2、。n_
>>130 正:
std::vector<std::vector<std::string>> x("Hello");
と書いたら
std::vector<std::vector<std::string> > x("Hello");
とコンパイラに解釈させる方がよっぽど凶悪
2020/08/23(日) 17:39:05.76ID:SVuEjc7r
>>131
C++の場合、辞書の参照も簡単では有りません。
namespaceや、クラススコープの名前などが複雑に絡み、
スコープ演算子を使った、修飾名などがあり、
Q1::Q2::Q3::name<xxx>
のような場合がありますが、
ややこしいのは、実際に template を展開してみないことには、nameがどういう識別子
なのかも分からない事があることです。例えば、
aaa<xxx>::bbb<yyyy>::name < 5, 5 > y

と有った場合、name が変数名なのか、template 名なのかによって、
< が template 引き数の始まりなのか、比較演算子なのかが決まる可能性があります。

ただ、この場合、> の後に名前トークン y が来ていますが、template展開だと
すると、この並びは恐らく、必ず間違いであるはずで、比較演算子でしか
合法にはならないと思います。
2020/08/23(日) 17:40:50.98ID:08jUbd/H
いつもの人か
2020/08/23(日) 17:49:20.95ID:VT3zweO2
>>127
どのテンプレートが使われるかの判断は意味解析だろうけど、テンプレートの使用か
比較式かの区別は構文解析段階で確定するはずだがね。
で、両方に解釈できるケースは基本的に非templateとみなすことになっていて、そこで
テンプレートを使用したいならばtenplateキーワードを追加する。
2020/08/23(日) 18:14:03.07ID:PNDTq65a
>>136
>両方に解釈できるケースは基本的に非templateとみなすことになっていて、
それだと構文解析時のBNFの当てはめ時点でバックトラックしているように読めてしまうま、
そのような方式は、テンプレート定義が入れ子になったときバックトラック回数が指数関数的になりかねないから近畿

実際はそんなことはせずに、「name」というテンプレートの定義が辞書にあれば、「name」とかかれたソースコードの部分が
<テンプレート名>という字句として文法パーサに入力される、という方式で実現しており、
字句解析→文法解析、の一本道が保たれているはず(つまりは>>128のやり方

>>134
辞書の参照が難しい、と仰せなのですが
識別子のスコープを辞書の階層化で表現するのは常套手段であってコンパイラの教科書にも書いてある
(と思う)のでそんなに難しい話とはみなすことはできない(希ガス
2020/08/23(日) 18:17:01.07ID:PNDTq65a
※ 個人の感想です
2020/08/23(日) 19:31:26.00ID:OrwVzT4b
<=>演算子はどうなん
2020/08/23(日) 20:00:57.91ID:L0YhmUmF
面白そうな議論だけど忙しくて参加できない(泣
2020/08/23(日) 21:32:54.31ID:MKE8ZoLo
C++の文法は複雑すぎて構文解析と意味解析を分離できないのは有名な話
例によってBoostさんがそれを最大限に悪用してるのも有名な話
https://dechimal.hatenadiary.com/entry/20090216/1234793122
142デフォルトの名無しさん
垢版 |
2020/08/24(月) 09:07:54.59ID:2j0RwZQH
構造体へのファイル読み込みについて、悩んでいます。

今まで#pragma pack(x)を使用して、構造体にパディングが入らないようにしていたのですが、これ以外にパディングが入らないようにする方法はあるのでしょうか?

移植性の面からpragma禁止、かつ暗黙アラインメント禁止(自分でパディングを入れる)という指示がありました。
2020/08/24(月) 09:12:28.05ID:hO98kfNk
メンバ1つずつ個別に入出力
C++はそれがしやすい
2020/08/24(月) 09:14:54.89ID:hO98kfNk
エンディアン問題は1バイトずつ入出力することで解決できる
2020/08/24(月) 10:43:50.34ID:seWRIuQk
自分でパディングを入れる方が、明確。
解釈の余地がなくなるから

構造体へのファイル読み込みって、
構造体には、文字列のポインターがあるだけだろ

可変サイズの文字列の実メモリは、構造体内には確保しないだろ
146デフォルトの名無しさん
垢版 |
2020/08/24(月) 10:50:48.29ID:3u4r+xiS
そもそもの話の流れの趣旨とは無関係
struct hoge {
char mojiretsu[0];
} hage;

で malloc するときに
struct hoge *p = (struct hoge *)malloc(sizeof(struct hoge) + length + 1);
2020/08/24(月) 11:20:42.08ID:RW1y5ZfB
>>142
バイト単位で読み込んで自分でメンバーに格納
てか移植性云々なら入出力部分を切り出しとけよと思うが…
2020/08/24(月) 11:25:15.19ID:hO98kfNk
C++的には構造体の中の物理的な配置に依存しない設計をするのが本筋
ostream& operator << (ostream&, your_struct const&);
istream& operator >> (istream&, your_struct&);
149デフォルトの名無しさん
垢版 |
2020/08/24(月) 11:51:04.72ID:2j0RwZQH
ありがとうございます。とても参考になります。
パッと見て理解できないこともありますが、一つ一つ勉強します。

「入出力部分を切り出し」については、知識不足でイメージもできない状態なのですが、入社したらそうなっているのかも?と心構えというか、理解しておきたいと思います。
2020/08/24(月) 12:08:08.35ID:5d5vIMqX
>>142
自分でパディングいれろ、という指示なんだから自分パディング入れればいいんでしょ?
方法は明確じゃん
まぁお前の質問の仕方が悪いってことね

まずやることはコンパイラのパディングのルールを確認してどういう条件で暗黙パディングが入るか理解すること
理解できたら自分でダミーのメンバ追加して暗黙パディングが入らないようにする
gcc/clangだったら-wpaddedで暗黙パディングが検出できるはず
念のためstatic_assertとoffsetofを使ってすべてのメンバーで期待通りのオフセットであること保証しておくといい
おまけでstatic_assertとsizeofで期待通りの構造体のサイズであることも

こういうのが多数あるんだったら、別途ツール使って構造体のソースは自動生成するようにすべき
あとpragma packは(レイアウトによって)実行時にオーバーヘッドが生じるってことも勉強しとくといい
151デフォルトの名無しさん
垢版 |
2020/08/24(月) 12:32:35.65ID:2j0RwZQH
すみません。質問を正しく説明できるように気をつけます。

私が質問したかったのは、「パディングの入れ方」ではなく、「そもそもパディングが入らないようにする方法はないだろうか」ということでした。
パディングの入れ方については既に理解しているのですが、入るとやや都合が悪い状況です。
「暗黙アラインメント禁止(自分でパディングを入れる)」と書いてしまったことで質問内容がブレてしまい、良くなかったと反省しております。

また、詳しくアドバイスをしていただきありがとうございます。
152デフォルトの名無しさん
垢版 |
2020/08/24(月) 13:32:36.10ID:3u4r+xiS
#pragma pack(1)
も禁止?
2020/08/24(月) 14:16:40.36ID:5d5vIMqX
>>151
「そもそもパディングが入らない方法」がpragma packであって、それが禁止されてんでしょ?
言われた通りに明示的にパディング入れな
何か方法があったとしてもチーム開発しているときに、妙な小細工は嫌われる
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++で検索できる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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