Node クラス/オブジェクトへのポインターの配列をヘッダー ファイルで宣言し、クラスのコンストラクターで配列のサイズをインスタンス化しようとしています。次に、配列を Node オブジェクトで初期化します。
私が抱えている問題は、SOM.h ファイルで Node 配列を最初に宣言するときの正しい構文に関係しています。私はそれを aNode* nodeArray
とにしてみましたNode* nodeArray[][some constant number]
。これらのいずれかまたは両方がこれを行う正しい方法かどうかはわかりません。
次に、SOM.cpp コンストラクターで、この方法で初期化していますnodeArray = Node[Config::NODE_GRID_HEIGHT][Config::NODE_GRID_WIDTH]
次に、ノード ポインターの配列の初期化関数を実行します。
void SOM::RandInitilizeNodeArray(){
srand (time(NULL));
for(int i=0; i<10; i++){
for(int j=0; j<10; j++){
nodeArray[i][j] = new Node();
nodeArray[i][j]->modelVec[0] = (rand() % 256)/255;//there is a uniform real distribution that gives better results
nodeArray[i][j]->modelVec[1] = (rand() % 256)/255;//THE 256 HERE MIGHT NEED TO BE 255
nodeArray[i][j]->modelVec[2] = (rand() % 256)/255;
}
}
}
modelVec にアクセスしようとする 3 回ごとに、Eclipse から「フィールド "modelVec" を解決できませんでした」というメッセージが表示されます。なんで?ポインターの配列を正しく宣言していないか、正しく初期化していないか、正しくアクセスしていませんか。たぶん日食は私を嫌っているだけです。
ここにもっとコードがあります。
SOM.h
#ifndef SOM_H
#define SOM_H
#include "Node.h"
#include "LoadFile.h"
//#include "LearningFunc.h"
#include "Config.h"
#include <cstdlib>
#include <string>
#include "opencv2/core/core.hpp"
#include <vector>
#include <iostream>
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>//FOR TESTING
//#include <highgui.h>
class SOM{
public:
// Variables
Node* nodeArray;//[][Config::NODE_GRID_WIDTH];
//Node* nodeArray;
cv::Mat inputImg;
cv::Mat normalizedInputImg;
std::string filename;
cv::Mat unnormalizedInputImg;//FOR TESTING
cv::Mat outputImg;
//LearningFunc thislearner();
// Functions
//Node* FindWinner(std::vector<uchar>);//send in a pixel vector get a winning node in return
void BatchFindWinner();
Node* SingleFindWinner(uchar*);
void NormilizeInput();
void InitilizeNodeArray();
void RandInitilizeNodeArray();
float GetSimilarity(uchar*, uchar*);
void AllocateNodeArray();
void OutputNodeArray();
void UnnormalizeInputImage();
void DisplayWins();
cv::Mat OutputSom();
void MyPause(std::string);//FOR TESTING
void WriteSomToDisk(std::string);
// Constructors
SOM(){};
SOM(std::string);
~SOM(){};
private:
};
#endif // SOM_H
SOM.cpp
SOM::SOM(std::string file){
filename = file;
inputImg = LoadFile(filename);
nodeArray = Node[Config::NODE_GRID_HEIGHT][Config::NODE_GRID_WIDTH];
//nodeArray = new Node[NODE_GRID_HEIGHT][NODE_GRID_WIDTH];
AllocateNodeArray();
InitilizeNodeArray();
//OutputNodeArray();//FOR TESTING
}
void SOM::RandInitilizeNodeArray(){
srand (time(NULL));
for(int i=0; i<10; i++){
for(int j=0; j<10; j++){
nodeArray[i][j] = new Node();
nodeArray[i][j]->modelVec[0] = (rand() % 256)/255;//there is a uniform real distribution that gives better results
nodeArray[i][j]->modelVec[1] = (rand() % 256)/255;//THE 256 HERE MIGHT NEED TO BE 255
nodeArray[i][j]->modelVec[2] = (rand() % 256)/255;
}
}
}
Node.h
#ifndef NODE_H
#define NODE_H
#include <vector>
#include "Config.h"
class Node{
public:
//variables
//unsigned int location[2];//location of node in 2d grid
std::vector<unsigned int> winnerDataPixels;
uchar* modelVec;
//functions
//constructors
Node();
~Node(){};
private:
};
#endif //node.h end define
Node.cpp
#include "Node.h"
#include "Config.h"
Node::Node(){
modelVec = uchar[Config::vectorLength];
}