C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 構造体の引数渡しについて


(過去ログ 53 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■29619 / inTopicNo.1)  構造体の引数渡しについて
  
□投稿者/ tamaboyo (5回)-(2008/12/11(Thu) 16:29:05)

分類:[C#] 

tamaboyoです。

関数Aから関数Bを呼び出す際に引数として構造体を渡し、
関数Bで値を格納して、その値を関数Aで参照しようとしています。
今、関数Bで値を格納はできるのですが、Bを抜けて関数Aに戻ってくると、値がNullになっています。

Item型の構造体を引数として渡す際にそのまま渡していたので、
#private void Ceparate(Item nSepa)
"nSepa"の部分に"*"を付けてポインタ渡しにしようとしたところ、
「ポインタおよび固定サイズバッファは、unsafeコンテキストでのみ使用することができます」
とエラーメッセージが表示されました。

unsafeについて調べたところ、宣言とプロジェクトの設定を行えば使えるようになるとのことですが、
設定なしでC#ではポインタ渡しはできないのでしょうか?
また、設定をせずに値のやり取りをすることはできないのでしょうか?

開発環境は、XP+SP2、VS2005です。
宜しくお願いします。
引用返信 編集キー/
■29620 / inTopicNo.2)  Re[1]: 構造体の引数渡しについて
□投稿者/ .SHO (379回)-(2008/12/11(Thu) 16:40:58)
No29619 (tamaboyo さん) に返信

基本的には C# にポインタ渡しはありません。
構造体ではなくクラスを使用してください。
引用返信 編集キー/
■29621 / inTopicNo.3)  Re[1]: 構造体の引数渡しについて
□投稿者/ επιστημη (1455回)-(2008/12/11(Thu) 16:45:11)
επιστημη さんの Web サイト
↓こーゆーことがしたいのかな?

public struct KooZooTai {
  public int x;
  public int y;
}

public class Program {

  static void Settee(ref KooZooTai kzt) {
    kzt.x = 123;
    kzt.y = 456;
  }
  
  public static void Main() {
    KooZooTai kzt = new KooZooTai();
    kzt.x = 0; kzt.y = 0;
    System.Console.WriteLine("before: {0} {1}", kzt.x, kzt.y);
    Settee(ref kzt);
    System.Console.WriteLine("after : {0} {1}", kzt.x, kzt.y);
  }
}

# キモは ref ♪

引用返信 編集キー/
■29622 / inTopicNo.4)  Re[2]: 構造体の引数渡しについて
□投稿者/ tamaboyo (8回)-(2008/12/11(Thu) 16:53:54)
No29621 (επιστημη さん) に返信

επιστημη さん、ありがとうございます。

> ↓こーゆーことがしたいのかな?

はい、まさにそういうことです!
すっきり解決しました。

VBでByValとByRefは知っていたのですが、C#に似たようなものがあるとは知りませんでした。
なるほど、勉強になりました。

ありがとうございました。m(_ _)m
解決済み
引用返信 編集キー/
■29623 / inTopicNo.5)  Re[2]: 構造体の引数渡しについて
□投稿者/ tamaboyo (9回)-(2008/12/11(Thu) 16:55:16)
No29620 (.SHO さん) に返信

.SHO さん、ありがとうございます。

> ■No29619 (tamaboyo さん) に返信
>
> 基本的には C# にポインタ渡しはありません。
> 構造体ではなくクラスを使用してください。

C#にはポインタがないのですね。
てっきりあるものだと思いこんでいました。

アドバイス、ありがとうございました。
解決済み
引用返信 編集キー/
■29624 / inTopicNo.6)  Re[3]: 構造体の引数渡しについて
□投稿者/ みきぬ (295回)-(2008/12/11(Thu) 16:55:43)
No29622 (tamaboyo さん) に返信
> VBでByValとByRefは知っていたのですが、C#に似たようなものがあるとは知りませんでした。
> なるほど、勉強になりました。
>
> ありがとうございました。m(_ _)m

だがちょっと待ってほしい。
ref を使うより、戻り値として返したほうが自然じゃなかろうか。
引用返信 編集キー/
■29625 / inTopicNo.7)  Re[3]: 構造体の引数渡しについて
□投稿者/ επιστημη (1456回)-(2008/12/11(Thu) 16:59:53)
επιστημη さんの Web サイト
> ref を使うより、戻り値として返したほうが自然じゃなかろうか。

わしもそーおもぅ
case-by-caseだけどねー

引用返信 編集キー/
■29626 / inTopicNo.8)  Re[4]: 構造体の引数渡しについて
□投稿者/ .SHO (380回)-(2008/12/11(Thu) 17:03:04)
> だがちょっと待ってほしい。
> ref を使うより、戻り値として返したほうが自然じゃなかろうか。

それか、クラスで実装した方が…
まぁ、ref でもいいけど。。。
引用返信 編集キー/
■29627 / inTopicNo.9)  Re[5]: 構造体の引数渡しについて
□投稿者/ επιστημη (1457回)-(2008/12/11(Thu) 17:06:04)
επιστημη さんの Web サイト
> それか、クラスで実装した方が…
> まぁ、ref でもいいけど。。。

うん、だから case-by-case ♪

解決済み
引用返信 編集キー/
■29628 / inTopicNo.10)  Re[6]: 構造体の引数渡しについて
□投稿者/ .SHO (381回)-(2008/12/11(Thu) 17:10:56)
No29627 (επιστημη さん) に返信

> うん、だから case-by-case ♪

すいません m(_ _)m
case-by-case のとこ読む前に書いてました。。。
解決済み
引用返信 編集キー/
■29629 / inTopicNo.11)  Re[5]: 構造体の引数渡しについて
□投稿者/ みきぬ (296回)-(2008/12/11(Thu) 17:13:03)
> それか、クラスで実装した方が…
>
これは、オブジェクトの中身を入れ替える感じですかね。

> まぁ、ref でもいいけど。。。
>
こっちは、オブジェクトそのものを差し替える感じですかね。

> 戻り値として返す方法
>
こいつは、引数のオブジェクトと別なものを返す感じですかね。

で今回の場合、Ceparate(ん、Separate の間違い?) っていうのは引数で渡したものを分割するような処理を連想しますね。
てことは、分割したものってのは元のオブジェクトとは違うものじゃないかしらねぇ。
# Split() と同様な感じ…まあ後付けの理屈だけど
引用返信 編集キー/
■29630 / inTopicNo.12)  Re[3]: 構造体の引数渡しについて
□投稿者/ 魔界の仮面弁士 (946回)-(2008/12/11(Thu) 17:15:02)
No29622 (tamaboyo さん) に返信
> VBでByValとByRefは知っていたのですが、C#に似たようなものがあるとは知りませんでした。
"ref" の他に "out" がありますので、あわせて調べておいてください。
(out 引数は、Double.TryParse メソッドなどで利用されています)


No29623 (tamaboyo さん) に返信
> C#にはポインタがないのですね。
ありますが、今回の場面で使う必要は無いでしょう。
戻り値(または ref)で十分かと。
解決済み
引用返信 編集キー/
■29633 / inTopicNo.13)  Re[6]: 構造体の引数渡しについて
□投稿者/ .SHO (382回)-(2008/12/11(Thu) 17:42:18)
No29629 (みきぬ さん) に返信

> で今回の場合、Ceparate(ん、Separate の間違い?) っていうのは引数で渡したものを分割するような処理を連想しますね。
> てことは、分割したものってのは元のオブジェクトとは違うものじゃないかしらねぇ。
> # Split() と同様な感じ…まあ後付けの理屈だけど

名称から機能を想像するよりは(単なるサンプルかも知れないですし。
まぁ、それっぽい名前なので想像どおりだとは思いますが)
もともとの要求がポインタ渡しを実現することなので
そういう意味では「オブジェクトの中身を入れ替える」の方が
正しい気がします。
解決済み
引用返信 編集キー/
■29636 / inTopicNo.14)  Re[4]: 構造体の引数渡しについて
□投稿者/ .SHO (383回)-(2008/12/11(Thu) 17:48:14)
いや、違いますね。ごめんなさい。

そのまま渡すと値が変わらないから、ポインタにしてみたけど
コンパイルで怒られたって言ってるんですね。

失礼しました。
解決済み
引用返信 編集キー/
■29640 / inTopicNo.15)  Re[5]: 構造体の引数渡しについて
□投稿者/ みきぬ (297回)-(2008/12/11(Thu) 18:29:48)
「ちょっと待て その参照(渡し)は 必要か?」

てのを記憶の片隅にでも留めておいてもらえば、と。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -