C++相談室 part132

■ このスレッドは過去ログ倉庫に格納されています
2017/10/10(火) 00:11:34.01ID:nc/5PI4P0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part131
http://mevius.2ch.net/test/read.cgi/tech/1501295308/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1500329247/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/10/28(土) 08:28:41.62ID:Jnrw/MWj0
テクノロジーに善悪は無い
2017/10/28(土) 08:44:41.02ID:rDr3prXm0
>>253
暗黙の云々とかoperator=とかが怖いってだけ
それに後から読み返した時、どんな戻り値が欲しかったのかとか
autoだとわかり辛いって事がままあるし、autoはなるべくあちこちに散乱させたくない
.NET方面のvarとかも気持ち悪いったらありゃしない・・・
256デフォルトの名無しさん (スップ Sd73-0RRx)
垢版 |
2017/10/28(土) 08:56:43.01ID:JVsxHO5Xd
autoの数々の利点のほうが大きいからどの言語でも型推論は基本になってきてるな
メイヤーズも言ってるしマイクロソフトも推奨してるし
257デフォルトの名無しさん (ワッチョイ 6b15-OCcV)
垢版 |
2017/10/28(土) 09:55:15.82ID:QoaQu2To0
autoはどのように推定されるかを理解して使うもので、
断じてバカ用のヘルパーではない
バカ自身はそれがわからないから変な杞憂に陥るってだけ
2017/10/28(土) 11:02:25.42ID:J8kLZQh+0
バカだけどIDEさんが、IDEさんさえいてくれれば大丈夫だ問題ない
2017/10/28(土) 12:14:14.53ID:BDtptoiy0
初心者はまずauto使わずにプログラミング出来るようになってからにした方がいいね
2017/10/28(土) 17:38:09.89ID:VIxhg0oq0
auto使わずにコンパイラの警告レベルを最高、警告は即エラーって設定にして
テンプレートライブラリ使ったテストプログラムを書いてみると
autoのありがた味が分かると思う。

ループの制御変数の型がえらいことになったりするからな。
いわんやイテレータをや。
2017/10/28(土) 22:00:09.12ID:Jnrw/MWj0
例えば
 Bar x;
 auto z = x;
としたときに、zはの型は必ずBarになってBarの基底クラスになったりしないの?
2017/10/28(土) 22:00:59.73ID:TWx2GtJid
>>261
インスタンスとクラスを区別せよ。
2017/10/28(土) 22:03:17.64ID:Jnrw/MWj0
Barの基底クラスがFooだとして、
実はBarはコピコンがprivateでなぜかoperator Foo()だけがpublicで定義されているかもしれない
かもしれない運転、
2017/10/28(土) 22:11:30.59ID:Jnrw/MWj0
あるいは
class Foo {
 void assign(const &Foo) { ... } // (A)
};
class Bar : public Foo {
 void assign(const &Foo) { ... } // (B)
};
Foo x1, x2;
Bar y;
auto z = x1;
z.assign(x2); // (C)
y = z;
とかなときに(C)で呼ばれるassign()はどっち?
2017/10/28(土) 22:12:10.53ID:TWx2GtJid
>>264
試せばわかる。
2017/10/28(土) 22:16:47.80ID:TWx2GtJid
参照なしのautoで代入だから、この場合は同じ型でコピーだね。メソッドは仮想関数でもないから、同じクラスのメソッドが呼ばれるはずだ。
2017/10/28(土) 22:57:04.67ID:Jnrw/MWj0
C++で起き得るBarとFooのパターン全てについてテストケースを考えるのは無理ゲーすぐる、
auto儲はどのようにして有限の人生と無限に近い(ときに想像を絶する結果をもたらす)C++の自由度との折り合いを付けているのであろうか…
2017/10/28(土) 23:02:38.36ID:TWx2GtJid
かしこいIDE使ってるなら、ビルドしたらその場でautoの型がわかるはず。スマートに行こうぜ、スマートに。
2017/10/28(土) 23:49:55.51ID:n2BUqhCar
struct S {};
using Bar = S const;
Bar x;
auto z = x;

必ずしも同じ型ではないな
270デフォルトの名無しさん (ワッチョイ a180-aATY)
垢版 |
2017/10/29(日) 01:18:54.15ID:jdBIz2nU0
>>263
それがどんな問題が起きると?
>>264
Bar使われてないじゃん
271デフォルトの名無しさん (ワッチョイ e983-nu9H)
垢版 |
2017/10/29(日) 05:32:17.05ID:0yKrkLYC0
大量のC++のコードを読み、大量のC++を書いてきた人は今更シンタックスを変えようとは思わない。
碌にコードを読んだことがない、書かない人が文法を変えたがるのだ。

外国人の日本語入門者が「は」と「が」が難しいからautoにしろ、どっちの意味かは読む人、聞く人が考えろと言ってるうなもの。
ひらがなとカタカナを統一しろとかね。日本人ならそうは思わない。日本語を使い続けて必要な理由を知ってるから。
日本語から「が」がなくなれば不便で仕方がない。

だからauto使いは大学デビューとか言われるのだ。未だコードネイティブではないのだ。
10年使ってからautoが必要かどうか考えろ。答えは明らかだ。
272デフォルトの名無しさん (ワッチョイ 6b15-OCcV)
垢版 |
2017/10/29(日) 07:32:07.72ID:m60zTw010
> 大量のC++を書いてきた人は今更シンタックスを変えようとは思わない。

これは嘘
autoだけでなくtrailing return typeやusing aliasなど
かゆいところにやっと手が届いたシンタックス変更は大歓迎している
C++11以後に拒否反応しまくって、未だにC++98のマゾプレーを続行中の変態は
頭固すぎだ

# 自分で言うのも何だが、俺に頭固いなんて言われるのは極端すぎだ
2017/10/29(日) 07:55:51.29ID:Heo7FnD+0
>>270
藻前の呼びたかったassign()は実はFoo::assign()(基底クラスの方)だったかもしれないじゃん?
274デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 08:02:49.06ID:5nFESEae0
ところでこれからC++を始めたいのだが、純粋にC++が始めたいのではなくてc言語の代わりとして
C++を使ってみたい。多少なりともC++の方が便利だろうとおもうから。一つ二つ制約があって
ROMが256バイトしかない。RAMが8Kしかない。こういう場合に今までROM48Kバイト、RAM8K
バイトでおさまっていたプログラムをC++で移植するのは余裕だろうか? それとも便利になる分
スペースがとられてRomエリアが少なすぎるってレベルだろうか?
2017/10/29(日) 08:05:45.00ID:6IgW6Wrm0
アセンブリで書けるレベルじゃね?それ。
2017/10/29(日) 08:07:50.71ID:XRmGRjwZ0
>>271
要出典:auto使いは大学デビュー

ラムダ式を変数に入れたいときはどうやるの?
コンテナのイテレータを変数に入れたいときは型名全部書くの?
std::bindの戻り値を変数に入れたいときはどうするの?

何でもかんでもauto使うのはどうかと思うがこういう面倒なところはautoでいいんじゃね
2017/10/29(日) 08:09:27.19ID:k1qoOab2d
>>274
メモリーをけちるなら、STLとかテンプレートとか呼ばれるものはあまり使わない方がいい。
std::coutなどのストリームもダメだ。あれは遅いし、バカ食いする。
2017/10/29(日) 08:10:20.13ID:XyYI0EpP0
cでもキツいな
2017/10/29(日) 08:14:51.32ID:Heo7FnD+0
多分printf()がリンクされたら死ぬレベル
2017/10/29(日) 08:19:49.13ID:k1qoOab2d
>>274
256KBの間違いだろ?
まずは、メソッド、デストラクタ、std::stringの3つを学習してみな。便利だとわかるから。
2017/10/29(日) 08:25:23.25ID:XRmGRjwZ0
>>274
ROMは256Kの誤記だとして
RAM8Kはきついな

マイコン向けの開発環境も無償版や評価版なんてのがあるから一回試した方がいいと思う

コンパイラのオプションで例外と実行時型情報はOFFにするのを忘れずに
C++のコンテナクラス(std::vectorやstd::string)はメモリ不足で使えなさそうだな
282デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 08:51:05.52ID:5nFESEae0
ROMは256kの間違い。外部RAMは256kbある。(ただしSPIでアクセスするので遅い)
だから8kは純粋にワークとして使える。
8kのRAMがきついと思うのは何故?
C++もワークはスタックを使うと思うけど、プログラムの実行エリアとして例えばクラスインスタンスを
作るのにRAMを消費することになるんだろうか? 動的にインスタンスを作成するとそのクラスが大きいと
RAMエリア(mallocで確保してロードしたら、解放するまではRAMエリアを使う)を圧迫することになる。
ということはRAMをあまり消費しない手法ってあるんだろうか?
2017/10/29(日) 09:18:10.76ID:Heo7FnD+0
普通は処理系が要求するコード、CONSTデータ、、スタック、初期値付きデータ、BSSの各セクションを
プログラマーが明示的にリンカに指示して割り当てさせるんじゃね;;
これはCもC++も同じなのでCでのやり方を理解しているなんならC++でも同じようにやれば良い
(グローバルなオブジェクトの構築と破棄の手当てが追加になるだけぐらいしか違いが無い
2017/10/29(日) 09:30:39.20ID:XRmGRjwZ0
>>282
最適化切って動作確認したり、デバッグ用のコードを仕込んだりしてると8Kは意外とすぐに使いきれてしまう
当然プログラムの規模や書き方によるところだから必ず足りないわけではないけど

C++だから足りないというわけではない
元のプログラムがCで書かれてて8Kで動いてたならまぁ大丈夫か
2017/10/29(日) 09:31:08.74ID:Heo7FnD+0
>>282
>8kのRAMがきついと思うのは何故?
全てはID:5nFESEae0が上記各セクションをROMやRAMにどのように割り付けようとしているのかにかかってゐるのだが、

仮にスタックと初期値つきデータとBSSを全部8 KBのRAMに割り付けた場合、
コード以外の全て(malloc()含む)のメモリ消費がトータルで8 KBに収まらねばならず、
メモリ不足のせいでやれることは相当にきびしくなるとおもー
286デフォルトの名無しさん (ワッチョイ e983-nu9H)
垢版 |
2017/10/29(日) 09:38:54.44ID:0yKrkLYC0
ID:XRmGRjwZ0

> RAM8Kはきついな
> コンパイラのオプションで例外と実行時型情報はOFFにするのを忘れずに
> C++のコンテナクラス(std::vectorやstd::string)はメモリ不足で使えなさそうだな

こいつレベル低すぎだろ。ド素人にもほどがある。
完全に組み込み経験なしじゃねーか。学生じゃねーのか。
2017/10/29(日) 09:49:26.98ID:6IgW6Wrm0
コンテナクラスの消費バイトは12バイト。だっけ?
2017/10/29(日) 09:56:55.29ID:Heo7FnD+0
sizeof(コンテナクラス)すればワカル、
ただしコンテナに要素の追加でmalloc()される分は別枠
2017/10/29(日) 10:05:31.40ID:NWVP0NdTH
>>274
論外 勉強目的だろ
自称プロでも 8kB なんて環境で組んだことのある人間なんて少数
普通はデフォルトのスタックサイズやvtableの存在すら知らん
考え直せ
2017/10/29(日) 10:24:19.89ID:9Q+tOYh80
Microchip マイコン PIC24FJ128GA006-I/PT 16ビット RISC PIC24FJ,
32MHz, 128 kB フラッシュ, 8 kB RAM, 64-Pin
http://jp.rs-online.com/web/p/microcontrollers/6230897/

8KB RAM は、400円のPIC マイコンとかだろ

そもそも、C++ のコンパイラが無い
291デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 10:29:34.45ID:5nFESEae0
コンパイラはありますよ。C/C++とうたってるので恐らくC++もできると思うが、、、
TIとかHewとか他にもKeilとか
292デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 10:41:22.70ID:5nFESEae0
>グローバルなオブジェクトの構築と破棄の手当てが追加になるだけぐらいしか違いが無い

おお、心強いお言葉。
例えば

class MyClass
{
int buf[1000];
int no = 0;
void inputdisp(int aa){
sprintf(buf," aa=%d",aa);
}
};
int sub1()
{
MyClass aaa;
aaa.disp(333);
return 0;
}

こういう場合はaaaはbufは2000バイトのRAMを使うけれども、stackに確保するんだろうか?
aaa自体はrom上にできると考えていい?
それなら、cと混在で徐々にC++に変えていく程度でも問題ないのかなとは思っている。
2017/10/29(日) 10:52:19.32ID:Heo7FnD+0
>>292
>aaa自体はrom上にできると考えていい?
質問の意味不明 再入力せよ
294デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 11:05:38.47ID:5nFESEae0
動的にNewを使ってインスタンスを生成した場合には、コードは必然的にRam上に置かれる。しかしスタティックに
生成した場合は、Code部分は原理的にはRom上にも置くことができる。そういう機能があるかどうか?って質問。
2017/10/29(日) 11:08:14.46ID:Heo7FnD+0
>>294
>動的にNewを使ってインスタンスを生成した場合には、コードは必然的にRam上に置かれる。
断じて否
こういう手合いに騙されてはいけない
296デフォルトの名無しさん (ワッチョイ a180-aATY)
垢版 |
2017/10/29(日) 11:14:29.67ID:jdBIz2nU0
>>292
aaaもbufも同じ場所。大抵のコンパイラでは同じアドレスを指す。C解るならclassをstructに置き換えて考えたらいい。それと一緒。
2017/10/29(日) 11:15:45.86ID:k1qoOab2d
operator newの再定義ね。
2017/10/29(日) 11:29:26.33ID:Heo7FnD+0
ていうか>>294ハ質問者本人かしつれいorz

>>292のMyClass::inputdisp(int aa)のコードは、名前が適当にマングルされて(*1)
 void hoge(MyClass* this, int aa) // (1)
という2引数の関数としてコードセクションにコードが格納される、というのが真実(*2)(*3)
オブジェクトaaaを動的にNewを使ってインスタンスを生成しようがスタティックに生成しようが、
そんなこととは無関係に、aaa.inputdisp((int型データ))というメソッドの呼び出しは(1)の関数呼び出しにコンパイルされる

*1: ここでは簡単のため’hoge’という名前にマングルされたとしている。本当は引数の型や戻り値も情報として含む名前になるが省略
*2: C++の言語規格でそうせよ決まっているかどうかは知らないが、そう処理する処理系しか無いと思う
*3: コードセクションがROM上なのかRAM上なのかはプログラマーがコードセクションをどう割り付けたかによる
299デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 12:14:39.69ID:5nFESEae0
>296
うろ覚えで使ってるが、
Section Type of Memory Section Type of Memory
 .bss RAM
 .stack RAM
 .data RAM
 .sysmem RAM
 .text  ROM   これがコード部分
 .その他 ROM
こういうのがある。

Hewの場合#pragumaでセクションを生成できたとおもうが、一般的に#pragma とかで割り当てできるんだろうか?
今回はTiのコンパイラを使う予定なので初めての試み。
多分 
static Myclass aaa;
みたいにスタティックかなにかを冠して宣言すれば.textにコードは配置されると思うが、どうなんだろう。
スタティックなんだから原理的には配置はどうにでもなる筈。
300デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 12:18:36.34ID:5nFESEae0
問題はスタティックにした場合, コードは.textに配置されるとしてもdataが.dataに配置されると非常にまずい。
スタックでやってもらえないと困る。
2017/10/29(日) 12:34:41.62ID:n8H8yUIJM
>>300
関数が再入されることを考えたら普通にスタックに配置されると思うよ。
むしろstaticにしたらスタックには配置されない。
ここまでインスタンスの話。
コードはいずれにしても.textに配置されると思うよ。特に指定がない限り。でもそれは>>300にとっても問題にならないかと。
2017/10/29(日) 12:40:57.57ID:oFRxn/Jf0
>>289
30年ぐらい前に ROM2KB, RAM2KB の Z80 ボード用プログラムをC言語で作ったことあるよ。
303デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 12:43:00.92ID:5nFESEae0
例えば、パネル表示をまとめたクラスのような場合にはクラスのメソッド部分が非常に大きくなる。しかもライブラリ
的に使うわけだから、階層のわりと下で使うことになる。3階層あって、2階層目くらいから同時にいくつかが
生成されてしまう可能性も高い。するとRAMエリアが直ぐにパンクする。なのでメソッドを大量に含んだライブラリ的な
働きをするクラスに関しては、.textにあってほしい。それは可能だと思うがじゃあそのクラス内でつかうバッファなどの
変数なんかが問題になる。これは動的に生成しないとクラスの使い道が非常に限られてくる。第一suba()で使っていて
subb()で使うとバッファエリアが壊れてしまう。
1.bufを持てないクラスなんて殆ど意味がない。
2.bufをスタティックにしか配置できないクラスなんて使い道がない。
3.小規模マイコンでメソッドをramに確保するなんて馬鹿げている。
これは明らかだよね。
 つまりMyclassのbuf[1000]、メソード関数()(例えば50個)をスタックと.textにそれぞれ上手く配置する工夫が
絶対に必要ってことだね。
304デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 12:45:06.72ID:5nFESEae0
>コードはいずれにしても.textに配置されると思うよ。特に指定がない限り。でもそれは>>300にとっても問題にならないかと。

であれば何も問題ないですね。
2017/10/29(日) 12:54:06.20ID:t3scGPtZ0
組み込みはPCで動くの違って配置も考えないといけないから大変だな

マイコンでの配置に関してはここより組み込みが普通の電電板のマイコンスレでの方が良いような気がするが。
2017/10/29(日) 16:49:46.36ID:9sOuhtQV0
>>274
純粋にC言語の書き方するだけならコンパイラの能力次第だと思う
307デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 18:26:51.08ID:5nFESEae0
ヘッダファイルに型定義して、実装をCPPに書くのってどうかなーと思う。特に組み込み
だとファイルを分ける意味がわからない。分けるとクラスのイメージが掴みにくい気がする。
2017/10/29(日) 18:28:45.31ID:k1qoOab2d
>>307
コンパイル時間短縮とか中身の隠蔽とかしたいなら、ソースとヘッダーを分けてもいいんじゃね?
2017/10/29(日) 18:58:48.05ID:9sOuhtQV0
>>307
その定義した型を他のファイルから使う時はどうするのさ?
単一のファイルしか使ってないなら分ける必要はないけど
310デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 19:08:11.02ID:5nFESEae0
クラスってのは型の定義なんだから、使う時は全部インクルードではだめなの?
例えば
clsAAA.h
clsBBB.h
...
clsXXX.h

main.cpp
の中で
include "cls\clsAAA.h"
include "cls\clsBBB.h"
....
include "cls\clsXXX.h"
311デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 19:13:52.28ID:5nFESEae0
>コンパイル時間短縮とか中身の隠蔽とかしたいなら、ソースとヘッダーを分けてもいいんじゃね?
100個くらいクラスがあってもどってことないと思うが、、、ロード時間が問題になるんだったら
clsディレクトリにクラスファイルを入れて
prtディレクトリにメソッドを実装しない型だけ抜き出したのを入れといて、xxx.prtをインクルードする
方がいいと思う。
312デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 19:15:39.48ID:5nFESEae0
prtは自動生成できるって前提だy。
313デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 19:18:10.19ID:5nFESEae0
やっぱりメッソドがデータなんかと分離するのはわかり難い。他のオブジェクト指向のコンパイラでもそんなことはしないしね。
2017/10/29(日) 19:21:46.87ID:qxWnFrvp0
ヘッダだけだと循環参照起きるし、循環参照起きるところだけcppってのも気持ち悪い
2017/10/29(日) 19:34:33.73ID:XE573cMW0
>>313
分けなきゃいけないことはない
分けた方が効率が良い(場合が多い)というだけだから
理解した上で敢えて分けないならそれはそれで好きにすれば良い
2017/10/29(日) 19:36:43.09ID:k1qoOab2d
>>314
inlineキーワード使って定義もヘッダーに書いちゃえば?
2017/10/29(日) 20:07:38.66ID:9sOuhtQV0
>>307
> ヘッダファイルに型定義して、実装をCPPに書くのってどうかなーと思う。

>>310
> クラスってのは型の定義なんだから、使う時は全部インクルードではだめなの?

いったい何をどうしたいのかさっぱりわからん
318デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 20:13:48.53ID:5nFESEae0
>314
前方宣言でいいのでは?
そういうのは特殊な場合だけだから
2017/10/29(日) 22:07:47.02ID:qxWnFrvp0
>>318
class Aからclass Bのメソッドを呼んで
class Bからclass Aのメソッドを呼ぶ場合前方宣言だけでは無理なはず
2017/10/29(日) 22:10:20.28ID:k1qoOab2d
>>319
宣言を両方最初に書いておき、定義を後に書く。
2017/10/29(日) 22:21:25.90ID:qxWnFrvp0
>>320
class Aとclass Bが同じファイルで定義されてるならいいかもしれないけど、そうじゃない場合のほうが多いでしょ
322デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/29(日) 22:40:54.16ID:5nFESEae0
いづれにしてもメソッドをばらして別ファイルに書くほうが良いという根拠にはならんだろ。
2017/10/29(日) 22:52:18.92ID:qxWnFrvp0
一部分けなきゃできないところがあるから全部分けるだけで、できるならc#とかみたいに全部一つのファイルに書きたい
2017/10/29(日) 23:53:27.12ID:OlzRTZr+0
それだとクラスが縦に長くなって範囲がぱっと見わからなる
1クラス1ファイルの場合はいいけどさ
2017/10/30(月) 01:18:16.05ID:ImI1HNcW0
てかコードの利用者はヘッダしか見ねーんだから普通に分けとけよ
326デフォルトの名無しさん (ワッチョイ 139d-xXVv)
垢版 |
2017/10/30(月) 03:59:29.97ID:XQpDzkmg0
>323
できないところってどんなところ? C#にできてC++にできないなんてどういうことか意味わからん。
cls::とか邪魔くさい。悪しき慣習だろ。あまりにばかげてるからC#では止めにしただけでしょ。
327デフォルトの名無しさん (ワッチョイ 6b3b-OCcV)
垢版 |
2017/10/30(月) 05:31:15.27ID:shFErbol0
>>323
一部だけ分けりゃいいじゃん
それとシングルソースにしちまうと分担がしにくいだろ
2017/10/30(月) 09:03:26.26ID:d9bwD/eVM
>>327
ヘッダとソースを分けないでって意味でシングルソースってことではないと思うぞ
2017/10/30(月) 10:19:54.36ID:/9ncNuq00
モジュールについては検討中みたいだからそのうち仕様に入るんじゃね?
コンセプト並みのビッグトピックだからどんどん後ろ倒しされそうな気もするけど。
2017/10/30(月) 22:49:10.56ID:ao9CiOaa0
vector<shared_ptr<T>>を使う場合、
shared_ptrから自分自身のvector上のindexを取得するにはvector要素を1つずつ走査していくしかないんかね?

vector[0]のアドレスをうまく引き算すればうまくいくかと思いきや、
shared_ptr自体は同じアドレスを持つインスタンスがvectorに格納されているわけでないのでうまく行かんのです
331デフォルトの名無しさん (ワッチョイ 6b3e-qypI)
垢版 |
2017/10/30(月) 23:15:50.92ID:GaTL14js0
>>330
基本的には無理。

何らかの基準でソート状態を保たせていれば、バイナリサーチ系の処理(lower_boundとか)が使えるので、必ずしも一個づつチェックする必要は無い。
2017/10/31(火) 01:31:02.70ID:Bb7HxcAo0
もしindexが変わらんのであれば別にmap<shared_ptr<T>, int>持つとか
Tにindex持たせるとか
2017/10/31(火) 06:49:36.25ID:/ULkeF1E0
cppで作ったライブラリ(.a)をcに取り込むときって何か注意いる?

cppには公開apiを1つ用意して、そのなかでクラスを作って計算させようとしてる
334デフォルトの名無しさん (ワッチョイ 6b3e-qypI)
垢版 |
2017/10/31(火) 08:34:02.64ID:tApLOrdW0
>>333
その公開apiをextern "C"するのを忘れない事。
2017/10/31(火) 09:33:49.44ID:54GXLgHP0
extern "C" しとかないと大抵はリンクの段階で失敗してくれるから、そんなにおかしなことにもならないだろうけどね。
あとは C++ 側で作ったライブラリから例外が送出されると C 側を通過できなくてクラッシュする環境がある。
2017/10/31(火) 11:08:02.92ID:B8ReYjkr0
>>300
やり方しだいジャネーノ?C++推奨しないが、スタックが〜 ramが〜っていうなら自分で管理するか、newに任せるにして実験すればいいんじゃね?
#include <stdio.h>
#include <string.h>
char buf_hige[1000];
class Hoge {
private: char *m_pBuf; int m_size, m_IsNew;
public:
Hoge(char *p, int s) { m_size = s; m_pBuf = p; m_IsNew = 0; }
Hoge() : m_size(100) { m_pBuf = new char[m_size]; m_IsNew = 1; }
~Hoge() { if (m_IsNew) { delete[]m_pBuf; printf("~Hoge()自動削除\n"); } else printf("~Hoge()\n"); }
void zero() { memset(m_pBuf, 0, m_size); }
void show() { printf("アドレス %p size %d\n", m_pBuf, m_size); }
};
void main() {
char buf_hoge[200];
Hoge a(buf_hige, sizeof(buf_hige));// 自分でメモリー割り当ててクラスを使う 普通は ram.. #pragmaとかで移動できる?
Hoge b(buf_hoge, sizeof(buf_hoge));// 自分でメモリー割り当ててクラスを使う mainのstack
Hoge c;// 内部でnew/deleteして動的に使う ram
a.zero(); b.zero(); c.zero(); a.show(); b.show(); c.show();
}
2017/10/31(火) 14:04:56.90ID:QkT+8axj0
普通の opereter new 定義するだけじゃ駄目なの?
2017/10/31(火) 15:27:26.38ID:ivXWtcCM0
その例なら m_pBuf とか m_size とか m_isNew がどこに置かれるかって話してるんだよ
2017/10/31(火) 15:50:52.40ID:54GXLgHP0
>>300
リンカスクリプトで定義できるんじゃねーの
2017/10/31(火) 20:31:59.83ID:cRyJj2TVM
>>331
>>332
返信thx
やっぱむりかー。index持たせる方向で検討します
2017/11/01(水) 09:45:22.08ID:Rrk0WseL0
>>338
リンカーでMAP指定して確認したらいいんじゃねーの?アドレスわかるだろ?
2017/11/01(水) 23:49:32.94ID:KV/dR0JW0
共用体って使い道あるの?
素人目からしたら役に立つようには到底思えない
2017/11/02(木) 00:33:40.96ID:4tfXXWiS0
使わずに済むならそれにこしたことはないだろうけど、
部分的に動的型みたいにしたいときは有るよ。
yacc が生成するコードに出てきたりする。
2017/11/02(木) 01:14:44.84ID:6O09mL2X0
>>342
例えば通信パケットとかで必ず固定長だけど、複数の箇所のコマンドとか意味とかのコードで
内容がコロコロ変わる様な時は便利かも知れない?
それぞれの構造体にキャストしろよって言いたくもなるけど、
複数の人で開発してると通信パケットの内容とかで下らない不具合出したくないから
1つのヘッダで全部規定したりって事はあったな
2017/11/02(木) 01:35:58.84ID:6O09mL2X0
あ、後H8開発してた時とか、メモリマップドIOとかがモードでコロコロ意味変わる時、
1バイトのデータになったりビットフィールドになったりなとことかがunionになってた
2017/11/02(木) 04:56:03.82ID:i8MAyZKO0
union RGBA{
struct {R:5,G:5,B:5,A:1};
std::uint16_t Colors;
};
こんな感じのことするけど。たまに。
2017/11/02(木) 04:57:25.31ID:i8MAyZKO0
あ、片宣言抜けてた。
たまにしか使わないからなぁ。
struct {std::uint16_t R:5,G:5,B:5,A:1};
2017/11/02(木) 09:40:30.47ID:N8nuZaLN0
union { double d; int i; char c;} u;
は1番大きな要素、この場合は double d のサイズと
メモリアライメントを持つというのが union の重要な機能
これのおかげで非ワード境界からワードを読もうとするようなコードを避けられる
349デフォルトの名無しさん (ワッチョイ 42d2-81c4)
垢版 |
2017/11/02(木) 21:55:55.26ID:JP+uyw1T0
#pragma data_seg
でdllの共有領域を作ってるんですけど

ここにクラスのインスタンスを置いておくことはできますか?
2017/11/02(木) 22:11:01.00ID:e7UKjGN4F
コンストラクタのない、構造体にメンバ関数付いただけのクラスのインスタンスなら大丈夫じゃないかな。
動的にメモリをアロケーションするクラスではアロケーションしたメモリは共有されないので注意。
2017/11/02(木) 22:11:46.90ID:m+SMCXhed

共有されないってのは「プロセス間で」ということね
2017/11/02(木) 23:18:08.17ID:H/ANuUhm0
>>348
『プログラミング言語C』のmalloc()の実装例のやつで見た
2017/11/03(金) 00:39:07.86ID:Xm/a3Zyv0
共用体は、パリティチェックで使う

あるサイズの内容を、ある方法で計算して、データが破壊・改変されていないか。
通信データが正しいかどうか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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