Пример из книги D не работает, странная ошибка

Все,

Я использую Xamarin Studio 4.08 и Mono-D для программирования D с компилятором DMD2. Когда я пытаюсь скомпилировать следующее (из язык программирования D - Александреску, 2010- стр. 10):

import std.array;
bool binarySearch(T)(T[] input, T value)
{
    while (!input.empty)
    {
        auto i = input.length / 2;
        auto mid = input[i];
        if(mid > value) input = input[0 .. i];
        else if(mid < value) input = input[i + 1 .. $];
        else return true;
    }
    return false;
}

unittest
{
    assert(binarySearch([1, 3, 6, 7, 9, 15], 6));
    assert(!binarySearch([1, 3, 6, 7, 9, 15], 5));
}

Я получаю следующую ошибку при компиляции:

: Error: std.array could not be resolved - library reference missing?

Однако график усложняется, когда я закомментирую assert(binarySearch([1,3,6,7,9,15], 6));, потому что это приводит к очень своеобразной ошибке:

lolwtfbbqsauce

Во-первых, отсутствует библиотека, во-вторых, это 16-битное приложение. Я знаю, что в этой книге есть опечатки, но этого в ней нет.

ОБНОВИТЬ

Скомпилировал с rdmd test.d --main и получил следующие ошибки, используя тот же код...

OPTLINK (R) for Win32  Release 8.00.13
Copyright (C) Digital Mars 1989-2010  All rights reserved.
http://www.digitalmars.com/ctg/optlink.html

OPTLINK : Warning 23: No Stack
C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)

Error 42: Symbol Undefined __fltused
C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined __d_assert_msg

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined __d_throwc

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined _D3std4conv21ConvOverflowException6__ctorMFAyaAyakZC
3std4conv21ConvOverflowException

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined _D3std4conv21ConvOverflowException7__ClassZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined __d_newclass

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined _D3std4conv8__assertFiZv

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined _D3std4conv13ConvException7__ClassZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined _D3std4conv13ConvException6__ctorMFAyaAyakZC3std4con
v13ConvException

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined _D12TypeInfo_Aya6__initZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
Error 42: Symbol Undefined __d_arrayappendT

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std6format7__arrayZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined __d_arraycopy

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std5array7__arrayZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _memcpy

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined __d_newitemT

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D4core6memory2GC6extendFNaNbPvkkZk

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D4core6memory2GC6qallocFNaNbkkZS4core6memory8BlkInf
 o_

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined __LDIV@

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D16TypeInfo_Pointer6__vtblZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D15TypeInfo_Struct6__vtblZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined __ULDIV@

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std6format15FormatException6__ctorMFAyaAyakC6obje
 ct9ThrowableZC3std6format15FormatException

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std6format15FormatException7__ClassZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std3utf6encodeFNaNfKG4awZk

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std5array8__assertFiZv

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined __d_arraysetcapacity

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std3utf8__assertFiZv

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std3utf7__arrayZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std3utf12isValidDcharFNaNbNfwZb

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std3utf12UTFException6__ctorMFAyakAyakC6object9Th
 rowableZC3std3utf12UTFException

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std3utf12UTFException7__ClassZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined __adDupT

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D14TypeInfo_Array6__vtblZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D10TypeInfo_a6__initZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D14TypeInfo_Const6__vtblZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D9Exception7__ClassZ

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std9exception7bailOutFNaNfAyakxAaZv

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std5ascii7isDigitFNaNbNfwZb

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D6object9Exception6__ctorMFNaNbNfAyaAyakC6object9Th
 rowableZC9Exception

C:\Users\Aaron\AppData\Local\Temp\.rdmd\rdmd-test.d-AB3FF68B659C1090C52A7CFC868F
8061\objs\test.obj(test)
 Error 42: Symbol Undefined _D3std5array12__ModuleInfoZ
OPTLINK : Warning 134: No Start Address
--- errorlevel 41

Что я сделал не так на этот раз? :П


person nerdenator    schedule 31.05.2013    source источник


Ответы (1)


В коде нет ошибок.
За исключением того, что в нем нет функции main, поэтому вы не можете запустить скомпилированную программу. Вы можете попросить компилятор добавить для вас функцию main. Просто используйте переключатель -main.

rdmd – это оболочка сценария DMD.
Вы получаете ошибки, поскольку rdmd рассматривает все аргументы после имени файла как переключатели. для вашей программы. Попробуйте rdmd --main test.d.

person sigod    schedule 31.05.2013
comment
Глядя в книгу (хотя и беглый взгляд), ни один из примеров, которые приводит Андрей, не содержит одновременно unittest И main. - person nerdenator; 01.06.2013
comment
@AaronMcRuer, я только что добавил void main() {}, и он компилируется без ошибок или предупреждений. - person sigod; 01.06.2013
comment
Примечание: я компилирую из консоли. - person sigod; 01.06.2013
comment
@AaronMcRuer Можно сгенерировать заглушку main при запуске модульных тестов следующим образом: rdmd --main -unittest code.d TDPL написан с использованием компилятора через консоль и не может отвечать за настройку сборки для конкретной IDE. - person Mihails Strasuns; 01.06.2013
comment
Так отметил. Я буду помнить об этом, используя примеры testunit. - person nerdenator; 02.06.2013
comment
Скомпилировано с этими параметрами, выдало ошибки, отредактированные в исходном сообщении. - person nerdenator; 02.06.2013