Nach Update Programmabstürze
-
Ooookay, ich habe jetzt einfach mal so ins Blaue Deinen Code hier in meinem VS2005 reingepastet und F7 gedrückt. Folgende Fehlerchen zeigt mir der VC an:
-
Gleich in der ersten Zeile Deiner main() wird HEAD verwendet. Ist das ein define der uns hier fehlt, oder eine Funktion bei der die Klammern vergessen wurden?! In Deinem Post auf jedenfall erstmal unbekannt, daher fehlerhaft.
-
In Deiner Funktion mat1() hast Du int** als Rückgabewert, Du hast aber zwei returns hintereinander, wovon eine eine Lokale ist, was nicht funktioniert...
Weitere Anmerkungen:
Initialisiere Deine Variablen bitte vorher, auch wenn es nur mit 0 oder irgendwas ist. Weniger Fehleranfällig...
-
-
So habe jetzt mal des angesprochene geändert und die Warnings mit rein kopiert, aber jetzt wird in die letzten beiden Funktionen die dim1 nicht mehr übergeben den mat 3 mus genauso groß werden wie mat 1. Hat da jm. einen Ratschlag?
-
Geht net ist keine Fehlerbeschreibung

-
ChrisTucker schrieb:
So habe jetzt mal des angesprochene geändert und die Warnings mit rein kopiert, aber jetzt wird in die letzten beiden Funktionen die dim1 nicht mehr übergeben den mat 3 mus genauso groß werden wie mat 1. Hat da jm. einen Ratschlag?
Also das oben waren ja nur Warnungen. Dein Code ist immernoch kompilierbar. (Falls du einfach andere Werte bekommst, würde ich die Warnungen mal lesen und sie dir zu gemüte führen. Variablen sollten immer initialisiert werden. Auch wenn es nur 0 ist).
-
Also Syntax stimmt allerdings, Allerdings klappt jetzt nach den Änderungen folgendes nicht meh1. in mat1 wird ein Wert per tastatur für dim1 zugewisen. dieser Wert muss auch mit in die unteren Funktionen übernommen werden. Das passiert aber nicht da ja das return weg ist.
Desweiteren kommt folgende Fehlermeldung beim Kompilieren.
Und zwar in dieser Reienfolge.Run-Time Check Failure #3 - The variable 'matrix' is being used without being initialized. Run-Time Check Failure #3 - The variable 'matrix2' is being used without being initialized. Run-Time Check Failure #3 - The variable 'matrix2' is being used without being initialized. Run-Time Check Failure #3 - The variable 'matrix' is being used without being initialized. Run-Time Check Failure #3 - The variable 'matrix3' is being used without being initialized. Run-Time Check Failure #3 - The variable 'matrix3' is being used without being initialized.addmatrix findet garnicht statt -> Programmabsturz kommt schon vorher
-
Hallo Tucker,
schau Dir mal Deine addmatrix() genauer an:
int** addmatrix (int **matrix3) { int dim1=0; int **matrix; int **matrix2; int w=0,q=0; int summe=0; for (int q =0; q<dim1; q++) { for ( int w =0; w<dim1; w++) //Matrizenaddition { summe=0; summe = matrix[q][w] + matrix2[q][w]; matrix3[q][w]=summe; } } return (matrix3); }In der zweiten und dritten Zeile deklarierst Du die Variablen matrix und matrix2 vom Typ int**. Da Du diesen Variablen NIE einen Wert zuteilst, erhälst Du
a) sog. undefiniertes Verhalten da Du nicht weißt wie das Program darauf im Laufe der Ausführung reagiert und
b) die Fehlermeldungen die Du gerade gepostet hast.Diese beiden Variablen werden nie mit irgendwelchen Werten gefüllt, bzw. die Pointer nie irgendwo hin gelget, trotzdem verwendest Du sie aber, als ob es nicht so wäre. Da solltest Du anfangen...
EDIT: Sehe gerade, Du hast die beiden Variablen jetzt mit 0 initialisiert. Dürfte Dir aber trotzdem nichts bringen, da sie dennoch nie einen "echten" Wert haben...
-
Hallo wie habe ich das zu verstehen das sie keinen echten Wert haben? Was kann ich tun um das ganze lauffähig zu bekommen?
-
ChrisTucker schrieb:
Hallo wie habe ich das zu verstehen das sie keinen echten Wert haben? Was kann ich tun um das ganze lauffähig zu bekommen?
Du hast dort lediglich einen Zeiger. Du musst da also irgendwo noch den Speicher reservieren für das Array, dass sich dann da dahinter befindet. Also mit new/delete([]) arbeiten. Aber bevor du jetzt das einfach mal irgendwie probierst, würde ich dir empfehlen mal die Grundlagen nochmal zu checken. Vor allem über Zeiger, Array's, dynamische Speicheranforderung (new) usw.
Es hat keinen Sinn da jetzt einfach etwas reinzusetzen, wo du nicht verstehst, was es macht. Das kostet nur Nerven (unsere und deine).
-
Was ich auch noch kurz anmerken wollte:
void main()ist weder C noch C++
es muss
int main ()heißen
bb ^^
-
Hallo,
Du musst das so sehen:
int **matrix = 0; // = NULLMit dieser Zeile deklarierst Du, wie es für eine einfache Matrix auch richtig ist, einen Zeiger, auf einen Zeiger, auf einen Integer. Somit erhälst Du eine quasi zweidimensionale Matrix - soweit ist das ja korrekt. Was Du damit bis jetzt jedoch erreichst ist nur, dass Du dem Programm sagst, dass es eine Matrix gibt, aber nicht was da drin steht, geschweigedenn wo sie sich überhaupt im Speicher Deines Rechners befindet.
Da wir Dir geraten haben Deine Variablen zu initialisieren, hast Du das '= 0;' dahinter geschrieben. Wird das hier so an dieser Stelle gemacht, legst Du gleichzeitig fest, auf welche Stelle im Speicher Dein Pointer zeigen soll - in diesem Fall NULL, was salopp ausgedrückt so viel bedeutet wie "in ein schwarzes Loch".
Wenn Du Dir mal ganz kurz Deine mat1() anschaust, siehst Du, wie Du neuen Speicher reservierst und gleichzeitig die Postition Deiner Matrix festlegst:
matrix = new int* [dim1]; for (i = 0; i < dim1; i++) matrix[i] = new int[dim2];Zuerst allokierst Du Speicher für Deine erste Dimension der Matrix, dann läufst Du mit der Schleife durch jede durch, und allokierst die Zweite. Somit ist in dem Fall Deine Matrix fest definiert (die Werte die da jetzt aber defacto drinstehen sind zu diesem Zeitpunkt unwillkürlich).
Noch einmal zurückgesprungen zu Deiner Deklaration in addmatrix() fehlt diese Speicherzuordnung völlig. Du verwendest praktisch etwas, was garnicht, oder besser ausgedrückt irgendwo wo es nicht zu finden ist, verwendest.
Ich habe jetzt zwei Gedanken:
-
Du hast einfach vergessen die Pointer Deiner Matrix irgendwo hin zu legen, oder
-
Du hattest Dir gedacht, dass die Variablen in Deiner mat1() und der addmatrix() ein und diesselben sind. Das ist allerdings ein falscher Gedanke, denn sie teilen sich nur den Namen, nicht den Speicherbereich. Du könntest, falls ich mit dieser Vermutung richtig liege, besagte Variablen entweder global deklarieren, damit sie im gesamten Namensraum gelten unabhängig vom Gültikeitsbereich der Funktionen, oder Du übergibst die Pointer mittels Rückgabewerten und Übergabeparametern irgendwie von mat1() nach addmatrix().
P.S.: Jedesmal, wenn Du mit dem new-Operator Speicher allokierst, passiert das dynamisch - er wird auf dem Heap anstatt auf dem Stack abgelegt. Solange Du keine "intelligenten" Zeiger verwendest (was Du hier nicht machst), bist Du selber dafür verantwortlich, dass dieser Speicher wieder freigegeben wird sobald Du ihn nicht mehr benötigst. Tust Du das nicht frisst Dir Dein Programm bei jeder Ausführung immer etwas Speicher weg ohne dass es ihn wieder hergibt. Bei Deinem kleinen Programm jetzt nicht unbedingt schlimm, aber bei größeren Projekten wirklich fatal. Freigeben kannst Du den Speicher mittels dem Operator delete und seinem Derivat delete[]:
#define SIZE 128 int *i = new int; // Speicher wird allokiert int *i2 = new int[SIZE]; // Speicher wird allokiert delete i; // Speicher wird freigegeben delete[] i2; // Speicher wird freigegebenund die Anmerkung von unskilled: Recht hat er

EDIT: Und drakon hat recht. Gerade Zeiger sind ein essentielles aber genauso komplexes Thema. Wenn Du da unsicherheiten hast, versuche einige kleinere Übungen mit Pointern und Referenzen.
-