LINUX.ORG.RU

Сообщения Mg_usr

 

C++ : undefined reference to namespace function

Файл animals.cpp:

#include <iostream>
#include "dog.h"

int main(int argc, char* argv[]) {
    DOG::bark();
    return 0;
}

Файл dog.h:

namespace DOG {
    void bark();
}

Файл dog.cpp:

#include "dog.h"

void DOG::bark() {
    std::cout << "bark" << std::endl;
}

При компиляции выдаёт ошибку:

$ LC_ALL=C g++ animals.cpp
/tmp/ccDBJCRI.o: In function `main':
animals.cpp:(.text+0x2c): undefined reference to `DOG::bark()'
collect2: error: ld returned 1 exit status

Что я не так делаю?

P.S.: Мой основной язык — Java.

 ,

Mg_usr
()

Java — private volatile fields without getters

В программе сложные вычисления выполняются в отдельном потоке:

public class MyThread extends Thread {

    private volatile boolean running = false;

    public void setRunning(boolean run) {
        running = run;
    }

    ...
}

Переменная (поле) running используется для управления выполнения потока (в методе run() ). Поле running имеет только сеттер (setRunning() ). Т.е., другие потоки не могут получать значение этой переменной / не зависят от неё. Сам метод setRunning() вызывается из основного потока и, соответственно, выполняется в основном потоке, а не в потоке MyThread. Поэтому возможен случай, когда потоки выполняются на разных ядрах процессора, и при выполнении метода setRunning() в основном потоке / на одном ядре, переменная running может(?) кэшироваться в кэш-памяти этого ядра процессора: http://tutorials.jenkov.com/java-concurrency/volatile.html. Хотя переменная running принадлежит потоку MyThread, ей незачем кэшироваться в кэш-памяти этого ядра, на котором выполняется основной поток. Тем временем, на другом ядре, поток MyThread может прочитать значение переменной running, которая не синхронизирована. Или такое не может произойти?

  • Так, нужно ли объявлять переменную running (которая private и без геттера) как volatile?

P. S. private volatile fields without getters -> частные Летучие поля без добытчиков  — © Google Translate :)

 ,

Mg_usr
()

NetBeans не видит Java классы (файлы) из той же директории

В учебных целях я создаю классы (файлы) с помощью проводника, а потом их открываю в NetBeans, т.е. не создаю проект. Возможно из-за этого, но NetBeans не видит другие классы из той же директории, вследствие чего не могу использовать автодополнение: пруф1, пруф2, пруф3.

Сам же javac благополучно скомпилирует: $ javac *java.

Как с этим можно бороться (в смысле с NetBeans, не с javac:) )? Да и что, вообще, не так со шрифтом?

 , , ,

Mg_usr
()

Неинициализированные переменные в C++ при использовании разных опций оптимизации g++

Есть простой код, в котором используются неинициализированные переменные:

#include <iostream>

void func1();

int main()
{
    std::cout << "    main()" << std::endl;;
    
    int i;
    std::cout << "int\ti = " << i << std::endl;
    
    double d;
    std::cout << "double\td = " << d << std::endl;
    
    unsigned i2;
    std::cout << "unsign.\ti2 = " << i2 << std::endl;
    long int li;
    std::cout << "l int\tli = " << li << std::endl;
    
    func1();
    return 0;
}

void func1()
{
    std::cout << "    func1()" << std::endl;;
    int a;
    std::cout << "int\ta = " << a << std::endl;
    bool b;
    std::cout << "bool\tb = " << b << std::endl;
}


Если его собрать без оптимизации: c++ -o prog1 prog1.cc, то бинарник выводит

$ ./prog1
    main()
int     i = 0
double  d = 6.95273e-310
unsign. i2 = 0
l int   li = 4197312
    func1()
int     a = 32535
bool    b = 180

Т.е. в теле функции main() переменные типу int, short int, unsigned int, вроде как, инициализируются нулями. Значение остальных переменных, как и положено, неопределенно.

Если же его собрать с оптимизацией (-O1, -O2 или -O3): c++ -O2 -o prog1 prog1.cc, то бинарник уже выводит

$ ./prog1
    main()
int     i = 0
double  d = 0
unsign. i2 = 0
l int   li = 0
    func1()
int     a = 0
bool    b = 0
Выходит что при включении оптимизации, вообще, все переменные инициализируются(?).

Собственно, вопрос: почему переменные сами инициализируются при включении оптимизации? И почему если собрать без оптимизации, в теле функции main() переменные типу int, short int, unsigned int, char, bool, float инициализируются, а переменные типу long int, long long, double, как и положено, не инициализируются?

 , , ,

Mg_usr
()

Приведение типов

Из той же книги:

int num;
double sq_root;
...
sq_root = sqrt((double) num);

Какой смысл привести переменную num к типу double, ибо функция sqrt() и так принимает аргумент типу double?

 

Mg_usr
()

xor в C++. Так, есть или нет?

Из книги Г. Шилдта — «C++. Базовый курс»:

Несмотря на то что C++ не содержит встроенный логический оператор «исключающее ИЛИ» (XOR)...

В книге говорится, что оператор xor в C++ нет, но g++ (v. 5.4.0) на инструкции

cout << "P XOR Q: " << (p xor q) << '\n';
не возмущается. Так, есть или нет оператор xor в C++? Или его добавили в новых стандартах?

 ,

Mg_usr
()

Какие пакеты необходимо установить для программирования

Изучаю (точнее, повторяю) C/C++ по книге http://www.opennet.ru/docs/RUS/zlp/. Установил пакет gcc. Для сборки программ мне нужно установить ещё пакет make (он не установился вместе с gcc; кажется, и не должен был). В самом пакете gcc, как я понял, есть только компилятор C, C++ нет. Тогда мне нужно установить ещё и компилятор C++. Это пакет g++?

Какие вообще (ещё) пакеты нужны для разработки программ? Пакета build-essential, как в Debian, в моём дистрибутиве (Mageia) нет.

 , ,

Mg_usr
()

Установка пакетов изолированно от системы

Задача: установить изолированно от системы:

  • .rpm / .deb пакет из локальной папки;
  • пакет из репозитории с помощью менеджера пакетов.

По идее это можно сделать с помощью chroot — изменить корневой каталог, и потом установить пакет; примерно так:

mkdir ~/new_root
cd ~/new_root
sudo chroot .

Да, именно так я себе и представлял это сначала :-) Просто недавно с помощью chroot поднял загрузчик grub2 и подумал что это будет так же просто.

Конечно, такой номер не пройдёт: sudo chroot . выводит chroot: failed to run command ‘/bin/bash’: No such file or directory. Я так понял, new_root должна быть не «пустой папкой», да?

Как вообще можно установить пакеты изолированно от системы?

 , ,

Mg_usr
()

Монтирование разделов внутреннего диска без root пароля

Предыстория: так как вышла новая версия Mageia 6, решил «начать с начала» — форматнул диск, установил Windows 7 (я наконец-то перешел с XP на 7 :) ), разбил GParted-ом и установил Mageia, в конце диска оставил неразмеченными 100+ Гб. После установки загрузился с Live USB GParted и разбил неразмеченную область на 2 раздела — NTFS, общие разделы для обеих систем.

В чем проблема: не могу монтировать эти два раздела из-под user. Точнее в проводнике Dolphin на левой панели есть группа Устройства (Devices) где отображаются разделы диска, usb-накопители и др.. Так вот, когда я нажимаю на эти раздели система просить root пароль для их монтирования; а разделы с внешнего USB HDD монтируются таким способом без проблем. К тому же, в старой системе (Mageia 5.1) такой проблемы не было, правда при её установке все разделы были уже созданы.

Вариант с /etc/fstab не предлагать, так как я не хочу чтобы разделы монтировались автоматически при старте.



______________________________Update 30.07.2017 10:50______________________________

Старое заглавие: Монтирование NTFS раздела без root пароля

Оказывается, что при монтировании даже ext4 раздела внутреннего диска тоже требуется пароль (форматировал один из разделов в ext4). То есть выходит, что для монтирования / демонтирования ЛЮБОГО раздела внутреннего диска требуется пароль. Так и должно быть?

 , ,

Mg_usr
()

crtime - камень преткновения ИЛИ будет ли Linux в XXI веке уметь (нормально) работать с временем создания файла

Файловая система ext4 была выпущена 2008 года. Она кроме (стандартных) mtime, ctime и atime aka facepalm, сохраняет crtime и dtime. Чтобы прочитать crtime (время создания файла) нужны debugfs и, соответственно, root права, что, мягко говоря, неудобно.

Ещё в далёком 2006 некий Theodore Tso писал:

Shoehorning an extra creation time field into the inode is relatively easy, but it's also necessary to have system calls to get and set the creation time. The stat structure doesn't have room for the creation time, so that means a new version of the stat structure exported the kernel, and a new version of the stat structure exported by glibc.

So there are VFS and glibc changes necessary to make this be useful. But that doesn't prevent us from reserving space in the inode and starting to fill it in with the creation time, although it may be quite a while before it will be easily available to user programs like Samba.

«it may be quite a while» — в годах это сколько? :)

Есть какие-то продвижения в этом направлении? Существует ли дистрибутив который более-менее умеет работать с временем создания файла?

Что конкретно хочу (это касается не только ФС ext4 но и NTFS и FAT):

  • Чтобы можно было посмотреть время создания файла (crtime) стандартными способами (через проводник, без root прав).
  • Чтобы можно было переместить файлы / папки с сохранением crtime (допиленный cp ? или, по крайней мере, допиленный touch).

 

Mg_usr
()

GnuCash - как дать / взять в долг?

Как в GnuCash ввести такие операции:

  1. Дать в долг,
  2. Получить отданный долг,
  3. Взять в долг,
  4. Вернуть долг?

Все операции без %.

 

Mg_usr
()

GnuCash - ведение учётов с несколькими валютами

Как правильно вести учёт в GnuCash с несколькими валютами?

Например, я хочу получить отчёт по счетам (Активы, Пассивы, Капитал, Доходы, Расходы; суб-счета) для каждой валюты отдельно. Поэтому я создал базовые счета (Активы, Пассивы, Капитал, Доходы, Расходы) для каждой валюты. Получилось щось_таке: http://img11.lostpic.net/2017/05/02/8630932c479739c2a376bd35fefd5144.png

Это вообще правильный подход?

Есть еще галочка Use Trading Accounts (Использовать торговые счета) в File->Properties->Account. Прочитал здесь: https://wiki.gnucash.org/wiki/Trading_Accounts и по диагонали здесь: (Внимание, многабукаф!) http://www.mscs.dal.ca/~selinger/accounting/tutorial.html и ниченепонял. Не совсем понял что за «торговые счета» и как эта функция работает.

 

Mg_usr
()

Обязательно ли устанавливать Oracle JDK 7 для Android Studio?

В интернете куча разных мнений:

от

Официально рекомендуется использовать Oracle JDK, но можно поставить и OpenJDK. Раньше с ним были серьёзные проблемы, тормоза. Но сейчас всё работает сносно.

до

Android Studio requires Oracle Java 1.6 or later. It won’t work with OpenJDK.

 , ,

Mg_usr
()

VLC зависает при открытии видео-/аудио-файлов. Как решил проблему

Вырубилось электричество когда смотрел видео в VLC плеере. После этого VLC начал зависать при открытии видео- / аудио-файлов, при этом звук шёл как будто ничего и не висело. Но программа нормально работала если её просто так запустил из меню / консоли. Переустановка программы не помогла.

Решил проблему удалением папки ~/.config/vlc

 

Mg_usr
()

Время создания файлов, сохраненных под ФС FAT32

Как узнать / изменить время создания файлов, сохраненных на карте памяти под ФС FAT32 ?

 , ,

Mg_usr
()

Mageia - cбилось разрешение экрана

Вчера cбилось разрешение экрана после вырубания электричества (аккумулятор был снят с ноутбука, ноутбук работал от сети). В тот момент была запущена игра с меньшим разрешением экрана. При загрузке, во время выбора ОС (загрузчик GRUB), и при выборе пользователя разрешение экрана нормальное - 1366x768. Когда появляется рабочий стол разрешение экрана сбивается в 1024x768. Изменил настройки разрешение экрана вручную на «Flat Panel 1366x768» - не помогло. Думаю виноват в этом KDE. Как его заставить работать под разрешением 1366x768?

 ,

Mg_usr
()

KDE: панель рабочего стола

В KDE настроил, чтобы развернутые окна перекрывали нижнюю панель рабочего стола. Но, если подвести указатель мыши к краю экрана она все равно появляется. Как сделать, чтобы панель не появлялась?

(ОС: Mageia)

 , ,

Mg_usr
()

RSS подписка на новые темы