金子邦彦研究室プログラミングOctave の活用Octave バージョン 3.2.4 で imread, imfinfo, file_in_path 等が動かないバグ

Octave バージョン 3.2.4 で imread, imfinfo, file_in_path 等が動かないバグ

バグの内容

Octave 3.2.4 で,imread, imfinfo等を実行しようとすると, ファイルは存在するのに,「C:\Octave\3.2.4_gcc-4.4.0\share\octave\3.2.4\m\image\imread.m imread: cannot file ...」のようなエラーメッセージが出て進まない.

imread("r:/lena_std.jpg")

[image]

バグの原因

file_in_path の振る舞いがおかしい

■ バージョン 3.2.3 での実行例(ディレクトリを絶対パスで指定している.ファイル名が得られている).

[image]

バージョン 3.2.4 での実行例

ディレクトリを絶対パスで指定している.ファイル名が得られない.

[image]

ディレクトリを相対パスで指定している場合.この場合も,ファイル名が得られない.

[image]

file_in_path.m の書き換え

Window の minGW 版 Octave の場合, ファイル名は,C:\Octave\3.2.4_gcc-4.4.0\share\octave\packages\oct2mat-1.0.7/file_in_path.m になる

■ 書き換え前


function name=file_in_path(p,file)
  idx=[1 findstr(p,pathsep) length(p)+1];
  for i=1:length(idx)-1
    if idx(i+1)-idx(i)<=1, continue; end
    dir=p(idx(i)+1:idx(i+1)-1);
    name = fullfile(dir, file);
    fid = fopen(name,"r");
    if fid >= 0,
      fclose(fid);
      return
    end
  end
  name=[];

■ 書き換え後


function name=file_in_path(p,file)
  idx=[1 findstr(p,pathsep) length(p)+1];
  for i=1:length(idx)-1
    if idx(i+1)-idx(i)<=1
      dir=strcat(pwd,"/");
    else
      dir=p(idx(i)+1:idx(i+1)-1);
    end
    name = fullfile(dir, file);
    fid = fopen(name,"r");
    if fid >= 0
      fclose(fid);
      return
    end
  end
  fid = fopen(file,"r");
  if fid >= 0,
    fclose(fid);
    name=file;
    return
  end
  name=[];

■ 試しに実行してみる