0

我有多种类型的课程。每种类型都有一个数组和数组中的索引。

如果一个外部函数只知道一个类的字符串 ID 并且想要使用它的公共函数,它必须在它的数组中通过 ID 搜索那个特定的类。

这实在是太低效了。我在运行时创建的所有类和一个创建它的函数,将它放入一个数组中。

我想在创建类时为此创建某种查找表,因此任何外部函数如果想要使用一个类,则不必在类的数组上循环并检查每个 ID 是否匹配但能够通过一些结构或数组到达类。

现在是如何完成的:

#define MAX_ONE_TYPES 20
int createdOneTypesCounter = 0;

// Create one type of classes in one for loop and put it into an array.
// We must keep track of the index because a class can be created later
// at runtime so we must keep increasing the index. I don't check for max index now...

// oneTypes is a JSON OBJECT
for (JsonPair oneTypeRef: oneTypes) {
   const char* oneTypeID     = oneTypeRef.key().c_str();
   JsonObject oneTypeOptions = oneTypes[oneTypeID];
   oneTypeClasses[createdOneTypesCounter ] = new oneTypeClass(oneTypeOptions);
   createdOneTypesCounter++;
}

class oneTypeClass{
    private:
       // using an external ram for this kinda stuffs.
       const size_t IDS_AND_NAMES_SIZE = 500;
       const char * id  = (char *) ps_malloc (IDS_AND_NAMES_SIZE * sizeof (char));
    public:
     thermHandler(JsonObject options){
       // She got an ID on creation.
       id  = strdup(options["id"]);
     }
     
     void setModes(boolean mode){
        // set some mode...
     }
     boolean isMyID(const char* packetID){
        if( strcmp(id, packetID) == 0 ){return true;}
        return false;
     }
};
oneTypeClass* oneTypeClasses[MAX_ONE_TYPES] EXT_RAM_ATTR;

// Here comes an outside function. Wants to set a boolean in a class with specific ID.

static const inline void setOneTypeMode(JsonObject packet){
    for(int i = 0; i < MAX_ONE_TYPES; i++){
        if(oneTypeClasses[i] != NULL && oneTypeClasses[i]->isMyID(packet["id"])){
            oneTypeClasses[i]->setModes(packet["mode"]);
            break;
        }
    }
}

这是我的问题。每次某些外部函数想要对其中一个类做某事时,我都必须按 ID 搜索一个类。

我不知道我会怎么做。在 JS 中,我会为查找表创建一个对象,每次创建一个类时,我都会将它的 ID 作为键,并将它的索引作为如下值:

var oneTypeClass_Lookup{
 "CLASS ID STRING" : "CLASS INDEX IN ARRAY"
};

//And a function would do it like this:

static const inline void setOneTypeMode(JsonObject packet){
   int myClassIndex = oneTypeClass_Lookup[ packet["id"] ];
   oneTypeClasses[myClassIndex]->setModes(packet["mode"]);
}

我这样做是为了“大规模操作”:

static const inline int getOneTypeClassIndex(const char* packetID){
    for(int i = 0; i < MAX_THERMS; i++){
        if(oneTypeClasses[i] != NULL && oneTypeClasses[i]->isMyID(packetID)){
            return i;
        }
    }
    return -1;
}

static const inline void setThing(int newThing, const char* packetID){
    int index = getOneTypeClassIndex(packetID);
    if( index > -1 ){
        oneTypeClasses[index]->setNewThing(newThing);
    }
}

static const inline void setThing_Two(int newThing, const char* packetID){
    int index = getOneTypeClassIndex(packetID);
    if( index > -1 ){
        oneTypeClasses[index]->setNewThing(newThing);
    }
}

但我不能在 C 或 Arduino C++ 中做到这一点。我希望我很清楚。

UI:类 id 由数字和字符组成。id 永远不能以数字开头。示例:“v_kw62ffss_xg0syjlvrokbxciv65a8y”

4

0 回答 0