инициализировать массив циклом в Eiffel

Я изо всех сил пытаюсь инициализировать массив или массив строк из файла при использовании цикла, но каждая функция, которую я использую, - put/enter/force ничего не работает. массив время от времени заполнялся последней строкой, которую я читал, хотя я обращаюсь к определенному индексу, который я увеличиваю на каждой итерации. (Я попытался добавить обычную постоянную строку, и это сработало, я не понимаю разницы.

Спасибо всем, кто поможет.

tArray:ARRAY[STRING] -- declaring
create tArray.make_empty

readingFile() --function
local
    k:INTEGER_32
do
    from k:=0
    until curFile.end_of_file
    loop
        curFile.read_line
        curLine:=curFile.last_string
        tArray.force (curLine, k)
        --tArray.put(curLine, k)
        --tArray.enter (curLine, k)
        --tArray.at (k):=curLine
        --tArray.force ("sara", k+1)
        k:=k+1
    end
end

person Noy Moshkovitz    schedule 05.06.2018    source источник
comment
Я думаю, что ваша проблема в том, что вы всегда помещаете одну и ту же строку в список. Когда вы делаете curFile.read_line, он изменяет объект curFile.last_string, но не создает новый экземпляр STRING. Попробуйте сделать tArray.force (curLine.twin, k) вместо tArray.force (curLine, k).   -  person Louis M    schedule 05.06.2018
comment
спасибо! работал с tArray.force(curLine.out,k), у меня старая версия Eiffel Studio.   -  person Noy Moshkovitz    schedule 05.06.2018


Ответы (1)


Функция read_line не создает каждый раз новый строковый объект, а повторно использует последний. Другими словами, last_string всегда относится к одному и тому же объекту. Решение состоит в том, чтобы использовать клон объекта, связанного с last_string, на каждой итерации:

curLine := curFile.last_string.twin
person Alexander Kogtenkov    schedule 05.06.2018