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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C++

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

Q&A

解決済

1回答

2025閲覧

【c++】ある関数でeigenを用いた結果をmain関数で出力したい

lmk

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C++

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

0グッド

0クリップ

投稿2021/09/08 06:32

eigenを用いてcsvファイルを読み取り、出力するプログラムを勉強しています。
(VScodeで書いています。)

readCSVの結果(マトリクスres)をどうにか実行結果として出力したいのですが、うまくいかず…
最後のreadCSV.resに問題があると考えているのですが、正しい表記方法をお教え願いたいです。

c++初心者で、プログラミングも素人レベルです。
初歩的な質問で大変恐れ入りますが、ご助言のほどよろしくお願い申し上げます。

c++

1#include <string> 2#include <iostream> 3#include <fstream> 4#include "Eigen/Dense" 5#include "Eigen/Core" 6#include <vector> 7 8// 名前空間の書き方が揃えられておらず、表記が重なってる部分がありますが、ご容赦願います。 9using namespace std; 10using namespace Eigen; 11 12Eigen::MatrixXd readCSV(std::string file, int rows, int cols) { 13 14 std::ifstream in(file); 15 16 std::string line; 17 18 int row = 0; 19 int col = 0; 20 21 Eigen::MatrixXd res = Eigen::MatrixXd(rows, cols); 22 23 if (in.is_open()) { 24 25 while (std::getline(in, line)) { 26 27 char *ptr = (char *) line.c_str(); 28 int len = line.length(); 29 30 col = 0; 31 32 char *start = ptr; 33 for (int i = 0; i < len; i++) { 34 35 if (ptr[i] == ',') { 36 res(row, col++) = atof(start); 37 start = ptr + i + 1; 38 } 39 } 40 res(row, col) = atof(start); 41 42 row++; 43 } 44 45 in.close(); 46 } 47 //std::cout << res << std::endl; ここでは正しい値(出力したい値)が出力されます。 48 return res; 49} 50 51int main(){ 52 readCSV("test.csv",3,3); 53 std::cout << readCSV.res << "\n"; 54} 55 56//test.csvは 57//1,4,7, 58//2,5,8, 59//3,6,9 60//というシンプルなものです。

以下、実行時のエラーメッセージです。

011.cpp: In function ‘int main()’:

011.cpp:65:26: error: request for member ‘res’ in ‘readCSV’, which is of non-class type ‘Eigen::MatrixXd(std::__cxx11::string, int, int) {aka Eigen::Matrix<double, -1, -1>(std::__cxx11::basic_string<char>, int, int)}’
std::cout << readCSV.res << "\n";

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

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

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

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

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

guest

回答1

0

ベストアンサー

Eigen::MatrixXd readCSV(std::string file, int rows, int cols)

の戻り値の型から推測するに,

int main(){ //関数readCSVの戻り値を,Eigen::MatrixXd 型の変数に受け取る(代入する) Eigen::MatrixXd ResultMatrix = readCSV("test.csv",3,3); //で,それを用いる. std::cout << ResultMatrix << "\n"; }

的に書くのではないでしょうか.
std::cout << ResultMatrixとかできるのかは知りませんが)

投稿2021/09/08 06:52

fana

総合スコア11708

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

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

lmk

2021/09/08 06:57

早速のご回答ありがとうございます。 実行してみたところ、出力することができました! Eigen::MatrixXdにmain関数内で代入すべきだったのですね。 ご教示いただき、誠にありがとうございました…!
fana

2021/09/08 07:02

関数ってどう使うんだろう 的な話の部分なので, 言語文法の基礎的なところを2時間くらい勉強すると良いかと思います. (2時間 : 入門的な本であれ,そういうサイトであれ,かなり最初のうちには出てくる話と思う,という意味)
lmk

2021/09/08 07:17

仰るとおりですね…勉強不足です… 早速取り掛かろうと思います。
fana

2021/09/08 07:24 編集

とりあえずそこらへんの基礎を把握してからでないと 「何かその通りに変えてみたらエラーが消えて動いた」けれども,「何故なのか」という面で話として納得できないでしょうから, 十分納得いってから質問を閉じられれば良いかと. それまでの間に,あなたにとってより わかりやすい/役に立つ/etc な別回答が付いたりした場合には,そちらをベストアンサーに選ぶ形で閉じてください.
lmk

2021/09/15 08:13

丁寧にご指導いただきありがとうございます。関数に関してはじっくり勉強し、理解することができました。ただ、c++のクラスやオブジェクト指向についてはまだまだ不明点が多いので、引き続き勉強していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問