クイックソート反映されない、というかエラーでる(; ;)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
もこ
記事: 5
登録日時: 1年前

クイックソート反映されない、というかエラーでる(; ;)

#1

投稿記事 by もこ » 1年前

全てmain()関数の中で
STLデータの座標をファイルから読み取り、
x,y,zの昇順で並び替える、、
というところまで来たのですがエラーが出ました。
読み取って出力することはできたのですが、クイックソートを入れたら途端にエラーが出るようになりました。

エラーがなぜ出るか分かりません!
ご教授下さい!

コード:

#include <iostream>
#include<string>
#include<fstream>

using namespace std;

int main()
{
	double** prepoint;

	ifstream fin(" ");//ふぁいるのありか
	if (!fin) {
		printf("don't open file.");
	}

	string tmp;
	int i =0;

	getline(fin, tmp);

	while (1) {

		fin >> tmp;

		if (tmp.compare("vertex")==0) {

			prepoint = new double* [i+1];
			prepoint[i] = new double[3];

			for (int j = 0; j < 3; j++) {
				fin >> prepoint[i][j];

				cout << prepoint[i][j] << endl;
			}
			//cout << i << '\t' << prepoint[i][0] << '\t' << prepoint[i][1] << '\t' << prepoint[i][2] << endl;

			i++;
		}

		else if(tmp.substr(0, 8) == "endsolid") {//8文字列がendsolidなら
			break;
		}

	}
	
	
	/*
	while (1)
	{
		int n = 0;

		for (int l = 0; l < i; l++) {
			if (prepoint[l][0] > prepoint[l + 1][0]) {
				double tmp;

				tmp = prepoint[l][0];
				prepoint[l][0] = prepoint[l + 1][0];
				prepoint[l + 1][0] = tmp;

				n++;
			}
			else if (prepoint[l][0] == prepoint[l + 1][0]) {
				if (prepoint[l][1] > prepoint[l + 1][1]) {
					double tmp;

					tmp = prepoint[l][1];
					prepoint[l][1] = prepoint[l + 1][1];
					prepoint[l + 1][1] = tmp;

					n++;
				}
				else if (prepoint[l][1] == prepoint[l + 1][1]) {
					if (prepoint[l][2] > prepoint[l + 1][2]) {
						double tmp;

						tmp = prepoint[l][2];
						prepoint[l][2] = prepoint[l + 1][2];
						prepoint[l + 1][2] = tmp;

						n++;
					}
				}
			}
			if (n == 0)
				break;
		}
	}
	*/
}

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

Re: クイックソート反映されない、というかエラーでる(; ;)

#2

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

どうしても自前でクイックソート(またはその他のソート)を実装したいですか?
標準ライブラリのstd::sortqsortを利用するのではダメですか?

また、ループ内で毎回

コード:

prepoint = new double* [i+1];
をしてしまうと、前回確保してprepointに代入したバッファへの参照が失われ(メモリリーク)、
さらにこれまで読み込んだデータも参照できなくなります。
std::vectorを使った方がいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)


もこ
記事: 5
登録日時: 1年前

Re: クイックソート反映されない、というかエラーでる(; ;)

#4

投稿記事 by もこ » 1年前

うううう....
最後に編集したユーザー もこ on 2022年7月25日(月) 22:33 [ 編集 1 回目 ]

もこ
記事: 5
登録日時: 1年前

Re: クイックソート反映されない、というかエラーでる(; ;)

#5

投稿記事 by もこ » 1年前

エラーは出なくなりましたが、ソートが反映されません( ノД`)シクシク…
なぜでしょうか?

コード:

#include <iostream>
#include<string>
#include<fstream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main()
{

	vector<vector<double>> point;

	ifstream fin(" .STL");//ふぁいるのありか
	if (!fin) {
		printf("don't open file.");
	}

	string tmp;
	int i =0;

	getline(fin, tmp);
	

	while (1) {

		fin >> tmp;

		if (tmp.compare("vertex")==0) {

			point.resize(i + 1);
			for (int j = 0; j < 3; j++) {
				point[i].push_back(10 * i + j);
				fin >> point[i][j];
			}
			cout << i << '\t' << point[i][0] << '\t' << point[i][1] << '\t' << point[i][2] << endl;

			i++;
		}

		else if(tmp.substr(0, 8) == "endsolid") {//8文字列がendsolidなら
			break;
		}

	}
	
	sort(point.begin(), point.end());

	for (int ii = 0; ii < i; ii++) {
		cout << i << '\t' << point[ii][0] << '\t' << point[ii][1] << '\t' << point[ii][2] << endl;
	}
}

もこ
記事: 5
登録日時: 1年前

Re: クイックソート反映されない、というかエラーでる(; ;)

#6

投稿記事 by もこ » 1年前

あ、
反映されてました!2回出力してましたね、アセアセ
nanndemonaidesu☆

コード:

#include <iostream>
#include<string>
#include<fstream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main()
{

	vector<vector<double>> point;

	ifstream fin("C:\\Users\\CGS03\\Documents\\森田\\Part3.STL");//ふぁいるのありか
	if (!fin) {
		printf("don't open file.");
	}

	string tmp;
	int i =0;

	getline(fin, tmp);
	

	while (1) {

		fin >> tmp;

		if (tmp.compare("vertex")==0) {

			point.resize(i + 1);
			for (int j = 0; j < 3; j++) {
				point[i].push_back(10 * i + j);
				fin >> point[i][j];
			}
			i++;
		}

		else if(tmp.substr(0, 8) == "endsolid") {//8文字列がendsolidなら
			break;
		}

	}
	
	sort(point.begin(), point.end());

	for (int ii = 0; ii < i; ii++) {
		cout << ii << '\t' << point[ii][0] << '\t' << point[ii][1] << '\t' << point[ii][2] << endl;
	}
}

返信

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