トップページ⇒tech
990コメント358KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@そうだ選挙に行こう2005/09/10(土) 22:09:01

あなたが解けない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

【前スレ】
49代目: http://pc8.2ch.net/test/read.cgi/tech/1123661447/
0232デフォルトの名無しさん2005/09/16(金) 17:18:47
ケータイで書いてたら意味不明になってしまった。
間違ってなかったらO(n^2/2)位かな?

void search(int* a, int ln, int t, int startEnd[2]) {
int m, n, M, N;
int unko;
startEnd[0]=startEnd[0]=-1;
for(M=0, N=ln; M < N;) {
int sum;
for(m=M, sum=0; m < N; m++) {
int sAbs;
sum+=a[m];
if(unko > abs((sAbs = (sum - t)))) {
unko = sAbs;
startEnd[0]=M; startEnd[1]=m;
}}
N--;
for(n=N, sum=0; n > M; n--) {
int sAbs;
sum+=a[n];
if(unko > abs((sAbs = (sum - t)))) {
unko = sAbs;
startEnd[0]=N; startEnd[1]=n;
}}
M++;
if(unko == t) break;}}
0233デフォルトの名無しさん2005/09/16(金) 17:37:54
>>231 >>232
それは O(n^2) という。
0234デフォルトの名無しさん2005/09/16(金) 17:39:08
O(n log n)を思いついた。検証よろ。

1.左端からi番目の要素までの和からなる列を作る。元が
-10, 31, 40
なら、
0, -10, 21, 61
になる。ここから二数を選んで、右から左を引くと対応する部分列の和になる。O(n)。

2.この列を覚えておいて、ソートしたコピーを作る。O(n log n)。

3.できたコピーを双方向リストと平衡木の二重構造に入れる。O(n)。
この平衡木は、削除O(log n)、探索O(log n)で、「あるキーに最も近い要素」の探索もO(log n)

4.覚えておいた列の左から順にポインタpが動く間、次のことをする。O(n log n)
i: 平衡木から*pを削除。O(log n)
ii: *pとの差が問題の数に最も近くなる要素を平衡木から探索。O(log n)
02352342005/09/16(金) 17:50:10
つか、平衡木の実装とかやってられんのだが。
もっといいアルゴリズムきぼん。
0236デフォルトの名無しさん2005/09/16(金) 17:56:08
>>234
うーん、なんか着眼点よさげかも。
ちょっと後半がよくわからんな。
双方向リストと平衡木の二重構造とやらのノードの構造体だけでも書いてみてよ。
0237デフォルトの名無しさん2005/09/16(金) 18:04:54
>>236
struct k
{
int value;
struct k *next; /* 次に大きいノードを指す */
struct k *prev;
struct k *left; /* 左部分木を指す */
struct k *right;
};
0238デフォルトの名無しさん2005/09/16(金) 18:06:10
>>234
おお、凄い。確かに実装するのは辛そうだがw
0239デフォルトの名無しさん2005/09/16(金) 18:33:15
>>234
素晴らしい。ただ、右から左を引かなければならないので、
そこはうまく工夫して「右のもので最も求める値に近くなるもの」が検索
できないと駄目かも。
ただ、これが O(log n) でできれば、ここの候補を馬鹿サーチしても
O(nlogn)だね。
うまく、「自分より右でかつ値に近い」というのを順序でできれば
解決だね。
0240デフォルトの名無しさん2005/09/16(金) 18:44:33
>>239
誤って左と比べないように4-iで順番に削除してるんだが、だめか?
02412392005/09/16(金) 18:48:52
>>240
書いたあと気づいたけど、それで大丈夫みたい。ごめんなさい。
すばらしい。
0242デフォルトの名無しさん2005/09/16(金) 19:17:26
>>235 平衡木は2色木誰かやってなかったっけ。
0243デフォルトの名無しさん2005/09/16(金) 20:02:26
これか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/899.c
標準外の機能を使ってるってのが問題だな

//チラシの裏
ちなみにGCがあると2色木の挿入は恐ろしく簡単になる
削除する時は今回は2度と挿入しないんだからrebalanceする必要ないしな
0244デフォルトの名無しさん2005/09/16(金) 20:52:56
>>234
ソートしたコピーと双方向リストは何に使うの?
02452342005/09/16(金) 20:55:23
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/925.txt
C++での実装。ご参考まで。
02462342005/09/16(金) 21:01:20
>>244
ソートしたコピーは特に使わない。ソートしながら木を構築できるならそれでもよし。
双方向リストは、「キーにもっとも近い要素」の探索を対数時間でできるようにするための仕組み。
通常の木の探索で「キー以上の値を持つ要素のうち最小のもの」を見つけた後、
リストを一つ前に辿ってそれも検討する。

>>243
>削除する時は今回は2度と挿入しないんだからrebalanceする必要ないしな
気づかなかった…
考えてみればリストは双方向である必要はないし、木は平衡木である必要はないな。
0247デフォルトの名無しさん2005/09/17(土) 02:36:58
>>246
> 木は平衡木である必要はないな。
いや、平衡木だからこそlog nで検索できたんでは内科?

まあ何はともあれ、
・和で配列を作る
・平衡木を使う
の2点はカッコヨカッタ
0248デフォルトの名無しさん2005/09/17(土) 03:02:24
漏れの脳では二分探索木で、値に最も近い数を求めるってのが出来ん。
はふぅ。
02492152005/09/17(土) 06:42:51
皆様ありがとうございます.なんとか理解できたつもりです.

1. 累積させた配列を作成してソートする.
2. その配列を左から順に見ていき(a[i], 1 ≦ i ≦ n),右の残りの配列の中でa[i] との差が最も x に近い値を求める.
2.1 その際に二分探索で求める.

ということでしょうか.

これなら,確かに n * log n です.

これは思いつきません.ソートと二分探索が効いてますね.
二分探索は探索して見付からなかったときに最終位置と
左右どちらかで近い方を選択することでできるのかな..

>>234
累積配列の最初に,0 があるおかげで,a[2] 〜 a[n] じゃなくて a[1] 〜 a[n]
の部分列が求められるのか.こういうの苦手です.

>>245
便利な関数がいっぱいあるのだと勉強になりました.
partial_sum とかそのまんまのがあるんですね.
find_nearest がむずい…(´・ω・ :;.. 頑張ります.

感心してばかりでした.ありがとうございました.
0250デフォルトの名無しさん2005/09/17(土) 10:43:07
>>248
レフトポインタとライトポンタが重なったら、その左右の値を調べればいいんじゃないの?
0251デフォルトの名無しさん2005/09/17(土) 13:23:43
random access iteratorでないとlowerbound()やupperbound()が
使えないのは、二分探索が使えないからだよね。
0252デフォルトの名無しさん2005/09/17(土) 17:35:07
あんまりちゃんと検証してないけどC
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/926.c
0253デフォルトの名無しさん2005/09/17(土) 17:58:36
>>252
すげー。
ちゃんと赤黒木実装してるし。
search_nearestはエレガントだし。

せっかく書いたから俺もあげとく。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/927.txt
02542342005/09/17(土) 18:19:27
>>249
>1. 累積させた配列を作成してソートする.
>2. その配列を左から順に見ていき(a[i], 1 ≦ i ≦ n),右の残りの配列の中でa[i] との差が最も x に近い値を求める.
>2.1 その際に二分探索で求める.

微妙に違う気がする。左から見ていくのはソートする前の配列ね。

>find_nearest がむずい…(´・ω・ :;.. 頑張ります.

>>245のfind_nearestは間違ってた。
結果は正しいし、計算量も問題ないけど、これだとリストの価値がない。
つまり、そもそもリストは要らなかった。(thx >>252)

ついでに、>>253も俺です。
0255デフォルトの名無しさん2005/09/17(土) 23:41:31
最大部分和(?)だったかな、
これ配列を1度だけ見ていくだけで求まるロジックがあるので
そいつを応用すればO(n)だと思う
ちょっと探してみるよ
0256デフォルトの名無しさん2005/09/17(土) 23:54:51
気のせいならいいのだが。

4要素{A,B,C,D}に対して、
生成される部分列は{A,B,C,D, A+B,B+C,C+D, A+B+C,B+C+D, A+B+C+D}
つまり、n要素に対する部分列の個数はn(n+1)/2である。

A,B,C,Dの何れも正負の符号を取るのならば、
部分列に新たな要素を加算した総和が元に比べ単純増加するとは限らない。
(A+B)>(A+B+C)という可能性もある。
結局、全ての部分列の要素について総和を求める必要がある。

これは数列の要素数nが2以上の場合になりたち、この問題の計算量は最小でもO(n^2)である。

のではまかろーに?
02572562005/09/18(日) 00:02:39
0xff get失敗です…(´з`)
02582562005/09/18(日) 00:03:27
ぐはっ、、、2連でsage忘れた、、、申し訳ない。
0259デフォルトの名無しさん2005/09/18(日) 00:10:37
>>256
漏れもそこ気になった。要素が全て正ならば成り立つけれど、
負も含まれてしまうと問題になる希ガス
0260デフォルトの名無しさん2005/09/18(日) 00:12:01
Cでコンパイラー開発できる人いますか?
0261デフォルトの名無しさん2005/09/18(日) 00:12:48
います
0262デフォルトの名無しさん2005/09/18(日) 00:13:40
>>260 居る、以上。
0263592005/09/18(日) 00:17:06
コンパイラー開発って、色々な概念があるんですか?
それとも、基本的にはある概念にそって開発するんですか?
0264デフォルトの名無しさん2005/09/18(日) 00:17:46
何を何にコンパイルするかによってぜんぜん違う。
0265デフォルトの名無しさん2005/09/18(日) 00:20:49
>>114
0266デフォルトの名無しさん2005/09/18(日) 00:26:02
>>256
気のせいだ。
木の中には
{ 0, A, A+B, A+B+C, A+B+C, A+B+C+D }...(1)
が小さい方から順に入っている
この木からxに最も近いもの,x+Aに最も近いもの,...,x+A+B+C+Dに最も近いもの
を探している。そうやって擬似的に
{ B, B+C, B+C+D } ...(2)
{ C, C+D }
  :
という集合を作り出してその中からxに近いものを探索しているわけだね
(1)からx+Aに近いものを探索するのと(2)からxに近いものを探索するのは同じことだ(ただし>>239-240参照)
また、すべての要素から一定の値が引かれてるから順序関係は変わらない
故に、その探索はそれぞれ O(log n)ですむ(全部調べなくていい)
それをn回やってその中で1番xに近いものはすべての組み合わせの中でもxに一番近い
だからオーダーはO(n log n)だ。と
02672552005/09/18(日) 00:43:53
とりあえずできたみたいなんだけど...

int tbl[]={-10,31,40};
#define TBL_SIZE (sizeof(tbl)/sizeof(int))
#define KEY 15
int main(void)
{
int i,max,sum,maxst,maxed,st,ed;
max=sum=tbl[0];
maxst=maxed=st=ed=0;
for(i=1; i<TBL_SIZE; ++i){
if(sum!=0){ sum+=tbl[i]; ed=i;}
else{ sum=tbl[i]; st=ed=i;}
if(abs(sum-KEY)<abs(max-KEY)){ max=sum; maxst=st; maxed=ed;}
}
printf("\n%d <- [%d]-[%d]\n", max,maxst,maxed);
return 0;
}
0268デフォルトの名無しさん2005/09/18(日) 00:48:41
あれ?
find {x+A+B+C} from sort{0,A,A+B,A+B+C,A+B+C+D}をしてしまったら
AやA+Bが選択される危険性があるような…
02692562005/09/18(日) 00:56:27
>> { B, B+C, B+C+D } ...(2)
>> { C, C+D }
を生成しているつもりで、

{ -A , 0 , B , B+C , B+C+D}
{ -A-B, -A, 0 , C , C+D} を生成している罠。
しかもソートされているので、不要な要素(0から左)が消せないのでは?
02702562005/09/18(日) 01:03:11
単に削除する順序を記述した表を作成すればいいのかな?
そうすればO(1)でできそう。
0271デフォルトの名無しさん2005/09/18(日) 01:05:32
C言語のプログラムで次の数列を表示するのですが、
やり方を教えてください!

1 1 1 1
2 4 8 16
3 9 27 81
4 16 64 256

宜しくお願いします!
0272デフォルトの名無しさん2005/09/18(日) 01:06:40
>>1 にやり方が乗ってるぞ!!
0273デフォルトの名無しさん2005/09/18(日) 01:18:12
>>271
#include <stdio.h>

int main()
{
    int i,j,num;
    
    for (i=1 ; i<5 ; i++)
    {
        num=i;
        for (j=0 ; j<4 ; j++)
        {
            printf("%d ", num);
            num*=i;
        }
        printf("\n");
    }

    return 0;
}
0274デフォルトの名無しさん2005/09/18(日) 01:24:18
>>212
>>267 でいいのか?
O(n)だぞ
0275デフォルトの名無しさん2005/09/18(日) 01:28:49
どこが原因かわからないが、、、
>>253で
arr={10,30,-5}で15となる組合検索(解- 0 1 2)を実行しても(0 2)が蛙。
0276デフォルトの名無しさん2005/09/18(日) 01:34:18
>>267
int tbl[]={-10,40,31};
0277デフォルトの名無しさん2005/09/18(日) 01:39:54
>>267
> int data[] = {-10, 31, 40, -30, 8, -9, 3, 10, -67, 45}; /* => 13:[6, 7] */
0278デフォルトの名無しさん2005/09/18(日) 01:48:36
>>273
ありがとうございます!
せっかく解いてもらったのに申し訳無いのですが
自力で出来ました。
また、分からない時はぜひお願いします!!
0279デフォルトの名無しさん2005/09/18(日) 01:59:25
C、c++どちらでもいいのですが
最尤系列推定のプログラムおしえてください。
0280デフォルトの名無しさん2005/09/18(日) 02:03:29
>>267
それじゃ駄目だろう。
区切られた部分列が解の部分列の一部になっている場合はどうする?
0281デフォルトの名無しさん2005/09/18(日) 14:21:36
[1] 授業単元: C課題
[2] 問題文(含コード&リンク):http://www.geocities.jp/kabutomusi1/kadai.txt
[3] 環境
 [3.1] OS: Windows
[3.2] コンパイラ名とバージョン: BCC
 [3.3] 言語: Cでお願いします。
[4] 期限: [明日]
[5] その他の制限:なるべく簡単に。

宜しくお願いします。
0282デフォルトの名無しさん2005/09/18(日) 14:33:50
>>281
配列の要素数、或いは終端条件を提示してください。
0283デフォルトの名無しさん2005/09/18(日) 14:36:04
>>281
配列のデータ入力方法も、だな。
コマンドラインから入力するのか、ソースにベタ書きでいいのか。
0284デフォルトの名無しさん2005/09/18(日) 14:36:30
>>281
配列の要素数は?
確か先頭へのポインタとして渡された場合、ヌル終端されてるとか
負数があるとかの決まりがないと、関数側じゃ要素数は取得できないと思うが
以下、要素数をnとしたときのソース@脳内コンパイラ

double Average(int *p)
{
unsigned long diff=0;
int i;
for (i=1;i<n;i++)
diff += p[i] - p[i-1];
return (double)p[0] + ((double)diff)/n;
}
0285デフォルトの名無しさん2005/09/18(日) 14:38:48
>>284
訂正
誤)diff += p[i] - p[i-1];
正)diff += p[i] - p[0];
0286デフォルトの名無しさん2005/09/18(日) 14:43:32
>>281
適当に仕様を想像した結果
#include<stdio.h>
double Average(int *p){
    double d=0.0;
    int i;
    for(i=0;p[i]!=-1;i++){
        d+=(double)p[i];
    }
    if(i==0)return -1.0;
    return d/i;
}
int main(){
    int a[11],i;
    for(i=0;i<10;i++){
        printf("整数[%d]==>",i);
        scanf("%d",&a[i]);
        if(a[i]==-1)break;
    }
    a[i]=-1;
    printf("\n平均:%.1f",Average(a));
    return 0;
}
0287デフォルトの名無しさん2005/09/18(日) 14:46:23
実行画面とやらを眺めてて思ったが、ひょっとして
10個若しくは要素にー1が現れるまでが条件か・・・?
つーか、問題はちゃんと全部書けと散々言ってるだろう
それで問題全部なら、出題した奴の頭に蛆でも沸いてるんじゃねーの
0288デフォルトの名無しさん2005/09/18(日) 14:55:50
>>287
条件はそういうことだと思います。
問題はこれで全部です。
0289デフォルトの名無しさん2005/09/18(日) 14:59:32
配列のデータのaveをAverageのプロトで返せってことだろ。
配列の[9]には-1が格納されるべき。
0290デフォルトの名無しさん2005/09/18(日) 15:01:34
ごめん言いたかったのは、
もし-1が要素の終了条件であるならば、実行画面1の[9]には-1が格納される筈。
ってこと
0291デフォルトの名無しさん2005/09/18(日) 15:03:46
>>289
実行例1には[9]にも90と入ってるぞ

とりあえず287に書いた条件で手直ししてみた
例によって相変わらずの脳内gccだから違ってるかも知れない(特にキャスト周辺)
ちゃんと動くか確認してみてくれ
double Average(int *p)
{
unsigned long diff=0;
int i;
for (i=1;i<10 && p[i] != -1;i++)
diff += p[i] - p[i-1];
return (double)p[0] + ((double)diff)/((double)i);
}
0292デフォルトの名無しさん2005/09/18(日) 17:27:37
>unsigned long
ダメだと思う
素直にdoubleにしとけよw
0293デフォルトの名無しさん2005/09/18(日) 18:03:44
別に問題の中では正の値なんだしunsignedでも構わないだろ。
まぁ減点対象だろうが
0294デフォルトの名無しさん2005/09/18(日) 19:18:45
>292
-1が入ってたら打ち切り、なんだろ?
負数が無いと仮定した方がしぜんジャマイカ
0295デフォルトの名無しさん2005/09/18(日) 19:55:57
>>294
ちゃんと>291を読めよ。
負の数を代入する可能性があるのは見えないか?
0296デフォルトの名無しさん2005/09/18(日) 20:04:20
>295
見えない
つーかあったとしても-1だけ例外なのはおかしいし
0297デフォルトの名無しさん2005/09/18(日) 20:11:23
>>296
そうではなくて、p[i] - p[i - 1] も見えないのか?
0298デフォルトの名無しさん2005/09/18(日) 20:40:27
ということだよ>293
0299デフォルトの名無しさん2005/09/19(月) 02:33:52
291を書いた物ですが、寝ぼけてたせいかとんでもない大チョンボやらかしてた・・・('A`)
unsignedじゃダメじゃんか・・・longだよlong_| ̄|○
0300デフォルトの名無しさん2005/09/19(月) 02:34:52
しかも、p[i]-p[i-1]じゃなかった、p[i]-p[0]だよ・・・
もう寝る('A`)ノシ
0301デフォルトの名無しさん2005/09/19(月) 13:19:56
[1]C
[2]文字列strの中に、文字cが含まれていればその添字を返し、
含まれていなければ-1を返す関数
int str_char(const char str[], int c)
を作成せよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/929.txt
関数部分は合っていると思うのですがエラーが出てしまいます。
添削お願いします。
[3.1]windows[3.2]bcc[3.3]C
0302デフォルトの名無しさん2005/09/19(月) 13:22:22
>>301
>>1
>・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
0303デフォルトの名無しさん2005/09/19(月) 13:39:54
ソース見ただけで適当に答えてみる。

printf("文字列を入力してください:");
fgets(st, 100, stdin);
printf("調べたい文字を入力してください:");
ch = getchar();
0304デフォルトの名無しさん2005/09/19(月) 13:53:17
文字を%dで出力してるけど、たぶん%cの間違い
あとは>>303の修正で良いと思う(or scanf("%s ",st))
03053042005/09/19(月) 13:56:17
ミスった
×(or scanf("%s ",st)) 
○(or scanf(" %c",&ch))
0306デフォルトの名無しさん2005/09/19(月) 14:33:52
>>269
>{ -A , 0 , B , B+C , B+C+D}
>{ -A-B, -A, 0 , C , C+D} を生成している罠。
実際生成していないんだが、ソース読んでるか?
0307デフォルトの名無しさん2005/09/19(月) 20:33:27
>>305 それだと、int chも変更せんとな。
0308デフォルトの名無しさん2005/09/19(月) 23:18:11
scanf がstdinの最後の\nを読み残してるんだろうなぁ。
多分>>303で正解。
0309デフォルトの名無しさん2005/09/20(火) 00:23:14
[1] 授業単元: C言語講座
[2] 問題文: 縦横100×100で8ビット256色のBMPファイルを読みこみ、1ピクセルあたりの画素値を
        CSVファイルにBMPの画像のように同じ様に書きこめ。
[3] 環境
 [3.1] OS: Windows2000
 [3.2] コンパイラ名とバージョン: VC++
 [3.3] 言語: C言語
[4] 期限: [無期限]
[5] その他の制限: BMPのヘッダーを構造体に入れてから画素値を取り出しなさい。また2次元配列を使いなさい。

以前同じ質問をしたのですがいまだに解き方がわからないので再度質問させてください。
freadで一行分のピクセルデータから1バイトずつ抜き出していく方法を考えているのですが、これをどう0〜256の
画素値にするのかがわかりません。
ビットマップのピクセルデータをどう扱うか、また1ピクセルごとにどうファイルから読んで二次元配列に入れていくのか
という根本的なところが理解できていないのが解らない原因ですが、どうかご教授ください。
0310デフォルトの名無しさん2005/09/20(火) 00:32:31
>>306
ソースを見直してようやく分かった。
sums[i]要素を削除するremove_lt()で処理してるんだな。
まあ、このスレに助け求めている人間があんなコードを渡されても…という感は否めないがw

>>309
そもそも主がどこまでやったかわからん。晒せ。
0311デフォルトの名無しさん2005/09/20(火) 00:41:18
ttp://www.kk.iij4u.or.jp/~kondo/bmp/index.html

参考になればいいが、
8bitなら2^8=256個、赤、青、緑の色情報を格納する構造体を宣言する。
(構造体でなくとも、long int型でもいい)

画像からカラーパレット情報を読み出したら、上の構造体に保存しておく。
画像からイメージ情報を読み出したら、カラーパレット番号に対する色情報を出力する。
(long int型を使ったら、表示するときに色成分を分ける)

こんな感じか...
とりあえずカラーパレット一覧をCVSにするプログラムを作るのが先か。
0312デフォルトの名無しさん2005/09/20(火) 00:42:50
Concurrent Versions System
03133092005/09/20(火) 00:58:29
ほとんど出来ていないんです。ちょっと間を空けてしまったせいもあるのですが、
画像ファイルからのデータの抜き出しという考え方が頭の中でイメージできなくて。
テキストファイルだと一文字や一列づつ読み込むと言うのは解るのですが、ビットマップは1マスずつの扱い方が
どうも理解が出来ないんです。
Cを初めて全然たっていないんですがポインタと配列の関係でもつまづくくらい覚えが悪いんです。
0314デフォルトの名無しさん2005/09/20(火) 01:36:49
[1] 授業単元: 画像処理
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/931.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/930.txt
[3] 環境
 [3.1] OS: /Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [9/20 17:00]
[5] その他の制限:
931がcommon.inc.cです。930のインクルードに書いてあるcommon.inc.cです。

./a.out 930 common.inc.c -lm
でコンパイルします。
で、common.inc.cの

/* コードブックサイズ */
//#define CODEBOOK_SIZE 256
#define CODEBOOK_SIZE 2048
/* コードブックモード */
//#define CODEBOOK_RGB
#define CODEBOOK_YUV

のところで、#define CODEBOOK_RGBをコメントアウトして#define CODEBOOK_YUV
を有効にしてしまうとエラーが出てしまいます。逆の場合(RGBを有効、YUVをコメントアウト)はでません。
どうか解決をお願いいたします。
0315デフォルトの名無しさん2005/09/20(火) 01:38:36
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
0316デフォルトの名無しさん2005/09/20(火) 01:39:45
ポインタとか配列の考えが必要なので、なんとも・・・。

ところで・・・・C言語講座じゃないでしょ?
ホントのところは、なんなのさ。
0317デフォルトの名無しさん2005/09/20(火) 01:41:49
>>309 をみて >>314の再来と思っていたら、本人が来た。
03183142005/09/20(火) 01:49:49
エラー文を晴らせていただきます

In file included from makecodebook.c:8:
common.inc.c: In function `colorrgb2coloryuv':
common.inc.c:188: parse error before `unsigned'
common.inc.c:192: `coloryuv' undeclared (first use in this
function)
common.inc.c:192: (Each undeclared identifier is reported
only once
common.inc.c:192: for each function it appears in.)

よろしくお願いいたします
0319デフォルトの名無しさん2005/09/20(火) 02:07:55
>>314 コンパイルオプションに-std=c99を追加すればいいんじゃないかと、推測してみる。
俺はc89でしか書かんが。
0320デフォルトの名無しさん2005/09/20(火) 02:50:54
関数冒頭で変数宣言してないからだな。defineのコメントアウトで
エラーのあるなしが変わるのはコンパイル前処理で#ifdefが無くなるから。
0321デフォルトの名無しさん2005/09/20(火) 03:28:55
>>319
ありがとうございます。
gcc ファイル名 -lm -std=c99
ということでしょうか?

>>320
> 関数冒頭で変数宣言してないからだな。defineのコメントアウトで
> エラーのあるなしが変わるのはコンパイル前処理で#ifdefが無くなるから。
ありがとうございます。
176行目で、
UINT32 coloryuv;
とすればよろしいのでしょうか?

0322デフォルトの名無しさん2005/09/20(火) 03:48:29
>>314
宿題の内容とは全く関係ないが、
common.inc.cをインクルードしてるのがちょっとな・・・
実行ファイル名がa.outなのもどうかと。

そろそろMakefile作ってソース構成まとめたほうがいいんでない?
(構成例)
 common.h :共通定義
 common.c :共通ソース
 codebook.c :コードブック作成処理
 encode.c :エンコード処理
 decode.c :デコード処理
 Makefile :以下の実行形式ファイルを生成
       → codebook(コードブック作成)
       → encode(エンコード)
       → decode(デコード)

この辺は人それぞれだから、別に強制するわけではないけどね。
0323デフォルトの名無しさん2005/09/20(火) 04:06:23
>>322 同意。

>321
すこしは自分でやるとか調べるとかしようよ。
Linuxからでもネットはできるんだからさ。

>gcc ファイル名 -lm -std=c99
>ということでしょうか?

実際にやってみてどうでしたか?
コンパイルオプションを調べましたか?

>176行目で、
>UINT32 coloryuv;
>とすればよろしいのでしょうか?

実際にやってみてどうでしたか?
エラーは出なくなりましたか?
0324デフォルトの名無しさん2005/09/20(火) 04:13:21
>>322
ありがとうございます。できればやってみようと思います。

>>323
ありがとうございます。
実際にやってみたのですがだめでした。
コンパイルオプションについて調べてみました。
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide05-1.html
ここを参考にして身ました。

UINT32 coloryuv.c;
をやってみました。エラーは減ったのですがやはりだめでした。
In file included from makecodebook.c:8:
common.inc.c: In function `colorrgb2coloryuv':
common.inc.c:189: parse error before `unsigned'

170行目で、UINT32 colorrgb ,UINT32 coloryuv
にしてみましたがこれまただめでした。

知り合いの環境だといままでやったことを何もせずともコンパイルが通ったそうです。
0325デフォルトの名無しさん2005/09/20(火) 04:19:37
段落ごとに。

-mはリンカオプションなんで最後に書くけど、コンパイルオプションは最初に書くべきでしょうね。
参考にしたというページの例でもそうなってますね。

変数の宣言を2回してませんか?

知り合いの環境で動くなら知り合いの環境で組むのがいいでしょうね。
0326デフォルトの名無しさん2005/09/20(火) 04:24:34
>>325
ありがとうございます。
ggc -ostd=c99 ファイル名 -lm を実行しましたがだめでした

変数の宣言を二回しています。
ということは170行目で宣言してはいけないということですよね?
知り合いの環境では動きました。ということは新たに加えて宣言してはいけないようなプログラムだと
いうことですか?

知り合いは遠くの人なので何度も実行結果を送ってもらうわけにはいかないので
なんとかしたいです。
0327デフォルトの名無しさん2005/09/20(火) 04:34:30
>>326
・知り合いが面倒なので適当に出来たとだけ言っている
・知り合いがなにか修正したり、コンパイル時に何かしてるのに報告してない
・あなたが知り合いをでっち上げている

どれだろうね。
03283142005/09/20(火) 04:34:48
知り合いの環境では動くということは何か環境の問題だと思うのですが
何か思い当たるようなことはないでしょうか?
どうかよろしくお願いいたします
0329デフォルトの名無しさん2005/09/20(火) 04:35:58
その知り合いさんの環境とコンパイル方法がわからんとなんとも・・・・。
03303142005/09/20(火) 04:37:28
>>327
ありがとうございます。
どれもないかとおもいます。というのはRGBの場合だと問題ないのに
YUVだと問題があるということから真ん中は消えます。
(RGBとYUVでコンパイル時に別のことはしていない)
一番上は、実際に処理ファイルを送ってもらったことや、信頼できるやつなので違うと思います
一番下は違います。
0331デフォルトの名無しさん2005/09/20(火) 04:38:27
環境は linux gcc です。
細かいことは聞いてないのでわかりません(もう寝てしまった・・・)

コンパイル方法は
gcc ファイル名 -lm
です。
■ このスレッドは過去ログ倉庫に格納されています