Ответы пользователя по тегу C++
  • Как конвертировать статическую библиотеку ( fileName.a ) в разделяемую ( fileName.so ) с помощью gcc ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может быть просто
    ld -shared -o zip.so --whole-archive zip.a
    Ответ написан
    Комментировать
  • Как реализовать PRC client-server?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот у меня завалялась поделка на стандартном виндовом rpc больше чем десятилетней давности. Visual Studio, C++. Попробуйте:
    https://github.com/jcmvbkbc/winrpc-sample
    Ответ написан
    Комментировать
  • Как получить указатель на шаблонный класс?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    возможно ли получить "обобщённый" указатель для разных специализаций

    Нет, поскольку специализации шаблона -- разные типы, не связанные никакими отношениями.
    Ответ написан
  • Использованее typeid классе шаблоне

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    typeid классе шаблоне

    Крабэ шмеле.

    так вот программа не компилируется, жалуется на не соответствие типов, не знаю почему

    Что вам мешает узнать? Вы умеете читать сообщения об ошибках?
    Ответ написан
  • Найти ошибку в коде (C++ X11)

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А у меня всё работает нормально, 1600x900.
    Может у вас памяти не хватает и XGetImage возвращает NULL?
    Кроме того, XGetImage у вас возвращает прямоугольник, который на 1 пиксел меньше размеров экрана, и по x и по y, а XGetPixel вы зовёте по полной ширине и высоте экрана.
    Ответ написан
    8 комментариев
  • Как написать собственную функцию извлечения кв. корня из целого числа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что можно сделать лучше, быстрее?

    Поменять алгоритм на метод деления пополам или побитовый поиск, с уменьшением сложности по количеству бит в int с экспоненциальной до линейной.

    Например так:
    int my_sqr(int number){
    	register unsigned int temp, x;
    	if (number < 0)
    		number = -number;
    	for (temp = 0, x = 1u << (sizeof(unsigned int) * 4 - 1); x; x >>= 1) {
    		if ((temp | x) * (temp | x) <= number)
    			temp |= x;
    	}
    	return temp;
    }


    Не проверять на равенство if (temp == x), потому что равенства может не быть, например для number = 6.
    Убедиться, что функция всегда что-то возвращает. Так, например, при number = 6 ваша функция зацикливается или падает с делением на 0, а при number = 0 завершается с неопределённым значением.
    Ответ написан
  • Скрыть адрес вызываемой функции. С/C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    компилятор упорно не хочет вычислять выражение &((int*)f)[3] при компилировании

    Что говорит?

    имя функции - это константа на момент компиляции

    Ложное утверждение. Адрес функции становится известен только на этапе линковки, а если функция импортирована из dll -- то только в момент загрузки. Если линковка релоцируемая, то адрес может измениться в момент загрузки. Другое дело, что константная строка в этом смысле мало отличается от функции.

    Сложная конструкция должна выглядеть вот так:
    void (*fptr)(int) = (void(*)(int)) (((int*)f) + 3);
    Вариант с (f+3) компилироваться не будет, т.к. арифметика указателей не работает с указателями на функции.

    В линуксе эта конструкция компилируется и работает.
    Ответ написан
    5 комментариев
  • C++.Сокеты.Функция RECV

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нашел функцию select,думал может поможет,но что-то нифига

    Я тебе в ответе на тот вопрос писал ещё про fcntl и O_NONBLOCK, думал может ты читать умеешь, но что-то нифига. В винде их аналоги -- ioctlsocket и FIONBIO.
    В качестве альтернативы можно попробовать ioctlsocket и FIONREAD, чтобы читать столько байт, сколько есть для чтения, а не 50.
    Ответ написан
    Комментировать
  • Как в C++ наиболее удобно (компактно) назначить две переменных вызывая функцию один раз?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void func(int& a, int& b) {
    	a = 1;
    	b = 2;    
    }
    
    func(x, y);
    Ответ написан
    Комментировать
  • С++.Работа с сокетами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Гугли select, fcntl и O_NONBLOCK.
    Ответ написан
    Комментировать
  • RPC c++ windows

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    то ли в гугле и правда 7 статей про rpc

    То что вы ищете есть в примерах к platform SDK. См. samples/netds/rpc
    Ответ написан
    Комментировать
  • Функция с переменным числом параметров

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int *p=&k;//настроили указатель на параметр k
    ...
    s+=*(++p);

    Вот за такую х..ю надо лишать права преподавания. Используйте va_list/va_start/va_arg/va_end, потому что это единственный стандартный способ доступа к аргументам, переданным через многоточие.
    Ответ написан
    Комментировать
  • Как дописать параметр запуска ярлыка через программу?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Примерно так на голом COM:
    IPersistFile *ipf;
      IShellLinkA *isl;
      HRESULT rc;
    
      rc=CoInitialize(NULL);
      rc=CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IPersistFile,(void**)&ipf);
      rc=ipf->Load(L"something.lnk",0);
      rc=ipf->QueryInterface(IID_IShellLinkA,(void**)&isl);
      rc=isl->SetArguments("- game cstike");
      rc=ipf->Save(L"something.lnk",1);
      ipf->Release();
      isl->Release();
      CoUninitialize();


    По деталям интерфейса IShellLink см. msdn.microsoft.com/en-us/library/windows/desktop/b...
    Ответ написан
    Комментировать
  • Как подделать адрес отправителя в UDP пакете?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    setLocalAddress можно установить только адреса, присутствующие на локальных интерфейсах. Произвольный адрес установить нельзя. Т.о. можно либо добавить нужный адрес локальному интерфейсу (например с помощью ifconfig add), либо открыть "сырой" сокет и формировать заголовки IP и UDP самостоятельно.
    Ответ написан
    Комментировать
  • Почему функция работает не так, как надо?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    суть листинга, который присваивает голове змейки: coordinates_x[1] и coordinates_y[1] значение 1,

    он присваивает 1 когда координаты больше N или M соответственно, т.е. при выходе из поля справа (x > N) голова перескакивает налево (x = 1), а при выходе из поля снизу (y > M) голова перескакивает наверх (y = 1).
    Ответ написан
    1 комментарий
  • Системные аллокаторы в php extension

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Реализуйте шаблонный класс аллокатора через emalloc, erealloc, и дальше используйте его шаблонным параметром std::basic_string и других шаблонов stl принимающих аллокаторы.

    Получается что все стандартные классы c++ нельзя использовать для php extension? И что мне придётся писать собственную копию std::string?


    Получается, что иногда полезно читать документацию.
    Ответ написан
    Комментировать
  • Как создать оконное приложение в обход WinAPI на C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Используйте Qt.
    Ответ написан
    Комментировать
  • Quick sort некорректно сортирует. Где ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Неправильно выставлены границы интервала в quickSort, должно быть так:
    void quickSort(int arr[], int p, int r)
    {
    	if (p < r) {
    		int q = partition(arr, p, r);
    
    		quickSort(arr, p, q);
    		quickSort(arr, q + 1, r);
    	}
    }


    Тестовое приложеньице:
    int main()
    {
            for (int n = 2; n <= 10; ++n) {
                    int arr[10];
                    for (int i = 0; i < n; ++i)
                            arr[i] = i;
                    printf("n = %d\n", n);
                    do {
                            int sort[10];
    
                            memcpy(sort, arr, sizeof(arr));
                            quickSort(sort, 0, n);
                            for (int i = 1; i < n; ++i)
                                    if (sort[i] < sort[i - 1])
                                            printf("!\n");
                    } while (std::next_permutation(arr, arr + n));
            }
            return 0;
    }
    Ответ написан
    1 комментарий
  • Есть ли sprintf с массивом параметров формата?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть строка вида "Что-то: %s, всякое: %d, разное: %0.2f", которая получается извне (т.е. количество аргументов формата неизвестно)

    Это может стать серьёзной уязвимостью, потому что у sprintf есть, например, %n, записывающий в память по адресу в переданном параметре.

    Boost по ряду причин тянуть не хочется

    Если у вас всё равно С++, может подойдёт std::ostringstream?
    Ответ написан
    7 комментариев
  • Как создать большой массив в разных инициализациях?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему я не могу создать большой статический массив

    Потому что в приведённом коде массив не статический, а на стеке.
    Статическим он станет, если вы припишете к нему слово static или вынесете его определение из функции.
    Почему программа при этом падает -- потому что размера стека недостаточно. Размер резервируемого стека (т.е. максимально возможный размер стека, память под него выделяется по мере использования) записан в свойствах вашего PE файла и может быть установлен во время линковки.
    Динамически вы выделяемый массив размещается в куче. На размер кучи тоже есть ограничения, но, как правило, они существенно больше. Кроме того, приложение может создавать новые кучи нужного размера во время выполнения.
    Размер массива ограничен следующими вещами:
    1. размером указателя (т.е. моделью памяти, под которую производится сборка. Так, например, в модели x32 с 32-битными указателями суммарный размер всех массивов ограничен 4 гигабайтами)
    2. типом размещения массива:
    - автоматический (на стеке) -- зарезервированным размером стека;
    - статический (в сегменте данных/bss) -- размером указателя;
    - динамический (в куче) -- зарезервированным размером кучи/реализацией менеджера памяти;
    - в памяти выделенной VirtualAlloc/MapViewOfFile/... -- размером указателя и текущей фрагментацией адресного пространства.
    Ответ написан
    5 комментариев