D Ошибки автоматического типа (проблема с 64-разрядной версией?) - PullRequest
6 голосов
/ 16 марта 2012

Немного предыстории: я нахожусь на Mac OSX Lion (очевидно, 64-битная), и я долгое время являюсь Java-разработчиком, заинтересованным в изучении D.

Я взял копию Языка программирования D , и меня смущают некоторые вещи. Во-первых, если я попробую что-то вроде следующего (прямо из книги):

int[] months = new int[12];
foreach (i, ref month; months) {
    month = i + 1;
}

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

Ошибка: невозможно неявно преобразовать выражение (i + 1LU) типа ulong в int

Это исправлено изменением i на int i.

Я думаю, это потому, что автоматический тип для чисел на 64-битной платформе равен ulong, и поэтому вывод типа на самом деле не работает.

Теперь у меня есть следующая проблема:

bool binarySearch(T)(T[] input, T value) {
    // ...
    int i = input.length / 2;
    // ...
}

Возвращает следующую ошибку компиляции:

Ошибка: невозможно неявно преобразовать выражение (input.length / 2LU) типа ulong в int

Кастинг это исправляет, но я бы не хотел. Я также получаю другие глупые ошибки, связанные с получением long значений из вычислений и невозможностью использовать их для индексации в массивах. 64-битная поддержка D еще не до конца? Что я могу сделать, чтобы избежать проблем в будущем, изучая D? Необходимость явного использования приведений и типов повсюду кажется противоположностью того, что привлекло меня в первую очередь к языку ...

Ответы [ 2 ]

9 голосов
/ 16 марта 2012

Я думаю, это потому, что автоматический тип для чисел на 64-битной платформе очень длинный, и поэтому вывод типа не сработает.

Правильно. Если это ошибка в TDPL, вам, вероятно, следует сообщить об ошибке. Индексная переменная foreach операторов обычно всегда имеет тип size_t.

Ошибка: невозможно неявно преобразовать выражение (input.length / 2LU) типа ulong в int

Измените свой код на:

size_t i = input.length / 2;

Или даже лучше, так что вам не нужно думать об этом:

auto i = input.length / 2;

То, что вы видите, это, по сути, полноценная поддержка 64-битных массивов. size_t разрешается в собственный целочисленный тип и используется для индексации массива и длины массива.

0 голосов
/ 22 июня 2014

на будущее

кому-то

int[] months = new int[12];
foreach (int i, ref month; months) {
    month = i + 1;
}
...