Я вычисляю случайные цвета для своего приложения. Они находятся в формате rgba, и я тестировал различные версии для раскраски. Сейчас я хочу полностью непрозрачные кубики, но так как это может изменить я реализовали окраску, как это:Dartium crash on integer shift
int r = rnd.nextInt(255);
int g = rnd.nextInt(255);
int b = rnd.nextInt(255);
int a = 255;
int color = (r & 0xFF) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | ((a & 0xFF) << 24);
код прямо сейчас повторяется в течение прибл. 13 000 кубиков. Или я должен сказать, что так будет. Потому что dartium падает («Aw, Snap! Что-то пошло не так, пока вы показываете эту веб-страницу»). Ради «wtf», если я установил точку останова на a = 255;
и до продолжения удаления этой точки останова работает и отображается правильно. Я должен сказать, что прямо сейчас, чтобы точно найти проблему, я вообще не использую цвет, ее просто передают как параметр другой функции, которая не использует ее. Если я не передам его функции, нет сбоя, я думаю, потому что он полностью оптимизирован.
Ну, чтобы сделать вещи даже страннее следующая строка работает:
int color = (r & 0xFF) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | 0xFF000000;
Это должно быть технически такой же. Даже дальнейшее тестирование дало следующие результаты: Если a < 64
в первой версии -> нет аварии. Если a >= 64
-> авария.
И для устранения путаницы: int a = rnd.nextInt(255);
, который дает значения> = 64 работы каждый раз с первой версией.
/EDIT: И еще одна версия, которая не откажет:
int r = rnd.nextInt(255);
int g = rnd.nextInt(255);
int b = rnd.nextInt(255);
int a = 0xFF.toInt();
int color = (r & 0xFF) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | ((a & 0xFF) << 24);
/EDIT2: Я открыл вопрос о проекте, чтобы держать в синхронизации, вот ссылка: https://code.google.com/p/dart/issues/detail?id=16633
Я просто ничего не вижу или это довольно нежелательное поведение?
Как говорится, «Иногда такие сюрпризы случаются в Дарт, не часто, а регулярно. Главное, всегда здесь быть готовым к этому». Предупрежден - значит вооружен. – mezoni