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

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

1

02.01.2011, 10:19

Struktur mittels Zeiger an Funktion übergeben

Hallo,

ich soll bis Semesterende einen kleinen Sudoku-Löser programmieren. Da wir bei "größeren" Datenmengen Call-by-Value vermeiden sollen, will ich das ganze SUdoku-Feld mittels Zeiger an die Funktion übergeben, allerdings will das einfach nicht so, wie ich das gerne hätte.

Ich habe oben meine Struktur:

C-/C++-Quelltext

1
2
3
struct Sudoku {
    int Feld[9][9];
} S;

Prototyp für Funktion Einlesen:

Quellcode

1
int Einlesen(char *, struct Sudoku *); 

Aufruf der Funktion:

C-/C++-Quelltext

1
Einlesen(Pfad, &S);

Funktion:

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
int Einlesen(char *Dateiname, struct Sudoku *S){
    
    FILE *Datei;
    int i, j;
    Datei = fopen(Dateiname, "r");
     
    if (Datei != NULL){
     char Buffer[100];
     printf("Datei %s erfolgreich ge%cffnet.", Dateiname, char(148));
     
     for (i = 0; i < 9; i++){
         //In Buffer zwischenspeichern, 100 Zeichen lesen, aus Stream "Datei" auslesen.
         fgets(Buffer, 100, Datei);
         for (j = 0; j < 9; j++){
             Temp[i][j] = Buffer[j] - '0'; //- '0' um in ASCII umzuwandeln    
         }
     }
     fclose(Datei);
     printf("\nSudoku erfolgreich geladen.\n\n");
    }
    else {
     printf("Datei %s konnte nicht ge%cffnet werden.", Dateiname, char(148));
     return 0;
    }
    
    return 1;
}


Wenn ich jetzt aber auf S zugreifen will, findet er die Komponente Feld nicht, d.h. ich habs falsch übergeben oder sonst einen Fehler gemacht, nur welchen? Ich lese derzeit das Sudoku ein, speichere es in einem temporären Array und weise dann meinem Sudoku-Feld die Werte des temporären Feldes zu, was ja nicht sinnvoll ist :D

Vielleicht kann mir ja hier jemand helfen, ich muss ja auch später das Sudoku in andere Funktionen übergeben.
Danke schonmal ;)

2

02.01.2011, 11:11

Halbwissen... vergiss es :S

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

02.01.2011, 11:36

pprenzel: nanana! nicht jemanden für fehlendes Anwendungswissen verurteilen! jeder hat mal angefangen und ist an elementaren sachen gescheitert. dann schreib nicht, wenn dir das zu blöd ist.

@affje: du kannst dir schonmal die struktur sparen und direkt das array übergeben. Arrays sind im prinzip nichts anderes als zeiger, daher geht es so:

deine funktion, die es erhält:

C-/C++-Quelltext

1
2
3
4
void Sudoku(int *feld)
{
    //...
}


deine daten:

C-/C++-Quelltext

1
int Feld[9][9]


dein aufruf:

C-/C++-Quelltext

1
Sudoku(Feld);


so einfach ist das. In C++ ist Call By Value standard und umgeht man mit zeigern oder referenzen - da Arrays zeiger sind ist das einfach das logischste :)

Elmaron

unregistriert

4

02.01.2011, 11:51

(entfernt weil veraltet)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Elmaron« (07.01.2020, 23:11)


TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

02.01.2011, 11:57

Gut ich habe mich vllt etwas undeutlich ausgedrückt in Bezug auf Arrays:

C-/C++-Quelltext

1
int feld[12];


der Bezeichner feld ist nichts anderes als ein zeiger auf den Stack - wenn der herr auf klugscheisser machen muss ;) - es geht ums prinzip!

Ja das mit dem Zweidimensionalen Array habe ich übersehen - machst ein eindimensionales draus und es funktioniert einwandtfrei.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

02.01.2011, 11:59

müsst du das in reinem C schreiben? das nächste mal bitte die sprache angeben^^

was habt ihr denn gegen die struktur? ich würde das ebenso machen und in ihr die größe des felds und die lösung speichern. in c++ noch passende methoden dazu schreiben(dann natürlich als klasse)
wenn er jetzt nur den zeiger aufs array übergibt und ihm später einfällt, dass er es so wie ich machen will, muss er alles ändern.

@affje: willkommen im forum. als erstes solltest du globale variablen vermeiden um ein gefühl für den gültigkeitsbereich der variablen zu bekommen. Die funktion könnte Temp[][] nur kennen wenn Temp[][] global wäre. auf den übergeben wert kannst du mit hilfe des bezeichners des parameters zugreifen(eigentlich logisch oder?)
wenn ich mich nicht irre dürfte der zugriff so aussehen:

C-/C++-Quelltext

1
S->Feld[i][j]


an deiner stelle würd ichs aber mit etwas einfacheren und kleinerem programm als nem sodukolöser probieren. ;)
ausserdem empfiehlt es sich die bezeichner auszuschreiben.


edit: die unteren posts wurden hierher verschoben
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (02.01.2011, 12:35)


Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

7

02.01.2011, 15:48

Danke erstmal für die vielen Antworten hier.
Ich hab das ganze jetzt hinbekommen, es lag - wie so oft - an einem Denkfehler. Ich habe den "->"-Operator benutzt, jetzt geht es.

Und ppretzel, ich habe ja nicht gesagt, dass ich ein super-mega-toller Programmierer bin, sondern habe mich eben aus dem Grund meines Halbwissens hier angemeldet, um dieses eben zu verbessern und künftig solche (Denk-)Fehler zu vermeiden.

Und NachoMan, mir wäre eine "leichtere" Aufgabe auch lieber, aber das ist nunmal die Aufgabe vom Professor :D

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

02.01.2011, 15:49

Und ppretzel, ich habe ja nicht gesagt, dass ich ein super-mega-toller Programmierer bin, sondern habe mich eben aus dem Grund meines Halbwissens hier angemeldet, um dieses eben zu verbessern und künftig solche (Denk-)Fehler zu vermeiden.

Das war wohl auf sein Halbwissen bezogen und nicht auf dich. ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

02.01.2011, 15:55

mit leichterer aufgabe war ein übungsprogramm gemeint das du nur für dich schreibst ;)
wie heißt es so schön? nicht für die schule(uni xD) lernen wir sondern für das leben(was unter gewissen umständen die uni werden kann *grins*).
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

10

02.01.2011, 15:58

mit leichterer aufgabe war ein übungsprogramm gemeint das du nur für dich schreibst ;)
wie heißt es so schön? nicht für die schule(uni xD) lernen wir sondern für das leben(was unter gewissen umständen die uni werden kann *grins*).
Da hast du natürlich recht. Ich hab noch vier Wochen Zeit, das Programm fertig zu stellen. Ich hoffe, dass ich das bis dahin gebacken bekomme, ich kann das Sudoku jetzt zwar fehlerfrei von der Text-Datei laden, aber nunja...das Lösen ist halt was ganz anderes :D

Werbeanzeige