С++ Интересные фишки

Описание: Разработка и отладка приложений. Упор на 3D-графику.

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3631
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#13 dyvniy » Чт, 12 ноября 2015, 14:33:00

Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3631
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#14 dyvniy » Пн, 23 ноября 2015, 19:10:33

Из dll можно извлечь список функций

Код: Выделить всё

dumpbin.exe /EXPORTS /rawdata:none "путь-к-dll" >> "файл-куда-записать-инфу"

Но кроме имени функции есть список параметров в хитрой закодированной форме, которую я попытался распарсить
Спойлер
/* uchar*, uchar*, uchar, uchar*, uchar*, uchar, uint&, uchar&, uint, ulong
1 0 0000F0E0 ?Compress@@YAH PEA PEB E PEA PEA E IA EA I K @Z
2 1 0000F140 ?Decompress @@YAHPEAPEBEPEAPEAEIAEAIK@Z

3 2 00001030 ?fnCompress0@@YAH PAD PAH 0H@Z = ?fnCompress0@@YAHPADPAH0H@Z (int __cdecl fnCompress0(char *,int *,char *,int))
4 3 00001030 ?fnCompress1@@YAH PAD PAH 0H@Z = ?fnCompress0@@YAHPADPAH0H@Z (int __cdecl fnCompress0(char *,int *,char *,int))
5 4 00001020 ?fnCompress @@YAHPADPAHPA_W_J@Z = ?fnCompress@@YAHPADPAHPA_W_J@Z (int __cdecl fnCompress(char *,int *,wchar_t *,__int64))
6 5 00001010 ?fndllForCompare@@YAH XZ = ?fndllForCompare@@YAHXZ (int __cdecl fndllForCompare(void))

Код: Выделить всё

YAH - return int, YAX - return void
PA + <литера числа> = указатель на него
D - char, E - uchar, F - short, (G - ushort,) H - int, I - uint, J - long, K = ulong, _J - int64, _K - uint64, ( L - int128,) _N - bool
M - float, N - double, O - long double, (X - void,) _W - wchar_t

*/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3631
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#15 dyvniy » Вт, 24 ноября 2015, 18:40:18

Вызов консольного приложения и перехват его вывода, с фильрацией
Спойлер
#include "stdafx.h"
#include <windows.h>

#include <iostream>
#include <string>
using namespace std;

int main00()
{
char b[128];
FILE *p;

p = _popen( "cons.exe 10", "rt" );

string w[] = {
{ "CPRenderNodeMesh::Allocate(), pool empty, using new instead.\n" },
};
string s;
while (fgets( b, 128, p ))
{
//if (s != w[0])
s += b;
}
cout << s;

getchar();
return 0;
}
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3631
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#16 dyvniy » Вс, 13 декабря 2015, 11:45:05

std::shared_mutex из С++14
http://stackoverflow.com/questions/19915152/c11-m ... ead-and-one-write-thread-mutex
позволяет заблокировать объект для записи в одном потоке либо чтения из нескольких
очень полезная штука, уже давно есть в boost, в vs2015 тоже есть.

Список фич, реализованных в студии.
http://habrahabr.ru/company/microsoft/blog/262805/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3631
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#17 dyvniy » Ср, 16 декабря 2015, 18:39:27

Реализация одноразового барьера на С++11
http://habrahabr.ru/post/246947/

Код: Выделить всё

#include <iostream>
#include <thread>
#include <atomic>
#include <condition_variable>
#include <mutex>

class barrier {
 const 
unsigned int threadCount;
 
std::atomic<unsigned int>threadsWaiting;
  
bool isNotWaiting;
 
std::condition_variable waitVariable;
 
std::mutex mutex;
public:
 
barrier(unsigned int n) : threadCount(n) {
  
threadsWaiting 0;
  
isNotWaiting false;
}
barrier(const barrier &) = delete;
 
void wait() {
  if (
threadsWaiting.fetch_add(1) >= threadCount 1) {
   
isNotWaiting true;
   
waitVariable.notify_all();
   
threadsWaiting.store(0);
 }
 else {
  
std::unique_lock<std::mutexlock(mutex);
  
waitVariable.wait(lock,[&]{ return isNotWaiting;});
 }
}
};


barrier *myBarrier;

class 
Thread {
private:
    
std::threadcppthread;
    static 
void threadFunction(Threadarg) {
        
arg->run();
    }
public:
    
Thread() {}
    
Thread(const Thread&) = delete;
    
virtual ~Thread() {delete cppthread;}
    
virtual void run() = 0;
    
void start() {
        
cppthread = new std::thread(Thread::threadFunctionthis);
    }
    
void wait() {
        
cppthread->join();
    }
};

class 
BarrierDemo: public Thread {
  
int id;
public:
 
BarrierDemo(int i) {
     
id i;
 }
 
void run() {
     
std::cout << "Thread " << id << "runs before barrier" << std::endl;
     
myBarrier->wait();
     
std::cout << "Thread " << id << "runs after barrier" << std::endl;
 }
};

int main() {
    
// your code goes here
    
int threads;
    
std::cin >> threads;
    
myBarrier = new barrier(threads);

   
BarrierDemobardemos static_cast<BarrierDemo*>(::operator new(sizeof(BarrierDemo)*threads));
    
    for (
int i 0threadsi++) {
        new (&
bardemos[i])BarrierDemo(i);
        
bardemos[i].start();
    }
    for (
int i 0threadsi++) {
        
bardemos[i].wait();
    }
   
  
   ::
operator delete(bardemos);
    
delete myBarrier;
    return 
0;
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3631
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#18 dyvniy » Пн, 25 января 2016, 11:44:18

weak_ptr
http://ru.cppreference.com/w/cpp/memory/weak_ptr
используется для исключения циклических ссылок.
Спойлер
#include <iostream>
#include <memory>

std::weak_ptr<int> gw;

void f()
{
if (auto spt = gw.lock()) { // необходимо скопировать в shared_ptr перед использованием
std::cout << *spt << "\n";
} else {
std::cout << "gw is expired\n";
}
}

int main()
{
{
auto sp = std::make_shared<int>(42);
gw = sp;

f();
}

f();
}
Изображение


Название раздела: Программирование (под Desktop и Android)
Описание: Разработка и отладка приложений. Упор на 3D-графику.

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Программирование (под Desktop и Android)»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 1 гость