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

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

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

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

C++

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

Q&A

解決済

2回答

307閲覧

配列について!!

miiichat

総合スコア72

Visual Studio

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

C++

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

0グッド

0クリップ

投稿2019/04/16 09:06

編集2019/04/17 07:56

いつもありがとうございます!

#####error

vec.normal[0] = Normal[Face[i + 2]].x; vec.normal[1] = Normal[Face[i + 2]].y; vec.normal[2] = Normal[Face[i + 2]].z;

上記の部分でvector subscript out of range
とエラーが出ました。

調べてみたら
Vertex はsize=14ですが、
Normal はsize=0でした。

std::cout << key << "\n";
std::cout << vec3d.x << "\n" << vec3d.y << "\n" << vec3d.z << "\n";
の部分はコンソールに以下のように表示されるので、データは取れてると思うのですが、、

Normal.push_back(vec3d);のところが何かおかしいのかな?

回答お願いします!!

vn 0.0000 -1.0000 0.0000 0 -1 0 vn 0.0000 1.0000 0.0000 0 1 0 vn 1.0000 0.0000 0.0000 1 0 0 vn -0.0000 -0.0000 1.0000 -0 -0 1 vn -1.0000 -0.0000 -0.0000 -1 -0 -0 vn 0.0000 0.0000 -1.0000 0 0 -1
struct Vector3f { float x; float y; float z; }vec3d; vector <Vector3f> Vertex; vector <Vector3f> Normal; string svertex[3]; std::getline(ifs, key); if (!key.compare(0, 1, "v")) { std::cout << key << "\n"; key.erase(0, 2); std::stringstream ss; ss.str(key); ss >> svertex[0] >> svertex[1] >> svertex[2]; vec3d.x = atof(svertex[0].c_str()); vec3d.y = atof(svertex[1].c_str()); vec3d.z = atof(svertex[2].c_str()); Vertex.push_back(vec3d); std::cout << vec3d.x << "\n" << vec3d.y << "\n" << vec3d.z << "\n"; } if (!key.compare(0, 2, "vn")) { std::cout << key << "\n"; key.erase(0, 3); std::stringstream ss; ss.str(key); ss >> svertex[0] >> svertex[1] >> svertex[2]; vec3d.x = atof(svertex[0].c_str()); vec3d.y = atof(svertex[1].c_str()); vec3d.z = atof(svertex[2].c_str()); Normal.push_back(vec3d); std::cout << vec3d.x << "\n" << vec3d.y << "\n" << vec3d.z << "\n"; }
#include <stdio.h> #include <stdlib.h> #include <vector> #include<iostream> #include<Windows.h> #include <string.h> #include <string> #include <fstream> #include <sstream> using std::vector; using std::string; struct Vector3f { float x; float y; float z; }vec3d; struct Vertex6f { float position[3]; float normal[3]; }vec; int main() { const char *file = "data.txt"; string key; vector <int> Face; vector <Vector3f> Vertex; vector <Vector3f> Normal; string svertex[3]; std::ifstream ifs(file); if (!ifs) { std::cout << "ファイルが開けませんでした。" << std::endl; std::cin.get(); return 0; } ifs.seekg(0, std::ios::beg); while (!ifs.eof()) { std::getline(ifs, key); if (!key.compare(0, 1, "v")) { std::cout << key << "\n"; key.erase(0, 2); std::stringstream ss; ss.str(key); ss >> svertex[0] >> svertex[1] >> svertex[2]; vec3d.x = atof(svertex[0].c_str()); vec3d.y = atof(svertex[1].c_str()); vec3d.z = atof(svertex[2].c_str()); Vertex.push_back(vec3d); std::cout << vec3d.x << "\n" << vec3d.y << "\n" << vec3d.z << "\n"; } if (!key.compare(0, 2, "vn")) { std::cout << key << "\n"; key.erase(0, 3); std::stringstream ss; ss.str(key); ss >> svertex[0] >> svertex[1] >> svertex[2]; vec3d.x = atof(svertex[0].c_str()); vec3d.y = atof(svertex[1].c_str()); vec3d.z = atof(svertex[2].c_str()); Normal.push_back(vec3d); std::cout << vec3d.x << "\n" << vec3d.y << "\n" << vec3d.z << "\n"; } if (!key.compare(0,1,"f")) { std::cout << key << "\n"; key.erase(0, 2); while (!key.empty()) { int i = key.find_first_of("/ "); string head = key.substr(0, i); if (head == "") { Face.push_back(-1); } else { int num = atoi(head.c_str()); num--; Face.push_back(num); } if (i == -1) { key.erase(0, 1); } else { key.erase(0, i + 1); } } } } for (int i = 0;i < Face.size();i++) { std::cout << Face[i] << std::endl; } vector <Vertex6f> vertex; std::cout << Face.size() << std::endl; for (int i = 0;i < Face.size() - 2;i + 3) { vec.position[0] = Vertex[Face[i]].x; vec.position[1] = Vertex[Face[i]].y; vec.position[2] = Vertex[Face[i]].z; vec.normal[0] = Normal[Face[i + 2]].x; vec.normal[1] = Normal[Face[i + 2]].y; vec.normal[2] = Normal[Face[i + 2]].z; vertex.push_back(vec); } getchar(); }
# Blender v2.79 (sub 0) OBJ File: '' # www.blender.org mtllib tesetobj.mtl o Cube v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 -1.000000 -1.000000 v 1.000000 1.000000 -0.999999 v 0.999999 1.000000 1.000001 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 vn 1.0000 0.0000 0.0000 vn -0.0000 -0.0000 1.0000 vn -1.0000 -0.0000 -0.0000 vn 0.0000 0.0000 -1.0000 usemtl Material s off f 1//1 2//1 3//1 f 5//2 8//2 7//2 f 1//3 5//3 6//3 f 2//4 6//4 7//4 f 3//5 7//5 8//5 f 5//6 1//6 4//6

###追記

if (i == -1) { key.erase(0, 1); } else { key.erase(0, i + 1); }

if (i == -1) { int num = atoi(key.c_str()); int digit = 0; while (num != 0) { num /= 10; digit++; } key.erase(0, digit); } else { key.erase(0, i + 1); }

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

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

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

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

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

episteme

2019/04/16 11:52

もちっとマシなタイトル付けよ。「配列について!!」てなんやねん。
guest

回答2

0

ベストアンサー

if (!key.compare(0, 1, "v"))

行頭が "v" だろが "vn" だろがこのifの中に入るが、それでいいの?

※デバッグのしかたを習得しなさい。ひっかかるたんびに教えを乞うわけにもいかんじゃろ?

投稿2019/04/16 12:18

編集2019/04/16 12:19
episteme

総合スコア16614

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

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

miiichat

2019/04/17 07:52

回答ありがとうございます! そのとおりでした。 簡単なところでいちいちつまずかないように頑張ります。
episteme

2019/04/17 09:25

ところで、 int num = atoi(key.c_str()); は int num = std::stoi(key); と書ける。楽っしょ♪
guest

0

Faceの中身はどうなっていますか?

for (int i = 0;i < Face.size() - 2;i + 3)
これだとiが加算されない

投稿2019/04/16 09:36

ardin

総合スコア544

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

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

miiichat

2019/04/17 07:51

回答ありがとうございます!! そのとおりで、 i+=3 にしたらうまくいきました。 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問