Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.06.2010, 18:58

Programmabsturz: Gleicher Code - einmal funktionierts, einmal nicht.

Hi

ich bin recht neu in C++ und versuche mich gerade an "Schiffeversenken" als Konsolenapplikation. Ich habe allerdings ein Problem beim Befüllen eines Arrays. Die markierte Zeile verursacht einen Absturz (wenn ich sie auskommentiere läuft das Programm). Kann mir jemand weiterhelfen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
char fieldPlayer[10][10];
char fieldComputer[10][10];
//[..]
for( x = 0; x < 10; x++ ){
  for( y = 0; y < 10; y++ ){
    fieldPlayer[x][y] = '.';
    fieldComputer[x][y] = '.';//verursacht den Absturz
  }
}


edit: Wenn die x-Schleife nur bis 9 läuft, funktioniert es.

2

10.06.2010, 19:14

Also ich sehe da keinen Fehler. Der Code verursacht bei mir auch keinen Absturz.
Kannst du mal den ganzen Quellcode posten?
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

Dark Fly

Treue Seele

Beiträge: 163

Wohnort: Bielefeld

Beruf: Schüler

  • Private Nachricht senden

3

10.06.2010, 19:16

Seltsam, dachte erst an nen Buffer-Overflow, kann aber keinen Fehler finden.
Bist du sicher das er dir da Abschmiert?

EDIT: Mist zu langasam, stimme Wollnashorn aber voll zu.
Poste mal den Rest.
MfG Dark Fly

C-/C++-Quelltext

1
2
3
4
int *i;                     // Erstelle Zeiger
while(true)                 // führe Schleife immer aus
{new (int) = i;}            // allokiere frischen Speicher
                            // warte auf unendliche Langsamkeit....

4

10.06.2010, 19:18

Hiermal etwas mehr, unwichtige Sachen aber weggelassen ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//battleships.cpp
#include "battleships.h"
#include "constants.h"
#include <stdlib.h>
#include <iostream>

Battleships::Battleships(void){
    for( x = 0; x < 9; x++ ){
    for( y = 0; y < 10; y++ ){
        fieldPlayer[x][y] = '.';
        fieldComputer[x][y] = '.';
    }
    }
    for( i = 0; i < 10; i++ ){
        cols[i] = 65+i;
    }
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//battleships.h
class Battleships{
    public:
            Battleships();
    private:
            char cols[10];
            int  row, i, x, y;
            char fieldPlayer[10][10];
            char fieldComputer[10][10];
};


C-/C++-Quelltext

1
2
//main.cpp
Battleships battleships;

5

10.06.2010, 19:21

Auch hier müsste der Code eigentlich problemlos funktionieren. Bist du dir sicher, dass du nur irrelevante Stücke ausgelassen hast?
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

6

10.06.2010, 19:32

Hier dann mal der komplette Quellcode.
So schmiert er ab:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//battleships.h
class Battleships{
    public:
            Battleships();
            ~Battleships();
            void clear();
            void drawEnemyField();
            void drawOwnField();
            void getCol();
            void getRow();
            void shoot();
            bool runGame;
            bool turn;
    private:
            char col;
            char cols[10];
            int  row, i, x, y;
            char fieldPlayer[10][10];
            char fieldComputer[10][10];
            void drawField(char player[10][10]);
};


C-/C++-Quelltext

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//battleships.cpp
#include "battleships.h"
#include "constants.h"
#include <stdlib.h>
#include <iostream>

Battleships::Battleships(void){
    runGame = true;   
    turn    = PLAYER;   
    for( x = 0; x < 10; x++ ){
    for( y = 0; y < 10; y++ ){
        fieldPlayer[x][y] = '.';
        fieldComputer[x][y] = '.';
    }
    }
    for( i = 0; i < 10; i++ ){
        cols[i] = 65+i;
    }
}
Battleships::~Battleships(void){
}
void Battleships::clear(void){
    system("CLS");
}
void Battleships::drawEnemyField(void){
    for( y = 0; y < 10; y++ ){
    for( x = 0; x < 10; x++ ){
        std::cout << fieldComputer[x][y];
    }
    std::cout << std::endl;
    }
    std::cout << std::endl;
    std::cout << std::endl;
}
void Battleships::drawOwnField(void){
    drawField(fieldPlayer);
    for( y = 0; y < 10; y++ ){
    for( x = 0; x < 10; x++ ){
        std::cout << fieldPlayer[x][y];
    }
    std::cout << std::endl;
    }
    std::cout << std::endl;
    std::cout << std::endl;
}
void Battleships::drawField(char player[10][10]){
    /* Write Col names */
    for( i = 0; i < 10; i++ ){
        std::cout << cols[i];
    } 
    std::cout << std::endl;
    
}
void Battleships::getCol(){
    std::cout << "Bitte Spalte eingeben: ";
    std::cin >> col;
}
void Battleships::getRow(){
    std::cout << "Bitte Reihe eingeben: ";
    std::cin >> row;
}
void Battleships::shoot(){
    system("PAUSE");
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//main.cpp
#include "constants.h"
#include "battleships.h"
int main(){
    Battleships battleships;
    while( battleships.runGame ){           
        battleships.clear();
        battleships.drawEnemyField();
        battleships.drawOwnField();
        if( battleships.turn == PLAYER ){
            battleships.getCol();
            battleships.getRow();
            battleships.shoot();            
        }
    }
    return 1;
}


C-/C++-Quelltext

1
2
3
//constants.h
const int PLAYER   = 0;
const int COMPUTER = 1;


edit: Ich glaube ich habe gerade die Lösung gefunden. Ich habe mal ein "break" in die While-Schleife gesetzt, und jetzt scheint es zu funktionieren.
edit2: Jetzt funktioniert es auch ohne break. Das Problem scheint sich in Luft aufgelöst zu haben.

7

10.06.2010, 19:40

Bei mir gibts auch keine Abstürze. :)

Zitat von »Suicide and Redemption«

Das Problem scheint sich in Luft aufgelöst zu haben.
Na hoffen wir das mal. :thumbup:
Wenn die Weisen jetzt nicht rummeckern ist der Code wohl fehlerfrei. ^^
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

10.06.2010, 19:50

Ich seh da so auch nichts, auch wenn das Verhalten nach undefiniertem Verhalten klingt. Aber einen unerlaubten Zugriff sehe ich da nirgends.

Aber ein paar andere unschöne Sachen sind mir aufgefallen:
  • Rück richtig ein. (siehe verschachtelte Schleifen)
  • Variablen so später, wie möglich deklarieren ( siehe i, x und y)
  • Benutz Initialisierungslisten
  • Für was genau ist der Parameter in drawField?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

9

10.06.2010, 21:21

ich persönlich mag es auch lieber, wenn all meine variablen oben stehen, also im funktions-anfang deklariert und definiert werden....

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

10.06.2010, 21:26

Naja.. das kann man gerade so noch als Geschmackssache abtun, aber daraus Klassenmember zu machen ist sicher keine gute Idee.

Werbeanzeige