マスタワーカ形式のプログラムをVC++で…

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

マスタワーカ形式のプログラムをVC++で…

#1

投稿記事 by aa » 15年前

これは、マスタワーカ形式で記述したCのマンデルブロ集合描画プログラムなのですが、このプログラムをVC++で動かすにはどうすればいいでしょうか。わかる方いらっしゃいましたら、教えていただけないでしょうか。

#include "common.h"
#include "common.c"
#include "container.h"
#include "container.c"

#define STR_MAX 256
#define REAL_MIN -2
#define REAL_MAX 0.5
#define IMAG_MIN -1.25
#define IMAG_MAX 1.25
#define CAMBUS_WIDTH 320
#define CAMBUS_HEIGHT 320
#define REAL_SCALE ((REAL_MAX - REAL_MIN) / CAMBUS_WIDTH)
#define IMAG_SCALE ((IMAG_MAX - IMAG_MIN) / CAMBUS_HEIGHT)

typedef struct thread_arg_t
{
int32_t thread_id;
struct cambus_t *cambus;
struct jobque_t *jobque;
pthread_t pthread;
}thread_arg_t;

typedef struct cambus_t
{
int32_t width;
int32_t height;
int32_t iter_max;
int32_t *buf;
}cambus_t;

typedef struct jobque_t
{
int32_t index;
int32_t job_num;
struct job_t *jobs;
pthread_mutex_t mutex;
}jobque_t;

typedef struct job_t
{
int32_t id;
int32_t x;
int32_t y;
int32_t width;
int32_t height;
}job_t;

void* agent(void *arg);
int32_t calc_point(double cx, double cy, int32_t iter_max);
job_t* jobque_pop(jobque_t *jobque);
void print_cambus(cambus_t *cambus);

int main(int argc, char **argv)
{
cambus_t *cambus;
jobque_t *jobque;
thread_arg_t *thread_args;
int32_t thread_id, thread_num, job_num, iter_max, print_flag, i;
double t1, t2;

if(argc < 5)
{
errn("usage : %s thread_num job_num iter_max print_flag", argv[0]);
error();
}

thread_num = atoi(argv[1]);
job_num = atoi(argv[2]);
iter_max = atoi(argv[3]);
print_flag = atoi(argv[4]);

if(CAMBUS_HEIGHT % job_num != 0)
{
errn("CAMBUS_HEIGHT % job_num != 0");
error();
}

cambus = (cambus_t*)my_malloc(sizeof(cambus_t));
cambus->width = CAMBUS_WIDTH;
cambus->height = CAMBUS_HEIGHT;
cambus->iter_max = iter_max;
cambus->buf = (int32_t*)my_malloc(cambus->width * cambus->height * sizeof(int32_t));

jobque = (jobque_t*)my_malloc(sizeof(jobque_t));
jobque->index = 0;
jobque->job_num = job_num;
jobque->jobs = (job_t*)my_malloc(job_num * sizeof(job_t));
for(i = 0; i < job_num; i++)
{
jobque->jobs.id = i;
jobque->jobs.x = 0;
jobque->jobs.y = cambus->height / job_num * i;
jobque->jobs.width = cambus->width;
jobque->jobs.height = cambus->height / job_num;
}
pthread_mutex_init(&jobque->mutex, NULL);

t1 = get_time();

thread_args = (thread_arg_t*)my_malloc(thread_num * sizeof(thread_arg_t));
for(thread_id = 0; thread_id < thread_num; thread_id++)
{
thread_args[thread_id].thread_id = thread_id;
thread_args[thread_id].cambus = cambus;
thread_args[thread_id].jobque = jobque;

pthread_create(&thread_args[thread_id].pthread, NULL, agent, &thread_args[thread_id]);
}

for(thread_id = 0; thread_id < thread_num; thread_id++)
{
pthread_join(thread_args[thread_id].pthread, NULL);
}

t2 = get_time();

errn("%lf", t2 - t1);

my_free(thread_args);

if(print_flag)
{
print_cambus(cambus);
}

my_free(jobque->jobs);
my_free(jobque);

my_free(cambus->buf);
my_free(cambus);

return 0;
}

etc…

バグ

Re:マスタワーカ形式のプログラムをVC++で…

#2

投稿記事 by バグ » 15年前

試しにVC++で新しいプロジェクトを作成して、必要なファイルを全てプロジェクトに追加してからビルドしてみてはいかがでしょうか?
コンパイラがエラーメッセージという形で修正箇所を示してくれるはずです。

kerotan0820

九九の表を表示するプログラム

#3

投稿記事 by kerotan0820 » 15年前

今、ニコニコ動画の"nm6350165"にて、for文(ループ)の応用をやっています

内容は九九の表を作ってみようというものでして、このようなプログラムです
/* kuku.c */
#include<stdio.h>
int main(void){
    int i,j;
    for(i=1;i<=9;i++){
       for(j=1;j<=9;j++){
        printf("%2d ",i*j);
    }
    printf("\n");
}
return 0;
}
最初のfor文。
iは1で9以下の間
for(j=1;j<=9;j++){
        printf("%2d ",i*j);
を実行…

下のfor文。j(1)が9以下の間 printf("%2d ",i*j); を実行

この流れは理解できるんです

なのですが、printf("\n");のみで何故自動で出力され、尚且つ改行が効くのですか?

printf("%d\n",○○);のような記述をする必要は何故無いのでしょうか

回答よろしくお願いします

■追記■
プログラム内での¥がなぜかスラッシュに見えて表示されていますが¥での認識をしてください
仕様なのですかねこれは…
PCの環境のせいですかね 画像

sizuma

Re:九九の表を表示するプログラム

#4

投稿記事 by sizuma » 15年前

printfは文字列を出力するのに使いますから、別に変数じゃなくても

printf("string");

でも出力出来ます。また、

printf("%d回、出力します\n%c\n",1,'b');

なんてこともできます。こうすると

>1回、出力します
>b
>続行するには何かキーを押してください

となるはずです。


>プログラム内での¥がなぜかスラッシュに見えて表示されていますが¥での認識をしてください
おそらくこの掲示板の文字コードの問題でしょう。
スラッシュではなく、バックスラッシュといい、日本以外ではおそらくエンマークの文字コードに当たるのがバックスラッシュなのだと思います。

printfは可変長の引数を受け取る特殊な関数なので、いろんなことが出来るんだな、と思っていればいいんじゃないかなぁと僕は思います。
改行するだけだったら
puts("");
でいいと思いますよ。 画像

array

Re:九九の表を表示するプログラム

#5

投稿記事 by array » 15年前

> 尚且つ改行が効くのですか?

コンピュータに改行して表示する際に、人間がどの様にコンピュータに指示するか
その時に使うのが「エスケープシーケンス」といい、コンピュータはこれを見つけると特別な処理をします。

「エスケープシーケンス」のひとつが「\n」です。コンピュータはこの文字を特別な文字として判断します。
「\n」を見つけると、コンピュータは改行するんだなーと判断して改行してくれます。

他にも「\a」などを入れるとパソコンがピーと鳴ります。

参考:エスケープシーケンス一覧
http://wisdom.sakura.ne.jp/programming/c/Cdata1.html

kerotan0820

Re:九九の表を表示するプログラム

#6

投稿記事 by kerotan0820 » 15年前

■sizuma様 array様
回答ありがとうございます

大変申し訳ないのですが質問の内容を書き足さねばなりません;
\nが改行を表しているということに関しての知識はあるのです
この九九の場合
1  2  3  4  5  6  7  8  9 (改行)
 2  4  6  8 10 12 14 16 18 (改行)
 3  6  9 12 15 18 21 24 27 (改行)
 4  8 12 16 20 24 28 32 36..
4の段以降省略しましたが、このように改行がなされています
この改行が何故入るのかが分からないのです
1(i)×1~9(j)を行ったらjが9だからループを抜けて iに1が加算されますよね
2(i)×1~9(j)を行ったらjが9だからループを抜けて

これを繰り返してprintfで表示されているということでしょうか?

自分で質問していてなんだか分かった気がしますが念のため投稿しておきます

Dixq (管理人)

Re:九九の表を表示するプログラム

#7

投稿記事 by Dixq (管理人) » 15年前

>> keroたんさん

こんにちは^^
ニコニコにはこんな動画もあるんですか~、面白いですね。
今はいろんな勉強の方法があるので、勉強しやすいですね。

ところで、
(1)
for(x=0; x<3; x++){
    (2)
    for(y=0; y<2; y++){
        (3)        
    }
    (4)
}
(5)
二重ループのこの処理はどのような順番でなされるか答えられますか?
これが答えられたら疑問も晴れると思います^^

non

Re:九九の表を表示するプログラム

#8

投稿記事 by non » 15年前

字下げがちゃんとできていないから、勘違いされているのではないでしょうか
正しく字下げをすると
for(i=1;i<=9;i++){
        for(j=1;j<=9;j++){
            printf("%2d ",i*j);
        }
        printf("\n");
    }
こうなりますので、横に1行出力したら、改行を行ってます。

kerotan0820

Re:九九の表を表示するプログラム

#9

投稿記事 by kerotan0820 » 15年前

■Dixq様
こんにちはです^^
ですよね~ このような質問サイトもあるわけですし…
C言語を勉強にあたっての環境は最高です^^ 本当に助かります♪

問題に関してですが、これは数字の直下の行とセットで考えればよいのですよね…
これは普通に(1)⇒(2)⇒(3)⇒(4)⇒(5)ではないですか?
xは0で、xが3未満である間xに1を加算する
yは0で、yが2未満である間yに1を加算する
あれ…
何を考えていたかいまいち分からなくなってきました;

ニコニコ動画の動画を今思い出したのですが、プログラムの進行上たしかjが先に加算されていた気がします
j*i(1~9)を行ったらj(2)*i(1~9)を行っていた気がするので…
(2)⇒(1)⇒(3)⇒(4)⇒(5)でしょうか^^;
難しいです><

box

Re:九九の表を表示するプログラム

#10

投稿記事 by box » 15年前

くだんの
printf("\n");
を外したときにどういう結果を得るか確認してみると、
printf("\n");
の役割を理解できるかもしれません。

Dixq (管理人)

Re:九九の表を表示するプログラム

#11

投稿記事 by Dixq (管理人) » 15年前

むむ・・お聞きする限りfor文の仕様が理解出来ていないのではないかと思います。
また、制御文の範囲では無い限り、またはgoto文を使わない限り、
プログラムの処理が上に流れる事はありえません。

さっきの質問をもっと簡単にしてみます。
これはどのように処理が進みますか?


(1)
for(i=0;i<3;i++){
(2)
}
(3)


答え
(1)→(2)→(2)→(2)→(3)


これにならってもう一度考えてみてください。

kerotan0820

Re:九九の表を表示するプログラム

#12

投稿記事 by kerotan0820 » 15年前

■box様
それに関しては分かります;
最初の質問は多少内容があやふやでした;すみません。

■Dixq様
①①①②②③④⑤が答えでしょうか

Dixq (管理人)

Re:九九の表を表示するプログラム

#13

投稿記事 by Dixq (管理人) » 15年前

> ①①①②②③④⑤が答えでしょうか

いやいや、よく見てください。

(1)
for(x=0; x<3; x++){
(2)
for(y=0; y<2; y++){
(3)
}
(4)
}
(5)

何故(1)が最初に3回も処理されるのです?
既に私が上で言ったことと重複しますが

(1)
for(i=0;i<3;i++){
(2)
}
(3)

の処理の流れは

(1)→(2)→(2)→(2)→(3)

となるわけです。
for文の意味は理解されているという認識で良いのですよね?
iが最初0で、3未満の間iをインクリメントしてループするわけですから、
0,1,2の3回ループするわけです。

で、for文の有効範囲ではない(1)にはその制御が及びません。
(1)には何にも干渉されないし、処理は上に流れる事は基本的にないので処理の流れが

(1)→(1)→(1)

になることはないですよね?
言っている意味が解らなければ一度入門サイトで勉強して下さい。

http://www5c.biglobe.ne.jp/~ecb/c/03_07.html

http://www9.plala.or.jp/sgwr-t/c/sec06-2.html

http://homepage1.nifty.com/toshio-k/prog/c/for.html

http://c-production.com/contents/c/sec06.html#03

勉強し終わったらもう一度整理してみましょう。

(1)
for(x=0; x<3; x++){
(2)
for(y=0; y<2; y++){
(3)
}
(4)
}
(5)

では改めて処理の流れは?

「全く解らない」という場合は無理して先に先に進んでも逆に解らないことだらけで効率が良くありません。
基礎から着実に勉強していってみてください。

kerotan0820

Re:九九の表を表示するプログラム

#14

投稿記事 by kerotan0820 » 15年前

すみません、(1)がfor(x=0; x<3; x++){ だと思っていました

となると
(1)(2)(2)(2)(3)(3)(4)(5)でいいのでしょうか;
間違っていたら勉強しなおします^^;


box

Re:九九の表を表示するプログラム

#16

投稿記事 by box » 15年前

> (1)(2)(2)(2)(3)(3)(4)(5)でいいのでしょうか;

(1)~(5)のタイミングでprintfをかませて、
確認してみてはいかがでしょうか。

Dixq (管理人)

Re:九九の表を表示するプログラム

#17

投稿記事 by Dixq (管理人) » 15年前

> SooAさん

ちょっと違いませんか?;
二重ループの中を通らずに一度ループを終了し、終了した後で二重ループの中に入り、
二重ループが終わってもネストしてる方のループの下には行っていないように見えるのですが、
見えるだけでしょうか;

> kerotanさん

百聞は一見にしかずです。
boxさんが仰る通り、printfを書いてみてください。
私が(1)等と書いている部分をprintfに置き換えて数値を出力できるようにしてみて、実行して確認してみてください。

SooA

Re:九九の表を表示するプログラム

#18

投稿記事 by SooA » 15年前

>ちょっと違いませんか?;
>見えるだけでしょうか;
ち、違いますねぇ ><;
回数だけ確認して折り返し位置とか
全く気にしてませんでした。_| ̄|○

修正を。
http://www42.tok2.com/home/tuk2nd/bbs/img/33.swf

もっと解りやすく表現できれば良かったのだけど。

kazuoni

Re:九九の表を表示するプログラム

#19

投稿記事 by kazuoni » 15年前

> SooAさん

うん、ブラウザがIE , google chromeでは修正版もおかしい気がします。

SooA

Re:九九の表を表示するプログラム

#20

投稿記事 by SooA » 15年前

>うん、ブラウザがIE , google chromeでは修正版もおかしい気がします。
ボタン配置とか出来るようになって、
ステップ実行?できるように頑張ります。

初心者用FLASHサイト見ながら作ったので
まだモーショントゥイーンしかできなかったり。・゜・(ノД`)・゜・。

kazuoni

Re:九九の表を表示するプログラム

#21

投稿記事 by kazuoni » 15年前

あ、現在みてみたら完璧ですね。
この手の物は、やはりステップが好ましい気がしますね。
その方が、次をどの様に動くか考える事も出来ますしね。

Dixq (管理人)

Re:九九の表を表示するプログラム

#22

投稿記事 by Dixq (管理人) » 15年前

VisualC++をお使いなら、F10キーを押しても同じ事がコンパイラで確認出来ますね。

kerotan0820

Re:九九の表を表示するプログラム

#23

投稿記事 by kerotan0820 » 15年前

■SooA様
わざわざFlashまで作ってくださってありがとうございます;
どういう流れで処理が行われているかは理解できました
ですがなぜそうなるのか理解できないのでもう一度2重ループについて勉強してみます><;

■Boxさん
(1)~(5)のタイミングでprintfをかますとはこういうことでしょうか
#include<stdio.h>
int main(void){
    int x,y;
for(x=0; x<3; x++){
    for(y=0; y<2; y++){
        printf("テスト\n");
}
    printf("テスト2\n");
}
    return 0;
}
実行したらこうなりました
≪実行結果≫
テスト
テスト
テスト2
テスト
テスト
テスト2
テスト
テスト
テスト2

という事は…
xが2以下である間  printf("テスト\n"); を実行("テスト"を2つ表示)
2に達したために下にプログラムが進み printf("テスト2\n");を実行("テスト2"を一つ表示)
for(x=0; x<3; x++) でくくられてるからまた  printf("テスト\n");  から再開
これを3回セット繰り返すということでしょうか
なんだか分かってきた気がします^^
画像

Dixq (管理人)

Re:九九の表を表示するプログラム

#24

投稿記事 by Dixq (管理人) » 15年前

> (1)~(5)のタイミングでprintfをかますとはこういうことでしょうか

う~んと正確にはこういうことでした
#include <stdio.h>

int main(){
    int x,y;
    printf("(1)→"); 
    for(x=0; x<3; x++){ 
        printf("(2)→"); 
        for(y=0; y<2; y++){ 
            printf("(3)→");        
        } 
        printf("(4)→");
    } 
    printf("(5)\n"); 
    return 0;
}
 

SooA

Re:九九の表を表示するプログラム

#25

投稿記事 by SooA » 15年前

色で分けてみましたが、解決したかな?

softya

Re:九九の表を表示するプログラム

#26

投稿記事 by softya » 15年前

こんな学習ソフトもありますので学習に役立てて下さい。
http://www.vector.co.jp/soft/win95/edu/se165337.html

SooA

Re:九九の表を表示するプログラム

#27

投稿記事 by SooA » 15年前

>あ、現在みてみたら完璧ですね。
報告送れましたが、データの方だけこっそり直しました^^;
FLASHの事ばかり連続で書き込んでしまうのも
いけないかなと勝手に自重@@

文字と四角だけの処理なのに、
環境によってかなり表示も変わるようで
びっくりしました。
ステップ操作を身につけねば。

kerotan0820

Re:九九の表を表示するプログラム

#28

投稿記事 by kerotan0820 » 15年前

■Dixq様
なるほど…;
非常に勉強になりました^^

■SooA様
Flashにしろ画像にしろ本当にありがとうございます
とても分かりやすいです><
今回は本当にありがとうございました

Flashについてここで語るのは僕がどうこう言える話ではありませんし、お気にならさずw


閉鎖

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