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

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

ただいまの
回答率

90.76%

  • C++

    3256questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    971questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

エラーの原因がわからない

解決済

回答 3

投稿

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

t-prog

score 1

github にあったプログラムを勉強のため動かそうとしているのですが、コンパイル時に
以下のようなエラーが出ます。エラーの意味は分かるのですが、文法上は問題ないように思い、
原因がわかりません。
もしかして初歩的なことかもわかりませんが、原因と修正方法についてご教示お願いいたします。
opencvについてはバージョン3.10、vc++12(windows10)で他のプログラムが動作することは確認できています。

エラー内容

define GET_2D(mat, x, y, step) (mat[((step) * (y)) + (x)])

GET_2D使用部分で
1>levelset_method.cpp(190): error C3861: 'GET_2D': 識別子が見つかりませんでした
のエラーが出る。

コード#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
//#include <cv.h>
//#include <highgui.h>

#define WINDOW_NAME_1 "Window1"
#define WINDOW_NAME_2 "Window2"

/** 2次元行列matの(x, y)要素を取得*/
#define GET_2D(mat, x, y, step) (mat[((step) * (y)) + (x)])

/** statusのラベル */
enum { FARAWAY, BAND, RESET_BAND, FRONT };

/** 点の配列 */
typedef struct PointArray {
  /** 点 */
  CvPoint *points;
  /** 点の最大数 */
  int max_size;
  /** 現在のデータ数 */
  int count;
} PointArray;


/** レベルセット法で使う画像データの型 */
typedef struct LevelSetImageType {
  /** 各ピクセルの輝度(8ビットグレイスケール) */
  unsigned char *image_gray;
  /** 各ピクセルの状態 */
  unsigned char *status;
  /** 各ピクセルの補助関数の値 */
  double *phi;
  /** 各ピクセルの補助関数の変化量 */
  double *dphi;
  /** 各ピクセルの成長速度 */
  double *f;
  /** 画像の幅 */
  uint width;
  /** 画像の高さ */
  uint height;
} LevelSetImage;

LevelSetImage* new_levelset_image(const IplImage *src) {
  int size = src->width * src->height;
  LevelSetImage *img = (LevelSetImage*)malloc(sizeof(LevelSetImage));
  img->width = src->width;
  img->height = src->height;

  img->image_gray = (unsigned char *)malloc(sizeof(unsigned char) * size);
  img->status = (unsigned char *)malloc(sizeof(unsigned char) * size);
  img->phi = (double *)malloc(sizeof(double) * size);
  img->dphi = (double *)malloc(sizeof(double) * size);
  img->f = (double *)malloc(sizeof(double) * size);

  memcpy(img->image_gray, src->imageData, sizeof(unsigned char) * size);

  return img;
}

void free_levelset_image(LevelSetImage* img) {
  free(img->image_gray);
  free(img->status);
  free(img->phi);
  free(img->dphi);
  free(img->f);

  free(img);
}

PointArray* new_point_array(int max_size) {
  PointArray* p = (PointArray *)malloc(sizeof(PointArray));
  if (p == NULL)
    return NULL;

  p->points = (CvPoint *)malloc(sizeof(CvPoint) * max_size);
  if (p->points == NULL) {
    free(p);
    return NULL;
  }

  p->max_size = max_size;
  p->count = 0;
  return p;
}

void free_point_array(PointArray *p) {
  free(p->points);
  free(p);
}

PointArray** init_circle_map(int band_width) {
  int x, y, i, d;
  int num_points = 7 * (band_width + 1);

  PointArray **circle_maps = (PointArray **)malloc(sizeof(PointArray *) * (band_width + 1));
  if (circle_maps == NULL)
    return NULL;

  for (i = 0; i < band_width + 1; i++) {
    if ((circle_maps[i] = new_point_array(num_points)) == NULL) {
      while (i >= 0)
    free_point_array(circle_maps[i--]);
      return NULL;
    }
  }

  for (y = -band_width; y <= band_width; y++) {
    for (x = -band_width; x <= band_width; x++) {
      d = (int)sqrt(x * x + y * y);
      if (d <= band_width) {
    i = circle_maps[d]->count;
    circle_maps[d]->points[i].x = x;
    circle_maps[d]->points[i].y = y;
    circle_maps[d]->count++;
      }
    }
  }
  return circle_maps;
}

void free_circle_maps(PointArray** circle_maps, int band_width) {
  int i;
  for (i = 0; i < band_width + 1; i++)
    free_point_array(circle_maps[i]);
  free(circle_maps);
}

void init_front(PointArray* front, LevelSetImage* img,
        int init_offset, int band_width) {
  int x, y, i;
  int width, height;
  width = img->width;
  height = img->height;

  memset(img->status, FARAWAY, width * height);

  // Frontグリッドを設定
  i = 0;
  for (x = init_offset; x < width - init_offset; x++) {
    GET_2D(img->status, x, init_offset, width) = FRONT;
    GET_2D(img->phi, x, init_offset, width) = 0.0;
    front->points[i].x = x;
    front->points[i].y = init_offset;
    i++;

    GET_2D(img->status, x, height - init_offset - 1, width) = FRONT;
    GET_2D(img->phi, x, height - init_offset - 1, width) = 0.0;
    front->points[i].x = x;
    front->points[i].y = height - init_offset - 1;
    i++;
  }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kazto

    2018/06/07 15:38

    さしつかえなければ、githubのURLを追記できますでしょうか。

    キャンセル

  • t-prog

    2018/06/07 22:13

    https://gist.github.com/ser1zw/664600 です。

    キャンセル

回答 3

check解決した方法

0

マクロ表記をやめれば動作しました。
これ以上、原因を追究してもわかりそうもないので
解決済と致します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ご提示のソースコードはエラーに示される190行目は存在しないので、別のソースコードのことではないですか?
またソースコードが複数ある場合でも、同じGET_2Dマクロをそれぞれのファイルで定義するとも思えないので(普通は共通のヘッダーファイルを用意する)、ビルドの仕方に問題があるのでは。
取得したコードのビルド方法など良く読んでみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/07 10:09

    申し訳ありません。
    エラー内容を添付した後、長い添付を避けようとソースコードのコメントアウト部を削除したため行数がずれていました。最初にエラーを出す行は、プログラム下の方の
    memset(img->status, FARAWAY, width * height); の行です。
    なお、ソースファイルは、これのみです。

    キャンセル

  • 2018/06/07 10:19

    memsetのところでは、尚更GET_2Dは関係ないですねぇ。
    たぶん行がずれているだけで、その先のGET_2Dのところだと思いますが。
    コードを見た限りでは問題なさそうですけどね。
    うーん、わからないです。すみません。

    キャンセル

0

まずこのエラー(C3861)について対策を講じるのが一歩。
具体的にはコンパイラ エラー C3861
でMicrosoftでは意味として’コンパイラでは、引数依存の検索を使用しても、識別子への参照を解決できませんでした。’。
マクロではなくて実関数としてエラーのある’GET_2D’を定義してみるのは?
Microsoftの説明では’このエラーを解決するのには、これらの関数への参照を削除するか、存在する場合、セキュリティで保護された選択肢と置き換えてください。’と書かれています。
また’コンパイラの以前のバージョンからのプロジェクトの移行後に生成エラー C3861 が表示された場合は、サポートされているバージョンの Windows に関連する問題があります。 Visual C++ では、Windows 95、Windows 98、Windows ME、Windows NT、および Windows 2000 がサポート対象外になりました。 WINVER マクロまたは _WIN32_WINNT マクロをこれらのいずれかのバージョンの Windows に割り当てている場合は、そのマクロを修正する必要があります。 詳細については、次を参照してください。変更 WINVER および _WIN32_WINNTです。’とも記載されています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/09 19:33

    回答ありがとうございます。GET_2Dを マクロでなく実関数で書き直すと問題なく動作しました。
    ということは、マクロの表記法に何か問題があるのでしょうね。
    (コンパイラの機嫌を損ねている理由がわからないですが、何か気づいた点がありましたら
    アドバイスお願いいたします.)

    キャンセル

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

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

関連した質問

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

  • C++

    3256questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    971questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。