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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.29619 の関連記事表示

<< 0 >>
■29619  構造体の引数渡しについて
□投稿者/ tamaboyo -(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です。
    宜しくお願いします。
親記事 /過去ログ53より / 関連記事表示
削除チェック/

■29621  Re[1]: 構造体の引数渡しについて
□投稿者/ επιστημη -(2008/12/11(Thu) 16:45:11)
>
    ↓こーゆーことがしたいのかな?
    
    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 ♪
    
記事No.29619 のレス /過去ログ53より / 関連記事表示
削除チェック/

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

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

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

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

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

    ありがとうございました。m(_ _)m
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

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

    だがちょっと待ってほしい。
    ref を使うより、戻り値として返したほうが自然じゃなかろうか。
記事No.29619 のレス /過去ログ53より / 関連記事表示
削除チェック/

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

    それか、クラスで実装した方が…
    まぁ、ref でもいいけど。。。
記事No.29619 のレス /過去ログ53より / 関連記事表示
削除チェック/

■29630  Re[3]: 構造体の引数渡しについて
□投稿者/ 魔界の仮面弁士 -(2008/12/11(Thu) 17:15:02)
    No29622 (tamaboyo さん) に返信
    > VBでByValとByRefは知っていたのですが、C#に似たようなものがあるとは知りませんでした。
    "ref" の他に "out" がありますので、あわせて調べておいてください。
    (out 引数は、Double.TryParse メソッドなどで利用されています)


    No29623 (tamaboyo さん) に返信
    > C#にはポインタがないのですね。
    ありますが、今回の場面で使う必要は無いでしょう。
    戻り値(または ref)で十分かと。
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

■29629  Re[5]: 構造体の引数渡しについて
□投稿者/ みきぬ -(2008/12/11(Thu) 17:13:03)
    > それか、クラスで実装した方が…
    >
    これは、オブジェクトの中身を入れ替える感じですかね。

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

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

    で今回の場合、Ceparate(ん、Separate の間違い?) っていうのは引数で渡したものを分割するような処理を連想しますね。
    てことは、分割したものってのは元のオブジェクトとは違うものじゃないかしらねぇ。
    # Split() と同様な感じ…まあ後付けの理屈だけど
記事No.29619 のレス /過去ログ53より / 関連記事表示
削除チェック/

■29633  Re[6]: 構造体の引数渡しについて
□投稿者/ .SHO -(2008/12/11(Thu) 17:42:18)
    No29629 (みきぬ さん) に返信

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

    名称から機能を想像するよりは(単なるサンプルかも知れないですし。
    まぁ、それっぽい名前なので想像どおりだとは思いますが)
    もともとの要求がポインタ渡しを実現することなので
    そういう意味では「オブジェクトの中身を入れ替える」の方が
    正しい気がします。
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

■29627  Re[5]: 構造体の引数渡しについて
□投稿者/ επιστημη -(2008/12/11(Thu) 17:06:04)
>
    > それか、クラスで実装した方が…
    > まぁ、ref でもいいけど。。。

    うん、だから case-by-case ♪
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

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

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

    すいません m(_ _)m
    case-by-case のとこ読む前に書いてました。。。
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

■29620  Re[1]: 構造体の引数渡しについて
□投稿者/ .SHO -(2008/12/11(Thu) 16:40:58)
    No29619 (tamaboyo さん) に返信

    基本的には C# にポインタ渡しはありません。
    構造体ではなくクラスを使用してください。
記事No.29619 のレス /過去ログ53より / 関連記事表示
削除チェック/

■29623  Re[2]: 構造体の引数渡しについて
□投稿者/ tamaboyo -(2008/12/11(Thu) 16:55:16)
    No29620 (.SHO さん) に返信

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

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

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

    アドバイス、ありがとうございました。
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

■29625  Re[3]: 構造体の引数渡しについて
□投稿者/ επιστημη -(2008/12/11(Thu) 16:59:53)
>
    > ref を使うより、戻り値として返したほうが自然じゃなかろうか。

    わしもそーおもぅ
    case-by-caseだけどねー
記事No.29619 のレス /過去ログ53より / 関連記事表示
削除チェック/

■29636  Re[4]: 構造体の引数渡しについて
□投稿者/ .SHO -(2008/12/11(Thu) 17:48:14)
    いや、違いますね。ごめんなさい。

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

    失礼しました。
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/

■29640  Re[5]: 構造体の引数渡しについて
□投稿者/ みきぬ -(2008/12/11(Thu) 18:29:48)
    「ちょっと待て その参照(渡し)は 必要か?」

    てのを記憶の片隅にでも留めておいてもらえば、と。
記事No.29619 のレス / END /過去ログ53より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -