毎度お世話になっています。今回は引数に関して。

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

毎度お世話になっています。今回は引数に関して。

#1

投稿記事 by けいすけ » 18年前

皆さんのアドバイスが本当に毎回助けになっています。
授業をまじめに聞いているつもりではいるのですが落ちこぼれてしまっっているのですが
皆様のおかげでどうにか理解して課題が提出できています。
改めて感謝しています。

さてまた質問なのですが。。。。。
関数の中に関数を入れて、その中での引数を受け渡すということの
やり方がいまいちわかりません。自分ではわかったつもりでいるのですが、
コンパイルできませんって出てしまいます^^;

一応自分で今日日曜日を使ってずっとやってたのですがやっぱりできません・・・・・泣

どこが違うのかヒントをいただければと思ってまたここに書き込んだ次第です。

もしよろしければアドバイスをして頂きたいです。よろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MS 200
#define PI 3.14159265358979
main()
{
	char fi[50];
	int i,j,t;
	FILE *fp;
	unsigned short header[13]={0x4d42,54490,1,0,0,26,0,12,0,MS,MS,1,24};
	unsigned char *bmp;
	bmp=(unsigned char *)malloc(MS*MS*3);
	for(i=0;i<MS*MS;i++)
	{
		bmp[i*3+0]=0;
		bmp[i*3+1]=0;
		bmp[i*3+2]=0;
	}
	printf("Input rotate angle : ");
	scanf("%s",fi);
	t=atoi(fi);
	for(i=25;i<=174;i++)
	{
		for(j=25;j<=174;j++)
		{
			bmp[(j*MS+i)*3+0]=0;
			bmp[(j*MS+i)*3+1]=0;
			bmp[(j*MS+i)*3+2]=255;
		}
	}
	void rotate(unsigned char *,int,int);
	main()
	{
		unsigned char *bmp;
		rotate(b,x1,y1);
	}
	void rotate(unsigned char *b,int x0,int y0)
	{
		int i,j,x,y,x1,y1;
		double th,si,co;
		unsigned char *a;
		a=(unsigned char*)malloc(MS*MS*3);
		th=t*PI/180;
		so=sin(th);
		co=cos(th);
		for(i=0;i<MS*MS;i++)
		{
			a[i*3+0]=0;
			a[i*3+0]=0;
			a[i*3+0]=0;
		}
		for(i=0;i<MS;i++)
		{
			y=i-MS/2;
			for(j=0;j<MS;j++)
			{
				x=j-MS/2;
				x1=x*co+y*si+MS/2+0.5;
				y1=-x*si+y*co+MS/2+0.5;
				if(0<x1 || x1<MS)
				{
					if(0<y1 || y1<MS)
					{
						a[(i*MS+j)*3+0]=b[(y*MS+x)*3+0];
						a[(i*MS+j)*3+1]=b[(y*MS+x)*3+1];
						a[(i*MS+j)*3+2]=b[(y*MS+x)*3+2];
					}
				}
			}
		}
		for(i=0;i=MS*MS*3)
		{
			b=a;
		}
		free(a);
	}
	printf("Input file name : ");
	scanf("%s",fi);
	if((fp=fopen(fi,"wb"))==NULL)
	{ 
		printf(stderr,"Error : file open[%s].\n",fi);
		exit(1);
	}
	fwrite(header,2,13,fp);
	fwrite(bmp,1,200*200*3,fp);
	fclose(fp);
}


  




Justy

Re:毎度お世話になっています。今回は引数に関して。

#5

投稿記事 by Justy » 18年前

 まずは関数の呼び出し方が間違っています。
 というか、何故か main関数が2つあったりしています。
 関数の中に関数は書けません。

 rotateの3つの引数のうち後ろ2つが謎です。
 ヒントでは2つしか引数がありません。

 下に今回のケースでのひな形を書いておきますので、あとは埋めてみて下さい。
[color=#d0d0ff" face="monospace]#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define MS 200 

static void rotate(unsigned char *, int);

int main(void) 
{
    int t = 0;
    char *bmp = bmp=(unsigned char *)malloc(MS*MS*3);
    // **********
    rotate(bmp, t);
    // **********
    return 0;
}

static void rotate(unsigned char *bmp, int t)
{
    // **********
}
[/color]

管理人

Re:毎度お世話になっています。今回は引数に関して。

#6

投稿記事 by 管理人 » 18年前

お返事が遅れてしまってすみません。

>関数の中に関数を入れて、その中での引数を受け渡すということの やり方がいまいちわかりません。自分ではわかったつもりでいるのですが、

関数の中に関数は書けないです。関数の中で、ほかの関数を呼び出すんです。このプログラムを見てください。
1 #include <stdio.h>

2 void calc(int a){
3 	printf("%d",a);
4 	return ;
5 }

6 int main(void){
7 	int x=2;
8	calc(x);
9	return 0;
10}
処理はメイン関数から始まります。
6
7
8
2
3
4
8(戻り)
9
このような順番で処理が行われます。
メイン関数で2が代入されたxはcalc関数へ渡されます。
渡された受け取りの変数名はaですからcalc関数ではaが2となります。
その後、return から返ってきて、main関数もreturnで終了します。

関数の作り方、処理の流れをもう一度おさらいしてみてください。


・main関数は1個しか書けません。
・関数の中に関数はかけません。
・main関数より下に関数を作るときはプロトタイプ宣言をすること


に注意してください。

けいすけ

Re:毎度お世話になっています。今回は引数に関して。

#7

投稿記事 by けいすけ » 18年前

ありがとうございました。アドバイスを元にまた作り直してみました。
しかしまだうまく動きません。またアドバイスをいただければと思いまして
ここに書き込みます。アドバイスよろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MS 200
#define PI 3.14159265358979
void rotate(unsigned char *,int);
main()
{
char fi[50];
int i,j,t;
FILE *fp;
unsigned short header[13]={0x4d42,54490,1,0,0,26,0,12,0,MS,MS,1,24};
unsigned char *bmp;
bmp=(unsigned char *)malloc(MS*MS*3);
for(i=0;i<MS*MS;i++)
{
bmp[i*3+0]=0;
bmp[i*3+1]=0;
bmp[i*3+2]=0;
}
printf("Input rotate angle : ");
scanf("%s",fi);
t=atoi(fi);
for(i=25;i<=174;i++)
{
for(j=25;j<=174;j++)
{
bmp[(i*MS+j)*3+0]=0;
bmp[(i*MS+j)*3+1]=0;
bmp[(i*MS+j)*3+2]=255;
}
}
rotate(bmp,t);
return 0;
printf("Input file name : ");
scanf("%s",fi);
if((fp=fopen(fi,"wb"))==NULL)
{
printf(stderr,"Error : file open[%s].\n",fi);
exit(1);
}
fwrite(header,2,13,fp);
fwrite(bmp,1,200*200*3,fp);
fclose(fp);
}
void rotate(unsigned char *b,int t)
{
int i,j,x,y,x1,y1;
double th,si,co;
unsigned char *a;
a=(unsigned char *)malloc(MS*MS*3);
th=t*PI/180;
si=sin(th);
co=cos(th);
for(i=0;i<MS*MS;i++)
{
a[i*3+0]=0;
a[i*3+0]=0;
a[i*3+0]=0;
}
for(i=0;i<MS;i++)
{
y=i-MS/2;
for(j=0;j<MS;j++)
{
x=j-MS/2;
x1=x*co+y*si+MS/2+0.5;
y1=-x*si+y*co+MS/2+0.5;
if(0<x1 || x1<MS)
{
if(0<y1 || y1<MS)
{
a[(i*MS+j)*3+0]=b[(y1*MS+x1)*3+0];
a[(i*MS+j)*3+1]=b[(y1*MS+x1)*3+1];
a[(i*MS+j)*3+2]=b[(y1*MS+x1)*3+2];
}
}
}
}
for(i=0;i<MS*MS*3;i++)
{
b=a;
}
free(a);
return;
}

Justy

Re:毎度お世話になっています。今回は引数に関して。

#8

投稿記事 by Justy » 18年前

 ぱっと目に付くマズイところ。

1 途中で終了。
 main()の途中で画像を回転させるために rotate()を呼ぶも、その直後に[color=#d0d0ff" face="sans-serif] return 0[/color]が来てるので、そのまま main()が終了してしまい、その後の保存処理が行われていません。

2 コンパイルが通らない。
 printf(stderr,"Error : file open[%s].\n",fi);
 の行でコンパイルエラー。printfと fprintfの引数の違いを確認して下さい。

3 メモリへの不正なアクセス
 rotate()内で画像の入力元の画素をコピーするとき、コピーする条件が [color=#d0d0ff" face="sans-serif">(0<x1 || x1<MS)[/color] と [color=#d0d0ff" face="sans-serif](0<y1 || y1<MS)[/color] になっています。
 これではどんな値が来てもこの if文は真として評価されます。

 ここでは x1/x2が画像サイズの範囲内であることを確認したいので、|| ではなく && が正解です。
 さらに、x1 = 0や y1 = 0の時もコピーできるので
[color=#d0d0ff" face="monospace]            if(0<=x1 && x1<MS && 0<=y1 && y1<MS)
            {
                a[(i*MS+j)*3+0]=b[(y1*MS+x1)*3+0];
                a[(i*MS+j)*3+1]=b[(y1*MS+x1)*3+1];
                a[(i*MS+j)*3+2]=b[(y1*MS+x1)*3+2];
            }[/color]
 として下さい。

3 背景の塗りが不足
 roate()内の最初の方で、画像の全体を背景色で塗りますが同じところを何度も塗りつぶしています。
[color=#d0d0ff" face="monospace]    for(i=0;i<MS*MS;i++)
    {
        a[i*3+0]=0;
        a[i*3+1]=0;
        a[i*3+2]=0;
    }[/color]

けいすけ

Re:毎度お世話になっています。今回は引数に関して。

#9

投稿記事 by けいすけ » 18年前

ありがとうございました。皆さんのアドバイスのおかげで、今回も
完成させることができました。

/* 11rotate.c (2006/12/13) */
/* 06d4101 渡部景介 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MS 200
#define PI 3.14159265358979
void rotate(unsigned char *,int);
main()
{
char fi[50];
int i,j,t;
FILE *fp;
unsigned short header[13]={0x4d42,54490,1,0,0,26,0,12,0,MS,MS,1,24};
unsigned char *bmp;
bmp=(unsigned char *)malloc(MS*MS*3);
for(i=0;i<MS*MS;i++)
{
bmp[i*3+0]=0;
bmp[i*3+1]=0;
bmp[i*3+2]=0;
}
printf("Input rotate angle : ");
scanf("%s",fi);
t=atoi(fi);
for(i=40;i<=159;i++)
{
for(j=40;j<=159;j++)
{
bmp[(i*MS+j)*3+0]=0;
bmp[(i*MS+j)*3+1]=255;
bmp[(i*MS+j)*3+2]=255;
}
}
rotate(bmp,t);
printf("Input file name : ");
scanf("%s",fi);
if((fp=fopen(fi,"wb"))==NULL)
{
printf(stderr,"Error : file open[%s].\n",fi);
exit(1);
}
fwrite(header,2,13,fp);
fwrite(bmp,1,200*200*3,fp);
fclose(fp);
return 0;
}
void rotate(unsigned char *b,int t)
{
int i,j,x,y,x1,y1;
double th,si,co;
unsigned char *a;
a=(unsigned char *)malloc(MS*MS*3);
th=t*PI/180;
si=sin(th);
co=cos(th);
for(i=0;i<MS*MS;i++)
{
a[i*3+0]=0;
a[i*3+1]=0;
a[i*3+2]=0;
}
for(i=0;i<MS;i++)
{
y=i-MS/2;
for(j=0;j<MS;j++)
{
x=j-MS/2;
x1=x*co+y*si+MS/2+0.5;
y1=-x*si+y*co+MS/2+0.5;
if(0<x1 && x1<MS)
{
if(0<y1 && y1<MS)
{
a[(i*MS+j)*3+0]=b[(y1*MS+x1)*3+0];
a[(i*MS+j)*3+1]=b[(y1*MS+x1)*3+1];
a[(i*MS+j)*3+2]=b[(y1*MS+x1)*3+2];
}
}
}
}
for(i=0;i<MS*MS*3;i++)
{
b=a;
}
free(a);
return;
}

管理人

Re:毎度お世話になっています。今回は引数に関して。

#10

投稿記事 by 管理人 » 18年前

ご苦労様です。
Justyさん、ありがとうございます。

投稿するときソースは<pre>と</pre>で囲むと綺麗に字下げが表示されますよ。

<>は小文字で書いてください。

閉鎖

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