0

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];
}
4

0 に答える 0