Changeset 23


Ignore:
Timestamp:
06/27/09 11:12:12 (15 years ago)
Author:
mwajcht
Message:

Bug-fix in erasing elements from vectors in 'for' loops - use integer loop counters instead of iterators (after last element of a vector is erased incremented iterator does not point to vector.end())

Location:
cpp/f8-to-f1
Files:
2 edited

Legend:

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

    r11 r23  
    702702                         subProdIter != prodIter->second->subproductions.end(); subProdIter++) {
    703703                        SubProduction subProduction = *subProdIter;
    704                         for (vector<ActionStrP>::iterator actionIter = subProduction.actions.begin();
    705                                  actionIter != subProduction.actions.end(); actionIter++) {
    706                                 if ((*actionIter).action == NULL) {
    707                                         subProduction.actions.erase(actionIter);
     704                        for (int i = 0; i < subProduction.actions.size(); i++) {
     705                                if (subProduction.actions.at(i).action == NULL) {
     706                                        subProduction.actions.erase(subProduction.actions.begin() + i);
    708707                                }
    709708                        }
  • cpp/f8-to-f1/geno_f8.cpp

    r22 r23  
    11361136                       
    11371137                        //actions
    1138                         for (vector<ActionStrP>::iterator actionIter = (*subprodIter).actions.begin();
    1139                                  actionIter != (*subprodIter).actions.end(); actionIter++) {
    1140                                 if ((*actionIter).action == NULL) {
     1138                        for (int i = 0; i < (*subprodIter).actions.size(); i++) {
     1139                                if ((*subprodIter).actions.at(i).action == NULL) {
    11411140                                        continue;
    11421141                                }
    1143                                 SString &actionName = (*actionIter).action->name;
     1142                                SString &actionName = (*subprodIter).actions.at(i).action->name;
    11441143                                if (actionName[0] == 'n') {
    11451144                                        if (paramNames.size() > 0) {
     
    11481147                                                if (searchIter != paramNames.end()) { //valid name
    11491148                                                        //ensure it is linked to the correct production
    1150                                                         (*actionIter).action = newLsystem->getParamProduction(actionName);
     1149                                                        (*subprodIter).actions.at(i).action = newLsystem->getParamProduction(actionName);
    11511150                                                } else {
    11521151                                                        //link to random parameter prodution
    11531152                                                        SString name = paramNames[randomN(paramNames.size())];
    1154                                                         (*actionIter).action = newLsystem->getParamProduction(name);
     1153                                                        (*subprodIter).actions.at(i).action = newLsystem->getParamProduction(name);
    11551154                                                }
    11561155                                        } else { //no params, so delete this param production
    1157                                                 (*subprodIter).actions.erase(actionIter);  //TODO sprawdzić zachowanie iteratora!!!
     1156                                                (*subprodIter).actions.erase((*subprodIter).actions.begin() + i);
    11581157                                        }
    11591158                                } else if (actionName[0] == 'P') {
    11601159                                        if (newLsystem->productions.find(sstringToString(actionName)) != newLsystem->productions.end()) {
    11611160                                                //ensure it is linked to the correct production
    1162                                                 (*actionIter).action = newLsystem->productions[sstringToString(actionName)];
     1161                                                (*subprodIter).actions.at(i).action = newLsystem->productions[sstringToString(actionName)];
    11631162                                        } else {
    11641163                                                //delete this action
    1165                                                 (*subprodIter).actions.erase(actionIter);
     1164                                                (*subprodIter).actions.erase((*subprodIter).actions.begin() + i);
    11661165                                        }
    11671166                                }
Note: See TracChangeset for help on using the changeset viewer.