変な文字列がcygwinにてあらわされるのを何とかしたいです。

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

変な文字列がcygwinにてあらわされるのを何とかしたいです。

#1

投稿記事 by ええええ » 3週間前

#include <stdio.h>
#include <math.h>
#define place 35

typedef struct
{
int banngou;
double x,y;
char name[22];
int kosuu;
int tonari[9];
}mapdate;

mapdate yonezawa[35];

void read_data(char *filename)
{
{
FILE *fp;
int i,j;
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("ファイル作成失敗 \n");
}
for(i=0;i<35;i++)
{
fscanf(fp, "%d,%lf,%lf,%[^,],%d,\n",&yonezawa.banngou,&yonezawa.x,&yonezawa.y,yonezawa.name,yonezawa.kosuu,yonezawa.tonari);
for(j=0;j<yonezawa.kosuu;j++)
{
fscanf(fp,"%d",yonezawa.tonari[j]);
}
fclose(fp);
}
void main()
{
int i,j,k,banngou,banngou2;
int f=0;


read_data("map.dat");
printf("交差点の番号を入れて下さい.\n");
scanf("%d",&banngou2);

for(i=0;i<35;i++)
{
printf("%d,%lf,%lf,%s,%d,%d \n",yonezawa.banngou,yonezawa.x,yonezawa[i].y,yonezawa[i].name,yonezawa[i].kosuu,yonezawa[i].tonari);
f=1;
}
if(f==0) printf("交差点が見つかりません \n");
{
for(j=0;j<yonezawa[i].kosuu;j++)
{
printf("隣接する交差番号は%dです。\n",yonezawa[i].tonari[j]);
printf("隣接する交差名は%sです。\n",yonezawa[yonezawa[i].tonari[j]-1].name);
}
{
float A[2],B[2],d;
printf("打ち込んだ点と隣接間の距離を求める\n");
printf("打ち込んだ点のx座標:"); scanf("%lf",&A[0]);
printf("打ち込んだ点のy座標:"); scanf("%lf",&A[1]);
d=sqrt(pow(A[0]-B[0],2)+pow(A[1]-B[1],2));
printf("打ち込んだ点と隣接間の距離は%f\n",d);
}
}
}
}
}



まずもともとの問題として1.交差点番号を打ち込むと,隣接する交差点名と交差点番号および打ち込んだ交差点からの距離を表示させるプログラムを作成しなさい.という問題で外部からデータファイルmap.dat(1, 76.0, -233.0, 西米沢駅, 1, 2
2, 204.0, -249.0, 西部小学校, 5, 1, 3, 4, 17, 33
3, 177.0, -85.0, ニトリ, 3, 2, 4, 6
4, 281.0, -185.0, 木場町, 3, 2, 3, 5
5, 458.0, -158.0, 法泉寺, 3, 4, 6, 18
6, 439.0, -55.0, 徳町, 3, 3, 5, 7
7, 546.0, -64.0, 中央高校, 3, 6, 8, 9
8, 563.0, -16.0, 総合公園, 1, 7
9, 789.0, -110.0, 市役所, 3, 7, 10, 16
10, 1064.0, -174.0, 花沢郵便局, 2, 9, 11
11, 1129, -143, 花沢, 2, 10, 12
12, 1249, -457, ルートインホテル, 2, 11, 13
13, 1088, -463, 米沢駅, 3, 12, 14, 22
14, 836, -419, 大町, 3, 13, 15, 22
15, 727, -396, 大沼デパート, 4, 14, 16, 19, 21
16, 743, -317, 立町, 3, 9, 15, 17
17, 657, -294, 第一ホテル, 4, 2, 16, 18, 19
18, 675, -192, 西宮戎神社, 2, 5, 17
19, 640, -374, 興譲小学校, 3, 15, 17, 20
20, 628, -428, 門東町, 4, 19, 21, 26, 33
21, 715, -453, 花膳, 4, 15, 20, 22, 24
22, 860, -475, 相生町, 4, 13, 14, 21, 23
23, 922, -717, ホテル平成, 2, 22, 24
24, 670, -651, 南部小学校, 3, 21, 23, 25
25, 598, -643, エネオス, 3, 24, 26, 28
26, 613, -499, ファミリーマート, 3, 20, 25, 27
27, 540, -477, 上杉神社, 1, 26
28, 593, -712, 城南, 3, 25, 29, 34
29, 536, -701, 山大正門, 3, 28, 30, 31
30, 530, -742, 山形大学, 1, 29
31, 413, -672, 第二中学校, 2, 29, 32
32, 340, -636, ヤマザワ, 2, 31, 33
33, 220, -391, 直江町, 3, 2, 20, 32
34, 575, -807, 琴平神社, 2, 28, 35
35, 621, -853, 南米沢駅, 1, 34

交差番号点、x座標、Y座標、交差点名、隣接する交差点の数、隣接する交差点番号)を読み取り以上のようなものを解くのですが
以下のような文字列が出てしまいます。またそもそも答えを出すことができません。
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました

Math

Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。

#2

投稿記事 by Math » 3週間前

コード:

#include <stdio.h> 
#include <math.h> 
#define place 35 

typedef struct
{
	int banngou;
	double x, y;
	char name[22];
	int kosuu;
	int tonari[9];
}mapdate;

mapdate yonezawa[35];

void read_data(char* filename)
{
	{
		FILE* fp;
		int i, j;
		fp = fopen(filename, "r");
		if (fp == NULL)
		{
			printf("ファイル作成失敗 \n");
		}
		for (i = 0; i < 35; i++)
		{
			fscanf(fp, "%d,%lf,%lf,%[^,],%d,\n", &yonezawa.banngou, yonezawa.x, &yonezawa.y, yonezawa.name, yonezawa.kosuu, yonezawa.tonari);
			for (j = 0; j < yonezawa.kosuu; j++)
			{
				fscanf(fp, "%d", yonezawa.tonari[j]);
			}
			fclose(fp);
		}
		void main()
		{
			int i, j, k, banngou, banngou2;
			int f = 0;


			read_data("map.dat");
			printf("交差点の番号を入れて下さい.\n");
			scanf("%d", &banngou2);

			for (i = 0; i < 35; i++)
			{
				printf("%d,%lf,%lf,%s,%d,%d \n", yonezawa.banngou, yonezawa.x, yonezawa[i].y, yonezawa[i].name, yonezawa[i].kosuu, yonezawa[i].tonari);
				f = 1;
			}
			if (f == 0) printf("交差点が見つかりません \n");
			{
				for (j = 0; j < yonezawa[i].kosuu; j++)
				{
					printf("隣接する交差番号は%dです。\n", yonezawa[i].tonari[j]);
					printf("隣接する交差名は%sです。\n", yonezawa[yonezawa[i].tonari[j] - 1].name);
				}
				{
					float A[2], B[2], d;
					printf("打ち込んだ点と隣接間の距離を求める\n");
					printf("打ち込んだ点のx座標:"); scanf("%lf", &A[0]);
					printf("打ち込んだ点のy座標:"); scanf("%lf", &A[1]);
					d = sqrt(pow(A[0] - B[0], 2) + pow(A[1] - B[1], 2));
					printf("打ち込んだ点と隣接間の距離は%f\n", d);
				}
			}
		}
	}
}

mapdate yonezawa[35];

yonezawa は配列だろう?
よく見てごらん!

Math

Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。

#3

投稿記事 by Math » 3週間前

自動整形してみたけど

がおかしいじゃん。

まず 
Hello World!
を出せたのでしょうか?

Math

Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。

#4

投稿記事 by Math » 3週間前


以下のような文字列が出てしまいます。またそもそも答えを出すことができません。
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました
ーーーーー

文字列というより ”エラー” 表示ですよ。

そもそも WinMain@16 というのがおかしいよ。
main を使ってるから コンソール・アプリケーションのはずだからね。

まず Hello World!から確認してくださいね。

Math

Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。

#5

投稿記事 by Math » 3週間前

今日は忙しいので他のかたが教えてくださるでしょう。失礼。

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

Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。

#6

投稿記事 by みけCAT » 3週間前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

コピペミスなのか、main関数の定義がread_data関数の中に入ってしまっていますね。
これではエントリポイントとして認識されないでしょう。

また、C言語では関数のネストはGCC拡張であり、C++では使えないので、
なるべく使わないほうがいいと思います。

さらに、エントリポイントのmain関数の戻り値の型はvoidではなくintにするべきです。
voidだとC言語では処理系依存になり、C++の規格では認められません。

そして、int型のyonezawa[​i].kosuuやyonezawa[​i].tonari[j]をfscanf関数の書式%dに対応するところに渡しています。
%dにはint型へのポインタを渡すべきであり、これでは未定義動作になるでしょう。
(yonezawa[​i].tonariに対応する書式がありませんが、これは無駄になるだけで無害です)

その上、fp == NULLのときも、メッセージを出力するだけでそのまま処理を続けてしまっていますね。
これはアクセス違反の原因になるでしょう。

ループ中、まだデータを読みたいはずのタイミングでfcloseを呼んでいるのもおかしいですね。

C99以降であればprintf関数で%lfを使ってもいいはずですが、なぜか手元の環境ではうまく動きませんでした。
%fのほうがいいでしょう。

printfの書式%dに(配列から変換された)ポインタを渡している部分があり、未定義動作になります。

確実にf=1にする処理の後にf == 0の判定があるのもおかしいですね。

ループの後、i=35でyonezawa[​i]にアクセスし、範囲外なので未定義動作になりますね。

float型のA[0]やA[1]にscanfの書式%lfでデータを読み込む処理、
未初期化の自動変数(値は不定)B[0]やB[1]を計算に使う処理もあり、いずれも未定義動作になります。

これらの点などを修正したコードを以下に示します。

コード:

#include <stdio.h>
#include <math.h>
#define place 35

typedef struct
{
	int banngou;
	double	x,y;
	char name[22];
	int	kosuu;
	int	tonari[9];
}mapdate; 

mapdate yonezawa[35];

void read_data(const char *filename)
{
	{ /* このブロックは意図がわからないが、無害なので残す */
		FILE *fp;
		int i,j;
		fp = fopen(filename, "r");
		if (fp == NULL)
		{
			printf("ファイル作成失敗 \n");
			return;
		}
		for(i=0;i<35;i++)
		{
			fscanf(fp, "%d,%lf,%lf,%[^,],%d",&yonezawa[i].banngou,&yonezawa[i].x,&yonezawa[i].y,yonezawa[i].name,&yonezawa[i].kosuu);
			for(j=0;j<yonezawa[i].kosuu;j++)
			{
				fscanf(fp,",%d",&yonezawa[i].tonari[j]);
			}
		}
		fclose(fp);
	}
}
int main(void)
{
	int i,j,k,banngou,banngou2;
	int f=0;


	read_data("map.dat");
	printf("交差点の番号を入れて下さい.\n");
	scanf("%d",&banngou2);

	for(i=0;i<35;i++)
	{
		printf("%d,%f,%f,%s,%d",yonezawa[i].banngou,yonezawa[i].x,yonezawa[i].y,yonezawa[i].name,yonezawa[i].kosuu);
		for(j=0;j<yonezawa[i].kosuu;j++)
		{
			printf(",%d",yonezawa[i].tonari[j]);
		}
		printf("\n");
		if (banngou2 == yonezawa[i].banngou){
			k=i; /* kが宣言されているのに使われていないようなので、利用する */
			f=1;
		}
	}
	if(f==0) printf("交差点が見つかりません \n");
	else /* 交差点が見つかった場合のみ次の処理に進む */
	{
		i=k; /* 保存しておいた、番号が一致した添字を復帰する */
		for(j=0;j<yonezawa[i].kosuu;j++)
		{
			printf("隣接する交差番号は%dです。\n",yonezawa[i].tonari[j]);
			printf("隣接する交差名は%sです。\n",yonezawa[yonezawa[i].tonari[j]-1].name);
			float A[2],B[2],d;
			printf("打ち込んだ点と隣接間の距離を求める\n");
			printf("打ち込んだ点のx座標:"); scanf("%f",&A[0]);
			printf("打ち込んだ点のy座標:"); scanf("%f",&A[1]);
			B[0]=yonezawa[yonezawa[i].tonari[j]-1].x;
			B[1]=yonezawa[yonezawa[i].tonari[j]-1].y;
			d=sqrt(pow(A[0]-B[0],2)+pow(A[1]-B[1],2));
			printf("打ち込んだ点と隣接間の距離は%f\n",d);
		}
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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