в ocaml се опитвам да напиша функция, която приема като аргумент 32-битово цяло число без знак. Въпреки това имам проблеми с определянето на правилния идентификатор, който да използвам в декларацията на типа на функцията. Чрез гугъл успях да намеря само int32. Благодаря
Функция, чийто аргумент е 32-битово цяло число без знак
Отговори (2)
Int32 модели подписани 32 -битова аритметика. Ако планирате само да предавате такива стойности (например, за да ги съобщите на C API) или да използвате операции, които не зависят от подписа, като add
, mul
, sub
, можете да използвате Int32
съвсем добре. Делението и модулът се прилагат по различен начин за числа със знак и без знак, така че не трябва да използвате тези от модула Int32.
(Имаше предишна дискусия за caml-list по тази тема.)
В момента използвам SharedPreferences, за да следя списък с елементи, върху които да извърша работа в BroadcastReceiver, стартиран чрез AlarmManager. Всичко работи чудесно, с изключение на определен сценарий. Когато задействам нов елемент, върху който да извърша работа, оставям го да свърши работата, след което премахвам този елемент (всички чрез редакции на SharedPreferences), той работи прекрасно, докато приложението работи. Когато няма нищо в списъка и отворя диспечера на задачите и затворя приложението, изведнъж елементът се появява обратно в BroadcastReceiver (който все още работи, след като приложението се затвори). Какво причинява това поведение? Трябва ли просто да убия всички приемници при излизане от приложението? Затварянето на дейността връща ли се по подразбиране към различен обект SharedPreferences, когато приемникът все още работи?
Код за добавяне/премахване на елементи от обекта SharedPreferences
final SharedPreferences prefs = context.getSharedPreferences(Config.PREFS_NAME,
Context.MODE_PRIVATE);
final Editor editor = prefs.edit();
mUpdates = prefs.getStringSet(Config.PREFS_KEY_ACTIVE_TASKS, new HashSet<String>());
if (!mUpdates.contains(key)) {
mUpdates.add(key);
} else {
mUpdates.remove(key);
}
editor.putStringSet(Config.PREFS_KEY_ACTIVE_TASKS, mUpdates);
editor.apply();
Кодът на излъчващия приемник
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = context.getSharedPreferences(Config.PREFS_NAME, Context.MODE_PRIVATE);
if(prefs.contains(Config.PREFS_KEY_ACTIVE_TASKS)) {
Set<String> updates = prefs.getStringSet(Config.PREFS_KEY_ACTIVE_TASKS, null);
if(updates != null) {
Log.d("RECEIVER","Size="+updates.size());
for(String key : updates) {
EntityChangeManager.notifyListeners(key);
}
}
}
}
Когато стартирам кода за добавяне/премахване на обекти от първоначалния списък, както се очаква, виждам
04-30 20:04:44.165: D/RECEIVER(27079): Size=1
04-30 20:04:44.165: D/RECEIVER(27079): Size=0
Когато убия приложението, виждам
04-30 20:04:43.244: D/ActivityThread(27079): setTargetHeapUtilization:0.25
04-30 20:04:43.244: D/ActivityThread(27079): setTargetHeapIdealFree:8388608
04-30 20:04:43.254: D/ActivityThread(27079): setTargetHeapConcurrentStart:2097152
04-30 20:04:43.264: D/RECEIVER(27079): Size=1
Интересни места:
- Приемникът работи всяка секунда
- Приемникът се стартира от AlarmManager
- Няма специални настройки в декларацията
- Това може да се повтори след деинсталиране на приложение, изчистване на всички предпочитания в приемника (в случай че е използвал различен)
Int32.t
в int
на 64-битова система, например, няма директен начин да третирате стойността Int32.t
като неподписана.
- person hcarty; 05.06.2016
mul
не зависи от подписаност?!
- person Andreas Abel; 13.08.2016
Като добавим към отговора на gasche има библиотека, която предоставя модул с тип uint32 и съответните операции (включително разделяне) - ocaml-uint .