トップページ⇒tech
1001コメント370KB

C/C++の宿題を片づけます 49代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/10(水) 17:10:47

あなたが解けないC/C++の宿題を片づけます
――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
―――――――――――――――――――――――――――――――

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: Windows/Linux/等々
 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等
 [3.3] 言語: C/C++/どちらでも可 のいずれか
[4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

【前スレ】
48代目: http://pc8.2ch.net/test/read.cgi/tech/1121471445/

【歴代スレは>>2-13】
0552デフォルトの名無しさん2005/09/02(金) 01:49:55
最長不倒関数ってコトバが頭によぎった。
0553デフォルトの名無しさん2005/09/02(金) 02:03:09
俺は添削はパス。
添削好きな>531の出番ですよ。
0554デフォルトの名無しさん2005/09/02(金) 03:36:15
typedef
→http://www9.plala.or.jp/sgwr-t/c/sec16.html

static jupiter[] = {
→typedefで作った型名を配列定義?

typedef struct {
} SATELITE;
としたら?

i = j = 0 ;
→邪魔。削除。

for(i = 0; i < 4 ; ++i){
→i++ で覚えとけ

double max = jupiter[i].cycle;
→どこで変数定義してんの?そもそもバブルソートにMAXなんて関係ないし。
0555デフォルトの名無しさん2005/09/02(金) 03:44:26
おお、感動した。ついでに>551のながったらしいmainも切ってくれ。
俺は理解できんかった。
0556デフォルトの名無しさん2005/09/02(金) 03:55:30
>>554
C++行ったら++iって書かんといかんようになるんだから別にいいじゃん。
0557デフォルトの名無しさん2005/09/02(金) 04:07:57
>>556
4 C++ でのプログラム
http://jun.artcompsci.org/~makino/kougi/keisan_tenmongakuII/note3/node4.html

14−5.演算子の優先順位と結合規則
http://www9.plala.or.jp/sgwr-t/c/sec14.html#s14-5
0558デフォルトの名無しさん2005/09/02(金) 04:13:29
>>557
素朴な疑問なんだが、>556に対して>557でなにを指摘したいんだ?
C++では何故前置にしなくてはいけないか理解できないなら黙ってた方が可愛げがあるってもんだよ。
0559デフォルトの名無しさん2005/09/02(金) 04:19:04
C++では前置++より後置++の方がコストがかかることが多いので、
前置でも後置でも良い場合は前置にする習慣があります。

という答えなら何点もらえますか?
0560デフォルトの名無しさん2005/09/02(金) 04:37:24
初級C言語Q&A

不定と未定義
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

C言語の自習・学習
http://www.brs.kyushu-u.ac.jp/~hamada/CLang/CLangtitle.htm
05615542005/09/02(金) 05:29:40
>>551
カウンタがいっぱいでよく分かりませんでした。
ところどころにコメント入れてもらえれば読みやすいと思います。
自作関数呼び出し、ループとコメントを抽出してフローチャートになるくらいに。

>>558
C++で後置きのサンプルです。
なぜとか愚問です。シビアな判断が必要なものは避ければいいんです。
0562デフォルトの名無しさん2005/09/02(金) 05:52:43
組み込み型でのインクリメントなんだし、どっちでも同じじゃねーか
0563デフォルトの名無しさん2005/09/02(金) 05:55:10
まあ将来的にC++を使うつもりがあるなら、
どちらでもいい場合には前置を使う癖をつけておいてもいいと思うけどね。
0564デフォルトの名無しさん2005/09/02(金) 06:34:24
ここは宿題スレ。
0565デフォルトの名無しさん2005/09/02(金) 11:39:15
宿題すれだからこそ、前置インクリメントに文句言う方が蛸。
0566デフォルトの名無しさん2005/09/02(金) 13:26:56
551です
私はどこを直せばいいのでしょうか?
よろしくお願いいたします
0567デフォルトの名無しさん2005/09/02(金) 16:35:29
>>566
顔
0568デフォルトの名無しさん2005/09/02(金) 16:53:02
デバッグスレに行けば?
0569デフォルトの名無しさん2005/09/02(金) 17:01:19
>>566
ベクトル量子化なんてやったことないけど、
とりあえずソース眺めてる。

以下、コーディング上修正すべき点
・ファイル開いたらちゃんと閉じろ
・メモリ確保したらちゃんと解放しろ
・使わない変数や処理を入れるな。
・main関数長すぎ。もうちょっと機能別に分割しろ。
・ちゃんとコメントつけろ。何やってるのかわからん

暇があったら添削したソース上げるわ。
0570デフォルトの名無しさん2005/09/02(金) 17:14:40
>>566
機能ごとの関数分けはまぁいいとして(できればしてくれ)、
せめてコメント付けてくれんか

めっさ読み辛い
05715692005/09/02(金) 17:25:41
テストデータ作って動かしてみたが、
ありえないインデックス値が入ってるような・・・
生成されたコードブックの検証はしたのだろうか

とりあえず、以下について言葉で説明してくれ
・ソース中の配列indexの意味と使われ方
・コードブックに無いベクトルに対しての処理 (ソース中で何をやってるか)
なんとなく、この辺が癌になってる気がする
0572デフォルトの名無しさん2005/09/02(金) 18:10:11
>>569
>>570
すみません。
かなり急いでいたため、こうなってしまいました。

>>571
indexについてですが、コードブック中のRGBをあらわしています
コードブックに無いベクトルは一番近い値をコードブックから探してきています。

>生成されたコードブックの検証はしたのだろうか
gcc ----.c
./a.out 処理したいファイル名 コードブック名
でコードブックが現れます。
確認したところおそらくはコードブックは問題ないと思います。
0573デフォルトの名無しさん2005/09/02(金) 18:15:01
コードブックに無いベクトルについては
読み込まれるRGBをR,G,B別々に考えて、コードブック中のRGBとの差をそれぞれ求めて
その値が一番小さなコードブック中のベクトルの番号で置き換えています。
0574デフォルトの名無しさん2005/09/02(金) 18:23:57
自分のプログラムだとαに255を入れているつもりが
Rに255がはいっちゃってて
直してるつもりでも直らなかったです
0575デフォルトの名無しさん2005/09/02(金) 18:48:50
>>574
getval()はαBGRの順で読んでるみたいなので
その順序を直せばOK
0576デフォルトの名無しさん2005/09/02(金) 19:03:20
>>575
ありがとうございます
やってみましたがだめでした
ファイルの中身を十進法で見てみると
A B C 255 となっていて 255を一番前にもっていきたくって (255 A B C)
シフトなどを使ってみたのですが自分ではできませんでした。
05775542005/09/02(金) 20:38:02
悪かったよ。
ループに影響すると思ってたんだよ。

けど、>>556 の
>++iって書かんといかん
ていう間違いもだめだろ。

あと、>>551 のソースの問題点分かったよ。
そもそもみんな正しい処理を分かってないから、
それぞれどういう目的でそういうコーディングしてるか書かないと、
間違いだと言う判断ができない。
0578デフォルトの名無しさん2005/09/02(金) 20:49:39
>>577
RGBαであらわされた画像データを読み込みます
次にRGBαをひとつのベクトルとします。
で、出現頻度の高いRGBαをコードブックに書き出し、出現頻度の高い順に256個
選びました。
次に符号化するために、画像データを読みこんで もし同じ値がコードブックにあれば
その番号をふってやります。なかったら一番近いベクトルを選びます
選び方として それぞれのR、G,Bを引いてから足し合わせその数の一番少ないベクトルが
一番近いベクトルとみなされ、その番号をふってやります
複合化はその逆で、番号を見て、番号のベクトルをふってやります

αは0か255だったので最初省きました。RGBが値を持てば255それ以外は0です。
メモリの関係から省きました。
ですので複合化するときにαを足し加えたつもりです。
で、リトルエディアンだから逆に処理したりしたつもりだったのですが
頭がこんがらがってきて、結果を見てみるとαの位置が逆になったりしていました
わかりづらいとはおもいますがよろしくお願いいたします
0579デフォルトの名無しさん2005/09/02(金) 20:59:58
>>578
質問とは関係なくて悪いんだけど、せっかくベクトルで処理してるなら
内積を使って一番近いベクトルを探した方がいいんじゃまいか?
0580デフォルトの名無しさん2005/09/02(金) 21:02:10
>>578
最終的な出力データの形式は?

1)入力と同じRGBα形式:32bit

2)コードブック(RGBα:32bit)*256+インデックス値(8bit*画素数)
 ※コードブックサイズが256のとき

3)その他
0581デフォルトの名無しさん2005/09/02(金) 21:12:51
>>579
私のプログラムのやり方があっているかはわかりません。
そっちのほうがいいのかもよくわからないのです。
>>580
最終的な出力データ形式は
本来ならば符号化したデータ (256のコードブックを使っているのならば読み込ませたデータRGBα
の1/4)と、複合化したデータ(コードブックを参照して、複合化するRGBαで)と、コードブックを出力したいのですが
私の作ったプログラムですと符号化したデータはでていません。複合化したデータは出したつもりです。

1)は複合化したものと考えられますよね?
2)は符号化したものとコードブックということですよね?
0582デフォルトの名無しさん2005/09/02(金) 21:16:19
実際処理させたいファイルをアップしたほうがいいでしょうか?
05835802005/09/02(金) 21:28:47
質問の仕方がちょっと曖昧だったけど
ちゃんと解釈してくれたようなので安心

最終的には量子化圧縮したものを出したいけど
今はまだやってないってことだね。

>実際処理させたいファイルをアップしたほうがいいでしょうか
結果を照合できるからアップした方がいいと思う
0584デフォルトの名無しさん2005/09/02(金) 21:43:02
>>583
ありがとうございます
最終的には上に上げた符号化、複合化、コードブックをだしたいのですが
最悪でも複合化したものを出してソフトを使って表示させたいです。
自分のプログラムで表示させると明らかにおかしい画像になりました。

897にあげておきました
よろしくおねがいいたします
0585デフォルトの名無しさん2005/09/02(金) 22:58:29
>>584
元データにやたら0x00が含まれてる件について
0586デフォルトの名無しさん2005/09/02(金) 23:06:48
>>585
それについては正しいです
0ボクセルが多いのが特徴のデータですので
0587デフォルトの名無しさん2005/09/03(土) 00:10:53
どういう動作を求めているかわからないので
・プログラムの起動法(引数の説明やね)
・プログラムが読み書きするファイルの説明

どういうファイル形式かわからないので、
・元データの形式
・コードブック、符号データの形式(複数あるなら、それぞれ)

説明いれとくと、元データの形式だけど、4バイトYUVだったら、マイナスの表現を2の補数でしてるか、
下駄を履かせて最小値を0にしてるか。(これはユークリッド距離を求めるのに必要)
3バイトYUVだったらバイトの並びと、ビットの配置が必要になる。
入力データがRGBでYUVに変換するんだったら、変換式が必要ね。

コードブックは予想がつくんだけど、念のため。

符号データに関してはバイトをまたがるビット列になるので、その配置がわからんとどうしようもない。
0588デフォルトの名無しさん2005/09/03(土) 00:50:13
>>587
プログラムの起動方はどうのような形でもかまいません。
元データの形式はαRGBなのですが、私の環境ではBGRαそれぞれ1バイトで
計4バイトです。
YUVにしてベクトル量子化もしたいのですがまずはRGBでやりたいとおもっております
0589デフォルトの名無しさん2005/09/03(土) 00:52:02
いや。こちらが決めると「やっぱ直して」って言われるから、あなたが決めて。
0590デフォルトの名無しさん2005/09/03(土) 00:54:32
#include <stdio.h>

int main(void)
{
int i;
for(i =0; i < 10; i++){
printf("**********\n" + i)
}
}
このiがどういう作用をしているか教えてください。
0591デフォルトの名無しさん2005/09/03(土) 00:56:28
>>589
すみません。わかりました。
できれば符号化と複合化のプログラムを分けてもらいたいです
起動方法は、
./a.out  ベクトル量子化したいファイル  そのファイルのコードブック 符号化されたデータ
./a.out 符号化されたデータ  コードブック 複合化されたデータ
でお願いいたします。
複合化と符号化わけるのがだめというのであれば
./a.out ベクトル量子化したいファイル  そのファイルのコードブック 符号化データ 複合化データ
でお願いいたします
  
0592デフォルトの名無しさん2005/09/03(土) 01:03:36
>>590
#include <stdio.h>
int main(void)
{
static char a[10] = {'*','*','*','*','*','*','*','*','*','\n'};
int i;
for(i =0; i < 10; i++)
{
       printf(a + i) ;
}

return 0;
}
これと等価だと思えばいい。
0593デフォルトの名無しさん2005/09/03(土) 01:08:19
>590 あ、>591上手な説明だ。

RGBだけ対象で、コードの種類は256個限定?>591
0594デフォルトの名無しさん2005/09/03(土) 01:09:35
リンクミスった。寝よう。
05955692005/09/03(土) 01:13:31
>>551
添削するのめんどいので組みなおしてみた。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/898.txt

とりあえず動作確認はしたが、結果が正しいかどうかまではわからん。
少なくとも、コードブックはちゃんと作れているみたい。

以下補足
・ヒストグラムを構造体のリンクリスト(単方向)にすることでサイズ軽減&高速化
・アルファチャンネルの補正はしていない
・RGBαのバイトオーダーはenumで指定
・ユークリッド距離の計算は適当
・使い方
  % [実行ファイル名] [画像ファイル]
  出力されるファイル
     - histgram.txt: ヒストグラム
     - codebook.raw: コードブック
     - encode.raw: 符号化データ
     - decoderaw: 復号化データ

疲れたのでもう寝ます。あとは任せたノシ
0596デフォルトの名無しさん2005/09/03(土) 01:14:44
>>593
RGBだけ対象で問題ありませんが、複合化するときにRGBがすべて0ならαも0
そうでなれけば255をいれるようにしなくてはなりません。
コードの種類は256限定ではなく512、1024もつくれるようにしたいです。
0597デフォルトの名無しさん2005/09/03(土) 01:16:15
>>595
ありがとうございます
確認してみます
本当にありがとうございます
0598デフォルトの名無しさん2005/09/03(土) 01:16:38
って、コマンド仕様出てたのね・・・
直す気力が無いのでこのまま寝ます。
0599デフォルトの名無しさん2005/09/03(土) 01:20:27
595をgccでコンパイルしようとすると
/tmp/cc666b8D.o: In function `get_color_diff':
/tmp/cc666b8D.o(.text+0x408): undefined reference to
`sqrt'
collect2: ld returned 1 exit status
というメッセージがでてきました
どうしたらよいでしょうか?
0600デフォルトの名無しさん2005/09/03(土) 01:20:30
>>592
それだと落ちますが。つーか、スレ違いなんだからレスすんなと。
06015952005/09/03(土) 01:22:54
>>599
中で<math.h>をインクルードしてるので
% gcc -lm xxx.c でOK
0602デフォルトの名無しさん2005/09/03(土) 01:23:48
>>590
*じゃなくて文字でやってみると効果がわかりやすいかもしれません。
文字じゃなくても違う配列に格納するものを変えてみるとか。
0603デフォルトの名無しさん2005/09/03(土) 01:24:01
>596 コードの種類は256限定ではなく512、1024もつくれるようにしたいです。

ビットの並びを定義しましょう。
0604デフォルトの名無しさん2005/09/03(土) 01:24:09
>>601
すいません
数学関数?ですね ありがとうございます
大変助かります
0605デフォルトの名無しさん2005/09/03(土) 01:30:52
>>595
ありがとうございます。
ツールを使って画像を見ましたが、私のプログラムに比べて断然よくなておりました
少し木になったのですがエンコードサイズがデコードサイズと同じというのは圧縮という面では
少し違ってる?のかなと感じました。コードブックサイズは256ですので本来ならば
ちょうど1/4になると思いました。

本当にありがとうございます
匿名掲示板ですが本当にありがとうございます
連絡先聞いて御礼したいくらいです。ありがとうございます
0606デフォルトの名無しさん2005/09/03(土) 01:31:47
>>603
ビットの並びの定義というのはどういったものなんでしょうか?
無知ですみません。
0607デフォルトの名無しさん2005/09/03(土) 01:49:51
コードの数が512のとき、次コード列があったら、復号データファイルはどんなバイト列になって欲しいですか?
コード列(10進数) 1 3 7 15 31 63 127 255 511
0608デフォルトの名無しさん2005/09/03(土) 01:57:35
>607 もういいじゃん。
>605で終わってるのだから。
0609デフォルトの名無しさん2005/09/03(土) 02:12:54
>>607
複合データファイルはバイナリでRGBαそれぞれ一バイトのバイト列になってほしいです
これで答えになっているでしょうか?
0610デフォルトの名無しさん2005/09/03(土) 02:28:04
コードブックのサイズを変えたい場合は単純に
#define CODEBOOK_SIZE 256
の256を1024などにすればいいとおもうのですが

これを例えば画像の存在しうるベクトル数と同じ数(10000など)にすればまったく同じ画像に
再生されるはずなのですが、明らかに同じ画像に再生されませんでした。
同じベクトルがあればそのインデックスを振り当てるというふうにプログラム内部でなっているのに



色々してもらって本当に感謝しています。
もしよかったらどこを変えたらいいのか教えていただけないでしょうか
06115952005/09/03(土) 02:40:27
>>605
いや、連絡先は勘弁してくれ・・・

コードブックサイズは256*4バイト。
エンコードサイズは画素数*1バイトで、データ部だけ見れば1/4。

データ中にコードブックを持たせると
その分だけサイズが大きくなるが、画像データが大きくなればなるほど
データ中のコードブックサイズの比率が小さくなる。

コードブックをシステム標準パレットみたく、外部固定にできれば
データにコードブックを付ける必要がなくなり、完全に1/4になるね
0612デフォルトの名無しさん2005/09/03(土) 02:45:17
>>611
なるほど。ありがとうございます。
610について少々お知恵を拝借させていただけませんか。
0613デフォルトの名無しさん2005/09/03(土) 03:03:21
あー。あとで修正するのが嫌なので、先に聞いておこう。
>>595 のプログラムを512,1024にも対応するだけで終わり?
0614デフォルトの名無しさん2005/09/03(土) 03:13:30
>>613
ありがとうございます。
595さんのを512、1024にも対応させたいです。できれば512などのサイズは
あとで簡単に変えられるようにもしできればしていただきたいです。
あと最初にアップした問題にも書いてあるように、
RGBαをYUVα(それぞれ1バイト)にしてベクトル量子化を施すというのと
RGBαをYUVα(Yを8ビット、U,Vを2ビットずつ、αを4ビット、計2バイト)にして
ベクトル量子化をするのをしたいです。
YUVαそれぞれ1バイトできるとはおもうのですが後者(計2バイト)のは少し難しそうです。
これについてもコードブックサイズを256、512、1024などを作りたいです。
長々とすみません
06155952005/09/03(土) 03:33:28
>>610
あー・・・
えっと、今のプログラムだとコードブックのインデックスの範囲が
8bit(0〜255)固定になってるので、define以外にそこも直さないとダメ。

ソースで言うと変数enc_data、enc_data_ptr、あとはfwrite()の第二引数。
fwrite()は各要素ごとに出力するようにしないと対応できないか。

修正方針としては
・ソース内部ではenc_dataの要素を16 or 32bitにする(それを参照するポインタの型も)。

・コマンドライン引数でコードブックサイズを取得し、cb_sizeに格納
 文字列の判別は"256"、"512"、"1024"を直接比較でいいんじゃないかと。

・データ出力時に、コードブックサイズに応じて、各インデックス値を
 8bit/16bitのいずれかで出力

こんなとこかな。
漏れがあったら誰か指摘よろ。

あと、俺のはエンコード/デコードでプログラム分かれてないんだけど、いいのかな?
>>595をベースにするのは構わんけど、ちゃんと中身を理解してな。
0616デフォルトの名無しさん2005/09/03(土) 03:37:21
>>615
ありがとうございます
正直先輩のソースは難しくて理解するのは大変な時間がかかりそうです
提出期限がもう終わってますがなんとかしたいとおもいます
ありがとうございます
0617デフォルトの名無しさん2005/09/03(土) 03:47:28
>>615
>あと、俺のはエンコード/デコードでプログラム分かれてないんだけど、いいのかな?
欲を言うと分かれているほうがいいです
0618デフォルトの名無しさん2005/09/03(土) 03:53:13
意訳:
新しく作り直してください。
細かいことを聴かれても答えません。アナタが作ってください。
気に入らなかったらまた作ってもらいます。
06195952005/09/03(土) 04:03:14
>>618
え、ちょ、おまwwww
って、俺はやらんぞ。>>617か他の暇人よろ。
あと、
つ [後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です]
作った後の仕様変更は結構コストかかるのよ。バグの温床にもなるし。
だから>>613みたいに事前に確認を取るわけ。
0620デフォルトの名無しさん2005/09/03(土) 04:12:04
>619 乙
400行のソースだけれど・・・元のプログラムの理解と修正コード作成で何時間ぐらいかかった?
06215952005/09/03(土) 04:36:34
>>620
乙あり。

(>>569の1時間くらい前から>>595までの時間)−休憩等 = 7時間くらい
以下内訳
・解読        : 2時間
・添削→マンドクサ  : 1時間
・組みなおし    : 4時間

解読とコード作成はほぼ同時進行でやってたから正確じゃないかも。
0622デフォルトの名無しさん2005/09/03(土) 04:56:47
1時間100行か。早いな<組みなおし
でも、やっぱ時間かかるよな。ホント、おつかれ。
0623デフォルトの名無しさん2005/09/03(土) 09:36:28
わがままいってもすみませんでした。
本当にありがとうございました。
がんばってみます
0624デフォルトの名無しさん2005/09/03(土) 15:17:15
いろいろ直してコードブックサイズを例えば10000にしたらほとんど復元されました
ありがとうございまいた。
0625デフォルトの名無しさん2005/09/03(土) 16:40:09
何度も申し訳ありません。
上位256ベクトルを見て〜 といっていましたが一番多いベクトルは0です。
ですが今回は0を除いて上位256にしてみたいのですがどうしたらいいのでしょうか?
付け加えるようですみません。
もしくは下位256にする方法でもかまいません
どうかよろしくお願いいたします

0626デフォルトの名無しさん2005/09/03(土) 16:55:05
すいません625は大変失礼なことでした

申し訳ございません
0627デフォルトの名無しさん2005/09/03(土) 17:23:24
>>530
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/899.c
0628デフォルトの名無しさん2005/09/03(土) 17:31:22
>>601
ライブラリの指定は最後にしないと駄目だよ。
0629デフォルトの名無しさん2005/09/03(土) 19:54:23
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/900.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: [2005年8月31日17:00まで] 過ぎても提出できます。
[5] その他の制限: 何度も申し訳ありません。ベクトル量子化を依頼したものです



0630デフォルトの名無しさん2005/09/03(土) 20:42:44
>>629
符号化データを
[位置][RGBα][位置][RGBα]・・・としたいのはわかったけど

それだと0がほとんど無い画像を符号化したときに
サイズが2倍になるわけだが、>>629はそこまで考えてる?

あと、データの持ち方として、
struct ENCODE_DATA{
 unsigned int index;
 unsigned int voxel;
}
みたいな構造体で配列を作って、この構造体のサイズを使って
処理させたほうがすっきりしてわかりやすいと思う。
量子化するときは、構造体のvoxelメンバにアクセスさせるようにすれば、
わざわざデータを分割しなくてもいいんじゃないかな

と。思うわけだが、まあ参考程度に。今から直すのめんどいだろうし。
0631デフォルトの名無しさん2005/09/03(土) 20:56:39
>>630
[位置][RGBα][位置][RGBα]・・・
わかっていただいてありがとうございます
このような例を入れたほうがわかりやすいですね。参考になります

で、これは0が多いものい対して行っております。
0がほとんどなければサイズが二倍になるのはわかっております

今、インデックス情報とRGBαを合成させようとおもっておりますがどうもセグメンテーション違反が
でて苦戦しております
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/901.txt
これは ./a.out インデックス情報のみのでーた ボクセルのみのでーた 合体させたデータ
にしているつもりです
どうしてもわかりません・
0632デフォルトの名無しさん2005/09/03(土) 21:10:55
セグメンテーション違反の原因がわかりました
アウトバッファのメモリ確保の値を倍することで解決いたしました

ですが、インデックス情報とボクセルを合体させたものを複合化したいのですが
どうしても複合化できません。サイズが逆に小さくなってしまう・・・
0633デフォルトの名無しさん2005/09/03(土) 21:42:24
すみません、合体させるところもメモリの問題でした

595さんのソースで実行させてみると近いベクトルをとってきてほしいのに
明らかに違うものをとってきてしまうという上体になっています
ユークリッド距離のところは適当とおっしゃられていたのでそこらへんが
原因かなと考えておりますが、
0634デフォルトの名無しさん2005/09/03(土) 22:15:37
>>624でちゃんと動いてるってなら
>>595のソース自体は問題ないような気がする。
0635デフォルトの名無しさん2005/09/03(土) 22:22:53
どうも、一致しているベクトルだったらそれに置き換わるんですが
無い場合は一番近いベクトルを選ぶところを、一番近いものではなく
コードブックで一番上にあるベクトルにおきかえているようなきがします
(画像ツールで見た結果)

624でいったのは、コードブックサイズを増やせば完全に復元されるといういみで
例えばコードブックサイズが256なら一致する256ボクセル以外は0であらわされていました。
(0がコードブックで一番多い代表ベクトル)

なのでおそらくコードブックの中のベクトルで一致しなかったら
コードブックの一番上のベクトルに置き換えられているようです
どうやって直せばいいのでしょうか・・・やってはいるんですがどうも595さんのが
私には難しすぎて。・・・
0636デフォルトの名無しさん2005/09/03(土) 23:45:35
基本的なこと:C言語って学校で習った?
情報系の学科?
これ、宿題じゃなくて、ゼミの課題?
0637デフォルトの名無しさん2005/09/04(日) 00:13:39
>>627 ありがとうございます。
関数の中に関数って書けるんですね。勉強になります。
0638デフォルトの名無しさん2005/09/04(日) 00:18:38
>>637
関数内での関数定義は規格に無い。一部の処理系の拡張機能。
そしてgccのいくつかのバージョンはこの拡張にバグがある。
基本的には使うな。
0639デフォルトの名無しさん2005/09/04(日) 00:29:56
>629 起きてる?
位置の値が取る範囲は何?
0640デフォルトの名無しさん2005/09/04(日) 01:11:26
ふむ。寝てるようなので、方針。

・位置がとりうる範囲を確認する
・位置を表すのに必要なバイト数を求める(=nバイトとする)

・1バイト出力する捨てプログラムを書く
・nバイト出力する捨てプログラムを書く
・nバイトとボクセルだかベクトル量子化データだかを組で出力するプログラムを書く

・1バイト入力する捨てプログラムを書く
・nバイト入力する捨てプログラムを書く
・nバイトとボクセルだかベクトル量子化データだかを組で入力するプログラムを書く
0641595 ◆AOMdbQiVo. 2005/09/04(日) 02:50:48
>>635
距離の比較のところにバグがあったorz

595.c 344行目
----------------
  /* 一致するノードが見つからない場合、最も近いものを探す */
  if(!found){
    double min_dist = 0;
    int min_index = 0;
    /*ユークリッド距離算出*/
    min_dist = get_color_diff(color, codebook[0]);
    
/***   ↓がi=iになってて、ループの中に入ってなかった。ごめん ***/

     for(i = 1; i< cb_size; i++){
      /*ユークリッド距離算出*/
      double tmp_dist = get_color_diff(color, codebook[i]);
      if(min_dist > tmp_dist){/* 最短距離 */
        min_dist = tmp_dist;
        min_index = i;
      }
    }
    *enc_data_ptr = (UINT8)min_index;
    enc_data_ptr++;
  }
----------------
0642デフォルトの名無しさん2005/09/04(日) 05:03:00
[1] 授業単元:c言語中級
[2] 問題文(含コード&リンク):ログファイルに現在の日付、時間を出力したい。
                  現在の年・月・日・時・分・秒・ミリ秒を求め、ファイルに出力せよ
[3] 環境
 [3.1] OS: HP-UX
 [3.2] コンパイラ名とバージョン: gcc、バージョンはちょっと分からないです
 [3.3] 言語: C
[4] 期限: 9月5日12:00まで
[5] その他の制限: 特になしです

2005/09/04/05:01:30:40 yyyy/mm/dd/hh:mm:ss:msms (ms:ミリ秒)
上記のようなフォーマットで出力したいとおもっています。
gettimeofday()関数をつかってミリ秒の取得はできたのですが
%dや%fなどの書式指定子で表示できないのです。
どうにかして表示したいので、知恵をお貸しください。
0643デフォルトの名無しさん2005/09/04(日) 05:19:08
ソースと実行結果は?
0644デフォルトの名無しさん2005/09/04(日) 05:27:29
>>642
ミリ秒で取得するから時、分、秒、ミリ秒は計算するんでしょ?
あと、日付と時間はそれぞれ取得すると思うけど。
0645デフォルトの名無しさん2005/09/04(日) 05:47:16
手取り足取り教えてもらえるところはここですか?
0646デフォルトの名無しさん2005/09/04(日) 05:54:59
宿題を晒したら暇人が勝手に答えるスレです。
0647デフォルトの名無しさん2005/09/04(日) 06:07:02
1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
問題1
memsetのような関数を高速化する方法のひとつに、バイト単位ではな
くワード単位で書き込みを実行する手法がある。このほうがハードウェ
アに合うだろうし、ループのオーバーヘッドも1/4ないし1/8に減少
する可能性がある。これの問題点は、ターゲットがワード境界上にな
い場合や長さがワードサイズの倍数でない場合に、さまざまな末端処
理を実行しなければならなくなる点だ。この最適化を実行するmemset
を記述せよ。その性能を、既存のライブラリバージョンや単純なバイ
ト単位でのループと比較せよ。
問題2
memsetのテスト機構を作成せよ。
[3] 環境
 [3.1] OS: linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 特になしです
[5] その他の制限: 特になしです
0648デフォルトの名無しさん2005/09/04(日) 08:35:38
ベンダーが用意する関数が、そのような単純な最適化もされてないと思い込む根拠はなんなのだろう……
0649デフォルトの名無しさん2005/09/04(日) 08:51:51
ベンダーが用意する関数が、そのような単純な最適化もされてないとは書かれてないが?
0650デフォルトの名無しさん2005/09/04(日) 11:47:19
>>647
こんな感じでいいの?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/902.c
06516502005/09/04(日) 12:11:14
ついでに自分の環境での計測結果(gcc -O3)
やはり処理系提供の関数は速いな。

memset 120
my_memset 230
my_memset_simple_loop 921
0652デフォルトの名無しさん2005/09/04(日) 12:21:43
>>642
solarisでやってみた。たぶんHPも同じだと思うけど。
こんなんか?間違ってたらごめん
#include <stdio.h>
#include <sys/time.h>
int main(){
struct timeval time;
struct tm *t;
gettimeofday(&time, NULL);
t = localtime(&time.tv_sec);
printf("%04d/%02d/%02d/%02d:%02d:%02d:%02d\n",
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec, time.tv_usec/10000);
return 0;
}
■ このスレッドは過去ログ倉庫に格納されています