Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Ubuntu-Forum & Kubuntu-Forum | www.Ubuntu-Forum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

  • »Googlefauli« ist der Autor dieses Themas

Beiträge: 32

Registrierungsdatum: 23.04.2008

Derivat: Kubuntu

Architektur: 32-Bit PC

  • Nachricht senden

1

27.04.2008, 15:27

gcc spinnt

Also ich weiß das ich bereits ein anderes Forum hier eröffnet habe in den es um meine Käferchen geht jedoch kann ich mir den wirklich gar nicht erklären. Er kann eigentlich gar nicht sein. Ist das ein fehler im gcc?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
struct card* mix (struct card* stack)
{
	struct card * help[3];
	int h[2], i, j;
	srand(time(NULL));
	h[1]=rand()%10+5;
	h[2]=rand()%10+25;
	help[1]=stack;
	for(i=1; i<h[1]; i++) help[1]=help[1]->next;
	help[2]=help[1]->next;
	help[3]=help[1]->next;
	printf("h[2]=%d\n", h[2]);                                                                    //---------------------------------------------------------------- hier läuft das Programm noch(wird noch ausgegeben)
	printf(".");                                                                                             //---------------------------------------------------------------- vor dieser zeile hängt es sich in eine endlosschleife (wird nicht mehr ausgegeben)
	for(i=1; i<h[2]; i++) help[2]=help[2]->next;
	help[1]->next=help[2]->next;
	help[2]->next=NULL;
	printf(".");
	for(j=1;j<11;j++)
	{
		h[1]=rand()%3+5;				/*start of mix*/
		printf(".");
		while((h[2]-h[1])>=0)	
		{
			help[1]=help[3];
			for(i=1;i<h[1];i++) help[1]=help[1]->next;
			help[2]=help[1]->next;
			help[1]->next=stack;
			stack=help[3];
			help[3]=help[2];
			help[2]=help[2];
			h[1]=rand()%3+5;
		}
		while (help[2]->next!=NULL) help[2]=help[2]->next;
		help[2]->next=stack;
		stack=help[3];
	}
	printf("stack output: %i\n", stack->next->next->next->next->next->next->next->next->next->next->next->next->next->next->value);
	return stack;
}


wie kann ein printf("."); eine endlosschleife auslösen? geht das überhaupt

Dunkelangst

unregistriert

2

27.04.2008, 15:43

Ich hab auch mal C programmiert, jedoch ist das bei mir schon Jahre her so das ich aus der Materie völlig draußen bin.

Auf Grund der Tatsache, dass dies hier jedoch ein Forum für Ubuntu, also ein absolutes Linux-Einsteiger Forum ist, glaube ich, dass du in einem speziellem C/C++ Forum evtl. besser aufgehoben bist.

Zitat

wie kann ein printf("."); eine endlosschleife auslösen? geht das überhaupt?
Wenn ich mich richtig erinnere, wird printf gerne für die Umwandlung einer Zahl in einen String verwendet. Die Funktion print f (print formatted) wird in C vor allem dazu verwendet, formatierte Ausgaben zu erzeugen. Mir ist also auch unklar, in wie fern hier eine Endlosschleife entstehen kann... :(

Frage:

Wenn du sicher gehen möchtest, dass das Problem beim GCC liegt, dann nimm Dir doch mal ein kleines, recht aufwendiges Programm, bei dem Du Dir sicher sein kannst, dass in dem definitiv kein Fehler enthalten ist. Wenn du das dann kompilierst und GCC gibt Fehlermeldungen aus, dann weißt du immerhin, dass das Problem nicht bei Dir ist. Was denkst du?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dunkelangst« (27.04.2008, 15:43)


  • »maettu« ist männlich

Beiträge: 3 299

Registrierungsdatum: 14.09.2005

Derivat: Xubuntu

Architektur: 64-Bit PC

Desktop: XFCE

  • Nachricht senden

3

27.04.2008, 17:44

ähm Googlefauli du kennst dich mit Pointer-Aritmethik aus? Wenn nicht sofort nachschauen...
noch so zu gewissen Konzeptfragen schau dir mal den Unterschied zwischen "Pass by Value" und "Pass by Reference" an: http://de.wikipedia.org/wiki/Parameter%C3%BCbergabe
Was willst du eigentlich prinzipiell mischen? (Ein Kartenspiel? oder was? Etwas das abzählbar gleich gross bleibt?)
Wenn ja wieso brauchst du dann nicht simpel ein Array?

Zitat

for(i=1; i<h[1]; i++) help[1]=help[1]->next;
was soll das, du gehst einfach mal zufällig ein paar Schritte im Stack weiter??? Weiss nicht aber wenn du so zufällig ein bisschen im Speicher herumirrst kann es wohl passieren, dass es Endlosschleifen gibt....

  • »Googlefauli« ist der Autor dieses Themas

Beiträge: 32

Registrierungsdatum: 23.04.2008

Derivat: Kubuntu

Architektur: 32-Bit PC

  • Nachricht senden

4

27.04.2008, 18:37

Als ich mit den Programm angefangen habe dachte ich das es die weitaus weniger aufwendige Variante ist einen "echten" Stapel zu machen als ein Array. Die Bibliothek "stack.h" (die oben abgebildet ist) soll (wenn sie fertig ist) Spielkarten simolieren. Die funktion mix mischt den Stapel. Das nicht einfach via rand() sondern mit den gleichen pseudozufall mit den Karten via Hand gemischt werden. Also ein paar Karten aus der Mitte nehmen und in kleinen Stößen oben hinauf geben.

Ich gebe den ganzen Code in den Anhang damit ihr euch ein besseres Bild machen könnt.

  • »maettu« ist männlich

Beiträge: 3 299

Registrierungsdatum: 14.09.2005

Derivat: Xubuntu

Architektur: 64-Bit PC

Desktop: XFCE

  • Nachricht senden

5

27.04.2008, 20:10

hast du dir schon mal überlegt, ob du eine gleich gute Zufallsverteilung hast, wenn du 3 mal ne Zufallszahl generierst via rand() und diese Addierst/Subtrahierst oder so, verglichen mit einer Zufahlszahl von rand() einmal aufgerufen??? Was verstehst du unter Zufall???
Du könntest die ganze Geschichte mit schönen Klassen machen sogar mit Interfaces....
Für jede Farbe definierst du dir ein Array mit 13 Elementen oder so, diese Mischt du dann indem du aus deinen Arrays Zufällig ein Element auswählst und entfernst und in dein Stapel-Array schreibst.
Ich würde dir empfehlen mit etwas einfacherem Anzufangen, als ein Kartenspiel denn eine gute Strategie zu programmieren ist schwierig, hab selbst mal fürs Studium eine Reversi-Strategie programmiert und muss sagen ist nicht einfach....

  • »hannenz« ist männlich

Beiträge: 9

Registrierungsdatum: 23.04.2008

Derivat: Ubuntu

Architektur: 32-Bit PC

  • Nachricht senden

6

28.04.2008, 11:48

zu deiner eigentlichen Frage:
du deklarierst das int array h als h[2], also mit 2 Elementen (0 und 1). In deinem printf() jedoch nimmst du Bezug auf h[2], welches das DRITTE (nicht vorhandene, da von 0 ab gezählt wird, also 0, 1, 2) Element in h[] referenziert. Ich denke dass da der Fehler liegt.
und übrigens: nicht böse gemeint. aber, bevor du anfängst wild mit Zeigern und verketteten Listen um dich zu werfen, solltest du vllt. doch erst mal so die ganz grundlegenden Basics von C erlenrnen. Fang mal mit was einfacherem an und arbeite dich dann zu deinem Kartenspiel vor. (abgesehen davon ist das, was du vorhast zum Mischen des Kartenspiels wirklich mit Kanonen auf Spatzen geschossen, ein einfaches Array tuts da locker, da brauchst du keine Zeiger und den ganzen Kram... erhöht nur die Fehleranfälligkeit)

ein ganz einfaches Mischen, so als Anregung, könnte man z. Bsp. so implementieren:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define MISCHVORGAENGE 999
#define KARTEN 52
struct card stapel[KARTEN];

void swap(int a, int b){
	struct card aux;
	memcpy(aux, &stapel[a], sizeof(struct card));
	memcpy(&stapel[a], &stabel[b], sizeof(struct card));
	memcpy(&stapel[b], aux, sizeof(struct card));
}

void shuffle(){
	int i, a, b;

	for (i = 0; i < MISCHVORGAENGE; i++){
    	a = rand() % KARTEN;
        b = rand() % KARTEN;
       swap(a, b);
	}
}

da kommt kein einziger Zeiger drin vor...

EDIT: Ach und noch was: überdenke mal deinen Threadtitel ("gcc spinnt"): Es ist also mal wirklich so was von unwahrscheinlich, dass gcc für einen Fehler verantwortlich ist, ich finde das zeugt von einer gewissen Unfähigkeit, Fehler mal bei sich selbst zusuchen, und immer gleich die Software die man benutzt zu verdächtigen, sie sei verbuggt. Gerade bei einer Software wie gcc, die von wirklich vielen Leuten mit mächtig viel Ahnung vom Programmieren erstellt und gepflegt wird - ich finde das irgendwie dreist. Wie gesagt: Eigne dir erst mal die Programmier-Basics an bevor du solche Aussagen in den Raum wirfst.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »hannenz« (28.04.2008, 11:48)