20/06/23 01:32:00.34 UY2AjBBL.net
以下のコードは比較関数をSTLのlistに渡す為のものなのですが
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか?
typedef SubType* LPSUBTYPE;
template<> inline bool greater<LPSUBTYPE>::operator()
(const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const {
…
}
142:デフォルトの名無しさん
20/06/23 09:26:35 RMSfHJVB.net
>>141
エラーメッセージを読んで問題点を解決するように書き直すといいよ。
list に比較関数は渡せないと思うので前提が間違ってそうな気もする。
143:デフォルトの名無しさん
20/06/29 08:08:09.53 PYBXxpGI.net
VC++についての質問になってしまうのですが、C#のようにソースファイルをリンクとして追加することは出来ないのでしょうか?
144:デフォルトの名無しさん
20/06/29 18:23:34.98 gWW+3u18.net
C#と違って「既存の項目」で追加したものに関してはコピーされずに参照扱いだよ
作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど
145:デフォルトの名無しさん
20/09/08 02:57:29 ZBc9FXfY.net
何で構造体のchar配列は直接値が代入できず
strcpyを使う必要があるのでしょうか?
146:デフォルトの名無しさん
20/09/08 03:20:04.77 jacy6RM2.net
できるよ
struct A {
int x;
char b[4];
} a = {0, 1, 2, 3, 4};
147:はちみつ餃子
20/09/08 05:15:54.57 QZgDAT7o.net
>>146
それは代入ではなくて初期化
148:デフォルトの名無しさん
20/09/08 05:56:11.78 ZBc9FXfY.net
typedef struct {
char str[32];
}A;
int main(}{
A a;
a.str="aaa";
}
これができないってことです
言葉足らずですいません
149:デフォルトの名無しさん
20/09/08 08:44:00.12 h4K4tlm9.net
int main(void) {
int arr[5];
arr = 3;
}
ができないのと同じ理由です
150:デフォルトの名無しさん
20/09/08 09:53:15.41 zoI9JNor.net
かわいいw
151:デフォルトの名無しさん
20/09/08 10:55:42 0vfIbeP0.net
ちょっと忘れたから、推測だけど、
a.str="aaa";
"aaa" を右辺で使うと、先頭要素のアドレスに変換されるとか?
例えば、4バイトのサイズで、10~13 アドレスに存在する場合に、10が代入されるとか
char str[32];
一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか
152:デフォルトの名無しさん
20/09/08 11:16:05 h4K4tlm9.net
意図してるだろうことを無理してやるなら
str[0] = 'a';
str[1] = 'a';
str[2] = 'a';
str[3] = '\0';
でできる.そしてこれをするためにstrcopyがある
153:デフォルトの名無しさん
20/09/08 15:36:44.61 JkCXGknl.net
>>148
型が違うし
154:デフォルトの名無しさん
20/09/08 15:57:15.69 SNM207t1.net
出来ない訳じゃないんだよな
typedef struct {
char b[4];
} A;
int main(void) {
A b = {1, 2, 3, 4};
A a;
a = b; // ok
a.b = b.b; // bad
return 0;
}
自分で for で配列要素代入すれば良い訳で
面倒だから memcpy や strcpy 使ってるだけ
155:デフォルトの名無しさん
20/09/08 16:02:13.68 JkCXGknl.net
>何で構造体のchar配列は直接値が代入できず
構造体のchar配列だけじゃなくて
ただのchar配列でもダメだろ
宣言と同時に代入してるときはたまたま出来るだけ
int main() {
char a[4] = "abc"; // OK
char b[4];
b = "abc"; // BAD
return 0;
}
156:デフォルトの名無しさん
20/09/09 20:41:42.30 s+S5qxFe.net
>char a[4] = "abc"; // OK
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート
たまたま、ってw
157:デフォルトの名無しさん
20/09/09 23:49:08.55 N/YnHGom.net
はじめたころは、こういうことにいちいちひっかかってたな…
わかっちゃえば、慣れちゃえばどーってことないんだけど
158:デフォルトの名無しさん
20/09/10 00:06:01.62 Qspm/kAl.net
同じようでいて、初期化と代入では見た目の作用がことなることがあるね
159:デフォルトの名無しさん
20/09/10 00:07:00.73 Qspm/kAl.net
見た目「と」作用が
160:デフォルトの名無しさん
20/09/10 15:36:27 rLZBXCmM.net
a も b も代入禁止だ
161:デフォルトの名無しさん
20/09/19 09:19:26.77 z/ngkL1p.net
>>157
常に初心に返ることで新たにわかることもある
162:デフォルトの名無しさん
20/09/21 06:30:22.99 GP+Uv9qA.net
C#ですいません
usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて
イマイチ言ってる意味がわからないので
簡単なコードを用いてnamespaceを使う意味を教えて欲しいです
163:デフォルトの名無しさん
20/09/21 10:35:12.49 M8W5JifW.net
文字だけじゃないコード・・・
164:デフォルトの名無しさん
20/09/21 11:38:59.68 xNmUS8x8.net
寿限無名予防以外の目的?
165:デフォルトの名無しさん
20/09/21 11:59:08.18 IzAwgxqY.net
>>162
C#よくわかってないけど
こういうことが知りたいの?
URLリンク(ideone.com)
166:デフォルトの名無しさん
20/09/21 21:53:00.21 GP+Uv9qA.net
>>165
すいません、そういうことです。
usingについてはおかげさまで意味が分かりました。ありがとうございます。
namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、
どっからどの部分までが名前空間なのでしょうか
167:デフォルトの名無しさん
20/09/21 23:03:56.25 IzAwgxqY.net
>>166
namespaceがなかったら
たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで
さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、
自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する
(重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない)
みたいな事態が発生してしまう
さっきの例だと同名のメソッド(Console.WriteLine)を定義してても
System名前空間とMyNS名前空間で分けたからコンパイルが通る
System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの
MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの
namespace Hoge {
// {}内はHoge名前空間に属する
}
168:デフォルトの名無しさん
20/09/22 06:36:29.84 ZtayyY2i.net
完全にC++の感覚でしか説明できんけど、
あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、
ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い
さらに>>164の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る
ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない)
こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと
あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利
169:デフォルトの名無しさん
20/09/22 13:09:23.63 iGBGeTHm.net
名前空間を使うと検索性が最悪になる
(別の名前空間の同一名称が引っ掛かりまくる)
みんなどう対処しているんだろう
170:デフォルトの名無しさん
20/09/22 17:08:47.15 QYfnOwKH.net
>>169
using namespaceするのが問題じゃない?
171:デフォルトの名無しさん
20/09/22 17:49:49.66 ZtayyY2i.net
いやusingに限らず、例えば>>168で言ったライブラリ作る側(名前空間内で作業する側)はいちいちhoge内なのにhoge::とか書かんでしょ
確かに検索で困ることはたまにある・・
172:デフォルトの名無しさん
20/09/22 19:24:25.17 Xh0fS725.net
namespace で絞り込んで、識別名をハイライトして、あとは気合
173:デフォルトの名無しさん
20/10/20 13:37:38.41 Mso39Itu.net
C++とVisual C++の違いについてです。
C++はプログラミング言語であり、
VC++は統合開発環境であるという説明があります。
でも私にはVC++がC++++のように見えます。
VC++はC++の文法に新たな流儀を付け加えるか置き換えていて
言語そのものの使用を若干変えているように見えます。
C++のキーワードが別のものに置き換わっていたりするからです。
そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。
この理解は正しいでしょうか。
174:デフォルトの名無しさん
20/10/20 13:38:19.99 Mso39Itu.net
使用改め仕様
175:デフォルトの名無しさん
20/10/20 14:39:40.58 C+6cO9mm.net
多少違うのは
#pragma くらいだろ
勝手に仕様なんて変えない
統合環境とか API とかはもちろん関係無い話
176:デフォルトの名無しさん
20/10/20 20:36:08.28 3YoHPXFg.net
IDEはVisual Studio
VC++はMSのC++商品名
C++/CLIとかを混同してね?
これはC++を独自拡張したものだよ
177:デフォルトの名無しさん
20/10/20 22:21:46.71 qSDH25Or.net
__declspec(dllimport)とかアホみたいに書かされたあの時代のmsvc拡張c++のことでしょ
178:デフォルトの名無しさん
20/10/21 11:12:14.17 xBgAWF1Y.net
描かずに済むけどな
179:デフォルトの名無しさん
20/10/21 13:51:50.76 WStrtR1y.net
C++/CLIは拡張ですか?
いくつかの流儀を置き換えていますよね?
ポインタをハンドルと読んだり?
180:デフォルトの名無しさん
20/10/21 14:12:49.21 xLl2qqDk.net
MS拡張にしろC++/CLIにしろ既存のコードの挙動を変えるようなことはしてないんでは?
拡張でいいんじゃね
181:デフォルトの名無しさん
20/10/21 18:58:32.20 VaRlK94m.net
ポインタはポインタとしか言わんよ
ハンドルは
182:デフォルトの名無しさん
20/11/24 23:02:59.67 uO0ONWsd.net
Visual Studio 2019をインストールしました
Windowsスタートボタン→Visual Studio 2019を起動しました
プロジェクト名を入れて下さい→test001
保存フォルダの場所を決めて下さい→Y:\_source\repos
何かのウインドウが開きました(おそらく開発の統合画面?)
さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません
左の縦に、ツールボックスと表示しています
このままでは進まないので、エクスプローラーでreposフォルダの下に
samp01.txtを新しく作りました
何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました
進め方が間違っているように思えますが、samp01.txtに#define...から
描き始めてよいでしょうか?
統合環境が苦手で、フォルダにテキストファイルを作りテキストエディタで
ソースを書いて保存
コマンドラインでコンパイル、エラーがなければリンク...をしてきました
何かの画面には難しそうなソリューションエクスプローラー、その下には
プロパティウインドウが表示されています。
このウインドウにも慣れないといけないので進め方を教えてください
183:デフォルトの名無しさん
20/11/25 07:42:29.85 +VuDDc3z.net
>>182
とりあえずこれに従えばおk
URLリンク(docs.microsoft.com)
184:デフォルトの名無しさん
20/11/25 08:12:43.79 1cagBqIs.net
>>182
俺は、テキストエディタでソースを書いて、c規格で拡張子cppで保存して、
Visual Studioで、
コード無しで続行→
ファイル→開く→フォルダ
で、コンパイルしてますがね。
185:デフォルトの名無しさん
20/11/27 09:48:07.00 sDMv6Edh.net
>>182
ソリューションを作るときに大雑把にどんなもの作るって指定すれば
最低限のファイルができて編集可能な状態になるんじゃないの?
186:デフォルトの名無しさん
20/11/27 15:09:19.88 8PW9KReU.net
ソリューションエクスプローラーのヘッダーファイル、ソースファイルのとこを右クリックで新規選べばまっさらなファイル作れるし
メニューのファイル→追加?(うろ覚え)でも作れる
187:デフォルトの名無しさん
20/12/06 23:34:56.54 TL07p8cG.net
手順書のページのURLありがとうございます。
Microsoft Visual Studio Community 2019
Version 16.8.2を使用中。
テキストで#include<stdio.h>から入力しましたが煮詰まりました。ソースはネットを検索してコピペなので、
コロンやセミコロンの間違いはないと思われます。
#include<stdio.h>
int main( void )
{
printf( "ようこそC(++)言語の世界へ\n" );
return 0;
}
タスクバー?にファイル(F)編集(E)表示(V)Git(G)プロジェクト(P)デバッグ(D)テスト(S)・・・があります。
手順書では[プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。]とあります。
が、ビルドメニューがありません。
プルダウンのデバッグ(D)からデバッグ無しで開始したいですが
デバッグ無しで開始が薄い文字になっており、クリックできません。
統合開発環境って皆さんが使用して使いやすいはずですよね。
何から順番にクリックしていくのかさっぱりわかりません。
手順通りにしようとして「ここをクリック」のところはたいていその「ここ」の項目が画面になくて
ソースを書いてコンパイルすらできない、ありません。ありません状態。
同じバージョンでもメニューの項目が違っていたら次に何をするかお手上げです。
お助け下さい。
188:蟻人間
20/12/06 23:49:56.18 x83Xfz/W.net
>>187
ソリューションを作成した?
ソリューションにソースを追加した?
189:デフォルトの名無しさん
20/12/07 00:14:40.22 MnyC2DM9.net
アドバイスありがとうございます。
ソリューションエクスプローラー フォルダービューを右側に開いています
そこにhello_.cppが表示されています。いま、開いているファイルです。
#includeからreturnまでペーストしています。
ソリューションエクスプローラーでhello_.cppを右クリックしますと[追加]があります。
[追加]->新しいファイル
新しい項目の追加(W)
新しいフォルダー
この3つを表示します。ソリューションエクスプローラーにhello_.cppが表示されているだけでは不足でしょうか
hello_.cppを右クリック新しいファイルを選ぶと名前を入力になりました
aaaと入力するとツールボックスに新しくテキスト入力タブが表示
#includeからreturnまで貼り付けました
デバッグ無しで開始の文字は薄いままです
ビルドメニューはありません
編集や表示、Git、プロジェクトのメニューを色々クリックしています
変わりません…
何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし
全世界のプログラマの人たちも使っているものですし、なんとか
ビルドメニューを出したいです
190:デフォルトの名無しさん
20/12/07 00:18:03.60 MnyC2DM9.net
あちこちクリックしていますと、画面の上に
プロジェクト、ビルド、デバッグの文字が出てきました
ビルド->ソリューションでコード分析を実行を選びます
デバッグ->デバッグ無しで開始は薄い文字でクリックできません
何か手順が不足しているようです
191:蟻人間
20/12/07 00:18:08.82 LcHpzYm6.net
ファイルとフォルダの違い
ソリューションの種類が違う
だろうな
192:デフォルトの名無しさん
20/12/07 00:59:54.04 MnyC2DM9.net
不慣れでごめんなさい
デバッグ無しで開始は薄い文字でクリックできず変わらず
本日はそろそろ寝ます
後は明日、使い方と用語を調べます
193:蟻人間
20/12/07 01:04:11.74 LcHpzYm6.net
初心者は素直にチュートリアルの手順に従ってればいいんだよ。
194:デフォルトの名無しさん
20/12/09 03:22:01.70 WuZTb4kZ.net
濡れちゃうう!
195:デフォルトの名無しさん
20/12/12 02:59:14.21 a7AUwK+L.net
なにからすればいいの
目標がない
196:デフォルトの名無しさん
20/12/12 13:02:07.54 A7m2fOl0.net
「何かしたい」というものが無いならば、しなくてどうぞ。
「何かしたい」というものが有る人は、自分で行動する。
197:はちみつ餃子
20/12/12 13:39:37.52 UUApGKPR.net
質問サイトにある質問に (根拠になる一次資料 (主に仕様書の具体的な項目) と共に) 回答するのを繰り返せば
特定のプログラミング言語に詳しくなることは出来るよ。
それでプログラミングを出来るようになるかどうかはわからんけど。
198:デフォルトの名無しさん
20/12/12 13:47:09.92 k8hTa554.net
「人工知能搭載の人型アンドロイドが作りたい」
という目標を持つ者が
「printfで文字列を表示したい」
という目標を持つのはとてもつらい
199:デフォルトの名無しさん
20/12/12 18:31:18.09 KTyXxWQ0.net
今日は国会図書館に行ってきたわ。
200:デフォルトの名無しさん
20/12/12 18:34:21.54 KTyXxWQ0.net
国会図書館は国会議事堂内に分室があって資料を取り寄せて閲覧できるんですよ。
でも、ほとんど利用実績が無いらしいんですね。
201:デフォルトの名無しさん
20/12/12 19:52:44.57 KTyXxWQ0.net
国会図書館は若い女性と、男性は老人が多かったです。
土曜日だからかもしれません。
資料のコピーは長蛇の列が出来ていました。
あの列で感染するんでしょうね。
女性のメガネ率は8割超えてました。
おそらくドクター持ちでしょうね。
202:デフォルトの名無しさん
21/01/05 14:54:55.04 zOsm6XDhK
自由な働き方を求め10代~20代の登録が拡大。フリーランス登録者約3.4倍に増加。
URLリンク(prtimes.jp)
フリーランス向け報酬即日払いサービス『先払い』申込件数5,000件突破
URLリンク(prtimes.jp)
ITフリーランスの独立支援サービス『テックビズ』&定額制全国住み放題『ADDress』提携開始
URLリンク(prtimes.jp)
リース、フリーランスのためのお部屋探しアプリ「smeta」の正式版をリリース、提携賃貸管理戸数が6万戸を突破
URLリンク(prtimes.jp)
家族50万円・単身30万円を支給、新潟県が「テレワーク・フリーランス移住」で応援金
URLリンク(www.bcnretail.com)
ワーケーション会社員増加中、定額制宿泊サービス「HafH」を実体験
URLリンク(finance.yahoo.co.jp)
「フリーランススタート」の掲載案件数、累計16万件を突破
URLリンク(codezine.jp)
フリーランスエンジニア専門の案件一括検索サイト「フリーランススタート」、
掲載案件数1ヶ月で10,000件増加し、累計掲載案件数16万件突破!さらにリモートワークの掲載案件数5,000件突破!
URLリンク(prtimes.jp)
フリーランス向けの求人は「テレワーク可能」が主流に 2021年は労働者の地方への移住が進む?
URLリンク(nlab.itmedia.co.jp)
203:デフォルトの名無しさん
21/02/08 19:09:45.85 UEWD7mIf.net
m1 macbookでc言語始めるのには何が必要ですか?
c言語を始めるパッケージとかって売ってるんですか?
それともフリーソフトでダウンロード出来るんですか?
学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。
204:デフォルトの名無しさん
21/02/08 19:14:35.93 XD2vlsgg.net
0からのって感じ
良いねえ
205:蟻人間
21/02/08 19:31:11.55 ifT1d8uh.net
>>203
clang、gccなどのCコンパイラのインストールが必要。
206:デフォルトの名無しさん
21/02/08 20:13:50.11 UEWD7mIf.net
>>205
レスどうもです
gccほかググってみました
①エディタで入力
②コンパイラで2進数へ変換(ここでgcc使用)
③コマンドプロンプトで実行
これで合ってますか?
合ってるとすれば、エディタは何がいいんでしょうか?
207:蟻人間
21/02/08 20:21:45.01 ifT1d8uh.net
>>206
Macは異端児だし、自由陣営じゃないから、テキストエディタは自分で選んでね。検索するときは、必ずキーワード「Mac」を付けてね。
コマンドプロンプトはWindowsの場合なんだよな。
208:デフォルトの名無しさん
21/02/08 20:44:41.11 0fSH6U0R.net
Linux なら、build-essential で、Ruby のRake でコンパイルする。
VSCode も使える
mruby の本も出た
Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11
宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。
Ubuntu 18.04, C99 対応
人工衛星イザナギ・イザナミで、使っている
209:デフォルトの名無しさん
21/02/08 21:24:52.07 mOpGK7eJ.net
MacでもVSCode、gcc、terminalでええやんけ
210:デフォルトの名無しさん
21/02/08 22:16:35.01 UEWD7mIf.net
>>209
ありがとー
211:デフォルトの名無しさん
21/02/08 22:35:42.15 UEWD7mIf.net
色々教えてもらってありがとう
でもなんかrubyから始める方が良さそうなのでそうします
212:デフォルトの名無しさん
21/02/08 22:48:15.05 0fSH6U0R.net
Mac で、Cをやる人なんているのか?
たいてい、Linux だろ
Macの機械語をもらっても、誰も動かせないw
213:デフォルトの名無しさん
21/02/08 22:48:56.13 YmxwiogA.net
一応Visual Studio Community for Mac
何てものもあるけどね
MacユーザーじゃないのでWindowsと同じように使えるのかどうかは知らんけどw
214:デフォルトの名無しさん
21/02/08 22:52:50.26 ObgPii2R.net
m1ではxcodeはだめなのかなあ
215:デフォルトの名無しさん
21/02/08 23:04:19.24 WYlwG+td.net
大昔のmacbookの話だがxcodeなる10GBくらいの開発環境を入れないとほとんど何も弄れなかった記憶
今のストレージ容量ならmacbookでも行けそう
216:デフォルトの名無しさん
21/02/08 23:11:34.64 WYlwG+td.net
winは仮想環境も充実してるし色々コンパイラ試せるからいいよね
ネイティブサポートもintel mklやVCで結局一番手厚いし
217:デフォルトの名無しさん
21/02/08 23:18:46.61 nKLqWVxG.net
>>208
F-15はAda、F-35はC++で書かれてる。
218:デフォルトの名無しさん
21/02/08 23:37:09.64 0fSH6U0R.net
Linux には、strace という神ツールもある
219:デフォルトの名無しさん
21/02/09 00:44:38.89 OoGqnNNo.net
>>216
それでもApple環境だけはきついのよなぁ
噂通りiPadにxcode載せてくれれば、俺的に余計な出費なしに楽しめたのに
(もちろんiPad自体で開発する気はない)
220:デフォルトの名無しさん
21/02/09 09:28:59.64 aKFUc8iT.net
>>214
普通に使えるはず
VSとか勧めるくらいなら(IDE勧めるなら)macにはxcodeのが正しい
221:デフォルトの名無しさん
21/02/09 12:16:11.15 To5JxTyF.net
macを選ぶこと自体が正しく無い
222:デフォルトの名無しさん
21/02/18 19:54:34.90 clnw43k0.net
M1 macbook買ってruby でうっほっほーしてますわ
223:デフォルトの名無しさん
21/02/18 21:38:45.66 sRdwF113.net
最近コード読まなきゃならん機会増えてきて教養として読めるようにはなりたい
規格に沿ってなくても勉強にいい感じのインタプリタってないかな?
224:デフォルトの名無しさん
21/02/18 21:59:26.94 UlBwu06v.net
プロになりたい香具師は、YouTube で有名な雑食系エンジニア・KENTA のサロンに入って、
16~32GB メモリのMac で、Ruby on Rails でポートフォリオを作る
もっと、すごい人は、Windows 10, WSL2, Docker, Ubuntu, mruby で、
C99/Ruby 併用で、人工衛星など宇宙開発してるw
mrubyの本も出たし
225:デフォルトの名無しさん
21/02/19 15:37:54.68 LoU7pdW5.net
猛烈にNG率高いレス
226:デフォルトの名無しさん
21/02/20 03:42:06.46 1WE5qKPk.net
みんなRubyとかCでなにしてるの
227:デフォルトの名無しさん
21/05/17 11:52:26.06 094+MbId.net
srand((unsigned)time(0UL));
int r=rand()%100-1;
ってコードがあるのですが返ってくる値がランダムじゃなくて規則性があってモヤモヤしてます
参考書によるとsrandの文が起動時に別の値に毎回変えるための文らしいんだけど
返される値が8,18,28,28,38,48.......と10ずつ繰り上がっていってランダムになってません
何を追加すれば規則性が消えるでしょうか?
228:デフォルトの名無しさん
21/05/17 12:50:25.63 ZeUb3kXE.net
>>227
0 以上 99 以下 の乱数を取得したいなら、
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 );
0 以上 98 以下 の乱数を取得したいなら、
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 99.0 );
229:デフォルトの名無しさん
21/05/17 13:21:28.15 giSQx4b2.net
URLリンク(www.math.sci.hiroshima-u.ac.jp)
URLリンク(www.math.sci.hiroshima-u.ac.jp)
URLリンク(qiita.com)
230:デフォルトの名無しさん
21/05/17 19:09:43.71 lfAH/Fki.net
>>227
これ使うのはダメ?
URLリンク(cpprefjp.github.io)
231:デフォルトの名無しさん
21/05/18 02:31:27.98 +SAIeHDc.net
>>227
疑似乱数は一定の規則に従って生成されるんだから規則的なのは当たり前。
それがどのくらいわかり難いのかという程度問題に過ぎないし、
どういった系を選ぶのが適切なのかは用途次第。
そしてよくある失敗だがランダムシードに時刻を使うなら時刻から予測できる可能性がある。
rand がどういうアルゴリズムで乱数生成するのかは言語仕様では規定していないけれど、
(乱数がとりうる範囲や、同じシードからは同じ乱数列が得られるという性質は規定している。)
伝統的に線形合同法で実装されることが多くて、
パラメータの選定や用途によっては露骨に規則的に見えることもある。
C++ では >>230 の言う通りメルセンヌツイスタが標準ライブラリとして提供されているのだから
それを使うのは妥当な解決方法である可能性は高い。
とはいえメルセンヌツイスタは簡単な物理シミュレーションなどにはおおよそ十分であるにしても
暗号用途には使い物にならないし速度はやや遅いので乱数が大量に必要な場合には
適切とは言えない。
かといって本物の乱数 (環境ノイズなどから生成される乱数) は再現性がないし、
これもまた遅すぎるので大量の乱数が必要な場合には向かない。
繰り返すけが乱数は用途に適しているかどうかであってあらゆる場面で万能な方法はない。
用途次第、状況次第。
232:デフォルトの名無しさん
21/05/18 08:10:11.28 ysWtxNVs.net
229にこれも組み合わせ
URLリンク(cpprefjp.github.io)
233:226
21/05/18 22:58:17.77 wt3ZqlEf.net
今C言語を学習してるのですがC++じゃないと完全ランダムは無理なのですね…。
RAND_MAXは関数なのでしょうか?Cだと使えなかったです。
教えてくださってありがとうございました。
234:230
21/05/19 00:18:20.95 ONEwpJm5.net
>>233
「完全なランダム」とは何か定義して。
235:デフォルトの名無しさん
21/05/19 00:55:55.90 g9DnnU6R.net
せっかくなのでC++を勉強してみては?
236:デフォルトの名無しさん
21/05/19 01:16:05.73 OYngDuIu.net
何をやりたい目的があるから、何々を勉強するだと、速いですよ。
237:はちみつ餃子
21/05/19 01:17:09.90 ONEwpJm5.net
このスレは C++ スレだからな。
C++ は C との互換性のために残している機能はあるが C++ 的にあまり好ましくない場合もあるし、
完全な互換性が維持されているわけでもない。
238:デフォルトの名無しさん
21/05/19 01:36:10.61 OYngDuIu.net
スレ建てといただす。
0からの、超初心者C言語相談室
スレリンク(tech板)
239:デフォルトの名無しさん
21/05/19 01:52:35.92 yT7tFlzp.net
>>233
RAND_MAXは、古くから有るマクロ定数で、stdlib.h で例えば次のように定義されている:
#define RAND_MAX 32767
説明によれば:
「rand関数が返す最大値。処理系によって異なるが、最低でも 32767以上である。」
rand()は偏りが強いには強いが、それでも 227 のように書けば 226 のように
下一桁がいつも8になるようなほどではない。
240:デフォルトの名無しさん
21/05/19 01:54:51.13 yT7tFlzp.net
少なくともrand() は、>>228 のように書けば、メルセデスツイストなどの
乱数を使わなくとも普通に使える。>>227 のように書くとダメなだけ。
241:デフォルトの名無しさん
21/05/19 10:58:56.45 G7N6xM6g.net
0から7の整数が均等確率で出る乱数をrとした場合、
x = r % 3;
とすると、xは0~2までの整数が出るが、均等確率ではない。
それはすべてのパターンを書いてみると分かる:(r,x)を書いてみると、
(0,0)
(1,1)
(2,2)
(3,0)
(4,1)
(5,2)
(6,0)
(7,1)
x= 0 となっているのは、3回。
x= 1 となっているのは、3回。
x= 2 となっているのは、2回。
なので、
P(x=0)=3/8
P(x=1)=3/8
P(x=2)=2/8=1/4
となり、x=2が出る確率だけが小さくなってしまう。
これと同様に、rが0~32767を均等確率で出す乱数の場合、x=r % 100の値は0~99までだが
xが0~99になる確率は均等ではない。
242:デフォルトの名無しさん
21/05/19 12:10:26.94 G7N6xM6g.net
なので、もし、とても偏りの少ない乱数を用いたとしても >>227 では均等に
出現しない。
それを解決するには>>228のようにすればよい。というか227が標準的なrand()の
使い方。
227 だともしrand()が均等確率で出ているならば、結果も均等に出現する。
243:デフォルトの名無しさん
21/05/19 13:29:25.47 G7N6xM6g.net
ちなみに、rand()は、出力範囲内の整数を全て出力し終わってから元の値に
戻る様になっているので周期も RAND_MAX + 1 に等しく、出力値は
均等確率で生じる。
>>227だと10で割った時の余りが必ず8になっておりそれは、出力が
10n + 8 になっているということ。これだと、今言った法則に当てはまって
ないので矛盾し、何かがおかしい。
244:デフォルトの名無しさん
21/05/19 15:03:30.63 SQApMI36.net
C言語でのサーバー構築のやり方わかる方いますか?
245:デフォルトの名無しさん
21/05/19 15:05:53.17 G7N6xM6g.net
>>244
HTTP サーバーのことかな?
246:
21/05/19 19:58:38.12 Y2/6iGxL.net
>>244
バークレーソケットをオープンしてリスンして、接続してきたのなら fork() だのスレッドで処理だの、というのを昔したことがありますが、すっかりわすれてしまいました…
どんなサーバーが欲しいのですか?簡単なサーバーならご要望に応えてテキトーに書く準備はありますよ
247:はちみつ餃子
21/05/19 23:06:46.13 ONEwpJm5.net
>>242
それはよくある勘違い。 >>228 の方式では均等にならない。 櫛状にばらける。
0~32767 の乱数から 0~99 の乱数を得るには
32700 以上の値が出たときにそれを捨てて
そうでない値のときに 100 の余りをとればいい。
少なくとも私の手元の環境にある std::uniform_int_distribution はそのように実装されている。
248:デフォルトの名無しさん
21/05/19 23:56:26.10 l+JWTKLH.net
>>242はアホと思ったけど、
こんな勘違いをするアホがよくいるって?
そんなアホな
249:デフォルトの名無しさん
21/05/20 00:27:22.67 qlUu+R49.net
>>247
uniform_real_distributionの時は?
250:デフォルトの名無しさん
21/05/20 02:25:38.74 Dz+v3/+O.net
>>227
の結果は予想と外れていると思う。
rand()は均等確率のはずなのに、100で割って下一桁に9ばかり出るはずはない。
251:デフォルトの名無しさん
21/05/20 02:28:22.34 UJvm/t/I.net
>>247
なるほど。言われてみればそうだわ。
32767はもともと100で割り切れないから、一部を捨ててやらないと
均等にはならないな。
252:デフォルトの名無しさん
21/05/20 02:52:09.51 onv6EMq1.net
しかし、昔実験してみた限り、rand()の周期は、通常、RAND_MAX + 1
であり、rand()自体は均等確率のはずだ。
それはべつに、>>247ではちみつが言っていることと矛盾するわけではない。
RAND_MAXが32767のように100で割り切れない値だから、>>228
のようにすると、端数の様な部分でわずかに均等確率からずれてしまう。
ただし、ずれる範囲は、32767/100 = 327.67 なので、確率にして
0.67/327 程度以下の小さなずれではあるが。
253:
21/05/20 22:00:26.21 +zMkmbAL.net
>>247
剰余を取って特定範囲の乱数を生成することができるのは、元の乱数が MT 並に性質がよいときだけかと、つまり >>247 はちみつ氏のやりかたは、元の乱数が優れたものだからできる方法
MT が発明されるまでは、最悪の方法「線形合同法」でもなんとか我慢できる部分範囲の乱酔生成法しか推奨されなかった
C FAQ をみてもそれがわかりますね
URLリンク(www.kouno.jp)
13.16:
A:ある範囲の整数からなる乱数はどうやったら生成することができるか。
Q:すぐに思い付く、
rand() % N
(これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜな ら乱数発生器の多くで下位のビットは悲惨なほどランダムでない。よりよい方法は以下のようなものである。
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
254:はちみつ餃子
21/05/20 23:50:59.51 qkpZwp6c.net
>>253
乱数ソースの性質の悪い部分を分布関数で修正するのはレイヤの分離がきちんと出来ていない感じがして嫌だな。
下位ビットを捨てるなら捨てるでそれが明示的であるほうが好ましいと思う。
255:デフォルトの名無しさん
21/05/21 00:17:02.51 Q+lecBxK.net
QZからはキムチの匂いがする
256:デフォルトの名無しさん
21/05/21 10:19:44.69 pMLUvwAV.net
いずれにせよ >>227 は、まともな標準ライブラリで試すと 226 のような結果に
はならないはず。理由:
226では、rand()%100の下一桁が常に9だが、それだとrand()は常に奇数という
ことになるが、実際のrand()は全て奇数ということはないから。
現象的には、偶数と奇数が交互に来るという不具合が知られていたりするが、
全部奇数ということはない。
257:デフォルトの名無しさん
21/05/21 10:27:54.72 b4MjZLXj.net
超初心者スレであることを考えると >>227 の srand() がプログラム起動時一度だけとも限らないのでは。
258:はちみつ餃子
21/05/21 13:18:40.70 JT5uzYpW.net
Windows の (msvcrt の) rand は線形合同法だが下位バイトを豪快に捨ててる。
そのせいか (下位バイトを捨てない線形合同法よりは) 乱数としての質は多少良いが
初期値の違いに鈍感で、初期値が似ていれば最初の乱数も近いということが起こる。
>>257 の指摘は妥当かもしれない。
259:デフォルトの名無しさん
21/05/21 17:16:26.14 qriMwFf7.net
>>257
つまり、rand()だけを繰り返しているのではなく、srand()とrand()の組を
ひっくるめて繰り返しているようなことなのかな。
なるほど、それなら問題の焦点はsrand()と時刻の関係性になるので
>>227のような結果になったとしてもおかしくはないな。
260:デフォルトの名無しさん
21/05/21 17:24:43.18 qriMwFf7.net
なるほど。
質問者は、だから>>228でも快い返事をしてくれなかったのか。
彼は例えば、以下の様に書いていたようだね:
(1)
for ( int i = 0; i < 20; i++ ) {
srand((unsigned)time(0UL));
int r=rand()%100-1;
printf( "r=%d, ", r );
}
本来は、こう書くか、
(2)
srand((unsigned)time(0UL));
for ( int i = 0; i < 20; i++ ) {
int r=rand()%100-1;
printf( "r=%d, ", r );
}
こう書く:
(3)
srand((unsigned)time(0UL));
for ( int i = 0; i < 20; i++ ) {
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 );
printf( "r=%d, ", r );
}
この中で(1)はダメ。(2)も余り良くない。(3)はplain Cでの簡単な書き方では
標準。しかし、わずかに均等確率からはズれる。
261:デフォルトの名無しさん
21/05/21 18:35:20.74 ojw3YA/u.net
>>256
>>227を見れば乱数になってないことは一目でわかると思うのだけど
>>256の時点で毎回srandを呼んでるのかとも思ったけど、
それにしても値が綺麗すぎる。
262:デフォルトの名無しさん
21/05/21 19:25:04.91 UZ6lwfzX.net
Cはよくわからんのだけど(3)のやつわざわざdoubleにキャストする必要あるの?
263:デフォルトの名無しさん
21/05/21 20:07:22.28 ojw3YA/u.net
RAND_MAX + 1 でオーバーフローするとか
264:デフォルトの名無しさん
21/05/21 20:19:47.95 UZ6lwfzX.net
最低でも32767以上だからINT_MAXのときもあるのか…
ありがとうございます。
265:デフォルトの名無しさん
21/05/21 20:22:18.98 UZ6lwfzX.net
と思ったけどRAND_MAX+1.0した時点でdoubleになるんじゃ?
266:デフォルトの名無しさん
21/05/21 20:30:15.34 ojw3YA/u.net
>>265
なるけど
書かなくても動作が同じであれば書かない主義?
カッコとかコメントとか
1.0 も 1. で良いんだよ
まあそれ以前に (3) はカッコの対応がおかしいな
267:
21/05/21 20:40:21.60 XRGlJQOp.net
>>254
確かに今となっては MT が開発されてしまったので、その感覚は理解できます
しかし、我々は MT がなかった頃の好き古き時代についても考慮するべきでしょう、過去の方法を評価するのに、その当時の技術的制約を考慮せずに「今の価値観」で裁断するのはフェアではない、と私はつくづく考えているのです
268:
21/05/21 20:47:24.81 XRGlJQOp.net
>>257-258
なるほど、従って >>227 に対する適切なアドバイスは次のとおりだと私は提案します
>>227
MT = メルセンヌ・ツイスタを使いなさい
srand() とか rand() は忘れなさい、これらは化石時代の乱数生成法だから、今となっては srand() とか rand() をあえて使う合理的理由は存在しません
MT の導入方法や使い方は、次の私のソースを参考にしてください
URLリンク(ideone.com)
スレリンク(tech板:60番)
269:デフォルトの名無しさん
21/05/21 21:29:08.32 ojw3YA/u.net
どう見ても乱数生成法の質の問題じゃない
使い方が間違ってる
乱数の質を求めるならハードウェアの乱数生成命令を使うのが一番だが
>>227はそういうレベルじゃない
270:デフォルトの名無しさん
21/05/21 21:33:53.10 ojw3YA/u.net
Visual Studioで以下をやったら>>227みたいな値になった
3秒ごとにsrand/rand をコールしてるんでしょう
for (int i = 0; i < 100; i++) {
srand(i*3);
printf("%d\n", rand() % 100);
}
271:
21/05/21 23:18:48.19 XRGlJQOp.net
え? >>227 って srand() を複数回呼んでいるんですか?確かにそれは間違っていますね…
srand() は普通、アプリ起動直後に一回だけ呼べば十分ですよ…
272:デフォルトの名無しさん
21/05/22 02:03:33.66 8I9NK3Yz.net
>>270
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔でEnterキーを押している) :
for ( int i = 0; i < 20; i++ ) {
srand((unsigned)time(0UL));
int r=rand()%100;
printf( "r=%d\n", r );
getche(); // 3 秒間隔で人間が Enter キーを押す。
}
273:デフォルトの名無しさん
21/05/22 02:04:35.75 MF6mf+kw.net
>>270
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔でEnterキーを押している) :
for ( int i = 0; i < 20; i++ ) {
srand((unsigned)time(0UL));
int r=rand()%100;
printf( "r=%d\n", r );
getche(); // 3 秒間隔で人間が Enter キーを押す。
}
274:デフォルトの名無しさん
21/06/02 11:54:46.08 QfG+Xq1u.net
書籍の意味が分からないので教えてほしいのですが
それ以外のって部分から何を言ってるのか全く分かりません
”signed char a;である時は、aには-128~127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。
最大値より大きい値になった時をオーバーフロー…略”
275:デフォルトの名無しさん
21/06/02 12:23:21.09 A2GTbdiP.net
何を教えてほしいのかわからない。
276:デフォルトの名無しさん
21/06/02 12:37:39.80 QfG+Xq1u.net
>>275
ロベールの107ページの
”signed char a;である時は、aには-128~127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。”
↑この文が意味不明なので簡単に教えてほしいです
”signed char a;である時は、aには-128~127の数値しか入れられません” ここまではなんとなく理解できたのですが…
277:蟻人間
21/06/02 12:45:51.56 1WJ2HfQ7.net
>>276
そもそもビットとかバイトとかわかるの?
わからないなら、基本情報から勉強しないといけない。
278:デフォルトの名無しさん
21/06/02 12:56:19.74 QfG+Xq1u.net
>>277
この前のページに2進数 1ビット 1バイトなどの単位と各型のバイト数について触れられてるので
そこは何となく理解できてるのですが
279:蟻人間
21/06/02 13:18:03.17 1WJ2HfQ7.net
>>278
1ビットは、2進数一桁で、ゼロかイチ。
2ビットは、2進数二桁で、00、01、10、11の2**2==4通り。これらは10進数で表すと0、1、2、3となる。
3ビットは、2進数3桁で、000、001、010、011、100、101、110、111の2**3==8通り。これらは10進数では、0、1、2、3、4、5、6、7となる。
……
8ビットは、2進数8桁で2**8==256通り。10進では0~255となる。現代では8ビットは1バイトに相当する。1バイトは16進二桁で表せる(2**8==16**2)。
以上は符号なしの場合。
符号付きの場合は最上位ビットがマイナス符号の有無を表し、正の場合は符号なしと同じで、負の場合は2の補数表現になる。
280:蟻人間
21/06/02 13:32:39.22 1WJ2HfQ7.net
2の補数表現というのがくせ者だが、まあ、Wikipediaの説明を見てもらいたい。
URLリンク(ja.m.wikipedia.org)
符号付き8ビットの場合はx+y==2**8となるyがxの2の補数となる。補数を使えば足し算で引き算を表せる。
まあ、例えば10進数4桁1234の10の補数表現は8766となる。1234+8766==10000となるが有効4桁からオーバーフロー(桁あふれ)してゼロになる。8767の場合は1234+8767==10001、
オーバーフローしてイチになる。このようにオーバーフローを前提とすれば、大きな数で引き算を表せる。
281:デフォルトの名無しさん
21/06/02 14:31:54.50 CzhBAh+2.net
お、優しい先生が現れたぞ。嘘ばかりの5ちゃんの中で珍しい。
282:デフォルトの名無しさん
21/06/02 14:44:42.56 QfG+Xq1u.net
>>280
すいません詳しくありがとうございます
補数って概念全く理解してなかったので、それが原因だと分かりました。
コンピュータは足し算しかできないのですね…
そこら辺知識固めてからもう一度読み直してみようと思います。
283:蟻人間
21/06/02 16:48:03.08 1WJ2HfQ7.net
10進4桁の場合、9999に1を足すと10000、オーバーフローしてゼロになる。よって、このオーバーフローするシステムの場合、9999はマイナスイチを表していると考えることができる。
同様に9998は-2であり、9997は-3である。
284:蟻人間
21/06/02 16:54:31.73 1WJ2HfQ7.net
符号付き8ビットの場合、2進数11111111、つまり16進でFFがマイナスイチを表す。同様に11111110(FE)はマイナス2であり、11111101(FD)がマイナス3である。
規則性が分かると思うけど、ビットを反転して、符号なし整数と見なしてイチを足すとマイナス符号の追加と同じ効果がある。証明略。
285:はちみつ餃子
21/06/02 17:04:16.45 Bcy6nIKX.net
一応補足しておくけど負の数の表現が二の補数であることは C/C++ の言語仕様としては保証してないし、
(C++20 からは二の補数であることが保証されるようになった)
1バイトが8ビットであることも保証してない。
signed char に型変換したときに上位ビットを切り捨てることも保証されない。
(変換後の型が unsigned のときには実質的に保証される。)
言語仕様として保証しないからといって間違っているというわけではなくて、
一般的なコンピュータのアーキテクチャではおおよそそうなってるのが普通というのも事実。
C++ の言語仕様の一部は機械の都合 (どのような機械語を生成するのが効率的か) でいくつかの選択肢
をとれるように言語仕様の側では意図的に決めてない部分がある。
「C++ の説明」として見たら >>276 で引用されている説明はちょっと微妙かもしれん。
あまり踏み込んで説明するのがめんどいから「普通は」という言葉でごまかしているんだと思う。
286:デフォルトの名無しさん
21/06/02 23:13:21.37 ZuDsQZsq.net
float/doubleは
287:デフォルトの名無しさん
21/06/03 02:59:14.77 Ers5yK+g.net
char は環境依存なので使わないようにする。
unsigned・signed のどちらなのか、分からないため
unsigned char は、0~256
signed char は、-128~127
0~127、7ビットの範囲では、この2つは共通している
signed charは、先頭ビットが1なら、負数となる。
2の補数を調べて
1111_1111・0xFF なら、256か、-1
288:286
21/06/03 03:03:09.44 Ers5yK+g.net
>>287
修正
256 ではなく、255 です
unsigned char は、0~255
1111_1111・0xFF なら、255か、-1
だから、環境依存のchar 型を使っていると、
エラーに、-1を使っていたが、他の環境では255と表示されたりする
289:デフォルトの名無しさん
21/06/03 10:13:20.76 oKNqyVQK.net
むしろ int を期待してる引数に char 渡す時が危険
290:はちみつ餃子
21/06/03 13:38:18.86 ivgy5ZU8.net
char 同士なら符号の有無が違ってもビットパターンは維持された
ままで型を読み替えることが期待できる (言語仕様として保証しているわけではない)
けど、大きな型に変換するときは符号拡張が起こることがあるからだね。
291:デフォルトの名無しさん
21/06/05 22:29:47.19 UR0LV/yo.net
ハーバートシルト『STL標準講座』翔泳社, 1999, p.156-157
のサンプルプログラムで、そのままだとコンパイルが通らないものがあるのですが、
適当にconstをつけていたらコンパイルできるようになりました
しかし、理由がわかりません
どなたかご教示いただけませんか?
URLリンク(ideone.com)
292:デフォルトの名無しさん
21/06/06 01:24:02.19 Lz5dZs8J.net
operator <<のとこでoがconst参照だから、そのoからはconstなメンバ関数しか呼べない。のでそれで合ってる
元のソースが間違ってるか何かだと思う、この仕様は最初からのはずなので
293:
21/06/06 01:44:38.27 xlnMgrm3.net
>>291
set<>::iterator は const をつけていなくても set<>::const_iterator と同じくイテレータ≒ポインタに const 属性がつきます。
だから set<>::iterator p; …①、と宣言した場合の p には「終生」 const 属性がつきまとうことになります。
例えば①の p にポインタ演算子 * を適用して出来た表現「*p」が参照に読み替えることがあれば、その参照は const 参照でなければなりません。
もともと const 属性はポインタにつけて、const 属性のついたポインタに -> 演算子を使って出来たメンバ変数の値を変更しないようにコンパイル時に厳密にチェックする縛りです
c++ における参照は「機械的にポインタを使った書き方に書き直すこと」が可能(…②※)ですから、const なイテレータ(≒ポインタ)から生成した参照は const な参照にならざるを得ないのです
※②は私の持論で、今回のお題でも参照をポインタに全部書き換えてやろうと試行錯誤していましたが、さすがに iostream や set で先に参照として宣言されているものを後からポインタにするのは不可能でした
頑張ってみたけれども、かえって意味不明な URLリンク(ideone.com) ぐらいにしかならなかった、持論は修正しなくてはいけないなあ…
set は重複要素を許さない二分木構造です。二分木構造 set に要素を挿入するときに、要素の大小関係にしたがって二分木の形をくみ上げていきます。
だからすでに二分木に組み込まれてしまった要素が、後からほいほいと要素の内容を変えられてしまっては二分木構造に矛盾をきたし、役に立たなくなってしまう…
だから set にすでに組み込まれている要素をイテレータで走査するときは、そのイテレータ≒ポインタは、メンバの書き換えが不可能なイテレータとするしかないか、と私は考えます
提示していただいたソースを、上に述べた原則にしたがって、この原則に関係ない余分な部分を削り落として書く(あと、ちょっと簡略化もしています)と次のような感じでしょうか。
URLリンク(ideone.com)
friend 略 operator<<(略 C const &obj) { ... }
にならなくてはならないのは set<C>::iterator は set<C>::const_iterator と同じだからです
friend bool operator<(C const &a, C const &b) は set への要素の挿入のときに使う比較関数ですが、比較作業以外に要素のメンバを変えるとか余計なことをさせないために、最初から const 参照で宣言するべきでしょうし、そうなっているみたいですね
しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。
ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう
上記のお題をこの方針で書くとこうなります。
URLリンク(ideone.com)
いろいろ書きすぎたかもしれませんが、上に示した三つのソースコードを研究してみてください
294:
21/06/06 01:58:54.60 xlnMgrm3.net
>>291
>>293
スレリンク(tech板:593番)
593 名前:◆QZaw55cn4c [] 投稿日:2021/03/14(日) 20:13:24.03 ID:uaeFGveg [3/6]
>>590
>C++は未だ*や&、&&、で頭の中がグルグル回ってしまう
これらの「記号」は習得に順序があります。
まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。
次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう
参照 で返す、という場面でも、①参照返しが出来る場合と、②参照返しはできずせいぜい RVO に期待するしかない場合、の①②二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、①②は結構重要だと思います
&& は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
295:
21/06/06 02:07:24.75 xlnMgrm3.net
>>292
operator<<() のストリームじゃないほうの引数は、const 参照ではなくてもいいと思います
今回のは const 参照が要求されたのは、 set のイテレータだから
URLリンク(ideone.com)
296:
21/06/06 02:32:48.87 xlnMgrm3.net
>>293
ソースを貼り付けた一行目がミスっていましたね、修正します。
>しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。
>ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。
>そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう
>上記のお題をこの方針で書くとこうなります。
URLリンク(ideone.com)
297:デフォルトの名無しさん
21/06/06 02:41:34.70 Lz5dZs8J.net
ああ、operator <<のconstも最初付いてなかったのか
それならsetの仕様変更のせいだね
というか昔のままの非constの方が良かったんだけどなぁ
比較演算子自分で書いてるような構造体だと順序変わらない場合もあるんだし・・正直押し付けがましい
298:
21/06/06 03:22:16.34 xlnMgrm3.net
>>297
自分で一から書く分には const に一貫性を持たせて、結果、const が有用に働くように書いていけるかもしれない、とか思うのですが、
他の人の分を取り込むときは、最悪 const_cast を >>291 の言うように「適当にconst_cast をつけていたらコンパイルできるようになりました」とか私も言っているわけでして、私は >>291 を笑うことができません……
299:デフォルトの名無しさん
21/06/06 08:29:50.46 KyPgEn9X.net
一から書いている私ですが、
全てのフォルダ・ファイル・プログラムに一貫して
*と何か名前を付けてプログラミングをしています。
300:デフォルトの名無しさん
21/06/06 08:34:21.45 8VTCuGWY.net
QZ・・・・
C++をちゃんと理解できてないのに無理すんなw
301:
21/06/06 09:27:07.17 xlnMgrm3.net
>>300
>C++をちゃんと理解できてないのに無理すんなw
うん。すっごく認めます!
でもちゃんと理解できていないからこそ、アウトプットもきちんと書くようにして定着させたい、というのもあるんですよ
「教えることは教わること」
>>291 に対する回答としての >>293, >>295 に間違いはないですよね?
302:デフォルトの名無しさん
21/06/06 09:44:11.48 WkbXnMOk.net
意味分からん理屈だな
ずっと前からC++分からないって言ってるよね?
もしかして理解できる頭を持ってないのかな?
303:
21/06/06 13:37:50.42 xlnMgrm3.net
>>302
自己申告なんて当てにしてはいけないのでは?
304:デフォルトの名無しさん
21/06/06 15:27:30.95 fMmzH2Jl.net
文面から必死な感じがヒシヒシと伝わってくるのに
皮肉も理解できないとはさすが厚顔無恥の代表格
誰も認めてくれないから自画自賛するしかないんですね
305:
21/06/06 16:22:05.09 xlnMgrm3.net
>>304
え?必死?思いがけない反応ですね
まあ >>291 の方が提示したソースはハーバードシルトにしては冗長だと思って無駄丁寧っぽく説明したほうがいいかと >>293 をワサワサ書きましたが、それが必死だとは…
よく分かっている方 >>292 に対しては簡潔に私の意見 >>295 を送ってもう十分、仕様変更があったという情報 >>297 をいただいて感謝、というところでしょうか
306:290
21/06/06 22:29:30.82 DvMt5hdj.net
>>292
>>293
どうもありがとうございます
constメンバ関数の理解が不十分だったようです
constメンバ関数はメンバ変数を変更しないという理解だけで、
constオブジェクトはconstメンバ関数しか呼べないことへの
理解が足りなかっため私自身混乱していました
ご説明いただいた内容を足掛かりに理解を深めたいと思います
307:1
21/06/07 07:01:58.64 pWKPTo4/.net
まぁ、いいじゃねぇか、プログラミングなんて何にも知らないってのスレだし。
308:デフォルトの名無しさん
21/06/07 07:48:28.30 c29T7zKX.net
const char* const str[] は文字列アドレスを格納するポインタの配列って意味であってますか?
const char* strは文字列を格納するポインタ?
char str[] は文字配列?
一気に出てきてよくわからなくなって来たので間違えてたら教えて欲しいです。
309:デフォルトの名無しさん
21/06/07 08:39:52.02 xFpLHEPr.net
>>308
だいたいあってる
310:デフォルトの名無しさん
21/06/07 11:12:06.49 BLDePS2Q.net
ちゃんとメモリ確保してから使えよ
311:デフォルトの名無しさん
21/06/07 22:09:28.76 JY7FyEcf.net
>>309
ありがとうございます。
312:デフォルトの名無しさん
21/06/08 23:28:22.97 kZSYpF+Y.net
URLリンク(ideone.com)
103 と115で確保された動的配列のアドレスは別物なんでしょうか?
コピーコンストラクタの動きがよくわからないです
313:デフォルトの名無しさん
21/06/09 02:24:41.44 ZtayyY2i.net
103のarrayはコピーされたものだから別物だよ
てか初っ端から手直しが必要なソースを貼るのはやめろ
314:デフォルトの名無しさん
21/06/09 02:39:16.49 Ih94CWHU.net
スレの主旨的に初心者が初歩的な質問をするのは別に構わんとは思うんだが、
入門書にでも書いてあるようなことはよく読んで勉強したほうがいいと思うぞ。
素人が1レスで答えるよりはちゃんと体系だった解説のほうがわかりやすいよ、常識的に考えて。
315:デフォルトの名無しさん
21/06/09 04:24:03.76 BGdtXEJj.net
>>313
すいません、ヘッダーとかcpp分けてるのどうアップロードすればいいのか分からなかったです
後65行目にcopy(other.m_array, other.m_array + m_size, m_array);とあるのですが何をしてるのか分かりません
本には”第1引数以上第2引数未満のアドレスにあるデータを第3引数の指すアドレス以降にコピーする関数で…とあるのですが
具体的に何をしてる関数なのでしょうか?第2引数の足し算も何なのかよく分かりません。
316:デフォルトの名無しさん
21/06/09 04:43:32.09 ZtayyY2i.net
URLリンク(ideone.com)
こうしたらそのままコンパイル通るやろ
自分のヘッダincludeしてるとこにヘッダの内容貼り付けるだけ
URLリンク(cpprefjp.github.io)
memcpyと似たようなもん(コピーの仕方は違うけど
other.m_arrayの指すアドレスから+m_size分のアドレスまで(未満)をm_arrayの指すアドレスから同じく+m_size未満までコピーしとるだけ
これで分からんならポインタの理解が出来てない
上記のとこだとイテレータとか出てるけどこの場合ポインタなので全部ポインタに読み替えていい
317:デフォルトの名無しさん
21/06/09 04:53:28.23 ZtayyY2i.net
ちょっと誤解招きそうなので補足
m_sizeは個数なのでアドレス値ではないがintのm_size個分アドレスが加算される
このへんは>>314の言う通り入門書嫁
318:デフォルトの名無しさん
21/06/09 14:16:25.82 3Qpbsqp/.net
cpp で socket を読み書きする stream 系の class ってありますか?
boost にはあったと思いますが
標準のはあるんですか?無いですか?
319:はちみつ餃子
21/06/09 16:06:33.34 Ih94CWHU.net
>>318
標準には無い。
が、ソケットに stream のインターフェイスをかぶせることはそれほど難しくはない。
320:デフォルトの名無しさん
21/06/09 22:30:15.61 BwbEIJxn.net
>>316
1引数から2引数で足したアドレスまでを第三引数にコピーしてるのですね
やっと分かりました。ありがとうございます。
頭硬い人はロベール向いてないのかな…
321:デフォルトの名無しさん
21/06/09 23:57:13.88 ZtayyY2i.net
それは良かった
まぁ最初は理解に時間かかるもんだ
322:デフォルトの名無しさん
21/06/10 10:45:51.80 ZbfFyHii.net
>>319
thx
cpp の std にある関数で glibc の様な getpass ってありますか?
標準のは無いですか?
323:はちみつ餃子
21/06/10 14:24:18.43 MOYAWABe.net
>>322
無いよ。
324:デフォルトの名無しさん
21/06/11 14:28:13.59 tB3/M6ll.net
FILE *fp = fopen() で取得した fp を使って
stringstream としてアクセスすることは出来ますか?
325:はちみつ餃子
21/06/11 17:27:01.32 DsaVPusD.net
>>324
直接的に一発で FILE* に stream をかぶせる手軽な方法はないと思うけど、
std::basic_streambuf を継承して setbuf, overflow, sync などをオーバーライドしたクラスを作ればストリームバッファになる。
(普通は std::basic_filebuf も内部的にはそう実装されているはず。)
それをストリームに結び付ければストリームに出来ることは何でもできるよ。
仕様を調べるのがすごくしんどいだろうけど、
実装は (細かいエラーチェックとかを抜きにすれば) 百行も要らないくらいの簡単なものでいけるんじゃないかな。
326:デフォルトの名無しさん
21/06/16 00:59:39.17 QFUk0bjY.net
>>324
fstreamを使えば?
#include <fstream>
#include <sstream>
…
std::ifstream fs("hoge.txt");
std::stringstream ss;
ss << fs.rdbuf();
fs.close();
それともfstream使えない特殊な環境?
327:デフォルトの名無しさん
21/06/16 16:36:23.72 uJQ6HHCX.net
FILE *fp = fopen(...);
std::ifstream fs(fp);
出来たらいいな
328:デフォルトの名無しさん
21/06/17 21:31:03.90 OB6uOiq6.net
関数へ渡す引数の型を限定したいときどう書くのが一般的ですか?
具体的に言うと符号なしのintだけ受けつけたいんですけど
329:はちみつ餃子
21/06/17 23:54:09.39 Gi/wqrqm.net
>>328
暗黙の型変換を許さないということかな?
それならテンプレートにした上で型に制約を付ければいい。
ここでは C++11 でも通るように書いてみたけど C++20 以降なら
コンセプトが使えるのでもう少し簡単に書ける。
#include <type_traits>
template<class T>
typename std::enable_if<std::is_same<T, unsigned int>::value>::type foo(T) {
}
int main(void) {
int a = 1;
unsigned int b = 2;
foo(a); // これはエラーになる
foo(b); // これは通る
}
330:デフォルトの名無しさん
21/06/18 08:42:03.67 kejK9s3z.net
なんで戻り値voidに限定してんだよボケ餃子
331:デフォルトの名無しさん
21/06/18 11:49:14.92 AVf6Ht59.net
確かにそれで可能だけど、回答が超初心者スレのレベルを逸脱していると思うのですが
332:はちみつ餃子
21/06/18 18:30:00.74 JA4mPV9U.net
>>330
単なるサンプルだからだよ。
>>331
超初心者が相談するという主旨のスレではあるけど、
超初心者には理解できないという結果になることもあるだろうし、
可能であれば相談した結果として初心者から脱したらそれに越したことは無いでしょ。
これで相談がクローズってわけでもないから
もっと深く知りたいってのならわからないところを続けて質問してもらってもいいわけで。
もっと簡単な方法があるならそれを提示するんだけども、なくなくなくない?
333:デフォルトの名無しさん
21/06/18 19:23:19.39 kejK9s3z.net
>>332
アホか
普通のenable_ifの使い方と全く違うお前だけのオナニーコード押し付けて何がサンプルだ
何不必要な制限勝手につけてドヤってんだボケ
334:はちみつ餃子
21/06/18 19:32:07.35 JA4mPV9U.net
>>333
返却値 (または enabler) で制限するのは普通だろ。
むしろ他にどう使えるんだ?
335:デフォルトの名無しさん
21/06/18 19:35:45.29 kejK9s3z.net
>>334
マジで言ってんのか?
#include <type_traits>
template <class T, typename std::enable_if<std::is_same<T, unsigned int>::value>::type* = nullptr>
void foo(T)
{
}
int main()
{
// foo((int)1);
foo((unsigned int)1);
}
enablerってこれのことか知らんが、お前のコードだと戻り値voidにしか出来んだろってこと
336:デフォルトの名無しさん
21/06/18 19:42:19.79 kejK9s3z.net
>>328
ちなコンセプト版(C++20対応コンパイラが必要)
#include <type_traits>
template <class T>
concept UnsignedInt = std::is_same_v<T, unsigned int>;
template <UnsignedInt T>
void foo(T value)
{
}
int main()
{
// foo((int)1);
foo((unsigned int)1);
}
(インデントは全角なので注意)
まぁどっちも難しいと思うけど無理に理解せず流した方がいいと思う(それか制限あきらめるか
337:デフォルトの名無しさん
21/06/18 19:43:08.40 AVf6Ht59.net
>>332
いや、お前の言いたいことは分かるよ
ただテンプレートメタプロコードを超初心者にいきなり例示して、「わからないところを続けて質問」して回答を繰り返して、結果的に理解に至るのは何ヵ月後になるんですかと
テンプレートに関する高度な質問が飛び交う中、ここは超初心者スレとして機能するんですかと
この場合>>328が求めているのはドリルじゃなくて穴だと思うよ俺は
どういう背景があってunsigned int以外を受け付けたくないか、を聞くべきなのでは?
338:デフォルトの名無しさん
21/06/18 19:57:29.32 kejK9s3z.net
確かにそうだね
というか自分もテンプレート以外思いつかんかった・・
>>334
なんか変な癖あるから標準的な使い方がすっぽ抜けてたのかね
ボロカス言って悪かった
339:デフォルトの名無しさん
21/06/18 20:01:53.90 zIhiG+wy.net
あんまり詳しくない俺にはこういうのしか思いつかん。
__my_func() は直接呼ばないお約束にしておいて、static_assert で。
template のところは、書き換えは雰囲気でできると思うけど・・・
#include <type_traits>
#include <iostream>
unsigned int __my_func(unsigned int a) { return a * 2; }
template <class T> unsigned int my_func (T a) {
static_assert(std::is_same<T, unsigned int>::value == true, "is not uint.");
return __my_func(a);
}
int main() {
int a = 2;
unsigned int b = 2;
//std::cout << my_func(1) << std::endl; // assert
//std::cout << my_func(a) << std::endl; // assert
std::cout << my_func(1U) << std::endl;
std::cout << my_func(b) << std::endl;
}
340:はちみつ餃子
21/06/18 20:30:53.23 JA4mPV9U.net
>>335
> お前のコードだと戻り値voidにしか出来んだろ
なんか変なこといってると思ったらそこがすれ違いか。
std::enable_if のテンプレート引数の二個目を省略しなければ何にでも出来るよ。
(std::enable_if の type は void に固定されているわけではない。)
クラスやコンストラクタは返却値がないから enabler を使うんであって、
普通の関数のときは返却値のほうで制御するのが普通だと思うぞ。
341:はちみつ餃子
21/06/18 20:33:26.89 JA4mPV9U.net
>>337
まあそうなったら他に誘導してもいいし、資料を提示するだけで十分だと思った。
ただ背景をもうちょっと引き出すべきというのも確かに必要なことではあったな。
342:デフォルトの名無しさん
21/06/18 20:39:10.69 kejK9s3z.net
そうなんか、そういえばいつも自作alias使ってたから気付かんかったわ
>普通の関数のときは返却値のほうで制御するのが普通
別に戻り値でも引数でもいいが、クッソ読みづらいと思うけどな
あとそれならこういうスレで第2引数省略すんなよ、初心者惑わしたいのか?
343:1
21/06/19 15:34:05.42 kvHrZ2tI.net
ここは中級者が、お互いを煽り合うスレでは無い、ということを理解して欲しい。
344:デフォルトの名無しさん
21/06/19 16:53:11.57 zDrgWeBe.net
引数同じで戻り値だけ違う関数を造って使い訳たい
345:デフォルトの名無しさん
21/06/19 17:01:53.54 xVp2TfT/.net
>>343
俺ははちみつが書くより先に同じこと(enable_if)思ってたけど、このスレには不適切だと思って書くのやめてたんだけどな
あんな不適切で不親切な回答(テンプレートとSFINAEとか、はちみつも使いこなせてないようなものを使う上に戻り値の変更方法も、自身が言ってるコンセプト版も書かない)に怒っちゃいかんのか
346:はちみつ餃子
21/06/19 17:30:35.18 /f53/cxR.net
>>345
そこらへんが少しばかり詳細なら初心者に理解できる内容になるという主張?
少々の書き方の工夫で初心者がわかるように解説できるわけないだろ。
関連知識も含めればちょっとした本一冊分くらいにはなる内容なんだから。
「まずはテンプレートの知識が必要ですね」ということが初心者に対する解で、
そこに至る前にごちゃごちゃしたことを詰め込むのは不親切だと思うわ。
347:デフォルトの名無しさん
21/06/19 17:34:51.32 xVp2TfT/.net
>>344
戻り値だけ違う同名関数は作れないのでテンプレートにするか、引数で戻り値を指定するしかないとおも
template <typename T>
T hoge();
template <>
int hoge<int>() {}
template <>
float hoge<float>() {}
hoge<int>();
hoge<float>();
もしくは
int hoge(int) {}
float hoge(float) {}
?hoge(int());
hoge(float());
348:デフォルトの名無しさん
21/06/19 18:00:39.76 kvHrZ2tI.net
1 + 1 = 1
349:デフォルトの名無しさん
21/08/24 01:28:35.73 WM1jAzNs.net
URLリンク(pastebin.pl)
operator関数の動きがよくわからないんですが
tmp.x = x + p.x;
これの p.xと xとtempはどのオブジェクトのことを指してるんでしょうか?
350:はちみつ餃子
21/08/24 01:50:15.06 MkJE9y3A.net
>>349
operator+ は演算子 + の実体として機能する。
故に p1+p2 は p1.operator+(p2) と書いた場合と完全に同じ。
tmp はもちろんこの関数内で宣言した tmp 変数だし、
p は渡された引数 (この場合は p2) のコピーなので p.x には 6 が入ってるね。
351:デフォルトの名無しさん
21/08/24 02:43:37.56 WM1jAzNs.net
>>350
ありがとうございます。引数がどれに対応してるかわかりました。
p1.operator+(p2) これは何でしょう?
352:デフォルトの名無しさん
21/08/24 03:37:20.26 gGQMgsWd.net
掛け算の*と、
色々を示す*が
同じ*なんで困っていますが、どうしたらいいんでしょうか?
353:デフォルトの名無しさん
21/08/24 03:55:09.38 jikR3Y9f.net
色々ってワイルドカードのこと?
C++においては*は乗算かポインタ関係だけだよ
>>351
p1のメンバ関数として普通にoperator +を呼んでるだけ
354:デフォルトの名無しさん
21/08/24 04:29:07.93 gGQMgsWd.net
ありがとうございます。
c++ のワイルドカード記号ってなんでしょうか?
355:デフォルトの名無しさん
21/08/24 04:33:24.90 jikR3Y9f.net
言語そのものには無いよー
エディタやIDEで検索するのには使えることもあるが
356:デフォルトの名無しさん
21/08/24 04:45:36.01 gGQMgsWd.net
教えてもらって、勉強になりました。
ありがとうございました。
357:デフォルトの名無しさん
21/08/24 07:22:03.54 WM1jAzNs.net
URLリンク(pastebin.pl)
クラスの型変換と型変換用のコンストラクタの意味が全く分からないのですが
これをすると何が得なのでしょうか?10行目は普通のコンストラクタに見えますがなぜ変換用?
入門書に載ってるコードなのですがエラーで動作もせず何がなんだか分かりません…
358:デフォルトの名無しさん
21/08/24 15:23:13.01 jcrsR8Np.net
2つ目のprivateはpublicの間違いじゃね?
あと変換は、単に引数一つだけを受け取るコンストラクタは
自動的に?暗黙のキャストにも使われる、というだけ(それを禁止する方法もあるが
359:デフォルトの名無しさん
21/08/25 07:15:15.42 dwOa++JV.net
>>358
おかげさまで動きました。ありがとうございます。
でもいまいち型変換の意味が分からないのですが
operator 型名()return 変数を定義するとどの変数にも代入出来るようになるってことですか?
360:デフォルトの名無しさん
21/08/25 15:58:08.24 3/bOIe3o.net
C++ キャスト でぐぐるといいよ
(キャストはCにもあるけど)
361:はちみつ餃子
21/08/25 22:29:05.16 /Q8zinJC.net
>>359
型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし
て書いてもかまわないんだが、変換関数 (conversion function) または変換
コンストラクタ (converting constructor) が定義されていると暗黙の型変換
が適用される文脈では勝手に適用して変換してくれるので便利。
例えば以下のように foo 型のオブジェクトを受けとる文脈で bar 型のオブジェ
クトを渡しても通るのは変換が適用されるから。
struct foo {};
struct bar {
operator foo() {
return foo();
}
};
void func(foo) {}
int main(void) {
foo x = bar();
func(bar());
}
362:デフォルトの名無しさん
21/08/26 01:12:00.54 BlNdGFU0.net
>>361
ようやくイメージできてきました。ありがとうございます!
363:デフォルトの名無しさん
21/08/26 06:25:31.31 C2TXXzWD.net
>>361
そんな難しくせずに、
{ change A to B }
でいいんじゃないの?
364:デフォルトの名無しさん
21/08/26 09:12:40.22 QSgOZ0Rh.net
なんのこっちゃ
365:デフォルトの名無しさん
21/08/27 08:15:52.67 ue9a70Za.net
コマンドライン引数の意味が全く分からないのですが
Visualstudioを使っているからでしょうか?
それとも、コマンドプロンプトの使い方を理解できないでしょうか?
URLリンク(programming.pc-note.net)
ここも参照にしたのですが何が得で何ができてるのかよく分かりません。
コマンドラインってVSでデバッグ無しで実行をした時に出る黒い画面ではないですよね?
質問ばかりですいませんが本当に何も分からないのでお願いします。
366:デフォルトの名無しさん
21/08/27 11:14:47.31 xylLBHc1.net
>>365
メモ帳でファイルをドラッグアンドドロップで開く例が紹介されているが
これはWindowsのShellであるExplorerがexefileに対して登録されているドラッグアンドドロップハンドラーを処理してドロップしたファイルのフルパスを文字列として起動するプロセス環境のコマンドラインパラメータとして渡している
黒い画面(コマンドプロンプト)にもExplorerとは違うがプロセスの起動とパラメータを渡す機能が実装されている
起動するexefileに続けてスペースを開けたあと記入した文字列がそのままパラメータとして渡される
ファイル名以外にも自由に渡せるためプログラムの動作を指定したり変更する目的で使用される
あなたが作成するプログラムでシェルから渡されたコマンドラインパラメータを確認する方法はそのページにもある通りだ
コマンドラインパラメータを活用してバラ色の人生を満喫してくれ
367:デフォルトの名無しさん
21/08/27 14:23:11.73 8dQk5Ix1.net
getopt
368:デフォルトの名無しさん
21/08/27 23:33:15.78 cMIVTei2.net
例えば、デスクトップにショートカットを作る。
コマンドプロンプトを起動して、Ruby スクリプト・a.rb を実行する
リンク先
C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb"
注意。書き込めないので、間に@を入れました
作業フォルダ
C:\Users\Owner\Desktop
a.rb 内には、puts ARGV
(ARGV は配列で、そこにコマンドライン引数が渡ってくる)
と書いておいて、ショートカットに、フォルダx・ファイルb.txt をdrag&drop すると、
コマンドプロンプトが起動して、以下のように表示される
C:\Users\Owner\Desktop\x
C:\Users\Owner\Desktop\b.txt
369:デフォルトの名無しさん
21/10/06 22:36:41.57 OG+j1FAK.net
const char* const str[]={"aaa","bbb","ccc"}
constの効果を教えてほしいです
後ろのstrの前のconstは付けると
const str[0]="dddd"って出来なくなるのは分かったのですが
先頭のconstが分かりません
370:デフォルトの名無しさん
21/10/06 22:51:34.11 ItOX1MR6.net
str[0][0]='d';
371:デフォルトの名無しさん
21/10/06 22:53:20.88 OG+j1FAK.net
>>370
なるほど。
ありがとうございます。
372:デフォルトの名無しさん
21/10/09 07:12:25.69 JFpyaThm.net
ロベールC++入門の代入演算子についてなのですが
コピーコンストラクタのときは動的配列をdelete[]しなかったのに
なぜ代入演算子を使うときだけdelete[]するのか分からないので教えて下さい
本にはm_arrayには前に確保したメモリが存在するためdelete[]しないとメモリリーク
と書いてあるのですがコピーコンストラクタも同じじゃないの?と混乱してます
100行目です
URLリンク(ideone.com)
373:デフォルトの名無しさん
21/10/09 10:44:46.48 tDH5FAwQ.net
newしたメモリが不要になったらdeleteする
これだけ
コピーコンストラクタでのdelete、
いつnewしたデータに対して?
374:デフォルトの名無しさん
21/10/09 17:51:02.84 QAOoCtV/.net
>>373
すいません、わからないです。
コピーコンストラクタはnewでアドレスを確保しないものなのですか?
375:はちみつ餃子
21/10/09 18:03:01.95 Z56nk6n1.net
>>374
ロベールの C++ 入門を読んだことがないからどういう構成になっとるか知らんけど、
それがわからんのならたぶんそれ以前の章を理解でてきないと思う。
376:デフォルトの名無しさん
21/10/09 18:04:17.21 jELfb/xT.net
>>372
代入演算子は既にあるオブジェクトを別のオブジェクトで上書きする操作
コピーコンストラクタは別のオブジェクトから新しいオブジェクトを作って初期化する操作
代入演算子でdelete[]しているのは既にあるオブジェクト(*this)のメンバとして確保済みのメモリ領域
コピーコンストラクタの実行時には「既にあるオブジェクト」にあたるものは無いので、deleteするものも無い
377:デフォルトの名無しさん
21/10/09 20:35:07.35 QAOoCtV/.net
>>376
初期化と代入の知識が曖昧でした
分かった気がします。ありがとうございます。
378:デフォルトの名無しさん
21/10/10 20:55:50.73 6QW0WSDe.net
AtCoderの初心者向けのC++の説明のページを読んでいます。
vector<int> a(10);
aの第i番目の要素にアクセスする場合、a[i]よりもa.at(i)と書くほうが良いと書いてあります。
これは現在のC++で推奨されている書き方でしょうか?それとも単に初心者はそう書いたほうがいいというだけのことでしょうか?
379:ハノン
21/10/10 21:05:41.56 KKHdhYPj.net
>>378
>a[i]よりもa.at(i)と書くほうが良い
そう主張されている理由はどのように書かれていますか?私はどちらでも大差ないと思っていますが‥‥
380:デフォルトの名無しさん
21/10/10 21:07:18.12 6QW0WSDe.net
>>379
vector<int> a(10);
b = a.at(10);
などと書いた場合にコンパイルエラーになりますが、エラーメッセージがatを使うと表示されるというのが理由です。
381:デフォルトの名無しさん
21/10/10 21:08:35.36 6QW0WSDe.net
初心者でないプログラマーでatを使って書いている人は少数派ではないのですか?
382:デフォルトの名無しさん
21/10/10 21:31:47.25 zWyM5YPA.net
範囲外にアクセスする可能性があるならat、ちゃんと事前にチェックするなら[]でいいんじゃない?
383:デフォルトの名無しさん
21/10/10 22:58:42.68 gnqjARRQ.net
気分によるけどatが好きです
384:デフォルトの名無しさん
21/10/10 23:07:44.84 gmqGyDAJ.net
vector配列を指すポインタを使ってる時に[i]で指定する書き方がよく分からないのでat(i)使ってる
385:デフォルトの名無しさん
21/10/10 23:14:51.45 U88jNIFg.net
(*ポインタ)[i]
386:はちみつ餃子
21/10/10 23:15:56.24 cCUvKLuJ.net
>>378
これのことだね。
URLリンク(atcoder.jp)
例外処理やアサートの説明を省略しているせいでどう使い分けるべきものなのかがよくわからん説明になってる。
C++ はかなり複雑で、 AtCoder のサイトにある雑な説明だけでは細かいところまで理解はできないよ。
C++ の言語仕様の詳細を理解するのに手間取って競技を始められないくらいならそういう風に割り切れという意味で
AtCoder としては at を推してるんであって、言語仕様やプログラマの習慣としてどちらかを推奨してたりはしない。
それぞれに用途がある。
387:はちみつ餃子
21/10/11 00:50:58.08 kxIK5/L+.net
余談だが C++ の言語仕様としては推奨というのはないが非推奨というのはあって
(結果的に同等のよりよい機能を推奨するのと同じことになっている場合はある)
将来の言語仕様の更新で廃止するつもりがあるということを意味する。
388:デフォルトの名無しさん
21/10/11 02:00:14.70 xizp5ONl.net
ポインタ->operator[](i)
389:デフォルトの名無しさん
21/10/13 01:04:04.91 gvBCET4D.net
Notepad++でcppファイルを選んで実行をすると
Visualstudioが立ち上がるのですが
どうすればNotepadで実行出来るのでしょうか?
390:ハノン
21/10/13 02:24:33.63 YMzdF2UZ.net
>>389
コンパネ→既定のプログラム→ファイルの関連付け
か
設定→アプリ→既定のアプリ→ファイルの種類ごとに
あたりでなんとかならないでしょうか?
391:デフォルトの名無しさん
21/10/13 03:03:01.45 gvBCET4D.net
>>390
回答ありがとうございます。
ファイルの関連付けをメモ帳とVisualstudioしか選べなかったです。(後Microsoftストア)
Notepad++は初期設定結構大変な感じなんでしょうか?
URLリンク(imgur.com)
392:ハノン
21/10/13 19:41:40.64 YMzdF2UZ.net
>>391
たしかに「設定→アプリ→既定のアプリ→ファイルの種類ごとに」
はうまくいかないですね
では、
開きたい拡張子を持ったファイルを右クリック→プログラムから開く→別のプログラムを開く→その他のアプリ→このPCで別のアプリを探す
ではどうですか?
私は win7 メインで、うまいアドバイスができなくてすみません‥‥
393:デフォルトの名無しさん
21/10/19 08:20:19.87 7/3R28mC.net
C++でアプリを作る場合って、QTってやつかMFCって奴を勉強すればいいのでしょうか?
C++でWIN32APIを学ぶっていうのはないですか?
394:デフォルトの名無しさん
21/10/19 10:04:52.66 emsejTNf.net
ないです
395:デフォルトの名無しさん
21/10/19 10:18:17.44 vPA5f3eX.net
あります
396:デフォルトの名無しさん
21/10/19 11:51:03.31 90qj1F6l.net
メッセージループによるイベントドリブン型アプリケーション
「ウインドウ」と「メッセージ」というウインドウズの基本概念ぐらいは理解してもいい
397:デフォルトの名無しさん
21/10/19 19:00:27.41 C9DkQou5.net
tcl/tk
wxWidgets
DXLib
Unity
398:ハノン
21/10/19 20:20:27.92 KyySFZDA.net
>>393
「C++でwin32api」ですか…
そういうのは c で win32api を理解した後、各自が独力で工夫して c++ と win32api とを辻褄あわせするものだと思っていましたが、それはそうと、そういう書籍は過去にありました
たしか leaf というライブラリと WOOL という lisp 処理系が掲載されていた記憶があります
399:デフォルトの名無しさん
21/10/19 22:23:42.02 P+gkhAFH.net
MFC は何十年も前だけど、今もあるの?
QT は、Linux で聞くけど、Windows で使うの?
400:デフォルトの名無しさん
21/10/20 02:20:42.50 +2OzLQ7p.net
>>399
Qt5Core.dllで検索する色々出てくるから、win/macとマルチのアプリなんかで割と使われてみたいね。
手元だとfusion360とかresolveとかで使われてるっぽい。商用ライセンスあるからかな?
401:デフォルトの名無しさん
21/10/20 11:06:18.19 OEiI06HQ.net
5以前は良かったんだがな
402:はちみつ餃子
21/10/20 13:35:36.40 dLyN/sz8.net
>>393
MFC は API の利用をちょっと楽にする薄いラッパーという感じだな。
API のことを忘れて MFC の使い方だけ学べばよいというようなものではない。
>>398
今は C++/WinRT の時代だぞ。