unsigned short int *exam_t = new unsigned short int[5];
Нет нужды new, невелик массив. Хватает локального массива на стеке. Аналогично остальные два new.sizeof(&student_r)
только чудом совпадает с sizeof(student_r)
.flag == false
, надо !flag.while (!flag)
в del_rev бессмысленно.// Хедер 1
class Master;
class Slave {
Master* master;
}
// Хедер 2
class Master {
Slave slave;
}
// Хедер 1
class Master { // interface
public:
virtual void enumSlaves(const EnumSlavesCallback& v) = 0;
virtual ~Master() = default;
}
class Slave {
Master* master;
}
// Хедер 2
class MyMaster : public Master {
public:
Slave slave;
void enumSlaves(const EnumSlavesCallback& v) override {}
}
Имена классов с большой буквы в CamelCase, например class EventHandler;.
Названия объектов аналогично, но первая буква маленькая, например Image backgroundImage;.
Названия примитивных типов(int, char, double, etc) маленькими через нижнее подчёркивание, например double percent_of_fails;
Названия методов с мальнькой в camelCase и отражают действие функции, например void addModule(std::shared_ptr module);
Структура файлов:
Первым идёт инклуд C++ хедеров, затем сторонние библиотеки типа буста, затем *.i файл из данной директории и после всё остальное.
1 forward declarations(чтоб не замусоривать ими остальные файлы)
2 инклуды всех *.h файлов из данной директории.
Сущности в каждой директории имеют своё одноимённое пространство имён,
..
).int BMP::Load(char FileNames[])
→
int BMPLoad(struct BMP* this, char FileNames[])
typedef enum {
LI_A, LI_B, LI_N
} ListIndex;
enum { LEN = 40 };
typedef struct {
Entry* next[LI_N];
char name[LEN];
} Entry;
typedef Entry* PEntry;
PEntry heads[LI_N], tails[LI_N]; // считаем, что = NULL
int isIn(ListIndex aIndex, Entry* aEntry)
{
return (aEntry->next[aIndex] || tails[aIndex] == aEntry);
}
void addExisting(ListIndex aIndex, Entry* aEntry)
{
/* Уже есть? Поскольку такой код чреват ошибками, лучше всё же проверить */
if (isIn(aIndex, aEntry))
return;
if (tails[aIndex]) {
tails[aIndex]->next = aEntry;
tails[aIndex] = aEntry;
} else {
heads[aIndex] = tails[aIndex] = aEntry;
}
}
Entry* addNew(ListIndex aIndex, char* aName)
{
int i;
Entry* newEntry = (Entry*)malloc(sizeof(Entry));
strncpy(entry->name, aName, LEN);
entry->name[LEN-1] = '\0';
for (i = 0; i < LI_N, ++i)
entry->next[i] = NULL;
addExisting(aIndex, entry);
return entry;
}
/* closure — т.н. замыкание, передача контекста, из которого была
вызвана функция, вызывающая callback */
typedef void(*ListCallback)(Entry* aEntry, void* aClosure);
void traverseList(ListIndex aIndex, ListCallback aCallback, void* aClosure)
{
Entry* entry = heads[aIndex];
while (entry) {
aCallback(aEntry, aClosure);
entry = entry->next[aIndex];
}
}
if (strcmp(flight_d[i].destination, edit) == 0)
{
flight_d[i] = …;
file.open(…);
file.seekg(i * sizeof(…));
file.write(reinterpret_cast<const char*>(&flight_d[i]),
sizeof(Flight_Details));
break;
}
#include <iostream>
#include <chrono>
int main()
{
using Time = std::chrono::time_point<std::chrono::high_resolution_clock>;
using Diff = std::chrono::milliseconds;
Time t1 = std::chrono::high_resolution_clock::now();
int i;
std::cin >> i;
Time t2 = std::chrono::high_resolution_clock::now();
Diff diff = std::chrono::duration_cast<Diff>(t2 - t1);
std::cout << diff.count() << " ms" << std::endl;
return 0;
}
List<size_t>& newList(size_t a) {
List<size_t> result;
result.pushBack(a);
return result;
}
List<size_t> newList(size_t a) {
List(List<T>&& other);
List<T>& operator = (List<T>&& other);
function InterlockedAdd(var Addend: Integer; Increment: Integer): Integer;
asm
MOV ECX,EAX
MOV EAX,EDX
LOCK XADD [ECX],EAX
ADD EAX,EDX
end;
mov eax, spinlock_address
mov ebx, SPINLOCK_BUSY
wait_cycle:
xchg [eax], ebx ; xchg - единственная инструкция, являющаяся атомарной без префикса lock
cmp ebx, SPINLOCK_FREE
jnz wait_cycle
; < критическая секция захвачена данным потоком, здесь идёт работа с разделяемым ресурсом >
mov eax, spinlock_address
mov ebx, SPINLOCK_FREE
xchg [eax], ebx ; используется xchg для атомарного изменения
; последние 3 инструкции лучше заменить на mov [spinlock_address], SPINLOCK_FREE -
; это увеличит скорость за счёт отсутствия лишней блокировки шины, а mov и так выполнится атомарно
; (но только если адрес spinlock_address выровнен по границе двойного слова)
(z[i].birth >= ageyoungest)
.if (z[i].education == "master" || z[i].education == "specialist" || z[i].education == "bachelor")
. Для массивов это просто сравнение адреса массива с адресом вкомпилированной в программу строчки, что автоматически даёт false. Используйте str(n)cmp.else if (z[i].education != "master" || z[i].education != "specialist" || z[i].education != "bachelor")
. Оно автоматически выполнено.delete[] employees;