Moin moin,
heute bin ich mal in eigener Sache aktiv und gleich zu beginn frag ich mich, ob der Threadtitel sehr aussagekräftig ist naja, was solls
Also, ich schreib gerade an einem Programm, mit dem ich dynamisch mit Hilfe von calloc() Speicher für eine Matrix freigeben möchte, um mit ihr später ein paar Berechnungen durchzuführen. Mein bissheriger Code ist folgender:
Code:
#include<stdio.h>
#include<stdlib.h>
double** creat_matrix(int);
int main()
{
int dim, i, j;
double **matrix;
double b;
printf("Bitte Dimension der Matrix eingeben (1,2 oder 3 Dimensionen)!\n");
scanf("%d", &dim);
if(dim < 1 || dim > 3)
{
printf("Die gew%chlte Dimension ist ung%cltig\n",132,129);
return 1;
}
creat_matrix(dim);
for(i = 0; i < dim; i++)
{
for(j = 0; j < dim; j++)
{
printf("Bitte Bitte Element [%d][%d] eingeben!\n",i,j);
scanf("%f", &b);
matrix[i][j] = b;
}
}
free(matrix);
return 0;
}
double** creat_matrix(int i)
{
int size, j;
double **matrix;
//Erstelt 1-dim. Feld (Zeilen) von double-Zeigern
matrix = (double**) calloc(i, sizeof(double*));
//Überprüft, ob calloc()-Aufruf konrekt ablief
if(matrix == NULL)
{
printf("Speicher konnte nicht reserviert werden\n");
//Sollte es zu Problemen gekommen sein, Speicher leeren
free(matrix);
//Programm beenden
return 1;
}
for(j = 0;j < i; j++)
{
//erstellt zur i-ten Zeile ein eindimensionales Feld der Länge i (Spalten)
matrix[j] = (double*) calloc(i, sizeof(double));
//Ist die Speicherreservierung nicht erfolgreich, dann wird jedes zuvor erfolgreich reservierte Feld
//wieder freigegeben
if(matrix[j] == NULL)
{
int x;
for(x = 0; x < j; x++)
{
free(matrix[x]);
}
//gibt zum Schluss den "Zeilen-Zeiger" frei
free(matrix);
printf("Speicher konnte nicht reserviert werden\n");
}
}
return matrix;
}
Mir stellen sich nun zwei Probleme in den weg
1. Wenn ich die Matrix mit
Code:
matrix = (double**) calloc(i, sizeof(double*));
erstelle und danach mit überprüfen will, ob das geklappt hat, dann pfeffert mir mein Compiler nen nassen Waschlappen um die Ohren. Verständlich, denn ich vergleiche int mit double und das geht ja wohl nur in die Hose. Und dann auch noch nen Zeiger. Nur wie bekomm ich die Abfrage sinnvoll übertragen? Das Feld soll eins vom Typ double werden. Weder ein naives noch ein noch das casten von "matrix" hilft da wirklich. Mir ist klar, dass ich dort einen Gedankenfehler mache, der mir grad aber nicht einfallen will.
2. Wenn ich die Abfrage von 1. auskommentiere und es compiliere, dann läuft das auch, nur sobald ich die erste Matrixkomponente abfrage und eingeben will, stirbt mir mein Programm einfach weg. Irgendwo wird er sich da dann wohl im Speicher festfressen, ich versteh nur nicht direkt wo
Ich hoffe, dass mich mal jemand an die Hand nehmen und mich durch das gewirr führen kann
Lesezeichen