LINUX.ORG.RU

2
Всего сообщений: 56

Поле типа unique_ptr и деструктор

Добрый день!
Познаю c++

#include <iostream>
#include <memory>

class Foo {
    public:
        Foo(const bool needСhildren);
        ~Foo();
        bool isParent;
        std::unique_ptr<Foo> children;
};

Foo::Foo(const bool needChildren) {
    std::cout << "Construct new Foo" << std::endl;
    if (needChildren) {
        this->isParent = true;
        this->children = std::make_unique<Foo>(false);
    } else {
        this->isParent = false;
    }
    
}

Foo::~Foo(void) {
    std::cout << "Destruct";
    if (isParent) {
        std::cout << " parent ";
    } else {
        std::cout << " children ";
    }
    std::cout << " Foo" << std::endl;
}

void foo() {
    std::cout << "call foo()" << std::endl;
    std::make_unique<Foo>(true);
    std::cout << "end foo()" << std::endl;
}

int main() {
    foo();
    return 0;
}

В консоли

call foo()
Construct new Foo
Construct new Foo
Destruct parent  Foo
Destruct children  Foo
end foo()

Объясните, ткните в стандарт или хоть какое нибудь описание - как вызывается деструктор поля children если в деструкторе явно это не определено? Как поле unique_ptr понимает, что «пора» самоуничтожаться?

 , ,

matroskin ()

hello world на PHP

Слегка расширенный (показывает cl аргумент) хелловорлд:

Раз:

class System {

	public static function out(string $string) {
		$handle = fopen('php://stdout', 'w');
		fwrite($handle, $string.PHP_EOL);
		fclose($handle);
	}

	public static function argv() {
		return @$_SERVER['argv'][1] ? : '';
	}
}

class HelloWorld {

	public static function main(){
		System::out('Hello World! Your argument: '. System::argv() );
	}
}

HelloWorld::main();

И два:

function main(){
	
	function printStdOut(string $string) {

		function stream($handle, string $text) {
			$getHandle = function() use ($handle) {
				return $handle;
			};
			fwrite($getHandle(), $text."\n");
			fclose($getHandle());
		}

		stream(fopen('php://stdout', 'w'), $string);
	}

	function getArgv() {
		return @$_SERVER['argv'][1] ? : '';	
	}
	
	printStdOut('Hello World! Your argument: ' . getArgv() );
}

main();

Может перейти в обучении (скрипто-ЯП прежде всего) на такие вот первые программы-хелловолды? Ну посудите сами: что такое echo/print/etc «Hello World»? Что это за объяснение такое - языковая конструкция, которая "выводит одну или более строк" (из оф.док.)? Или просто "выводит текст" (науч.поп.)? Куда выводит, как выводит, какую строку. Ничего не понятно, пользы мало.

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

Как вариант: можно ли рассматривать написание изоморфных (указанным выше) хелловорлдов в других ЯП, как быстрый старт, в изучении этих самых ЯП опытным программистом? Насколько это будет продуктивно?

 , , ,

Edward_I ()

Помогите написать этот код по-нормальному

Изучаю Rust, решаю всякие задачки. Понадобились простые числа, решил создать вспомогательный «класс» для их генерации. Идея в том, чтобы генерировать последовательность путём стандартного итерирования. Вроде решил, но как-то сложно получилась, какие-то лайфтаймы, мутабельности, такое ощущение, что перемудрил и юзать не очень удобно: нельзя просто написать for p in primes { ... }, только for p in &mut primes { ... }, можно ли как-то получше сделать? Если что, primes должен быть потенциально многоразовый.

fn main() {
    let mut primes = Primes::new();
    let mut counter = 0;
    for p in &mut primes {
        println!("{}", p);
        counter += 1;
        if counter > 10 {
            break;
        }
    }
}

struct Primes {
    cache: Vec<u64>,
}

impl Primes {
    fn new() -> Primes {
        Primes { cache: vec!(2, 3) }
    }
}

impl<'a> IntoIterator for &'a mut Primes {
    type Item = u64;
    type IntoIter = PrimesIterator<'a>;

    fn into_iter(self) -> PrimesIterator<'a> {
        PrimesIterator { cache: &mut self.cache, cache_index: 0 }
    }
}

struct PrimesIterator<'a> {
    cache: &'a mut Vec<u64>,
    cache_index: usize,
}

impl<'a> Iterator for PrimesIterator<'a> {
    type Item = u64;

    fn next(&mut self) -> Option<u64> {
        let result: u64;
        if self.cache_index < self.cache.len() {
            result = self.cache[self.cache_index];
        } else {
            let mut n = self.cache[self.cache_index - 1] + 2;
            loop {
                let mut i = 0;
                let is_prime = loop {
                    let p = self.cache[i];
                    if n % p == 0 {
                        break false;
                    }
                    if p * p > n {
                        break true;
                    }
                    i += 1;
                };
                if is_prime {
                    break;
                }
                n += 2;
            }
            self.cache.push(n);
            result = n;
        }
        self.cache_index += 1;
        Some(result)
    }
}

 ,

Legioner ()

Правильно портировать Pascal код

Был у меня helloworld под офтопик который перехватывал консольный ввод и заменял вводимые символы символом *.

hobbit

Вот код

unit consolepassword;

{$MODE Delphi}

interface

procedure ConsoleGetPassword (var Password : string);

implementation

uses
  SysUtils,Windows;

var
  consoleHandle: THandle;
  ConsoleAttr: _CONSOLE_SCREEN_BUFFER_INFO;


function EnableEcho(const ShowText: Boolean): Cardinal;
begin
  GetConsoleMode(consoleHandle, Result);
  if ShowText then
    SetConsoleMode(consoleHandle, Result or ENABLE_ECHO_INPUT)
  else
    SetConsoleMode(consoleHandle, Result and not ENABLE_ECHO_INPUT);
end;

function KeyPressed: Char;
var
  oldMode: Cardinal;
  bufSize: Cardinal;
begin
  GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), OldMode);
  SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldMode and not
(ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT));
  ReadConsole(GetStdHandle(STD_INPUT_HANDLE), @Result, 1, bufSize,
nil);
  SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldMode);
end;

procedure GotoXY(X, Y: Word);
var
  pos: COORD;
begin
  pos.X := X;
  pos.Y := Y;
  SetConsoleCursorPosition(STD_INPUT_HANDLE, pos);
end;

function GetPassword(const MaskChar: Char = '*'): string;
var
  c: Char;
begin
  Writeln;
  Write('Enter Password: ');

  EnableEcho(False);
  while True do
  begin
    c := KeyPressed();
    case c of
      #13: Break;
      #8:
      begin
        if Length(Result) > 0 then
        begin
          Delete(Result, Length(Result), 1);
          GotoXY(ConsoleAttr.dwCursorPosition.X - 1,
            ConsoleAttr.dwCursorPosition.Y);
          Write(' ');
          GotoXY(ConsoleAttr.dwCursorPosition.X - 1,
            ConsoleAttr.dwCursorPosition.Y);
        end;
      end;
    else
      Result := Result + c;
      Write(MaskChar);
    end;
  end;
  EnableEcho(True);
end;

// main
procedure ConsoleGetPassword (var Password : string);
begin
  consoleHandle := GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(consoleHandle, ConsoleAttr);
  Password := GetPassword();
end;

end.

Я теперь хочу другой helloworld, который использует этот модуль собрать Lazarus'ом под онтопик. Как правильно его перенести на Linux?

 , , ,

Twissel ()

Groovy «Hello world» under linux fails

Привет!

Скачал бинарники груви, простой файл без классов вываливает ошибку:
Caught: java.lang.ClassFormatError: Illegal class name «» in class file
java.lang.ClassFormatError: Illegal class name «» in class file


groovysh выполяет нормально, с опцией -е тоже работает.
Почему не работает в файле ?
Спасибо.

 ,

Vasily22 ()

Разбить stdin по строкам

Короче, хочу что-то типа xargs, или скорее антипод paste.

Дано: программа1 даёт многострочный выхлоп в stdout.

Задача: брать stdout по строкам и для каждой строки вызывать программа2, передавая ей эту строку в stdin.

Помнится, когда-то я наворачивал что-то типа программа1|while read a; echo "$a"|программа2; done, ещё и с IFS шаманил, можно ли проще?

 , , , ,

bodqhrohro_promo ()

Объясните, пожалуйста, хеллоуворлд на перле

Объясните, пожалуйста, хеллоуворлд на перле из википедии:

not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split

 ,

ilja-ilja1990 ()

Не запускается Hello World на gtk+

Что хотел сделать:
https://common-lisp.net/project/cl-gtk2/tutorial.html

что делал:
layman -a lisp
emerge =dev-lisp/cl-gtk2-0.1.1-r1

$ sbcl
* (require :asdf)
* (asdf:operate 'asdf:load-op :cl-gtk2-gtk)

текст ошибки:

debugger invoked on a UIOP/LISP-BUILD:COMPILE-FILE-ERROR in thread
#<THREAD «main thread» RUNNING {1001F16693}>:
COMPILE-FILE-ERROR while compiling #<CL-SOURCE-FILE «iterate» «iterate»>

гайд
https://wiki.gentoo.org/wiki/Project:Common_Lisp/Guide
читал

проблема примерно такая:
http://lisper.ru/forum/thread/1358

«ASDF это фундамент. А без понимания фундамента, как известно, ну и т.п.»

Я НЕХОЧУ ПРО asdf ЧИТАТЬ!!! МЕНЯ ТОШНИТ!!!

мне нужен простой совет, типа - сделай «sudo emerge -av --unmerge =dev-lisp/iterate-1.4.3» и всё заработает...

проблема в том, что на странице
https://common-lisp.net/project/cl-gtk2/tutorial.html
говорят, что эта зависимость нужна (как раз версия >= 1.4.3 как у меня и стоит)

Что делать?

 ,

Einstok_Fair ()

Lazarus - простейший Hello World в Linux

Всем привет!

Подскажите, как в Lazarus сделать простейший Hello World под linux, но только так, чтобы этот Hello World был виден сразу после запуска проекта (без запуска вручную из терминала)? Вот есть пример, но он под Win и модуль wincrt не срабатывает - https://youtu.be/HLSeQze_3-g
PS: cоздание графических кнопочек пожалуйста не предлагать

 ,

Windows ()

Оценки хелловорлда тред

Наваял такой хелловорлд. Как мне кажется, он может даже быть полезным (сам же использую). Вообще он сделан, как и любой хелловорлд, в основном в целях (само)обучения, так что пришёл сюда за критикой и тычками в места, где что-то сделано не так. Просто использовать эту штуку, конечно, тоже не возбраняется.

 , , ,

f1u77y ()

Программа не запускается мышкой.

Скомпилировал простейший хеловорлд в gnome builder. Из него запускается. Из консоли бинарник запускается. А щелкнув мышкой в nautilus получаю окно:

Не удалось показать «hello_world»
Для файлов типа «разделяемая библиотека» не установлено ни одного приложения.

Что это? Почему не работает? +х есть.

 

ult ()

gtkmm 3.0 показать два окна

Нигде не могу найти простой пример для gtkmm, где стартуют сразу два и больше окон. Может подскажете?

Одно окно показываю так:

#include <gtkmm.h>


int main( int argc, char *argv[] )
{
	auto app = Gtk::Application::create();
	Gtk::Window win;
	
	app->run( win );
}

Почитал про Gtk::Application, но ничего путнего не нашел.

 ,

matrasa ()

Python3 управление выводом

Всем привет!

А как сделать в питоне так, чтобы удалялись/обновлялись строки из терминала? print по умолчанию выводит с новой строки, а хочется, чтобы текущая строка перезаписывалась, как, например, в top/htop. Просто не хочется видеть колонку одинаковых или редко меняющихся цифр.

 , ,

aido ()

Подскажите по созданию объекта через переменную

Не могу разобраться, гугол замучал, но решения вопроса пока так и не нашёл.

Не в development ибо «ПО» называть этот хэллоуворлд слишком круто.

Есть 6 классов. От пользователя запрашивается какое количество и каких объектов необходимо создать. 1 = Bicycle, 2 = Bus и т.д.

Соответственно дальше мне надо вызвать метод для создания объекта.

То есть, есть такое:

autoParking.parkInTransport(new Class.forName(setTransportType)("" + lcTransportType + "" + i)); 

Мне нужно, чтобы в зависимости от выбранного пользователем значения вызывалось (new Bicycle), (new Bus) и т.д., а далее - количество этих самых объектов.

Сейчас оно у меня ругается на forName, хотя в гугле у всех всё ок. Пишет «cannot resolve symbol 'forName'». В какую сторону копать? Или как ещё можно подобное реализовать? Сильно влом пихать всю логику в каждый блок из шести только потому, что оно не может найти forName. Хотя при вводе оно знает такую конструкцию и ожидает в скобках String.

Перемещено leave из talks

 , ,

ekzotech ()

Yet another Eclipse-podelie from TI

Всем привет!

Кто-нибудь здесь имел дело с Code Composer Studio (CCSv6)? Если да, то скажите, как в режиме дебага запустить на плате хотя бы Bare-Metal Hello world из стандартных примеров. Если напрямую делать (Создать проект -> Скомпилировать -> Debug), то выдает «a data verification error occurred file load failed». Вот здесь говорится нечто пространное, что надо бы написать linker script, но и с ним появляется та же ошибка. Также, один и тот же linker_script.cmd работает (сборка проходит успешно) в CCSv6, но не может быть подключен к обычному проекту если собирать руками (arm-linux-gnueabihf-gcc main.o -T linker_script.cmd -o hello_world).

Надеюсь, вам цель моя ясна - запустить в режиме дебага на плате Hello world и увидеть через minicom эти слова. Каким именно образом это делать - пофигу, но лучше из консоли. Ах да - плата из серии C66xx.

 ,

aido ()

Проверьте простенькую программу на C

Хочу на компьютере проверить правильность возведения следующей перестановки в некоторую степень:
1 -> 4
2 -> 6
3 -> 3
4 -> 1
5 -> 2
6 -> 5

Для этого написал

#include <stdio.h>
     
int permutation(int *m, int *result);
     
int main()
{
  int m[] = {0, 1, 2, 3, 4, 5, 6};
  int result[7];
  int iterations = 2, i = 1;
  while (i <= iterations)
    {
	permutation(m, result);
	i++;
    }
  for (i = 1; i < 7; i++)
    {
      printf("%d: %d\n", i, result[i]);
    }
  return 0;
}

int permutation(int *m, int *result)     
{
  result[1] = m[4];
  result[2] = m[6];
  result[3] = m[3];
  result[4] = m[1];
  result[5] = m[2];
  result[6] = m[5];     
}

Собственно, вопрос — почему функция permutation исполняется только один раз независимо от значения переменной iterations? Не вижу своей ошибки.

 , ,

Hasek ()

GCC не компилирует Hello World на Java

Добрый день! Допустим, беру образец отсюда и, перейдя в директорию с кодом, пишу в консоли gcj HelloWorld.java -o 'Hello World Java', на что получаю:

/usr/lib64/gcc/x86_64-slackware-linux/4.8.2/../../../../lib64/crt1.o: In function `_start':
/glibc-tmp-4ccf9267168e2e05acf2dfdc0e86d1bb/glibc-2.17/csu/../sysdeps/x86_64/start.S:119: undefined reference to `main'
collect2: error: ld returned 1 exit status
Что не так и как это поправить? Как будто чего-то не хватает, хотя в системе есть даже JDK.

 , , ,

Hasek ()

Как правильно собирать бинарные пакеты?

Поясните, как работают debuild и makepkg/PKGBUILD. Постоянно ими пользуюсь, но некоторые аспекты мне до сих пор не ясны.
Общая схема мне понятна: в изолированном окружении запускается сборка, потом установка в префикс, потом упаковка в архив.
Но как это изолированное окружение выглядит? Ведь в это изолированное окружение нужно доустановить все зависимости. А ещё в этом изолированном окружении должен быть компилятор и куча утилит? Не, это уже перебор. Так как же это работает?
Давайте по шагам рассмотрим пример создания пакета для GNU Hello:

  1. Скачиваем исходный код и распаковываем его (тут всё ясно)
  2. Подготавливаем наше изолированное окружение и запускаем в нём скрипт configure (как именно должно выглядеть это изолированное окружение? это chroot? что именно должно быть в этом окружении? только зависимости данного пакета (libc, libintl, libiconv в данном случае)? баш, мейк и компилятор тоже должны там быть или они как-то вызываются извне? полагаю, что на данном этапе устанавливать --prefix не нужно, так как он может быть куда-нибудь захардкожен, так что prefix тут должен быть таким же, как на целевой системе (--prefix=/ в общем случае), верно?)
  3. Запускаем в этом изоляторе компиляцию и ждём (тут тоже всё понятно, кроме того, откуда же в изолированном окружении компилятор)
  4. Устанавливаем наш пакет в определённый префикс и упаковываем его в архив, чтобы этот префикс для архива был корнем (непонятно, откуда этот префикс берётся — создаётся ли ещё одно пустое изолированное окружение или всё банальнее?)

Буду рад, если объясните мне просто и на пальцах.

 , , , ,

CYB3R ()

DCPoppler — PDF-просмотрщик для Double Commander

https://github.com/bodqhrohro/DCPoppler

Проектики мои таки сдвигаются с мёртвой точки. Посему держите, с пылу, с жару.

Double Commander, пожалуй, самая вменяемая нынче свободная альтернатива Total Commander в качестве браузера ФС. Что такое браузинг ФС и зачем это нужно. Для Ъ: обмазанный плагинами TC позволяет:

  • в считанные нажатия подручных клавиш бегать по структуре каталогов и навигироваться по их содержимому
  • прозрачно работать со всевозможными архивами, образами, установщиками, пакетами и т. п., а также с удалёнными ФС
  • просматривать файлы туевой хучи форматов на месте, в соседней панели, без открытия дополнительных окон всякого жирнософта, и быстро переключаться между ними благодаря п. 1.

Киллер-фича DC в том, что он, помимо аналогичного и даже местами лучшего клавоюзабилити, совместим с API плагинов TC. Но вот беда: подавляющее большинство плагинов написано только под винду. Конечно, есть вайн, но в нём нет интеграции с IE/WMP, многий другой софт, виджеты которого через ActiveX дёргают плагины, плохо фурычит, да и ставить его в довесок к основному софту надо, архиваторы системные также не поюзать толком, особенности никсовых ФС не учитываются и прочие прелести скрещивания ежа с ужом.

Что делает настоящий линуксоид, когда нет нужного софта? Вот и держите. Поделие задумано ещё год назад, поначалу была затяжная переписка с автором по поводу получения хедеров для C/C++ (на видном месте лежат только для Delphi), потом борьба с багой в стабильной версии DC, из-за которой плагины вообще не подгружались (кто ж знал, кали их нет, если не считать полурабочий wlxmplayer), а когда с этим утряслось и начало что-то продвигаться — проект замёрз и вот только начал оттаивать.

ВНИМАНИЕ! НЕПЕРЕВАРЕННЫЙ КУСОК ГОВНОКОДА ПО ССЫЛКЕ ЯВЛЯЕТСЯ ХЕЛЛОУВОРЛДОМ В ВАКУУМЕ. ТАКЖЕ ВВИДУ ОТСУТСТВИЯ (ПОКА) ЛИЦЕНЗИИ — ПО ДЕФОЛТУ ЭТО ПРОПРИЕТАРЩИНА. ВОЗМОЖНЫ РВОТНЫЕ ПОЗЫВЫ И ВОЗГОРАНИЯ В ОБЛАСТИ ТАТУИРОВКИ ЛИКА СТОЛЛМАНА. ВАС ПРЕДУПРЕДИЛИ. А вообще, он уже пригоден к использованию, если устраивает просмотр неотресайзенной первой страницы и отсутствие обработки ошибок, от которого ФМ может теоретически упасть. Также важно учесть, что плагин работает только с GTK-сборками DC. А всё потому, что API прибито гвоздями к тулкиту и под Qt надо чуть ли не отдельный плагин писать.

Вообщем, тянем репу, ставим (с dev-пакетами, если бинарный дистро) libgtk2 и libpoppler-glib. В мейкфайле вхардкожены пути для Debian/amd64, при необходимости правьте руками. Запускаем make, при успехе идём в настройки DC: «Параметры...» -> «Плагины» -> «Плагины просмотрщика (.WLX)», и добавляем туда свеженький билд. Детект-строка --- (EXT="PDF"). Можна жамкнуть на PDF-нике просмотр и грабеть корованы. Если чё, УМВР, пруфы: http://pic4a.ru/62/UN.png http://pic4a.ru/62/wQ.png

Ближайшие планы:

  • скроллинг, мать его. И подгон под ширину контейнера
  • пейджер, продублированный хоткеями, когда панель в фокусе
  • масштабирование

И хватит пока. Остальное по пожеланиям. Пулл реквестз аа велкам туу, овкоз.

Когда этот будет готов, запилю ещё для HTML аналогичный на вебките. И на культи потом оба портирую. И для .webarchive не помешал бы, а то насохранял в своё время в Safari кучу страниц, а он под вайном не работает даже, и распаковать этот ваш BPLIST нечем, хотя формат простой, как валенок. Можна ещё просмотрщик заголовков для эльфов запилить, отображающий всякие секции, дерево зависимостей и т. п., по типу FileInfo для PE/MZ.

А вообще, не знаю, зачем я это сюда принёс. Ну найдётся на ЛОРе пару десятков апологетов графических двухпанельников. Из них 3,5 сидят на DC. Одному плагин даже, возможно, будет полезен. И у того не соберётся. А на форум DC запощу, когда будет чуть более готово, ибо тихий ужас.

 , , , ,

contra_sperm_spero ()

Hello, Matrix!

Недавно тут пришлось тряхнуть стариной, а именно написать код который выводит диагонали (в простейшем случае квадратной матрицы) от a(11) до a(33), соответственно, сверху вниз, слева направо.

Пример достаточно эффективной реализации описан тут

Решение задачи «в лоб»

#include <stdio.h>

 
int main(){
    int row_count, col_count, cur_row, cur_col;
    int matrix[3][3] = { 1, 2, 3,
			 4, 5, 6,
			 7, 8, 9};
    printf("Printing matrix diagonally\n");
    for(col_count = 0; col_count < 3; col_count++){
        cur_col = col_count; cur_row = 0;
        for(;cur_col >= 0 && cur_row < 3; cur_col--, cur_row++){
            printf("%d ", matrix[cur_row][cur_col]); 
        }
        printf("\n");
    }
    for(row_count = 1; row_count < 3; row_count++){
        cur_col = 2; cur_row = row_count;
        for(;cur_col >= 0 && cur_row < 3; cur_col--, cur_row++){
            printf("%d ", matrix[cur_row][cur_col]); 
        }
        printf("\n");
    }
     
    getchar();
    return 0;
}

Но все же, господа, хочется, чтобы код был читабельным и эффективным. А посему, версии на Си++ с обертками на основе std::vector также очень приветствуются.

Так как принцип обхода элементов матрицы я вроде бы понял, но ощущения неуклюжести от применяемых методов меня не покинуло.

Вот запостил эту фигню сюда :-)

 , , ,

Twissel ()