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

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

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

Re[4]: C#の演算について


(過去ログ 10 を表示中)

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

■1585 / inTopicNo.1)  C#の演算について
  
□投稿者/ ann (3回)-(2007/02/28(Wed) 00:38:49)

分類:[C# (Windows)] 

またまたなんどもすみません。
以前にも質問したのですが、もしC++のように

main()
{
double* p;

swap(p+2,p);    //この引数

}

swap(double* a,double* b)
{
double c;
c=*a;
*a=*b;
*b=c;
}

このようにしたいときはC#に書き換えると
private void()
{
double[] p=new double[10];

swap(p+2,p);    //この引数はどうすればよいでしょうか?

}

unsafe swap(double* a,double* b)
{
double c;
c=*a;
*a=*b;
*b=c;
}

C#だとp+2のような演算はできないのですよね?


引用返信 編集キー/
■1587 / inTopicNo.2)  Re[1]: C#の演算について
□投稿者/ Blue (277回)-(2007/02/28(Wed) 00:59:17)
2007/02/28(Wed) 01:02:16 編集(投稿者)
そろそろ、まともなタイトルつけれませんか?
また、質問ごとにハンドルをコロコロ変えるべきではないでしょう。

何のためにポインタで渡しているのか理解できればC#ではどう対応するか見えるはずです。
(というかC++なら参照で渡したほうがわかりやすいと思うが。)

class Sample1
{
    static void Main(string[] args)
    {
        double a = 10.0, b = 20.0;

        System.Console.WriteLine("before: a = {0}, b = {1}", a, b);
        swap(ref a, ref b);
        System.Console.WriteLine("after : a = {0}, b = {1}", a, b);

        double[] p = new double[10];
        for (int i = 0; i < p.Length; ++i)
            p[i] = i;

        System.Console.WriteLine("before: p[2] = {0}, p[0] = {1}", p[2], p[0]);
        swap(ref p[2], ref p[0]);
        System.Console.WriteLine("after : p[2] = {0}, p[0] = {1}", p[2], p[0]);
    }

    static void swap(ref double x, ref double y)
    {
        double temp = x;
        x = y;
        y = temp;
    }
}


というか、ここら辺はC#の基礎中の基礎でしょう。
きちんと入門書等で学ばれることを進めます。

毎回掲示板に頼れば、なんとかなる、基礎なんて面倒って考えは決してしないでください。

引用返信 編集キー/
■1592 / inTopicNo.3)  Re[2]: C#の演算について
□投稿者/ ann (5回)-(2007/02/28(Wed) 10:25:38)
No1587 (Blue さん) に返信
> 2007/02/28(Wed) 01:02:16 編集(投稿者)
申し訳ありませんでした。
以後気をつけたいと思います。

はい、引数が10.0やp[1]のようなときはできるのですが
このswapの中の引数が
double[] p=new double[10];
のような配列で先頭アドレスの
swap(p+2,p);
のようだとできないですよね?
C++のようにp+2はできないでしょうか?
引用返信 編集キー/
■1593 / inTopicNo.4)  Re[3]: C#の演算について
□投稿者/ Blue (278回)-(2007/02/28(Wed) 10:31:25)
No1592 (ann さん) に返信
> ■No1587 (Blue さん) に返信
>>2007/02/28(Wed) 01:02:16 編集(投稿者)
> 申し訳ありませんでした。
> 以後気をつけたいと思います。
>
> はい、引数が10.0やp[1]のようなときはできるのですが
> このswapの中の引数が
> double[] p=new double[10];
> のような配列で先頭アドレスの
> swap(p+2,p);
> のようだとできないですよね?
> C++のようにp+2はできないでしょうか?
できない。

C言語では

p + 2



&p[2]

ってのは理解できていますか?

で、なんでポインタ渡ししているのか理解できますか?
そうすればおのずと ref を指定すればいいとわかるはずですけど。
引用返信 編集キー/
■1594 / inTopicNo.5)  Re[3]: C#の演算について
□投稿者/ επιστημη (419回)-(2007/02/28(Wed) 10:34:42)
επιστημη さんの Web サイト
> このswapの中の引数が
> double[] p=new double[10];
> のような配列で先頭アドレスの
> swap(p+2,p);
> のようだとできないですよね?

p+2に意味がないから無理っしょ。

C++で
void swap(double& x, double& y) {
  double tmp = x;
  x = y;
  y = temp;
}
って書いたなら swap(p[2], p[0]) って呼ぶっしょ。

これとコンパチなのをC#で書いたのが
void swap(ref double x, ref double y)
なわけです。

> C++のようにp+2はできないでしょうか?

上記のではマズい事情があるんかしら?
よーするになにがしたいのでしょ? 

引用返信 編集キー/
■1600 / inTopicNo.6)  Re[4]: C#の演算について
□投稿者/ あん (6回)-(2007/02/28(Wed) 12:41:01)
No1593 (Blue さん) に返信
> ■No1592 (ann さん) に返信
>>■No1587 (Blue さん) に返信
> >>2007/02/28(Wed) 01:02:16 編集(投稿者)
>
はい、納得できました。
どうもありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -