【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/07/18(火) 07:07:27.20ID:vzMDiUgd
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/
2017/08/01(火) 23:06:29.76ID:mGfRGHrE
>>240
%u に int 渡してんじゃねーよ
2017/08/01(火) 23:19:17.88ID:Oo5iWDLT
>>238
http://www.wdic.org/w/TECH/CHAR_BIT
2017/08/01(火) 23:26:14.17ID:Oo5iWDLT
%huなんて知らなかったなあ。
https://stackoverflow.com/questions/8699812/what-is-the-format-specifier-for-unsigned-short-int
2017/08/02(水) 00:27:59.29ID:AGgV01p7
>>238
C++のときはstd::bitsetも使えるぞい
https://cpprefjp.github.io/reference/bitset/to_string.html
2017/08/02(水) 00:33:11.36ID:hTaTWBJY
>>244
情報ありがとう。
2017/08/02(水) 17:58:47.10ID:denJnq0F
ぞいってなー
247デフォルトの名無しさん
垢版 |
2017/08/02(水) 22:14:43.24ID:TeM237FQ
class CManiac {
private: char* m_pc;
public:
virtual ~CManiac() {
cout<<"destr "<< this << " : " << &m_pc << endl;
delete[] m_pc;
}
CManiac() : m_pc(new char[1]) { cout<<"constr "<< this <<endl;}
void getAdrs(){ cout<< this <<" : "<< &m_pc << endl; }
};
int main() {
vector<CManiac> vecmaniac;
vecmaniac.resize(3);
vecmaniac[0].getAdrs();
vecmaniac[1].getAdrs();
vecmaniac[2].getAdrs();
  return 0;
}
constr 0x22fe40
destr 0x22fe40 : 0x22fe44
0x3b1678 : 0x3b167c
0x3b1680 : 0x3b1684
0x3b1688 : 0x3b168c
destr 0x3b1678 : 0x3b167c
destr 0x3b1680 : 0x3b1684
destr 0x3b1688 : 0x3b168c

vectorに自作クラスのインスタンスを入れるとき、このコードだとm_pc;が指すアドレスが2重開放になるとかで
デフォルトコンストラクタとコピーコンストラクタとデストラクタの3つが必須だと書いてあったのですが、エラー無しで出力できます。
デストラクタのところで<<m_pc;と書いても、何故か文字化けしてしまうのでアドレスが分からないんですが
本来、resizeを使ってインスタンスを生成したら、m_pc(new char[1])で作った領域は3つとも同じになるということですか?
あと、最初に呼び出されている0x22fe40 は何のインスタンスなんですか?回答宜しくお願いします。
2017/08/02(水) 22:27:48.20ID:tJX9Zx+g
new char[1]は、要素数1の動的配列へのポインターで、中身は初期化されていない。
2017/08/02(水) 22:33:06.29ID:tJX9Zx+g
<< m_pcと書くと、当然m_pcは、C文字列として解釈されるが、初期化されておらず、ヌル終端とは限らないので、
文字化けする。
2017/08/02(水) 22:35:13.01ID:tJX9Zx+g
教訓。生ポインターは使うな。std::stringやstd::vectorなどを使え。
2017/08/02(水) 22:46:24.97ID:tJX9Zx+g
resizeは、引数なしのコンストラクターでオブジェクトを作成して、それをvector内部にコピーする。
このコピーの際にコピーコンストラクターが使われる。コピーコンストラクターは記述されていないから、暗黙のものが使われる。
それはポインターの中身をコピーしていないから、問題がある。
2017/08/02(水) 22:57:09.01ID:tJX9Zx+g
よくわからなければ、
CManiac(const CManiac& cm)
{ ... }
というコピーコンストラクターを書き加えてみるとよい。
2017/08/02(水) 22:59:09.90ID:tJX9Zx+g
代入の
CManiac& operater=(const CManiac& cm)
{
...
return *this;
}
も追加。
2017/08/02(水) 23:05:54.19ID:qrhQzK+m
unsigned intなどを使って何かいい事有るのか?普通にint使えばいいだろ?
2017/08/02(水) 23:06:30.72ID:tJX9Zx+g
IDEのデバッグ機能を使えば、std::vector::resizeなどのソースコードも読めるよ。
2017/08/02(水) 23:08:15.66ID:tJX9Zx+g
>>254
符号なし整数の比較が出来る。負の場合を考えずに済む。
2017/08/02(水) 23:10:24.82ID:qU91jTb3
>new char[1]は、要素数1の動的配列へのポインター
んなこたーない
2017/08/02(水) 23:11:05.31ID:tJX9Zx+g
符号ありよりも大きな範囲を扱える。ビット演算やビットフィールドで便利。
2017/08/02(水) 23:44:31.73ID:qU91jTb3
この実行結果を見て>>251の回答が瞬時に出てくるのはひょっとして凄い奴なのではないか?
と一瞬でも思ってしまった自分が恥ずかしい
2017/08/02(水) 23:59:09.86ID:qU91jTb3
ライブラリ仕様の変遷を理解した上で質問者に回答を合わせる
などという高度な対応がクソコテにできる筈も無かった
2017/08/03(木) 00:21:51.89ID:1LfxTpLV
>符号ありよりも大きな範囲を扱える
確かにそうだな
言語仕様の規格上は
2017/08/03(木) 00:37:28.83ID:YO3k3fE8
>>251
コピーコンストラクターじゃなくて、代入でした。すみません。
2017/08/03(木) 00:44:37.38ID:YO3k3fE8
>>262
あ、コピーコンストラクターは、C++03の方で、C++11なら、ムーブコンストラクターとムーブ代入が使えるから、少し動作が違うんだった。
264ねこまじ
垢版 |
2017/08/03(木) 00:45:34.22ID:t0J1S2SM
Youtuberヒカルが月収を明らかに!!おはよう朝日です出演
https://www.youtube.com/watch?v=RLZGrqQnnZc
第1回案件王ランキング!YouTuberで1番稼いでるのは誰だ!
https://www.youtube.com/watch?v=asF2wQ2xhjY&;t=61s
ユーチューバーの儲けのカラクリを徹底検証!
https://www.youtube.com/watch?v=FUSb4erJSXE&;t=504s
【給料公開】チャンネル登録者4万人突破記念!YouTuberの月収公開!
https://www.youtube.com/watch?v=Y7DAQ0RKilM&;t=326s
誰も言わないなら俺がYouTuberのギャラ相場を教えます
https://www.youtube.com/watch?v=E4q-vaQh2EQ&;t=118s
YouTuberになりたいのは馬鹿じゃない!YouTuberになる方法
https://www.youtube.com/watch?v=Fr0WXXZRMSQ

最高月収5000万円だとさ。年収じゃなくて「月収」な
誰でも参入可能だからおまえらもyoutubeに動画投稿したほうがいい
顔出したくないならラファエルみたいに仮面かぶればいい
手っ取り早く視聴数稼ぐには有名ユーチューバーへの物申す系動画がオススメ
ゲーム実況はニッチだから人気ユーチューバーのネタをパクればいい
2017/08/03(木) 00:48:11.43ID:YO3k3fE8
ってことは、C++11の場合は、
CManiac(CManiac&& cm)
{ ... }

CManiac& operater=(CManiac&& cm)
{
...
return *this;
}
を書くんだね。これで完璧。
2017/08/03(木) 00:48:42.44ID:cUZMqwjs
>>257
違うの?
2017/08/03(木) 01:02:12.67ID:cUZMqwjs
あ、動的配列じゃなくてヒープのアドレスとってるだけよということかな
2017/08/03(木) 01:02:16.06ID:YO3k3fE8
C++11のemplace_backを忘れてた。コピーせずに、vector内部で直接構築されるんだった。
2017/08/03(木) 07:14:24.41ID:jHHnzd5n
>>266
「アドレス」でなく「ポインター」という言葉を使っているので正しくない
要素数1の動的配列の先頭要素へのポインター
270デフォルトの名無しさん
垢版 |
2017/08/03(木) 13:14:53.27ID:vWCSRcUD
>>248
コピーコンストラクタ無しのm_pcが同じアドレスを参照している確認取れました。
丁寧な解説ありがとうございました。
2017/08/03(木) 14:40:42.21ID:xqHGpC9q
ふえぇぼうよー先生の本凄く読みずらいよ・・・
2017/08/03(木) 16:53:01.55ID:2WeFShGG
>>241
言いたいことはわかるけど
キャストしたところで何もしないぜ?
2017/08/03(木) 16:58:53.44ID:2WeFShGG
何もしないってのは吐き出されるコードが不変て意味ね
個人的にはキャストするけど
2017/08/03(木) 20:14:02.94ID:Wy5AX0em
intが32bitな64bit環境下だとして
printfの可変長引数で32bit整数を64bitに自動拡張するときの
拡張のされ方が変わるんじゃね?
ただし%uによって32bit分しか見に行かないから無視してよいけど
コード不変とはならないんじゃね?
2017/08/03(木) 20:21:13.08ID:D1Re6UdQ
%z と %d の差ですかい?
2017/08/03(木) 20:24:42.71ID:Wy5AX0em
いや、64bitに自動拡張してスタックに積む際に
2017/08/03(木) 20:28:36.06ID:D1Re6UdQ
int が32bit なら 可変長引数部でスタックに詰むとき
暗黙で 64bit に自動拡張はやらんのじゃないの?
2017/08/03(木) 21:31:57.89ID:2WeFShGG
やったら破綻する
2017/08/03(木) 22:25:13.00ID:2WeFShGG
嘘ですサーセン
2017/08/03(木) 22:54:52.47ID:84Bc5dj3
>>273
そんな保証はないよ
2017/08/03(木) 23:29:16.77ID:2WeFShGG
保証は無いね
x64の場合でもキャストしようがしまいが0拡張になるけど
差が出るとしたらどんな場合?
2017/08/03(木) 23:48:26.53ID:Wy5AX0em
常に0拡張は信じがたい
負数の時おかしくなるだろ・・・
2017/08/03(木) 23:49:27.73ID:2WeFShGG
intが32bitの処理系の話ね
32bitのintを64bitに符号拡張するのはダメでしょ
2017/08/04(金) 07:09:12.01ID:KzbqP8qx
>>282
>負数の時おかしくなるだろ・・・
ならねーよ
printfは32bitしか取り出さねーんだから
2017/08/04(金) 08:30:27.75ID:oD3njs5y
64bit で引き出したうえで 32bit しか採用しないのか
32bit で引き出すだけなのか

後者は2個目いこう狂うわけ
2017/08/04(金) 08:46:19.49ID:SS0ANIEQ
64bitに自動拡張してスタックって、x64はpush eaxしたら8バイトpushされんの?
2017/08/04(金) 08:47:48.89ID:Q7buFUOM
8、16でも前者でしょ
2017/08/04(金) 08:48:26.38ID:Q7buFUOM
push raxになる
2017/08/04(金) 08:53:09.50ID:Q7buFUOM
というわけでビッグエンディアンは糞である
2017/08/04(金) 09:16:15.84ID:SS0ANIEQ
int32にしてもスタックやキャッシュは倍の速度で消費されるのかよ。
2017/08/04(金) 09:27:05.86ID:Q7buFUOM
キャッシュは確認してないけど
スタックはポインタ幅で消費されるね
2017/08/04(金) 09:31:06.85ID:Q7buFUOM
実装依存だとは思う
VisualStudioではそうだっつーだけ
2017/08/04(金) 12:56:51.39ID:+PWQy8Ni
実装依存じゃない
x86-64の仕様
2017/08/04(金) 12:57:32.28ID:+PWQy8Ni
普通、引数の受け渡しはスタックじゃなくてレジスタ使うけど
2017/08/04(金) 13:15:35.79ID:SS0ANIEQ
呼出規約については知らないのか。
2017/08/04(金) 14:31:21.93ID:PHBV9/TP
呼び出し規約は実装依存ではないけどアーキテクチャ依存でもないよ
そして、引数の受け渡しにレジスタをどう使うかというのは呼び出し規約と関係なく実装依存
さらに、引数はスタックに積まれるし、それはレジスタどうのこうのとは関係のない話
2017/08/04(金) 14:49:43.29ID:SS0ANIEQ
何を言ってるかさっぱり意味が分らないや。
2017/08/04(金) 14:56:40.96ID:oD3njs5y
引数を { 頭から 末尾から } { レジスタ スタック } につんで
つんだ引数の巻き戻しを { 呼び出し側 呼ばれた側 } で行う
2017/08/04(金) 18:15:41.13ID:fFEm/UGM
>>296
呼び出し規約がアーキテクチャーに依存しないなんてことはあり得ない
2017/08/04(金) 18:17:54.06ID:5d5G+9Ac
>>296はどうしようもない低能
その低能にマジレスみっともない
301デフォルトの名無しさん
垢版 |
2017/08/04(金) 18:24:58.70ID:gG3ajqK7
>>296
レジスタ少ないx86ではスタックだが、x86_64では第1引数から第7引数までキッチリどのレジスタに入れろって決まってる。
これをアーキ依存と言わずしてなんと言うのか。
2017/08/04(金) 19:06:39.89ID:gMHFD1Iy
その規約をやぶって、全部スタックに乗せる、という呼び出し規約を自分で実装していいですか?
2017/08/04(金) 19:13:12.05ID:07Vnvfe5
規約は他のプログラムと協調するためだけのもの。
他のプログラムと絡まないんなら好きにすればいい。
304デフォルトの名無しさん
垢版 |
2017/08/04(金) 19:20:42.44ID:gG3ajqK7
>>302
別にAPI単位の規約だから好きにすれば良いけど、スタックだと32bitよりメモリ喰うし増えたレジスタ活かさずメモリとやり取りだから関数呼び出しが多いほど速度に差が出るよ。
2017/08/04(金) 19:22:07.45ID:PHBV9/TP
>>301
勉強になったわ
2017/08/04(金) 19:37:44.52ID:9p5UOFbs
アセンブラで書くならともかく、
既存のコンパイラで自己流の呼び出し規約を使うって可能なのかな。
307デフォルトの名無しさん
垢版 |
2017/08/04(金) 19:43:40.82ID:gG3ajqK7
レジスタとか出てる時点でアセンブラやけどね。
高級言語からは同じに見えてもアセンブラからAPI呼ぶ時に混乱の元だから規約になってるんだろう。
2017/08/04(金) 19:47:10.77ID:LmZvF4Bx
>>306
自己流の呼び出し規約を使うのは自己流のコンパイラだけだろ
それが既存かどうかは知らんけど
2017/08/04(金) 19:49:02.44ID:fFEm/UGM
アセンブラでリーフ関数を呼ぶとき位だな
自己流が役立つのは
2017/08/04(金) 20:12:22.52ID:B2ZVqR3g
pro*cって何のために存在するの?
普通にc言語のコードにSQL埋め込めばよくね?
2017/08/04(金) 20:15:41.79ID:d/io8eQ7
>>301
第6引数までじゃね? 普通は rdi rsi rdx rcx r8 r9
rax も浮動小数の個数に使うが
windowsだけは rdx rcx r8 r9 だった気がする。
2017/08/04(金) 20:27:46.30ID:fFEm/UGM
floatやdoubleが混ざれば
2017/08/04(金) 23:32:26.83ID:ajRTrwbv
>>310
普通はCにSQL埋め込むなんてできないだろ。
SQL文を送ってコンパイルする関数を呼んで実行する関数を呼んで結果を取得する関数を呼ぶので
かまわないならPro*Cなんて必要ない。

それにしてもなんで今頃Pro*Cなんだろうか。とっくに廃止されたかと思ってた。
2017/08/05(土) 01:02:35.26ID:wHnek147
よくわからないんだけどSQLと連動できるプログラム言語ってあるの?
2017/08/05(土) 01:36:09.75ID:AmDvMFkm
Transact-SQLとかのことか?
2017/08/05(土) 02:01:06.28ID:mmL6pr8y
Linq とか
2017/08/05(土) 13:32:17.23ID:9ltGhnE7
>>314
SQL埋め込みコボルが世の中に何百万行残ってるとおもってんだ
2017/08/05(土) 17:30:23.26ID:eD6LHYAo
>>293
そりゃそうか
失礼しました
2017/08/06(日) 15:44:19.07ID:4cVoKrwP
コボルかー
じゃjavaとかpythonとかC++やCで大量データを扱おうと思ったら何らかのアルゴリズムでデーターベース自作するしかないの?
それともそういう目的だとすべからくLinqとかつかってるの?
2017/08/06(日) 16:33:45.26ID:k6XOSsfa
ORまっぱ
2017/08/07(月) 00:24:32.53ID:9fB0IwUX
大量のデータを処理したいのならPLSQLとかのdb上で動作するやつじゃないの?
2017/08/07(月) 00:26:46.20ID:DdwwpY1/
DB操作用のクラスが標準ライブラリにあるから、その言語はSQLをサポートしてると思ってるのだろう。
2017/08/08(火) 21:38:02.52ID:9+bCDZAx
const char ex1[] = "test";
const char ex2[] = { 't', 'e', 's', 't', '\0' };
auto ex3 = "test";
auto& ex4 = "test";
auto&& ex5 = "test";

ググってみると、ex1とex2は完全に等価、ex3はconst char*?
ex4とex5はconst char[]だけどex1、ex2と等価ではない?
どういうことッスか?なんかよー分からんです。
2017/08/08(火) 21:44:21.88ID:RV4q7wps
変数名の上にマウスポインターを持って行く
ぐらいは試したのだろうか
2017/08/08(火) 22:10:21.09ID:FFmZneRO
誰もかれもがモダンな統合開発環境を使ってると思ったら間違いやで。
2017/08/08(火) 22:12:27.93ID:m3/ZcJyF
早くナウいモダンボーイになれよ
2017/08/08(火) 22:13:12.16ID:RV4q7wps
>>325
その通りだ
では
http://ideone.com/GtYLLG
この結果を見てわからなければ出家するしかない

ついでにex1,2は関数が実行される度に配列が作られる
2017/08/08(火) 22:16:15.22ID:m3/ZcJyF
配列への参照というのが分かりにくいね。
2017/08/09(水) 18:30:53.88ID:hewgQard
using F = void () &;
struct A { void f() & {} };
F A::*const &mp = &A::f;

参照もこのぐらい複雑になるとコンパイラーですら正しく実装できないものが出てくる
2017/08/09(水) 20:42:43.33ID:deJRgLks
初心者歓迎スレはいつから難読コードスレになったんだ?
2017/08/09(水) 23:21:19.78ID:HVjwey6J
難読禁止スレではないし
それより言語を断らずにc++限定の話すんなや
2017/08/09(水) 23:58:04.92ID:1RczvVHb
ぷらぷらは意図しない難読化しやすいよなぁ
2017/08/10(木) 00:19:15.22ID:iih/xgGV
おまえらは意図してドヤ顔でオナニーコード貼って理解できないなら出家しろとか言ってるからな。

初心者相手にマウンティングとか見てて恥ずかしい。
2017/08/10(木) 07:19:08.51ID:9leEGZbL
バカにマウンティングしてるお前や俺よりマシだろ w
2017/08/10(木) 07:42:54.68ID:0ifqJKrS
http://d.hatena.ne.jp/yupo5656/20060907/
この話ってグローバル変数の時だけと思っていいですか?
void f(){ const char g[] = "asdf"; }
だと毎回初期化する分、損になりそうに思うんですが
2017/08/10(木) 07:57:39.32ID:OxRJE4uH
普通は最適化されて何の問題もないだろうけど

組み込み用の一部の糞コンパイラとかで使う可能性があるなら書き換えておいた方が良いかもね
2017/08/10(木) 08:00:25.98ID:OxRJE4uH
極端に悪くなる可能性のあるコードにしない
汎用性のあるコードを書く時の基本

特定の環境だけならその環境でテストしてみればわかること
2017/08/10(木) 08:05:23.26ID:PWbZqU7d
>>335
だからstatic付けろって書いてあるっしょ
2017/08/10(木) 12:55:02.15ID:XSzwBP/X
リテラルに名前付けたいだけなら
auto&&var=リテラル
何も考えずこれでええw
2017/08/10(木) 13:19:12.39ID:eseR3mB4
せやろか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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