none
メモリエラー?? RRS feed

  • 質問

  • この度、LeapMotionのサンプルコードをVisualStudio2012 express にて

    環境はWindows8.1 VisualStudio2012 express cinderライブラリを使っています。

    サンプルコードを試しに打ち込んでビルドしてみたのですが、以下メモリの書き込み禁止??

    のようなエラーが発生してしまいました。

    Unhandled exception at at 0x74D62F71 in Leap1000.exe: Microsoft C++ exception: utf8::invalid_utf8 at memory location 0x0018EE70.

    初期サンプルは問題なく動くのでどうもコードエラーではなく根本的に設定が違うのかなど

    考えているのですが、アドバイスいただけないでしょうか?

    2014年11月9日 7:05

回答

  • 基本的には自分でデバッグしてください。

    Unhandled exception ということは、どこかの行で止まっているのでしょう。
    その近辺に怪しい箇所がないか、まずはそこから着目してください。それでも見つからない場合は、ブレークポイントやステップ実行を通して、どこまでが正しそうかを見ていってください。
    ある程度の絞り込みができてもなおわからない場合は、その情報を提示してご質問ください。

    ソースコードを全部示して「不具合を見つけてください」は ”お金がいるようなこと(仕事)を頼んでいる” ようなものです。
    環境を準備し、ビルドを試し、デバッグを試して同じ問題を再現させ、その不具合を特定し、修正するという手数のかかる行為を避けるために、あなたの環境で少し追い込んでいただきたいのです。(ご自身のデバッグ技量を高めることにもつながります)
    あと、他人のコードを勝手に転載すると、著作権上の問題が生じる可能性があります。こちらも重ねてご注意を。

    2014年11月9日 22:09
    モデレータ

すべての返信

  • 質問する際は最初に、ご自分の環境、言語、何を作っているのかなどの情報は最低書いていただけませんか?

    また「LeapMotionのサンプルコード」とは具体的にどういうもので、どこでエラーが出ているのでしょう?

    掲示板に書いてあること意外なにも知り得ない第三者に、質問者さんの環境、何を作っているのか、何をしたくてそのために具体的に何をしたのか、問題の状況などを具体的に書いていただけますようおねがいします。そうしていただけると、回答者が質問者さんの状況を的確に把握でき、タイムリーで的を得た回答が得られやすいということで、質問者さんにもメリットがあるはずです。

    2014年11月9日 7:39
  • サンプルコードを試しに打ち込んでビルドしてみたのですが、以下メモリの書き込み禁止??のようなエラーが発生してしまいました。

    Unhandled exception at at 0x74D62F71 in Leap1000.exe: Microsoft C++ exception: utf8::invalid_utf8 at memory location 0x0018EE70.

    いくつか勘違いされているのでその指摘からさせていただきます。

    まず、これは「エラー」と呼ばず、「例外(exception)」と呼びます。
    次にこのメッセージの読み方ですが、「ハンドルされていない例外が発生した」(Unhandled exception)、発生した例外は "utf8::invalid_utf8" であり、後はコードのアドレスやメモリ上のアドレスですが、そのアドレスから特定する手段をもたれていないのであれば活かせないので、気にしないでおいた方が良いでしょう。

    さて、このメッセージだけで予想できる範囲としては、invalid_utf8 なので UTF-8 で扱っている何かがおかしいということでしょうか。
    設定ファイル、テキストファイル、XML ファイル、通信内容などがおかしいのか、扱うロジックの部分がおかしいのかは、あなたの手を加えたことに依存するので、現状の情報では助言できることではありません。

    2014年11月9日 12:11
    モデレータ
  • SuferOnWww様 Azulean様 ご回答ありがとうございます。

    私の勝手な勘違いでコードではなく検索すると「メモリエラー・・・」とでてきたので重大な不具合かと感じてしまい、

    上記のような一部掲載にしてしまいました。。申し訳ありませんでした。再度具体的な詳細を記載させて

    頂きますのでもう一度何かヒントになるものがございましたらよろしくお願い致します。

    (Azulean様よりご指摘のUTF-8不具合が何か邪魔しているように感じていますが修正ポイントが見つからず止まって

    しまっております。。以下詳細を再度ご確認頂きてもよろしいでしょうか。)

    開発環境:Windows8.1 / VisualStudio2012 express for Desktop / 言語C++

    テンプレート:Cinder0.8.6使用

    サンプルコード(ライブラリ):https://github.com/LeapBookCpp/LeapBookCpp

    SDK:(LeapMotion SDK)  Download v.2.1.6.23110 for Windows

    外部接続:LeapMotion

    参考書籍:「LeapMotionプログラミングガイド(p.92より指の検出サンプル)」

    プロセッサ:Intel(R) Core(TM)i7-4790K CPU @ 4.00GHz 4.00GHz

    実装メモリ(RAM):16.0GB

    システムの種類:64ビット

    ーーーーー以下実装不可能でエラー表示のサンプルコードになりますーーーーー

    #include "cinder/app/AppNative.h"
    #include "cinder/gl/gl.h"
    #include "cinder/gl/Texture.h"
    #include "cinder/Text.h"
    #include "cinder/MayaCamUI.h"

    #include "Leap.h"

    using namespace ci;
    using namespace ci::app;
    using namespace std;

    class LeapApp : public AppNative {
    public:

      void setup()
      {
        // ウィンドウの位置とサイズを設定
        setWindowPos( 50, 50 );
        setWindowSize( 1280, 700 );

        // 光源を追加する
        glEnable( GL_LIGHTING );
        glEnable( GL_LIGHT0 );

        // 表示フォントと領域の設定
        mFont = Font( "メイリオ", 20 );

        // カメラ(視点)の設定
        float y = 250;
        mCam.setEyePoint( Vec3f( 0.0f, y, 500.0f ) );
        mCam.lookAt( Vec3f( 0.0f, y, 0.0f ) );
        mCam.setPerspective( 45.0f, getWindowAspectRatio(), 5.0f, 3000.0f );

        mMayaCam.setCurrentCam(mCam);

        // 描画時に奥行きの考慮を有効にする
        gl::enableDepthRead();

        // Leap Motion関連のセットアップ
        setupLeapObject();
      }

      // マウスダウン
      void mouseDown( MouseEvent event )
      {
        mMayaCam.mouseDown( event.getPos() );
      }

      // マウスのドラッグ
      void mouseDrag( MouseEvent event )
      {
        mMayaCam.mouseDrag( event.getPos(), event.isLeftDown(),
          event.isMiddleDown(), event.isRightDown() );
      }

      // 更新処理
      void update()
      {
        // フレームの更新
        mLastFrame = mCurrentFrame;
        mCurrentFrame = mLeap.frame();

        renderFrameParameter();
      }

      // 描画処理
      void draw()
      {
        gl::clear( Color( 0, 0, 0 ) );

        drawLeapObject();
        drawTexture();
      }

      // Leap Motion関連のセットアップ
      void setupLeapObject()
      {
      }

      // フレーム情報の描画
      void renderFrameParameter()
      {
        stringstream ss;

        // 検出した指の数
        ss << "Finger Count : "<< mCurrentFrame.fingers().count() << "\n";

        // 指の座標を取得する
        for ( auto finger : mCurrentFrame.fingers() ) {
          ss << "Finger Position: " << finger.tipPosition().x << ", "
                                    << finger.tipPosition().y << ", "
                                    << finger.tipPosition().z << "\n";
        }

        // テキストボックスを作成する
        auto tbox = TextBox()
          .alignment( TextBox::LEFT )
          .font( mFont )
          .text ( ss.str() )
          .color(Color( 1.0f, 1.0f, 1.0f ))
          .backgroundColor( ColorA( 0, 0, 0, 0.5f ) );

        mTextTexture = gl::Texture( tbox.render() );
      }

      // Leap Motion関連の描画
      void drawLeapObject()
      {
        // 表示座標系の保持
        gl::pushMatrices();

        // カメラ位置を設定する
        gl::setMatrices( mMayaCam.getCamera() );

        // 指を表示する
        for ( auto finger : mCurrentFrame.fingers() ) {
          gl::drawSphere( toVec3f( finger.tipPosition() ), 10 );
        }

        // 表示座標系を戻す
        gl::popMatrices();
      }

      // テクスチャの描画
      void drawTexture()
      {
        if( mTextTexture ) {
          gl::draw( mTextTexture );
        }
      }

      // Leap SDKのVectorをCinderのVec3fに変換する
      Vec3f toVec3f( Leap::Vector vec )
      {
        return Vec3f( vec.x, vec.y, vec.z );
      }

      // カメラ
      CameraPersp  mCam;
      MayaCamUI    mMayaCam;

      // パラメータ表示用のテクスチャ
      gl::Texture mTextTexture;
      Font mFont;

      // Leap Motion
      Leap::Controller mLeap;
      Leap::Frame mCurrentFrame;
      Leap::Frame mLastFrame;
    };

    CINDER_APP_NATIVE( LeapApp, RendererGl )

    上記実行すると以下エラーでアラート画面が開きます↓ ↓

    //Unhandled exception at at 0x74D62F71 in Leap1000.exe: Microsoft C++ exception: utf8::invalid_utf8 at memory location 0x0018EE70.//

    ただ、別のサンプルではうまくいったのでそちらも記載致します。

     ↓  ↓

    ネット検索した際に著者が別のサンプルを実装しているコードを掲載していたため、

    そちらも試してみたところこっちは無事実行され外部接続のLeapMotionもちゃんと指の検出を

    してくれていたのですが上記と下記(ネットよりのサンプルコード)ではUTF-8もしくはメモリ不具合の

    原因が含まれているのでしょうか?

    ーーー参考までに下記ネット上の実装が成功したサンプルコードですーーーー

    #include "cinder/app/AppNative.h"
    #include "cinder/gl/gl.h"
    #include "Leap.h"
    #include "LeapMath.h"

    using namespace ci;
    using namespace ci::app;
    using namespace std;

    class TouchPointsApp : public AppNative {
      public:
     void setup();
     void draw();
      private:
     static const int windowWidth = 800;
     static const int windowHeight = 800;
     Leap::Controller leap;
    };

    void TouchPointsApp::setup()
    {
        this->setWindowSize(windowWidth, windowHeight);
        this->setFrameRate(120);
        gl::enableAlphaBlending();
    }

    void TouchPointsApp::draw()
    {
     gl::clear( Color( .97, .93, .79 ) );
        Leap::PointableList pointables = leap.frame().pointables();
        Leap::InteractionBox iBox = leap.frame().interactionBox();

        for( int p = 0; p < pointables.count(); p++ )
        {
            Leap::Pointable pointable = pointables[p];
            Leap::Vector normalizedPosition = iBox.normalizePoint(pointable.stabilizedTipPosition());
            float x = normalizedPosition.x * windowWidth;
            float y = windowHeight - normalizedPosition.y * windowHeight;
           
            if(pointable.touchDistance() > 0 && pointable.touchZone() != Leap::Pointable::Zone::ZONE_NONE)
            {
                gl::color(0, 1, 0, 1 - pointable.touchDistance());
            }
            else if(pointable.touchDistance() <= 0)
            {
                gl::color(1, 0, 0, -pointable.touchDistance());
            }
            else
            {
                gl::color(0, 0, 1, .05);
            }
           
            gl::drawSolidCircle(Vec2f(x,y), 40);
        }
    }

    CINDER_APP_NATIVE( TouchPointsApp, RendererGl )

    参考サイト:http://www.naturalsoftware.jp/blog/8408

    以上で全てになりますが、記載もれなどございましたお知らせください。

    どうぞよろしくお願いします。

    2014年11月9日 21:52
  • 基本的には自分でデバッグしてください。

    Unhandled exception ということは、どこかの行で止まっているのでしょう。
    その近辺に怪しい箇所がないか、まずはそこから着目してください。それでも見つからない場合は、ブレークポイントやステップ実行を通して、どこまでが正しそうかを見ていってください。
    ある程度の絞り込みができてもなおわからない場合は、その情報を提示してご質問ください。

    ソースコードを全部示して「不具合を見つけてください」は ”お金がいるようなこと(仕事)を頼んでいる” ようなものです。
    環境を準備し、ビルドを試し、デバッグを試して同じ問題を再現させ、その不具合を特定し、修正するという手数のかかる行為を避けるために、あなたの環境で少し追い込んでいただきたいのです。(ご自身のデバッグ技量を高めることにもつながります)
    あと、他人のコードを勝手に転載すると、著作権上の問題が生じる可能性があります。こちらも重ねてご注意を。

    2014年11月9日 22:09
    モデレータ
  • ありがとうございます。

    おっしゃる通りですね。自分でデバッグもしてない状態でコードだけ掲載するのは

    失礼ですね。上記アドバイスを参考に自分で出来るよう試行錯誤してみます。

    ※コード掲載に問題があるとは知らず失礼しました。。

    2014年11月10日 3:33
  • Azulean様

    この度は貴重なアドバイスありがとうございました。教えて頂いた通リに

    ブレークポイントを設置しながら進めていくと以下で止まっていることが

    わかりましたので、検索した結果UTF-8で問題があるようだったので変更させて

    無事実行ができました。

    // 表示フォントと領域の設定

        mFont = Font( "メイリオ", 20 );

     変更後↓

        mFont = Font( "Arial", 20 );

    まだまだ、人の書いたサンプルをただ動かしているだけのレベルですが

    少しはデバッグの意味が分かり非常に勉強になりました。ありがとうございます。

    2014年11月12日 12:17
  • デバッグで問題箇所を特定できたようでよかったと思います。

    後出しじゃんけんで申し訳ないですが、実は日本語文字列リテラルが怪しいことは予想できていました。
    というのも、以下の点があったからです。

    • 問題のないサンプルには日本語文字列リテラルが存在しない。
    • 半角英数の範囲は ShiftJIS だろうが、UTF-8 だろうが、同じバイト表現となることを知っていた。

    このため、ライブラリが UTF-8 前提で動く可能性も考えられるし、その日本語文字列リテラルを指定している箇所で例外が発生しているのではないかと予想していたのです。

    なお、Visual C++ で特に気にしなければ、cpp ファイルは Shift JIS で保存されます。
    従って、その日本語文字リテラルも Shift JIS となるため、UTF-8 のバイト表現と異なり、例外になるのでしょう。
    こちらの記事 を参考に UTF-8 で文字列リテラルを処理できれば、メイリオも使えるかもしれません。
    (ほかの問題が残っている可能性もありますので、絶対ではありません)

    2014年11月12日 13:13
    モデレータ
  • Azuleanさんに補足で。

    質問者さんがデバッグ調査すべきという点は変わりませんが、本件に関しては敷居の高い問題だったかもしれません。というよりもcinderのバグとも言えるものです。

    Visual C++のstd::stringクラスにはANSI文字コード、日本語版WindowsではShift-JISを格納します。もしくはsetlocale()で指定した文字コードでも構いませんが、setlocale()のドキュメントにもあるようにUTF-8は指定できません。
    ですがcinder/Font.cppのコードを見るとstd::stringにはUTF-8を格納することを前提としている節があります。

    2014年11月12日 13:39
  • Azulean様 佐祐理様 補足まで頂きありがとうございます。

    >Visual C++ で特に気にしなければ、cpp ファイルは Shift JIS で保存されます。

    Shift JISを初めて知ったので今後は頭にいれて進めてみます。

    参考サイトでメイリオが使えるか試してみます!

    2014年11月12日 20:58