Форум программистов, компьютерный форум CyberForum.ru

Задачи для тренировки и лучшего понимания - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Теория плагинов http://www.cyberforum.ru/cpp/thread123914.html
Всем привет. Для одной моей проги, нужно реализовать поддержку плагинов. Плагины предполагаются простенькие, написанные на Си. То, что плагин, это просто .so файл - понятно. То, что прога может дергать из .so файла функции - тоже понятно. 1. Непонятно то, как сам плагин сможет дергать функции из программы? 2. Программа написана на С++, но плагины предполагаю писать на Си, во избежания...
C++ ./massdown: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./massdown) всем хай! собираю свою программу на новом железе х86_64 долго не получалось скомпилить. при линковке получал вот такое сообщение: relocation R_X86_64_32 against `a local symbol' я так понял, это из-за того что часть библиотек от которых зависит цель, были собраны как 32-ух битные. но с этим вроде все нормально, пересобрал все либы - скомпилировалось. теперь при запуске получаю такое... http://www.cyberforum.ru/cpp/thread98890.html
Как понять этот константный указатель? C++
В общем, имеется класс Cat. Объект класса - SimpleCat. И имеется функция с константым указателем: const SimpleCat* const FunctionTwo(const SimpleCat* const theCat) Что обозначают все эти const? Насколько я понимаю: 1. Константный указатель. 2. Может ссылаться только на FunctionTwo 3. Ничего не изменяет в объекте. 4. Ничего не делает с объектом theCat.
C++ Перехват и подмена вызываемых функций
Здравствуйте. Нужно подменить вызов таких функций как open(), lstat(), stat(), read(), write(), mkdir(), chdir(), getcwd() для определенного процесса. Интересует мнение других. Как бы вы реализовали эту задачу. Спасибо!

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17317 / 5565 / 347
Регистрация: 30.03.2009
Сообщений: 15,129
Записей в блоге: 26
02.12.2010, 13:14     Задачи для тренировки и лучшего понимания
Сразу предупреждаю, что задача сложная.

Имеется тест. Тест явился результатом разбора на большой задаче, с ошибкой в которой мы столкнулись на работе. Конструкция __attribute__((noinline)) запрещает компилятору делать подстановку функции (чтобы на оптимизациях там что-нибудь не схлопнулось). Это самый простой способ, чтобы оптимизации гарантированно не убили интересную ситуацию (чтобы не нужно было бы писать более сложные примеры).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
 
double d = 5436277361664796672.000000;
long long ll = 5436277361664796253LL;
 
int __attribute__((noinline))
func1 (void)
{
  double d1 = (double)ll;
 
  if (d > d1)
    return 1;
  else
    return 0;
}
 
int __attribute__((noinline))
func2 (void)
{
  if (d > (double)ll)
    return 1;
  else
    return 0;
}
 
int
main (void)
{
  printf ("%d %d\n", func1(), func2());
  return 0;
}
Этот тест я запускал на intel'е и на sparc'е. Использовал gcc в режиме с оптимизациями и без оптимизаций. Получил следующие результаты:

sparc: "gcc" напечатал "0 0"
sparc: "gcc -O2" напечатал "0 0"
intel: "gcc" напечатал "0 1"
intel: "gcc -O2" напечатал "1 1"

Объяснить расхождение. Так или иначе при разборе ситуации полезно было бы иметь возможность повторить всё это самому, но, понятное дело, практически ни у кого нет возможности запустить этот код на sparc'е. Вместо sparc'а можно попробовать запустить под виндой при помощи microsoft'овского или borland'овского комплятора. Я не знаю, какие они выдадут результаты, но в любом случае что-то с чем-то не совпадёт (потому как мы уже видим три разных результата)

Поскольку задача слишком сложная для начинающего, то оставляю подсказку. Задачу помещаю в первую очередь для того, чтобы на весьма коротком примере, можно было бы пронаблюдать проблему переноса программы с одной архитектуры на другую

Подсказка
SPARC'овский gcc работает правильно. Intel'овский gcc косячит и выдаёт неправильный результат (без оптимизаций он ошибается только в одном примере, с оптимизациями - в обоих)
 
Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru