X



【初心者歓迎】C/C++室 Ver.104【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0453デフォルトの名無しさん
垢版 |
2019/02/11(月) 15:39:02.97ID:3tLemvMU
なんとなくわかった   ような気がする
生ポそのものはコンストラクタもデストラクタに何ら操作しないから宙ぶらりんこになるのか
0456はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/11(月) 15:52:25.23ID:eS7AzULV
まあまあ。
スマートポインタを活用しろというのはその通りだが、
ポインタ (や例外機構) を理解せずに
思考停止してスマートポインタを使うのはあかんやろ。

ここの元質問者はまだそこを理解しようとしている
ところなんだから、スマートポインタを使わなかった場合にどう書けば良いのか、
きちんと書くと面倒くさすぎるという体験も必要だろ。
0458さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/11(月) 16:28:46.52ID:fD0IDjkv
こんなときはナマポを使ってもよい:

処理の中で所有権が移動・消滅しない場合。
バイナリーデータやPODを生で扱う場合。
処理系がナマポやトークンやハンドルの入力を要求する場合。
0459デフォルトの名無しさん
垢版 |
2019/02/11(月) 16:36:19.07ID:QKPibkAC
生ポはスマポのオーバーヘッドすら許容できないときに使うものです
だから初心者は無理して生ポを使わなくていいです
0460デフォルトの名無しさん
垢版 |
2019/02/11(月) 16:59:08.84ID:V2lM2C5l
>>434
スマポは後になって導入されたもので人気がない、なんて意見は一般的ではないので無視して良い
0467デフォルトの名無しさん
垢版 |
2019/02/13(水) 06:16:37.08ID:2WlGbphz
>>463 今の言語は極力「生のポインタ」が見えないようにしてるからなぁ。
オレの乏しい知識で無理矢理ヒネリ出すなら、
「古いBASICの peek, poke のアドレス指定に変数を使った場合」かのう。
型のない単なるアドレスって言うか数値だけど。
0468デフォルトの名無しさん
垢版 |
2019/02/13(水) 15:13:52.62ID:Yg4iFXpY
upvar
0469デフォルトの名無しさん
垢版 |
2019/02/13(水) 15:46:18.41ID:SgfrIpbp
>>463
BYTE  ptr = アドレス値;

BYTE  MEM[4096 * 1024];  // 4GB のメモリ配列


*ptr  --->  MEM[ptr]  // ptr は MEM[] 配列の添え字
0472デフォルトの名無しさん
垢版 |
2019/02/13(水) 18:19:07.37ID:QnNf1eu6
恥の上塗り
0475デフォルトの名無しさん
垢版 |
2019/02/13(水) 22:43:21.58ID:8CyDgeqf
行儀よく バッファなんて 守れやしなかった
夜のサーバ オーバフロー起こしてまわった
*印見て アナルといわれた 早く添え字になりたかった
信じられぬ カーニハンとの 争いの中で
許しあい いったい何 解りあえただろう
うんざりしながら それでも過ごした ひとつだけ解ってたこと
このポインタからの 卒業
0476デフォルトの名無しさん
垢版 |
2019/02/14(木) 07:38:16.87ID:fSoz/vTj
まあstatic変数やglobal変数使ってリークしてないとか言い張るバカよりかは
ナマポ使えやとは思う。
それならまだコード修正効くからな。
初心者にスマポ使わせればリークしないコード書かせることができるって考えははっきりいって幻想だわ。
0477デフォルトの名無しさん
垢版 |
2019/02/14(木) 22:35:36.88ID:vW9ukCJU
昔研究室の後輩でポインタがわからないから全部グローバル変数でプログラム作ってるって奴がいて、
それはそれである意味すごいなって思ったわ。
マルチメディア系ライブラリを触る必要がある研究室なのだが。
元々組込系が得意な奴だったってのもあると思うけど。
0481デフォルトの名無しさん
垢版 |
2019/02/15(金) 00:46:46.72ID:TR5VS7Vw
mp4boxをちょこっといじったのを作ろうとしたんだけど、
signed int32の計算で -2112000 / 48000 の結果が 89434 になるんですが。
VS2015のx64です。
0482デフォルトの名無しさん
垢版 |
2019/02/15(金) 06:57:51.95ID:OZ8Dcboc
>>481 「-2112000 / 48000 の結果が 89434」

その環境を持ってないんで分からないけど、
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
両者のビットパターンが一致することと関係ありそうね。

被除数の -2112000 を64bitで表現する際に
符号拡張 0x_ffff_ffff_ffdf_c600 とすべきなのに
ゼロ拡張 0x_0000_0000_ffdf_c600 にしちゃって、
その後の計算は64bit正数でやってる感じかな。
0485482
垢版 |
2019/02/15(金) 07:53:28.61ID:OZ8Dcboc
再び >>481 「-2112000 / 48000 の結果が 89434」 (間違いを訂正)

-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
ビットパターン一致してないね。桁数多くて見間違えちゃった(テヘペロ)。

-2112000 を32bitで表現すると 0xffdfc600 であり、
これをゼロ拡張した 0x_0000_0000_ffdf_fc600 == 4292855330 を
48000 で割り算して小数部を捨てれば 89434 という答えが出る。
ということなら合ってるかな。
0487デフォルトの名無しさん
垢版 |
2019/02/15(金) 09:49:31.73ID:tuwIijw4
>>481
どうせ48000がunsignedなんじゃねーの
それにつられて -2112000もunsignedになって4292855296
その結果が薬師美代ちゃん
0488デフォルトの名無しさん
垢版 |
2019/02/15(金) 13:45:38.25ID:TNDmXWGM
>>479
自分が何してるか判って使う分には問題無いな
適材適所だ
0489デフォルトの名無しさん
垢版 |
2019/02/15(金) 21:13:40.77ID:kkRd+/gL
>>480
>スマートポインタを使うとコード修正効かなくなる
どういう風に読むとそういう理解になるのか。。
まずは日本語の理解が必要だな。
0490デフォルトの名無しさん
垢版 |
2019/02/17(日) 07:14:37.91ID:KxX3tJEE
超初歩的な質問になるのですが
scanf関数を使って20個未満の任意の数だけ、数値を配列変数で受け取りたいです
たとえば「2 4 8 9」と入力し、Enterが押されたらそれで確定
num[0]=2
num[1]=4
num[2]=8
num[3]=9
としたいわけです。

どうしたらよいでしょうか?
一応自分で考えたコード(期待通りの動きをしません)を掲載します
for(i=0;i<20;i++){
scanf("%d",&num[i]);
if(num[i]==‘¥n’){
break;
}
}
0492デフォルトの名無しさん
垢版 |
2019/02/17(日) 09:09:16.12ID:uZDoAvc4
>>490
scanfや標準ライブラリの関数など、参考書とかで普通の使い方はわかると思うけど、細かい仕様をmsdnやmanコマンドで調べるようにするとかなり理解が広がると思うよ。
0493デフォルトの名無しさん
垢版 |
2019/02/17(日) 22:37:58.74ID:O/E0SKNM
中途半端なUI使うよりもcsvパーサーを作るかどっかからとってくるかすれば?
0495 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 00:59:53.43ID:aN2QSVsl
>>494
むしろ遅くなる方に振れるでしょうけれど、そんなのどうでもいいのでは?
0496デフォルトの名無しさん
垢版 |
2019/02/18(月) 01:22:44.39ID:c9cLPpQ7
autoって変数の型宣言の話だよね?
コンパイルは遅くなるのか
速くしたい時はどうすりゃ良いの?
0497はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/18(月) 01:27:51.06ID:ViRlfcsh
C++ の auto は右辺と一致させるように推論するだけの単純機構で、
ややこしい演算で推論するわけではないので、
コンパイル速度ではほとんど差はないと思うよ。
0498デフォルトの名無しさん
垢版 |
2019/02/18(月) 01:30:04.86ID:tKsXQ0K5
autoはむしろコンパイル速くなるんじゃない?
いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけでいいんだから
C++でコンパイルを速くするのは簡単で、単純にソースファイル数とインクルードするヘッダを減らせばいい
C++のコンパイルが遅いのは主にコンパイル単位という時代遅れで極めて非効率なコンパイル戦略に起因しており、実はコードの複雑さ自体はわりとどうでもいい
0499 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 01:31:11.50ID:aN2QSVsl
>>496
C++を言語として選択した時点で「記述の時間やコンパイル時間を投資して実行時間を稼ぐ」という思想なのでは?コンパイル時間を短くする努力はする気がないと思います
0500 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 01:32:21.67ID:aN2QSVsl
>>498
>いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけ
この記述はコンパイル時を想定しているの?それとも実行時を想定しているの?
はっきりさせたいので念のために確認します
0501デフォルトの名無しさん
垢版 |
2019/02/18(月) 05:41:12.34ID:KTgkm+s5
>>490 サーバーの 503 エラーに引っかかって昨日のうちに書けなかったんだが…。

>>491 の方法だと Enter が単純に読み捨てられて scanf() が終了せず
まだ入力をよこせと言ってくるからダメみたいね。

11 22 33 (Enter) だと読み込みが継続、期待通りに動作しない
11 22 33 x (Enter) なら x を解釈する時点で scanf() が 0 を返してループ脱出


先に文字列として1行読み込んで sscanf() と思ったけど…
ndat = sscanf(s, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9],
&num[10], &num[11], &num[12], &num[13], &num[14], &num[15], &num[16], &num[17], &num[18], &num[19]);
実際に読めた値の個数は ndat に入る。
これは書くのもメンテナンスするのも嫌だなぁ。

strtol() で1個ずつ数値を拾いつつ、地道にポインタ進める方が良いかも。
0502デフォルトの名無しさん
垢版 |
2019/02/18(月) 05:53:27.02ID:KTgkm+s5
>>500 自分は >>498 の人じゃないけど。
ごく簡単な場合ながら、例えば
int val_a = func(para); // func() がint互換の値を返すかチェックが必要
auto val_b = func(para); // func() の返す型そのまんまで val_b を作ればいい

てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、
という考え方にも一理あるかと。
0503デフォルトの名無しさん
垢版 |
2019/02/18(月) 08:39:38.41ID:KTgkm+s5
瑣末なことだけど val_a, val_b って変数名は良くなかったね。
変数 variable の例なんだから var_a, var_b だわな。
というか、この場合は a, b で十分だ。
0505491
垢版 |
2019/02/18(月) 13:24:52.92ID:fHtoi1qq
>>501
ありがとう。ちゃんと確認してなかったわ。
タブに空白に改行はスキップしやがるんでしたか

別案としては fgets() ⇒ sscanf() になるんかな
0507デフォルトの名無しさん
垢版 |
2019/02/18(月) 15:27:41.58ID:bbNHvPxv
コンパイル時間にリンク時間は含まれますか?
0508デフォルトの名無しさん
垢版 |
2019/02/18(月) 15:28:58.14ID:bbNHvPxv
>>501
scanf は禁止

>>505 が正しい
0510 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 20:54:12.82ID:aN2QSVsl
>>502
>func() の返す型そのまんまで val_b を作ればいい
この発想は実行時なのでは?

>てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、
実行時の発想をコンパイル時に適用していいのでしょうか?
0511 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 20:54:41.05ID:aN2QSVsl
>>504
コンパイル時間を計測するのですか?…
0512 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 20:57:23.82ID:aN2QSVsl
>>509
賛成です、そういうのは1ラインを秘術を尽くして何とか読み込み、後で sscanf() とかを使うべき
0513デフォルトの名無しさん
垢版 |
2019/02/18(月) 21:15:24.03ID:JRPNr6+t
>>512
今回の例(>>490) のように可能な限り %d で抜き出して打ち切るとなると sscanf 単発では面倒
なんとか行単位でバッファに詰めた後
連続空白などでトークンに区切ってそのトークン単位で sscanf をぶんまわすような
ほのかな中途半端感が
0514デフォルトの名無しさん
垢版 |
2019/02/18(月) 21:20:31.62ID:etvvcICH
>>510
別に実行時の発想じゃないでしょ
型を書けばコンパイラはその型名に対応する型を解決しなければならないし、
型変換の要否や可否のチェックも必要
0515 ◆QZaw55cn4c
垢版 |
2019/02/18(月) 23:19:20.43ID:aN2QSVsl
>>514
>型変換の要否や可否のチェック
これは10中8, 9 コンパイル時にすることなのでは?
0516デフォルトの名無しさん
垢版 |
2019/02/18(月) 23:37:20.44ID:Q29xkQ9H
>>515
初めからずっとコンパイル時間の話をしている。お前さんだけ噛み合ってないから、もう黙っててくれ。
0517デフォルトの名無しさん
垢版 |
2019/02/19(火) 15:32:09.41ID:Hz70ZqtS
C++です
インクルードガードがあっても関数の定義がヘッダに書かれていればヘッダが複数回読み込まれていた場合リンク時に多重インクルードでエラーが出る

ここまではわかるのですが、同じことをクラス関数で実験した結果エラーになりませんでした
具体的にはヘッダのクラス内に関数定義を書いて複数のファイルからインクルードしました
これはどういうことなのでしょうか?
0518デフォルトの名無しさん
垢版 |
2019/02/19(火) 16:00:36.20ID:uP1odnYQ
>>517
クラス定義の中に書かれたメンバ関数の定義は
自動的にインライン関数になる(関数の実体の定義ではない)

この場合は、複数の場所にメンバ関数の実体が作られるわけじゃない、
という説明でどうかな。
0519 ◆QZaw55cn4c
垢版 |
2019/02/19(火) 17:19:54.69ID:BVj1SDNF
>>516
そもそも「実行時」「コンパイル時」の区別がついていないのでは、コンパイル時間の話なんかできないのでは?
だから「実行時」「コンパイル時」どちらを適用するかに執着しているだけです
0520デフォルトの名無しさん
垢版 |
2019/02/19(火) 17:23:21.85ID:Hz70ZqtS
>>518
なるほど
クラス内に定義を書くとインライン関数になって普通の関数としては扱われないんですね

もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
だからコンパイラはファイル間での関数の重複を調べようとしない
そしてインクルードによって複数のファイルで同じものを読み込んだとしてもエラーにはならないと・・・
理解です
勉強になりました
ありがとうございました
0521502
垢版 |
2019/02/19(火) 17:39:36.16ID:uP1odnYQ
失礼、なぜか >>510 を見逃してて(黙殺するような意図はまったくなかった)。

C++ は関数を宣言・定義するときに返り値型を書くから
auto で受けてもコンパイル時に曖昧さは生じないと考えたんだけど。

実行時まで返り値の型が決まらない関数って作れるんだっけ?
これは純粋に質問、教えを乞いたい。
あんまり高度な話だと振り落とされるかも知れないけど。
0523デフォルトの名無しさん
垢版 |
2019/02/19(火) 18:43:18.16ID:+3biNeIC
>>521
おそらく君の書いた「func()の返す型〜」をqz某が勝手に勘違いしているだけだからスルーしていいよ。
初心者が必ずしも正確な用語を使わないことくらい想像つくだろうし、文脈からして普通ならそんな勘違いはしないはずなのだが。
0524はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/20(水) 00:20:40.27ID:C98K3aY7
>>521
出来ない。
強いて言えば C++17 からは std::any があるけれど、
これはこれで実行時に型が決まるわけではなくて
コンパイル時に std::any 型であることは確定する。
0528 ◆QZaw55cn4c
垢版 |
2019/02/20(水) 19:50:21.82ID:P8vN2pc3
>>525
それは inline キーワードで束縛された関数は、inline 展開される多数の実体と、外部リンケージによって外部からコールできるものとで別の実体をコンパイラは作成する、ってことですか
まあ inline しまくって無駄にバイナリーを増やすくらいだったら、ついでに1 個の外部リンケージで呼べる実体を追加したって、いろいろな面で大差がない、とはいえますね
0529デフォルトの名無しさん
垢版 |
2019/02/21(木) 01:44:35.45ID:HXHB3ZEN
>>528
「それ」が何を指して言ってるのかよくわかんないけど、 inline 関数に対して
インライン展開されてない「実体」を生成するのもしないのもコンパイラの自由。

外部リンケージを持つ関数について複数のコンパイル単位でアドレスを取って
==, != で比較した場合には一致させないといけないので、アドレスを取られた場合には
そういうコード生成をするのが一般的だろうとは思う。
0531デフォルトの名無しさん
垢版 |
2019/02/23(土) 00:51:14.65ID:CdF18mGW
つけて問題ないならつけるべきだけど、まあ実際は面倒くさくなければという程度…
0532デフォルトの名無しさん
垢版 |
2019/02/23(土) 10:37:02.21ID:6erMuDJl
>>530
内部で書き換えないポインタや参照の引数には必ずconstをつけるべき。より自己文書化されるし、付けてないと使う側の手間が増える。>>531は元javaプログラマ
0534デフォルトの名無しさん
垢版 |
2019/02/23(土) 11:45:29.73ID:+DV3f+Dk
const連鎖まんどくせ
0535デフォルトの名無しさん
垢版 |
2019/02/23(土) 12:40:33.73ID:aRr2CtyI
530みたいな質問する奴はそもそもconst気にする前に関数が長すぎたり
参照と実値渡しの違いもわかってないと思われるのでその辺をしっかりやった方が良い。
0536デフォルトの名無しさん
垢版 |
2019/02/23(土) 17:32:16.44ID:7GKXwuwj
入門書の類が、最初のうちは const なしで説明しておいて、
本の後半でおもむろにポインタの引数に const つけることを
載せてたりするせいかもな。
高度な、マニアックな話題みたいな感じで。

文字列(charへのポインタ)を受け取る関数を紹介したら、
すかさず const char* の説明も合わせてすべきって気がする。

const の一般的な価値が分かれば、メンバ関数での func() const {...} の
ありがた味もすぐ飲み込めて const つけまくり派になるでしょ。
0537デフォルトの名無しさん
垢版 |
2019/02/23(土) 21:02:55.45ID:kvfLWeS8
戻り値を const char* してても、
char* const してなければさほど意味がない。
0539デフォルトの名無しさん
垢版 |
2019/02/23(土) 23:45:27.99ID:Z+wYSHT9
クソミソみたいなjavaのconstと違ってC++のconstは
コードの安全性を高めるのに必須といっていいぐらいのキーワード
とりあえず片っぱしから全部const付けて、どう頑張ってもここは
constはずさないと動くコードにできないよな・・ていうぐらいの
時だけはずす。このぐらいの気構えでコードを書けば、かなり安全な
コードになってる。他のやつが書きかえちゃダメなものをいじろうと
しても、強引なキャストでもしない限りどうやってもコンパイルが
通らなくなる。強引なキャストしてでも無理矢理強姦してくる強姦魔は
そもそも犯罪者気質なのでそんなやつに仕事をやらせてる時点で間違い
0542デフォルトの名無しさん
垢版 |
2019/02/24(日) 00:06:41.22ID:2wDVhIfR
俺は書換られたりはしない たぶんしないと思う
しないんじゃないかな ま、ちょっと覚悟はしておけ
0545デフォルトの名無しさん
垢版 |
2019/02/24(日) 01:15:50.47ID:is7scwjD
いやまてまて・・このスレの99%はネタでできてるけど
そこ分からないのはダメだぞ
まさに初心者向けの話題ではある
0547デフォルトの名無しさん
垢版 |
2019/02/24(日) 08:50:14.25ID:FFCpIhtq
こいつ能力低いなと思う奴のソースを見ると、
constなんて全く付いていない場合が多い
0550デフォルトの名無しさん
垢版 |
2019/02/24(日) 09:40:01.37ID:4ommn3XM
constはキーボード入力の観点からはそんなに苦じゃない
stdとかarrayが割りと入力しづらい
左右均等に割り振られてると楽な感じ
■ このスレッドは過去ログ倉庫に格納されています

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