19/04/25 11:00:25.52 /tHSxicf.net
チンポ体操
チンポを手に持ち しごく運動から
1 2 シコシコ
2 2 シコシコ
チンポを振り回す運動
1 2 ブルンブルン
2 2 ブルンブルン
3:デフォルトの名無しさん
19/04/30 16:44:32.44 hc3e5D+8.net
Cを2年間やって最近大学の講義でC++をやりはじめたのですが
C++だけでなくCの勉強も継続したほうがいいのでしょうか?
4:
19/04/30 16:51:17.25 iYYZTFZo.net
>>3
C89=K&R2 をマスターできたら、C99 など目もくれずC++に進むのがいいでしょう、私はそうしましたし C99 なんかどうでもいいと思っています
5:デフォルトの名無しさん
19/04/30 17:08:01.32 hc3e5D+8.net
>>4
レスありがとうございます
競技プログラミングで言うと、C言語はatcoderでA問題とB問題はすぐに書くことが出来てC問題は解けたり解けなかったりというレベルです。構造体とポインタも基本的(C言語ポインタ完全制覇という書籍にあるような難しいことは知りませんが…)な扱いならばできます。
就職のことも視野に入れて考えたいのですが、C++が出来るならばCの知識が問われる機会というのは少ないのでしょうか?
6:
19/04/30 17:18:00.19 iYYZTFZo.net
>>5
就職の話はよくわかりません
ただ、C89=K&R2 → C99 の改定内容は、C89 の時代に試みられていた拡大解釈を規格に取り込んだ、という部類が多いと私は思いました
それに C99 は、「C++ を見た後で決めたんかい?」という謎な部分が多くいけ好かないのも事実です、あんなものは知らないほうがいい部類でしょう
それよりも日々進化し続ける C++ をフォローするほうが、いろいろな面でお得です、私も p-thread 系マルチコアなプログラムを記述するために C++11 or lator に進み、とても満足しています
7:デフォルトの名無しさん
19/04/30 18:05:48.04 arIi2u2B.net
>>5
C++のクラスとかテンプレートとかSTLとかをとりあえず無視して
Cと共通してる基礎的なとこから学べば、わざわざCを個別に学ぶ必要はないとおも
仕事の場合は純粋にCだけ長年使ってるような特殊な職場でなければ問題ない
8:デフォルトの名無しさん
19/04/30 18:11:55.63 hc3e5D+8.net
お二人方ありがとうございます
CからC++の勉強に専念する決心が半分くらいつきました
Cのscanf()の仕様(バッファオーバーフローやバッファオーバーランの危険性を回避するいくつかの方法について等)、まだはっきりと把握していないのですが、それでも、C++の勉強に専念してしまっても問題ありませんでしょうか?
9:デフォルトの名無しさん
19/04/30 19:25:08.89 YvhWBPAF.net
バッファオーバーランって、この辺の話?
URLリンク(ja.wikipedia.org)
10:デフォルトの名無しさん
19/04/30 21:07:24.59 tJFiug19.net
C問題は使う言語の問題じゃないな
もちろんc++やJavaの方がC言語よりもスムーズに書けるがC問題はアルゴリズムを知らないと出来ない
それと現代ではC言語のscanfに習熟する意味は無い
それは後回しにした方がいい
11:デフォルトの名無しさん
19/04/30 21:38:58.06 B5WLnK8N.net
>>3
C を続ける必要性がゼロなら C++ に専念した方が良いかと
必要性は個々人による
大学の同級生なり、研究室等の先輩なりに相談・確認するのも良いかも知れない
12:デフォルトの名無しさん
19/04/30 21:41:18.36 B5WLnK8N.net
_s 系関数でも未定義な挙動を示すコードはいくらでも書けるのでキリがないんじゃね
詳細な資料はあるけれども、入門者が読むもんじゃなし
fgets + sscanf で安全になるわけでもなし
13:
19/05/02 13:55:59.43 USN+R+ig.net
>>8
まあ他の人の意見も聴いておいたほうがいいでしょうね
個人的には何をやっても C で書けると「思える」感触ができるまで C で書きまくる経験は有用だろうと思います、時間はかかりますけれども何でも自分で実装する、という縛りを課してみる
データ構造(線形リスト、スタックやキュー、二分木やバランス木・K-dimensionなどのデータ構造)
アルゴリズム(ヒープ/クィック/シェル各種ソート、縦横探索やダイクストラ法と枝刈り・バックトラッキング、ナップサック、シンプレックス法、シャノンファノやハフマン)
いやもう、C なら何をやってもいい経験になりますね…
14:デフォルトの名無しさん
19/05/03 11:34:54.23 Gwp1b6R4.net
いまどきの環境だと下部に丸投げか
15:デフォルトの名無しさん
19/05/03 14:13:46.95 xL3yQoTR.net
関数の引数の書き方について質問があります。
任意のオブジェクトを複数参照する関数f(A& a, B& b, ......)
において、引数の a,b,...を左辺値と右辺値の任意の組み合わせで
使用する場合、関数定義をf(const A& ac, const B& bc, ......){
A &a=const_cast<A&>(ac);
B &b=const_cast<B&>(bc);
:
}
とする方法がベストでしょうか?
16:デフォルトの名無しさん
19/05/03 14:32:25.70 qNybD7B2.net
だめ
17:デフォルトの名無しさん
19/05/03 14:34:29.48 xL3yQoTR.net
15です。
追記します。
開発系のIDEでオブジェクトのメンバー変数を表示させながら
プログラム作成をしたいので、テンプレート関数化による
ユニバーサル参照の記述は使いたくありません。
18:はちみつ餃子
19/05/03 21:34:51.81 Oy2+74/H.net
>>15
控えめに言ってクソ。 本当に const なオブジェクトが渡されたときにエラーにならない。
const なオブジェクトに const でない操作をするのは未定義だぞ。
(const ではないオブジェクトなら途中で const を経由しても書き換えて良いらしい。)
言語の作法の範囲内でなら IDE に対する配慮は工夫として評価されるかもしれないけど、
型システムによる保護を台無しにしてまでやるのはオススメできない。
少なくともこのスレでそういう工夫を是とする人はあんまりいないと思うぞ。
19:デフォルトの名無しさん
19/05/03 21:43:10.16 16FcdCX4.net
Arduinoなんだけど多分C一般の話だと思うんでここで
byte counter = 0;
while (true) {
if (Shori(counter)) { break; } // Shoriの結果によってwhileから脱出
if (counter < 4) { counter++; }
else { counter = 0; }
}
または
for (byte counter = 0; counter <= 4; counter++) {
if (Shori(counter)) { break; } // Shoriの結果によってforから脱出
if (counter == 4) { counter = 255; }
}
または
for (byte counter = 0; true; counter++) {
if (Shori(counter % 5)) { break; } // Shoriの結果によってforから脱出
// これだとcounterが255から0になるときcounter % 5が2回連続して0になるため
// 0~5を繰り返し引数にしてShoriしていることにならない
}
または
while (true) {
for (byte counter = 0; counter <= 4; counter++) {
if (Shori(counter)) { goto dasshutu; } // Shoriの結果によってforとwhileから脱出
}
}
dasshutu:
みたいに一定の範囲を繰り返すカウンタを持つ無限ループってどう書くのがシンプルで一般的なんだろう?
無限ループとはいっても256回も回らずに終わる見込みだから3つ目の書き方でいい(仮にそれを越えても処理内容的に致命的な問題はない)とか、念のためwordにしとけば65536回まではいけるとか考えてもいいのかな
20:デフォルトの名無しさん
19/05/03 22:05:03.91 VZjV/dE9.net
for (byte counter = 0; ; counter = (counter + 1) % 5) {
if (Shori(counter)) { break; }
}
とか?
21:デフォルトの名無しさん
19/05/03 22:23:08.93 16FcdCX4.net
おおそんな書き方が。ありがたい。
しかも脱出に関して言えば、forの中でifで判定してbreakするのではなく
forの条件式に書いてしまうこともできるな…
22:デフォルトの名無しさん
19/05/04 04:03:12.91 qzgt3pmZ.net
オブジェクト指向でなぜつくるのか
って書籍が今Kindleセールで半額だけど良さそうだな
読んだことある人どんな感想ですか?
23:デフォルトの名無しさん
19/05/05 03:51:38.18 NRm/lXtt.net
>>22
じゃんけんゲームを2人(自分対PC)用から(PCを)何人でも増やせる設計に変える例で
構造化プログラミングだとちょっと書き換え多そう。。。オブジェクト指向プログラミングなら~って感じ。
(そこしか覚えてないとも言う)
第2版は最終章でオブジェクト指向プログラミングの次世代は関数型プログラミングだとか言ってHaskellの紹介が追加された。
24:デフォルトの名無しさん
19/05/05 11:14:43.13 P7bsB8ff.net
皆さんが一番勉強になった本を教えてほしいです。
これならわかるC++と、C言語ポインタ完全制覇は持ってるので、基本的なことはわかります。
これ読んで実力がバズった!というのがあればぜひとも。
25:
19/05/05 11:28:24.38 3EWrT4Pn.net
>>24
C++ ならハーバート・シルトの独習C++ ですね
その真ん中くらいにある「std::string を自分で実装する」というお題が非常によく、OO の教科書でそういうお題を配置しているのも本質を明示している意味でよく、この本より優れている初級C++教科書がみあたりません
26:デフォルトの名無しさん
19/05/05 11:43:07.96 qZTOu8es.net
C言語を256倍使うための本
URLリンク(www.amazon.co.jp)
27:デフォルトの名無しさん
19/05/05 19:46:41.25 P7bsB8ff.net
>>25-26
ありがとうございます。参考にします。
28:はちみつ餃子
19/05/05 20:24:31.00 TxpPZKKr.net
>>24
私が学んだのは「詳説 C++ 第2版」だな。
URLリンク(www.amazon.co.jp)
この本の内容は C++03 の時代のものなので C++11 以降のトピックはウェブで学んだ。
Twitter で C++ に強い人が独習C++の間違いを強く批判しているのを見ることがちょいちょいあるので、
自分では読んだことが無いけど独習C++には良い印象がない。
まあ不正確でもわかりやすいことは有りうるのでとりあえずおおざっぱな概略を把握する分には
どれでも割となんとかなる気がしている。
29:
19/05/05 20:35:10.90 3EWrT4Pn.net
>>28
>独習C++の間違いを強く批判している
話を簡単にするために、一時的に紛らわしいことを言っている=どこを切っていも正しいというわけではない=文脈依存なところがある、という批判はアマゾンレビューにありましたね
しかし強く批判されるほどの欠点があるかどうかは、私にはよくわかりません
よろしければポインタをください
30:はちみつ餃子
19/05/05 21:21:05.73 TxpPZKKr.net
>>29
良い評価も悪い評価もあるので単純には言えないけど、批判している代表的な意見としてはこれかな。
URLリンク(twitter.com)
ただ、全体として入門書として本当に妥当な本があまりないので、どれが比較的マシなのかというレベルの話だと思う。
私が読んだことがない中で評判を評価するとたぶん江添氏の出している本が (少なくとも日本語の本の中では)
だいぶん良さそうでは有る。
速度のある分野では、単純に古いものはそれだけで価値が低いので、
逆に言えば最新に追い付こうとしているものは高く評価できる。
(deleted an unsolicited ad)
31:デフォルトの名無しさん
19/05/05 22:04:35.25 vipN53in.net
俺「競プロ飽きたしC++の勉強でもするか」
isocpp.org「まずはTourofC++で概要をつかむといいよ~」
ビャーネ「Tourはプログラミングに習熟した人を想定している」
俺「短くて面白いけど難しいな。プログラミング初心者向けのはないかな?」
isocpp「じゃあこれ つ原則と実践(1248ページ)」
俺「ファッ!?」
isocpp「あと勉強するときは少なくとも3冊持っといたほうがいいよ~」
俺「ウーン…」
32:
19/05/05 22:17:13.40 3EWrT4Pn.net
>>30
毒臭を有害ゴミと判断した理由が知りたいですね…
個人的には、C++ の中の Java に似た部分を抽出して、初心者(最近は C++ に直接参入する人が多いとか…なんか時代を感じます)にやさしい、できれば分厚くない本がいいなあ
以前は accelerated C++ を薦めたりしたのですが、最近 accelerated c++ の決定的に駄目なところを見つけてしまったので、もう私が薦める本は独習しかないのでした
33:デフォルトの名無しさん
19/05/05 22:37:15.85 RPhfdkos.net
>>32
有害ゴミなどど、相手が使ってない言葉に勝手に置き換えて、さも相手が感情的で非論理的な
34:デフォルトの名無しさん
19/05/05 22:39:39.67 RPhfdkos.net
途中だった。
有害ゴミなどど、相手が使ってない言葉に勝手に置き換えて、さも相手が感情的で非論理的な発言をしてきたかのような印象操作は卑怯だとは思わないか?
35:
19/05/05 22:39:39.95 3EWrT4Pn.net
>>33
URLリンク(twitter.com)
>言うまでもなく独習C++は時代遅れの化石で有害ゴミ行き。
使っていますが…
(deleted an unsolicited ad)
36:
19/05/05 22:41:08.48 3EWrT4Pn.net
>>34
URLリンク(twitter.com)
>言うまでもなく独習C++は時代遅れの化石で有害ゴミ行き。
印象操作などではありえず、ずばり「有害ゴミ」指定されちゃってますが…
(deleted an unsolicited ad)
37:デフォルトの名無しさん
19/05/05 22:42:08.10 RPhfdkos.net
>>36
twitterの方は見てなかった。失礼した。
38:デフォルトの名無しさん
19/05/05 23:27:07.88 DzyvOKLj.net
プログラミングの最初の一歩すらわからない状態から始めるのか
Pythonやjsやphpなんかである程度書ける状態から始めるのかで話が変わると思う
後者ならググりながら適当になんか書いてみればいいと思う
39:
19/05/05 23:43:52.77 3EWrT4Pn.net
>>38
>ググりながら適当になんか書いてみれば
それは C/C++ に関していえば、ちょっと危険な気が… 逆に Python や ruby をやるのなら、それでもいいと思いますが…
40:はちみつ餃子
19/05/05 23:57:02.81 TxpPZKKr.net
>>39
それに強く同意。
C++ には未定義の挙動が多すぎるので、
表層的な理解で使うのは大変に危険である。
41:デフォルトの名無しさん
19/05/06 01:21:26.82 oGUqqIoM.net
C++に関してググって出てくる情報って適当なの多いよなw
Qなんとかとか特にw
42:デフォルトの名無しさん
19/05/06 04:37:01.34 z7Cz8mZC.net
どうも最近は最新のC++の機能を使うべきだとしつつ
自分なりにとりあえず適当に書くのは危険とか言う意見が多いけど
人間もあくまで動物なので手を動かして書かなきゃ覚えないしCの時代から続く古臭い書き方は長年の積み重ねでセオリー確立してんだから
そういう学習方法を否定するのは違うと思うよ
クラス、ひいては最新の機能を正しく使う、なんて初心者がいきなり目指すようなことじゃない
43:デフォルトの名無しさん
19/05/06 06:08:09.39 Geq8Gq1G.net
>>42
手を動かして覚えることは誰も否定していないし、むしろそれは強く推奨したい。ただ、C/C++の場合は表面的な理解だけで動いたから良しとして進むのは危険で、基本的な部分は正しく理解しておくことは必要だと思う。
ある程度の基礎がある状態なら、新しい機能やライブラリの関数もググって得られる情報から正しい仕様を理解して習得できるが、基礎ができていない状態でそれは難しい。
初心者がとりあえず適当に切り貼りして動かそうというやり方をするなら、他の言語から入った方がいいと思う。ググって調べた断片的な情報だけでなく入門書等で基礎を押さえつつ、実際に書いて愚直に挙動を確認しながら理解をしていくのが良いと思う。
44:
19/05/06 11:40:40.36 vu8V8zIe.net
>>42
>人間もあくまで動物なので手を動かして書かなきゃ覚えないし
プログラミングは特に、自分で書いて書いて書きまくって読んでというところは同意
となれば、ちょっと書く気になろうという心の動きを、分厚い教科書で潰したくない、という趣旨は理解
さて、困ったものです、そういうときに使える教科書があればいいのですが、C/C++ の教科書って高くて分厚いですからね…私もメイヤーズはまだ積読だし、いつ読む気になるかな?
45:デフォルトの名無しさん
19/05/06 13:27:09.96 MWPsBkkn.net
300ページ未満の入門書…
46:デフォルトの名無しさん
19/05/06 13:46:12.30 z7Cz8mZC.net
まぁ確かにサンプルコードの切り貼りとかは危ないだろうしネットの情報だけってのはね
でも独習みたいな古臭い(03以前)入門書なんて初心者にうってつけだと思うんだけど
・・・って、twitterでこき下ろしてる奴のアカウント名に見覚えあるわw
そいつ勘違いの激しい学生ちゃんだから言ってること真に受けない方がいい
47:デフォルトの名無しさん
19/05/06 16:16:47.15 yQTWUAYp.net
isocppで推薦されてる原則と実践の前の版がたまたま
近くの図書館にあったから読んでみたけど、意外と面白いな。
48:はちみつ餃子
19/05/06 16:19:28.55 K/rO19sE.net
>>46 見つけられなかったので比較的に新しいやつの中から探して一例として出したけど、
そやつひとりだけが言ってるわけじゃないよ。 良いと評価している人も当然いるんだけど、
あくまで私の観測範囲で私が総合的に感じた漠然敵な印象の話なんで。
49:はちみつ餃子
19/05/06 16:20:48.53 K/rO19sE.net
今の時点でそれなりに C/C++ をわかるようになっている人の思う「良い本」というのは
「昔に学んだ」という体験だからさ、今から学ぶという人の事情とはやっぱり時代が違うと思う。
自分が読んだ本を言えても、それを強く勧めるほどの自信はないな。
例えば私が最初に買った C++ 本は ARM なんで、これにはいわゆる STL さえ載ってないんだけど、
当時としては妥当な選択肢だったし、十分にわかりやすかった。
でももちろん、今の時代に ARM を勧めるなんて馬鹿馬鹿しくてあり得ないでしょ。
昔の C++ を身に着けてから徐々に知識を更新してきていると昔の C++ と今の C++ が
滑らかに繋がっているように錯覚してしまうけど、昔の C++ を学んでから今の C++ というのは
結構な飛躍があると思うんだよ。
今から学ぶなら C++11 程度は想定している本の方がいいんじゃないかな、と個人的には思う。
50:
19/05/12 18:12:45.12 wqyHUvPG.net
>>49
> C++11 程度は想定している本の方がいいんじゃないかな
しかし、C++03 までのからくりをしらずして、C++11 のあれこれを理解できるかな?とも思うのです、ranged for の for(auto &item; vec) の & の意味とか…これはあんがい簡単にクリアできるのやもしれませんけど
51:デフォルトの名無しさん
19/06/13 17:42:42.66 KieG+j09.net
テンプレート特殊化を前方宣言したいんだけど、
コンパイルエラーが出て詰んでるんですけど、
どうやればいいですか?
例えば以下のようなことがしたいんですが。
template<class T>
struct A {};
template<>
struct A<int>;
template<>
struct A<float> {
A<int> f() { //エラー : 認識できない型A<int>が使われいます。
return A<int>{};
}
};
template<>
struct A<int> {
int value;
};
52:デフォルトの名無しさん
19/06/13 23:30:30.78 CsiJtfL2.net
A<float>::fを定義するにはA<int>の定義(classのサイズ)が必要
fの定義をA<int>のあとにすればできる
URLリンク(ideone.com)
53:51
19/06/14 00:54:44.79 rrlL2Eyk.net
>>52
おお!マジで出来たw
ありがとう
54:デフォルトの名無しさん
19/06/18 08:26:42.73 YBHtdulC.net
入門書の入力された文字列が同じかどうかを判断するコードなのですが
URLリンク(ideone.com)
14行目のif(str1[i]!=str2[i])break;がどういう意味なのかさっぱり理解できません
文字コードが同じじゃなければbreakッて意味ですか?
len+1してるのも意味がわからないです・・・
説明よろしくお願い致しますm(_ _)m
55:デフォルトの名無しさん
19/06/18 09:08:30.02 Sq2beh5p.net
文字コードが同じじゃなければbreakということでいいんじゃない?
len+1しているのはヌル文字があるから
56:デフォルトの名無しさん
19/06/18 09:20:54.17 R6plNfEa.net
まず配列について勉強だね
デバッガのステップ実行で追っていくといいよ
57:デフォルトの名無しさん
19/06/18 09:21:46.85 3nOE2mBA.net
プログラム板の精神病コテ 松本卓朗 さん殺害予告!
スレリンク(tech板)
58:デフォルトの名無しさん
19/06/18 11:28:13.79 uO3416eX.net
文字列が同じ = 1文字1文字全部同じ = 1文字でも違えば違う
strlenは文字数を返すけど最後の\0を含まない
最後の\0まで比較しないと入力した文字列と先頭部分が一致したら一致してしまうのでlen+1
59:デフォルトの名無しさん
19/06/18 11:38:40.31 YX5RP0uz.net
文字列長の短いほうを len としないと突破したところを参照してまうぞ
str1 = asd\0
str2 = asdf\0
で str2 の len+1 まで str1 を参照すると嘔吐
60:デフォルトの名無しさん
19/06/18 11:39:47.81 YX5RP0uz.net
まぁ 文字列長がちがったら いきなり不一致って脱出してもいいんだけどね
61:デフォルトの名無しさん
19/06/18 11:50:07.19 uzZY1452.net
URLリンク(ideone.com)
分かり易くなったゾ
変数を減らせばラク
lenで判定してるイマイチな書き方を排除すればもっとラク
要するに分かりにくく書いてるから分かりにくいだけだよ
62:デフォルトの名無しさん
19/06/18 12:00:25.27 YX5RP0uz.net
元々は入門書に書かれてたコードか
むむむ
63:デフォルトの名無しさん
19/06/18 12:36:36.95
64:uzZY1452.net
65:デフォルトの名無しさん
19/06/18 12:55:58.74 GYXVYwQo.net
ポインタを知らないであろう初学者にポインタ演算を使って分かりやすいとする鬼畜の所業
66:デフォルトの名無しさん
19/06/18 16:53:31.85 eB4Ftz1Y.net
>>57~63回答ありがとうございます
説明下手でスイマセン。このコードが書いてある前のページに文字列の比較は出来ないため
str1==str2と書いて判定は出来ないと書いてあったのに
14行目でstr1[i]!=str2[2]で判定してるのがよくわからないです
strlenは\0返さないのですね。そこはスッキリしました。ありがとうございます
67:デフォルトの名無しさん
19/06/18 18:05:58.84 U3/WUc9c.net
>>65
str1==str2はポインタ(それぞれの文字列が格納されている先頭アドレスの値)を比較してるだけ。
str1[i]!=str2[i]は、str1とstr2のi番目の文字を比較している。
68:デフォルトの名無しさん
19/06/18 18:50:13.29 ujoReLWG.net
>>66
文字列の中身を比較してるんじゃなくて先頭のアドレスを比較していて
str1[i]!=str2[i]は文字列の中身を比較してるってことなんですね
もやもやが解けました。ありがとうざいます
69:デフォルトの名無しさん
19/06/18 19:28:14.92 U/JJd+xv.net
>>59
馬鹿なの?
70:デフォルトの名無しさん
19/06/18 20:04:16.08 ADibu3ht.net
きゃー はずかしい><
71:デフォルトの名無しさん
19/06/18 22:39:27.24 R4l3qwnJ.net
int a = b - 1;
if (a < 0){
a = 0;
}
これのスマートな書き方を教えてください。
72:デフォルトの名無しさん
19/06/18 22:45:19.63 BC11WozD.net
ここで聞いていいのかわからないけど
組み込み系で上位割り込みでライト、下位割り込みでリードする場合割り込み禁止する必要ありますか?
73:デフォルトの名無しさん
19/06/18 23:11:51.18 gZnFDsgJ.net
>>70
それ以上にスマートな書き方なんてない
素直が一番
>>72
atomicにアクセスできないなら必要
readの途中でwriteが発生したらダメだし、
writeの途中でreadが発生してもダメなんだから、上位/下位は関係無い
74:デフォルトの名無しさん
19/06/18 23:13:26.53 48k2aFsK.net
>>70
bの型が不明な場合はスマートな書き方は特に無い
75:デフォルトの名無しさん
19/06/18 23:24:05.71 f34xyyaF.net
>>70
int a = b < 1 ? 0 : b - 1;
76:デフォルトの名無しさん
19/06/18 23:28:32.54 BC11WozD.net
>>72
何故ダメなのかが理解できてません。
書き忘れてましたが割り込みはタイマで周期的に発生させてます。
リード中にライトが発生しても下位割り込みは一周期遅れて上位割り込みのライト結果をリードするだけではないのですか?
77:デフォルトの名無しさん
19/06/18 23:45:23.52 gZnFDsgJ.net
>>75
writeの割り込みが発生するまではreadは進行するんじゃないの?
だから「readの途中で」なんだけど
「2つの割り込みは完全制御下にあり、read中にwriteは発生しない」なら大丈夫だよ、当然
78:デフォルトの名無しさん
19/06/19 00:02:23.61 /MswhT0Q.net
>>75
>リード中にライトが発生しても下位割り込みは一周期遅れて
ここがちょっと勘違いを感じる
割り込み処理が終わったら、割り込まれた処理の続きをするのよ
低レベルにDBのrollbackみたいな複雑な仕組みはないのよ
79:デフォルトの名無しさん
19/06/19 02:33:40.48 v2+76oWz.net
char型の動作がどうもわからない。
例えば
char str[] = "abc"; として
cout << &str[0]; ----> abc
になるのはなんで? index 0番だから a がでると思ったんだけど...
初心者ですまん
80:デフォルトの名無しさん
19/06/19 03:26:09.45 0DgdOBcz.net
>>78
&str[0]に付いてる&はアドレスを取得する演算子だから、strの最初の文字「a」のアドレスを取得するという意味になり、
結果的には cout << str; と同じことになる。
81:デフォルトの名無しさん
19/06/19 05:18:40.21 xxgeB2IO.net
>>78
cout << &str[0] << '\n';
cout << str[0] << '\n';
この2行でソースと実行結果を見比べれば腑に落ちるんじゃないかな。
82:デフォルトの名無しさん
19/06/19 08:25:58.04 huda4IDC.net
>>76
>>77
下位割り込みのリードが一命令で完了するなら「リードの途中でライト」が発生しないので割り込み禁止しなくていいということですか?
例えばリードライトの対象が配列なら割り込み禁止要、変数単体なら不要
83:デフォルトの名無しさん
19/06/19 09:03:32.83 bPRT+MIA.net
>>81
アセンブラ確認してほんとに一命令なら良いけどそうじゃないなら結局危険じゃない?
Cで1行だからアセンブラでも一命令とはかぎらんよ
84:デフォルトの名無しさん
19/06/19 09:06:41.55 zjjAtQWn.net
ちなみに上位下位って割り込みの優先度のこと?
85:デフォルトの名無しさん
19/06/19 09:22:03.41 RukLP400.net
たとえ1命令でも安全かどうかはcpuによる
あいまいな質問にはあいまいな回答しか返らない
マニュアル読むのが正解
86:デフォルトの名無しさん
19/06/19 09:54:17.80 huda4IDC.net
>>82
なるほど。極端な例ですがcでword変数への代入処理一行だったとしてもアセンブラでは上位バイト、下位バイトを分けて代入してるかもしれませんもんね。
>>83
そうです。
>>84
アセンブラで一命令でもまずい場合ありますか?例えでもよいのでご教授頂けたら助かります。
87:デフォルトの名無しさん
19/06/19 11:34:02.00 kjBiA8ae.net
vector<std::vector<char> > vec;
の二次元配列で、一行を削除するのはどうしたらよいのでしょうか。
int row = 1;
vec.erase(vec.begin() + row );
ではだめなんでしょうか。
88:デフォルトの名無しさん
19/06/19 11:40:44.36 kjBiA8ae.net
すみません。これでちゃんと動きました。
お騒がせしました。
89:デフォルトの名無しさん
19/06/19 15:30:59.62 2x/CN7xY.net
>>70
int a = max(b - 1, 0);
というような書き方を見たことが有る。
90:デフォルトの名無しさん
19/06/19 20:53:07.15 RukLP400.net
>>85
だから一般論で答えられないって言ってんの
使ってるcpuのマニュアル読め
書いてあるから
91:デフォルトの名無しさん
19/06/19 23:49:00.15 v2+76oWz.net
>>79
>>80
回答ありがとう。
そもそもaddress-of演算子でIndex 0番を指定してるのに アドレス値じゃなくて 文字が出てくることが混乱の元だった。
char型については>> 演算子がオーバーロードされててc-stringとして解釈される。
実際のアドレスを出力したい時は
cout << (void *)&str[1]; とする
って感じでいいのかな?
92:デフォルトの名無しさん
19/06/23 01:18:33.15 X4lwQ0L+.net
学校の課題でバブルソートアルゴリズムを使った画像処理の課題で、VSの警告にfor-loopの定義が無効です:最初の条件はテストを満たしていません。ループボディは実行されませんと出てきます。これはどういった原因で出てくる警告なのか教えほしいです
93:デフォルトの名無しさん
19/06/23 01:30:30.52 xbroTRmV.net
ループの初期状態でループ終了条件を満たしている
94:デフォルトの名無しさん
19/06/23 01:31:24.99 xbroTRmV.net
単純化すればこういうこと
for (int i = 0; i < 0; i++)
95:デフォルトの名無しさん
19/06/23 06:24:41.17 TKCAljQF.net
てst
96:デフォルトの名無しさん
19/06/23 11:28:18.87 6GXr3JQp.net
最近BS/CSが映らなくなった人はここを見ると良い
【B-CAS改造】Bカスカード2038化書き換えツール配布所 205
スレリンク(avi板:1番)-100
97:デフォルトの名無しさん
19/06/24 06:51:52.73 lwUqObiG.net
FILE* file;
file=fopen("test.txt","w");
fclose(file);
これでソリューションのフォルダ内にtest.txtファイルが作られると読んでる入門書には書いてあるのですが
VisualStudioのフォルダ内、何処を探しても生成されてません;何処に有るのでしょうか?
98:デフォルトの名無しさん
19/06/24 09:37:54.94 LpgW8DGO.net
ドキュメントにプロジェクトを作らなかったか?
その中かと
99:デフォルトの名無しさん
19/06/24 10:06:16.55 N4e4wdnY.net
>>96
「ソリューションのフォルダ内」であって「VisualStudioのフォルダ内」じゃないぞ
100:デフォルトの名無しさん
19/06/25 07:24:49.37 jHEFOU5u.net
>>96
取りあえずコマンドプロンプト開いて
dir /s /b ¥test.txt
ってやってみ
101:デフォルトの名無しさん
19/06/26 01:39:16.88 6WTwK8fu.net
STLコンテナ「set」の特定要素を削除したいとき
set<int> s = {1,2,3};
for (auto itr = s.begin(); itr != s.end(); ++itr) {
cout << *itr << endl;
if (*itr == 2) s.erase(itr);
}
これの実行結果が
1
2
1
3
となるのですが、erase後に最初に戻っているように見えるのは偶然、つまり不定の動作ですか?
なお、正しいイタレータの使い方は以下のようになるのは承知してます
for (auto itr = s.begin(); itr != s.end(); ) {
cout << *itr << endl;
if (*itr == 2) itr = s.erase(itr);
else ++itr;
}
102:デフォルトの名無しさん
19/06/26 07:52:05.91 Re4GWmuT.net
>>100
erase で無効になったイテレータの使用により動作は未定義となります。
そのコードの場合は erase 直後にくるループ条件にある比較時点で。
103:デフォルトの名無しさん
19/06/26 09:02:19.59 16uFKMyS.net
いやいや
104:デフォルトの名無しさん
19/06/26 09:07:00.61 Re4GWmuT.net
あ、インクリメントのほうが先か。ごめんなさい。
105:デフォルトの名無しさん
19/06/26 14:50:08.20 7raG/MY1.net
未定義動作を起こしてるんで
プログラムがたまたまクラッシュもせずに最後まで動いたというレベルからの偶然
106:デフォルトの名無しさん
19/06/26 23:47:19.51 6WTwK8fu.net
やはり偶然なんですね
ありがとうございました
107:デフォルトの名無しさん
19/06/28 01:54:12.27 kYWVUvHS.net
constを外すのに使う const_cast<T&>(t) ですが、Tをいちいち書くのが面倒なので
そうだdecltypeを使えば楽できると思ったものの、remove_constも併用しないといけないみたいですね
参照だったらさらにremove_referenceも必要で、これじゃTがくっそ
108:長くない限り有り難みが薄いですね なんかもっといいやり方ないですかね? const int i = 0; const_cast<remove_const<decltype(i)>::type&>(i) = 1 const int& j = i; const_cast<remove_const<remove_reference<decltype(j)>::type>::type&>(j) = 2;
109:蟻人間
19/06/28 01:56:07.93 5qyojIkB.net
>>106
テンプレート構造体内部の型。
110:デフォルトの名無しさん
19/06/28 02:11:51.51 4VImPalK.net
const_cast<decay_t<decltype(i)>&>(i)
で大体事足りる
まあ大抵は
using U=decay_t<...>;
とかしておくが
111:デフォルトの名無しさん
19/06/28 03:26:31.25 kYWVUvHS.net
>>108
有り難うございます。decayなんてあるんですね
ここ見るといろいろ機能あるようで
URLリンク(ja.cppreference.com)
type_traitsってあんまり詳しくないですけど、よくこんなの考えたなぁと感心します
仕組みを知らないと魔法使ってるみたいに見えますね
112:デフォルトの名無しさん
19/06/28 18:20:06.99 SuTGhcfs.net
作りたいものにC++が必要なので1から学んでるプログラミング初心者です
biginteger という型の使い方・使い道がよくわからず悩んでいます。
113:デフォルトの名無しさん
19/06/28 21:15:56.74 +JSlLfql.net
C/C++の標準にそんな型ないよ
C#にBigIntegerあるみたいだね
使い方は普通の整数型と同じ
使い道は、大きな整数を扱いたい時
使い道がわからないものを無理に使う必要ないんじゃね?
114:デフォルトの名無しさん
19/06/28 21:19:18.85 U9hxi1vj.net
多倍長整数ならboostには入ってるからそのうち標準にも来るかもね
115:
19/06/28 21:46:26.65 FS2l1RCX.net
>>110
スレリンク(tech板:51番)
私は biginteger が欲しかったので自分で書くことにしました
116:110
19/06/29 19:00:51.29 gqtgvd1f.net
標準の型じゃなくて読み込んでるライブラリ?のクラスだったみたいです
そっちのマニュアルを見て見たら詳しく書いてありました…
いろいろ教えていただきありがとうございました。
117:デフォルトの名無しさん
19/07/24 09:52:41.24 0j2752sC.net
オブジェクト指向を使ってないアプリを c++ (コンパイラはg++6)で作るのは良でしょうか?それとも推奨されないでしょうか?
当方、意図せずにそうなってしまいました。
Cで書いてるつもりだったのですが、Cでは認められないと知らずにブロック頭以外の所での変数の宣言などを使っていて、
エラーにならなかったのは、Makefile が c++
用の流用で、ソースの拡張子が.cc だったからでした。
こんな c++ コンパイラの使い方は、許される事なのか、良くある事なのか気になりました。
118:デフォルトの名無しさん
19/07/24 10:00:57.54 zKJbgf3R.net
Cで書いてるつもりがC++になってた、は良くはないけど別に気にすることじゃないかと
Cであることが要件ならCに直せばいいし、C++でもokならそれでもいいし
要件満たすものが出来てんならひとまずokじゃない?
119:デフォルトの名無しさん
19/07/24 10:52:12.93 yY+SPHit.net
ブロック頭以外の所での変数の宣言はC言語で認められてるでしょ
120:115
19/07/24 12:47:15.91 qoUieyoj.net
>>116 どうもです。
ひとまず動いてるのですが、気になりました。
例えば、「完全にcで書いていてcでコンパイル出来るものでも、c++ 必要なものでも、どちらにも拡張子は .cc に統一して、どちらにも常にコンパイラは c++ を使う」と言う態度ってどうでしょう?
c++ が c の上位互換ならこれで良いように思えます。
121:115
19/07/24 12:48:43.68 qoUieyoj.net
>>117
そうなのですか?
私の見た情報が古かったのですかね。
122:デフォルトの名無しさん
19/07/24 13:31:50.28 zKJbgf3R.net
>>118
いや、プログラムってそもそも道具なんだから何で書かれてるかとかどうでもいいかと
複数人で開発していて他人もコードを見ることがある、技術情報として発信する、要件として言語の指定がある
とかいう縛りがあるならその縛りに応じるようにコードを書き直せば良い
個人的にはCでなければ困るというのでなければC++にするし、多少の困りくらいなら回避してC++にする
基本的にC++はCの上位互換
123:115
19/07/24 20:52:46.78 qoUieyoj.net
私が知りたかったのは、ソースを書くのに何言語を選ぶべきか、でははないです。
知りたかったのは、例えば、
「ソースが c -> gcc 。ソースが c++ -> g++」
をしないで
「一切合切どちらも常に g++ 」でも良いのか?でした。
124:デフォルトの名無しさん
19/07/24 21:07:11.23 0jLIOgkf.net
>>121
ダメです。兄弟はもう袂を分かちました。
30年前の仕様しか使わないと心に決めているならお好きに…
125:115
19/07/24 22:28:11.62 tRuObC3H.net
>>122
>>>121
>ダメです。兄弟はもう袂を分かちました。
>30年前の仕様しか使わないと心に決めているならお好きに…
どうもです。そうなのですね。
「一切合切 gcc 」はダメでも「一切合切 g++ 」なら大丈夫かと思ってしまいました。
なにぶん始めたばかりでして、この辺りの常識がないのです。
126:デフォルトの名無しさん
19/07/24 23:59:42.77 7wBUx5ir.net
良い悪いじゃないけど
実質的にCのプログラムでしかないなら純粋なCのプログラムとして書き直して
Cコンパイラとの組み合わせで使っていた方が幸せだと思うよ
127:115
19/07/25 13:26:54.50 A3AJFf0Q.net
その方がサイズも小さく速度も速いですかね。
トライしてみます。
128:デフォルトの名無しさん
19/07/27 08:53:41.05 zR8v2AWF.net
>>125
ブロック変数宣言の位置だけがブロックの冒頭ではないというだけなら、通常、
速度低下は全く無く、それをブロックの冒頭に書き直しても速くなることは
有りません。
また、コンストラクタ、デストラクタ、仮想関数、STL、コンテナなどを使わない限り
通常、C++がCより遅くなるということは有りません。
129:デフォルトの名無しさん
19/07/28 00:37:20.66 YxeZH1gr.net
Embedded C++みたいなこと言ってんな
130:デフォルトの名無しさん
19/08/05 22:51:14.97 DMRdHfR+.net
これからC++勉強しようと思うのですが、
開発環境は何を入れるのがおすすめですか?
Visual Studio Communityが無料で良いのでしょうか
他におすすめあれば御紹介願います
あと、C++勉強に当たっておすすめ定番の本あれば
ご教示ください
131:デフォルトの名無しさん
19/08/05 22:55:30.85 vqN4pUkV.net
今時ならUbuntu入れてatomなりvs codeなり入れりゃいいんじゃないかな
純粋にc++の勉強したいなら
VCは独自仕様が酷すぎるから言語学習には不向き
132:デフォルトの名無しさん
19/08/05 23:01:28.37 nblSLoEW.net
VCの独自仕様が気に入らんのならVS2019で対応したLLVMツールセットを使えばいい
初心者にIDEなしはモチベ維持が困難
133:デフォルトの名無しさん
19/08/05 23:18:05.24 f20npl5p.net
独自仕様ならGCC、未実装ならVCってかんじだがどちらも独自仕様はオプションで制御できる
まあWindows環境でやるならVisualStudio使わないのはマゾ
おすすめできる定番の本についてはどれも一長一短だし
テンプレートの利用くらいまで扱ってればとりあえずなんでもいいと思う
134:デフォルトの名無しさん
19/08/05 23:29:17.63 vqN4pUkV.net
vcのは独自と言っても、なぜかコンパイルが通らない
なぜかコンパイルが通る
なぜかリンクエラーが起こる
みたいなあまり明文化されていないのだから面倒
structとclassがリンカで別物ってのは酷すぎる
135:デフォルトの名無しさん
19/08/05 23:45:44.34 4w7A00FF.net
>>132その最後の行の話、はじめて聞いたけど参考になるサイトとかあったら教えて。
136:デフォルトの名無しさん
19/08/05 23:49:09.91 vqN4pUkV.net
ググればいくらでも出てくるがとりあえず一番上を貼っておく
URLリンク(stackoverflow.com)
137:デフォルトの名無しさん
19/08/06 00:52:13.35 pONItBAd.net
コマンドライン引数ってのが何を出来るものなのか全く分からないのですが、何が出来るものなんでしょうか?
書き方はまー分かったんですけど、空のメモ帳をドラッグ&ドロップすると意味あるみたいなこと書いてあるけど何も起こりません…
使用環境Visualstudio2019 で見ているサイトhttp:ああwisdom.sakura.ne.jpあprogramming/c/c32.htmlです
138:デフォルトの名無しさん
19/08/06 11:26:59.34 qIlFvc4N.net
std::optionalが内部に値を保持する仕組みについてお聞きしたいことがあります
現在いくつかのサイトを巡り、値を保持するためにstd::aligned_storageで確保した領域に配置構文newで値を書き込んでいることがわかりました
このaligned_storageを使った場合に、std::vectorなどのサイズが可変な値が格納されるとどういった挙動になるのでしょうか
vectorの要素数が増えてサイズが大きくなると、alinged_storageで確保したサイズを超えてしまったりしないのでしょうか
139:デフォルトの名無しさん
19/08/06 14:04:02.23 AX25/xXa.net
根本的な部分の理解が足りていない気がするが直接の答えとしてはvectorのサイズは増えないので問題ない。
vectorが管理しているバッファのサイズは増える。
vectorはポインタを持っているだけ。
140:デフォルトの名無しさん
19/08/06 21:09:46.35 qIlFvc4N.net
>>137
なるほど、的確な解答ありがとうございます
141:デフォルトの名無しさん
19/08/07 00:38:52.58 pFHPYbJE.net
VS2019でchar* name="ABC"みたいにやると
cont char*値を使用してchar*のエンティティを初期化することはできません。とエラーが出るんですけど
どうしたら実行できます?
ググったらcharの前にconst付けると直るみたいですけどこの例だと治りませんでした
URLリンク(ideone.com)
142:デフォルトの名無しさん
19/08/07 00:46:34.02 nHUnBCAO.net
const char* name;
ってしてもダメなの?
143:デフォルトの名無しさん
19/08/07 04:58:05.08 pFHPYbJE.net
>>140
それはやったんですけど出来ませんでした
paizaとかはconstとか付けなくても付けても出来ましたけどVSでは出来ないのでしょうか?
144:デフォルトの名無しさん
19/08/07 05:16:54.31 v77Wmobb.net
構造体だから
145:デフォルトの名無しさん
19/08/07 05:19:14.35 v77Wmobb.net
あるいはそれを許可するコンパイルオプション付けるか
146:デフォルトの名無しさん
19/08/07 08:50:49.29 F5bbfK8A.net
文字列リテラルの型はconstな文字列の配列です
URLリンク(ezoeryou.github.io)
147:デフォルトの名無しさん
19/08/07 10:29:55.43 5hdKKXYg.net
>>141
それをやってダメだったときのエラーメッセージを張ろう
148:デフォルトの名無しさん
19/08/07 10:45:14.88 9Ff0DYo3.net
>>139
C/C++の言語仕様的には
const char *name="ABC";
で行ける可能性は高いんですが、分かりやすさのためには、
static const char szName[] ="ABC"; // szName[4] という配列を "ABC",0 で初期化。
const char *name =&szName[0];
とするものお勧めです。
149:デフォルトの名無しさん
19/08/07 11:36:34.89 Io4EJaZl.net
少なくとも>>139のリンクにあるコードはchar*にリテラルを入れようとしてるのでNG
constをつけても駄目なのは生成後に代入しようとしてるから
てか意味もなくグローバルスコープの構造体とかやめろ
150:デフォルトの名無しさん
19/08/07 17:26:37.26 Io4EJaZl.net
あと特に理由がないなら文字列はstd::stringを使うべき
C言語じゃないんだから
151:デフォルトの名無しさん
19/08/07 17:27:18.45 Io4EJaZl.net
↑C言語じゃないんだったら
152:デフォルトの名無しさん
19/08/08 08:01:13.41 kZ+216R/.net
>>147
構造体メンバに
const char *name;
と書いていて、構造体を生成後に後から name メンバに
Cの文字列リテラルの先頭アドレスを代入することは、
C/C++の言語仕様的にはいけるはずです。
なぜなら、xxx.name のように書いた場合、コンパイラの内部的には
const char* 型の左辺値(代入先)が有るのと同じように扱われるので、
ローカル変数に const char *aaa; aaa = "xxx"; と書いた場合と変わらなく
なるはずですから、C/C++ の言語仕様的には。
153:デフォルトの名無しさん
19/08/08 16:00:04.26 uMVCdDWb.net
独自のクラスに比較演算子==を実装する時、クラス内に定義するのとグローバルで定義するのとでは、実装の仕方以外に違いがあるのでしょうか?
また、例えば独自クラスとintの比較演算子==を実装する場合は、左辺にintがある場合と右辺にintがある場合の二つを用意する必要があるのでしょうか
ちなみに使用しているのはC++11です
154:デフォルトの名無しさん
19/08/08 16:20:50.94 5ZN2ymvH.net
それくらいすぐ作れるんだからやってみればいいのでは
155:デフォルトの名無しさん
19/08/08 16:35:41.72 uMVCdDWb.net
>>152
これって自分でやったところで解決できる質問なのでしょうか?
もちろん既に自分で実装していますが、自分で使ってみた感じではクラスでもグローバルでも一切の違いがないと「思います」
左辺と右辺のintについても、わざわざ2つの演算子を定義するしか方法がないと「思います」
156:デフォルトの名無しさん
19/08/08 23:38:32.45 gitRBAeC.net
クラス内に定義するのとグローバルで定義するのとってどういう意味でだ?
クラスのメンバ関数と普通の関数として定義するのとってこと?
あるいはクラスのstaticメンバ関数と普通の関数?
そういうのとは違ってクラス定義の中にメンバ関数の定義も書くのと
クラス定義の中では宣言だけで外に定義を書くのとってこと?
157:デフォルトの名無しさん
19/08/09 01:10:13.49 QHhCdgXb.net
>>151
クラス内に定義すると当然メンバー関数扱いなるのでprivateメンバーにアクセスできるが、左辺を自クラス、右辺をintにoperatorしか定義できない。
クラス外に定義すると、そのままではprivateメンバーにアクセス出来ないが、左辺、右辺どっちでも自由に定義できる。
158:デフォルトの名無しさん
19/08/09 01:23:46.70 QHhCdgXb.net
>>151
相手がintの場合はわざわざoperator==を定義しなくても、intへの型変換operatorを定義すれば勝手に変換してくれるので、そっちの方が楽だと思う。
159:デフォルトの名無しさん
19/08/09 04:08:33.63 P26n3T2n.net
>>151
どっちでもいいに一票
どっちが自然か&楽かで決めればいいとおも
160:デフォルトの名無しさん
19/08/09 11:09:20.14 0rjrOlB6.net
>>155
大きな違いとして出てくるのは実装面の都合になってくるわけですね
>>157 の方の言う通り楽な方で実装しようと思います
>>156
型変換のオペレータを実装するのは思いつきませんでした
確かにそれが一番手っ取り早いですね
教えていただきありがとうございます
161:デフォルトの名無しさん
19/08/10 01:46:44.99 07GKNAvB.net
質問ですがリフレクションってのは何ナノですか?
これがないのがC++の欠点って言われてるそうですが
162:デフォルトの名無しさん
19/08/10 02:13:52.05 0AyH8q+k.net
ググって何がわからなかったのか書けよ
そういう気配り謙虚さがないからお前は伸びないんだよ
163:デフォルトの名無しさん
19/08/11 09:19:19.57 tY3BhpyE.net
URLリンク(psicodisea.webnode.es)
かっこいい
164:デフォルトの名無しさん
19/08/12 16:51:27.60 dO9cEAMi.net
>>151
それよりもその定義をどのファイルに置いとくかっていうディレクトリ構成のが重要。
165:デフォルトの名無しさん
19/08/12 16:56:28.87 FzF2lTUV.net
ある型TでT[]とT*とTって何が違うの??
166:デフォルトの名無しさん
19/08/13 00:33:44.36 DG2S/APd.net
T[]は配列、Tなものが並んだもの
T*はポインタ、Tなものを指すもの
Tは、Tそのものとしか
配列は随所でポインタに変換されるから混同するのもわからんでもないが
167:デフォルトの名無しさん
19/08/13 01:11:53.36 7xRhzmxz.net
じゃあ配列を関数の実引数で与えるときに[]…って書かないで*ってするのはなんで??
168:デフォルトの名無しさん
19/08/13 03:45:41.66 4ID4APxI.net
配列を渡すんじゃなくて配列を指すものを渡すため
169:デフォルトの名無しさん
19/08/13 05:41:26.72 DG2S/APd.net
配列を関数の実引数で与えるときに*なんてしない
int arr[NUM] = 0; func(arr, NUM);
普通こう書く
cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ
関数に配列そのものを渡すには構造体で包むなりしないとならない
面倒なんで普通はそんなことはしなくて、先頭要素へのポインタとサイズを渡す
上記func(arr, NUM);も、本当は配列そのものを渡したいんだけどできないから
そういう意味だと解釈される
170:デフォルトの名無しさん
19/08/13 07:20:08.26 j44aRWG6.net
つまり、めんどくせぇし表現乱立するくらいならvectorなりarray使えってことだな
171:デフォルトの名無しさん
19/08/13 16:33:08.61 qE6XkMY1.net
mallocした配列なら*
二次元配列なら**
三次元なら***
すんごく分かり易いじゃん
172:
19/08/13 16:50:37.78 RSblMGL3.net
>>167
>cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ
私にいわせると、C の配列の扱い方こそ正義であり、まるまま渡せるという構造体の方が正義に反するやりかただと考えています
構造体の扱いに関しては、K&R1 のままの方が良く K&R2 は改悪だったと思っています
173:デフォルトの名無しさん
19/08/13 18:08:35.02 rOcNi2je.net
>>170
お前の正義はどうでもいい
174:デフォルトの名無しさん
19/08/14 07:35:10.61 R+Q0cUgU.net
>>168
乱立とかちょっと何言ってるかわかんない
175:デフォルトの名無しさん
19/08/14 10:53:25.60 K0s/BHfQ.net
Cだけだといろいろ物足りないから
C++ をちょっと便利な C として
手を付けるのは あり?
176:デフォルトの名無しさん
19/08/14 11:07:19.09 ULyjZxwK.net
Better Cっていう用語があるくらい一般的な使い方です
177:
19/08/14 16:51:47.26 tpn/GSyz.net
>>173
みんなそうやって C から C++ に移ってきたのだと、私は思います
178:デフォルトの名無しさん
19/08/14 19:59:27.72 H7xh21M5.net
>>175
お前はC++の機能はまともに使えてないけどな
179:
19/08/14 20:13:46.55 tpn/GSyz.net
>>176
どんなところが「まともに使えていない」と感じられるものだったのでしょうか?
180:デフォルトの名無しさん
19/08/14 21:53:50.90 xRZNaRgT.net
いや、もうc言語とかいいじゃん、 c++使おうよ
配列で悩むのめんどくさくね?
配列のサイズ渡せないとか欠陥だからマジで
181:デフォルトの名無しさん
19/08/15 06:20:44.75 KtlbsHo8.net
>>176
どうせメタプログラミングもまともに出来ない雑魚だろ?
>>178
vectorやarrayじゃないと渡せないと思ってる?
182:デフォルトの名無しさん
19/08/15 07:46:25.74 xtiqLszO.net
>>179
じゃあ、共通的なやり方で動的配列のサイズ渡してくださいよ
どうやるんですか?
183:デフォルトの名無しさん
19/08/15 08:00:09.50 KtlbsHo8.net
>>180
お前わざと条件増やしたろ?
184:デフォルトの名無しさん
19/08/15 23:28:39.14 /raW50Q0.net
メタプロなんてできない方がかえって生産性あがるわ。
カスが使うと無駄にモジュラリティーの低いもの作るだけ。
185:
19/08/16 15:30:12.59 s6h04g1l.net
>>182
貴重なお言葉恐悦至極に存じます、メタプロとかは私は一生理解できないと思っていますが、それでもいい、というお言葉ですよね…
186:デフォルトの名無しさん
19/08/16 17:52:44.76 WXGx/ZZ4.net
>>182
> 「カスが使うと」無駄にモジュラリティーの低いもの作るだけ。
よくわかってるじゃないかw
187:デフォルトの名無しさん
19/08/16 18:07:14.43 w6EX52R7.net
つまりksかどうかを判定するにはメタプロさせてみればいい、ってこと?
188:デフォルトの名無しさん
19/08/16 18:08:34.43 JO1Ik9g1.net
十分条件と必要条件でググって
189:デフォルトの名無しさん
19/08/16 22:52:38.68 Y5iyjQTU.net
>>177
何か指摘するとまたイチャモンつけて否定するだけだろ
俺がまともに使えてないと感じた
理由は自分で考えな
190:
19/08/16 23:02:28.12 s6h04g1l.net
>>187
>何か指摘するとまたイチャモンつけて否定するだけだろ
そうでもないと思いますよ…実感では 3% くらいしか使っていないかと
191:デフォルトの名無しさん
19/08/16 23:54:46.13 thOVjQYW.net
>>183
理解の問題じゃなくてセンスの問題だつってんだよバカ。
192:
19/08/17 00:55:09.12 ToRIVhzM.net
>>189
そうですか、でも、それはそれで興味深いですね
センスの問題、ということは非言語領域的テーマだろうか、と推察しますが、
コンピューター言語という極めて形式的=言語的な領域の話にて非言語的概念が語られる、いや、それが最重要であるというところに奥の知れない「恐ろしさ」を予想します
193:デフォルトの名無しさん
19/08/17 02:40:02.84 MepC3sRG.net
(どうもコンパイル時最適化が効くからテンプレートメタプログラミングするって人がいないように思う)
194:デフォルトの名無しさん
19/08/17 09:39:59.02 1UQd730E.net
コンパイル時最適化て、C++の最適化は普通コンパイル時とリンク時だけやろ
195:
19/08/17 11:22:38.89 ToRIVhzM.net
>>192
リンク時に最適化するのですか?単にリンカがリンクするだけだと思っていましたが
196:デフォルトの名無しさん
19/08/17 12:18:18.80 1UQd730E.net
メジャーなコンパイラにはある機能だよ
リンク時最適化でggr
197:デフォルトの名無しさん
19/08/17 14:11:42.12 0hT5zrAG.net
テンプレートのコンパイル時最適化なんてのはマクロ展開的な最適化をしてるだけ。
そんな最適化が必要な部分はもっと慎重に関数化するわ。
ただドヤリたいだけのバカがありがたがってるってのがよくわかる。
198:デフォルトの名無しさん
19/08/17 15:01:36.23 uFx2S1XX.net
マクロと違って型で挙動変えられるのが美味しいのに
199:デフォルトの名無しさん
19/08/17 15:22:51.03 mvKCT7Z2.net
これまで何も考えずにC++で配列を使ってたんですけど
もしかしてC++で配列を使うのってナメられますか?
arrayやvectorなどでないとやはりコードのクオリティが下がることになってしまうのでしょうか?
200:デフォルトの名無しさん
19/08/17 15:52:09.37 BZ3r0cTp.net
newからdeleteまでの間の例外処理に不備がないと自信があるなら生配列で構わん
201:デフォルトの名無しさん
19/08/17 16:56:59.91 kME64/ZP.net
>>197
静的配列なら生配列もありかと思う
静的配列でもarrayのメソッド使いたいとか引数で他の関数等に渡すとかあるならarray
動的配列なら他に理由がない限りvector一択
202:デフォルトの名無しさん
19/08/17 17:14:22.35 WCU4L4CL.net
>>197
生配列とarrayやvectorのメリットデメリットや使い分けを理解せずに何も考えずにarrayやvectorにする方がいいらしいなんて理解の仕方ならクオリティは低いままだよ。
203:デフォルトの名無しさん
19/08/17 18:13:22.13 1UQd730E.net
>>195
その表現もおかしいけどな
テンプレートによってマクロ展開的に生成されたコードにも等しく最適化がかかるだけであって
>>197
コードのクオリティとか良いコードとかより、最終的にどちらがユーザーの利益になるかどうかを考える方が健全だと思うけど
204:デフォルトの名無しさん
19/08/18 00:09:06.82 XCKtcmfj.net
>>201
マクロ展開で実行評価される必要のない部分が削られるって話なんだが
あんまり理解してないでしょ?
まあ別に理解してないならしてないでほとんどの場面で使わなくていいものではあるが。
205:デフォルトの名無しさん
19/08/18 08:44:15.16 vyOg2WJ0.net
>あんまり理解してないでしょ?
こっちの台詞だよ
必要とされたときに初めて実体化されるの
必要ないのに全ての型全ての組み合わせ用意してから削ってると思ってたのか
206:デフォルトの名無しさん
19/08/18 09:58:09.36 S9bN8HAf.net
>>197
「配列 キャッシュ効率」で調べると次のようなものが出てくる
平たく言うと「配列をキャッシュに乗せる」
プログラミング :: 高速なプログラムを書く為に :: メモリ
URLリンク(myoga.web.fc2.com)
Processingで見るプログラミングスタイル七変化 - Qiita
URLリンク(qiita.com)
プログラムを高速化する話
URLリンク(www.slideshare.net)
207:デフォルトの名無しさん
19/08/18 12:05:15.42 XCKtcmfj.net
>>203
やっぱ変数評価の問題とマクロの関係を全く理解してないんだな。
>>196
そういう型マッチングシステムに依存しまくったものの危険性を全く理解してないのが
問題なんだよ。
SFINEとか型マッチングシステムのデバッグしずらいものに頼る問題を
全く意識していない輩が多すぎる。
208:デフォルトの名無しさん
19/08/18 12:24:08.36 vyOg2WJ0.net
変数(というよりテンプレート実引数)を特殊化なりオーバーロードなりで評価した結果コードが生成されない(テンプレートが実体化されない)のは最適化でも何でもない
209:デフォルトの名無しさん
19/08/18 12:27:17.01 vyOg2WJ0.net
ただし、よくわかりもせずにテンプレートを持て囃したりC++歴数年でテンプレートに首突っ込む(しかも生産性ガン無視で)初心者が増えたのは俺も問題だと思う
210:デフォルトの名無しさん
19/08/18 12:37:50.86 AmZy196G.net
でもテンプレート便利じゃん
211:デフォルトの名無しさん
19/08/18 12:52:38.69 rJ9LPM9I.net
>>205
君の用語の使い方が独特で、君の思ってることを読み取れるエスパーは少ないって話だと思うよ。
マクロ展開の「実行評価」って何なの?
具体的な問題を挙げずに危険とかいうのは単なるFUDってやつじゃないの?
理解させるために言葉を工夫するつもりが無いなら黙ってくれていい。
212:デフォルトの名無しさん
19/08/18 18:15:25.68 XCKtcmfj.net
>>209
理解してないならそういえばいい。
とりあえずcommon-lispでも勉強することをオススメする。
少しは見識が広がると思うよ。
213:デフォルトの名無しさん
19/08/18 22:22:43.25 4oEGaRbg.net
>>210
common lispで実行評価って、evaluationのことを言いたいのだろうか?それなら「評価」と訳されると思うけど、実行評価はググっても見当たらない。PDCAの用語と混同してるのではないかと思えてしまう。
214:デフォルトの名無しさん
19/08/18 23:03:24.76 Onid3Fuw.net
lispがでてくるならこれはもう defmacro しかないんじゃないか?
215:デフォルトの名無しさん
19/08/18 23:06:53.30 8LEpKI7v.net
用語でもめるくらいならサンプルコードでやれ
216:デフォルトの名無しさん
19/08/19 01:57:01.62 DiXQVhta.net
そやっ
common lisp言うたら相手びびるはずやっ
217:デフォルトの名無しさん
19/08/19 11:27:33.54 icNxZHqv.net
まずはダイナミックとスタティックの違いがある
静的なものは未来永劫不動なので、一度作ったら未来でも一切変わらない
動的なものは「未来は不定である」「未来は誰にも分からない」という哲学あるいは神学から作られたので、未来に挙動が変わる
決定論的な未来の世界観では一度作ったらそれきり、静的なものが出来上がる
ここでいう決定は本当に神学で、全知全能の神を指している
未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論
今分かることは動かす前に全部決め打ちすりゃーいい、ってのが静的だ
218:
19/08/19 18:55:20.55 D6AI5dRa.net
>>215
>未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論
ラプラスの悪魔、という語句をご存知ですか?西洋人ですら「未来の事柄をあらかじめ」予測することはできない、と観念しているようですよ…
219:入門
19/08/19 20:35:59.98 aCo9z6Zb.net
色んなサイトを見てC言
220:語の文法を学習中なのですが構造体の自己参照のやり方がどうも分かりません。 かんたんな短いサンプルコードを使って教えてほしいです よろしくお願い致します😪
221:蟻人間
19/08/19 20:40:39.17 GYeBbzEk.net
構造体Aが内部に構造体Aを持つとすると、Aは無限の構造的ループを持つことになる。これはあり得ない。
自己参照するなら、Aのポインタを使わないといけない。
typedef struct A
{
struct A *next;
int value;
} A;
こんな感じになる。ポインタが分かっているなら、
A *a = (A *)calloc(1, sizeof(A));
a->next = NULL;
a->value = 666;
...
この変数aにさらに追加するなら、
A *b = (A *)calloc(1, sizeof(A));
a->next = b;
...
問題は破棄だが、自己参照をたどっていってすべてのAの実体に対して、
freeを呼ばないといけない。
222:蟻人間
19/08/19 20:48:42.67 GYeBbzEk.net
ただし、同じ実体に対して2回free関数を呼ぶことはできない。
また、解放した実体のメンバーは参照することができない。
参照すると、不正読み込みでプログラムが異常終了するかもしれない。
ということでパズルのように解放方法のアルゴリズムを考案しないといけない。
C言語というのは、そういうややこしさをはらんでいる。
223:蟻人間
19/08/19 20:56:19.12 GYeBbzEk.net
1個追加したいときに、このようなコードをいちいち書くのは大変なので、
普通は「1個追加する」という動作を行う関数を用意する。
void add(A *a, int value)
{
A *b = (A *)calloc(1, sizeof(A));
b->next = NULL;
b->value = value;
a->next = b;
}
224:デフォルトの名無しさん
19/08/19 21:05:52.16 thJnfNrr.net
テンプレートの話題でlispの話題ならマクロの話ってピンとくるもんだと思ったが
結構バカが多いんだな。
225:デフォルトの名無しさん
19/08/19 22:08:18.21 mpyM2QmS.net
バカはお前だ
226:入門
19/08/19 22:29:52.38 OunjwQY3.net
>>218
かなりコンパクトに纏めていただきありがとうございます
ただまだcallocとポインタ型のキャストがいまいち分からなくて😪
すいません
227:さまよえる蟻人間
19/08/19 22:45:30.60 5pda5jNo.net
calloc(1, sizeof(A))は、1*sizeof(A)バイトのメモリーブロックを確保し、ブロックをゼロでクリアする。そして先頭アドレスとしてvoid*型を返す。リファレンスをちゃんと読もう。全部書いてある。
228:デフォルトの名無しさん
19/08/20 13:31:20.80 iQfxCe91.net
c++でanimal, dog, catなどのクラスを作ってオブジェクト指向の勉強してます.
dogとcatはanimalを継承するよくある例です.
適当にa[]という配列を切って,a[0]はdogのクラスでa[1]はcatのクラスで…
というようにしたいのですが,この配列a[]の型やaのクラスを指定するやり方が
分かりません.
最終的にはa[i].barkというようなことをやりたいです.
よくある質問だと思うのですが,適切な検索ワードが分からず困っています.
どうやったら良いかor適切なキーワードを教えてください.
229:デフォルトの名無しさん
19/08/20 13:45:18.40 XxGMpj+X.net
animalの配列にdog, catをアップキャストしてぶち込む
animal, dog, catのunionを作り、そのunionの配列を作る
230:デフォルトの名無しさん
19/08/20 13:52:03.45 XxGMpj+X.net
2つ目は違ったから忘れてくれ
231:デフォルトの名無しさん
19/08/20 13:58:30.55 J42ZId0L.net
>>226
さっぱり分かりませんがありがとうございます.これでgoogle先生に質問できます.
232:さまよえる蟻人間
19/08/20 14:40:59.88 UPm4IEm3.net
ポインタの配列にしてポリモーフィズム。
233:sage
19/08/20 15:46:52.82 5Gd7p9P4.net
>>229
こんな感じですか?
push_backでエラーが出てコンパイル出来ませんが…
std::vector<std::unique_ptr<Animal>> a;
a.reserve(2);
a.push_back(std::make_unique<Dog>());
a.push_back(std::make_unique<Cat>());
234:デフォルトの名無しさん
19/08/20 15:47:51.55 KtaU4TpY.net
基底クラスの実体配列じゃ多分無理で
基底クラスのポインタ配列しかないと思うわー
235:225
19/08/20 16:04:10.66 5Gd7p9P4.net
ポインタの配列を作ったつもりだったんですが違うんですね....
誰か簡単なコード書いてくれませんか?
236:デフォルトの名無しさん
19/08/20 16:32:36.95 ixrUSoxU.net
c++17ならstd::variantが使えそうだけどね。
237:デフォルトの名無しさん
19/08/20 18:41:29.45 XxGMpj+X.net
>>232
std::unique_ptrだからうまくいかない
生ポインタにするだけで通る
238:デフォルトの名無しさん
19/08/20 19:03:13.66 KUiZK6p2.net
>>230
普通にとおるような
239:デフォルトの名無しさん
19/08/20 19:04:40.28 KUiZK6p2.net
URLリンク(wandbox.org)
240:デフォルトの名無しさん
19/08/20 19:05:34.46 PwBGX6fG.net
>>230
VS2019だと問題なくコンパイルできるけど。
Animalをpublic継承していないとかだったりして。
241:デフォルトの名無しさん
19/08/20 19:54:26.69 vf53Ia55.net
>>230
> push_backでエラーが出てコンパイル出来ませんが…
なぜエラーメッセージを貼らないの?
242:デフォルトの名無しさん
19/08/20 20:23:10.77 QkieET4w.net
つか、エラー貼るまでもないだろ
std::unique_ptr
コイツはmovしかできないから、コンテナに格納できる条件に合わない。
スマートポインタをコンテナに入れたかったらsharedポインタを使う
常識じゃなかったのか
243:デフォルトの名無しさん
19/08/20 20:36:33.84 rT2paKVb.net
unique_ptrはコンテナに格納可能という俺の常識とは違うようだな
244:デフォルトの名無しさん
19/08/20 21:46:43.07 vf53Ia55.net
>>239
>>235-237でエラーなくコンパイルできるのに何を言ってるんだよw
245:デフォルトの名無しさん
19/08/20 23:47:14.68 ehCs1rOT.net
>>239
std::unique_ptrはコンテナに入れられるぞ
std:auto_ptrをコンテナに入れた場合に起きるCOAPという問題は起きないんだぜ
246:230
19/08/21 20:14:24.97 tFOQQ8LH.net
質問者です。すいません。
コンストラクタのエラーでした。
無事コンパイルできました。
ありがとうございました。
247:デフォルトの名無しさん
19/08/26 16:42:54.84 LypwkFGf.net
人の書いたプログラム読んでるですが,#includeとclassの定義の間に入ってるclassの意味が分かりません.
下の例で言うとHogeのところです.
これは何ですか?
#include <string>
class Hoge;
class Foo : public Bar
{
protected:
...
248:デフォルトの名無しさん
19/08/26 16:47:52.57 goJw/KBc.net
前方宣言
249:デフォルトの名無しさん
19/08/26 17:01:32.76 LypwkFGf.net
ありがとうございます.ググって勉強しまう.
250:デフォルトの名無しさん
19/08/26 19:18:54.68 YVFaeJ51.net
class TA{
static public int a;
}
があって、
int b = TA::a ;
のようにするのと、
TA A;
int b = A.a;
のようにするのは、bに読み込む速度は違うんですかね。
251:さまよえる蟻人間
19/08/26 19:30:09.75 doK8kIo2.net
>>247
後者はAの実体を作るから遅いかも。まあ多分、最適化で変わらないと思う。
252:デフォルトの名無しさん
19/09/08 17:10:16.42 eAq/jxOF.net
wavファイルなどの外部の別ファイルを読み込んで使いたいのですが、どのようにやればいいのでしょうか…?
バイナリデータにして読み込む、みたいな方法を見かけたのですがファイルのサイズが大きすぎるとヒープの領域を使い果たしました的なエラーが出てしまって行き詰まっています
253:デフォルトの名無しさん
19/09/08 17:38:17.62 46Wp6heU.net
mallocを使う
まずは音ではなく画像、bmp読み込みから練習する
数百MBの音声ファイルよか数MBのbmp画像読み込みの方が気がラク
254:デフォルトの名無しさん
19/09/08 19:18:59.59 MtO5EQx1.net
>>249
一度に全データを読み込むのでなく、固定サイズのバッファに、必要な分だけ少しずつ読み込めばいい。
読み込み済みデータを再生するスレッドとは別に、もう一つのスレッドで再生にあわせてデータを先読みで読み込んでいけばいい。途切れなく再生するにはリングバッファとかを使う。
255:デフォルトの名無しさん
19/09/08 21:28:55.65 eAq/jxOF.net
malloc・リングバッファ、詳しく調べて挑戦してみようと思います!
あとスレッドの概念もちゃんと理解できてない気がするのでそこも勉強しようと思います。
ありがとうございます!
256:デフォルトの名無しさん
19/09/09 10:46:06.36 QoBVzNSJ.net
>ファイルのサイズが大きすぎると
積んでるメモリぐらいでかいファイルなのかな?
どういった読み込みで失敗してるんだろう?
257:デフォルトの名無しさん
19/09/09 10:54:14.51 MF4WMKe5.net
> ヒープの領域を使い果たしました的なエラー
これからまず連想したのは、VCで巨大ファイルをリソース化しようとしたときに出るコンパイルエラーだな
どのタイミングで出たエラーか書いてないからわからんけど
258:デフォルトの名無しさん
19/09/09 11:17:30.78 QoBVzNSJ.net
実行ファイル中にリソースとして埋め込み
リソースからバイナリ列を引き出して(読み出して)
再生コードに渡す
音声を実行ファイルに埋め込みたかったのかな?
259:249
19/09/09 13:17:02.59 4LFzbPos.net
もう少し詳しく書くと、とあるプラグインを作りたくて、それ用のプロジェクトファイルのジェネレーターとVisual studio 2019 を使っています。
そのジェネレーターを通してwavファイルをバイナリデータ化しているのですが、wavファイルのサイズが一定以上になると「error C1060 ヒープの領域を使い果たしました」っていうエラーが出てビルドが通らない状態です。
10MBぐらいのwavファイルだと普通に通って、18MBぐらいになるとエラーが出ます。
260:デフォルトの名無しさん
19/09/09 13:19:41.05 By40c52C.net
ソース貼れ
261:デフォルトの名無しさん
19/09/09 13:27:07.20 8EKyQA8Q.net
企業秘密な秘伝のタレかもしれません
262:デフォルトの名無しさん
19/09/09 13:27:52.11 FLVXg6p/.net
タレこめ
263:デフォルトの名無しさん
19/09/09 14:06:32.05 QoBVzNSJ.net
プラグイン本体にバイナリデータ埋めまず、エンドユーザーにはプラグインと音声ファイルを配布
音声ファイルのパスだけうまく帳尻あわせてファイル開いて、メモリ確保して、ファイル読んで、etc
って設計するかな
264:デフォルトの名無しさん
19/09/09 15:35:47.49 4OXc+RTk.net
>>256
そのジェネレータとやらがエラー吐いたという話ならスレ違いだろう。
265:デフォルトの名無しさん
19/09/09 16:07:02.52 aCapJVZa.net
>>256
その秘伝のジェネレーターとやらがどんなコード吐いてるのか見当もつかないがとりあえず
URLリンク(docs.microsoft.com)
の対策を片っ端からやればいいんじゃね?
266:デフォルトの名無しさん
19/09/12 12:49:41.16 J5GPib5U.net
スレチのような気もするんですが,ここが一番適切な回答がありそうなんで,質問させて下さい.
iPadでc++のコード(複数のファイルでつくられている)を読みたいんですが便利なビューワーありますか?
関数名やクラス名クリックしたら定義してるところまでジャンプしてくれるようなやつを探してます.
emacsで言うetagsみたいな機能のことです.
267:デフォルトの名無しさん
19/09/12 13:17:15.41 FruSebPm.net
「ipad emacs」 でぐぐったら iPad用の emacs そのものがあるようだけど
268:263
19/09/12 13:56:43.03 Ng4JTS7f.net
>>264
後出しですいません.キーボードは使わないのでemacsはないです.あと,iPadのemacsはけっこうがっかりだった記憶が….
タッチでジャンプできると嬉しいのですが….
便利そうなエディタは何個かあるみたいなんですが,ジャンプ機能がないんですよね.
269:225
19/09/17 22:40:09.17 iQJ8U52u.net
以前 >>225 で質問させてもらったものです。
>>230 で書いたようなプログラムを作ってるんですが、
DogやCatだけでループを回したいんですがどうしたら良いですか?
Dogだけの配列とCatだけの配列作ってから、Animalのポインタでそれらの配列を
参照すれば出来るのかなと思ってるんですが、考え方はあってますか?
270:デフォルトの名無しさん
19/09/17 22:42:37.60 cgXPZZnO.net
MZうyちゃーーーん♪こんなとこにいたのかw
271:蟻人間
19/09/17 22:52:04.49 vrvr50SL.net
>>266
ポリモーフィズムがうまくできていればAnimalのポインタの配列にDogやCatのポインタを突っ込めるはず。
272:デフォルトの名無しさん
19/09/17 22:54:48.57 cgXPZZnO.net
>>268
んでサウンドは使えるようになったか?w
273:デフォルトの名無しさん
19/09/17 23:00:14.32 iQJ8U52u.net
>>268
ポインタ突っ込む方法を具体的に教えてくれませんか?
ポインタがよく分からないです…。
274:蟻人間
19/09/17 23:04:06.26 vrvr50SL.net
Animal *array[10] = {NULL};
array[0] = new Cat(2, 3);
array[0]->walk();
delete array[0];
275:デフォルトの名無しさん
19/09/17 23:08:52.42 4Zel//hf.net
>>270
一旦オブジェクト指向のことは忘れてポインタを先にしっかり学んできた方が近道かもよ。ここで小さなサンプル教えてもらって真似しても近い将来嵌まって行き詰まりそう。
オブジェクト指向の勉強が目的なら他の言語で始めた方が余計なところで躓かないと思う。
276:デフォルトの名無しさん
19/09/17 23:08:55.80 cgXPZZnO.net
DIM MZUY(0)
277:デフォルトの名無しさん
19/09/17 23:10:14.52 cgXPZZnO.net
>>272
MZうyちゃーーーん♪はBASICで充分w
278:デフォルトの名無しさん
19/09/17 23:12:50.50 iQJ8U52u.net
DogやCatのインスタンスも複数あって、
Dog だけでループとかCatだけでループとかしたいんです。
animalだけでループするなら書いていただいたので良さそうなんですが。
279:蟻人間
19/09/17 23:15:14.33 vrvr50SL.net
>>275
目標の設定と要件定義が先
280:デフォルトの名無しさん
19/09/17 23:18:18.48 f5N3Fp86.net
目標の設定と要件定義が先だってよ(ゲラゲラ
281:デフォルトの名無しさん
19/09/17 23:19:18.73 Ps8IF7R/.net
DogやCatに自身のタイプを返す機能をつけるか、typeidを使ってループをフィルタすればいい
282:蟻人間
19/09/17 23:20:21.52 vrvr50SL.net
dynamic_castでダウンキャスト失敗すればNULLが買える。一個800円。
283:デフォルトの名無しさん
19/09/17 23:20:27.62 f5N3Fp86.net
それで完成品は100年後か?
284:デフォルトの名無しさん
19/09/17 23:20:52.26 iQJ8U52u.net
初心者スレだし、解答欲しいです。
285:デフォルトの名無しさん
19/09/17 23:21:58.70 f5N3Fp86.net
バカのうんちくは回しコピペと同じw
286:デフォルトの名無しさん
19/09/17 23:22:25.46 iQJ8U52u.net
>>278
何言ってるか不明ですがキーワードありがとうございます。
とりあえずググります。
287:デフォルトの名無しさん
19/09/17 23:23:03.14 Ps8IF7R/.net
for(auto a : animals){
if(typeid(a) == typeid(Dog*){
}
}
288:デフォルトの名無しさん
2019/0
289:9/17(火) 23:23:37.07 ID:f5N3Fp86.net
290:蟻人間
19/09/17 23:24:00.17 vrvr50SL.net
dynamic_cast<Cat>(array[0]) == NULLだったらarray[0]はネコではない
291:デフォルトの名無しさん
19/09/17 23:24:31.61 f5N3Fp86.net
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
||. =ねらー三原則= ||
|| 1.助けない ||
|| 2.教えない 。 ∧_∧ いいですね。
|| 3.関わらない\ (゚Д゚,,)
||________⊂⊂ |
∧ ∧ ∧ ∧ ∧ ∧ | ̄ ̄ ̄ ̄|
( ∧ ∧ ( ∧ ∧ ( ∧ ∧ | |
~(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ̄ ̄ ̄
~(_( ∧ ∧_( ∧ ∧_( ∧ ∧ は~い、先生。
~(_( ,,)~(_( ,,)~(_( ,,)
~(___ノ ~(___ノ ~(___ノ
292:蟻人間
19/09/17 23:24:40.10 vrvr50SL.net
dynamic_cast<Cat*>(array[0]) == NULLだったらarray[0]はネコではない
293:デフォルトの名無しさん
19/09/17 23:27:47.60 iQJ8U52u.net
>>284
理解しました。
そのif文つかうとOpenMP使うときにロードが均等に分散されないので、
dogだけの配列欲しいですね。
294:デフォルトの名無しさん
19/09/17 23:41:03.11 4Zel//hf.net
>>289
それなら条件に該当するエントリのポインタを抜き出した配列を作ってループすればいいんじゃないか?
ループ内の処理が並列化する価値があるくらいコストかかるなら、ポインタを抽出してコピーするコストは無視できるかと思われる。
295:デフォルトの名無しさん
19/09/18 00:08:00.90 yNiXaOMn.net
>>290
ありがとうございます。
それやってみます。
296:デフォルトの名無しさん
19/09/18 12:06:57.92 L8SHYgAR.net
>>266
C#スレでマルチしてないかお前
297:デフォルトの名無しさん
19/09/18 20:26:23.65 yNiXaOMn.net
>>292
してないやでー
298:デフォルトの名無しさん
19/09/22 11:43:54.30 LQCFANDg.net
> Animal *array[10] = {NULL};
20年以上前に配列要素を一つ以上書かないといけない処理系があったな
タイムスリップでもしてきたか
299:デフォルトの名無しさん
19/09/22 11:53:00.80 y42gsAly.net
Animal *array[10] = {p0, p1, p2};
だとすると
array[0] ~ array[2] は p0~p2 になるが
array[3] 以降は全部 NULL で FA?
300:デフォルトの名無しさん
19/09/22 16:44:01.11 dRs63Jnx.net
>>295
引数の無いコンストラクター呼ばれる
301:デフォルトの名無しさん
19/09/22 16:45:05.27 zrmuC8G0.net
char *array[10] = {p0, p1, p2};
だとすると
array[0] ~ array[2] は p0~p2 になるが
array[3] 以降は全部 NULL で FA?
302:デフォルトの名無しさん
19/09/22 17:27:15.07 kTa1SMwh.net
>>296
ポインタだぞ?
303:デフォルトの名無しさん
19/09/22 18:52:04.08 9/tlWbjv.net
>>294
Cだと今でもダメだから、それ見たんじゃないの?
304:デフォルトの名無しさん
19/09/22 19:39:28.11 KmeF3kAh.net
>>298
ポンタってローソンのカード?
305:デフォルトの名無しさん
19/10/01 17:46:09.39 yQHk6Pyq.net
Windows の普通のソフトのインストーラは Program Files 以下に適当なフォルダを作ってそこにファイルをまとめて入れるけど、
コマンドラインアプリの場合ってどうしてる?
GUI アプリと同じようにフォルダに突っ込んで環境変数 PATH を設定するってのが標準的なやり方だと思うけど、
そういうのが増えてくると PATH が長大になって嫌な感じなので、なんかうまい方法ってないもんかな?
C/C++ とは直接の関係がなくてスマソ。 どのスレがベストかわからんかったもんで。
306:デフォルトの名無しさん
19/10/01 19:01:46.51 HsilaFth.net
環境変数なんて入れずに叩くときにフルパス入れりゃいいだけでは?
307:デフォルトの名無しさん
19/10/01 19:48:41.05 yQHk6Pyq.net
>>302
フルパスを前提にすると連携しづらい場合が出てくるんよ。
「このバッチファイルを実行するにはこのソフトとこのソフトを入れてね!」
みたいなことをやろうとすると、想定してたのと違うフォルダにインストールしてるだけで破綻してしまう。
32bit のアプリケーションって 32bit 版の Windows だと Program Files に入るけど
64bit 版の Windows だと Program Files (x86) 入るようにするのが基本的な作法じゃん?
それだけでも違ってしまうけど
システムドライブとは違うドライブにアプリケーションをインストールしたりする運用をやってる人は意外にいるので、
インストール先を選択させずに固定するってのも縛りが強いかなぁと思うし。
どこにインストールしてでも同じように使えるようにするには PATH くらいしか選択肢がなくなる。
でも嫌。 っていう話。
308:デフォルトの名無しさん
19/10/01 20:00:47.20 gawiB1ps.net
20年以上前からある問題だな
Windowsではその辺は未だにグダグダだと認識している
309:デフォルトの名無しさん
19/10/01 22:13:00.30 sghBprd5.net
>>303
設定でその外部アプリへのパス指定できるようにすれば?
インストール先固定、環境変数追加、レジストリ追加よりユーザーに指定させるほうが個人的には好き
というかこの三種のような方法をとるアプリはそもそもインストールを躊躇する
310:デフォルトの名無しさん
19/10/01 23:27:11.07 D6lr/hhZ.net
コマンドラインアプリでコンソールから起動 バッチファイルから呼び出し etc
実行ファイルの検索順位に依存しまくるからにゃぁ
311:デフォルトの名無しさん
19/10/01 23:54:08.52 yQHk6Pyq.net
app paths をコマンドラインでも適用してくれよって思ってる。
312:デフォルトの名無しさん
19/10/02 12:47:26.92 55+aQRnY.net
>>301 >>303
C:\bin
313:デフォルトの名無しさん
19/10/02 12:49:56.03 55+aQRnY.net
> 32bit のアプリケーションって 32bit 版の Windows だと Program Files に入るけど
> 64bit 版の Windows だと Program Files (x86) 入るようにするのが基本的な作法じゃん?
> それだけでも違ってしまうけど
違わない
32bitアプリケーションからは
Program Filesしか見えない
実際はProgram Files (x86)をアクセスしてる訳だが
そんなことは32bitアプリケーション側は知らなくて良いし知らない方が良い
314:デフォルトの名無しさん
19/10/16 18:22:59 imXCztCz.net
class A{
public:
B b
}
class B{
…
}
の時、Aのコンストラクタなどで b = new B; とすると、
このbはAのクラス内で使えますが、Aのデストラクタが走る時に、
bも一緒に消えるのでしょうか。
それとも別途に delete b が必要なのでしょうか。
315:
19/10/16 18:24:40 uv22jov9.net
Aのデストラクタにdelete bを書く
316:デフォルトの名無しさん
19/10/16 18:27:03 imXCztCz.net
一緒に消えないのですか。どうもありがとうございました。
317:
19/10/16 18:36:34 d1R3XcHH.net
>>310-312
A のコンストラクタ内で例外が送出されると delete b が実行されない可能性があるのでなるべくならスマートポインタを使うのが望ましいし楽。
318:
19/10/16 18:43:49 6mvmnwRf.net
B b; と定義したなら、b = new B;が不要で、Aのデストラクタ実行時にbも一緒に消える。
B* b; と定義したなら >>311 だが、わざわざポインタで定義するのは
コピーコンストラクタ等々自前で定義しなきゃならんのでお勧めしない。
スマポならAのデストラクタ実行時にbも一緒に消えるけど、
shared_ptrはコピー時に共有されてしまうし、unique_ptrはコピーできなくなる。