Поле типа «канал» выдает ошибку «Невозможно инициализировать переменную по умолчанию универсального типа» - PullRequest
4 голосов
/ 27 марта 2019

В этом коде я создаю класс, содержащий канал, который может быть открыт по запросу при инициализации. Для этого я передаю флаг, указывающий, открыт канал или нет (вместе с его именем файла).

class Myclass
{
    var writeflag : bool;
    var output : channel;

    proc init( writeflag = false, filename = "" )
    {
        this.writeflag = writeflag;
        if writeflag {                   // (1)
            assert( filename != "" );
            this.output = openwriter( filename );
        }                                // (2)
    }
}

proc main()
{
    var a = new owned Myclass( writeflag = true,
                               filename = "test.out" );
    a.output.writeln( 123 );
}

Однако компилятор отклоняет приведенный выше код с сообщением:

myclass.chpl: 6: ошибка: невозможно инициализировать переменную по умолчанию для универсального типа myclass.chpl: 6: примечание: «не полностью создан» имеет универсальный тип «канал»

С другой стороны, если я закомментирую (1) и (2), код работает как положено и создает «test.out». Я предполагаю, что проблема связана с общим характером channel (согласно сообщению об ошибке), но не очень уверен, как правильно написать такой код ...

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

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

Вына правильном пути.Запись канала имеет несколько полей параметров, которые должны быть предоставлены во время компиляции.Вы можете указать эти параметры в объявлении поля:

var output : channel(writing=true, kind=iokind.dynamic, locking=false);
0 голосов
/ 29 марта 2019

Следуя предложениям в ответе и комментарии, я изменил свой код следующим образом.Поскольку конкретный тип запомнился немного, я создал псевдоним типа и использовал его в спецификации класса (здесь для * общности locking=true см. docs ).

// utils.chpl
type Writer = channel( true,  iokind.dynamic, true );
type Reader = channel( false, iokind.dynamic, true );    

// test.chpl
use utils only Writer;

class Myclass
{
    var writeflag : bool;
    var output : Writer;

    // ... the remaining is the same
}
...