Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Функции для работы с памятью
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_nina imported_nina вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2010
По умолчанию 19.05.2010, 01:05

Помогите, пожалуйста, решить следующую задачу.

Реализовать работу с памятью как набор функций над типами:
type Addr = Integer
type Value = Integer
type Memory = Address -> Value

load::Memory -> Integer — загрузить число из указанной ячейки памяти.
store::Memory -> Address -> Integer -> Memory — выгрузить число в указанную ячейку памяти.
isEmptyMemory:: Memory.
Ответить с цитированием
  (#2 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 20.05.2010, 12:59

Цитата:
Помогите, пожалуйста, решить следующую задачу.

Реализовать работу с памятью как набор функций над типами:
type Addr = Integer
type Value = Integer
type Memory = Address -> Value

load::Memory -> Integer — загрузить число из указанной ячейки памяти.
store::Memory -> Address -> Integer -> Memory — выгрузить число в указанную ячейку памяти.
isEmptyMemory:: Memory.
Код:
type Address = Int

type Value = Int

type Memory = [Value]


unused = -1

alloc' :: Int -> Memory
alloc' i = replicate i unused 


store :: Memory -> Address -> Value
store m i = m !! i

load :: Memory -> Address -> Value -> Memory
load m i v = 
  case splitAt i m of 
    (a, b) -> a ++ v : tail b --concat [a, v : tail b]


isMemoryEmpty :: Memory -> Bool
isMemoryEmpty m = all (== unused) m
Ответить с цитированием
  (#3 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 21.05.2010, 18:03

Или более развернуто:
Код:
import Control.Monad
import Control.Monad.State
import Data.List
import Data.Maybe

import qualified Data.Set as Set


data M_Handle_Flag = Unset

data M_Handle = M_Handle { addr :: Int, size :: Int } deriving (Eq, Ord, Show)


-- Basic

findSubId :: Eq a => [a] -> [a] -> Maybe Int
findSubId [] _ = Just 0
findSubId p  x = find' x 0
    where find' x i | p `isPrefixOf` x = Just i
          find' x _ | null x =  Nothing
          find' x i = find' (tail x) (i + 1)


def  = -2
def' = -1

def_block  i = replicate i def


data M_Global a = M_Global { memory :: [a], allocated :: Set.Set M_Handle }


makeM_Global = M_Global (repeat def) Set.empty


directSet  v i = 
  modify $ \x' -> case splitAt i (memory x') of 
                         (a, b) -> x' {memory = concat [a, v : tail b]}
                         
directSet' v i =  
  modify $ \x' -> case splitAt i (memory x') of 
                         (a, b) -> x' {memory = concat [a, v, drop (length v) b]}
                         
directSetR' v s i = directSet' (replicate s v) i


findFreeBlock i = (fromJust . findSubId (def_block i) . memory) `liftM` get
                
                  
                  
allocate i = do i' <- findFreeBlock i
                let handle = M_Handle i' i
                modify $ \m_g -> m_g { 
                      allocated = handle `Set.insert` allocated m_g 
                  }
                directSetR' def' i i'
                return handle

allocate' r = return r

free h'@(M_Handle addr size) = do modify $ \m_g -> m_g {
                                        allocated = h' `Set.delete` allocated m_g 
                                    }
                                  directSetR' def size addr
    


rangeCheck (M_Handle addr size) i = i >= 0 && size > i

validCheck handle = get >>= \m' -> when (not $ handle `Set.member` allocated m') 
                                        (fail $ "Error: unknown handle - " ++ show handle)


load handle i value = do validCheck handle 
                         when (not $ rangeCheck handle i)
                              (fail $ concat["Error: [write]: Out of range - ", show handle, ", Local: ", show i])
                         
                         directSet value (i + addr handle) 


store handle i = do validCheck handle
                    when (not $ rangeCheck handle i) 
                         (lift $ print $ "Warning: [read]: Out of range in block - " ++ show handle ++ ", Local: " ++ show i) 
                    gets $ \m' -> (memory m') !! (i + addr handle)


testMem :: StateT (M_Global Int) IO [Int]
testMem = do block0 <- allocate 4
             block1 <- allocate 8
             block2 <- allocate 16
             
             load block0 3 255
             load block1 3 255
             load block2 3 255
             
             v0 <- store block0 4
             v1 <- store block1 8
             v2 <- store block2 16
             
             free block1
             
             _ <- store block1 3
             
             return [v0, v1, v2]

runtestmem = evalStateT testMem makeM_Global
Код:
 runtestmem
"Warning: [read]: Out of range in block - M_Handle {addr = 0, size = 4}, Local: 4"
"Warning: [read]: Out of range in block - M_Handle {addr = 4, size = 8}, Local: 8"
"Warning: [read]: Out of range in block - M_Handle {addr = 12, size = 16}, Local: 16"
*** Exception: user error (Error: unknown handle - M_Handle {addr = 4, size = 8})
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
api для работы с кэш памятью one_awful_sing C++ Builder 8 12.04.2012 19:13
Если связь между кеш памятью процессора и оперативной памятью? omen88 Любые вопросы от новичков 6 04.06.2010 00:15
Двуканальный режим работы с памятью. Airhand Память 2 08.04.2010 22:28
Имеются ли api функции для работы с таблицами excel beacon WinAPI 1 01.09.2008 18:01
Где найти книгу по C++ для работы с оперативной памятью MurzET Visual C++ 2 08.06.2007 12:05
функции работы со строками Pyshkin Delphi 7 28.09.2006 21:18
Как понять принцип работы функции legrandmetre С/С++ 5 27.11.2005 16:28
API-функции для работы с MathCAD Павел Безяев Visual C++ 9 16.02.2005 18:45
Функции работы с таймером Vasis WinAPI 2 18.11.2004 17:32
Оптимизация работы с памятью Eliace С/С++ 4 25.01.2004 23:16
Функции для работы с com портом Anonymous WinAPI 1 26.11.2003 12:18
Какие функции имеются под MFC или API-функции для работы с Hint Anonymous Visual C++ 1 12.10.2003 00:15



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов