Ignore:
Timestamp:
06/28/09 19:40:32 (15 years ago)
Author:
mwajcht
Message:

Once again changed 'for' loops inside which vector's element is erased. This time it should be correct, I hope.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/f8-to-f1/geno_f8.cpp

    r23 r24  
    774774                for (vector<SubProduction>::iterator subProdIter = randomProduction->subproductions.begin();
    775775                                subProdIter != randomProduction->subproductions.end(); subProdIter++) {
    776                         for (int condIter = 0; condIter < (*subProdIter).conditions.size(); condIter++) {
    777                                 Condition c = (*subProdIter).conditions[condIter];
    778                                 if (c.parameter == paramName) {
    779                                         (*subProdIter).conditions.erase((*subProdIter).conditions.begin() + condIter);
     776                        for (vector<Condition>::iterator condIter = (*subProdIter).conditions.begin();
     777                                 condIter != (*subProdIter).conditions.end(); /*nothing*/) {
     778                                if ((*condIter).parameter == paramName) {
     779                                        condIter = (*subProdIter).conditions.erase(condIter);
     780                                } else {
     781                                        condIter++;
    780782                                }
    781783                        }
     
    798800                                subProdIter != subproductions->end(); subProdIter++) {
    799801                                SubProduction *sp = &(*subProdIter);
    800                                 for (int actionIter = 0; actionIter < sp->actions.size(); actionIter++) {
    801                                         ActionStrP *actionstrp = &(sp->actions.at(actionIter));
    802                                         if (actionstrp->action != NULL) {
    803                                                 if (actionstrp->action->name == prodName && actionstrp->params.size() > paramIndex - 1) {
     802                                for (vector<ActionStrP>::iterator actionIter = sp->actions.begin();
     803                                         actionIter != sp->actions.end(); actionIter++) {
     804                                        if ((*actionIter).action != NULL) {
     805                                                if ((*actionIter).action->name == prodName && (*actionIter).params.size() > paramIndex - 1) {
    804806                                                        change += paramName.len(); //more less
    805                                                         actionstrp->params.erase(actionstrp->params.begin() + (paramIndex - 1));
     807                                                        (*actionIter).params.erase((*actionIter).params.begin() + (paramIndex - 1));
    806808                                                }
    807809                                        }
     
    11361138                       
    11371139                        //actions
    1138                         for (int i = 0; i < (*subprodIter).actions.size(); i++) {
    1139                                 if ((*subprodIter).actions.at(i).action == NULL) {
     1140                        for (vector<ActionStrP>::iterator i = (*subprodIter).actions.begin();
     1141                                 i != (*subprodIter).actions.end(); /*nothing*/) {
     1142                                bool deleted = false;
     1143                                if ((*i).action == NULL) {
    11401144                                        continue;
    11411145                                }
    1142                                 SString &actionName = (*subprodIter).actions.at(i).action->name;
     1146                                SString &actionName = (*i).action->name;
    11431147                                if (actionName[0] == 'n') {
    11441148                                        if (paramNames.size() > 0) {
     
    11471151                                                if (searchIter != paramNames.end()) { //valid name
    11481152                                                        //ensure it is linked to the correct production
    1149                                                         (*subprodIter).actions.at(i).action = newLsystem->getParamProduction(actionName);
     1153                                                        (*i).action = newLsystem->getParamProduction(actionName);
    11501154                                                } else {
    11511155                                                        //link to random parameter prodution
    11521156                                                        SString name = paramNames[randomN(paramNames.size())];
    1153                                                         (*subprodIter).actions.at(i).action = newLsystem->getParamProduction(name);
     1157                                                        (*i).action = newLsystem->getParamProduction(name);
    11541158                                                }
    11551159                                        } else { //no params, so delete this param production
    1156                                                 (*subprodIter).actions.erase((*subprodIter).actions.begin() + i);
     1160                                                i = (*subprodIter).actions.erase(i);
     1161                                                deleted = true;
    11571162                                        }
    11581163                                } else if (actionName[0] == 'P') {
    11591164                                        if (newLsystem->productions.find(sstringToString(actionName)) != newLsystem->productions.end()) {
    11601165                                                //ensure it is linked to the correct production
    1161                                                 (*subprodIter).actions.at(i).action = newLsystem->productions[sstringToString(actionName)];
     1166                                                (*i).action = newLsystem->productions[sstringToString(actionName)];
    11621167                                        } else {
    11631168                                                //delete this action
    1164                                                 (*subprodIter).actions.erase((*subprodIter).actions.begin() + i);
     1169                                                i = (*subprodIter).actions.erase(i);
     1170                                                deleted = true;
    11651171                                        }
     1172                                }
     1173                                if (!deleted) {
     1174                                        i++;
    11661175                                }
    11671176                        }
Note: See TracChangeset for help on using the changeset viewer.