c++ fehler bei arrays

Hallo an alle ich bin neu und ich soll fürs studium ein sudokelöser in c++ programmieren.
hier die quelltexte

vorgP4.2.h:

typedef unsigned char SD [9][9][10];
//SD[j][0] ist Anzahl der offenen Möglichkeiten auf Position (i,j)
//SD[j][k]==true genau dann wenn die Zahl k eine offene Möglichkeit ist

char sudoku(SD);

vorgP4.2.c++

#include<stdio.h>
#include<stdlib.h>
#include"vorgP4.2.h"
#include<iostream.h>

void lese_SD(SD sd)
{
unsigned c;
for(unsigned i=0;i<9;++i)
for(unsigned j=0;j<9;++j)
{
scanf("%u",&c);
for(unsigned k=1;k<10;++k) sd[j][k]=(c?0:1);
sd[j][0]=(c?1:9);
if(c) sd[j][c]=1;
}
}

void drucke_SD(SD sd)
{
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
if(sd[j][0]!=1) { printf("%u ",0); continue; }
for(unsigned k=1;k<10;++k)if(sd[j][k]) printf("%u ",k);
}
printf("\n");
}
}

SD sd;

main()
{
lese_SD(sd);
drucke_SD(sd);
printf("\n");
if(sudoku(sd)) drucke_SD(sd);
else printf("unloesbar");
system("PAUSE");

}

und schließlich aufgP4.4.c++:

#include "vorgP4.2.h"


char sudoku(SD sd)
{
SD sd2;
sd2=sd <---------------hier !
// rest hab ich weggelassen
}

da an der markierten stelle bekomme ich bei compilieren mit Dev-C++ 4.9.9.2
den Fehler:
In function `char sudoku(unsigned char (*)[9][10])':
incompatible types in assignment of `unsigned char (*)[9][10]' to `unsigned char[9][9][10]'


und meine frage ist WIESO?????
SD ist ja vom typ char[9][9][10] was heißt das (*) ???????????????

danke
 
Vielleicht weis dein Kompiler nicht, wie er die SD auf SD zuweisen soll. Versuch doch mal mit einer Schleife alle Einträge manuel zuzuweisen.

Generell solltest du auf jeden Fall richtige Klassen benutzen. Dabei solltest du den größten Teil der Funktionen (manche würden sagen: alle Funktionen) in die Klasse packen. Für mich ist das ein bischen schwer zu durchschauen, wie du das implementiert hast.
Ich habe vor kurzem auch ein Sudoku-Löser geproggt und wegen einer sauberen Klassen Struktur konnte ich das ganze auch recht einfach implementieren.

Das aber nur so am Rande...

MFG
Ace

PS: Nie mehr als ein ? (Fragezeichen)! :D
PPS: Hab grad noch diesen Link gefunden (Programmieraufgaben):
http://www.hackerboard.de/thread.php?threadid=27001
 
Ja danke das große problem ist nur das mein prof es so will, dass ich vorgP4.2.h und vorgP4.2.c++ nicht verändere sondern nur in aufgP4.2.c++ progge
das mit der schleife läuft soweit erstmal baer warum will es nicht anders gehen?
 
In C/C++ kann man nicht einfach so ohne Weiteres Arrays kopieren.
Code:
sd2=sd;
bedeutet im Prinzip
Code:
&sd2[0][0][0]=&sd2[0][0][0];
was natürlich ziemlich sinnfrei ist. Deshalb musst du es mit einer Schleife machen.
 
OK ich habs jetzt mit ner schleife gelöst aber das prog arbeitet trotzdem nicht findet ihr den Fehler???

#include "vorgP4.2.h"

char voll(SD sd1)
{
int rueck=1;
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
if(sd1[j][0]>1)
rueck = 0;
}
}

return rueck;
}

int welche_zahl(SD sd2, int zeile, int spalte)
{
int rueck=0;
for (unsigned k=0;k<10;++k)
if (sd2[zeile][spalte][k]==1) rueck=k;
return rueck;
}

char teste(SD sd3)
{
int rueck=1;
//zeilentest:
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
for(unsigned l=0;l<9;++l)
{
if ((welche_zahl(sd3,i,j)==welche_zahl(sd3,i,l))&&(j!=l))
rueck = 0;
}
}
}
//spaltentest
for(unsigned j=0;j<9;++j)
{
for(unsigned i=0;i<9;++i)
{
for(unsigned l=0;l<9;++l)
{
if ((welche_zahl(sd3,i,j)==welche_zahl(sd3,l,j))&&(i!=l))
rueck = 0;
}
}
}
//boxtest
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
for(unsigned k=((i/3)*3);k<(((i/3)*3)+3);++k)
{
for(unsigned l=((j/3)*3);l<(((j/3)*3)+3);++l)
{
if ((welche_zahl(sd3,i,j)==welche_zahl(sd3,k,l))&&((i!=k)||(j!=l)))
rueck = 0;
}
}
}
}

return rueck;
}

int freiezeile(SD sd4)
{
int rueck;
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
if(sd4[j][0]>1)
rueck = i;
}
}
return rueck;
}
int freiespalte(SD sd5, int zeile)
{
int rueck;
for(unsigned j=0;j<9;++j)
{
if(sd5[zeile][j][0]>1)
rueck = j;
}

return rueck;
}

char sudoku(SD sd)
{
SD sdx;
int wert=0;
// sd auf sdx zuweisen:
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
for(unsigned k=0;k<10;++k)
sdx[j][k]=sd[j][k];
}
}
// sind alle einträge im sudoku drin? wenn ja dann prüfe ob diese Lösung so geht
if (voll(sd)==1)
{
if(teste(sd)==1)
{
return 1;
}
else return 0;

}
else
{
// suche nächsten freien Platz

int zeile = freiezeile(sd);
int spalte = freiespalte(sd,zeile);
for(unsigned zahl=0;zahl<9;++zahl)
//trage zahl ein und löse dann
{
for(unsigned i=1;i<10;++i)
{
sdx[zeile][spalte]=0;
}
sdx[zeile][spalte][zahl]=1;
sdx[zeile][spalte][0]=1;

if (sudoku(sdx)==1)
{
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
for(unsigned k=0;k<10;++k)
sd[j][k]=sdx[j][k];
}
}
return 1;
}
else
return 0;
}
}
}

ist meine lösung die vorgaben sind :
#include<stdio.h>
#include<stdlib.h>
#include"vorgP4.2.h"
#include<iostream.h>

void lese_SD(SD sd)
{
unsigned c;
for(unsigned i=0;i<9;++i)
for(unsigned j=0;j<9;++j)
{
scanf("%u",&c);
for(unsigned k=1;k<10;++k) sd[j][k]=(c?0:1);
sd[j][0]=(c?1:9);
if(c) sd[j][c]=1;
}
}

void drucke_SD(SD sd)
{
for(unsigned i=0;i<9;++i)
{
for(unsigned j=0;j<9;++j)
{
if(sd[j][0]!=1) { printf("%u ",0); continue; }
for(unsigned k=1;k<10;++k)if(sd[j][k]) printf("%u ",k);
}
printf("\n");
}
}

SD sd;

main()
{
lese_SD(sd);
drucke_SD(sd);
printf("\n");
if(sudoku(sd)) drucke_SD(sd);
else printf("unloesbar");
system("PAUSE");

}
und

typedef unsigned char SD [9][9][10];
//SD[j][0] ist Anzahl der offenen Möglichkeiten auf Position (i,j)
//SD[j][k]==true genau dann wenn die Zahl k eine offene Möglichkeit ist

char sudoku(SD);

danke
 
Original von xsheep
In C/C++ kann man nicht einfach so ohne Weiteres Arrays kopieren.
Code:
    srand(5929);
    char bla1[10][10];
    char bla2[10][10];
    memset((void*)bla2, 0, sizeof(bla2));
    for(char a = 0; a < 10; a++) {
        for(char b = 0; b < 10; b++) {
            bla1[a][b] = rand()%255;
        }
    }
    printf("bla1:\n");
    for(char a = 0; a < 10; a++) {
        for(char b = 0; b < 10; b++) {
            printf("%d ", bla1[a][b]);
        }
    }
    printf("\nbla2:\n");
    for(char a = 0; a < 10; a++) {
        for(char b = 0; b < 10; b++) {
            printf("%d ", bla2[a][b]);
        }
    }
    printf("\nmemcpy()\n");
    memcpy(bla2, bla1, sizeof(bla1));
    printf("\nbla2:\n");
    for(char a = 0; a < 10; a++) {
        for(char b = 0; b < 10; b++) {
            printf("%d ", bla2[a][b]);
        }
    }

Lässt sich natürlich beliebig erweitern:
Code:
unsigned char foo1[9][9][10];
    unsigned char foo2[9][9][10];
    printf("memset():\n\n");
    memset((void*)foo2, 0, sizeof(foo2));
    for(char a = 0; a < 9; a++) {
        for(char b = 0; b < 9; b++) {
            for(char c = 0; c < 10; c++) {
                foo1[a][b][c] = rand()%255;
            }
        }
    }
    printf("foo1:\n");
    for(char a = 0; a < 9; a++) {
        for(char b = 0; b < 9; b++) {
            for(char c = 0; c < 10; c++) {
                printf("%d ", foo1[a][b][c]);
            }
        }
    }
    printf("\n\nfoo2:\n");
    for(char a = 0; a < 9; a++) {
        for(char b = 0; b < 9; b++) {
            for(char c = 0; c < 10; c++) {
                printf("%d ", foo2[a][b][c]);
            }
        }
    }
    printf("\n\nmemcpy():\n");
    memcpy(foo2, foo1, sizeof(foo1));
    printf("\nfoo2:\n");
    for(char a = 0; a < 9; a++) {
        for(char b = 0; b < 9; b++) {
            for(char c = 0; c < 10; c++) {
                printf("%d ", foo2[a][b][c]);
            }
        }
    }
Siehe:
http://cplusplus.com/reference/clibrary/cstring/memcpy.html
http://cplusplus.com/reference/clibrary/cstring/memset.html

PS: clAu$, bitte gewöhne dir den CODE-Tag an (
Code:
).
 
das ich die nun nich einfach kopieren kann weiß ich mitlerweile, ich weiß nur nicht warum es trotzdem nicht funzt
 
@dietox: Mir ist schon klar, dass man mit bestimmten Funktionen/Schleifen Arrays kopieren kann. Mit "Nicht einfach so ohne Weiteres" habe ich nur sagen wollen, dass man so etwas nicht mit einem simplen Zuweisungsoperator bewerkstelligen kann.
 
Zurück
Oben