
Ich weiß zwar nicht, ob proggen.org das richtige Forum für meine Frage ist, da ich das Gefühl habe, dass hier Themen diskutiert werden, die über das einfache Verständnis für die Programmiersprache hinausgehen, aber sei es drum. Ich wende mich an euch, weil ich dieses Mal (im Vergleich zum letzten Mal) eine echt konkrete Frage habe. Und die lautet so:
Wie kann es sein, dass mein Programm abstürzt? Mein Verdacht: Ich mache etwas falsch, bei der Übergabe eines Arrays (per Referenz) an eine Funktion. Eine andere Vermutung: Ich schreibe irgendwo über Array-Grenzen hinweg. Wenn beides nicht der Grund sein sollte und jemand den tatsächlichen Grund weiß, möge er es mir bitte mitteilen oder zumindest einen Hinweis darauf geben. Andernfalls möge er selbiges tun und mir den Fehler aufzeigen. Es ist natürlich völlig in Ordnung, wenn jemand nicht weiterlesen möchte oder diesen Beitrag lieber völlig ignoriert.
Es ist doch richtig, dass ich Arrays deklariere, indem ich schreibe:
Code: Alles auswählen
int array[x];
Code: Alles auswählen
void tu_was( a[] );
Code: Alles auswählen
a[0];
Code: Alles auswählen
repeat for every game started {
initialize_board();
ask_for_number_of_players();
repeat for every castle and knight {
repeat for every player {
show_board();
set_castle();
show_board();
set_knight();
}
}
repeat twice {
repeat for every player {
show_board();
set_npc();
}
}
repeat for ever player {
player_draws_three_cards();
}
repeat for ever player every round until first player reaches maximum score {
show_board();
show_hand();
sell_or_use_card();
draw_or_buy_card();
proof_ownership_of_domains();
proof_score();
}
show_board();
show_winner();
show_scores();
ask_for_new_game();
}
Es kann gut sein, dass der ein oder andere noch weitere Bemerkungen zum Quelltext hat; dem stehe ich offen gegenüber.
Code: Alles auswählen
/* main.c */
/* Includes */
#include <stdio.h>
/* Functions */
void show_board( short f_n[], short o[], char t[][2] );
void set_castles( short nop, short ttp, short own[] );
int main( void ) {
short i, j;
char num_of_players;
char play_again = 'y';
short field_number[144];
short owner[144];
char type[144][2];
while( play_again == 'y' || play_again == 'Y' ) {
for( i = 143; i >= 0; i-- ) { field_number[i] = i + 1; } // Initialisierung der Feldnummern
for( i = 143; i >= 0; i-- ) {
owner[i] = 0; // Initialisierung mit Null
type[i][0] = ' '; // Initialisierung mit Leerzeichen
type[i][1] = ' '; // Initialisierung mit Leerzeichen
}
do {
do {
printf( "How many players are going to join?\n" );
scanf( "%d", &num_of_players );
} while ( getchar() != '\n' );
} while ( !( num_of_players == 2 || num_of_players == 3 || num_of_players == 4 )); // Die Abfrage innerhalb der Schleife erscheint so oft, bis eine Spielerzahl zwischen 2 u. 4 genannt wurde.
for( i = 4; i > 0; i-- ) {
for( j = num_of_players; j > 0; j-- ) {
show_board( field_number, owner, type ); // Routine zur Spielvorbereitung - Darstellung des Spielfelds
set_castles( j, i, owner ); // Routine zur Spielvorbereitung - Platzieren einer Burg
//show_board();
//set_knights();
}
}
show_board( field_number, owner, type ); // Routine zur Spielvorbereitung - Darstellung des Spielfelds
printf( "Want to play again?\n" );
do { scanf( "%1c", &play_again ); }
while ( getchar() != '\n' ); // Schleife wiederholt sich, bis der Spieler einen anderen Buchstaben als "y" eingibt, damit das Spiel beliebig oft wiederholt werden kann.
}
return 0;
}
void show_board( short f_n[], short o[], char t[][2] ) {
short i, j, k, l, x, y, z;
printf( "\n y\\x" );
for( j = 12; j > 0; j-- ) {
printf( " %2d", j ); // Erste Zeile des Spielfeldes
}
printf( "\n -" );
for( j = 12; j > 0; j-- ) {
printf( "----" ); // Trennlinie der ersten Zeile vom Rest des Spielfelds
}
printf( "\n" );
k = 143;
l = 143;
for( i = 12; i > 0; i-- ) {
printf( " %2d |", i ); // Führende Zeilennummer
for( j = 12; j > 0; j-- ) {
printf( "%3d|", f_n[k] ); // Feldnummer
k--;
}
printf( "\n |" );
for( j = 12; j > 0; j-- ) {
if( o[l] != 0 ) { printf( "%c%d%c|", t[l][0], o[l], t[l][1] ); } //Ausgabe der Feldattribute innerhalb des Feldes
else { printf( "%c %c|", t[l][0], t[l][1] ); } //Ausgabe der Feldattribute innerhalb des Feldes, mit dem Unterschied, dass keine Null angezeigt wird Felder, die noch keinem Spieler gehören
l--;
}
printf( "\n -" );
for( j = 12; j > 0; j-- ) {
printf( "----" ); // Sich wiederholender Trenner der Zeilen
}
printf( "\n" );
}
printf( "\n" );
}
void set_castles( short nop, short ttp, short own[] ) {
short castle;
printf( "Player %d, there are %d castles remaining.\n", nop, ttp );
printf( "Type in the number of the field, on which you want to place the castle.\n: " );
scanf( "%d", &castle );
own[castle] = nop; // Zuweisung der aktuellen Spielernummer zum jeweiligen Feld
}

Edit: Auch auf die Gefahr hin, mit jetzt zum Spammer zu outen: Ich habe den Fehler just nachdem ich den Thread gestartet habe gefunden! Er ist so simpel wie dämlich: Es liegt natürlich an dem Datentyp, den ich verwende, der für diesen Zweck etwas unterdimensioniert ist. Ich hätte besser den Integer genommen! Egal. Weitere Kommentare zum Code und/oder der Spiel-Idee sind erwünscht, wenn auch in diesem Teil des Forums etwas unangebracht.
