Vala код со статической структурой не работает после обновления до 0.44 - PullRequest
0 голосов
/ 15 марта 2019

Только что сделал стандартное собеседование, чтобы рассчитать объем воды в гистограмме. В понедельник этот код работал, и все еще работает на этом сайте. После обновления vala теперь отображается ошибка.

UPD: проще пример

> Algoritm.vala:2.5-2.16: error: struct `Algotitm.first' cannot be empty
>     struct first {
>     ^^^^^^^^^^^^ Algoritm.vala:6.5-6.17: error: struct `Algotitm.second' cannot be empty
>     struct second {

1 Ответ

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

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

По предоставленной вами ссылкепохоже, что у вас есть структура, в которой только члены помечены как static:

struct First {
    static int data;
    static int pos; 
}

void main () {
}

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

Вам необходимо удалить модификаторы static.Это будет работать:

struct First {
    int data;
    int pos;
}

void main () {
}

Обновление

Я предполагаю, что вы пытаетесь написать оптимизированный код производительности, и вы думаете, что static помогает в этом.static в Vala означает, что нет данных экземпляра для использования.Если вы используете структуру данных, такую ​​как класс или структура, то имеет смысл иметь только их экземпляры.Если вы хотите, чтобы что-то осталось неизменным во время работы вашей программы, используйте const в пространстве имен.

Использование структуры может дать вам небольшое повышение производительности, если вы используете в программе очень большое число.структуры, созданные в Vala, размещаются в стеке, а не в куче, поэтому могут быть немного быстрее.Если вы передаете структуры вокруг, вы можете рассмотреть атрибут [SimpleType].Это означает, что структуры будут передаваться по значению в C, а также в Vala.Без [SimpleType] они копируются и передаются по ссылке на уровне C, который отображается в Vala как копирование по значению.

Структуры в Vala могут иметь инициализаторы (аналогично конструктору для класса) и методы.Итак, что я могу извлечь из вашей второй пастбины, вы можете написать так:

struct First {
    int data;
    int pos;

    public First (int[] mass) {
        data= 5;
        pos = mass.length;
    }

    public int sas () {
        return data + pos;
    }
}

void main () {
    int[] a = {1,3,0,1,2,3,2,1};
    var b = First (a);
    print (@"$(b.sas ())\n");
}

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

...