Arrays - Fehler bei der Übergabe oder der Verwendung?
Verfasst: Mi Mai 15, 2013 5:41 pm
Hallo, ich bin es mal wieder.
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:
Wobei "int" für den Variablentyp steht, "array" für den Namen des Arrays und "x" für die Größe des Arrays (bzw. die Anzahl der Elemente). Ferner ist es richtig, dass ich Arrays per Referenz übergebe, indem ich beim Aufruf der Funktion die eckigen Klammern (und deren Inhalt) hinter dem Namen des Arrays weglasse und, dass die entsprechende Funktionsdeklaration z. B. wie folgt lautet:
Wobei die eckigen Klammern geschrieben werden, aber keinen Inhalt haben. Innerhalb der Funktion greife ich dann auf die Elemente des Arrays zu, indem ich das Array - wie gewohnt - über den im Funktionskopf angeführten Variablennamen anspreche und den entsprechenden Index - wie gewohnt - in eckigen Klammern dahinter schreibe, z. B. so:
Wer sich für den Code interessiert, dem sei gesagt, dass es sich um ein Spiel handelt, dass ich programmieren möchte. Hierbei geht es darum, auf einem Spielfeld mit 144 Feldern (12x12) Felder zu besetzen, indem Gebiete von Feldern, die die Felder einschließen vom Rest des Spielfeldes mit sogenannten "Grenzsteinen" abgegrenzt werden. Diese werden auf die Linien zwischen den Feldern gelegt. Natürlich spielt sich bei mir, da ich Purist bin, alles in der Kommandokonsole ab. Die Grundstruktur des Spielst gliedert sich in folgende Funktionen:
Den Code, den ich bis jetzt habe und bei dem oben genannter Fehler auftritt, will ich euch nicht vorenthalten. Wer mag, kann ja einmal schauen, ob er den Fehler entdeckt.
Es kann gut sein, dass der ein oder andere noch weitere Bemerkungen zum Quelltext hat; dem stehe ich offen gegenüber.
Herzlichen Dank fürs Lesen, für euer Interesse und eure Mühen! (Vielleicht hat ja sogar jemand Spaß daran.
)
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.

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.
