struct Row {
int data[10];
};
struct Table {
Row rows[10];
}
int sortJ;
int myCompare(const void* a,const void* b) {
int ia = reinterpret_cast<Row*>(a)->data[sortJ];
int ib = reinterpret_cast<Row*>(b)->data[sortJ];
if (ia < ib) return -1;
if (ia == ib) return 0;
return 1;
}
int someJ = 5;
sortJ = someJ;
qsort(table.rows, 10, sizeof(Row), myCompare);
class MyCompare {
public:
MyCompare(int aJ) : j(aJ) {}
bool operator () (const Row& a, const Row& b) const
{ return (a.data[j] < b.data[j]); }
private:
const int j;
}
int someJ = 5;
std::sort(table.rows, table.rows + 10, MyCompare(someJ));
int someJ = 5;
std::sort(table.rows, table.rows + 10,
[someJ](const Row& a, const Row& b) -> bool { return (a.data[someJ] < b.data[someJ]); } );
connect(this, &RenewThread::needUpdate, fMainControl.maincQobj(),
[this]() {
drm::createFile(fReregKey);
fMainControl.maincLayoutOnRegister();
});
HRESULT EnumObjects(
LPDIENUMDEVICEOBJECTSCALLBACK lpCallback,
LPVOID pvRef,
DWORD dwFlags
);
BOOL DIEnumDeviceObjectsCallback(
LPCDIDEVICEOBJECTINSTANCE lpddoi,
LPVOID pvRef
);
template<>
).struct CheckLine {
public:
int itemCode; // код товара
int qty; // количество
int price; // цена, по которой всё это продано в копейках
const CheckLine* next() const { return _next; }
private:
friend class Check; // я тут ошибся с const-корректностью и заconst’ив всё, что можно, не дал Check’у писать
CheckLine* _next;
}
class Check {
public:
Check() : _firstLine(NULL), _lastLine(NULL) {}
void addLine(int itemCode, int qty, int price); // пиши реализацию сам.
const CheckLine* firstLine() const { return _firstLine; }
~Check(); // не забудь про деструктор…
Check(const Check&) // …конструктор копирования…
Check& operator = (const Check&); // и операцию «присвоить».
private:
CheckLine *_firstLine, *_lastLine;
}
///// Защита от повторного включения
#ifndef Unit1H
#define Unit1H
///// Хедеры VCL. Причём всё это сделано так, чтобы упростить написание ценой удлинения
///// компиляции. Более громоздкий, но и более удачный вариант.
///// В H:
///// namespace Controls { class TLabel; }
///// using namespace Controls;
///// В CPP:
///// #include <Controls.hpp>
///// Вот таким образом можно (было) избавиться от каскадного подключения
///// хедера Controls. А то каждый, кто использует главной форму,
///// автоматически подключает эти хедеры.
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
///// Только от Forms.hpp избавиться таким макаром нельзя:
///// мы наследуемся от TForm.
#include <Forms.hpp>
///// Класс формы. Все формы наследуются от TForm.
class TForm1 : public TForm
{
///// Особое право доступа Borland, для совместимости с Delphi.
///// Поля и свойства published не просто public, но включаются
///// в структуру рефлексии (aka reflection или introspection)
///// и программа о них знает при выполнении.
///// Применительно к формам — published-поля доступны
///// загрузчику.
__published: // IDE-managed Components
///// Компоненты, которые мы установили на форме редактором.
TLabel *Label1;
TButton *Button1;
///// События, которые мы прописали в редакторе.
///// __fastcall — модель вызова, аналогичная Delphi.
///// Именно такая модель вызова принята в обработчиках
///// событий.
void __fastcall Button1Click(TObject *Sender);
///// Пользователь пока не прописал никаких своих
///// полей и функций.
private: // User declarations
public: // User declarations
///// Конструктор. Раз уж у формы нетривиальный конструктор —
///// по правилам Си++ его надо повторить в подклассе.
///// Снова-таки, модель вызова __fastcall: в формах Delphi
///// используются т.н. виртуальные конструкторы,
///// когда по имени класса можно создать объект этого класса.
///// Фабричный метод, только немного лучше.
///// Но это значит: у всех подчинённых классов
///// должен быть один и тот же набор параметров
///// и модель вызова.
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
///// Как известно, переменная объявляется один раз.
///// Поскольку хедер может подключаться к огромному числу CPP,
///// её объявляют как extern (она есть, но в другом месте).
///// Макрос PACKAGE раскрывается в __declspec(package),
///// чтобы эту штуку можно было собрать как пакет.
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
a += buff[i];
Вы суммируете коды символов, а не их числовые значения. Правильно a += buff[i] - '0';
fin >> buff;
fin.getline(buff, 11);
for (int i = 0; i < 11; i++)
— неуниверсальная конструкция. Плюс цифр в строчке всего 10, поэтому надо i < 10
.#include <iostream>
#include <cstring>
void doAssert(bool condition, int line)
{
if (condition) {
std::cout << "Line " << line << " ok" << std::endl;
} else {
std::cout << "Line " << line << " FAILED" << std::endl;
}
}
#define ASSERT(x) doAssert(x, __LINE__)
#define ASSERT_STREQ(x, y) doAssert((std::strcmp(x, y) == 0), __LINE__)
void testStringCreation()
{
std::string s;
ASSERT(s.length() == 0);
ASSERT(s.empty());
ASSERT_STREQ("", s.c_str());
}
void testPlusEq()
{
std::string s1 = "Alpha";
std::string s2 = "Bravo";
s1 += s2;
ASSERT_STREQ("AlphaBravo", s1.c_str());
}
int main()
{
testStringCreation();
testPlusEq();
return 0;
}
s1 += "Bravo"
, затем убеждаемся, что выделено, например, 16 символов.s1 = "Alpha"
, значит, строка равна "Alpha", и точка. Все случаи, возможные в операции string = char*, разумеется, покрыты другими тестами.#include <Forms.hpp>
, сейчас — #include <Vcl.Forms.hpp>
.class MP3_Format {
MP3_Format(const char* c_string);
MP3_Format& operator=(const MP3_Format&); // велика вероятность, что компилятор её сгенерирует автоматически
};
MP3_Format("Summertime")
, а затем переносим его в наш mp3a. Скорее всего, оптимизатор уберёт этот перенос и инициализирует mp3a на месте, но такова уж семантика… static int counter;
в хедере — это тот же extern
. Другими словами, мы не объявляем переменную, а говорим: не беспокойся, компилятор, в какой-то единице компиляции она будет.extern
’а: в одной единице компиляции (CPP) объявляемint Skript::counter;
int Skript::counter = 0;
wfopen
или CreateFile
.std::wstring desktopPath;
wchar_t tmp[MAX_PATH + 1];
if (SHGetSpecialFolderPathW(HWND_DESKTOP, tmp, CSIDL_DESKTOPDIRECTORY, FALSE))
desktopPath = tmp;
SearchVektor<unsigned int>
мы инициализируем из вектора vector<int>
. Это вообще ни в какие ворота не пишется. Для данного случая вам нужно…vector<int> liste
превратить в vector<unsigned int>
.SearchVektor(std::vector<T> && t )
. Такой конструктор будет очень быстрым, ибо дерёт всю информацию из t, оставляя в нём пустоту.return SearchVektor< unsigned int> (std::move(liste));