X



C#, C♯, C#相談室 Part94
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 935f-5Uxj)
垢版 |
2019/03/20(水) 18:57:36.47ID:ZZcTomnN0
!extend:checked:vvvvv:1000:512
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part93
http://mevius.5ch.net/test/read.cgi/tech/1492818720/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0010デフォルトの名無しさん (ワッチョイ 233e-8H9x)
垢版 |
2020/04/06(月) 10:39:04.32ID:dJUJ6mUM0
public struct Hoge
{
public int a = 123;
public int b = 456;
}
でだめ?
0011デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 10:39:59.95ID:TxMJ3ToxF
コンパイルエラーになります
0012デフォルトの名無しさん (ワッチョイ 233e-8H9x)
垢版 |
2020/04/06(月) 10:45:59.32ID:dJUJ6mUM0
残念です。あきらめてclassにしませう。
0013デフォルトの名無しさん (ワッチョイ 0d0c-bVUD)
垢版 |
2020/04/06(月) 10:58:20.70ID:sF8ihuq40
暗黙的な既定のコンストラクタが挿入されないようにとのC#コンパイラの最適化の都合
特に回避策はない

標準ライブラリで

struct Vector3 {
 ...
 public static Vector3 Up = new Vector3(0, 1, 0);
}

みたいなのはある
0014デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 12:06:20.02ID:TxMJ3ToxF
レスくれたひととワッチョイ似てるけど別人です念のため
0015デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 12:11:49.60ID:TxMJ3ToxF
>>13
あまり有難みが無いですが・・・とりあえずレスくれたみなさんありがとう
class にしたくない理由は struct のネストをしたいのと
そのとき struct を Marshal.StructureToPtr して使いたいのですが
ネストの内側に class が含まれてると not blittable とか出て困ってるんです
001915 (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 15:36:35.10ID:TxMJ3ToxF
すみません間違いました
not blittable が出るのは
struct s2 の中に class c1 があるとして
GCHandle h = GCHandle.Alloc(s2, GCHandleType.Pinned);
IntPtr ptr = hndl.AddrOfPinnedObject();
// ptr を利用
h.Free();

ちなみに
struct s2 の中に struct s1 があるとして
同じことをしたときは問題無いです
0020デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 15:40:47.44ID:TxMJ3ToxF
>>18
struct を定義するときにメンバに class があるとき
その class を blittable にする方法を知りたいです
0021デフォルトの名無しさん (ワッチョイ 0d0c-bVUD)
垢版 |
2020/04/06(月) 16:24:25.71ID:sF8ihuq40
そのclassの内容によるとしか…
無制限にマーシャリングできるわけでもないし
classのメンバがblittableならそのままstructにすりゃいいだけだけど

参考になるか知らんがstringを含む場合

[StructLayout(LayoutKind.Sequential)]
struct Foo {
 public int id;
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
 public string name;
}

class Program {
 static void Main(string[] args) {
 var sizeInBytes = Marshal.SizeOf<Foo>();
 Console.WriteLine($"SizeOf={sizeInBytes}");

 var coTaskMem = Marshal.AllocCoTaskMem(sizeInBytes);

 var foo = Marshal.PtrToStructure<Foo>(coTaskMem);

 foo.name = "John";
 Console.WriteLine(foo.name);

 Marshal.DestroyStructure<Foo>(coTaskMem);

 Marshal.FreeCoTaskMem(coTaskMem);
 }
}
0022デフォルトの名無しさん (アウウィフ FFe9-8H9x)
垢版 |
2020/04/06(月) 16:44:22.28ID:TxMJ3ToxF
>>21
そもそも内側は struct で充分なんですが
初期値を入れたいのでそのためには class でないといけないとしたら
class にするとエラーになるのでやっぱり困るっていう話です
struct でデフォルト値入れられないと割り切れば済む話です
0023デフォルトの名無しさん (ワッチョイ cb84-S3x4)
垢版 |
2020/04/06(月) 18:03:23.76ID:7X8pPa4E0
2度手間っていうか面倒くさいけどStructureToPtrでバイトストリームに一括で変換するのが
目的ならば、外に見せる部分はclassで作っておいて中にstructを定義する
structの要素にはプロパティでget/setする初期値はclassのコンストラクタで設定
classにバイトストリームを取り出す(StructureToPtrに絡むロジック)メソッドかプロパティを
定義するみたいなのじゃダメなのかな
class point {
 public point () {
  x = 0;
  y = 0;
 }

 private _point _Struct;
 public int x {
  get { return _Struct.x; }
  set { _Struct.x = value; }
 }
 public int y {
  get { return _Struct.y; }
  set { _Struct.y = value; }
 }
 public byte[] bytestream {
  get { return structToPtrFunc(_Struct); }//メソッドは別途作成
 }

 [StructLayout(LayoutKind.Sequential)]
 private struct _point {
  int x;
  int y;
 }
}
0024デフォルトの名無しさん (エムゾネ FF43-8H9x)
垢版 |
2020/04/07(火) 10:26:44.15ID:KScFPzRrF
むしろ StructureToPtr を使いたくないっていう話です
やりたいのはこっちです
GCHandle h = GCHandle.Alloc(s, GCHandleType.Pinned);
IntPtr ptr = h.AddrOfPinnedObject();
// ptr 操作
h.Free();
途中のレスで一回変な事を書いてしまったので混乱させてごめんなさい
0025デフォルトの名無しさん (エムゾネ FF43-8H9x)
垢版 |
2020/04/07(火) 10:30:31.32ID:KScFPzRrF
意図は「無駄なコピーを極力避けたい」です
0027デフォルトの名無しさん (ワッチョイ 0d0c-bVUD)
垢版 |
2020/04/07(火) 13:31:26.68ID:10XGXpve0
意図がそれならそもそもなんで親に値型使ってんのってところまで後退しちゃうぞ
値型にGCHandleのピン付けってそこだけ見ると意味不明だし
省略している「ptr操作」の内容次第では初っ端からアプローチを間違えてる可能性がある
0028デフォルトの名無しさん (ワッチョイ 2b7c-Wy2p)
垢版 |
2020/04/07(火) 13:56:15.48ID:xToLYP7L0
Cの構造体って構造体の中に別の構造体入れてもコピーが発生する訳じゃない
(子の構造体をいちいち作る訳じゃないから)
C#をCと同じと思わない方が良い
0029デフォルトの名無しさん (ワッチョイ 0d61-8D+7)
垢版 |
2020/04/07(火) 18:25:34.04ID:hoGla/3+0
>>28
C#の場合、classは、Heapに実態を確保して変数は参照型で、
structは、スタックなどに実態を確保して、変数は値型だと
聞きました。
C++は、strucとclassは、protected/public などのaccess control以外に
違いが無いこととは対照的です。
というわけで、C#の場合でも、structに関しては別のstructの中に入れた場合
は、C++と同じような動作なのではないかと思われます。
0031デフォルトの名無しさん (オッペケ Sr8d-Cmpq)
垢版 |
2020/05/27(水) 18:07:50.45ID:LUVXPnpcr
質問いいですか?
C#のアセンブリの読み込みってどういう手順で行われてるんですか?
同じバージョンの.net core から.net coreを呼び出してるのにTypeIntializationExceptionが発生します
たぶん正しいアセンブリが読み込めてないのだと思うのですが、アセンブリの読み込みタイミングやバージョンを指定することは可能なのでしょうか
0032デフォルトの名無しさん (オッペケ Sr8d-Cmpq)
垢版 |
2020/05/27(水) 18:29:21.50ID:LUVXPnpcr
上のお話見てると突き詰めれば値型と参照型の定義の問題になってきそう
C#の構造体は中に値型以外を詰め込むとその部分はCレベルで言うポインタのポインタを保持する形になってコピー時の挙動以外はclassと大差ないものになっちゃうよね
ポインタのポインタの値型だと言えばそうなのかもしれないけど
0034デフォルトの名無しさん (ワッチョイ 5350-Cmpq)
垢版 |
2020/05/27(水) 23:51:33.69ID:LGEhqROa0
参照してるdllにエントリポイントがないと言われるだけでそれ以上検索してもなにも出てこないです

こう聞いた方がいいのかもしれないです
.net frameworkの時は自前でシステムのアセンブリ参照できましたが
.net coreにも似たような仕組みはあるのでしょうか

こういうアセンブリ関係の問題は.net frameworkの時は自前で参照加えたらできたんですけど
.net coreになってフレームワーク二つしか選択肢がなくなって細かい参照が出来なくなってますがそれはどこがどういう風に解決してるのでしょうか?

特定のライブラリが使いたいというよりそこら辺の内部仕様が知りたいです
0035デフォルトの名無しさん (ワッチョイ 5350-Cmpq)
垢版 |
2020/05/27(水) 23:59:10.55ID:LGEhqROa0
あ、アセンブリが読み込めてないと思った一番の理由はdllでなくプロジェクトにcsで組み込んだらちゃんと動いたからです
そういう意味で言語レベルでのミスはないです
0036デフォルトの名無しさん (アウアウエー Sa23-1zQY)
垢版 |
2020/05/28(木) 11:28:38.46ID:vYrFHFhya
csc -reference:(.NetCoreのpath) hoge.cs でいけるよ
0037デフォルトの名無しさん (ワッチョイ 99da-e++8)
垢版 |
2020/08/09(日) 14:22:49.34ID:wMn4aE4e0
WindowsFormで写真データ取り込みを作ってるんですが、
DriveInfo.GetDrives()してもWindows10に接続して認証したあとの
iPhoneのドライブが読み取れず・・・
どうにか拾えないもんでしょうか?
0040デフォルトの名無しさん (スッップ Sd33-KRae)
垢版 |
2020/08/10(月) 07:48:42.24ID:sJEhM+RBd
>>38 >>39
ありがとうございます
よく調べてみます
0044デフォルトの名無しさん (ワッチョイ e52f-++7W)
垢版 |
2020/08/16(日) 15:05:57.24ID:fvXawAJc0
機器構成の設定を記載したconfigファイルをアプリ上で作成して、
アプリ実行時にconfigの内容を変数に読み込むことを行おうと思ってます。

configファイルって普通どんなふうに書くんだろうと思って、
あるアプリのconfigファイルを覗いてみたところ下のような感じになっていました。

[Config]
StartUpLeft=-2147483648
StartUpTop=-2147483648
StartUpWidth=640
StartUpHeight=480
SaveWindowPosSize=1
SaveWindowRectLeft=597
SaveWindowRectRight=3645
SaveWindowRectTop=1256
SaveWindowRectBottom=3436
SaveWindowMaximize=0

このテキストファイルを
string line = sr.ReadLine();
// 読み込んだ一行をカンマ毎に分けて配列に格納する
string[] values = line.Split('=');

とすると偶数のvaluesに値が入ってるからこれを使用するみたいな感じでOK?
〇〇できちっと書けやぁ!みたいな形式があったら教えて下さい。
0046デフォルトの名無しさん (ワッチョイ e52f-++7W)
垢版 |
2020/08/16(日) 15:30:58.63ID:fvXawAJc0
>>45
ググってみましたが難しい・・・。

アプリ内で変数を10個ぐらいもっていて
int hoge1=100
int hoge2=12


これをテキストファイルに保存し、必要なときに
int hoge1=100
int hoge2=12
にアプリ内で戻したいのですが、簡単に実現出来る方法があればいいなと思ったのですが・・・。
0047デフォルトの名無しさん (アウウィフ FFa5-jwrZ)
垢版 |
2020/08/16(日) 15:39:24.55ID:43uVw8aVF
msgpack
0048デフォルトの名無しさん (アウウィフ FFa5-jwrZ)
垢版 |
2020/08/16(日) 15:39:24.66ID:43uVw8aVF
msgpack
0049デフォルトの名無しさん (ワッチョイ 4201-eTOa)
垢版 |
2020/08/16(日) 15:59:09.65ID:7n2hwSPz0
>>44
その形式は ini ファイルなので C# ini ファイルでググれば事例がいっぱい出てくるよ
基本はWin32APIのGetPrivateProfileString( )とかを使う
もし設定ファイルの形式をこれから決められるならjsonおすすめ
DataContractJsonSerializerクラスを使えば読み書きも簡単だし
0051デフォルトの名無しさん (アウウィフ FFa5-jwrZ)
垢版 |
2020/08/16(日) 18:15:38.13ID:43uVw8aVF
SQLiteも良いぞ
0053デフォルトの名無しさん (ワッチョイ e52f-++7W)
垢版 |
2020/08/16(日) 22:09:22.28ID:fvXawAJc0
なんかどんどん難しくなってきました。
最近だxmlで書くのがデフォルトなんでしょうか・・・。
iniで書くのも結構荷が重い、気合い入れて勉強するべきか・・・。
0054デフォルトの名無しさん (ワッチョイ 426a-p5K4)
垢版 |
2020/08/16(日) 22:11:13.68ID:k/QA8A3q0
>>53
>52 でggr
0058デフォルトの名無しさん (ワッチョイ 7197-9ujE)
垢版 |
2020/08/17(月) 00:14:03.00ID:FrBqpQ/k0
xmlはめんどくさすぎるから、DTDでちゃんと定義したいとかじゃなかったら使いたくないな。もちろんケースバイケースなのはそうだけど。
改行区切り、タブ区切りとかもまだまだ場合によっては使うしね。
0059デフォルトの名無しさん (ワッチョイ e5da-QFj7)
垢版 |
2020/08/17(月) 01:29:02.95ID:U9ZmQUIp0
カンマ区切りと固定長のまざった独自糞フォーマットでのIO書いたことはあるけど、自由に出来る時はjsonかxml
大体はjsonだけど、きちんと定義したデータ使いたいときにRelaxNGで定義してXMLで書いたことはある。
0060デフォルトの名無しさん (ワッチョイ dd5f-c+0i)
垢版 |
2020/08/17(月) 10:22:34.64ID:L1BKvkJB0
些細な枝葉で悩む時間あったら
本体のプログラムで悩め
0068デフォルトの名無しさん (ワッチョイ 1f5f-YpYZ)
垢版 |
2020/08/20(木) 00:21:28.68ID:r1uYCcYS0
ちょっとくだらない質問で申し訳ないんだけど
構造体の定義のソースってどうしてる?

クラス内に通信電文用の構造体をいっぱい作ったのだけど
ソースがでかくなっちゃうからpartial使ってわけた方がいいのか
あくまで一個のソース内にまとめるか・・・
0071デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 11:24:45.34ID:RX/3qqm6F
設計を見直す
0072デフォルトの名無しさん (ワッチョイ 1f02-WzHs)
垢版 |
2020/08/20(木) 19:14:02.34ID:3p9OuWNz0
分割しようかと迷う規模なら分割もありだと思う。
ベース部分は独立させて、機能毎に実装ファイルの頭に使用する下位レベルの電文を定義する。
電文は全部まとめるか?分割するか?ケースバイケースだね。
0074デフォルトの名無しさん (ワッチョイ 7f6a-YpYZ)
垢版 |
2020/08/21(金) 00:57:13.38ID:Gtp12ERl0
>>68
クラス内に作らないで独立させれば良いのでは?
0076デフォルトの名無しさん (ワッチョイ ff8f-YpYZ)
垢版 |
2020/08/24(月) 21:06:09.96ID:RikpSc+F0
xamarin でTDDを勉強してるんだけど、

public event PropertyChangedEventHandler PropertyChanged;

この PropertyChanged 自体がnullになって例外で終わるのって
どういうパターンがあるんだろう・・・。

勉強したいことと全く別のところで長期足止め。わっけわからん状態。
0080デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/25(火) 10:33:43.97ID:Zt9gBA2MF
ここで質問するより
直接ちょまどにツイートしろって意味かな?
返事来るかどうか知らんけど
0081デフォルトの名無しさん (ワッチョイ ae8f-1etN)
垢版 |
2020/08/26(水) 15:08:57.61ID:7Xms6Gwm0
>>78
ありがとう。どうやら「どっかが+=してくれる」っていう前提なんだね、これ。

PropertyChanged?.invoke(this, e);

で呼び出したら動いた。現役じゃなくなって長いもんで(趣味のプログラム)、
このへんの書き方に苦労するなあ。
0085デフォルトの名無しさん (ワッチョイ 452f-JI6e)
垢版 |
2020/08/27(木) 23:21:35.12ID:dU9vSxaE0
フォームアプリで
フォームAで検査をして、検査終了後に

「データを記録しますか?」
「はい」「いいえ」
というウインドウを表示して、
「はい」ならデータ記録
「いいえ」ならデータ廃棄

としたいです。
0086デフォルトの名無しさん (ワッチョイ 452f-JI6e)
垢版 |
2020/08/27(木) 23:23:39.98ID:dU9vSxaE0
データはフォームAにあるので、

1. フォームAからフォームBを開く
2. フォームBは「はい」「いいえ」を戻り値としてAに渡す
3. フォームAでデータ記録、データ廃棄の処理を行う

みたいな処理でいいのでしょうか?
それとももっとよいやり方がありますか?
0088デフォルトの名無しさん (ワッチョイ 452f-JI6e)
垢版 |
2020/08/28(金) 00:27:25.73ID:ljA+yCxF0
ありがとうございます。
これですね。

なんかフォーム新たに作るとかこんなめんどくさいことしなきゃいけないのか?
と疑問に思ってたんですが、聞いてよかったです。
ありがとうございます。
明日実装してみます。
0090デフォルトの名無しさん (ワッチョイ 7f2f-Q6Op)
垢版 |
2020/09/02(水) 22:47:24.65ID:uEUYmCsp0
C#からpythonのプログラムをコマンドライン引数hoge付きで実行したのですが、

System.Diagnostics.Process.Start("python.exe", @"""L:\main.py hoge""")

とやっても実行できません。
なにかより方法ないでしょうか?
0096デフォルトの名無しさん (ワッチョイ 0701-3NJ+)
垢版 |
2020/09/04(金) 01:43:56.80ID:bkNZTAxK0
var sb = new StringBuilder();
var c = 'a';
while (true)
sb.Append(c);

これで一番下の行に破棄'_'を使用っていうVSによるヒントが出てくるんだけど、
こういう場合の破棄って使用する場合としない場合でどういう違いがあるの?
0097デフォルトの名無しさん (ワッチョイ 0701-XrX+)
垢版 |
2020/09/04(金) 03:29:44.58ID:TqZk/BuV0
>>96
破棄は、未割り当ての変数と同等です。つまり、値がありません。
破棄変数は 1 つのみであり、破棄変数には記憶域も割り当てられないため、破棄を使用するとメモリの割り当てを減らすことができます。
また、コードの意図がわかりやすくなるため、読みやすさと保守性が向上します。
0104デフォルトの名無しさん (ワッチョイ 11da-K//f)
垢版 |
2020/09/13(日) 12:05:22.97ID:/5CZgoyc0
LINQの話題になってるから聞きたいんですが、LINQって結構遅い?
ベンチマークとって襲いって主張してるブログとかはあるけど、実業務で遅さを実感する事ってどのくらいある?
0105デフォルトの名無しさん (ワッチョイ 11da-SlgL)
垢版 |
2020/09/13(日) 12:15:27.66ID:pEIp8weP0
LINQ使わないで書くよりも遅いことは遅いんだけど、経験的にはあんまり問題にはならなかった
実際に使ってみてどうしてもLINQ使ってる辺りでネックになるようなら、
そこだけ書き直す感じでいいと思う
0106デフォルトの名無しさん (ワッチョイ 3dad-Q/Xd)
垢版 |
2020/09/13(日) 12:21:40.35ID:tOkSvJ4p0
Linq使ったほうが楽に高速化できることもあるし、場合場合じゃないかな。
PLINQは良くコア数指定せずにぶん回して「遅い」って言ってる奴いるけど、コア数指定したら割と良い線行く。
0107デフォルトの名無しさん (ワッチョイ 6663-9dCp)
垢版 |
2020/09/13(日) 15:15:56.81ID:SPHVq8sr0
処理速度が求められるような部分だとネックになってると感じることもある
シミュレーションみたいなのね
そういうの以外では全く気にならない
どうせ処理速度より通信やファイル読み書きのほうが圧倒的に時間かかるから
■ このスレッドは過去ログ倉庫に格納されています

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