Изменение длины строки (выделение памяти под символы)

def get_avail_mb(): int

    f: FILE = FILE.open("/proc/meminfo","r")
    s: string = ""
    while s.length < 200 do s += " "
    f.read(s, 200, 1)

    var a = s.split("\n")
    s = a[2]
    t: string = ""
    for var i = 0 to s.length
        if s[i] <= '9' && s[i] >= '0'
            t += s[i].to_string()
    return int.parse(t)/1000

Обратите внимание, как я распределяю строку по 200 символов с помощью while s.length < 200 do s += " " для чтения байтов в эту строку из файла? Есть ли лучший способ установить длину строки в N символов в Genie, кроме добавления пробела N раз?


person exebook    schedule 23.03.2017    source источник


Ответы (2)


Вероятно, лучший способ — создать массив фиксированного размера в качестве буфера и преобразовать буфер в строку. Это позволяет избежать некоторых предупреждений C при компиляции. Компилировать с valac --pkg posix example.gs:

[indent=4]
uses
    Posix

init
    print( @"Available memory: $(get_avail_mb()) MB" )

def get_avail_mb():int
    f:FILE = FILE.open("/proc/meminfo","r")
    buffer:uint8[200]
    f.read(buffer, 200, 1)

    result:int = 0
    match_result:MatchInfo
    if ( /^MemAvailable:\s*([0-9]*).*$/m.match(
                                            (string)buffer,
                                            0,
                                            out match_result
                                            ))
        result = int.parse( match_result.fetch( 1 ))/1000
    return result

В качестве альтернативы вы можете попробовать string.nfill ():

[indent=4]
uses
    Posix

init
    print( @"Available memory: $(get_avail_mb()) MB" )

def get_avail_mb():int
    f:FILE = FILE.open("/proc/meminfo","r")
    s:string = string.nfill( 200, ' ' )
    f.read(s, 200, 1)

    result:int = 0
    match_result:MatchInfo
    if ( /^MemAvailable:\s*([0-9]*).*$/m.match(
                                            s,
                                            0,
                                            out match_result
                                            ))
        result = int.parse( match_result.fetch( 1 ))/1000
    return result
person AlThomas    schedule 23.03.2017
comment
скомпилировать, используя строку: valac --pkg posix string.gs - person dotbit; 23.02.2019

да, просто избегайте ужасного цикла for, который не может обрабатывать некоторые угловые случаи!

person Community    schedule 23.02.2019