c言語で幾何学的模様をプログラミングする。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
soruda

c言語で幾何学的模様をプログラミングする。

#1

投稿記事 by soruda » 2年前

課題がどうしてもわからないため投稿させていただきました。私はまだ簡単な計算をするプログラミングしか書けないくらいの初心者です。c言語で幾何学的模様をプログラミングしたいのですがどうプログラミングすればよいのかが全くわかりません。学校からサンプルプログラムを渡されており、変更する部分をどう変更すれば描けるのでしょうか。
縦横の線で描くチェック柄のような幾何学模様を描くことを目指しています。

サンプルプログラム

コード:

#include <stdio.h>
#include <stdlib.h>  // 不要なら削除
#include <math.h>    // 不要なら削除

#include "image.h"
#include "draw.h"

// ----------------------------------------------------------------
// ここに必要に応じて関数のプロトタイプ宣言
// ----------------------------------------------------------------

void draw_main(const char *fname, const int _width, const int _height)
{
    make_rgb_image(_width, _height);

    // ------------ 以下を変更する -----------------------------------  
    set_white();
		
	int xs = 100, ys = 100, xe = 200, ye = 400;
    int r = 255, g = 0, b = 0;
    draw_line(xs, ys, xe, ye, r, g, b);
  	
    xs = 200, ys = 100, xe = 300, ye = 400;
	
    /* 青色で枠 */
    r = 0, g = 0, b = 255;  
    draw_rect(xs, ys, xe, ye, r, g, b, 0);

    /* 黄色で塗りつぶす */
    r = 255, g = 255, b = 0;  
    draw_rect(xs+1, ys+1, xe-1, ye-1, r, g, b, 1);
    
    /* 2次関数 : マゼンタで点 */
    xs = 40, xe = 160;
    draw_2fnc(0.08, 100, 10, xs, xe, 255, 0, 255, 0);
    
    /* 2次関数 : シアンで線 */
    xs = 160, xe = 280;
    draw_2fnc(0.08, 220, 10, xs, xe, 0, 255, 255, 1);
	
	// ---------- 変更はここまで ------------------------------------- 
    
    save_ppm(fname);  // 画像の保存
    free_rgb_image();
}


// 必要に応じて以下に関数を追加する(プロトタイプ宣言を忘れずに)
image.hとdraw.hはできています。
ほぼ丸投げになってしまうかもしれません。申し訳ございません。
初めての投稿なので不備があったらお申しつけください。よろしくお願いいたします。

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#2

投稿記事 by usao » 2年前

(1)提示されたサンプルコードに

> draw_line(xs, ys, xe, ye, r, g, b);

というのがある.おそらく線を描画する処理であろう.

・これの引数の値をいろいろと変えてみたらどうなるのか? → 線の位置や色が変わると思われる
・この関数を呼ぶ記述を複数個書き並べたらどうなるのか? → 複数の線が描画されると思われる

…といった実験を行ってみて,
所望の本数の線をそれぞれ所望の位置に描画するにはどうすれば良いのか? というのを把握する.

(あと,サンプルに存在している不要な描画のための記述は邪魔だからコードから抹消しておく)

---

(2)縦横の線で描くチェック柄 を描画させる

上記(1)ができたならば余裕すぎる.
「チェック柄」を構成するのに必要な本数の線を描画すればよいのだろうから,
「線を1本描画するための記述」を必要な分だけ書き並べればよい.

---

(3)ループとかに書き直す

【「線を1本描画するための記述」をひたすら大量に書き並べるのはどうなの? つらいんですけど??】
とか疑問に思ったならば,
そこをループ処理に書き換えることができないかどうかを検討してみればよかろう.

---

#【線に幅を持たせたいんですけど?】とかいう場合には draw_rect の側を使うことを考えてみればよいと思う.

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#3

投稿記事 by usao » 2年前

丸投げ質問する前に,上記の(1)と(2)くらいはやるべき.

最初から(3)だけやれば即終了な話となるところであろうが,
それができないからこそ質問をしているのだろうから,であれば(1)や(2)のステップを飛ばすべきではない.
【(2)の状態を実際に作ってみて→そこに「ループ処理で書けそうな何らかの規則性」を見出す】という作業をやってみるべき.

「どうしても見出せない」ときには,このような場所で質問しても良いだろうが
その際の質問内容は,
自身が書いた(2)のコードを示して「これをループでいい感じに纏めたいんだけど?」とかいう話となろう.
(「チェック柄を描くコードをください!」じゃなくて.)

soruda

Re: c言語で幾何学的模様をプログラミングする。

#4

投稿記事 by soruda » 2年前

ご返信、アドバイスありがとうございます。

ここに投稿する前に(1)の引数の値を変えたらどうなるかを試そうとしたのですがgcc -o 実行ファイル名 ソースファイル名 でコンパイルを行ったところ、
コンパイル結果

コード:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
/usr/bin/ld: /tmp/ccac6O68.o: in function `draw_main':
draw.c:(.text+0x1d): undefined reference to `make_rgb_image'
/usr/bin/ld: draw.c:(.text+0x22): undefined reference to `set_white'
/usr/bin/ld: draw.c:(.text+0x7f): undefined reference to `draw_line'
/usr/bin/ld: draw.c:(.text+0xde): undefined reference to `draw_rect'
/usr/bin/ld: draw.c:(.text+0x12d): undefined reference to `draw_rect'
/usr/bin/ld: draw.c:(.text+0x173): undefined reference to `draw_2fnc'
/usr/bin/ld: draw.c:(.text+0x1b9): undefined reference to `draw_2fnc'
/usr/bin/ld: draw.c:(.text+0x1c9): undefined reference to `save_ppm'
/usr/bin/ld: draw.c:(.text+0x1ce): undefined reference to `free_rgb_image'
collect2: error: ld returned 1 exit status
のような文字列が出てきます。これはコンパイルの仕方が間違っているのでしょうか。それとも何かが足りてないのでしょうか。こちらを先に質問するべきでした。申し訳ございません。

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#5

投稿記事 by usao » 2年前

> undefined reference to `関数名`

っていうのが大量に出てる
→「これらの関数の実装がどこにあるかわかんねぇよ」って話.

各関数の実装がどこにどうやって提供されている話なのか不明ですが,
コンパイルすべきソースファイルが足りてないとか,あるいはライブラリのリンクが必要とか,そんなような話かと.

課題でサンプルコードをもらってるなら,それと一緒に
「そのサンプルをどうやって使うのか(コンパイル→リンク するか)」
という情報も一緒に受け取っているのではないか
(動かすにはどういうコマンドを打てばよいのかっていう話とか,あるいは makefile があるとか)
と思うのだけど,無い感じですか?
(受け取ってないとか発掘できないとかいう場合には,同じ課題を出されている奴に「そもそもコレどうやって動かすの?」って訊いちゃうのが早いと思う)

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#6

投稿記事 by usao » 2年前

例えば

> undefined reference to `main'

なんてのが出てるけど,main関数の定義はどこにあるのか? っていう.
main関数が書かれている(拡張子が .c な)ソースファイルがあるんじゃない?
あるなら,

> gcc -o 実行ファイル名 ソースファイル名

の「ソースファイル名」のところに,そのソースも含めてやる必要があるよね.
(コードが複数のソースファイルに分かれているなら「ソースファイル名」のところにそいつらを書き並べる)

"image.h" や "draw.h" で宣言されている関数群(make_rgb_image とか set_white とかdraw_line とかいう奴ら)の実装がライブラリ(windowsなら .lib , linux なら .a とか)として提供されているとしたらそいつらをリンクする記述(-L オプションかな)も書く必要がある.

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#7

投稿記事 by usao » 2年前

オフトピック
普段 IDE に完全依存して生きてるので,このくらいの事しか書けないぜ!
gcc 使うところの話は gcc マスターな誰かにお任せするしか!

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: c言語で幾何学的模様をプログラミングする。

#8

投稿記事 by みけCAT » 2年前

usao さんが書きました:
2年前
そいつらをリンクする記述(-L オプションかな)も書く必要がある.
-L オプションはライブラリがあるディレクトリを指定するオプション、
実際にライブラリをリンクする指示は -l オプションですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#9

投稿記事 by usao » 2年前

ご指摘感謝.
(やはりしばらく触ってない物の話は知ってたハズのことでもこうやってさくっとミスるからダメっすね…)

soruda

Re: c言語で幾何学的模様をプログラミングする。

#10

投稿記事 by soruda » 2年前

ご返信、アドバイスありがとうございます。

#5でどういうコマンドを打てばよいかでサンプルコードと一緒にmakefileが渡されており、その中にコマンドらしいものがあったので全て打ってみたのですが全てコマンドが見つかりませんとでました。何がいけなかったのでしょうか。
makefile

コード:

draw: main.o draw.o image.o
	cc -o draw main.o draw.o image.o

main.o: main.c draw.h
	cc -c main.c

draw.o: draw.c image.h draw.h
	cc -c draw.c

image.o: image.c image.h
	cc -c image.c
ccの前にtabを入れます。

#6でmain関数が書かれているソースファイル(?)がmain.cでありました。

コード:

#include <stdio.h>
#include "draw.h"

int main(int argc, char * argv[])
{
  if(argc != 2){
    fprintf(stderr, "usage:%s<save_file.ppm>\n", argv[0]);
    return 1;
  }

  draw_main(argv[1], 640, 480);
  return 0;
}
このファイルを含め.cのあるファイルをソースファイル名に書き並べてgcc -o 実行ファイル ソースファイル名 でリンク?したところ
結果

コード:

/usr/bin/ld: /tmp/cc1xSUGX.o:(.bss+0x0): multiple definition of `im_r'; /tmp/ccWXBThV.o:(.bss+0x0): first defined here
/usr/bin/ld: /tmp/cc1xSUGX.o:(.bss+0x8): multiple definition of `im_g'; /tmp/ccWXBThV.o:(.bss+0x8): first defined here
/usr/bin/ld: /tmp/cc1xSUGX.o:(.bss+0x10): multiple definition of `im_b'; /tmp/ccWXBThV.o:(.bss+0x10): first defined here
/usr/bin/ld: /tmp/cc1xSUGX.o:(.bss+0x18): multiple definition of `width'; /tmp/ccWXBThV.o:(.bss+0x18): first defined here
/usr/bin/ld: /tmp/cc1xSUGX.o:(.bss+0x1c): multiple definition of `height'; /tmp/ccWXBThV.o:(.bss+0x1c): first defined here
collect2: error: ld returned 1 exit status
という前回とはまた異なるエラー?がでてきました。これらはどういうことなのでしょうか。
.libや.aで提供されているものはありませんでした。

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#11

投稿記事 by usao » 2年前

その makefile がある場所で,コマンドラインから

make draw

で良いのではなかろうか?
(成功すれば draw という実行形式ファイルが生成されると思う)

soruda

Re: c言語で幾何学的模様をプログラミングする。

#12

投稿記事 by soruda » 2年前

ご返信ありがとうございます。

make draw で実行したところ

コード:

cc -o draw main.o draw.o image.o
/usr/bin/ld: image.o:(.bss+0x0): multiple definition of `im_r'; draw.o:(.bss+0x0): first defined here
/usr/bin/ld: image.o:(.bss+0x8): multiple definition of `im_g'; draw.o:(.bss+0x8): first defined here
/usr/bin/ld: image.o:(.bss+0x10): multiple definition of `im_b'; draw.o:(.bss+0x10): first defined here
/usr/bin/ld: image.o:(.bss+0x18): multiple definition of `width'; draw.o:(.bss+0x18): first defined here
/usr/bin/ld: image.o:(.bss+0x1c): multiple definition of `height'; draw.o:(.bss+0x1c): first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:2: draw] エラー 1
というエラーがでてしまいます。まだ何かたりないのでしょうか。

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#13

投稿記事 by usao » 2年前

「コードに何も手を入れていない渡されたままの状態」でmakeできないということ?

> エラーがでてしまいます

で止まらずに,エラーの文章を読むなりその文言でググるなりしましょう.
「多重定義」って言われてるんだから,そいつらの定義が複数あるのがダメっていうエラー.
例えば image.h あたりに im_r とか width とかいうのの「定義」が書かれてたりしてない?

---

> 同じ課題を出されている奴に「そもそもコレどうやって動かすの?」って訊いちゃうのが早い

正直,状況に関する情報を持っていない外野に質問するよりも,これ↑を検討すべきと思うよ.
(一度そういう関係を作っちゃえば今回だけでなく以降も使っていけるだろうし)

個人的に,こういう課題の話を外の世界に訊くのは下策だと思う.

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語で幾何学的模様をプログラミングする。

#14

投稿記事 by usao » 2年前

オフトピック
> 個人的に,こういう課題の話を外の世界に訊くのは下策だと思う.

質問するにしても,「課題」ならば期限とかあるだろうから,
それなりに人がいる場所でやらないと レスポンスのくる率,やりとりの速度 等の面でダメなのではなかろうか.
ここは期限のある話をするには過疎過ぎると思う.
(まぁ適切な場所がどこかにあるのか? っていうのを私は知らないけど…)

返信

“C言語何でも質問掲示板” へ戻る