Как в этом случае заставить функцию GreatherThanN увидеть это самое N?
class GreaterThanN {
int N;
public:
GreaterThanN(int _N): N(_N)
{
}
bool operator ()(int x) const
{
if (x > N)
return true;
return false;
}
};
int N = 5;
count_if(begin(v), end(v), GreatherThanN(N));
ума не приложу, почему размер void _stdcall foo(short a, short b); параметров равен 8
Как выяснилось, стек растет не только на 4 байта, а на 2.
sub $imm, %esp
) не означает, что это следует делать. См: The stack will always be maintained 16-byte aligned, except within
the prolog (for example, after the return address is pushed), and except where
indicated in Function Types for a certain class of frame functions
Для венды на x86 я такого описания на том же сайте не нашёл, но точно выравнивание должно быть не меньше 4. g++ -o app.exe "src\\log.o" "src\\app.o"
/sys/class/gpio/export
меняет состояние системы и запоминается между запусками.direction
надо писать in
или out
, а high
или low
нужно писать в value
. Сегфолта от этого быть не должно, тем не менее.char *s = new char[strlen(source) + 1]; ... strcpy_s(s, strlen(s), source);
strlen(s)
-- вообще за гранью добра и зла и возвращает случайное число, по большому счёту. Потому что s -- только что выделенный неинициализированный массив.strcpy_s
совершенно бессмысленный и неправильный. Бессмысленный, потому что ты только что выделил столько памяти, сколько данных в строке. strcpy_s имеет смысл, если буфер в который ты копируешь -- это массив фиксированной длины. Неправильный, потому что даже если ты имел в виду strlen(source)
, а не strlen(s)
, то должен был передать strlen(source) + 1
, чтобы было куда 0-терминатор скопировать. Кроме всего прочего, strcpy_s ещё и возвращает код ошибки, который имеет смысл проверить.memcpy(s, source, strlen(source) + 1);
или вообще выкинуть s = new char [...]; strcpy_s ... delete [] s;
и заменить на s = strdup(source); ... free(s);
strcpy_s(s, strlen(source) + 1, source);
void OutFloat(double v);
sub sp,16
mov bp,sp
fstp qword ptr [bp + 8]
call OutFloat
add sp,16
Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает.
Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает. К нему по прежнему можно обратиться и вывести значения xy. При этом по завершению работы программы, в консоль выводится "destruct" второй раз.
как правильно уничтожить объект?
получается mainx узнает о том что есть функция printx() на этапе линковки [mainx.o] и [printx.o]?
Каким образом происходит передача информации в [mainx] что функция printx() существует?
objdump -dr mainx.o
...
0000000000000000 <main>:
0: 55 push %rbp
...
3a: 89 c7 mov %eax,%edi
3c: e8 00 00 00 00 callq 41 <main+0x41>
3d: R_X86_64_PLT32 _Z6printxi-0x4
41: b8 00 00 00 00 mov $0x0,%eax
46: c9 leaveq
47: c3 retq
...
readelf -a mainx.o
...
Relocation section '.rela.text' at offset 0x580 contains 12 entries:
Offset Info Type Sym. Value Sym. Name + Addend
...
00000000003d 001400000004 R_X86_64_PLT32 0000000000000000 _Z6printxi - 4
...
Symbol table '.symtab' contains 25 entries:
Num: Value Size Type Bind Vis Ndx Name
...
20: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _Z6printxi
...
readelf -a printx.cpp
...
Symbol table '.symtab' contains 24 entries:
Num: Value Size Type Bind Vis Ndx Name
...
14: 0000000000000000 75 FUNC GLOBAL DEFAULT 1 _Z6printxi
...