Функция, чийто аргумент е 32-битово цяло число без знак

в ocaml се опитвам да напиша функция, която приема като аргумент 32-битово цяло число без знак. Въпреки това имам проблеми с определянето на правилния идентификатор, който да използвам в декларацията на типа на функцията. Чрез гугъл успях да намеря само int32. Благодаря


person artella    schedule 29.08.2012    source източник


Отговори (2)


Int32 модели подписани 32 -битова аритметика. Ако планирате само да предавате такива стойности (например, за да ги съобщите на C API) или да използвате операции, които не зависят от подписа, като add, mul, sub, можете да използвате Int32 съвсем добре. Делението и модулът се прилагат по различен начин за числа със знак и без знак, така че не трябва да използвате тези от модула Int32.

(Имаше предишна дискусия за caml-list по тази тема.)

person gasche    schedule 29.08.2012
comment
Здравей, благодаря. Разгледах дискусията за caml-list. Споменава се само деление и модулът е проблем, но предполагам, че модулът също е проблем? - person artella; 29.08.2012
comment

В момента използвам 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
  • Няма специални настройки в декларацията
  • Това може да се повтори след деинсталиране на приложение, изчистване на всички предпочитания в приемника (в случай че е използвал различен)
- person gasche; 29.08.2012
comment
В caml-списъка те също имаха предвид модула, така че може би има проблем и с модула? - person artella; 29.08.2012
comment
Друг случай, при който разликата може да има значение, е при конвертиране между типове. Ако конвертирате Int32.t в int на 64-битова система, например, няма директен начин да третирате стойността Int32.t като неподписана. - person hcarty; 05.06.2016
comment
От кога mul не зависи от подписаност?! - person Andreas Abel; 13.08.2016

Като добавим към отговора на gasche има библиотека, която предоставя модул с тип uint32 и съответните операции (включително разделяне) - ocaml-uint .

person ygrek    schedule 29.08.2012
comment
За бъдещи читатели тази библиотека е продължена в github.com/andrenth/ocaml-stdint - person Edgar Aroutiounian; 12.12.2015