環境が変わると動きません

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

環境が変わると動きません

#1

投稿記事 by io » 16年前

現在学校でC言語勉強中です。
エディタ→TeraPad コンパイラ→MinGW日本語版 の自分のパソコンでプログラムを作成し実行すると上手く行くのですが、同じソースを学校のパソコン(Visual C++6.0)で実行しようとするとエラーが出て上手く実行できません。(OSは双方共にwindows XP)

ちなみに以下のような内容のプログラムです。

データファイルを読み込み、値段ごと(100万未満、100万以上200万未満、200万以上)に分け値段順に表示する。

作ってみたソース↓↓↓
#include<stdio.h>
#include<stdlib.h>

typedef struct{
	char name[20];	
	int price;	
	int year;
	int number;
	int dt1;
	float dt2;
}CAR_DATA;	


void sort(CAR_DATA data[/url], int n){	//昇順に並べ替え

	int i, j;
	CAR_DATA temp;

	for(i=0; i<n-1; i++){
		for(j=i+1; j<n; j++){	
			if(data.price > data[j].price){
				temp = data;
				data = data[j];
				data[j] = temp;
			}
		}
	}

	for(i=0; i<n; i++)
		printf("%-15s%10d\n",data.name, data.price);

}


int main(void){

	FILE *fp;
	char str[256];	
	CAR_DATA data[100];
	CAR_DATA data1[30], data2[30], data3[30];
	int i = 0, n;
	int count1 = 0, count2 = 0, count3 = 0;

	fp = fopen("car.asc","r");
	if( fp == NULL ){
		puts( "ファイルが開けません" );
		exit(1);
	}

	while((fgets(str,256,fp)) != NULL){	// データ終端までの文字列を読み込む

		// 文字列・各数値データを読み込む
		sscanf(str, "%s	%d	%d	%d	%d	%f", &data.name, &data.price, &data.year, &data.number, &data.d1, &data[i].d2);
		i++;
	}

	n = i;	// n:データ数

	for(i=0; i<n; i++){	// 読み込んだデータをそれぞれの値段閾に分ける
		if(data[i].price < 1000000){	
			data1[count1] = data[i];
			count1++;	
		}else if((data[i].price >= 1000000) && (data[i].price < 2000000)){
			data2[count2] = data[i];
			count2++;	
		}else{
			data3[count3] = data[i];
			count3++;	
		}
	}
	
	printf("100万未満\n");
	printf("--------------------------------------------\n");
	sort(data1, count1);
	printf("\n100以上200万未満\n");
	printf("--------------------------------------------\n");
	sort(data2, count2);
	printf("\n200万以上\n");
	printf("--------------------------------------------\n");
	sort(data3, count3);
	
	fclose(fp);

	return 0;

}


VCの方でもコンパイルエラーは出ません。
ただ、実行すると"runtime error"(?)のような表示が出て上手く行きません。

上でも申しました通り、自分のパソコンでは問題なく実行できたので何がいけないのか分かりません。
どなたか分かる方がいらっしゃいましたら教えてくださいませ。
よろしくお願いします!!

Justy

Re:環境が変わると動きません

#2

投稿記事 by Justy » 16年前


>実行すると"runtime error"(?)のような表示が出て上手く行きません

 「のような」とありますが、他に何もメッセージは出ないのですか?


 先読みして推測するに、何となく R6002のエラーの臭いがします。
 試しに double t = 0; の一文をどこかに入れてみてください。
 R6002のエラーならこれで直るはずです。

box

Re:環境が変わると動きません

#3

投稿記事 by box » 16年前

> エディタ→TeraPad コンパイラ→MinGW日本語版 の自分のパソコンでプログラムを作成し実行すると上手く行く

本当ですか?
提示のソースをそのままコピー&ペーストしてコンパイルしたところ、

> 	int dt1;
> 	float dt2;


> 		sscanf(str, "%s	%d	%d	%d	%d	%f", &data.name, &data.price, &data.year, &data.number, &data.d1, &data.d2);


メンバー名の食い違い(定義はdt1, dt2、読込んでいるのはd1, d2)により
エラーが出ました。
ご自身の環境で正しく動いているというソースを
そっくりそのまま見せていただけますか?

toyo

Re:環境が変わると動きません

#4

投稿記事 by toyo » 16年前

確認してみました
boxさんの指摘部分を修正してVC++6.0で実行しましたが確かにruntime error出ます
VC++2005ExpressEditionでは
Debug Error!
R6002
- floating point support not loaded
のダイアログが出ました
VC++2008ExpressEditionではエラー無く実行できました

Justyさんの読み通りのようです

(VC++6.0でエラーの詳細が出なかったのはVistaだからでしょうか)

io

Re:環境が変わると動きません

#5

投稿記事 by io » 16年前

>boxさん
すいません。色々いじっている最中だったので…
動かしてみたソースは以下です↓↓↓
#include<stdio.h>
#include<stdlib.h>

typedef struct{
	char name[20];	/* 車名 */
	int price;	/* 値段 */
	int a;
	int b;
	int c;
	float d;
}CAR_DATA;	/* 構造体変数CARD_DATAを定義 */


void sort(CAR_DATA data[/url], int n){	/* 並べ替えを行う関数 */

	int i, j;
	CAR_DATA temp;

	for(i=0; i<n-1; i++){
		for(j=i+1; j<n; j++){
			if(data.price > data[j].price){
				temp = data;
				data = data[j];
				data[j] = temp;
			}
		}
	}

	for(i=0; i<n; i++)
		printf("%-15s%10d\n",data.name, data.price);

}


int main(void){

	FILE *fp;
	char str[256];	
	CAR_DATA data[100];
	CAR_DATA data1[30], data2[30], data3[30];
	int i = 0, n;
	int count1 = 0, count2 = 0, count3 = 0;

	fp = fopen("car.asc","r");	/* car.ascを開く */
	if( fp == NULL ){
		puts( "car.ascが開けません" );
		exit(1);
	}

	while((fgets(str,256,fp)) != NULL){	/* データ終端までの文字列を読み込む */

		/* 文字列をnameに、各数値データをprice,a,b,c,dにそれぞれ読み込む */
		sscanf(str, "%s	%d	%d	%d	%d	%f", &data.name, &data.price, &data.a, &data.b, &data.c, &data[i].d);
		i++;
	}

	n = i;

	for(i=0; i<n; i++){	/* 読み込んだデータをそれぞれの値段閾に分ける */
		if(data[i].price < 1000000){	
			data1[count1] = data[i];
			count1++;	/* 100万未満のデータ数 */
		}else if((data[i].price >= 1000000) && (data[i].price < 2000000)){
			data2[count2] = data[i];
			count2++;	/* 100万以上200万未満のデータ数 */
		}else{
			data3[count3] = data[i];
			count3++;	/* 200万以上のデータ数 */
		}
	}
	
	printf("100万未満\n");
	printf("--------------------------------------------\n");
	sort(data1, count1);
	printf("\n100以上200万未満\n");
	printf("--------------------------------------------\n");
	sort(data2, count2);
	printf("\n200万以上\n");
	printf("--------------------------------------------\n");
	sort(data3, count3);
	
	fclose(fp);

	return 0;

}


>Justyさん、toyoさん

エラー内容はtoyoさんのおっしゃっている通りで、まず

Debug Error!
Program:C:\work\ex3.exe
runtime error

と表示され中止・再試行・無視を選ぶようになっていました。
(無視を選ぶとtoyoさんが書かれている通りのと同じ内容が出てきました)

Justyさんのご指摘通り、double t=0; という記述を入れたら正常に動作しました!!
ありがとうございます!!!

えと、ちなみにR6002というのは何なのでしょうか?
なぜ↑↑↑のような記述を入れると動くようになったのでしょうか??

御津凪

Re:環境が変わると動きません

#6

投稿記事 by 御津凪 » 16年前

> Debug Error!
> R6002
> - floating point support not loaded

エラーメッセージをわかりやすく訳すと、「必要な浮動小数点ライブラリがリンクされていません」です。
(「VC++ R6002」でググると出てきます)

これはそのままの意味で、おそらくプログラム上では浮動小数点をいじる処理がまったくないためにリンクされなかったのだと思います。
double t=0; を入れることで、浮動小数点ライブラリがリンクされるようになったということでしょう。

初級者

Re:環境が変わると動きません

#7

投稿記事 by 初級者 » 16年前

double t=0;
を書くとエラーが出なくなった、というのは
解決法として真っ当なのでしょうか?

Justy

Re:環境が変わると動きません

#8

投稿記事 by Justy » 16年前


>Justyさんのご指摘通り、double t=0; という記述を入れたら正常に動作しました!!

 なるほど、やはりそれでしたか。
 一応解決しているようですが、こちらには目を通しておいてください。
 
C ランタイム エラー R6002 (C++)
ttp://msdn.microsoft.com/ja-jp/library/k1x26e0x(VS.80).aspx

Microsoft サポート オンライン
ttp://support.microsoft.com/kb/37507/ja
ttp://support.microsoft.com/kb/37507/en-us

io

Re:環境が変わると動きません

#9

投稿記事 by io » 16年前

>御津凪さん、Justyさん

sscanfのとこで%fという書式指定をしているのに、プログラム中で浮動小数点をいじる式がなかったのがいけなかったんですね。
Justyさんが教えてくださったHPも見てみました!!
色々教えてくださって、どうもありがとうございました!!

閉鎖

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