LINUX.ORG.RU

Язык D - segmentation fault

 


0

2
class Simple
{
        uint a;

}

int main()
{
        Simple cctb;

        cctb.a = 0;

        return 0;
}

И gdc, и dmd компилирют, но запускаемая программа сегфолтится.

Если же в программе нет классов, то не сегфолтится

★★★★★

Последнее исправление: maxcom (всего исправлений: 1)

valgrind в помощь.

AIv ★★★★★
()

А какие-нибудь конструкторы в этом языке предусмотрены? Трудно поверить, что экземпляр класса после создания сам расфасовывает свою внутреннюю структуру нужными данными.

AlexCones ★★★
()

может переменную объявил, а проинициализировать - нет. Это же класс, а не структура.

Atlant ★★★★★
()
Ответ на: комментарий от AlexCones

Есть дефолтный пустой конструктор.

Проблема решилась написанием

auto s = new Simple; вместо Simple s;

Почему так можно, а по предыдущему нельзя, неясно

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

вполне ясно, ты объявил что такая то переменная будет иметь тип ссылка на класс. А выделить память на сам класс - сразу не выделил.
P.S. Учи классический С/С++ прежде чем браться за чтото новенькое.

Atlant ★★★★★
()
Ответ на: комментарий от Atlant

ты объявил что такая то переменная будет иметь тип ссылка на класс. А выделить память на сам класс - сразу не выделил.

Удивительно, если dmd и gdc не выдают ворнинги на этот счет.

metar ★★★
()
Ответ на: комментарий от Atlant

вполне ясно, ты объявил что такая то переменная будет иметь тип ссылка на класс. А выделить память на сам класс - сразу не выделил.

Когда я объявляю Simple s, если Simple - struct, то все работает. Если Simple - class, то segfault.

Из описания языка неочевидно, почему так происходит.

Когда же я деалю new Simple, то динамически выделяю память.

Непонятно, почему статически память не выделяется.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от metar

Удивительно, если dmd и gdc не выдают ворнинги на этот счет.

В языке D нет ворнингов - программа либо компилируется, либо нет.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

если я правильно помню все объекты классов инициализируются только в динамической куче (аналогично delphi,freepascal), на стеке не инициализируются. В С/С++ это разрешаелось, а тут - нет.

Atlant ★★★★★
()
Ответ на: комментарий от Atlant

В C++ данный код работать будет, если конечно 'a' сделать public.

Reset ★★★★★
()

Это код вроде как почти идентичен такому коду на с++

struct Simple
{
    int a;
};

int main()
{
    Simple *a;
    a->a = 0;
}
неудивительно, что он подает.

nanoolinux ★★★★
()

D-проблемы :) фига себе

кажется, это первый пост на ЛОРе с практическим вопросом по этому языку

Harald ★★★★★
()

Язык D - segmentation fault

Язык D — один большой сегфолт :)

По сабжу уже все объяснили — память не выделена.

buddhist ★★★★★
()

В D2 (на счёт первой версии не знаю) с классами нельзя работать по значению. Только как с ссылками. Соответственно, создавать их экземпляры можно _только_ с помощью new.

anonymous
()
Ответ на: комментарий от anonymous

Как-то я криво выразился, но суть ведь понятна, правда?

anonymous
()
Ответ на: комментарий от V_L_A_D

Ну я в общем-то потому и спросил, что не вижу, но, может, в чем-то она есть. Спросил, потому что не понимаю механизма.

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

поэтому и советую изучать начать с С/С++ (по нему _очень_ много книг) прежде чем приниматься за новые малоописанные языки

Atlant ★★★★★
()
Ответ на: комментарий от Atlant

советую изучать начать с С/С++

Так разумеется так и сделано.

И большей частью знаю их.

Но с подобными проблемами я в них не сталкивался.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от true_admin

си шарп умеет segfault?

Естественно, вместо сегфолта получишь отлавливаемый NullReferenceException, но посыл в том, что поведение ссылок и структур такое же в C#.

dave ★★★★★
()
Ответ на: комментарий от anonymous

Соответственно, создавать их экземпляры можно _только_ с помощью new.

И gdc, и dmd компилирют

??

гениально. Делать так нельзя, но собрать можно, да ещё не получив ни варнинга =) Счастливой отладки, суки? кто-нибудь рефакторил код, поменял структуры на классы, забыл в одном месте добавить new...

deadman ★★
()
Ответ на: комментарий от deadman

гениально. Делать так нельзя, но собрать можно, да ещё не получив ни варнинга =) Счастливой отладки, суки? кто-нибудь рефакторил код, поменял структуры на классы, забыл в одном месте добавить new...

Угу, и этим людям чем-то не нравится C++.

O02eg ★★★★★
()
Ответ на: комментарий от deadman

В D нельзя заменить структуру на класс. Структура это тип значения, а класс — ссылочный. Для этого надо переделывать весь код.

at ★★
()
Ответ на: комментарий от Atlant

Можно и на стеке инициализировать, если очень надо. Просто используйте ключевое слово scope. Например, «scope s = new Simple;».

lomereiter
()
Ответ на: комментарий от at

В D нельзя заменить структуру на класс. Структура это тип значения, а класс — ссылочный. Для этого надо переделывать весь код.

Ну так что компилятор отвечает на такую попытку замены?

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

Ну так что компилятор отвечает на такую попытку замены?

ничего

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от static_lab

Код не компилируется. Данный пример компилируется потому, что здесь фактически

class Simple
{
        uint a;
}

int main()
{
        Simple cctb = null; // переменная проинициализированна,
                            // но объект не создан
        cctb.a = 0;
        return 0;
}
то есть происходит разыменование нулевого указателя.

at ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.