質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

255閲覧

Cの構造体とC#のクラスの違いに悩んでいます。

MZ-SOFT

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/04/14 05:48

某所にあったC言語で書かれた『倉庫番を解くプログラム』をC#に移植しようとしているのですが、クラスの配列で止まっています。どこを間違っているのでしょうか?

C言語
/* -------------------------------------------------------- /
/
x, y の2点間を示す構造体 */
typedef struct {
int x, y;
} t_point;

/* 探索用キューに使う1要素あたりのノード /
typedef struct node {
t_point boxpos[MAP_BOXLIMIT]; /
箱の位置 /
t_point playerpos; /
プレイヤーがいる位置 */
struct node backnode; / プレイヤーが前にいたノード /
int cost; /
現在位置のコスト(低いほどよい) */
} t_node;

t_point goalpos[MAP_BOXLIMIT]; /* ゴールの位置 */
t_node endnode; / ゴールに達したノード */

/* 4方向を調べるための相対座標 /
/
左", "上", "右", "下"の順 */
t_point areadifpos[] = {{-1, 0}, {0, -1},
{1, 0}, {0, 1}};

C#言語でこうしてみたのですが、
/* -------------------------------------------------------- */

/* x, y の2点間を示す構造体 */ class t_point { int x; int y; }; /* 探索用キューに使う1要素あたりのノード */ class t_node { t_point[] boxpos = new t_point[MAP_BOXLIMIT]; /* 箱の位置 */ t_point playerpos; /* プレイヤーがいる位置 */ t_node backnode; /* プレイヤーが前にいたノード */ int cost; /* 現在位置のコスト(低いほどよい) */ }; t_point[] goalpos = new t_point[MAP_BOXLIMIT]; /* ゴールの位置 */ t_node endnode; /* ゴールに達したノード */ /* 4方向を調べるための相対座標 */ /* 左", "上", "右", "下"の順 */ t_point[] areadifpos = new t_point[4]; /* ここで書き込めない*/ areadifpos[]

使用言語 Visual Community 2017
使用環境 Windows10 64

質問するのは久しぶりで、空気を読んでいない点がありましたなら、失礼します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

C言語の構造体のメンバは、全て public です。(といいますか、C言語にpublic/privateの概念はありません。)

C#のクラスのメンバはデフォルトでは、全て private です。ですので、基本的に同じクラス内の関数からしかアクセスできません。

C#

1class t_point { 2public int x; 3public int y; 4} // C/C++では必要ですが、C#はこの;は不要です 5 6class t_node 7{ 8public t_point[] boxpos = new t_point[MAP_BOXLIMIT]; /* 箱の位置 */ 9public t_point playerpos; /* プレイヤーがいる位置 */ 10public t_node backnode; /* プレイヤーが前にいたノード */ 11public int cost; /* 現在位置のコスト(低いほどよい) */ 12}

投稿2018/04/14 06:05

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/04/14 06:09

ああ、それぬけてたw
MZ-SOFT

2018/04/14 06:23

初めまして。やってみたのですが・・・。 /* x, y の2点間を示す構造体 */ class t_point { public int x; public int y; } /* 4方向を調べるための相対座標 */ /* 左", "上", "右", "下"の順 */ t_point[] areadifpos = new t_point[4]; /* ここがうまくできません。*/ areadifpos[0] = new t_point(); areadifpos[1] = new t_point(); areadifpos[2] = new t_point(); areadifpos[3] = new t_point();
Chironian

2018/04/14 08:01

どんなエラーがでるのでしょうか? ってか、既に解決してましたね。失礼。
guest

0

ベストアンサー

class t_point

ではなく、

struct t_point

としましょう


Cでのstructに相当するものは、C#でもstruct になります

classはちと毛色が違ってきて、
配列を new で作っても、配列の各要素はまだ未作成の状態になりますんで、
配列の各要素もnew する必要があります

  • class にした場合

t_point[] areadifpos = new t_point[4];
areadifpos[0] = new t_point();
areadifpos[1] = new t_point();
areadifpos[2] = new t_point();
areadifpos[3] = new t_point();

投稿2018/04/14 05:52

編集2018/04/14 06:07
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MZ-SOFT

2018/04/14 05:59

返信ありがとうございます。やってみたんですけど、駄目でした。
y_waiwai

2018/04/14 06:01

t_node もstruct にしてみてください
MZ-SOFT

2018/04/14 06:10

素早いご返信ありがとうございます。なんかもっとひどくなったようです・・・。 『猫でもわかるC#プログラミング』粂井康考・SB Creative を読んでみたら、C#の構造体はCの構造体とは別ものと書いてあったのですが?
y_waiwai

2018/04/14 06:11

Chironianさんの回答のように、構造体の各メンバーにpublic付けてくださいね #ヌケてました
y_waiwai

2018/04/14 06:12

まあ、厳密に言えばCのものとは別もんですねー そこらへん、はじめは戸惑うでしょうけど、がんばってください。
y_waiwai

2018/04/14 06:14

VisualStudioで走らせるなら、ブレークポイントを設定すればそこで実行を止めて、変数や構造体の中身を見ながらワンステップづつ実行できます そこらへんの使い方を覚えると理解が早いかと思います
MZ-SOFT

2018/04/14 06:31

>ブレークポイントを・・・ その方法で頑張ってみます。ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/04/14 08:09

なんだ? これは…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問