Programm mit Abruffunktionen,Pointern und Arrays.Seltsame Fehlermeldung

cwriter

Erfahrenes Mitglied
Hi

Du hast i schon definiert. Welchen Standard benutzt du eigentlich? C89 oder C99? (C11 ist das sicher nicht).
Wenn du das size_t entfernst und du das existierende i verwendest (also im ersten for-Feld nur "i=0" schreibst, sollte der Error verschwinden.

Gruss
cwriter

/EDIT: Und schreibe deinen Code in C-Tags, [code=c] [/code] , dann wird der Text auch nicht kursiv ([i] ist der BB-Tag für italic). Und nebenbei wird nicht immer der PHP-Array verlinkt.

/EDIT2: Zu deinem Code: Irgendwie kommt in letzter Zeit eine Flut solchen Codes. Liegt nicht an dir, aber da rollen sich mir die Fussnägel auf. @sheel: Genau das meinte ich: Es wird mal einfach irgendwas als Aufgabe gegeben, ohne irgendwas erklärt zu haben...

* dereferenziert, & referenziert.
z.B.:
C:
int a = 123;
int* b = &a;
//*b==a
//b != a (auch ungleicher Typ!)
//*(&a) == a == 123
//b == &a (trivial, aber wichtig: Die Adresse von a ändert sich nicht!(
//&b != &(&a) (kann sein, ist meist nicht)
//&a sagt: "Wo im Speicher ist a?"
//a sagt: "Was ist der Wert von a?"
//*b sagt: "Was steht an der Adresse b?"
*b = 42;
//a == *b == 42
//Da b auf a zeigt, ändert man a, wenn man den Wert, worauf b zeigt, ändert.
//Man kann nur Pointertypen dereferenzieren, *a geht NICHT.
//Man kann IMMER referenzieren (auch wenn es wenig Sinn macht; der Prozessor mag Indirektionen nicht
//z.B. ein Wert vom Typ int*** kann 3x dereferenziert werden, aber die Referenzen müssen vorher gesetzt sein, sonst U.B.
//Eine Einfache Erklärung ist: Rechts vom Typ baut man Referenzen auf, Links von der Variable baut man Referenzen ab (*).
//***(int***) wäre also int. (ACHTUNG: int*** ist nur der Typ, es müsste eine Variable dieses Typs an der Stelle des (int***) stehen!)
Wenn du nun **spielfeld machst, kopierst du den ersten Wert. Den dann mit "&" zu referenzieren gibt dir nur einen Pointer auf diesen Wert. Als Faustregel: Wenn & vor * steht, dann ist etwas falsch.
 
Zuletzt bearbeitet:

Baqk10

Mitglied
Hi

Du hast i schon definiert. Welchen Standard benutzt du eigentlich? C89 oder C99? (C11 ist das sicher nicht).
Wenn du das size_t entfernst und du das existierende i verwendest (also im ersten for-Feld nur "i=0" schreibst, sollte der Error verschwinden.

Gruss
cwriter

/EDIT: Und schreibe deinen Code in C-Tags, [code=c] [/code] , dann wird der Text auch nicht kursiv ([i] ist der BB-Tag für italic). Und nebenbei wird nicht immer der PHP-Array verlinkt.
Ok mach ich ab jetzt, danke :D.
Ich weiß nicht welches C ich benutze , jedenfalls nutze ich die Entwicklungsumgebung CodeBlocks und C ohne ++.
Ja die Fehlermeldung ist jetzt weg, das Programm lässt sich compilieren, spuckt aber leider nichts aus.
Interessant:
wie ich dir gesagt hatte habe ich
C:
        spielGeruest(**spielfeld);
        ausgabeSpielfeld(**spielfeld);

in
C:
        spielGeruest(&**spielfeld);
        ausgabeSpielfeld(&**spielfeld);
umgeändert.
In der nicht umgeänderten Version also ohne die &´s , stürzt das Programm ab.Also müsste es langsam in Richtung Richtig gehen ?
 

Baqk10

Mitglied
Ich frage mal nach: Sicher?
Wie sollte denn dein Code jetzt aussehen?

cwriter
Ja ich habe die &´s weggemacht, da ich mit den &´s nur einen neuen Pointer auf diesen Wert setze.

also hier ist nun der aktuelle gesamte Code :
C:
#include <stdio.h>
#include <stdlib.h>

#define GROESSE_FELD 4
#define DIM_ZEILE GROESSE_FELD * 2 + 1
#define DIM_SPALTE GROESSE_FELD * 2 + 1



void spielGeruest(char **spielfeld){
    int i = 0, j = 0;
for(i = 0; i < (DIM_ZEILE); i++){
for(j = 0; j < (DIM_SPALTE); j++){
            if(!(i%2)){
                if(!(j%2)){
                    spielfeld[i][j] = '|';
                }
                else{
                    spielfeld[i][j] = '-';
                }
            }
            else{
                if(!(j%2)){
                    spielfeld[i][j] = '|';
                }
                else{
                    spielfeld[i][j] = 'x';
                }
            }
        }
    }
}
void ausgabeSpielfeld(char** spielfeld){
    int i, j;
    for(i=0; i<(DIM_ZEILE); i++){
      for(j=0; j<(DIM_SPALTE); j++){
           printf("Spielfeld[%d][%d]\n", spielfeld[i][j]);
           return spielfeld[i][j];
    }
    }
}
    int main(){
        int i;

    int array[DIM_SPALTE][DIM_ZEILE]={0};            //Zweidimensionales Array
    char **spielfeld;
    spielfeld = (char**)malloc(sizeof(char*)*(DIM_ZEILE));
        for(i=0;i<(DIM_SPALTE);i++);{
            spielfeld[i] = (char*)malloc(sizeof(char)*DIM_SPALTE);
        }

        spielGeruest(**spielfeld);
        ausgabeSpielfeld(**spielfeld);
        for(i = 0; i < DIM_ZEILE; i++)free(spielfeld[i]);
        free(spielfeld);
    return 0;
    }

Es lässt sich compilieren, stürzt aber ab.
 

Baqk10

Mitglied
Interessant, beim debuggen kriege ich die Meldung, bei Zeile52 ist ein Hinweis, also Strackrace bei Zeile 52

Edit:
Ne das ist QUatsch, wenn ich die Zeile rausnehme prangert er mit eine Zeile darunter an und wenn ich dasselbe mache,wird das free() das Problem beim debuggen.
Ich habe kurz mal alles rausgenommen was er beim Strackrace als Problem angibt und habe dann compiliert.
Am Ende stürzt das Programm immernoch ab und der Debugger sagt aber, dass alles OK ist.
P.S. hab alles wieder zurück getan.
 
Zuletzt bearbeitet: