[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/16 09:46 / Filesize : 287 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.102【環境依存OK】



1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/

809 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 18:25:58.96 ID:LSJtd55X.net]
>>792
他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。

810 名前:デフォルトの名無しさん [2018/06/02(土) 18:30:00.66 ID:YEAzW6Zk.net]
>>793

ありがとうございました。

↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。
フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して
作っただけです。

Vec.h
codepad.org/3ROYH1yq

Vec.cpp
codepad.org/f3eSheBS

811 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:30:45.89 ID:YEAzW6Zk.net]
>>794

ありがとうございました。

もしかしてヘッダーファイルのみをビルドしてもオブジェクトファイルはできないんですか?

812 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:34:39.57 ID:YEAzW6Zk.net]
>>795

ある本に書いてあるコードでは、 Vec.h と Vec.cpp のようには分かれていないため、
自分で分けたのですが、エラーになってしまいました。

813 名前:デフォルトの名無しさん [2018/06/02(土) 18:46:23.02 ID:RQ4rJlvL.net]
定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。

814 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:50:06.69 ID:YEAzW6Zk.net]
>>798

Vec.h
codepad.org/3ROYH1yq

上のVec.hの最初の方の

#include <iostream>
#include <cassert>

削除してもビルドエラーが出ません。
プロジェクトにはVec.hしかない状態でビルドしました。

815 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 18:55:56.26 ID:LSJtd55X.net]
>>799
テンプレートのエラーはテンプレートが実体化するときに出ると思うよ。
だから、テンプレートを使ってないなら、エラーがあってもコンパイル自体は出来たりする。

816 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:00:50.14 ID:YEAzW6Zk.net]
>>800
ありがとうございました。

あともう一つ質問なのですが、ロベールの本に、

「関数を実体化するには呼び出したところからその実装が見える必要があります。」

「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要があるのです。」

と書いてあります。

クラステンプレートについては同様の記述がないのですが、

クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要がありますか?

817 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:00:59.43 ID:uqsytqRM.net]
>>795
このへんの問題かな?
https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)



818 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 19:06:46.84 ID:LSJtd55X.net]
>>801
Yes。 テンプレートはヘッダファイルに書く必要がある。
同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、
最終的な実行ファイルに複数の実体があったりはしない。

819 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:21:25.63 ID:YEAzW6Zk.net]
>>802

ありがとうございました。

ちょっと理解できないと思うので、あきらめて

codepad.org/ABfo8I3a

としたところビルドできました。

ありがとうございました。

820 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:22:03.75 ID:YEAzW6Zk.net]
>>803

ありがとうございました。

821 名前:デフォルトの名無しさん [2018/06/03(日) 17:10:25.43 ID:XweloLai.net]
ヘッダファイルについて質問です。

assert() が使いたいため、「List2.h」内に、以下のように書いたとします。

#pragma once
#include "List.h"
#include <cassert>

実は、「List.h」内にも#include <cassert>が書いてあります。

ヘッダファイルにはすべて#pragma onceを書いているので多重インクルードについて
問題はないと思います。

そこで質問なのですが、「List2.h」内で assert() を使っているため、自分としては、
必要ありませんが、「List2.h」内にも#include <cassert>を書いた方が分かりやす
いのではないかと思いました。

既にインクルードされていてもあえて、#include <> を書くという人はいるのでしょうか?

それとも、既にインクルードされていることに気付いている場合には、できるだけ
#include <> は書かないほうがいいのでしょうか?

822 名前: mailto:sage [2018/06/03(日) 17:20:14.25 ID:5RsKIUxf.net]
>>806
すでにインクルードされているかどうかは書いているときにはわからない、から書いとく

ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った

しかしテンプレート関数に assert() が

823 名前:入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない… []
[ここ壊れてます]

824 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 17:34:16.61 ID:XweloLai.net]
>>807

ありがとうございます。

>ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
>ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った

ここのところがよく理解できないのですが、

List.h にテンプレートクラス List<T> が書いてあって、
List2.h には List<T> を継承したクラス List2<T> が書いてあります。

そして、List.h, List2.h の両方で assert() を使っています。

825 名前: mailto:sage [2018/06/03(日) 17:36:57.15 ID:5RsKIUxf.net]
>>808
うんうん、なるほど
テンプレートに assert() が含まれているのならば、ヘッダに #include <cassert> が入るのも止むを得ないです

826 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 17:47:06.72 ID:XweloLai.net]
>>809

ありがとうございました。

また質問で申し訳ないのですが、今度は、全く違う質問になります。

一方向リスト用のセルである Cell<T> というクラスを作りました。
Cell<T> のメンバ変数は、

T data
Cell<T> *next

です。

List<T> には、一方向リストの先頭のセルを指すメンバ変数 Cell<T> *head およびリストに挿入したり、
リストから削除したり、リストのサイズを返したりする様々なメンバ関数があります。

List<T> は一方向リストでしたが、List2<T> は双方向リストにしたいとします。

オブジェクト指向プログラミングでは再利用が重要ということなので、
新たに、双方向リスト用のセルを作るのではなく、 Cell<T> を継承して Cell2<T> というクラスを作ることにします。
Cell2<T> には新たにメンバ変数 Cell<T> *prev を追加します。

List2<T> のほうも List<T> と共通で使えるメンバ関数があるため、再利用したいとします。その場合、気持ちとしては、
List<T> のメンバ変数 Cell<T> *head は無効にして、新たに、 Cell2<T> *head と Cell2<T> *tail をメンバ変数に
したいです。

そして、Cell2<T> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる
メンバ関数については、オーバーライドしたいです。

上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか?
可能だとして、こういうやり方は非推奨でしょうか?

827 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 20:55:43.49 ID:E53R3BDh.net]
一方向・双方向リストの、ソースコードを見た方が速い

繰り返しを表す、C++ iterator みたいな、
抽象クラス・インターフェースでも使っているのだろう



828 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 08:19:48.74 ID:DAGyu3MW.net]
再利用など考えず
一から好きなように双方向リストを作れ

>オブジェクト指向プログラミングでは再利用が重要

は幻想

この場合で言ったらまったく逆で
もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが
一方向リストを継承して双方向リストにするなどイカれてる

829 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 09:50:25.37 ID:3BCLNr2e.net]
>>810
一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね?

830 名前:はちみつ餃子 mailto:sage [2018/06/04(月) 13:04:55.31 ID:zKvF3SpI.net]
どうだろう。
総合的な判断が必要という前提はあるけども、
継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。
XはYの一種であると言えるときはXはYを継承していい。
双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。

ただ、それで楽に使いまわしが出来るかというとそうでもないこともあるので、楽なように作ればいいよ。

練習でやるのなら、使いまわしは置いてそれぞれを作ってみた上で、
共通な部分を探してデザインしなおしてみるというのもいいんじゃないかな。

クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、
将来的にコンセプトが入ったらそっちが主流になるかもしれん。

831 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:18:55.79 ID:K9p9OoRg.net]
>>812
もともと何か一方向リストがあって、継承して機能追加をして双方向リストに仕立て上げる
これはダメなん?継承は機能追加ダメなん?

832 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:19:07.80 ID:e7JLMPXe.net]
>>811

ありがとうございました。

>>812

本を見ると再利用が重要と強調されているので、拘ってしまいました。
ありがとうございました。

>>813

ありがとうございました。

833 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:20:24.25 ID:e7JLMPXe.net]
>>814

ありがとうございました。

834 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:43:52.15 ID:3BCLNr2e.net]
>>815
>>812はだいぶイカれてるから触らないで

835 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 14:30:56.26 ID:YRbUwbvV.net]
>>810
単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる
派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても
単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない
結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない
もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ
あと、insert()の問題もある、std::forward_listの持つinsert_after()が何故そうなのかは構造的に一目瞭然でしょ
厳密に言えば、std::forward_listはコンテナ要件を満たしていないしな

単方向も双方向もLinked Listとして構造的に似ているが効率的に見ても構造的に見ても別のデータ構造だよ
is-aの関係ですら無いし、再利用ってのはhas-aの関係を考えるべきで、継承は再利用するためのものではないよ
例えば、皆、std::stringをhas-aで利用するよね、std::stackはstd::vectorやstd::listなどのアダプタだよね

836 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 16:46:27.38 ID:OAwYb5Pt.net]
自分の勉強用だったら、継承した双方向リストクラス作ってみて
「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う
よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど
プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから
将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい

837 名前: mailto:sage [2018/06/04(月) 19:05:36.84 ID:gbEnuF2j.net]
キーワード「継承」もずいぶんと評価が落ちたものですねえ…



838 名前:はちみつ餃子 mailto:sage [2018/06/05(火) 02:58:20.15 ID:l2agtc6/.net]
C++ からクラスが無くなることは無いだろうが、
構成の仕方の流行はだいぶん変わってて、
コンセプトが入ったら一気に再編されるかもしれない。

クラスの継承ってそんなに万能じゃないよ。

839 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 12:11:26.28 ID:ucySJasT.net]
ま、そういうことです
単方向リストを継承して双方向リストにするのは悪手
やってみるまでもなくわかるだろJK
結局ほぼすべてのメソッドを上書きしないといけないから意味ない
しかも一から双方向リストを書いた方が分かりやすいし速い

840 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 12:24:14.11 ID:ucySJasT.net]
この場合、どうしても手抜きしたかったら
大は小を兼ねるの考えで、双方向リストのみを作って
単方向リストを使う場面でも双方向リストを使えばよい
それがベストだろうというアンサーがちらついてるからこそ、余計に
単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ
余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
単方向リストなどその程度の扱い、必要ない

841 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 15:11:28.97 ID:5kytDI4t.net]
>>824
>余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
std::forward_list など無かった

842 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 18:07:41.59 ID:9YbuVUhL.net]
>>824
いやあ、単方向リストはそれはそれで使い道はあると思うよ
大体、キャッシュに載り易くメモリ効率も良いstd::vectorで十分だけど
挿入操作を多用するならstd::listやstd::forward_listの方が良いよね
std::forward_listは、std::listよりも要素N個 x ポインタサイズ分のメモリ消費量を抑えられるし
イテレータを使ってO(1)で連続してpush_back()みたいなことも出来る、pop_back()みたいなことはO(1)で出来ないけどね

必要性を問うよりも、その特徴を理解して適切に効率的に使うことが大事なんじゃないかな
まあ、std::mapやstd::setは使うのを躊躇するけどな
O(log n)で値を取り出せて、イテレータでソートされた要素に順次アクセス可能を売りとするけど、メモリ効率が悪すぎる
他の言語のそれらが大体ハッシュテーブルで実装されているのを見るに連想コンテナはunordered系で十分な気もする

843 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 19:32:54.16 ID:ucySJasT.net]
言葉が足りなくて申し訳ない
俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから
汎用のテンプレートのリンクリストを使ったためしがない
一方向リストなら、なおのこと使わない

844 名前:デフォルトの名無しさん [2018/06/06(水) 20:16:30.41 ID:rNkLMN6z.net]
単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。
ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。

845 名前:デフォルトの名無しさん [2018/06/06(水) 20:30:07.38 ID:sZLPzbQ0.net]
STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな?

846 名前:デフォルトの名無しさん [2018/06/06(水) 20:32:29.81 ID:sZLPzbQ0.net]
>>826
O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの?

847 名前:デフォルトの名無しさん [2018/06/06(水) 20:34:19.38 ID:sZLPzbQ0.net]
もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。



848 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 21:03:14.93 ID:9YbuVUhL.net]
>>827
std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ
イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど
std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない
単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね

まあ、再利用も良し悪しって事だね

849 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 21:09:23.87 ID:9YbuVUhL.net]
>>830
ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね
Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから
最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね

850 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 00:34:24.48 ID:l0w/1aK3.net]
std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください
arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、
empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。
つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない
気がするのですが、このメソッドは意味があるのでしょうか?

851 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 05:56:11.66 ID:nuHHgQUg.net]
>>834
テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。

852 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 12:31:35.52 ID:pc7gEgF8.net]
>>834
そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね
他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで
コンテナとして共通の要件(インターフェイス)が設けられている
例えば、size()、empty()、begin()、end()など

本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど
vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ
まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね
余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね

853 名前:はちみつ餃子 mailto:sage [2018/06/09(土) 12:50:19.63 ID:EdmRUNh7.net]
具体的にコンテナに求められる要求はここでまとめられているので参考になれば。
ja.cppreference.com/w/cpp/concept/Container

クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、
なかなか仕様に入らずに先送りされてるという状況。

854 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 16:42:05.03 ID:SE5SjeC/.net]
ファイルから読み込んだバイト列の先頭部分を参照して、
それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、
どの程度の判定をすればよいものなのでしょうか。
例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。

855 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 16:50:15.52 ID:9mmiVsnm.net]
十分かどうかは時と場合による

856 名前:放置された蟻人間 mailto:sage [2018/06/11(月) 16:51:12.74 ID:7op9QnGW.net]
画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、
処理スピードを優先するなら、memcmpで十分。

857 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:03:57.96 ID:SE5SjeC/.net]
すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、
他の形式の正常なファイルも拾ってしまわないかということです。
JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。



858 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:06:17.81 ID:3AghcpDH.net]
中身見ないなら、拡張子でもできそうだが

859 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:12:32.50 ID:oqoWhxjw.net]
3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する
ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが

860 名前:はちみつ餃子 mailto:sage [2018/06/11(月) 17:40:03.88 ID:CXPnR3I1.net]
>>841
POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。
参考になるとは思うから読んでみるのもいいんじゃない?
ライセンス的に OK ならそのまま流用してもいいかも。

どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。
例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、
先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。

ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、
許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。

861 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 12:54:07.45 ID:xDeIiE2o.net]
なぜ多数から探すかどうかで判定方法が変わるのか

862 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 13:09:55.18 ID:U9ShKAeR.net]
>>845
速度とかとのバランスだって書いてあるつもりだけど、わかり難かった?

863 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 13:15:57.78 ID:BvPEMwcC.net]
明らかに一致しない時は瞬時に判断出来る
ヘッダですぐにわかるので


jpgではあるんだけど
非対応フォーマットとか一部化けてて表示出来ないとか
そういう判断が難しい

864 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 13:34:24.68 ID:BvPEMwcC.net]
はちみつはJPGを扱ったことが無いってのがよく分かる

865 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 14:45:14.29 ID:U9ShKAeR.net]
>>847
えっ? だからまずは先頭をちょっとだけ読んでみる (この判定だと false positive はあっても false negative はない) という話なんだけど。

866 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 16:23:32.57 ID:LTqXdgcV.net]
元の >>838 の質問に戻れば「どんなファイル群を扱うのかによる」としか
言いようがないんじゃないか?

極端な話、行儀の良いファイルだけなら拡張子で判定しても大丈夫。
(拡張子が間違ってるけど)一般的なファイルばかりなら先頭の何バイトかで判定。

悪意を持って偽装ヘッダや追加情報エリアまで利用してる可能性を気にすれば
JPEGの規格に準拠してるファイルでさえ危険、というレベルまであるかも。

867 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 16:44:07.95 ID:U9ShKAeR.net]
ある程度は信じて割り切るしかしょうがない。



868 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 17:43:08.97 ID:RH6dhGDk.net]
JFIF以下のJPEG出す機材って監視カメラ以外見たことないなぁ
実運用上はJFIFとEXIF以外は対象外でも良いのかも

869 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 17:56:59.93 .net]
ポインタでないなら、継承した関数を呼び出すときに、仮想テーブル参照による動的オーバーヘッドはないのですよね?

870 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 18:20:08.25 ID:U9ShKAeR.net]
>>853
Yes

それが仮想関数であろうとも、
オブジェクトへのアクセスがポインタ経由でないならば
どの関数を呼び出すのかコンパイル時に確定可能なので、
仮想関数テーブルにアクセスする必要はない。

(はずだと思うが言語仕様での保証はないだろうし、
実態がどうなってるか確かめたことはないんで、
誰かやってみてくれんかな。)

871 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:35:01.32 ID:Q/HiJGFf.net]
>>849
ファイル判別の一般論じゃなくてjpgの判別ですよ
jpgの判別方法を語ればいいんです

文字コードと違ってあやしいとかはなくて
APPnの中数バイト見れば簡単にわかるんですよ
文字でJFIFとかExifとか書いてあるわけなんで

偽装が無いならこれで十分

あとは
対応フォーマットであるのか
正しいフォーマットであるのか
実際にデコード出来るのかどうか
などを判別する必要があるかどうかでその先が決まる

872 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:43:20.13 ID:RH6dhGDk.net]
>>855
baka?

873 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:57:45.80 .net]
>>854
ありがとうございます

874 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 20:19:36.50 ID:U9ShKAeR.net]
>>855
何言ってんの?
その偽装があるかもしれん (ということも想定に入れるかどうは場合による) という話なんだけど。

875 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 00:32:03.88 ID:21BMiWPP.net]
>>841を読んでの発言?
日本語が読めないの?

876 名前:はちみつ餃子 mailto:sage [2018/06/13(水) 01:55:04.01 ID:3eXA0K0W.net]
>>859
なるほど、偽装に騙されるのは脆弱性の内 (で、それはないという前提が提示された) という解釈?

判定を誤りうる (データを作れる) のとセキュリティ的な欠陥をなんとなく区別してたけど、
質問者の感じからすると、確かに偽装で騙されるのは脆弱性の内かな。

877 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 01:56:34.26 ID:l7UBIPff.net]
>>855
JPEGの規格書を読んだ事が無いだろう



878 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 07:50:57.05 ID:vaxyQxvX.net]
昔ゲーム機のハックで偽装した画像ファイルを読み込ませるってのがあったような気がする。

879 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 08:14:06.81 ID:7lldK1Da.net]
>>838 >>841 を合わせた質問の意図からすると、
JPEG以外で先頭3byteが {0xFF, 0xD8, 0xFF} のファイル形式が存在するか、
普通に出回ってるか? という問題じゃないのかな。

880 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 09:42:34.58 ID:V88S+L9t.net]
ゲロトラップとして普通に出回ってないかね?

881 名前:デフォルトの名無しさん [2018/06/13(水) 09:46:09.42 ID:Lf/dU7gs.net]
テンポラリオブジェクトについて質問です。

ロベールの本ですが、


Hoge Two() {
Hoge n(2);
return n;
}

int main() {
Hoge hoge(1);
hoge = Two();

とした場合、基本的には n のコピーがいったん作られて、それが hoge に
代入される形になります。このコピーこそが、テンポラリオブジェクトになる
わけです。


と書かれていますが、なぜわざわざ n のコピーを作るのでしょうか?
n は Two() 関数を抜けたら消えてしまいますが、これを消さずに、
返した方が効率的な気がします。

882 名前:デフォルトの名無しさん [2018/06/13(水) 10:17:19.41 ID:Lf/dU7gs.net]
・テンポラリオブジェクト = n のコピー
・代入により、 hoge に テンポラリオブジェクトがコピーされる。

これはなんか非常に無駄なことをやっているように思ってしまいます。

hoge に 捨てずにとっておいた n を参照させれば十分のように思います。

883 名前:838 mailto:sage [2018/06/13(水) 10:17:36.81 ID:818/kKId.net]
みなさんありがとうございます。
話が難しい方向に進んでしまってすいません。
勉強させていただきます。

元々の疑問は>>863の言われるとおりで、
他の形式の画像をJPEGだと誤判定してしまわないか、
さらに言うと、先頭が{0xFF, 0xD8, 0xFF}以外のJPEGファイルも存在していて、
JPEGファイルを見逃してしまうことがあるのか、ということでした。

884 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 14:58:14.75 ID:54SDWBzN.net]
>>865-866
そういう時こそ右辺値参照ですよ

hoge = std::move(Two());

でもこんな事をしなくても大抵戻り値最適化(RVOやNRVO)でコピーコンストラクタは呼び出されない
明示的にムーブコンストラクタを無効にするとコンパイルエラーが発生するはず

Hoge(Hoge&&) = delete;

885 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 14:59:33.86 ID:54SDWBzN.net]
そしてこの場合代入演算子をオーバーロードしてやるとそちらが使われる

Hoge& operator=(const Hoge& hoge) {
  std::cout << "assign operator called." << std::endl;
return *this;
}

886 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 20:08:20.11 ID:VLQaO2hj.net]
(最適化をおいとくと)値渡し/値返しってそういうもんじゃん
Two()内の変数nは自動変数だからスタックに作られる
とっとけないじゃん

887 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:00:21.79 ID:qH/FTczC.net]
まあ2回コピーされるのを1回に抑えるための最適化でしょう



888 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:08:53.19 ID:buJbRccy.net]
確実なのは戻り値じゃなくて参照、もしくはポインタにすること

889 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:40:28.10 ID:GheUJm4W.net]
>>872
それヤバくね?関数を抜けた途端消える存在を参照するとか

890 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 22:09:20.49 ID:1EWuco5t.net]
呼び出し元から参照を渡してそこに返してもらえってことじゃなくて?

891 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 22:13:11.63 ID:21BMiWPP.net]
もちろんそう
昔ながらの方法

892 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 23:23:40.79 ID:MDGDBDRC.net]
-Wreturn-local-addr みたいなwarningじゃなくて規格でエラーにすれば873みたいな勘違いは無くなるのにな

893 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 10:53:47.52 ID:BKSAN5oR.net]
普段c#使っているのですが、c++/cliでデータベース絡みのdllを作ってて、わからないことがあります。
SqlConnectionやDataSetのDispose()がインテリセンスでは候補に上がるのに、コンパイルで「メンバーではありません」とエラーになります。
スコープを抜けると破棄されるので何もしなくてよいという認識でよいのでしょうか?
また、この理屈で、c#の勝手に破棄してくれるusing相当の機能はない、と言うか、必要ないのでしょうか?

894 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 14:30:10.48 ID:Lgo9GPo1.net]
>>877
IDisposable使ってる?
スコープ抜けてもGCによって回収されるタイミングは保証できない
どうしてもすぐにGCしたいなら

GC.Collect();

をする。

多分ジェネレーション0だろうから

GC.Collect(0);

でいいのでは

895 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 15:24:59.55 ID:BKSAN5oR.net]
>>878
レスをござます。
作ってるクラスがIDisposableを継承しないとダメってことですか?
作ってるのはインスタンス作らなくてもいいstaticクラスなんですけど。

GCは効果の程を確認できないですが、やってみます。

896 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 15:25:54.47 ID:BKSAN5oR.net]
>>879
レスありがとうございます。です。

897 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 16:42:09.02 ID:79UoYXtL.net]
>>879
https://qiita.com/haniwo820/items/ba0ab725c25673c20338
こんなのとか

staticクラスだとファイナライザーを書けないから内部で他のクラスをnewした場合が問題
それとメンバ変数もstaticでなければならない
となると普通はアプリケーションが破棄されるまで残る

IDisposableをstaticクラスが継承するとエラーになる
というかstaticクラスはインターフェイスを継承できない
むしろusingを使えない理由が分からない

ufcpp.net/study/csharp/oo_dispose.html

こういうのだとstaticクラス風にファイナライザーを走らせられる

それかStreamみたいのでClose()したいのならClose()メソッドを書けばいい
SqlConnectionやDataSetはいちいちClose()する必要があるのかな?



898 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 22:51:20.07 ID:khTKmU6v.net]
>>877
ここの記述を信じるなら、全部Yesってことになるのかな。
mag.autumn.org/Content.modf?id=20050506023118

899 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 09:10:59.15 ID:8YDR1CpT.net]
>>879 です。
VS2013 c++のCLRコンソールアプリを新規作成したやつです。

include "stdafx.h"

using namespace System;
using namespace System::Data;
using namespace System::Data::SqlClient;

int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");

String ^constr = "xxxxx";
SqlConnection ^connection = gcnew SqlConnection(constr);

connection->Open();

connection->Close();
connection->Dispose();

return 0;
}
この Disposeでエラーになります。
ここには書いてませんがDataSetも
Disposeでエラーになります。

上記コードの場合 Dispose抜きで問題ないのでしょうか?

>>882
まさにこれを読みました。c#のusingがc++にはない認識です。
この理由がこの通りならDisposeなしで心配ないのですが。

900 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 10:38:59.49 ID:uIGrLsPa.net]
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり

共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/

共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://www.sketchapp.com/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/

Trello Chrome拡張機能プラグイン集
https://chrome.google.com/webstore/search/trello?_category=extensions

Slackプラグイン集
https://slack.com/apps

Sketchプラグイン集
https://sketchapp.com/extensions/plugins/
https://supernova.studio/

901 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 19:01:40.09 ID:J8URhrRM.net]
>>882によると、自動でDisposeさせたい場合は以下のようにする、
と書いてあるように見える。(手元に環境がないので未確認)

SqlConnection connection(constr);
connection.Open();
connection.Close();

902 名前:デフォルトの名無しさん mailto:sage [2018/06/16(土) 06:42:53.11 ID:PCTFj+qN.net]
>>883
そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。
C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。
C#のusing相当のことをしたい場合は>>885
詳細は↓を参照。
https://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55

903 名前:デフォルトの名無しさん mailto:sage [2018/06/18(月) 12:02:02.44 ID:P1toAgew.net]
Dispose の件で質問してた者です。
自作のIDisposableを継承したクラスを作って確認したところ delete で Disposeが通る事を確認できました。
不慣れで詰まらない質問してしまってすみませんでした。

904 名前:865 [2018/06/20(水) 12:43:56.50 ID:XX+H87IB.net]
みなさん、いろいろありがとうございました。
参考にさせていただきます。

ところで、

Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念 - プログラムはプロセッサ上でどのように実行されるのか
角川 裕次
https://www.amazon.co.jp/dp/4627848315/

この本を読んだ人はいますか?

かなり自分にとって理想的な本のようですので、買ってみようと思います。
こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。

905 名前:デフォルトの名無しさん mailto:sage [2018/06/22(金) 23:22:38.51 ID:pTq2TJuj.net]
あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている
つまりこれはC++を頑張って覚えればその分見返りも大きいということではなかろうか。なにしろ人の嫌がること高いスキルが必要なことはそれだけ報酬も高いはずで

906 名前: mailto:sage [2018/06/23(土) 00:11:02.67 ID:OlLfOCSW.net]
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力

907 名前:ネ理由になりうる。

C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:

- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)

- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。

言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
[]
[ここ壊れてます]



908 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 10:31:52.34 ID:UiVIxiJp.net]
抽象化とコード(バイナリ)の質は相反するものだから

909 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 11:45:24.39 ID:NcXYPjUn.net]
alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか?

910 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 12:58:59.14 ID:g5s8p4AT.net]
リーナスのそれがいっちばん有名なC++批判よね

911 名前: mailto:sage [2018/06/23(土) 13:53:36.35 ID:OlLfOCSW.net]
>>893
linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね
これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました…

912 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:43:13.01 ID:DOoRmJ6H.net]
抽象的な思考ができる人とそうでない人が居るというだけだな
>>890もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが

913 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:54:08.05 ID:UiVIxiJp.net]
抽象化が目的になって
パフォーマンスとか使用リソースとか工数を軽視する人が実務経験の浅い人に多い

ってのが問題であって
言語自体には罪はない

914 名前: mailto:sage [2018/06/23(土) 15:32:24.63 ID:OlLfOCSW.net]
>>895
>良い抽象モデル
が役に立つとは限らないのでは?
抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは?
あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか?

915 名前:デフォルトの名無しさん [2018/06/23(土) 16:46:26.83 ID:8e5n022B.net]
デザインパターンって廃れたんですか?

だとすると、なぜ、デザインパターンは流行り、そして廃れたのでしょうか?

一度は流行ったということは確かに役に立つものだったのではないでしょうか?

一度は役に立つと認められたものがなぜ、否定されたのでしょうか?

916 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 16:51:17.93 ID:7hlQnbj9.net]
日本人は基本すっ飛ばして銀の弾丸欲しがるからな

917 名前:はちみつ餃子 mailto:sage [2018/06/23(土) 17:00:49.94 ID:/E9OfcV+.net]
>>898
デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。
基礎として押さえておくと便利だし、価値が失われたわけではないけど、
何もかもが既存のパターンに当てはまるわけではないという当たり前の話。



918 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:15:09.64 ID:DOoRmJ6H.net]
>>897
抽象化とYAGNIは関係ありません
こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね

919 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:29:02.45 ID:ul2D0Jgq.net]
>>898
別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。

920 名前: mailto:sage [2018/06/23(土) 17:30:40.89 ID:OlLfOCSW.net]
>>901
たとえば、iostream をどう思う?これは良い抽象化の例ですか?

921 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:31:54.13 ID:wjw7dXXk.net]
Visual C++6.0です。 Windows7でやってます。
ツールバーを作ると、ボタンを押すとペコってへこんで、また押すとまた戻りますが、見づらいので
押したときと戻ったときとで色を付けたいのですが、どこかにサンプルはないでしょうか

また、私は未だに6.0でやっていてこれで十分にプログラムできるので特にこれで不満はないのですが
もしバージョンを上げれば出来るのであればバージョンアップも考えたいと思っています
最新のバージョンで出来るのなら、そのサンプルも教えて頂けるとありがたいです

922 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:40:24.88 ID:LiutUffZ.net]
>>904
OwnerDraw

923 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:59:38.49 ID:wjw7dXXk.net]
>>905
CToolbarには、DrawItemがないようなのですが
ステータスバーにはあります

924 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:04:15.08 ID:LiutUffZ.net]
ナンシークラッツ本を探した方が良いかな

925 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:14:04.63 ID:wjw7dXXk.net]
ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね
最新のバージョンのVC+でも出来ないのかな。結構そういう要望はあると思うけど

926 名前:デフォルトの名無しさん [2018/06/23(土) 19:24:24.28 ID:8e5n022B.net]
2分探索木を実装したC++プログラムを読んでいますが、分からないところに出くわしました。

ノードは以下のクラスです:

template <typename T> class BinNode {
private:
T data;
BinNode<T> *left, *right;
BinNode(T d, BinNode<T> *l = NULL, BinNode<T> *r = NULL);
friend class BinarySearchTree;
};


2分探索木のクラス BinarySearchTree 内のメンバ関数 insert の引数としてノードを渡すのですが、
なぜ、

BinNode<int>* tree

ではなく

BinNode<int>*& tree

となっているのかが分かりません。本の説明によると、木構造の変形を可能にするためにそうしているとのことです。

bool BinarySearchTree::insert(int data, BinNode<int>*& tree) {

}

927 名前:デフォルトの名無しさん [2018/06/23(土) 19:25:19.09 ID:8e5n022B.net]
>>899
>>900
>>902

ありがとうございました。

一時は、もてはやされすぎたということですね。



928 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:28:47.13 ID:8e5n022B.net]
insert 内に、

if (tree == NULL) {

929 名前:デフォルトの名無しさん [2018/06/23(土) 19:29:33.57 ID:8e5n022B.net]
insert 内に、

if (tree == NULL) {
tree = new BinNode<int>(data);

}

というコードがありましたが、これのことでしょうか?

930 名前:デフォルトの名無しさん [2018/06/23(土) 19:30:15.04 ID:8e5n022B.net]
>>912

あ、そのようですね。

931 名前:放置された蟻人間 mailto:sage [2018/06/23(土) 19:30:26.05 ID:QXtVRpnb.net]
>>909
void f(int *a) {
static int s_i = 0;
a = &s_i;
}
int main(void) {
int i = 3;
int *p = &i;
f(p);
printf("%d\n", *p);
return 0;
}

932 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:45:59.33 ID:8e5n022B.net]
>>914

ありがとうございました。

3のままですね。

933 名前: mailto:sage [2018/06/23(土) 19:54:24.54 ID:OlLfOCSW.net]
>>909
これは C の課題ですね。
適当な二分木ないし二分探索木に対して、ノード(節)を追加したり削除したりする関数を書く場合、
C ならば add_node(node **root, ...) と書きます。@
これを C++ ならば add_node(node *&root, ...) と書くこともあります。node *&root は「ポインタ変数の参照」です。A
@とAとではプログラムの表現もかわります。

これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。

934 名前:デフォルトの名無しさん [2018/06/23(土) 21:09:04.41 ID:nmsTY6vF.net]
0,115200
1,38400
2,19200
3,9600

こういう関係がある時に配列を作れば1から38400はダイレクトに求められるが
検索を使わずに38400からダイレクトに1を求める方法はないだろうか?

935 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:22:36.64 ID:b0QIE6qX.net]
115200個の配列

936 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:26:12.81 ID:EyvIrgyz.net]
A/9600 を添え字にして13個の配列で逆引き作る?

937 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:29:09.89 ID:b0QIE6qX.net]
9600の倍数であることがわかってるなら割ればテーブルは減る

でも4個なら素直に検索した方が速い



938 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:41:29.91 ID:EyvIrgyz.net]
検索については同意
元質問は検索使うなって条件なので、まぁ

数値からRS232Cのボーレート設定を想定しちゃうけど、
それなら検索を嫌うようなもんでもないし… な…

939 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:02:58.56 ID:ZZklpiyn.net]
a1 : b1
a2 : b2

a から、b への辞書と、
b から、a への辞書の、両方を作る

940 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:07:27.68 ID:V32XRqjB.net]
>>920>>919を見る前に書いた
たまたま同じ発想になっただけ

浮動小数数に直すってのもある
LSB側から数えて1になるビット位置を返す命令があるのでそれとシフトを使う
115200は(900, 7)
38400は(300, 7)
19200は(300, 6)
9600は(300, 5)

RS-232Cだと300x2^nと900x2^nしか普通は使わないから

オーディオのサンプリング周波数にも同じような方法が使える

941 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:09:33.77 ID:5Wb6fwhK.net]
n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600);
入力を検証する手間を考えたらテーブル逆引きと大差ないけど

942 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:19:10.79 ID:V32XRqjB.net]
>>924
メモリアクセス速度を考えても>>918の方が速くて簡単

>>923
なんかおかしかった

115200は(225, 9)
38400は(75, 9)
19200は(75, 8)
9600は(75, 7)

ビットスキャン命令とシフトとテーブル
変換しなきゃならないデータが多量にあって
パフォーマンスが非常に重要ならこれを使うかな

943 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:21:03.20 ID:V32XRqjB.net]
普通はこんなものはリニア検索でいい

944 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:23:08.99 ID:ZZklpiyn.net]
普通、最適化でも、8個までは線形(全)探索・if 文

それ以上で、ジャンプテーブル・switch-case

945 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:47:49.24 ID:UiVIxiJp.net]
>>927
ただのテーブル逆変換だぞ
なんでジャンプテーブル?
なんでswitch case?

リニア検索で問題なら2分検索
それでも遅ければハッシュその他のテーブル
簡単な演算を併用出来るものはする
じゃないか普通

946 名前:927 mailto:sage [2018/06/24(日) 00:50:44.41 ID:chBT6m1a.net]
コンパイラの最適化について書いた

if 文を8個以上書くと、ジャンプテーブルに変換されるってこと

947 名前:デフォルトの名無しさん [2018/06/24(日) 08:15:02.59 ID:cbD8du/l.net]
>>916

ありがとうございました。



948 名前:デフォルトの名無しさん [2018/06/24(日) 10:44:32.50 ID:8StK2ZXu.net]
class clsAにconst member 変数を登録したいのだけどうまくいかない。
クラスコンストラクタでconst char *mes[] を{"abc","def"}のように
初期化するにはどうやるの?

949 名前:デフォルトの名無しさん [2018/06/24(日) 10:57:11.49 ID:8StK2ZXu.net]
//そもそもC++は文字列の配列を扱うことができるのか?

constexpr auto str1 = {"abc", "def"};
これがエラーするんだがなんでなの?

950 名前:デフォルトの名無しさん [2018/06/24(日) 11:00:18.70 ID:8StK2ZXu.net]
constexpr string[] str1 = {"abc", "def"}; コンパイルエラー
constexpr string str1[] = {"abc", "def"}; コンパイルエラー
クッ、、、どうしてもうごかない。

951 名前:デフォルトの名無しさん [2018/06/24(日) 11:15:54.16 ID:8StK2ZXu.net]
string str1 = "abc"; //OK
vector<int> dat(100,3); //ok

vector<string> str2("aaa",4); //error
こういうのもうごかない。

952 名前:デフォルトの名無しさん [2018/06/24(日) 11:23:27.77 ID:8StK2ZXu.net]
自分としてはストリングを多用するのでストリング配列が使えないと厳しい。
検索をしても例がなかなか出てこないので、Effectiv Modern C++という本
をamazonで買ってみたんだが、届いたので今見ているところだが、ここでも
string配列の記述を巧みに避けている。皆目出てこない。

string配列の扱い方ってどうやるの?

953 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 11:52:20.14 ID:/GbiIoLW.net]
文字配列って良く分からないけど、Javaみたいに一文字だったりして?
{"a","b","c","d","e","f","g"}みたいな?

954 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 12:32:00.67 ID:StWe8jKY.net]
>>932
定数式じゃないから。

>>933
string は constexpr に非対応のはず。 現時点では。
new が constexpr 的に扱いが難しいので、
内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。
ただ、制限を緩和する提案は出ているので将来的にはなんとかなるかもしれない。

>>934
string に一文字づつ入れたいってこと?
std::vector<std::string> str2 = {"a", "a", "a"};
でいけるよ。

955 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:35:35.92 ID:QFRKHUIu.net]
["abc","def"];

956 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:36:44.62 ID:p8F2e5jx.net]
>>934
>vector<string> str2("aaa",4); //error
「vector<string> str2(4,"aaa");」の誤りじゃね?

957 名前:デフォルトの名無しさん [2018/06/24(日) 13:13:44.88 ID:8StK2ZXu.net]
string str1 = "abc"; //OK
vector<int> dat(100,3); //ok
//vector<string> str2("aaa",4); //error

// string str1[] = {"abc", "def"}; //error
// const std::vector<std::string> str3 = {"abc", "def"}; //error
// constexpr char *mes1 = "abc"; //error
const char *mes1 = "abc"; //ok
// vector<char *> ch(10,mes1);//error
vector<string> ch(10,str1);//ok

ここまで確認できた。ただしコンパイルが通っただけだから、動くかどうかは不明。



958 名前:デフォルトの名無しさん [2018/06/24(日) 13:37:02.58 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[];
}
//clsA::clsA(char *name[]) : m_name(["mike","tetu"]){};//だめ
//clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ
//clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ

959 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:38:12.37 ID:zWtoG2OO.net]
サイズ不明だし無理だろ

960 名前:デフォルトの名無しさん [2018/06/24(日) 13:41:38.91 ID:8StK2ZXu.net]
>内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。

constexpr char *mes1 = "abc"; //error
これもだめですね。ヒープは必要ないとおもいますが、、、

961 名前:デフォルトの名無しさん [2018/06/24(日) 13:42:37.94 ID:8StK2ZXu.net]
>>サイズ不明だし無理だろ

コンストラクトする時点でサイズは確定していますが、、、

962 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:45:06.66 ID:p8F2e5jx.net]
お前はまずエラーメッセージをちゃんと読め。

963 名前:デフォルトの名無しさん [2018/06/24(日) 14:12:06.73 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[];
clsA(char *name[]);
};

//clsA::clsA(char *name[]) : m_name(["Bike","tetu"]){};

/*だめだが可能性がありそう。 Invalidはでていない。
--error message--
#29 expected an expression
*/

//clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ invalid
/*
Multiple markers at this line
- #2125 invalid initializer for array member
"clsA::m_name"
- #18 expected a ")"
*/

//clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ
/*
* Multiple markers at this line
以下省略
*/

964 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:20:47.48 ID:p8F2e5jx.net]
すまん、そっちはエラーメッセージじゃ分からん。
string str1[] = {"abc", "def"}; //error
とか
constexpr char *mes1 = "abc"; //error
とかの話。

965 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:38:12.08 ID:iIKq/Q4Y.net]
string関数の第二引数には何の意味がありますか?
試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが
↓です

string readFile(const char *filename)
{
ifstream ifs(filename);
return string(istreambuf_iterator<char>(ifs),
istreambuf_iterator<char>());
}

https://www.miraclelinux.com/tech-blog/1n4hgx

966 名前:デフォルトの名無しさん [2018/06/24(日) 14:46:22.41 ID:iIKq/Q4Y.net]
すみません自己解決しました>>948

967 名前:デフォルトの名無しさん [2018/06/24(日) 14:58:47.68 ID:8StK2ZXu.net]
>>947
string str2[] = {"abc", "def"}; //okでした。

constexpr 文字列は諦めました。多分相当難しい。
でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。
というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも
Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発
ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。
しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ
には無関心なのだろう。

もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して
マスターしたので簡単には教えたくない。
それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。

いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし
できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか?
多くのファーム開発者は諦めてCで初期化してるのだろうな。



968 名前:デフォルトの名無しさん [2018/06/24(日) 15:43:14.02 ID:zWtoG2OO.net]
配列の初期化の時には()いらないぞ{}だけ
>>941の最後の行の()はずせば通るけどたぶん環境依存じゃないかな
意図してる動作がname使ってm_nameの初期化ならめんどくさそう

969 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:08.57 ID:zWtoG2OO.net]
あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめか

970 名前:なこれ []
[ここ壊れてます]

971 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:30.09 ID:8StK2ZXu.net]
class clsA
{
private:
const char *m_name;
clsA();
};
clsA::clsA() : m_name("Bike"){};

これはOK、しかし配列はできない。

972 名前:sage [2018/06/24(日) 16:24:15.11 ID:zWtoG2OO.net]
class a
{
public:
const char* name[]; ここで非標準だなんだの警告でる

a():name{ "aaa","bbb" }
{
}
};

vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな
配列の数指定しといたほうが無難な気がするけど

973 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 16:39:11.76 ID:Q9QWMZ9P.net]
C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ
コンストラクト時にわかってるじゃないか、って話もあったけど
中身の配列数が変わったらそれは違う型になる
つまりテンプレートが必要になる

配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど

974 名前:デフォルトの名無しさん [2018/06/24(日) 17:24:18.36 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[2];
clsA():m_name{"aaa","bbbb"}{}
};
これでもエラーします。

975 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 17:42:22.01 ID:zWtoG2OO.net]
なんてエラーでてるの

976 名前:デフォルトの名無しさん [2018/06/24(日) 17:54:03.23 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
char *m_name[10];
clsA();
void init();
};
clsA::clsA() : m_name{"Bike","bbb"}{}; //エラーする。
/*
Multiple markers at this line
- #66 expected a ";"
- #171 expected a
declaration
- #126 expected a "("
- #176-D expression has
no effect
*/

977 名前:デフォルトの名無しさん [2018/06/24(日) 18:01:33.16 ID:8StK2ZXu.net]
それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。



978 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 18:04:27.08 ID:p8F2e5jx.net]
あなたの使っているコンパイラは、おそらくC++11未対応です。
constexprはC++11の機能なので、そのコンバイラでは使えないか、
使えたとしても標準とは異なる動作をする可能性があります。

979 名前:デフォルトの名無しさん [2018/06/24(日) 18:18:27.13 ID:8StK2ZXu.net]
>>960
あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール
した最近のコンパイラなので当然C++11以上だとおもっていた。
一寸調べてみる。

980 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 18:23:43.69 ID:StWe8jKY.net]
>>961
対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。

981 名前:デフォルトの名無しさん [2018/06/24(日) 18:36:49.63 ID:8StK2ZXu.net]
>>962
おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを
みてもC11++がない。
最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。

982 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 19:43:42.27 ID:G0tizpK6.net]
勘違いしてたらすまないけど↓みたいな事がしたいの?
https://ideone.com/Zm8LO5

983 名前:デフォルトの名無しさん [2018/06/24(日) 22:24:29.32 ID:8StK2ZXu.net]
>>964
凄い!!。まさにそれです。こちらでもコンパイル通りました。
難しいなー。
もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ
ど、それを丁重に拝借いたします。ありがとう。

984 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 22:30:41.96 ID:EmcxYm71.net]
借りるってことは返すんだよね

985 名前:デフォルトの名無しさん [2018/06/24(日) 23:08:30.10 ID:8StK2ZXu.net]
>>966
もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が
わかりますか?
clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};

(const char* const []){"mike","tetu",nullptr}
これは何を意味してるの?

986 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 23:09:16.86 ID:chBT6m1a.net]
「c++ constexpr 文字列」で検索すれば?

987 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 00:15:08.68 ID:RQXh1ivn.net]
void func1(int a) { printf("%d\n", a); }
void func2(int a, int b) { printf("%d,%d\n", a, b);}

template<?????>
class Test
{
public:
void method(void) { (templateの引数で func1(int a) か func2(int a, in b)を呼ぶ) }
private:
int a;
in b;
};
のような事をしたいのですが、引数が1つか2つの関数をそれぞれ名前でtemplate引数にして
記述したいのですが、うまくいきません。どうすれば良いでしょうか?
例えば template < void F(int)> とすると Test<func1>() でいけるのですが、func2の場合が
表現出来ません。



988 名前:デフォルトの名無しさん [2018/06/25(月) 01:49:02.18 ID:Gwlgg6/B.net]
class class1 {
private: int m_a;
public:
class1(int a) : m_a(a) {}
class1(class1 const& rhs) { m_a = rhs.m_a; }
void method(void) { printf("%d\n", m_a); }
};
class class2 {
private: int m_a;
int m_b;
public:
class2(int a, int b) : m_a(a), m_b(b) {}
class2(class2 const& rhs) { m_a = rhs.m_a; m_b = rhs.m_b; }
void method(void) { printf("%d,%d\n", m_a, m_b); }
};

template<class _Myclass> class Test {
private: _Myclass m_myClass;
public:
Test(_Myclass myClass) : m_myClass(myClass) {}
void method(void) { m_myClass.method(); }
};

int main() {
Test<class1> x(class1(1));
Test<class2> y(class2(2, 3));
x.method();
y.method();
}
意味があるのか分からないがとりあえずコレで
もしくはTest::methodを可変引数にしてprintfにその可変引数を渡すしかない
まずなにがやりたいのか分からないからテキトーに書いてやったぞ

989 名前:デフォルトの名無しさん [2018/06/25(月) 03:37:15.06 ID:3f3crQyZ.net]
const char *[]の初期化だけれども

clsA(const char* const name[]) : m_name(name) {};
これはまあ何となく意味が解る。m_name <−−nameってことだよね。

clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};
しかしこれはどういう意味だろうか?
clsA <−− (const char* const []){"mike","tetu",nullptr}
ラムダ関数?かとおもったが、前半はcastだろうか?
m_name <−−name
clsA <−− {"mike","tetu",nullptr}
この二つがセットで意味を持つんだろうな。
const char *[] の初期化が3つくらいあったらどうするんだろうね。
まるでクイズを解いてるみたいだよ。
いくらなんでも言語仕様としてやはり不味いよね。

990 名前:デフォルトの名無しさん [2018/06/25(月) 04:00:03.54 ID:3f3crQyZ.net]
わかった。コンストラクタに引数がないディフォールトでは
clsA <−− {"mike","tetu",nullptr}
そしてm_nameは一つしかないから、m_name= {"mike","tetu",nullptr}となる。
引数を持つ場合は
clsA(const char* const name[]) : m_name(name) {};
m_name <-- name;
になる。

じゃあconstのメンバ変数が二つある場合はどうするんだろうか?
clsA:clsA( {"xxx"}),clsA({"yyy"})
{}
とは書けない。変数を明示しないといけないから、、、
clsA:m_name1( {"xxx","abc"}), m_name2({"yyy","def"}){}
必然的にとなる。
じゃあ最初から
clsA:m_name1( {"xxx","abc"}){}
こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。

991 名前:デフォルトの名無しさん [2018/06/25(月) 04:04:26.64 ID:3f3crQyZ.net]
class clsA{
private:
const char* const* m_name1;
const char* const* m_name2;
public:
clsA() : m_name1((const char* const []){"mike","tetu",nullptr}), m_name2((const char* const []){"mike2","tetu2",nullptr}) {};
clsA(const char* const name[]) : m_name1(name) {};
void put(){
for(const char* const * p=m_name1; *p!=nullptr ;++p ) {
printf(*p);
}
};
virtual ~clsA() {};
};
実験したみたが、コンパイルは通った。

992 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 05:56:57.36 ID:MAmRCfEQ.net]
>>964のソースをclangでビルドしたら最初の結果が文字化けする。
環境依存で動作が変わるようなソースコードを参考にしてはいけない。

993 名前:デフォルトの名無しさん [2018/06/26(火) 09:01:37.25 ID:6tjGTw22.net]
>>969
template<class ... args>
class clsTest {
public:
void func1(int dt) {}
void func1(int dt1, int dt2) {}
void func2(args...) {

}
};
int main()
{
clsTest<int, int, int> a;
clsTest<int, int, char *> b;

a.func2(2, 3, 4);
b.func2(5, 6, (char *)"test");

a.func1(2);
a.func1(2, 3);

return 0;
}

994 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 10:37:33.14 ID:dRU/pr3A.net]
c++です
LNK2005 DllMain は既に vstplugmain.obj で定義されています
1>vstplugmain.obj : error LNK2005: DllMain は既に vstplugmain.obj で定義されています。

左と右が違うファイルだったら順序を入れ替えるだけでよかったのですが
両方vstplugmain.objで困ってます
どのようにすれば解決できるでしょうか?

995 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:09:44.92 ID:9ql/FcZD.net]
自動でリンクしてるライブラリと明示的にリンカに渡

996 名前:してるパス違いの同じライブラリで衝突してんんじゃないの?
知らんけど
[]
[ここ壊れてます]

997 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:44:03.03 ID:dRU/pr3A.net]
検索してみたのですが
vstplugmain.objは一つしか無いようです



998 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 12:06:53.39 ID:dRU/pr3A.net]
もしかしたら関係あるのかもしれないので参考までに記述します
以下のようなエラーも同時に発生しています

vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))"
(?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。
LNK2001 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))"
(?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 Dll6 source\repos\Dll6\Dll6\vstplugmain.obj 1


よろしくおねがいします

999 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 17:14:50.29 ID:hh115pnF.net]
エラーログの上から順番に解決するようにしたらいい

1000 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 09:50:56.72 ID:8ZX2E7EU.net]
無事解決しました
ありがとうございました

1001 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 10:22:32.55 ID:h8zo0ENm.net]
>>981
そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。

1002 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:16.69 ID:OiiVA+37.net]
ロベールのC++の本の typedef の説明ですが、よく分かりません。

typedef int* IntPtr;

int n = 0;
const IntPtr p = &n;
IntPtr const q = &n;

はどちらも、

int* const p;
int* const q;

の意味になるそうです。

分からないのは、ロベールさんの解釈の部分です。

const int* p; → 「const の右側にあるものが const になる」
int* const q; → 「const の右側にあるものが const になる」

と解釈すればよいと説明してます。

この解釈が

const IntPtr
IntPtr const

の場合にも通用するというのです。

1003 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:56.86 ID:OiiVA+37.net]
const IntPtr = const int*
IntPtr const = int* const

ではないのでしょうか?

1004 名前:デフォルトの名無しさん [2018/06/29(金) 10:55:12.72 ID:OiiVA+37.net]
const IntPtr p = &n;
IntPtr const q = &n;

↑「const の右にあるのは p や q なので、 p や q が const になるのです。」

と説明していますが、これが意味不明です。

1005 名前:デフォルトの名無しさん [2018/06/29(金) 10:56:58.22 ID:OiiVA+37.net]
>>985
の論法を↓に適用すれば、

const の右にあるのは p や q なので、 p や q が const になるのです。

となってしまいますが、 p は const ではないですよね。
q は const ですが。

const int* p;
int* const q;

1006 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 11:34:56.01 ID:rwm1MJ+D.net]
>>983
マクロで IntPtr を int * と定義した場合は >>984 のように展開されるけど
typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る
const int と int const もどちらも const の int であるのと同じように
int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ

1007 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:00:29.81 ID:nFp4wdEK.net]
i.csvには1行に名前と整数値で点数3つ書かれているのが10行あり、読み込んで点数の和を加えて表示しようとしましたが和が出てきません。また¥nを打っているのに改行されないです。理由を教えてください。配列にしたのはこの後にも操作をするためです。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char ifname[] ="i.csv";
int a,b,c;
char name[30][100];
int sum[30];
int i;

FILE *ifp;

ifp=fopen(ifname,"r"); /*読み込み込みモードでopen*/
if(ifp==NULL){
printf("ファイルが開けない");
exit(1);
}

for(i=0;i<=29;i++){
if(fscanf(ifp,"%s%d%d%d",name[i],&a,&b,&c)==EOF)
break;
else
sum[i]=a+b+c;
printf("%s %d %d %d %d\n",name[i],a,b,c,sum[i]);
}
fclose(ifp);
}



1008 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:06:09.83 ID:nFp4wdEK.net]
10行ではなく30行でした、すみません

1009 名前:デフォルトの名無しさん [2018/06/29(金) 12:10:17.92 ID:OiiVA+37.net]
>>987
ありがとうございました。

1010 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:40:26.79 ID:nFp4wdEK.net]
988ですが自力で解決出来たので大丈夫です

1011 名前:デフォルトの名無しさん [2018/06/29(金) 14:45:38.42 ID:+YHimQiw.net]
Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。
どのように設定すればいいでしょうか?
VisualStudio2017/C++

1012 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:50:24.25 ID:+YHimQiw.net]
何がしたいかというと、カレンダーを表示させたいです。

1013 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:52:35.06 ID:+YHimQiw.net]
小出しですみません。カレンダー機能はMFCで作成済みです。

1014 名前:デフォルトの名無しさん [2018/06/29(金) 22:49:34.96 ID:DjTQOr6S.net]
無理でしょうか?

1015 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 23:03:37.60 ID:DjTQOr6S.net]
C#ですが、方法が見つかったので自力でやってみます。
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus

1016 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:10.80 ID:UA/DrxK6.net]


1017 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:30.62 ID:UA/DrxK6.net]




1018 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:47.85 ID:UA/DrxK6.net]


1019 名前:小倉優子 mailto:sage [2018/07/01(日) 01:15:06.26 ID:UA/DrxK6.net]
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 

1020 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 238日 8時間 41分 31秒

1021 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<287KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef