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

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

新規登録して質問してみよう
ただいま回答率
85.49%
openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

2回答

9522閲覧

ビルドは成功するが例外がスロー(読み取りアクセス違反)される

R908

総合スコア15

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/06/30 14:19

前提・実現したいこと

openFrameworksでアフィン変換のプログラムを作っています。
直方体と四面体を左マウスクリックでそれぞれの中心で回転するプログラムを作ってました。

発生している問題・エラーメッセージ

例外がスローされました:読み取りアクセス違反。 pnt が 0x262DAEA でした。

該当のソースコード

main.cpp

1#include "ofMain.h" 2#include "ofApp.h" 3//======================================================================== 4int main() { 5 ofSetupOpenGL(768, 768, OF_WINDOW); 6 // this kicks off the running of my app 7 // can be OF_WINDOW or OF_FULLSCREEN 8 // pass in width and height too: 9 ofRunApp(new ofApp()); 10}

ofApp.h

1#pragma once 2#include "ofMain.h" 3class ofApp : public 4 ofBaseApp { 5public: 6 ofVec2f windowSize; 7 void setup(); 8 void update(); 9 void draw(); 10 void keyPressed(int key); 11 void keyReleased(int key); 12 void mouseMoved(int x, int y); 13 void mouseDragged(int x, int y, int button); 14 void mousePressed(int x, int y, int button); 15 void mouseReleased(int x, int y, int button); 16 void windowResized(int w, int h); 17 void dragEvent(ofDragInfo dragInfo); 18 void gotMessage(ofMessage msg); 19 ofVec3f r; 20 ofVec3f t; 21 ofVec3f preMousePos; 22};

ofApp.cpp

1#include "ofApp.h" 2#include <stdarg.h> 3//構造体 sPpolygon 型の定義 4struct sPolygon { 5 int vNum; //頂点の数 6 ofPoint vertex[10]; //頂点の座標 7 ofPoint normal; //法線ベクトル 8 ofPoint center; //中心座標 9 ofPoint max; //各軸の最大値 10 ofPoint min; //各軸の最小値 11 ofColor color; //色 12 bool visible; //可視判定 13}; 14//-------------------------------------------------------------- 15void ofApp::setup() { 16 //フレームレートの設定 17 ofSetFrameRate(30); 18} 19//-------------------------------------------------------------- 20void ofApp::update() { 21 //回転角の設定 22 // r.y = int((r.y ++)) % 360; 23 // r.x = int((r.x + 2)) % 360; 24} 25//ポリゴン作成(色,座標点配列,点の数,点番号,..) 26sPolygon makePoly(ofColor pColor, ofPoint pnt[], int num, ...) { 27 sPolygon poly; 28 va_list ptr; 29 va_start(ptr, num); 30 for (int i = 0; i < num; i++) { 31 int p = va_arg(ptr, int); 32 poly.vertex[i] = pnt[p]; 33 } 34 poly.color = pColor; 35 poly.vNum = num; 36 return poly; 37} 38//透視投影計算 39ofPoint pers(ofPoint p) { 40 float focal = -3.0; //焦点距離を設定 41 ofPoint outp; 42 outp.x = p.x * focal / p.z; 43 outp.y = p.y * focal / p.z; 44 outp.z = 0; 45 return outp; 46} 47//ポリゴンの描画(可変長引数を用いる) 48void drawPoly(sPolygon poly[], const int num) { 49 for (int i = 0; i < num; i++) { 50 ofNoFill(); 51 ofSetColor(255, 255, 255); 52 ofSetPolyMode(OF_POLY_WINDING_NONZERO); ofBeginShape(); 53 for (int j = 0; j < poly[i].vNum; j++) { 54 ofPoint p_tmp = pers(poly[i].vertex[j]); 55 ofVertex(p_tmp); 56 57 } 58 ofEndShape(); 59 } 60} 61//移動量 62void translate(ofPoint pnt[], int start, int end, float x, float y, float 63 z) { 64 for (int i = start; i <= end; i++) { 65 pnt[i].x += x; 66 pnt[i].y += y; 67 pnt[i].z += z; 68 } 69} 70//X 軸まわりの回転 71void rotateX(ofPoint pnt[], int start, int end, float rx) { 72 float rrx = rx / 180 * PI; 73 for (int i = start; i <= end; i++) { 74 ofPoint tp = pnt[i]; 75 pnt[i].x = tp.x; 76 pnt[i].y = tp.y * cos(rrx) - tp.z * sin(rrx); 77 pnt[i].z = tp.y * sin(rrx) + tp.z * cos(rrx); 78 } 79} 80//Y 軸まわりの回転 81void rotateY(ofPoint pnt[], int start, int end, float ry) { 82 float rry = ry / 180 * PI; 83 for (int i = start; i <= end; i++) { 84 ofPoint tp = pnt[i]; 85 pnt[i].x = tp.x * cos(rry) - tp.z * sin(rry); 86 pnt[i].y = tp.y; 87 pnt[i].z = tp.x * sin(rry) + tp.z * cos(rry); 88 } 89} 90//Z 軸まわりの回転 91void rotateZ(ofPoint pnt[], int start, int end, float rz) { 92 float rrz = rz / 180 * PI; 93 for (int i = start; i <= end; i++) { 94 ofPoint tp = pnt[i]; 95 pnt[i].x = tp.x * cos(rrz) - tp.y * sin(rrz); 96 pnt[i].y = tp.x * sin(rrz) + tp.y * cos(rrz); 97 pnt[i].z = tp.z; 98 } 99} 100void setViewport(ofVec2f leftTop, ofVec2f rightBottom) { 101 ofVec2f scale; 102 scale.x = ofGetWindowWidth() / (rightBottom.x - leftTop.x); 103 scale.y = ofGetWindowHeight() / (rightBottom.y - leftTop.y); 104 ofScale(scale.x, scale.y); 105 ofTranslate(-(leftTop)); 106} 107 108//-------------------------------------------------------------- 109void ofApp::draw() { 110 //描画用ビューポートの設定(左上座標,右下座標) 111 setViewport(ofVec2f(-2, 2), ofVec2f(2, -2)); 112 //背景色・描画色・塗りつぶしの設定 113 ofBackground(30, 30, 120); 114 ofSetColor(255, 255, 255); 115 ofNoFill(); 116 //モデルの座標点格納用の配列 117 ofPoint pnt[12]; 118 //直方体の頂点 119 pnt[0] = ofPoint(-1, 1.5, 0.5); 120 pnt[1] = ofPoint(-1, -1.5, 0.5); 121 pnt[2] = ofPoint(1, -1.5, 0.5); 122 pnt[3] = ofPoint(1, 1.5, 0.5); 123 pnt[4] = ofPoint(-1, 1.5, -0.5); 124 pnt[5] = ofPoint(-1, -1.5, -0.5); 125 pnt[6] = ofPoint(1, -1.5, -0.5); 126 pnt[7] = ofPoint(1, 1.5, -0.5); 127 //四面体の頂点 128 pnt[8] = ofPoint(-1, -1, 1); 129 pnt[9] = ofPoint(1, -1, -1); 130 pnt[10] = ofPoint(1, 1, 1); 131 pnt[11] = ofPoint(-1, 1, -1); 132 133 134 // アフィン変換 135 // rotateY(配列名,開始番号,終了番号,ry) 136 rotateX(pnt, 0, 11, r.x); 137 rotateY(pnt, 0, 11, r.y); 138 //translate(配列名,開始番号,終了番号,tx, ty, tz) 139 translate(pnt, 0, 11, 0, 0, -13); 140 translate(pnt, 0, 11, t.x, t.y, t.z); 141 sPolygon poly[10]; 142 ofColor color = ofColor(233, 233, 233); 143 //直方体の面 144 poly[0] = makePoly(ofColor(255, 255, 0), pnt, 4, 0, 1, 2, 3); 145 poly[1] = makePoly(ofColor(255, 255, 0), pnt, 4, 3, 2, 6, 7); 146 poly[2] = makePoly(ofColor(255, 255, 0), pnt, 4, 7, 6, 5, 4); 147 poly[3] = makePoly(ofColor(255, 255, 0), pnt, 4, 0, 4, 5, 1); 148 poly[4] = makePoly(ofColor(255, 255, 0), pnt, 4, 0, 3, 7, 4); 149 poly[5] = makePoly(ofColor(255, 255, 0), pnt, 4, 1, 5, 6, 2); 150 //四面体の面 151 poly[6] = makePoly(ofColor(255, 0, 255), pnt, 8,9,10); 152 poly[7] = makePoly(ofColor(255, 0, 255), pnt, 10,11,8); 153 poly[8] = makePoly(ofColor(255, 0, 255), pnt, 10,9,11); 154 poly[9] = makePoly(ofColor(255, 0, 255), pnt, 8,11,9); 155 156 157 drawPoly(poly, 10); 158} 159//-------------------------------------------------------------- 160void ofApp::keyPressed(int key) { 161} 162//-------------------------------------------------------------- 163void ofApp::keyReleased(int key) { 164} 165//-------------------------------------------------------------- 166void ofApp::mouseMoved(int x, int y) { 167} 168//-------------------------------------------------------------- 169void ofApp::mouseDragged(int x, int y, int button) { 170 if (button == 0) { //左クリック 171 r.y = r.y - (x - preMousePos.x) / 5; 172 r.x = r.x + (y - preMousePos.y) / 5; 173 preMousePos.x = x; 174 preMousePos.y = y; 175 } 176 else { //左クリック以外 177 t.x = t.x + (x - preMousePos.x) / 100; 178 t.z = t.z + (y - preMousePos.y) / 100; 179 } 180} 181//-------------------------------------------------------------- 182void ofApp::mousePressed(int x, int y, int button) { 183 preMousePos.x = x; 184 preMousePos.y = y; 185} 186//-------------------------------------------------------------- 187void ofApp::mouseReleased(int x, int y, int button) { 188} 189//-------------------------------------------------------------- 190void ofApp::windowResized(int w, int h) { 191} 192//-------------------------------------------------------------- 193void ofApp::gotMessage(ofMessage msg) { 194} 195//-------------------------------------------------------------- 196void ofApp::dragEvent(ofDragInfo dragInfo) { 197}

イメージ説明

配列の数などはあってると思うのですが、なぜかエラーが出ます。
どうすればいいでしょうか?

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

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

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

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

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

testset

2019/06/30 16:58 編集

関連性があるかわかりませんが、`va_end`は呼ばなくてよいのでしょうか
guest

回答2

0

int p = va_arg(ptr, int);
このとき、pの値が13以上だったり-1以下になっていることはありませんか?

投稿2019/07/01 03:38

k.matsuda

総合スコア293

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

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

R908

2019/07/01 04:47

-1以下になっていました。
k.matsuda

2019/07/01 06:49

配列pntの範囲外を見てるのでエラーになっていますね。 なぜ、-1以下になるのかは、va_arg(ptr, int)がどういう動きをしているか 引数(ptr, int) が正しい値なのか確認してみてください。
guest

0

polyに何も設定しないでいきなり使ってるせいでは

投稿2019/06/30 14:27

y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問