gcc aktualisieren

U

Ulrikop

Mitglied
Thread Starter
Dabei seit
30.08.2007
Beiträge
49
Reaktionspunkte
0
Hallo,
da beim Kompilieren eines c++-Programms der Kompilier komische Sachen macht und es keinen offensichtlichen Fehler gibt (habe den Code von mehr ansehen lassen, keiner fand was) habe ich mir gedacht, ich kann ja mal schauen, ob ich das aktuelle XCode drauf habe.

Siehe da, ich habe nur XCode 3.0 drauf (arbeite leider noch mit dem normalen Leopard).
Nach kurzem Suchen hab ich gesehen, dass 3.1.4 die neueste für Leopard ist.

Während des Installierens habe ich in der PDF gelesen, dass es nun gcc 4.2 hat. Nach kurzem schauen per gcc -v im terminal habe ich gesehen, dass ich noch 4.0.1 drauf hab. Hab schon gehofft, dass das Problem im Programm mit ner neuen gcc-version vielleicht weg ist.

hab dann auch Xcode 3.1.4 installieren, ohne ne Fehlermeldung und nen Neustart danach gemacht. Beim Überprüfen der Version über das Terminal dann die Enttäuschung. Bei gcc -v zeigt er mir immer noch 4.0.1 an.

Jetzt habe ich bei der Installationsdatei unter Packages noch mals nur gcc 4.2 installiert. Leider auch ohne Erfolg.

Nun wollte ich wissen, was ich falsch mache. Muss ich die Versionen zwischen 3.0 und 3.1.4 alle auch installieren - wenn ja, kann ich das noch machen, obwohl 3.1.4 schon erfolgreich installiert wurde?

Danke für eure Hilfe

lg
 
Du müsstest alle Symlinks umbiegen, die auf g++ gcc usw zeigen. Aber vorher poste mal hier den Code und die Fehlermeldung...
 
4.2 ist bei 10.6 der standard compiler.
bei 10.5 musst du den schon mit gcc-4.2 aufrufen.
aber lass dir sagen, mit neueren gcc versionen werden die fehler nicht weniger ;)
 
gcc ist so old-school :D

Ich glaub es liegt am Code. Ich kenne zwar schon einige Bugs im GCC aber ich wüsste nicht wie man das mit echtem Code erzeugen kann...
 
ich befürchte es auch, dass es am code liegt aber ist immer gut, nen schuldigen zu finden :)

dann mal zu meinem code: ist alles eigentlich sehr simpel, ist die startaufgabe in c++ (haben die letzten semester im studium nur java gemacht).
wir sollen einen Liste für z.B. ein Krankenhaus programmieren. die einzelnen Zellen sind miteinander verlinkt (also es ist irgend wo die startadresse gespeichert, in der 1. Zelle ist dann die Adresse der 2. Zelle usw.).
Die Patienten die man in die Liste eintragen kann, bekommen eine Priorität - höchste Priorität ist ganz vorne und wenn 2 gleiche Priorität haben, ist der, der als erstes gekommen ist vorne. Dann gibt es noch eine display-Funktion, mit der die einzelnen Leute in Richtiger Reihenfolge ausgegeben werden.

So das Problem liegt nun in dem Testprogramm, dass ich mir schnell selber zusammen geschraubt habe um zu sehen, ob es geht (sollte eigentlich ein Menü bauen, mit dem man dann alles interaktiv machen kann - aber ich sollte erstmal mein simples Testprogramm zum Laufen bekommen :) ).

Hier das Testprogramm:
Code:
int main()
{
	PrioQueue queue;

	queue.insert("Name 1", 3);
	queue.insert("Name 2", 6);
	queue.insert("Name 3", 4);

	queue.display();

	return 0;
}
Ok, das funktioniert wie gewollt, es wird die richtige Reihenfolge ausgegeben.
Nun habe ich ein weiteres .insert hinter dem letzten .insert gemacht, auf einmal gab display gar nichts mehr aus. Ok, dann hab ich halt hinter .insert mit "Name 3" auch ein display() gemacht - das dürfte ja dann klappen, weil bis zu dieser Stelle wurde das Programm ja bereits richtig ausgeführt. das 4. .insert kommt ja erst danach. Aber auch dieses Mal wird nichts ausgegeben.
Wenn ein weitere .insert dazu gebaut wird, geht es wieder. Deshalb probiere ich weiter und finde raus, bei ungerader .insert Zahl gehts, bei gerader nicht.
Nun habe ich mal an verschiedenen Stellen ein cout eingebaut, mit dem ich mir wichtige Variable angeben lasse, wie z.B. die Variable "number" - in dieser ist die Anzahl der Einträge gespeichert, die in der Liste aktuell sind.
So sah ich, dass alle inserts immer ausgeführt wurden. Aber mir ist auch was anderes aufgefallen: Ich habe mir im Konstruktor der PrioQueue die Anzahl der Einträge ausgeben lassen (dort wird "number" auf 0 gesetzt) und direkt nach dem Konstruktor (dazwischen ist keine Zuweisung, Befehl oder sonstiges.
Bei einem Programm bei dem 1, 2 oder 3 inserts vorkommen, geht alles, es wird 2x 0 ausgegeben. Bei 4 wird im Konstruktor noch 0 ausgegeben, direkt nach dem Konstruktor -1881143876
Bei 4 inserts ist nach dem Konstruktor in der Variable 9 (im Konstruktor wurde bei egal welcher Anzahl an inserts ich es ausprobiert habe das richtige angezeigt, 0). Hier ist die Angabe auch falsch, aber zumindest funktioniert die Ausgabe mit einer erhöhten number-Anzahl.

Das wirklich komische ist, dass zwischen Ausgabe im und außerhalb des Konstruktors rein GAR NICHTS ist und beide mal was anderes angezeigt wird. Das andere komische ist, dass es an der Anzahl der ".inserts" anscheinend abhängt, die ja auch erst nach den beiden Ausgaben, die bereits falsch sind, ausgeführt werden.


So nu hier noch der Code des Konstruktors mit Kontrollausgabe und noch mals das Testprogramm mit Kontrollausgabe:

Code:
class PrioQueue
{
private:
	/*erster Eintrag der PrioQueue*/
	POSITION first;

	/*Anzahl der Einträge*/
	int number;

	...

public:
	PrioQueue()
	{
		first = PSEUDO; //PSEUDO ist NULL
		int number = 0;
		cout << "Anzahl: " << number << endl; //gibt 0 aus
	}

	int getNumber() const
	{
		return number;
	}
...
}

int main()
{
	PrioQueue queue;
	cout << "Anzahl: " << queue.getNumber() << endl; //gibt -1881143876 aus

	queue.insert("Name 1", 3);
	queue.insert("Name 2", 6);
	queue.insert("Name 3", 4);
	queue.insert("Name 4", 1);

	queue.display();

	return 0;
}

wäre nett, wenn mir da irgend wer helfen könnte :)


4.2 ist bei 10.6 der standard compiler.
bei 10.5 musst du den schon mit gcc-4.2 aufrufen.
ja, irgend wann sollte ich auch auf 10.6 umsteigen nur drüber installieren will ich es net und auf alles neu machen hab ich im moment keine lust :)
 
Die Stelle, in der potentielle der Fehler enthalten ist (die insert-Methode), enthältst du uns vor ;)
 
hehe, da die ja nach der Ausgabe, die ich nicht nachvollziehen kann, erst kommt, dachte ich, sie wäre net so relevant.

hier der rest
Code:
typedef Cell* POSITION;

class PrioQueue
{
private:

	void insert(POSITION newCell)
	{
		if(first == PSEUDO)
			first = newCell;
		else
		{
			/*Der Fall, dass der Patient den first ablöst, wird extra behandelt*/
			if(newCell->getPriority() > first->getPriority())
			{
	
				newCell->setNext(first);
				first = newCell;
	
			}
			else
			{
				POSITION last = first;
				POSITION current = first->getNext();
				int counter = number - 1;	//ein Zähler als Abbruchsbedingung, damit nicht an letzter Position versucht wird, eine Methode von Null aufzurufen
	
				/*zum Suchen der Position, an die der neue Patient eingefügt werden muss*/
				while(( newCell->getPriority() <= current->getPriority() ) && ( counter > 0 ))
				{
					last = current;
					current = last->getNext();
					counter --;
				}
	
				newCell->setNext(current);
				last -> setNext(newCell);
			}
		}
		number++;
	}

public:
	//die Funktion gibt es an eine interne weiter, da es noch andere Inserts gibt, die aber so egal sind.
	void insert(NAME n, PRIORITY p)
	{
		insert(new BaseEl(n,p));
	}

}

Dazu gehören dann noch diese Klassen:
Code:
#define PSEUDO NULL

typedef int PRIORITY;
typedef string NAME;

class Cell
{
private:
	Cell* next;

public:
	Cell(Cell* p)
	{
		next  = p;
	}

	void setNext(Cell* p)
	{
		next = p;
	}

	Cell* getNext()
	{
		return next;
	}

	virtual PRIORITY getPriority() const
	{
	}
};

class BaseEl : public Cell
{
private:
	NAME name;
	PRIORITY priority;

public:
	BaseEl(NAME n, PRIORITY p) : Cell(PSEUDO)
	{
		name = n;
		priority = p;
	}

	BaseEl(NAME n, PRIORITY p, Cell* ptr) : Cell(ptr)
	{
		name = n;
		priority = p;
	}

	PRIORITY getPriority() const
	{
		return priority;
	}
};



so, hoffe nu ist das wichtigste alles da :)
 
Zuletzt bearbeitet:
Definition heißt "Insert", aufgerufen wird "insert"?!
 
  • Gefällt mir
Reaktionen: below
Definition heißt "Insert", aufgerufen wird "insert"?!
ja
im echten programm steht da schon Insert mit großem I

dass die Funktion Insert mit großen I heißt liegt daran, dass die Professorin es so vorgeschrieben hat und ich es einfach so abgetippt hat. Da wir aber damals in Java gelernt haben, dass wir Methoden mit nem Kleinbuchstaben anfangen sollen, wollte ich sie alle noch klein machen aber bei Insert hab ichs noch vergessen. Als ich es vorher hier rein kopiert habe, hab ich mich bissi dafür geschämt und Insert zu insert gemacht aber beim 2. mal vergessen :)
 
Du hast in PrioQueue eine Instanzvariable number und im Konstruktor eine lokale Variable number. Im Konstruktor setzt du nur die lokale Variable auf 0, die Instanzvariable bleibt uninitialisiert. Deshalb macht getNumber() nicht das richtige.
 
  • Gefällt mir
Reaktionen: below
age bin ich doof

das ist ja nu mehr wie peinlich. das komische, das ist keinem aufgefallen. net ma der professorin.

aber warum hat es bis 3 funktioniert? zufall?


auf jeden fall vielen vielen dank
 
Ich würde jetzt einfach mal auf Zufall tippen.
Sicher kann ich dir das jetzt auch nicht sagen.
So tief hab ich mich da grad nicht reingedacht^^
 
Zurück
Oben Unten