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】
0331デフォルトの名無しさん
2005/08/28(日) 06:40:23>>329
TAが配布したデータをupせよ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0332デフォルトの名無しさん
2005/08/28(日) 06:50:18データ圧縮は上でも推測されてたようにあるかもしれませんが、
ヒストグラムをつくってから考えたいと思います。
ためしにZIPで圧縮したら1.2Mが60kになったので関係ありそうな気がしますね・・・
>>331
TAから公開してはいけないとは言われいないデータなのですが、あまりにちゃんに慣れてない
ので怖いのでアップするのは勘弁してもらえないでしょうか?
0333デフォルトの名無しさん
2005/08/28(日) 06:52:16TAからはRGBαという構成といわれたんですが
どうも調べるうちにαBGRになっているような気がします。
一般論として環境によってはデータが逆さまになることがあるとか
きいたことがあるようなないような・・・
0334デフォルトの名無しさん
2005/08/28(日) 06:55:50x86系はリトルエンディアン
0335デフォルトの名無しさん
2005/08/28(日) 06:58:20ありがとうございます
確かそのような名前でなにかあったことを記憶しております
0336デフォルトの名無しさん
2005/08/28(日) 06:59:27そういうチェックもしたいからupしろというてる。
・・・てか、人を信用しようよ・・・。
0337デフォルトの名無しさん
2005/08/28(日) 07:02:350338デフォルトの名無しさん
2005/08/28(日) 07:06:210339デフォルトの名無しさん
2005/08/28(日) 07:13:15すいません。TAが所属している研究室は画像研究をしてる研究室で
受講しているだけの一学生に大切なデータを渡すとは思えないのですが、
なにか問題になるといやですのでアップは勘弁してください。
いろいろしていただいているのに沢山しつれないことをして申し訳ありません・・・。
0340デフォルトの名無しさん
2005/08/28(日) 07:15:36ハッシュはよくわからないけど、データが少ないんなら2分木とかで存在する値だけ読んでいくとか。
デフォルメしてかまわないんなら・・・普通に配列でいいか。
テキストファイルなら圧縮率高いですよ。
特に0が多い場合。
0341デフォルトの名無しさん
2005/08/28(日) 07:22:54だらだら配列を線形探索。
0342デフォルトの名無しさん
2005/08/28(日) 08:02:51したの308さんのプログラムですとαBGをワンセットと考えて出現頻度がでるようになっていると
思います。BGRをワンセットと考えて出現頻度を出すにはどうしたらいいのでしょうか?
何度もすみません。
#include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}
0343デフォルトの名無しさん
2005/08/28(日) 08:05:22>BGRをワンセットと考えて出現頻度を出すにはどうしたらいいのでしょうか?
をBGRαをワンセットとして出現頻度を出すにはどうしたらいのでしょううか?
に訂正させてください。BGRでも出現頻度がでるのならお願いします
0344デフォルトの名無しさん
2005/08/28(日) 08:08:130345デフォルトの名無しさん
2005/08/28(日) 08:35:000346デフォルトの名無しさん
2005/08/28(日) 08:40:52long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) r << 24 | (long) g << 16 | (long) g << 8 | b;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}
ほらよ
0347デフォルトの名無しさん
2005/08/28(日) 08:45:300348デフォルトの名無しさん
2005/08/28(日) 08:58:590350デフォルトの名無しさん
2005/08/28(日) 09:03:49これをいじればαBGからRGBになりそうなのですが、バスエラーが出たりと
よくわからなかったです。どうか教えていただけないでしょうか?
リトルエディアンのことを言い忘れていてすみません
0351315
2005/08/28(日) 09:05:58とにかくデータがalpha,R,G,Bの並びなのかどっちなのかはっきりさせる必要がありそうです。
0352デフォルトの名無しさん
2005/08/28(日) 09:08:33逆になってるっぽいって言ってるからRGBAlphaの1B*4で1セットじゃねーの
肝心のデータうpしてくれりゃそれで解決するんだがな
0353デフォルトの名無しさん
2005/08/28(日) 09:18:13データ自身はRGBαなのですがαBGRというふうに出て来るそうです
0354デフォルトの名無しさん
2005/08/28(日) 09:28:270355315
2005/08/28(日) 09:32:4117179869184Byte つまり、16777216MB、16384GBもメモリをとられることになるんですけど.....。
頻度はそれぞれunsigned char型に収まりきらないものでしょうか。
0356デフォルトの名無しさん
2005/08/28(日) 09:33:110357デフォルトの名無しさん
2005/08/28(日) 09:35:320358デフォルトの名無しさん
2005/08/28(日) 09:36:280359デフォルトの名無しさん
2005/08/28(日) 09:39:16long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) dummy = 0 | (long) b << 16 | (long) g << 8 | r;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}
これでおk?
0360デフォルトの名無しさん
2005/08/28(日) 09:44:43とりあえず値の範囲でも調べたら?
何通りあるかとか。
0361デフォルトの名無しさん
2005/08/28(日) 09:46:08>頻度はそれぞれunsigned char型に収まりきらないものでしょうか。
データのサイズによるのですが 2の24乗必要と考えもらえると助かります
0362デフォルトの名無しさん
2005/08/28(日) 09:52:35αBGのワンセットでの出現頻度になっているので
BGR(RGB)のワンセットでの出現頻度が出るようになればなと考えております
0363デフォルトの名無しさん
2005/08/28(日) 09:55:010364デフォルトの名無しさん
2005/08/28(日) 09:57:55三次元画像らしいので
0365デフォルトの名無しさん
2005/08/28(日) 10:05:18出現頻度をということです。
最初はRGBαというふうに説明していたために混乱させて申し訳ありません。
308さんのプログラムだとαBGとなってしまうのは私が最初にRGBαとなっているといったためです。
実際はαBGRです。リトルエディアンだからだそうです
0366デフォルトの名無しさん
2005/08/28(日) 10:05:490367デフォルトの名無しさん
2005/08/28(日) 10:08:23・入力データのフォーマット
・出力データのフォーマット
を書いてね。
0368デフォルトの名無しさん
2005/08/28(日) 10:19:18リナックスです
>>367
入力データのフォーマットはバイナリでRGBαそれぞれ1バイトで計4バイトが何度も記述されている
構成になっています。ただ、私の環境だとこのRGBαバイナリでーたを見てみると
αBGRという風に見えます。(ターミナルでコマンドで中身を見た場合)
出力データのフォーマットは下のような感じにしていただきたいです、
タブでもいいですし、、であけてもいいです。
ただし、出現回数が0の場合は記述しなくてもいいです。できればソースのある箇所をいじれば出現回数
が0でも記述するようにしてもらえると助かります。
RGB値 出現回数
1 4
2 5
・ ・
・ ・
0369デフォルトの名無しさん
2005/08/28(日) 10:25:51αをあとから付け足すとかしない?
0370デフォルトの名無しさん
2005/08/28(日) 10:37:09arufaの値は調べていくとわかったのですが0か255でした。
本来ならばαを含めてRGBαをワンセットとした出現頻度をもとめたいのですが
0か255なら別にいらないのではと思い、RGBと書きました。
αをいれることでプログラムが動かなくなるようでしたらαなんていらないですが
もしもRGBαでワンセットの出現頻度がわかるのでしたらそうしていただきたいです。
αが0のときはRGBもそれぞれ0でした。なのであるRGB値が出現していたらアルファは255っとなります
少しわかりづらいかもしれません。すいません
0371デフォルトの名無しさん
2005/08/28(日) 10:54:221)
>>308
getval()のなかのif (..) return EOF;が4つあるけれど、それの順番を変更すればよろしい。
2)
αがRGBの値から求められるのなら、αは無視してよろしい。
以上。
0372デフォルトの名無しさん
2005/08/28(日) 10:59:10ありがとうございます
やってみます
0373デフォルトの名無しさん
2005/08/28(日) 12:28:23#include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((a = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
このようにr、g、b、dummyを単純に逆転させるだけでいのでしょうか?
0374デフォルトの名無しさん
2005/08/28(日) 12:52:240375デフォルトの名無しさん
2005/08/28(日) 12:56:21出力だけ有っても無意味
入力とそれに対応する出力のセットか、片方だけなら入力
0376デフォルトの名無しさん
2005/08/28(日) 13:02:46入力ファイルをテキストに十進法で出力しました。
そして RGBαそれぞれが0の場合がほとんどでしたのでプログラムを組んでこれを消しました。
その結果を出力したテキストが下のようなものになります
(αBGRの順)
255 212 71 102 255 212 81 121 255 191 82 115 255 198 106 132 ・・・・・・・・
自分なりにずっといろいろやったり考えたりしてたのですが、
このテキストで、(α)BGRをワンセットと考えたR出現頻度を求めることもできるかなとおもって
アップしたほうがいいかをお聞きしました。
0377デフォルトの名無しさん
2005/08/28(日) 13:09:52データを処理した後のものを出されても仕方ない。
0378デフォルトの名無しさん
2005/08/28(日) 13:21:42それぞれ0ってなんだ? 全部0じゃないのか?
へんてこな日本語を文脈で判断して、わけの分からない
加工データでよく分からない出力を出せといわれても無理だ。
0379デフォルトの名無しさん
2005/08/28(日) 13:24:490380デフォルトの名無しさん
2005/08/28(日) 13:26:59>>378
すみません・・・。できるところは自分でやろうと思って変な方向になりました・・・。
877にアップしました。TAの方のメールを待っていましてが配布してもかまわんよとのことだったので
アップしました。
どうかお願いいたします。
0381デフォルトの名無しさん
2005/08/28(日) 13:28:03全部0ですといいたかったです
0382デフォルトの名無しさん
2005/08/28(日) 13:29:100383デフォルトの名無しさん
2005/08/28(日) 13:32:12出力形式というのは?
0384デフォルトの名無しさん
2005/08/28(日) 13:34:150385デフォルトの名無しさん
2005/08/28(日) 13:37:22無知ですみません
添付可能ファイル : TEXT, LHA, ZIP
なのにlzhであげるなということでしょうか?
0386デフォルトの名無しさん
2005/08/28(日) 13:39:41やっとわかりました
出力形式というよりも最終的な目的がヒストグラムを作ることですので
エクセルに簡単にこぴぺできる形がいいかと思います
他にいい方法があったら教えてくださると助かります
0387デフォルトの名無しさん
2005/08/28(日) 13:42:440388デフォルトの名無しさん
2005/08/28(日) 13:45:01はい、というのもヒスグラムをつくってこいとのことでどういう風に作るかも課題の一つだと
私は考えておりました。
エクセルでは65k程度しか軸がないのでそれ以上のヒストグラムはつくれません
ですが出現しないRGBαを除けば10k程度に収まります
こういうのを試してるのではないかと思っております
0389デフォルトの名無しさん
2005/08/28(日) 13:54:170390デフォルトの名無しさん
2005/08/28(日) 13:54:58普通に考えてバイナリモードでの読み込み処理ができるかどうかをみる課題だろ
それに出現しないのを除外してもいいのなら、そんなヒストグラムに何の意味があるよ?
PhotoshopとかにあるRGBそれぞれを別々にグラフ化して重ね合わせるんじゃないのか?
0391デフォルトの名無しさん
2005/08/28(日) 13:55:490392デフォルトの名無しさん
2005/08/28(日) 14:01:270393デフォルトの名無しさん
2005/08/28(日) 14:03:46返事がすぐには来ないと思いますが聞いてみます。
>>390
上のほうにでているようにRGBα別々のヒストグラムを作りましたが
確認したところ 別々ではなく RGBαをワンセットとしてヒストグラムを とのことでした
0394デフォルトの名無しさん
2005/08/28(日) 14:28:250395デフォルトの名無しさん
2005/08/28(日) 14:33:28> なんかファイルの先頭にテキストがいくつか混ざってるのは俺だけ?
すいません。消すのを忘れていました
消したものをあげたほうがいいでしょうか?
96*96*96*4バイトが正確なデータです
0396デフォルトの名無しさん
2005/08/28(日) 14:45:490397デフォルトの名無しさん
2005/08/28(日) 14:47:06消すのを忘れたってことは、喪前が勝手に入れたのか?
0398デフォルトの名無しさん
2005/08/28(日) 14:52:54Cで組むんじゃなくて、このツールの使い方を学習させたいんじゃなかろーか。
0399デフォルトの名無しさん
2005/08/28(日) 14:57:380400デフォルトの名無しさん
2005/08/28(日) 14:58:32いえ
ですがRGBαそれぞれのヒストグラムを作っていたとき
αの値がおかしかったのでヘッダを消したら0か255になったので消すのはむしろいいことのようです
(メールで確認済み)
0401デフォルトの名無しさん
2005/08/28(日) 15:00:39私のヘッダを見てツールがあるのを発見したのでメールでTAにたずねたところ
別にAVSじゃなくってもいいんだけどたまたまそのファイルで演習してるだけ
とのことでした
0402デフォルトの名無しさん
2005/08/28(日) 15:02:06ttp://www.nagano.fujitsu.com/services/avs/Announce/express51.html
わらた。
0403デフォルトの名無しさん
2005/08/28(日) 15:03:21BMPとかならまだしも、わざわざAVSとやらのデータをCで扱わせる意味が分からん
それに3バイトを1セットと見てのヒストグラムを作るなんて
必要となるメモリを考えても何させたいのか分からないし
0404デフォルトの名無しさん
2005/08/28(日) 15:06:000405デフォルトの名無しさん
2005/08/28(日) 15:06:234バイトを1セットとみてヒストグラムを作らせ、ベクトル量子化させるとかだめかな?
0406デフォルトの名無しさん
2005/08/28(日) 15:07:03また、バイナリエディタで開いたんだけど、ヘッダ部分は最後の 0C 0Cまで削除してしまっていいんですよね。
0407デフォルトの名無しさん
2005/08/28(日) 15:08:18あの上の方にも書きましたが308のどこを変えればαBGをワンセットとからBGRにできるのでしょうか?
0408デフォルトの名無しさん
2005/08/28(日) 15:09:59私はイーマックスで開いて96*96*96*4バイトになるまで削除しました
プログラムはほとんど使えません すいませn
0409デフォルトの名無しさん
2005/08/28(日) 15:10:26freadで4バイトまとめて読み込みゃ、RGBAlphaの並びになるから
0xFF辺りでマスクしろ
0410デフォルトの名無しさん
2005/08/28(日) 15:10:440411デフォルトの名無しさん
2005/08/28(日) 15:12:430412デフォルトの名無しさん
2005/08/28(日) 15:13:16私の環境ですと、リトルエディアンが原因でαBGRとなっているので308さんのだとαBGになります
409さんのおっしゃることはボクでもできるかもしれませんが、
そのあとの出現頻度のカウントが全然わかりません。ごめんなさい
0413デフォルトの名無しさん
2005/08/28(日) 15:13:300414デフォルトの名無しさん
2005/08/28(日) 15:14:05#include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((a = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
このようにr、g、b、dummyを単純に逆転させるだけでいのでしょうか?
>return (long) r << 16 | (long) g << 8 | b;
ここは変更させなくてもよろしいのでしょうか?
何度もすいません
0415デフォルトの名無しさん
2005/08/28(日) 15:23:50long getval(FILE *fp)
{
unsigned long temp;
if (fread(&temp, 4, 1, fp) != 1)
return EOF;
return (long)temp >> 8;
}
こうでいいんじゃねーのか?脳内コンパイラだからエラー出たら適当に修正してくれ
0416デフォルトの名無しさん
2005/08/28(日) 15:30:56htonl つかったらいいんジャマイカ。
0417デフォルトの名無しさん
2005/08/28(日) 15:34:26ありがとうございます。これを308と合体させてみてコンパイルは通ったのですが
セグメンテーションエラーがでました。
414はどこが違うんでしょうか?読み込む順番をおっしゃられるようにかえて
r g b というならびになっていると素人目には見えるのですがだめなんでしょうか・・・
確認したいのですが出現頻度をどうやって確認したらいいのかもわかりません。
0の出現頻度はあからさまなのでわかるのですが。
0418デフォルトの名無しさん
2005/08/28(日) 15:39:25それについて調べてみます
ありがとうございます
0419デフォルトの名無しさん
2005/08/28(日) 15:43:32net/if.h な
0420デフォルトの名無しさん
2005/08/28(日) 15:44:24同じ値があり、おそらく正しいと思われます
みなさんありがとうございます。
0421デフォルトの名無しさん
2005/08/28(日) 15:46:47すいません、わかりませんでした
0422デフォルトの名無しさん
2005/08/28(日) 16:38:19指定したカラム数の文字列を取り出す関数を作れ
ex) str[] = "abc,def,ghi"
sep = ',' → defがとれる
column_num = 2
という問題があり
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/880.txt
のように作ってみたのですが、コンパイルの際に
cc -o token_cut token_cut.c
token_cut.c: In function `main':
token_cut.c:28: warning: passing arg 2 of `token_cut' makes pointer from integer without a cast
というエラーが出ます
解決方法をどうかご教授ください。。。
0423デフォルトの名無しさん
2005/08/28(日) 16:42:20char sep[] = ","
0424デフォルトの名無しさん
2005/08/28(日) 16:44:04main内でchar sepとして定義されてるが、肝心の関数の方は
char*を引数として取るから、呼び出しの時にsepじゃなくて
&sepにすりゃいいんじゃまいか?
0425デフォルトの名無しさん
2005/08/28(日) 16:46:17こんなんいらん。
if(r_string == NULL)
でいい、ってか、意味わかってかいてるか?
0426デフォルトの名無しさん
2005/08/28(日) 16:49:04ありがとうございます。無事コンパイルできました。
が、セグメンーション違反になってしまいうまくいきません。
どこが悪いかご指摘いただけないでしょうか。
0427デフォルトの名無しさん
2005/08/28(日) 16:49:13strcmp(r_string,NULL)
が間違っています。str(cmp)に渡すのは有効なポインタでなければならず、
NULLを渡せばアドレスはゼロを指しているためコンパイルを通ったとしてもクラッシュします、ヌル文字列でなければなりません。
したがってstrcmp(r_string, "")としなければなりません。ただ、>>425さんの言うようにこの文は
if(!r_string)で片付けたほうがいいと思います。
0428デフォルトの名無しさん
2005/08/28(日) 16:50:57はい、意味は分かっています。
教授がこうしたほうがよいと言っていまして
このようにしたんです。
0429デフォルトの名無しさん
2005/08/28(日) 16:53:50>str(cmp)に渡すのは有効なポインタでなければならず、
>NULLを渡せばアドレスはゼロを指しているためコンパイルを通ったとしてもクラッシュします、ヌル文字列でなければなりません。
ありがとうございます、自分の勉強不足でした。
無事、プログラムを動かすことができました
答えてくださった皆様ありがとうございました。
0430デフォルトの名無しさん
2005/08/28(日) 16:54:46なんでこうした方がいいの?
■ このスレッドは過去ログ倉庫に格納されています