• ベストアンサー

プログラミング言語 rubyを用いて、

プログラミング言語 rubyを用いて、 画像処理プログラミングを書こうとしていますが、以下の点が分かりません。 1・メモリの動的確保はどうするの?(C言語でいうmalloc) 2・ファイルから配列に展開するにはどうしたらいいの? 以上が分かればわかるきがするのですが・・ 当方 C言語での画像処理プログラミングはそれなりに経験があるのですが rubyで実現できるのかわからなくて・・

  • Ruby
  • 回答数3
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

1. rubyではメモリを確保する必要はありません。必要なときに動的に確保されて、使用されなくなったら自動で開放されます。 どうしても確保したいときは、 str = " " * 256 等とすれば、(char*)型のようなものが確保できます。 外部プログラムを呼び出すときに、バッファが必要と指定されているのであれば、上記のように確保しておきます。(win32APIを使うときに目したくらいで、大抵は使わないと思います) メモリ開放をどうしても手動で制御したいときは、 http://www.ruby-lang.org/ja/man/html/GC.html を参照するとよいです。 2. ファイルからのバイナリ読み込み例は $KCODE="NONE" #←文字列等をバイト型で扱う file = File.open("hoge.bmp") file.binmode #←windowsの場合に必要 file.seek(10) buf = file.read(4) file.close 等とすれば、最初からオフセット10から4バイト読み込みます。詳細はFileとIOのリファレンスを参照ください。 (FileのスーパークラスがIOなのでFileオブジェクトからは両方のメソッドが使えます。) http://www.ruby-lang.org/ja/man/html/File.html http://www.ruby-lang.org/ja/man/html/IO.html readで読み込んだ戻り値は、文字列(Stringクラスのオブジェクト)ですから、上記例なら、 buf[0] #←オフセット10の文字コード(バイナリ値) buf[0,1] #←オフセット10の1バイトの文字列 buf[1,2] #←オフセット11から2バイトの文字列 ということになります。 ちなみに、Stringクラスはバイナリ情報も扱えます。詳細はStringリファレンスを参照ください。 http://www.ruby-lang.org/ja/man/html/String.html byte型以外のバイナリを扱うには、unpackメソッドを使いますのでこちらのリファレンスも参照ください。 http://www.ruby-lang.org/ja/man/html/pack_A5C6A5F3A5D7A5ECA1BCA5C8CAB8BBFACEF3.html numarray = buf.unpack("i*") #int型の配列に変換。

momokotug
質問者

お礼

ご回答ありがとうございます いくつかヒントを下さりありがとうございます。 私がとりあえず実現したいのは、bmpを読み込んで、そのまま別のファイルにbmpとして吐き出す ことなのですが、 $KCODE="NONE" #←文字列等をバイト型で扱う file = File.open("Valhalla.bmp") file.binmode #←windowsの場合に必要 file.seek(18) width=file.read(4) file.seek(22) height=file.read(4) print("width = ",width, "\n") file.seek(54) buf = file.read(3) file.close の様に書いているのですが、、、printの段階で、コンソールに width= 空白 となってしまったりして本当に値がとれているのかわからなくて・・・ 申し訳ありませんが bmp→bmpを教えて頂けないでしょうか 単純に全部のメモリを読み込んで 全部書き込むといった方法ではなく width,heightを取得してから、 ループ等で、書き込みたいのです。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

>width=file.read(4) >print("width = ",width, "\n") 空白じゃなくて、バイナリをそのまま出力しているはずです。ファイルにリダイレクトして16進表示でもしてみるとわかります。 widthに入った4バイトのバイト列を、リトルエンディアン符号無し32bit整数として解釈したいと言うことだと思います。 width.unpack("V")[0] で、整数値が得られます。 Cは型が弱いので、int変数にファイルから読み込んだり出来ますが( fread(&n, sizeof(int),1,fp) )、Rubyが型(クラス)の区別を厳密にするので、ファイルから読み込んだ物はバイト列で、バイト列を整数と解釈するためには明示的な変換が必要です。

  • nemuiq1
  • ベストアンサー率50% (1/2)
回答No.1

1.メモリ動的確保 Rubyはガーベッジコレクタによるメモリ自動管理なので、 意識しなくても自動で確保・開放がされます。 メモリを意識しない分、「本来やりたい実装」に集中できます。 Javaもそんな感じです。(全く同じ仕組みで開放するのかは知りませんが) 意図的にfreeにする方法もあるのでしょうが、私はやったことがないから分かりません。 探してみたらこんなサイトを見つけたのでURLをば。 <<http://www.ruby-lang.org/ja/man/html/DL_PtrData.html>> 試してみて、うまくいけたら教えてください^^ 2.ファイルから配列に csvファイルですが、ちょうど実装した直後なので参考になれば。 require "csv" class Main def initialize  #変数の初期化  @hairetsu = []  filenm = "filename001.csv"    #csvファイル読み込み  csvRead(filenm)    end def csvRead(file)  #ファイルをオープン  csvReader = CSV.Open(file)  #ファイルを1行ずつ読み込む  csvReader.each{|row|   #配列に1行分を入れる   @hairetsu << row.join(",")  }  #ファイルを閉じる  csvReader.close end end

関連するQ&A

  • c言語のmalloc関数、またrealloc関数

    c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。

  • JAVAはどんなプログラミング言語を用いて開発されたんですか?

    JAVAに関して質問があります。 (1)JAVAはどんなプログラミング言語を用いて開発されたんですか? (例えばC言語で作成されたとか) (2)JAVAで作られたプログラミング言語とかはありますか? (例を挙げるとRubyやHSPはC言語で書かれているとか、なでしこはDelphiで書かれているとかです。)

  • apache,ruby(PHP),cの連携について

    C言語で書いたプログラムをプロセスとして立ち上げておいて、Rubyからそのプロセスに値を渡してCのプログラムを実行することは可能でしょうか。 以下に、現在の構成とやりたいことを記載します。 【構成】 OS:CentOS httpd:apache 使用言語:Ruby(or PHP)、C言語(OpenCV) 【やりたいこと・概要】 ユーザがブラウザからパラメータを入力し、そのパラメータを元にサーバで画像処理を行い、その結果をユーザへXMLで返したい。 その際に、画像処理を行うプログラム(C言語)では、ディスクから大量のデータをメモリにロードするため、処理時間がかかります。そこで、C言語はプロセスとして常に上げておくことで、メモリへのロード時間を削減したい。 【やりたいこと・流れ】 1.ユーザが、ブラウザから値を入力し、POSTする 2.Ruby(or PHP)で受け取る 3.受け取った値をC言語で書かれたプログラム(OpenCVを利用した画像処理プログラムで、これをプロセスとして常に上げておきたい)へ連携する 4.連携された値を元に画像処理を行い、処理結果をRuby(or PHP)へ返す 5.Ruby(or PHP)で受け取った情報をXMLにして、ユーザへ返す ※ Ruby(or PHP)と書いた部分はC言語をプロセスとしてあげておいてPOSTを受け取ることが出来ればC言語での実装でも構いません。 乱文になってしまい読みづらくて申し訳ありません。 情報の過不足などが有りましたらご指摘をお願いします。 お分かりになる方、ヒントでも構いませんので教えて頂ければ幸いです。 以上です。よろしくお願い致します。

  • プログラミング言語についての質問

    かなり初歩的な質問です。 現在、プログラミングに興味をもっています。 しかし、C言語やJava、Rubyなどたくさんの種類があって正直良く分かりません。 言語が違うとその用途や目的も大きく変わるのでしょうか? 大変申し訳ないんですが、初心者なのでかなり優しく教えていただけるとありがたいです。 ぜひ、回答よろしくお願い致します。

  • C言語プログラミング

    C言語プログラミングを作成したいのですが、全くわかりません… 成績処理についてのプログラミングお願いします! キーボードから試験の点数を読み込み0.5を掛ける。つぎに課題点を読み込み0. 25を掛ける。2つを加えて四捨五入してこれを授業点(75点満点)として表示。そして演習点(25点満点)を読み込み授業点に加え全体成績(100点満点)として表示する。最後に判定をして、0~59点は「不可」、60~69点は「可」、70~79点は「優」、それ以外は「入力ミス」と表示。 これをC言語プログラミングお願いします。

  • プログラミングで困ってます

    与えられた画像ファイルをC言語によって、配列に読み込み、新しい画像ファイルとして 書き出そうとしましたが、できませんでした。 画像データを読み込むための配列は2次元配列で、ポインタを用いた動的メモリの確保を行います。 また、読み込みと書き込みは関数として定義します。 画像ファイルの仕様は ・8bitグレースケール画像 ・画像サイズは512*512 ・Rawフォーマット(画素値はラスタスキャン順にバイナリ形式で保存)

  • おすすめのプログラミング言語を教えて下さい

    昨日、プログラミング言語について質問させて頂きました。その結果、basic、Ruby, JavaScript, Python, Perl, PHP、C,C#,を勧められました。 しかしどれから勉強すればいいかわからず、また質問しようという考えにたどり着きました。 この中の言語ではどれがお勧めでしょうか? また、basicはVB、VBAなどがあり、どれのことを指しているのかが理解出来ないのでそのあたりも教えてくださると嬉しいです。

  • プログラミング言語の住み分けについて

    はじめまして。ほぼ初心者です。 某書籍の一文なのですが、 A君「博士!CGIはPerlでつくるものなのですか?」 博士「いや、別にCでもC++でもなんでもいいんだよ」 私{・・・(メダパニ&コンヒュ)} 私{CGI・・・Common Gateway Interface、ということは、APIのようなものか?GetメソッドやらPostメソッドでのデータを受信?して処理できれば言語は何でもいい、ということだろうか???} 前提として、 言語は C/C++ Java Perl PHP Ruby VB(や.net系) ジャンル 組み込み系 Web系C/S(C側 S側) 非Web系C/S(C側 S側)(…クライアント側にWebブラウザを使わないものの意味です) 単体アプリ C/C++ C++はオブジェクト指向で、最もマシン語に近い。処理高速。 Java オブジェクト指向 WriteOnce(非OS依存) 処理時間は??? Perl 文字列処理が得意らしいが、たいていのことはできる??? PHP htmlに埋め込んで使うらしい。PHPのみのアプリはあるのか不明。 VB(や.net系) MS製品上でしか動かない。 ※Javaは、処理内容や動作環境によって、JSPとかAppletとか呼ばれる という知識があります。 ここで、疑問なのですが、これらのプログラミング言語の住み分けはどのようになっているのでしょうか? 私の持っている答えと疑問は以下のとおりです。 ・組み込み系ではマシン語に近いC/C++が使われる  ⇒組み込み系以外ではC/C++は使われないの?LinuxOSはアセンブリ?言語とC言語だったような。。OSに近い処理をするアプリではC/C++も現役? ・「いまやWebアプリ開発といえばJavaである」と偉い人が言っていた  ⇒RubyとかPHPとかとの住み分けはどのような感じ?"大は小を兼ねる"で、Javaさえできれば、RubyやPHPと同じものを作れるの?(手間隙は別として) ・サーバーサイドJavaという言葉があるくらいだから、Web系、非Web系を問わず、C/SシステムではC側もS側もJavaで作るのがよいの? ・Perlを用いて、文字列処理やテキスト処理を他の言語よりも簡易に処理することができる。GUI開発はできない。  ⇒Linux上でも動くアプリのGUI開発は、C/C++か、Javaでないと作れないの?(MS.netはMS製品上でしか動かないGUI開発なので除く)  ⇒例えば、FirefoxとかThunderBirdなんかはJava?それともC++? ・VB.net、VC#などはMSの製品上でしか動かない。  ⇒MS依存言語というところにあまり魅力を感じないのですが・・・。  ⇒Javaと例えばVB.netとで、同じアプリを作るときに、手間隙が同じだったらJavaで作ったほうがいいんじゃないの?それともその「手間隙」が大きく違ってくるの? ・Perlは文字列処理に強い。シェルの上位版みたいな感じらしい。  ⇒PHPとRubyのウリは一体何?Rubyはオブジェクト指向がウリらしいけど、オブジェクト指向の言語ならC++とJavaとか.netがあるし。。 ちょっと脱線します。 ・JavaScriptとhtmlで、Ajaxを作れる。動的な表示もお手の物。  ⇒ますますPHPとRubyの住み分けがわからない。。 まだまだいろいろあるのですが、脳内整理が出来てません・・。 各言語の得意とするところ(長所・短所)、Web系、非Web系C/Sシステムにおけるそれぞれの言語の住み分け、単体アプリはどれでも作れるのか。GUI開発をするにはどれがよいのか。。。 などなど、いろいろ調べたのですが、キチンと住み分けを図表示してくれているサイトはありませんでした。そもそも住み分けを図表示すること自体が無理なのかな?とか思ったりしました。 乱文で申し訳ありませんが、アドバイスをいただけたらと思います。 よろしくお願いいたします。

  • プログラミング

    c言語プログラミングについて教えてください。 2次元配列で以下の様に数字の昇順(渦巻き状に)にアクセスするにはどうしたらいいでしょうか? 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

  • C言語 エラトステネスのふるい ポインタ

    C言語のプログラミングなのですがどなたか教えて頂けませんか。(説明も) エラトステネスのふるいを用いて,10000 までの自然数に素数がいくつあるかを表示するプログラムを作れ。 ただし , 配列は用いず, ポインタを用いること メモリの確保には malloを使うこと よろしくお願いいたします。

専門家に質問してみよう