pechkin: (Default)
pechkin ([personal profile] pechkin) wrote2005-01-23 03:40 pm

Тазом чувствую, что что-то неправильно, а что -- понять не могу:



void __fastcall MergeDataSets(TOAClientDataSet* cdsDst, TOAClientDataSet* cdsSrc, std::vector<const char*>& KeyFieldNames, std::vector<const char*>& CopyFieldNames)
{
  //собираю ключи, которые уже есть в датасете назначения
  std::set<std::vector<AnsiString> > existing_keys;
  for (cdsDst->First(); !cdsDst->Eof; cdsDst->Next())
    existing_keys.insert(CreateKeyVector(cdsDst, KeyFieldNames)); //функцию смотри ниже

  for (cdsSrc->First(); !cdsSrc->Eof; cdsSrc->Next())
  {
    //проверяю, что ключ из второго датасета не встречается в первом
    std::vector key = CreateKeyVector(cdsSrc, KeyFieldNames);
    if (existing_keys.find(key) == existing_keys.end())
    {
      //копирую из второго в первый
      //...


      existing_keys.insert(key);
    }
  }
  while (!existing_keys.empty())
  {
    //как бы, наверно, надо зачистить память, да?
    existing_keys.begin()->clear();
    existing_keys.erase(existing_keys.begin());
  }
}

Ключ -- это вектор, строящийся из строчных представлений значений полей, имена которых перечислены в векторе KeyFieldNames, порядок, естественно, важен.

std::vector __fastcall TfrmVersion::CreateKeyVector(TOAClientDataSet* cds, std::vector<const char*>& KeyFieldNames)
{
  unsigned key_length = KeyFieldNames.size();
  std::vector<AnsiString> key;
  for (unsigned i = 0; i < key_length; i++)
    key.push_back(cds->FieldByName(KeyFieldNames[i])->AsString);
  return key;
}

И вот подсказывает мне мой таз, что то ли память не зачищается где-то, то ли наоборот, объект удалится раньше, чем ссылки перестанут быть нужны.

[identity profile] ex-reaumur80.livejournal.com 2005-01-23 11:47 am (UTC)(link)
Печкин, ты фундаментально ошибаешься.

#include
using namespace std;

template
void f(T& obj) {
obj.f();
}

class A {
public:
virtual void f() = 0;
};

class B : public A {
public:
virtual void f() { cerr << "B\n"; }
};

void g(A& obj) {
f(obj);
}

int main() {
A* b = new B;
g(*b);
}

4. мстительно слежу за тем, как отписавшиеся от меня окружающие переживают из-за сокращения собственных френд-оф списков.

[identity profile] pechkin.livejournal.com 2005-01-23 11:58 pm (UTC)(link)
3. Слушай, но почему же тогда компилятор ругается?

4. Никогда не понимал, почему внимание или невнимание его мыслям должно расцениваться человеком как знак поощрения или наоборот... Мысли замерзли с утра, не получается.

[identity profile] ex-reaumur80.livejournal.com 2005-01-24 12:12 am (UTC)(link)
3. А ты мне покажи на что он именно ругается, я скажу -- почему.

Скорее всего, ты попытался хранить абстрактный класс "by value", а это -- грех.

4. Так как любой активный ЖЖ пишется для читателей, расширение аудитории показывает писателю, что его старания не пропадают даром. Соответственно, уменьшение аудитории действует в обратную сторону, утверждая что писанина -- скучная и никому не интересная.

[identity profile] pechkin.livejournal.com 2005-01-24 12:20 am (UTC)(link)
А. Ну, значит, у меня совершенно перпендикулярное какое-то отношение к ЖЖ. Тогда я автоматически выбываю из круга лиц, на которых можно обижаться за отфренживание. Или которых можно обидеть, отфрендив.

[identity profile] ex-reaumur80.livejournal.com 2005-01-24 12:22 am (UTC)(link)
Хм.
Чего тогда не пишешь в ноутпад, сохраняя в трипл-дес на флеш-карте, оснащенной биометрической защитой?

[identity profile] pechkin.livejournal.com 2005-01-24 12:27 am (UTC)(link)
Не люблю заморачиваться. :-)

Мне честно нет никакого дела до того, двести человек меня читают или двадцать. Числа приобретают значение, когда сопрягаются с другими числами: скажем, когда нужно повысить шансы найти какую-нибудь хрень по людям, получить совет или помощь. В этом смысле в фидо было лучше: были целевые эхи с толпой народа, и были общательные, где толпа не имела значения.