![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
C# 2010 version 4.0を使用しています。
下のコードでは、
class1のメンバ変数のkのアドレスを取得してポインタ変数aに参照させたいと思っているのですが、
「fixed ステートメントの初期化子内の fixed でない式のアドレスのみを取得できます。」
というようなエラーがでてしまいます・・・
これはどのように記述したら解決できるのでしょうか?
class class1
{
private int k = 1;
unsafe public void Bind(int* i)
{
i = &(this.k);//この部分がエラー
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
c.Bind(a);
Console.WriteLine(*a); // 1が表示されたい
Console.ReadLine();
}
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
> たしかにこれだとできるのですが、
> クラスのメンバ変数を使うと先ほどのようなエラーがでてまいます・・・
アドレスを解決できないですからね。
…だけで終わったらどうします?また聞くんですか?
しかも「でてまいます」って誤字だし。
聞きたいのであれば、ちゃんと聞きましょう。
確かに「聞きたいであろう」ということは分かりますが、
もう少し丁寧に「聞く」ことを心がけましょう!
(少し不快に感じたのであえて言っています。)
取り敢えずこんな感じなら簡単ですがやりたいことが実現できてますか?
コンパイルだけなら通るハズです。
(というかNo.3の内容をよく考えれば分かりそうですが…)
class class1
{
private int k = 1;
unsafe public void Bind(int* i)
{
int localK = k;
i = &localK;
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
c.Bind(a);
Console.WriteLine(*a);
Console.ReadLine();
}
}
(せっかくポインタの概念を外したC#で)何を実現されたいのか分かりませんが、
通常のC#と違いポインタを使用する場合はアドレスの概念が発生します。
それを念頭に置かないと、同様の理由によるエラーが発生します。
それと、この感じだとNullReferenceExceptionについても聞かれそうなので
先に回答しておきます。(上記コードを実行すると発生します)
理由は参照渡しではなく値渡しになっているからです。
(なぜ値渡しか…等はアドレスの概念と合わせて勉強して下さい)
なので、実際に期待されるコードにするのであれば
以下のようなコードでないといけません。
class class1
{
private int k = 1;
unsafe public int* Bind()
{
int localK = k;
return &localK;
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
a = c.Bind();
Console.WriteLine(*a);
Console.ReadLine();
}
}
このコードであれば、取り敢えず「1」と表示されます。
取り敢えずこのサイト辺りから初めて
http://ufcpp.net/study/csharp/sp_unsafe.html
よく分からないのであれば書籍の購入も検討しましょう。
ご回答ありがとうございます。
気分を害されたのなら、申し訳ございません。
自分の求めてる結果と違うようなので、もう少し質問させて頂きたいのですが、
今の自分のレベルではポインタについてしっかり理解するまで時間がかかりそうですので、
とりあえずこれで質問を締め切りたいと思います。
No.3
- 回答日時:
すいません、最初のは忘れて下さい。
こうです。
class class1
{
unsafe public void Bind(int* i)
{
int k = 1;
i = &k;
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
c.Bind(a);
Console.WriteLine(*a);
Console.ReadLine();
}
}
これで取り敢えず実行はできるハズです。
結果は…
ご回答ありがとうございます。
たしかにこれだとできるのですが、
クラスのメンバ変数を使うと先ほどのようなエラーがでてまいます・・・
No.2
- 回答日時:
はわゎ…
「fixed ステートメントの初期化子内の fixed でない式のアドレスのみを取得できます。」
だけ読んで回答しちゃいました。
大変申し訳ありません。
> i = &(this.k);//この部分がエラー
kがフィールド変数(メンバ変数?)だからですね。
unsafe public void Bind(int* i)内に
int k = 1;
と書いてあげればOKなハズです。
フィールド変数(メンバ変数?)だと「いや、ドコだし」って怒ってるワケです。
ご回答ありがとうございます。
こうですか?
int k = 1;
fixed (i = &k) { }
これでも「IDがありません」というエラーです・・・
=のところにエラーが出てるようなのですが
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
C++ クラスをメンバにもつクラ...
-
intとINTの違いは?
-
構造体の宣言でエラーが出ます。
-
typedef enumの使い方を教えて...
-
sshdログの意味
-
visualstudio C# テキストボッ...
-
C++デバックエラーについて詳し...
-
エラー「invalid conversion fr...
-
構造体のあるメンバを基準にソ...
-
構造体のvectorを引数として関...
-
main()とint main(void)の違い
-
C++でboolにintの値を代入する...
-
VC6でlong longでエラー?
-
LNK2019: 未解決の外部シンボル...
-
変数の型を定義しなかった場合...
-
int main の前のint add(int a,...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報