Benötige Hilfe bei Wegematrix-Programm
-
Hi!
Ich sitze seit einigen Stunden an einem Programm und habe es fast fertig..
Jedoch sind da noch ein paar Fehler drin, bei welchen ich nicht so richtig weis wo die her kommenKönnte da mal jmd bitte drüber gucken :)?
Größten Dank schon mal im Voraus!!!
-----
Also die Aufgabe ist aus einer uns gegebenen Adjazenzmatrix eine Matrix zu erstellen in welcher die anzahl an schritten die man von einem zum anderen Punkt benötiogt drinn steht...
So hier mal der Quellcode den ich geschrieben habe:
(Was da als Kommentar drinn steht ist zum teil ne anndere Teilaufgabe bei der wir gucken sollen ob von jedem Punkt zu jeden anderen eine Verbindung besteht und welche die längste Verbindung zwischen 2 Punkten ist)#include <stdio.h> #include <stdlib.h> #define N 12 void ausgabe(char *nachricht, char * orte, int m[N][N]) { int i, j; printf("\n %s \n\n ", nachricht); for (j = 0; j<N; j++) printf(" %3c ", orte[j]); printf("\n"); for (i = 0; i<N; i++) { printf("%c ", orte[i]); for (j = 0; j<N; j++) printf(" %3d ", m[i][j]); printf("\n"); } } int Pfad(int s[N][N], int Zeile, int Spalte, int Ziel, int d, int dmin) { int m = 0; if (s[Zeile][Ziel] == 1) { if (d > N){ d = -1; return d; } else { d = d + 1; if ((d < dmin) || (dmin < 0)) return d; else return dmin; }} else { for (Spalte = 0; Spalte < N; Spalte++) { if (s[Zeile][Spalte] == 1) { d = 1 + d; return Pfad(s, Spalte, m, Ziel, d, dmin); } } } } int init_V(int s[N][N], int Zeile, int Spalte) //Funktion zur Initialisierung der V-Matrix { int dmin = -1; int d = -1; if (Zeile == Spalte) return 0; else { if (s[Zeile][Spalte] == 1) return 1; else { d = Pfad(s, Zeile, Spalte, Spalte, d, dmin); return d; } } } void init_S(int m[N][N], int mnr) { int i, j; unsigned int seed; if (mnr<20000 || mnr>50000) { printf("Matrikelnummer nicht im erlaubten Bereich, Abbruch\n"); exit(-1); } //test mnr seed = (unsigned int)((float)(mnr - 20000) / 30000.0*RAND_MAX); srand(seed); for (i = 0; i<N; i = i + 1) //erstellt 12x12Matrix, erst spalte for (j = 0; j<N; j = j + 1) // dann zeile { if (i == j) m[i][j] = 0; else { if ((float)rand() / (float)RAND_MAX>0.7) //generiert Zahl von 0.0 bis 1.0 m[i][j] = 1; //rnd >0.7 => 1 else m[i][j] = 0; //rnd <0.7 => 0 } } printf("S-Matrix fuer Matrikelnr: %d erfolgreich erzeugt\n", mnr); } /* char morph(int max){ switch (max) { case 0: return 'A'; case 1: return 'B'; case 2: return 'C'; case 3: return 'D'; case 4: return 'E'; case 5: return 'F'; case 6: return 'G'; case 7: return 'H'; case 8: return 'I'; case 9: return 'J'; case 10: return 'K'; case 11: return 'L'; } } */ int main() { char bez[N] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L' }; int S[N][N]; int V[N][N]; int i, j; // int vmax, imax, jmax; init_S(S, 36557); // hier Ihre Matrikelnummer als zweiten Parameter eintragen ausgabe("S-Matrix", bez, S); // hier Ihre Programmerweiterung for (i = 0; i < 12; i++) for (j = 0; j < 12; j++) { V[i][j] = init_V(S, i, j); /* t=test(V[i][j],t); max(V[i][j], *vmax, *imax, *jmax); */ } ausgabe("V-Matrix", bez, V); /* if (t==-1) printf("\n Nicht jeder Knoten ist von jedem anderen aus erreichbar.\n"); else printf("\n Jeder Knoten ist von jedem anderen aus erreichbar. \n"); char zmax = morph(imax); char smax = morph(jmax); printf("\n Die längste Verbiundung besteht zwischen %c und %c und ist %d Schritte lang. \n") */ return 0; }
Und das bekomm ich als "Fehler":
1>------ Erstellen gestartet: Projekt: APL Programm, Konfiguration: Debug Win32 ------
1> APL Programm.cpp
1>d:\eigene dateien\desktop\apl programm\apl programm\apl programm.cpp(54): warning C4715: "Pfad": Nicht alle Steuerelementpfade geben einen Wert zurück.
1> APL Programm.vcxproj -> D:\Eigene Dateien\Desktop\APL Programm\Debug\APL Programm.exe
========== Erstellen: 1 erfolgreich, 0 fehlerhaft, 0 aktuell, 0 übersprungen ==========
-
Du kannst die Funktion Pfad verlssen, ohne das da ein return steht.
Oder wie der erste (Bekannte Suchmaschine)-Treffer zeigt: http://msdn.microsoft.com/de-de/library/6deaf4k9.aspx
-
sry kannst du das nen bissl genauer beschreiben für meinen fall?
ich verstehs zwar im ansatz (also das irgend eine if lösung nix zurück gibt)
aber mein Problemn ist ja eher das ich nicht weis welche das ist
-
Siehe Zeile 44: kann unter diesen Bedingungen die Funktion Path immer mit einem return beendet werden?
-
int Pfad(int s[N][N], int Zeile, int Spalte, int Ziel, int d, int dmin) { int m = 0; if (s[Zeile][Ziel] == 1) { if (d > N) { d = -1; return d; } else { d = d + 1; if ((d < dmin) || (dmin < 0)) return d; else return dmin; } // Bis hier hat jeder Zweig ein return } else { for (Spalte = 0; Spalte < N; Spalte++) { if (s[Zeile][Spalte] == 1) // Wenn dieser Fall nie eintritt { d = 1 + d; return Pfad(s, Spalte, m, Ziel, d, dmin); // gibt es kein return } } // denn irgendwann ist die Schleife zu Ende // Hier ... } // ... oder hier kannst du das return machen }
Ob dieser Fall nie eintritt, liegt ja auch an deinen Daten.
Wenn du sagst, der Tritt auf jeden Fall ein, ist die Sache in Ordnung.Allerdings schadet es dann ja auch nicht, da noch ein return einzubauen.
Es ist eine Warnung vom Compiler. Damit unterstützt dich der COmpiler, mögliche Fehler zu finden.
Wenn du weißt was du tust (aber nur dann), kannst du Warnungen ignoroeren.
Aber es gibt immer Möglichkeiten, das Programm ohne Warnungen zu compilieren.
(Hier kannst du das return bei "... oder hier" einfügen)
-
ahh okay
super!!
kann ich da jetzt einfach nen return an die stelle schreiben oder gibt es ne möglichkeit zu gucken ob die for schleife was zurück gibt?
-
marking587 schrieb:
kann ich da jetzt einfach nen return an die stelle schreiben oder gibt es ne möglichkeit zu gucken ob die for schleife was zurück gibt?
Es ist dein Programm. Du musst doch wissen ob dieser Fall jemals eintreten kann.
Du kannst da return hin schreiben (aber nur mit Rückgabewert)
Gib einen unsinnigen Wert zurück (wenn es den gibt. -1 oder -2 oder INT_MIN).
Oder mach noch ein assert(0). Aber dann ist dein Programm zuende.
-
Na dass Problem ist das der eigentlich immer die gesamte schleife durchlaufen soll und erst wenn er alle möglichkeiten probiert hat was zurück geben soll
Das macht es aber nicht sondern geht nur einen weg (den es halt als erstes findet)..
Ich weis jetzt halt nicht genau wie ich den dazu bringe quasi erst alle schleifen durchzulaufen und dann zu entscheiden ob er ne -1 zurück gibt.
-
Also mein Problem ist quasi hier drin:
siehe Zeile 22:int Pfad(int s[N][N], int Zeile, int Spalte, int Ziel, int d, int dmin) { int m = 0; if (s[Zeile][Ziel] == 1) { if (d == N){ return -1; } else { d = d + 1; if ((d < dmin) || (dmin < 0)) return d; else return dmin; }} else { for (Spalte = 0; Spalte < N; Spalte++) { if (s[Zeile][Spalte] == 1) { d = 1 + d; Pfad(s, Spalte, m, Ziel, d, dmin); //wenn er hier rein springt und dann nix findet muss er wieder raus und die schleife beenden.. //und erst wenn er alle schleifen durch ist muss er -1 zurückgeben } } } }
Kann mir irgendjemand erklären wie ich das anstellen soll?
-
Steht die -1 für nicht gefunden?
Und wenn er was findet, ist dann Schluss mit der Schleife?int dd; ... /*22*/ dd = Pfad(s, Spalte, m, Ziel, d, dmin); if (dd != -1) return dd; .... return -1; // Funktion ist hier zu Ende. Nichts gefunden. }
-
Ne das funktioniert immer noch nicht