LINUX.ORG.RU

Ошибка со счётчиком

 ,


0

1

Собственно, есть простой кусок скрипта в Scilab:

k = 1;

while ~meof(inp_file)
    data = mfscanf(100, inp, '%d,%d,%d,%d,%d,%d,%d,%d,%d,'); 
        
    C1(:, k) = data(:, 2);
    C2(:, k) = data(:, 3);
    C3(:, k) = data(:, 4);
    //etc.
        
    k = k + 1;
    //pause
    if modulo(k, 100) == 0
        printf('-');
    end
    if modulo(k, 1000) == 0
        printf('%i\n', k);
    end
end

Xubuntu, Scilab 5.5.1 — всё работает:

----------1000
--
Read 1279 blocks.
Тот же файл с данными, тот же скрипт, Windows, Scilab 5.5.2 — выдаёт ошибку 21 Invalid index. Действительно, если раскомментировать pause и посмотреть на значение k — там будет какой-то мусор. В чём подвох?

Ответ на: комментарий от hotpil

Файл один и тот же на обеих системах. Сейчас на другом файле надо бы проверить.

Та же ошибка.

-->co_data = readpar('061013O_b.par');
22377 blocks in the file.
----------1000
----------2000
----------3000
----------4000
----------5000
----------6000
----------7000
----------8000
----------9000
----------10000
----------11000
----------12000
----------13000
----------14000
----------15000
----------16000
----------17000
----------18000
----------19000
----------20000
----------21000
----------22000
--- !--error 21 
Неправильный индекс.
at line      38 of function %cblock_e called by :  
at line      37 of function readpar called by :  
co_data = readpar('061013O_b.par');
readpar — моя функция, blocks in the file — первоначальный подсчёт по меткам начала блока, чтобы не перераспределять память в цикле.

Казалось бы, meof отрабатывает по-разному, но тогда ошибка возникала бы в районе C1(:, k) = data(:, 2);, при попытке записать значения за границу массива. А у нас она исчезает, если убрать modulo и печать.

al_exquemelin ★★★ ()

Вдогонку вопрос: можно ли такую тягомотину

C1(:, k) = data(:, 2);
C2(:, k) = data(:, 3);
C3(:, k) = data(:, 4);
//etc.
записать как-нибудь покороче и изящнее? В трёхмерный массив всё запихать — тоже как-то не слишком. К тому же мне эти массивы нужны для varargout.

al_exquemelin ★★★ ()
Ответ на: комментарий от al_exquemelin

22377 blocks in the file.

То есть большой такой файл. Windows и Linux по разному выделяют память для процесса. Стек, например, имеет разные ограничения. Поэтому попробуй маленький файл, из нескольких записей, который точно пределов памяти не достигает.

hotpil ★★ ()
Ответ на: комментарий от hotpil

Поэтому попробуй маленький файл, из нескольких записей

Да не, тот файл на 1279 блоков тоже не срабатывает под виндой. Разве что проверить совсем маленький.

Посмотрел ещё раз k по pause — растёт как надо (странно, откуда в первый раз я увидел многобайтный мусор). Вероятно, счётчик всё-таки на единицу вылезает за границу массива, выделенного через zeros, но всё равно непонятно, почему всё работает под Linux и почему положение спасает исключение modulo и disp.

al_exquemelin ★★★ ()