[C++] program sortujący listę Ver 2.0

diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę Ver 2.0

Post autor: diego_maradona »

Powracam ze swoim programem, tym razem zorientowałem go obiektowo ponieważ wersja strukturalna w tym wypadku to czysty masochizm :wink: . Przypominam, że program ma za zadanie posortować listę przyjętych studentów względem zdobytych punktów ( ostatni numer, za imieniem)

plik list.txt
Ukryta treść:    
Program wygląda tak:

plik person.h

Kod: Zaznacz cały

#ifndef person_H
#define person_H

#include "stdafx.h"
#include <string>

using namespace std;

class personType
{
public:	
	string getLastName() const;
	string getFirstName()const;
	
	void setLastName(string lName);
	void setFirstName(string fName);

	void extractLastName(ifstream& inData);
	void extractFirstName(ifstream& inData);
	
	personType(string fName = "UNKNOWN" , string lName = "UNKNOWN");
private:
	string firstName;
	string lastName;
};
#endif
person.cpp

Kod: Zaznacz cały

#include "stdafx.h"
#include <iostream>
#include <string>
#include "person.h"
#include <fstream>

using namespace std;

personType::personType(string fName , string lName)
{
	setFirstName(fName);
	setLastName(lName);
}

string personType::getLastName() const
{
	return lastName;
}

string personType::getFirstName() const
{
	return firstName;
}

void personType::setLastName(string lName)
{
	lastName = lName;
}

void personType::setFirstName(string fName)
{
	firstName = fName;
}

void personType::extractFirstName(ifstream& inData)
{
	inData>>firstName;
}

void personType::extractLastName(ifstream& inData)
{
	inData>>lastName;
}

Kod: Zaznacz cały

student.h

#ifndef student_H
#define student_H

#include "person.h"

class studentType : public personType 
{
public:
 int getAlphabeticalNum() const;
 int getID() const;
 int getPoints() const;
 void printAll() const;

 void setAlphabeticalNum( int aNum);
 void setID( int IDnum);
 void setPoints( int pts);

 void extractAlphabeticalNum(ifstream& inData);
 void extractID(ifstream& inData);
 void extractPoints(istream& inData);
 void extractAll(ifstream& inData);

 studentType(string fName= "UNKNOWN", string lName="UNKNOWN", int aNum = 0 , int IDnum = 0 , int pts = 0);


private:

  int alphabeticalNum;
  int ID;
  int points;

};

#endif
student.cpp

Kod: Zaznacz cały

#include "stdafx.h"
#include <string>
#include <iostream>
#include "student.h"
#include <fstream>

using namespace std;

int studentType::getAlphabeticalNum() const 
{
	return alphabeticalNum;
} 

int studentType::getID() const 
{
	return ID;
} 

int studentType::getPoints() const 
{
	return points;
}

void studentType::setAlphabeticalNum(int num)
{
	alphabeticalNum = num;
}

void studentType::setID( int IDnum)
{
	ID = IDnum;
}

void studentType::setPoints( int pts)
{
	points = pts;
}

studentType::studentType(string fName, string lName, int aNum , int IDnum , int pts) : personType(fName, lName)
{
	alphabeticalNum= aNum;
	ID = IDnum;
	points = pts;
}

void studentType::extractAlphabeticalNum(ifstream& inData)
{
	inData >> alphabeticalNum;
}


void studentType::extractID(ifstream& inData)
{
	inData >> ID;
}

void studentType::extractPoints(istream& inData)
{
	inData >> points;
}

void studentType::extractAll(ifstream& inData)
{
	extractAlphabeticalNum(inData);
	extractID(inData);
	personType::extractFirstName(inData);
	personType::extractLastName(inData);	
	extractPoints(inData);
}

void studentType::printAll() const
{
	cout<<getAlphabeticalNum()<<" "<<getID()<<" "<<personType::getFirstName()<<" "<<personType::getLastName()<<" "<<getPoints();
}
oraz gwóźdź programu- sorting_list.cpp

Kod: Zaznacz cały

// sorting_list.cpp : main project file.

#include "stdafx.h"
#include <string>
#include <iostream>
#include <fstream>
#include "student.h"


using namespace std;

const int NUMBER_OF_RECRUITS = 364; 

void readSortByPointsAndPrint(ifstream& inData);

int main()
{
	
	ifstream inFile;
	ofstream outFile;

	cout<<"Program sorts student's list from the alphabetical form to the score form \n";
	
	inFile.open("list.txt");

	readSortByPointsAndPrint(inFile);

	inFile.close();

	cout<<endl;
	system("PAUSE");
	return 0;
	

}

void readSortByPointsAndPrint(ifstream& inData)
{
	studentType recruit[NUMBER_OF_RECRUITS];
	int firstOutOfOrder,location;
	studentType temp;

	for (int i=0; i<NUMBER_OF_RECRUITS ; i++)	
	recruit[i].extractAll(inData);
		
	for(firstOutOfOrder=0; firstOutOfOrder<NUMBER_OF_RECRUITS ; firstOutOfOrder++)
	{
		if(recruit[firstOutOfOrder].getPoints() < recruit[firstOutOfOrder-1].getPoints())
			{
				temp=recruit[firstOutOfOrder];

				location = firstOutOfOrder;

			do
			{
				recruit[location] = recruit[location - 1];
				location--;
			}
			while (location > 0 && recruit[location - 1].getPoints() > temp.getPoints());

			recruit[location] = temp;
			}
	}
				
	for(int i =0; i<NUMBER_OF_RECRUITS ; i++)
	recruit[i].printAll();
	
}
Nie wyskakuje żaden błąd kompilacji, ale w czasie wykonywania programu pojawia się okienko z napisem
An unhandled exception of type 'System.AccessViolationException' occurred in sorting_list.exe

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
O co chodzi? Nie znalazłem żadnej tablicy wychodzącej poza przydzielony jej obszar.
Ostatnio zmieniony 10 wrz 2011, o 17:52 przez Anonymous, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
abc666

[C++] program sortujący listę Ver 2.0

Post autor: abc666 »

U mnie działa bez problemu, ale kodu mi się nie chce analizować. Odpal debuger i zobacz co tam nie działa.

btw. Nie możesz użyć stl'a? Wczytać to, wrzucić do jakiegoś kontenera i odpalić sort()? Program na <30 linijek.
Poza tym nie uważasz, że tworzenie funkcji w których masz

Kod: Zaznacz cały

inData >> ID;
jest przerostem formy nad treścią? Funkcja studentType::extractAll() i tak to wszystko wywołuje. Po prostu dodajesz niepotrzebny kod. Gdybyś miał inne źródło danych to w niczym by ci te funkcje nie pomogły. Tak czy siak musiałbyś wszystko pisać od nowa. Wystarczy normalnie to wczytać jednym inData. Wtedy gdybyś miał inne źródło danych wystarczy przeciążyć operator >> i masz gotowe.
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę Ver 2.0

Post autor: diego_maradona »

Te klasy pozostały mi po innych programach, nie chciało mi się kasować elementów które okazały się niepotrzebne akurat teraz.

Jakiego użyłeś kompilatora w którym ten program działa bez problemu?
abc666

[C++] program sortujący listę Ver 2.0

Post autor: abc666 »

gcc 4.5.2
Z kodu wyrzuciłem tylko wywołanie system() i stdafx.h
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę Ver 2.0

Post autor: diego_maradona »

Mi w visual studio debugerze otwiera się plik memory.asm i pokazuje na linię

Kod: Zaznacz cały

rep     movsd           ;N - move all of our dwords
oprócz tego wyświetla mi się
Ukryta treść:    
abc666

[C++] program sortujący listę Ver 2.0

Post autor: abc666 »

Google mówi żebyś spróbował visual studio odpalić z prawami administratora. Spróbuj i zobacz co się będzie działo.
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę Ver 2.0

Post autor: diego_maradona »

Bez zmian. Chyba będę musiał skontaktować się z pomocą techniczną MS, w końcu ma się oryginalnego windowsa
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

[C++] program sortujący listę Ver 2.0

Post autor: argv »

Pomijając oryginalny pomysł kontaktu z pomocą techniczną MS przyjrzyj się lepiej swojemu dziełu, bo już na pierwszy rzut oka widać, że :

Kod: Zaznacz cały

void readSortByPointsAndPrint(ifstream& inData){   // śmieci      for(firstOutOfOrder=0; firstOutOfOrder<NUMBER_OF_RECRUITS ; firstOutOfOrder++)   {   //   recruit[firstOutOfOrder-1] => recruit[-1] w pierwszym obrocie   if(recruit[firstOutOfOrder].getPoints() < recruit[firstOutOfOrder-1].getPoints()) 
Xitami

[C++] program sortujący listę Ver 2.0

Post autor: Xitami »

Kod: Zaznacz cały

char * st[1250];

int main(int argc, char ** argv){
	int n=0;
	if(argc!=1)
		return atoi(strrchr(*(char **)argc,32)+1)<atoi(strrchr(*argv,32)+1) ? 1 : -1;		
	while( gets(&st[1000]) ) 
		strcpy(st[n++]=malloc(strlen(&st[1000])+1), &st[1000]);
	qsort(st, n, sizeof(st[0]), main);
	for(argc=0; argc<n; argc++)	puts(st[argc]);
}
Ostatnio zmieniony 11 wrz 2011, o 08:06 przez Xitami, łącznie zmieniany 3 razy.
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę Ver 2.0

Post autor: diego_maradona »

argv-W tej pętli firstOutOfOrder powinno być 1 a nie 0. Gratuluję spostrzegawczości , już byłem pewien że to błąd kompilatora, chociaż parę razy wcześniej miałem podobne błędy i wszystkie były spowodowane wyjściem arraya poza zadeklarowaną pamięć. W ostatniej chwili odwiodłeś mnie od mojego szalonego pomysłu
ODPOWIEDZ