ubuntuusers.de

Sudoku mit C++ die zweite

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Snoopy88

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Leider war ich nicht wirklich der erste ( siehe hier), aber zumindest ist es mein erstes C++ Prog, welches auch läuft.

Sourcecode:

const char VERSION[4]="0.1";

using namespace std;

void sudoku_oeffnen(int *array, char *dateiname) // Laden von Sudokus aus Dateien
{ //Vorsicht, unfertig!!! Stattdessen Sudoku direkt in den Quellcode schreiben
	short i = 0; //Zaehlvariable
	// Datei einlesen
	FILE *datei;
	datei = fopen (dateiname, "r");
	if (datei != NULL)
    {
		for (i=0;i<=8;i=i+1) 
		{
			fseek(datei, 3 * i, SEEK_SET);
		}
		fclose (datei);
    }
};

void anzeigen_update_sudoku(short array[9][9][10]) // Anzeigen des Sudokus (Terminal)
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	
	for (x=0;x<=8;x=x+1)
	{
		if ((x % 3) == 0)
			cout << endl;;
		for (y=0;y<=8;y=y+1)
		{
			if ((y % 3) == 0)
				cout << " ";
			cout << array[x] [y] [0] << " ";
		}
		cout << endl;
	}
};

void anzeigen_update_werte(short array[9][9][10]) // Anzeigen der Wetemenge (Terminal)
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	for (x=0;x<=8;x=x+1)
	{
		if ((x % 3) == 0)
			cout << endl;;
		for (y=0;y<=8;y=y+1)
		{
			if (y%3 == 0)
				cout << " ";
			cout << "{";
			for (z=1;z<=9;z=z+1)
			{
				if (array[x] [y] [z] == 1)
					cout << z << ",";
			}
			cout << "}";
			
		}
		cout << endl;
	}
};

void sudoku_loeschen(short array[9][9][10]) // Löschen des Sudokus
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	for (x=0;x<=8;x=x+1)
	{
		for (y=0;y<=8;y=y+1)
		{
			array [x] [y] [0] = 0;
			
			for (z=1;z<=9;z=z+1)
			{
				array [x] [y] [z] = 1;
			}
		}
		cout << endl;
	}
};

void wertemenge_updaten(short array[9][9][10]) // Updaten der Wertemenge
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	short x2 = 0; //zweite Zaehlvariable fuer X-Koordinate der Matrix
	short y2 = 0; //zweite Zaehlvariable fuer Y-Koordinate der Matrix
	
	short wert = 0; // Wert der momentanen Zelle
	
	for (x=0;x<=8;x=x+1)
	{
		for (y=0;y<=8;y=y+1)
		{
			if (array[x] [y] [0]>0) // Überprüfen ob Feld bekannt
			{
				wert = array[x] [y] [0];
				
				for (z=1;z<=9;z=z+1) // Wertemenge des bereits bekannten Feldes leeren
				{
					if (z != wert)
						array[x] [y] [z] =0;
				}
				
				for (y2=0;y2<=8;y2=y2+1) //Anpassen der Reihe an bereits bekannte Zelle
				{
					if (y2 != y)
					{
						array[x] [y2] [wert] = 0;
					}
				}
				
				for (x2=0;x2<=8;x2=x2+1) //Anpassen der Spalte an bereits bekannte Zelle
				{
					if (x2 != x)
					{
						array[x2] [y] [wert] = 0;
					}
				}
				
				for (x2=(x/3)*3;x2<=((x/3)*3)+2;x2=x2+1)  //Anpassen des Quadrats an bereits bekannte Zelle
				{
					for (y2=(y/3)*3;y2<=((y/3)*3)+2;y2=y2+1)
					{
						if (x2 != x)  //Unschön; Das müsste sich irgendwie in einer Abfrage verknüpfen lassen
							array[x2] [y2] [wert] = 0;
						if (y2 != y)
							array[x2] [y2] [wert] = 0;
					}
				}
			}
		}
		cout << endl;
	}
};

bool ueberpruefe_einermenge(short array[9][9][10]) // Überprufen der Wertemenge auf Einermengen
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	short anzahl = 0; //Anzahl der Zahlen in einer Menge
	short zahl = 0; //Erste in einer Menge, ist nur eine Zahl vorhanden, so ist es die erste
	
	bool status = false; //Der spätere Rückgabewert; Wird true, wenn eine Einermenge gefunden wird
	
	//for (x=0;x<=8;x=x+1)
	for (x=0;x<=8;x=x+1) //Absuchen jedes Feldes
	{
		for (y=0;y<=8;y=y+1)
		{
			for (z=1;z<=9;z=z+1)
			{
				if (array[x] [y] [z] == 1)
				{
					anzahl++;
					if (anzahl == 1)
						zahl=z;
				}
			}
			if (anzahl == 1)
			{
				if (array[x] [y] [0] != zahl)
				{
					status = true;
					array[x] [y] [0] = zahl;
				}
			}
			
			anzahl = 0;
			zahl = 0;
		}
	}
	
	return status;
};

bool ueberpruefe_reihen(short array[9][9][10]) // Überprüfen der Wertemenge einer Reihe auf Zahlen die es nur einmal in den Mengen dieser Reihe gibt
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	short anzahl = 0; //Anzahl der Zahlen in einer Menge
	short ort = 0; //Ort des ersten Auftauchens, ist die Zahl nur einmal vorhanden, so ist dies der Ort der Zahl
	
	bool status = false; //Der spätere Rückgabewert; Wird true, wenn eine neue Zahl gefunden wird
	
	for (z=1;z<=9;z=z+1) //Absuchen jeder Reihe
	{
		for (y=0;y<=8;y=y+1)
		{
			for (x=0;x<=8;x=x+1)
			{
				if (array[x] [y] [z] == 1)
				{
					anzahl++;
					if (anzahl == 1)
						ort=x;
				}
			}
			if (anzahl == 1)
			{
				if (array[ort] [y] [0] != z)
				{
					array[ort] [y] [0] = z;
					status = true;
				}
			}
			
			anzahl = 0;
			ort = 0;
		}
	}
	
	return status;
};

bool ueberpruefe_spalten(short array[9][9][10]) // Überprüfen der Wertemenge einer Spalte auf Zahlen die es nur einmal in den Mengen dieser Spalte gibt
{
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	short anzahl = 0; //Anzahl der Zahlen in einer Menge
	short ort = 0; //Ort des ersten Auftauchens, ist die Zahl nur einmal vorhanden, so ist dies der Ort der Zahl
	
	bool status = false; //Der spätere Rückgabewert; Wird true, wenn eine neue Zahl gefunden wird
	
	for (z=1;z<=9;z=z+1) //Absuchen jeder Spalte
	{
		for (x=0;x<=8;x=x+1)
		{
			for (y=0;y<=8;y=y+1)
			{
				if (array[x] [y] [z] == 1)
				{
					anzahl++;
					if (anzahl == 1)
						ort=y;
				}
			}
			if (anzahl == 1)
			{
				if (array[x] [ort] [0] != z)
				{
					array[x] [ort] [0] = z;
					status = true;
				}
			}
			
			anzahl = 0;
			ort = 0;
		}
	}
	
	return status;
};

bool ueberpruefe_quadrate(short array[9][9][10]) // Überprüfen der Wertemenge eines Quadrates auf Zahlen die es nur einmal in den Mengen dieses Quadrates gibt
{// Noch nicht fertig!!!!
	short x = 0; //Zaehlvariable fuer X-Koordinate der Matrix
	short y = 0; //Zaehlvariable fuer Y-Koordinate der Matrix
	short z = 0; //Zaehlvariable fuer Z-Koordinate der Matrix
	
	short anzahl = 0; //Anzahl der Zahlen in einer Menge
	short ort = 0; //Ort des ersten Auftauchens, ist die Zahl nur einmal vorhanden, so ist dies der Ort der Zahl
	short orty = 0; //Ort des ersten Auftauchens, ist die Zahl nur einmal vorhanden, so ist dies der Ort der Zahl
	
	bool status = false; //Der spätere Rückgabewert; Wird true, wenn eine neue Zahl gefunden wird
	
	for (z=1;z<=9;z=z+1) //Absuchen jeder Spalte
	{
		for (x=0;x<=8;x=x+1)
		{
			for (y=0;y<=8;y=y+1)
			{
				if (array[x] [y] [z] == 1)
				{
					anzahl++;
					if (anzahl == 1)
						ort=y;
				}
			}
			if (anzahl == 1)
			{
				if (array[x] [ort] [0] != z)
				{
					array[x] [ort] [0] = z;
					status = true;
				}
			}
			
			anzahl = 0;
			ort = 0;
		}
	}
	
	return status;
};

int main(int argc, char** argv)
{
    // Array für Sudoku in x und y auf z=0 und Wertemenge in z=1-9
    short matrix [9] [9] [10]; // Array für Sudoku in x und y auf z=0 und Wertemenge in z=1-9
	bool status = true; //Status der Überprüfungslogik; False, wenn keine Neuen Felder gefunden wurden
	
	sudoku_loeschen(matrix);
	
	// Hier Das Sudoku in den Array schreiben, Lesen aus Datei ist noch nicht fertig
	matrix[0] [5] [0] = 2;
	matrix[0] [6] [0] = 1;
	matrix[0] [7] [0] = 6;
	matrix[0] [8] [0] = 7;
	
	matrix[1] [0] [0] = 4;
	matrix[1] [3] [0] = 8;
	matrix[1] [5] [0] = 7;
	matrix[1] [6] [0] = 9;
	matrix[1] [7] [0] = 3;
	matrix[1] [8] [0] = 5;
	
	matrix[2] [3] [0] = 3;
	matrix[2] [5] [0] = 1;
	matrix[2] [6] [0] = 2;
	matrix[2] [7] [0] = 4;
	
	matrix[3] [0] [0] = 8;	
	matrix[3] [7] [0] = 5;
	
	matrix[4] [1] [0] = 6;
	matrix[4] [2] [0] = 2;
	matrix[4] [6] [0] = 8;
	matrix[4] [7] [0] = 1;
	
	matrix[5] [1] [0] = 1;
	matrix[5] [8] [0] = 3;
	
	matrix[6] [1] [0] = 3;
	matrix[6] [2] [0] = 4;
	matrix[6] [3] [0] = 7;
	matrix[6] [5] [0] = 8;
	
	matrix[7] [3] [0] = 9;
	matrix[7] [5] [0] = 4;
	matrix[7] [8] [0] = 1;
	
	matrix[8] [0] [0] = 9;
	matrix[8] [1] [0] = 7;
	matrix[8] [2] [0] = 5;
	matrix[8] [3] [0] = 2;

	
    cout <<"==== sudokusolver, version "<< VERSION <<" ===="<< endl;
	cout << endl;
	
	anzeigen_update_sudoku(matrix);
	cout << endl;
	
	while(status == true)
	{
		status == false;
		
		wertemenge_updaten(matrix);
		
		status = ueberpruefe_einermenge(matrix);
		
		
		if (status == false)
			status = ueberpruefe_reihen(matrix);
		
		if (status == false)
			status = ueberpruefe_spalten(matrix);
		
		anzeigen_update_sudoku(matrix);
		cout << endl;
	}
	return 0;
} 

Es fehlen noch manche Funktionen, aber es hat mir bis jetzt trotzdem jedes Sudoku gelöst.

Gespeichert wird das Sudoku in einen Array mit 9*9*10 feldern. in der untersten 9*9 "Ebene" steht das Sudoku, wobei leere Felder den Wert "0" haben. die 9 "Ebenen" darüber stehen für die Menge der möglichen Werte, also 1 bis 9. Kann ein Wert in einem Feld aus irgendeinem Grund ausgeschlossen werden, dann wird das antsprechende Feld der Menge auf 0 gesetzt. Danach wird überprüft, ob z.B. eine Menge nur noch einen Wert beinhalltet, oder in einer Zeile/Spalte/Quadrat ein Wert nur in einer einzigen Menge vorkommt. Daraus lässt sich dann eine neue Zahl im Sudoku schließen, woraufhin wieder die Wertemengen überprüft werden usw.

Noch eine Frage:
Gibt es einen Variablentyp der kleiner ist als short? Ich brauch ja nur 9 Zahlen.

Apollon

Avatar von Apollon

Anmeldungsdatum:
27. Oktober 2004

Beiträge: 724

Wohnort: Darmstadt

Ja gibt es. Byte.

typedef unsigned char byte;
byte meineKleineZahl = 255;


😉

Snoopy88

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Danke für die Antwort,

aber was bedeutet die erste Zeile?
Die zweite Zeile habe ich so schonmal auf gut Glück versucht, hat aber leider nicht funktioniert. Ich werds aber nochmal versuchen.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Snoopy88 hat geschrieben:

Danke für die Antwort,

aber was bedeutet die erste Zeile?
Die zweite Zeile habe ich so schonmal auf gut Glück versucht, hat aber leider nicht funktioniert. Ich werds aber nochmal versuchen.

Er erstellt einen neuen Datentyp Namens "byte" das aus "unsigned char" besteht. Also Vorzeichenlos und char. Char ist 1 Byte groß. Ohne die erste Zeile geht die zweite logischerweise nicht, da es ohne die erste Zeile ja keinen Datentyp Namens byte gibt.

Du könntest dasr auch direkt folgendermaßen schreiben:

unsigned char kleinezahl=255

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Da es ja zurzeit anscheind "in" ist Sudokus zu Lösen, habe ich auch mal ein Skript geschrieben das Sudokus löst. Das ganze ist aber schon für einen Benutzer Anwendbar, da man das Sudoku in einer lesbaren Textdatei ablegen kann.

Das Sudoku sollte dabei in folgendem Format gespeichert werden:

5 3 -  - 7 -  - - -
6 - -  1 9 5  - - -
- 9 8  - - -  - 6 -

8 - -  - 6 -  - - 3
4 - -  8 - 3  - - 1
7 - -  - 2 -  - - 6

- 6 -  - - -  2 8 -
- - -  4 1 -  - - 5
- - -  - - -  - 7 -


Die Stellen die vom Programm auszufüllen sind, sind durch Striche "-" gekennzeichnet. Eigentlich gelten beim schreiben nur folgende Regeln. Es dürfen neun Werte in einer Zeile stehen. Dies darf eine Ziffer oder ein Strich sein. Die Werte müssen mit mindestens ein whitespace Zeichen (Leerzeichen, Tab, formfeed etc.) voneinander getrennt werden, können aber auch mehrere sein. Komplette Leerzeilen sind erlaubt. Eine Fehlerüberprüfung habe ich nicht vorgenommen, wer also irgendeinen unsinn eingibt, kann das Programm unter Umständen zum Absturz bringen.

Dem Programm gibt man einfach die Datei als Argument an, die Lösung erscheint dann auf dem Bildschirm. Allerdings bin ich selber nicht mit der Performance zu frieden. Es dauert etwas unter 2 Sekunden bis eine Lösung erscheint. Eine Rekursive Funktion war wohl doch nicht so super. Beziehungsweise bin ich mit meiner Rekursiven Funktion nicht ganz zufrieden ist, da es nur eine halbe/verkrüppelte Rekursive Funktion ist. Aber es Funktioniert. \^^

Hier aber nun das Skript.

#!/usr/bin/perl -w

use strict;

# Wenn kein Arguement uebergeben wurde.
unless (@ARGV)
{
    print "USAGE: ", $0=~m{.*/(.*)}, " sudokofile\n";
    exit;
}

# Array das dass Sudoku Enthaelt.
our @su;

# Werte aus Datei in das Array @su kopieren
my ($x, $y) = qw/0 0/;
while (<>)
{
    next if /^\s*$/;
    $su[$x++][$y] = $1 while m/\G\s*(\S+)/gc;
    $x=0;
    $y++;
}

# Ruft die Rekursive Funktion auf, die das Sudoku loest
&try_num(0,0);
print "Für dieses Sudoku gibt es keine Lösung.\n";



# Loese Sudoku
sub try_num
{
    my ($x, $y) = @_;

    # Wenn x == 9 dann naechste Zeile, erste Spalte
    if ( $x >= 9 )
    {
        $x=0;
        $y++;
        # Wenn Zeile 9 erreicht (es gibt nur 8) dann wurde Sudoku bearbeitet.
        if ( $y >= 9 )
        {
            &ausgabe;
            exit;
        }
    }

    # Solange weiter gehen bis zum naechsten '-' Zeichen.
    until ( $su[$x][$y] eq '-' )
    {
        $x++;
        if ( $x >= 9 )
        {
            $x=0;
            $y++;
            if ( $y >= 9 )
            {
                &ausgabe;
                exit;
            }
        }
    }

    # Probiere an dieser Stelle die Werte 1..9 und preufe ob die Zahl gueltig ist.
    for my $w (1..9)
    {
        $su[$x][$y] = $w;
        if ( check_num($x, $y) )
        {
            try_num(++$x, $y);
            --$x;
        }
        else
        {
            next;
        }
    }
    $su[$x][$y] = '-';
    return 0;
}



# Ausgabe des Sudoku
sub ausgabe
{
    for my $y (0..8)
    {
        for my $x (0..8)
        {
            print $su[$x][$y], " ";
            print " " unless ($x+1) % 3;
        }
        print "\n";
        print "\n" unless ($y+1) % 3;
    }
}


# Zeile, Spalte, Block der uebergebenen Position Ueberprufen
sub check_num
{
    my ($x, $y) = @_;
    my %h = ();

    # Zeile ueberprufen
    for my $w ( 0..8 )
    {
        next      if  $su[$w][$y] eq '-';
        return 0  if  exists $h{$su[$w][$y]};

        $h{$su[$w][$y]} = 1;
    }
    %h = ();

    # Spalte ueberpruefen
    for my $w ( @{$su[$x]} )
    {
        next      if  $w eq '-';
        return 0  if  exists $h{$w};

        $h{$w} = 1;
    }
    %h = ();

    # Block ueberpruefen
    my (@bx, @by);
    @bx = $x<3 ? qw/0 1 2/ : $x<6 ? qw/3 4 5/ : qw/6 7 8/;
    @by = $y<3 ? qw/0 1 2/ : $y<6 ? qw/3 4 5/ : qw/6 7 8/;

    for my $x (@bx)
    {
        for my $y (@by)
        {
            next      if  $su[$x][$y] eq '-';
            return 0  if  exists $h{$su[$x][$y]};

            $h{$su[$x][$y]} = 1;
        }
    }
    %h = ();

    # Wert ist Okay.
    return 1;
}

Snoopy88

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Danke, jetzt funktionierts ... fast.
Wenn ich mir jetzt einen Wert aus dem Array ausgeben lasse erscheint leider keine Zahl, sondern das zugehörige Zeichen, welches meistens nichtmal dargestellt wird. Wie kann ich anstatt dem Zeichen die Zahl "die dahinter steht" ausgeben lassen?

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Snoopy88 hat geschrieben:

Danke, jetzt funktionierts ... fast.
Wenn ich mir jetzt einen Wert aus dem Array ausgeben lasse erscheint leider keine Zahl, sondern das zugehörige Zeichen, welches meistens nichtmal dargestellt wird. Wie kann ich anstatt dem Zeichen die Zahl "die dahinter steht" ausgeben lassen?

char c_zahl=97;
int  d_zahl=865;

printf("Die Zahl %d ist das Zeichen %c\n", c_zahl, c_zahl);
c_zahl++;
printf("Die Zahl %d ist das Zeichen %c\n", c_zahl, c_zahl);

printf("Die Zahl %d ist das Zeichen %c\n", d_zahl, d_zahl);
d_zahl++;
printf("Die Zahl %d ist das Zeichen %c\n", d_zahl, d_zahl);

Intern Speichert C/C++ für ein char immer nur die Zahl. Je nachdem wie du es ausgibst ist die ausgabe eine andere. Wenn du es als Zahl "%d" ausgibst siehst du die Zahl. Ansonsten wenn du den Typ "%c" angibst wird die Zahl als char anerkannt und ein Zeichen ausgegeben. Intern wird aber nur eine Zahl gespeichert.

Das ganze Funktioniert auch mit int. Allerdings verbraucht das ja 4Byte anstatt 1 Byte.

Snoopy88

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Das Char eine Zahl ist, ist mir bekannt, nur wie sage ich dem Befehl "cout", dass er die Zahl ausgeben soll? Ich kann dazu einfach nichts finden.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Snoopy88 hat geschrieben:

Das Char eine Zahl ist, ist mir bekannt, nur wie sage ich dem Befehl "cout", dass er die Zahl ausgeben soll? Ich kann dazu einfach nichts finden.

Ich hab dir doch oben eine Lösung mit printf() gegeben. Das musst du anstelle von cout benutzen. Ob es auch mit cout geht weiß ich nicht.

Snoopy88

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Ok, dann werde ich versuchen das ganze mit printf zu machen.
Danke für deine Hilfe.

Snoopy88

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Und schon das nächste Problem:

class Vector
{
private:
   double *m_data;
   int m_size;
public:
   Vector(int size)
   {
      m_size=size;
      m_data=new double[m_size];
   };
   ~Vector()
   {
      delete[] m_data;
   };
   double operator[](int index)
   {
      return m_data[index];
   };
   int getSize()
   {
      return m_size;
   };
};

void main()
{
   Vector v(10);
   cout<<v[5];
};

Dieser Code ist aus dem wohl ziemlich bekannten vcppk-Tutorial. Mich interessiert dabei nur folgender Teil des Codes:

   double operator[](int index)
   {
      return m_data[index];
   };

Im Prinzip habe ich die ja verstanden, aber wie kann ich da zwei Werte übergeben lassen, wenn ich einen 2-Dimensionalen Array habe?

Schonmal Danke für die Hilfe im Vorraus

Dee Team-Icon

Avatar von Dee

Anmeldungsdatum:
9. Februar 2006

Beiträge: 20095

Wohnort: Schwabenländle

Mit "operator[]" gar nicht. Ändere das z.B. in

double operator()(int index1, int index2)
   {
      return m_data[index1][index2];
   };

ab.

Gruß, Dee

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Mit cout geht es auch - der char muß lediglich in ein int gecastet werden:

	int i = 50; 
	char c = 50;
	short s = 50;
	cout << "wie sie sind:	" << i << '\t' << c 		<< '\t' << s << endl;
	cout << "als int:	" << i << '\t' << (int) c 	<< '\t' << s << endl;

Snoopy88

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2005

Beiträge: 85

Danke, so funktionierts.
Nur tut sich wieder ein neues Problem auf:
Ich kann jetzt Werte mit

Variable=Bla(x,y)

auslesen. Wenn ich aber einen Wert zuweißen will, dann schlägt das Tutorial folgende Lösung vor:

double& operator[](int index)
{
   return m_data[index];
};

Bei mir sieht das dann so aus:

	int& operator() (int x, int y)
	{
		return (int&) sudoku_array[x-1] [y-1] [0];
	};

Jetzt funktioniert zwar das Zuweißen, aber beim Auslesen bekomme ich völlig falsche Werte. Ich hab mir die Zellen des Arrays dann einmal mit dieser Funktion und einmal mit einer anderen hintereinander ausgeben lassen. Das Ergebniss bei der anderen war richtig, die Werte stimmen also, sie werden nur falsch ausgegeben. Ich vermute, dass der Fehler an (int&) liegt, habe aber keine Möglichkeit gefunden, dies zu umgehen. Die Umwandlung ist nötig, da der Array den Typ byte (unsgigned char) hat, ich aber wegen der Unkompliziertheit einen int ausgeben will.

Gibt es da eine Lösung, oder muss ich doch mit einem int-array arbeiten?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Hier bewahrheitet sich wieder "Unreife Optimierung ist die Wurzel allen Übels". ☺
Um ein Performanceproblem zu lösen, daß es gar nicht gibt, wird ein Aufwand getrieben, der sich nicht lohnt, um in Probleme zu laufen, die man sonst nicht hätte.

Antworten |