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

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

ただいまの
回答率

90.85%

  • C#

    5994questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 180

MZ-SOFT

score 5

某所にあった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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

こんにちは。

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

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

class t_point {
public int x;
public int y;
}  // C/C++では必要ですが、C#はこの;は不要です

class t_node
{
public t_point[] boxpos = new t_point[MAP_BOXLIMIT];   /* 箱の位置 */
public t_point playerpos;                              /* プレイヤーがいる位置           */
public t_node backnode;                                /* プレイヤーが前にいたノード     */
public int cost;                                       /* 現在位置のコスト(低いほどよい) */
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/14 15:09

    ああ、それぬけてたw

    キャンセル

  • 2018/04/14 15: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();

    キャンセル

  • 2018/04/14 17:01

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

    キャンセル

checkベストアンサー

+2

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 14:59

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

    キャンセル

  • 2018/04/14 15:01

    t_node もstruct にしてみてください

    キャンセル

  • 2018/04/14 15:10

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

    キャンセル

  • 2018/04/14 15:11

    Chironianさんの回答のように、構造体の各メンバーにpublic付けてくださいね

    #ヌケてました

    キャンセル

  • 2018/04/14 15:12

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

    キャンセル

  • 2018/04/14 15:14

    VisualStudioで走らせるなら、ブレークポイントを設定すればそこで実行を止めて、変数や構造体の中身を見ながらワンステップづつ実行できます

    そこらへんの使い方を覚えると理解が早いかと思います

    キャンセル

  • 2018/04/14 15:31

    >ブレークポイントを・・・

    その方法で頑張ってみます。ありがとうございました。

    キャンセル

  • 2018/04/14 17:09

    なんだ? これは…

    キャンセル

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    c++ queueについて 配列をpushすることは可能?

    プログラムを直書きさせてもらいます。 #include <bits/stdc++.h> using namespace std; int main(){    queue<ここで

  • 受付中

    長い引数

    この引数について疑問があります。 constのstruct型のNode *nodeptr?この引数は何を表しているのでしょうか? int readonly(const struct

  • 解決済

    java.awt.geom.Point2D.DoubleのDouble型配列がnullになってしまう

    したいこと 先ほど質問させていただいたもの(java.lang.NullPointerException の発生原因が分からないです)の続きで質問させていただきます。 java

  • 受付中

    Jacksonを使用したjsonのパース処理について

    jacksonを使用して以下のjsonをパースして、値を取得したいのですが、なかなか取得方法を理解できないでいます。 java①では"results"と"result_index

  • 解決済

    c言語 リスト構造について...

    前提・実現したいこと 最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。 説明不足だったの

  • 受付中

    C言語 リスト 新しいノードをリストの最後に追加

    C言語 リストについて ↓のプログラムでは入力した数字を逆順に表示 /* list.c */ #include <stdio.h> #include <stdlib.h> st

  • 解決済

    android opencv 座標を返す

    私はandroidstudioでアプリ開発を行っています。 私が書いたプログラムはカメラで撮っている映像の中に映る赤い物の中心に点を描画する物です。 この中心点の座標を獲得

  • 解決済

    ローグライクゲームの敵の行動について...

    いま、Unityでローグライクゲームを製作しております。 その際に、敵の行動として障害物を避けつつ最短距離でプレイヤーに近づくような処理を用いりたいのですが 自分の知識ではどう行え

同じタグがついた質問を見る

  • C#

    5994questions

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