- 締切済み
圧縮プログラムを実行すると「セグメンテーション違反」と出る。
プログラムをチェックして頂きたいのですが、煩雑なので時間に余裕のある方、お願いします。 使用OSはRED HAT LINUXです。 本に載っていたCのハフマン符号化プログラムをviで丸移しし、コンパイルしました。"プログラム名 圧縮対象データ名 圧縮後データ名"という形で実行するのですが、「セグメンテーション違反」と出てしまいます。使ったのは8kB程度のjpg画像でした。 原因をお教え願います。
- C・C++・C#
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- shuyamakawa
- ベストアンサー率67% (111/164)
後々のことを考えると、gdbを使ったデバッグ方法を覚えた方が 良いと思います。 異常終了(セグメンテーションフォールトもそうです)した時に コアファイルが出来ているのであれば、 >gdb (実行プログラムバイナリ) (コアファイル) で、終了時の状況が調べられます。 手っ取り早い方法として、ソースのいたるところにデバッグ用に printf関数を入れる等すれば、異常終了箇所がある程度特定出来ると思います。
- ChateauAres
- ベストアンサー率43% (64/148)
これだけの情報で原因を特定するのは無理です。 再現性のある不具合ならばGDBでのデバッグを試みられてはいかがでしょうか? GDBで1ステップ実行させて、どの箇所でセグメント違反が起きているかが解ります。 GDBの使い方は検索すれば山ほどありますし、これをマスターしていると後々重宝しますよ。
お礼
すみません!ソースコードを載せたサイトのアドレスを文中に入れたら、 OKWAVE側に削除されてしまいました。 でも、参考にさせていただきます。ありがとうございました。
関連するQ&A
- セグメンテーション違反
hpのRED HAT LINUXのワークステーションを導入したのですが、 emacsを立ち上げて、文字を打とうすると、「セグメンテーション違反です」 といってemacsが落ちてしまうのですが、どうしてなのでしょうか? よろしくお願いいたします。
- 締切済み
- Linux系OS
- セグメンテーション違反について
C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。
- ベストアンサー
- C・C++・C#
- セグメンテーション違反とは??
linuxでC言語のプログラムを構築しています。 gccでコンパイルしたときにセグメンテーション違反という エラーが出てしまいます。 セグメンテーション違反とは一体なんの ことなんでしょうか? メモリのことだと思ってるんですが、原因がよくわかりません。C言語初心者なので わかりやすく教えて頂けるとありがたいです。
- ベストアンサー
- C・C++・C#
- c++でセグメンテーション違反
c++言語を勉強しているものです。 配列を関数の引数として扱うプログラムを作ろうとしているのですが、 コンパイルが通ったかと思えば実行すると 「セグメンテーション違反です」 と表示されて異常終了してしまいます。 原因がさっぱりわかりません。 OSはLinux(RED HAT ENTERPRISE LINUX 5)、コンパイラはg++(バージョン 4.1.2)です。 これがソースコードです。 #include <iostream> using namespace std; #define BUFSIZE 1024 #define MSG "msg" void test(char buf[]) { //bzero(buf,BUFSIZE); LEGACY memset(&buf, 0, BUFSIZE); sprintf(buf, "%s\n", MSG); cout << buf; cout << "(Terminated)" << endl; return; } int main() { char buf[BUFSIZE]; test(buf); return 0; }
- ベストアンサー
- C・C++・C#
- セグメンテーションエラー?
Linuxを勉強しようと思って Red Hat Linux 7.3入門キットという本を買って、 読みながらインストールして起動してみると、 いきなり アプリケーションエラー「Panel」プロセス 1231 って出てきます。 それでその下にセグメンテーションエラーです、って言われました。 どうやらWindowsでいう、一番下のタスクバーが出てこないみたいなんですが。 何が悪くて、どう解決すればよいのかさっぱり分かりません。 ログアウトすりゃ出来やしない状況です。 まぁ、いざとなりゃ電源ぶち切りゃ良いんですけど、 やっぱしやりたくない。 どなたかヘルプ下さい。
- ベストアンサー
- その他(OS)
- PHPのセグメンテーション違反に対する例外処理について
PHPのセグメンテーション違反に対する例外処理について 再帰呼び出しのプログラム(error_seg.php)を作成し、Linuxのシェルで $ php error_seg.php と実行しました。 実行環境: PHPのバージョン:5.2.10 Linuxのバージョン:2.6.18-164.15.1.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Mar 17 11:37:14 EDT 2010 プログラムは下記の通りです。 <?php $cnt=0; function func(){ global $cnt; $cnt++; print $cnt . "回目の呼び出し\n"; func(); } try{ func(); }catch(Exception $e){ echo "例外発生:" . $e->getMessage()."\n"; } ?> ※このプログラムは、 http://d.hatena.ne.jp/syonbori_tech/20090414/1239717538 のサイトを参考にして作りました。 この結果、 1回目の呼び出し 2回目の呼び出し ・・・ 26187回目の呼び出し 26188回目の呼び出し セグメンテーション違反です と表示され、セグメンテーション違反を再現させました。 ※何回目でセグメンテーション違反が発生するかは、 その都度異なります。 プログラム中で、try-catchの例外処理を入れたのですが、 例外処理されないようです。セグメンテーション違反に対して 例外処理をすることはできないのでしょうか。 できるとすれば、どのように記述をすればよいでしょうか。
- ベストアンサー
- PHP
- ハフマン符号化による圧縮
1と0でできたN×Nの行列 例えば 0 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 というような行列を ___ |01|1 1 1 0 |01|1 0 0 0  ̄ ̄ ̄ 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 このように4ビットごとに分けてハフマン符号化による圧縮を行うプログラムを作りたいと考えていますが、よくわかりません。どなたか教えてください。 また四角で囲んだところは0101と考えていいそうです。
- 締切済み
- Java
- ハフマン符号のプログラム
以下の問題に回答できる方,いらっしゃいましたらソースファイルと実行結果を送ってください。 ファァイル(記号列)を読み込んで,ハフマン符号によりファイルを圧縮するプログラム(C言語)を作成する(プログラムは,圧縮を行うものと,解凍を行うものの2つ作る)。また,いくつか適当なファイルに対して,圧縮を行い圧縮率を測定する。 (1)圧縮プログラムについて 圧縮のステップ (a)入力ファイルを読み込み各記号の出現頻度をカウントする。 (b)得られた出現頻度を使って各符号のハフマン符号を生成する。 (c)各符号の出現頻度を出力ファイルに書き出す。 (d)もう一度入力ファイルを読み込みながら各符号をハフマン符号で置き換え て出力ファイルに出力する。圧縮ファイルの形式は次のようになる。 0x00の 0x01の … 0xffの 先頭文字の 2文字目の … 終端文字の 出現頻度 出現頻度 出現頻度 符号語 符号語 符号語 (c)で書きこむ部分 (d)で書きこむ部分 (2)解凍プログラムについて 解凍のステップ (a)各符号の出現頻度を圧縮ファイルから読み込む。 (b)得られた出現頻度を使って各符号のハフマン符号を生成する。 (c)圧縮ファイルの符号語を読み込みながら各符号のハフマン符号と比較しも し一致したらその記号を解凍ファイルに出力する。 (d)(c)をファイルの終わりもしくは出現頻度をすべて足し合わせた記号数分処 理するまで繰り返す。 関数について 関数get_bit ファイルから1bit読み込んで戻り値として返す。 (ファイルポインタはグローバル変数で用意する) 関数put_bit 引数として0,または1を渡すと1bitずつファイルに書き込む。 (ファイルポインタはグローバル変数で用意する)
- ベストアンサー
- C・C++・C#
- jpeg画像をより小さく圧縮するために
現在卒業研究で「画像圧縮によるホームページの高速表示」というテーマを研究しています。これは (1)自PCにサーバソフトをインストール (2)HTMLファイル内に含まれる画像ファイルを圧縮するプログラムをそれに組み込む (3)圧縮処理したHTMLファイルに解凍プログラムを添付、送信 (4)受信側でHTMLファイル内の画像を解凍、ページを表示 というのが大まかな流れです。 そこで、jpegファイルの圧縮に有効なプログラムをハフマン符号化をベースにCで作っているのですが、現在のjpegの規格に使われているハフマン符号化アルゴリズムよりもさらに圧縮率の高いプログラムを作らなければなりません。ちなみに差分値化処理は試しましたがあまり効果はありませんでした。 おおまかなご説明で構いませんので、何か有効な方法があればなにとぞご教授ください。よろしくお願いします。
- 締切済み
- C・C++・C#
- ブロックハフマン符号化プログラムの作成
現在学校の研究で「ブロック(n次拡大情報源)ハフマン符号化」プログラムをC言語で作成しています。 これは、通常のハフマン符号化でデータ1個ごとに出現頻度を調べてそれぞれにハフマン符号を割り当てるところを、ファイル中で隣り合うデータ2個(あるいは3個、4個、・・・n個)を一かたまりと見なし、それぞれの出現頻度を調べてハフマン符号を割り当てる、というものです。 通常のハフマン符号化は以前作成したことがあるのですが、これをどのようにして上記のようなプログラムに改変すればいいのかわかりません。 ちなみに、データのバッファリングは以下のようにし、 #define BUFFER_SIZE 102400 unsigned char buffer[BUFFER_SIZE]; (中略) int i,c; i = 0; while(i < BUFFER_SIZE && (c = fgetc(fp_i)) != EOF) { buffer[i] = c; i++; } 各データの出現頻度は以下のようにして調べています。 #define N 256 (中略) int hist[N * 2]; for(i = 0;i < (N * 2);i++) hist[i] = 0; for(i = 0;i < size;i++) hist[data[i]]++; ※data[i]は前述のbuffer[i]、sizeは前述のi(圧縮対象データのファイルサイズ)です。 やはり、バッファリングに使う配列をもう少しサイズの大きい型で宣言するとこから始めるべきでしょうか? ご教授お願いします。
- ベストアンサー
- C・C++・C#
お礼
すみません!ソースコードを載せたサイトのアドレスを文中に入れたら、 OKWAVE側に削除されてしまいました。 でも、参考にさせていただきます。ありがとうございました。