Ich muss effizient eine untere Dreiecksmatrix speichern, indem ich nicht alle Nullen im Speicher ablege, also habe ich darüber nachgedacht: Zuerst gebe ich Speicher für jede Zeile, dann für jede Zeile i +1 Bytes, also muss ich mich nie um die Nullen kümmern, aber bei der ersten Zuweisung stimmt etwas nicht. Was mache ich falsch? Dies ist mein Code, und der Compiler beendet das Programm in Zeile 8, gleich nachdem er die Dimension der Matrix gelesen hat.Speichern Sie die Dreiecksmatrix effizient
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, **mat1, dim;
scanf("%d",&dim);
*mat1 = (int**)calloc(dim, sizeof(int*));
for(i = 0; i<dim; i++)
mat1[i] = (int*)calloc(i+1, sizeof(int));
for(i = 0; i < dim; i++)
for(j = 0; j < i+1; j++)
scanf("%d", &mat1[i][j]);
for(i=0; i<dim; i++)
for(j=0; j<(i+1); j++)
printf("%d%c", mat1[i][j], j != (dim-1) ? ' ' : '\n');
return 0;
}
EDIT
ok so, nachdem Sie den Code die Art und Weise zu modifizierten Sie mir geholfen, ich habe ein oberes Dreieck lesen und eine untere Dreiecksmatrix und ihr product.The Problem zeigt damit, dass ich ist Speichern Sie die Nullen nicht im Speicher. Wenn ich also den traditionellen 3-for-Algorithmus verwende, werden einige Junk-Werte angezeigt. Und wenn ich den Rest jeder der Matrizen mit 0 initialisiere, ist es nutzlos, den Speicher dynamisch zuzuweisen, weil ich es tun würde habe auch die Nullen gespeichert, also habe ich nichts getan, um die Effizienz des Speichers zu verbessern. Ich denke, ich muss den Code irgendwo ändern, oder vielleicht die für Intervalle, aber ich modifiziere sowieso den pr ogram gibt immer noch (für 3x3 Matrix) 2 Junk-Werte in der oberen rechten Ecke aus. Wie könnte ich das machen?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,k,**mat1,**mat2,**prod,dim;
printf("Give dimension: \n");
scanf("%d",&dim);
mat1 = (int**)calloc(dim,sizeof(int*));
for(i=0; i<dim; i++)
mat1[i] = (int*)calloc(i+1,sizeof(int));
mat2 = (int**)calloc(dim,sizeof(int*));
for(i=dim-1; i>-1; i--)
mat2[i]=(int*)calloc(i+1,sizeof(int));
prod = (int**)calloc(dim,sizeof(int*));
for(i=0; i<dim; i++)
prod[i] = (int*)calloc(dim,sizeof(int));
printf("Give lower triangular matrix(non 0 values only): \n");
for(i=0; i<dim; i++)
for(j=0; j<i+1; j++)
scanf("%d",&mat1[i][j]);
printf("Give upper triangular matrix(non 0 values): \n");
for(i=0; i<dim; i++)
for(j=i; j<dim;j++)
scanf("%d",&mat2[i][j]);
printf("Matrix A is: \n");
for(i=0; i<dim; i++)
for(j=0; j<dim; j++)
printf("%d%c",j<=i?mat1[i][j]:0,j!=dim-1?' ':'\n');
printf("Matrix B is: \n");
for(i=0; i<dim; i++)
for(j=0; j<dim; j++)
printf("%d%c",j>=i?mat2[i][j]:0,j!=dim-1?' ':'\n');
for(i=0; i<dim; i++)
for(j=0; j<dim; j++)
for(k=0; k<dim; k++)
prod[i][j]+=mat1[i][k]*mat2[k][j];
printf("The product of the two matrix is: \n");
for(i=0; i<dim; i++)
for(j=0; j<dim; j++)
printf("%d%c",prod[i][j],j!=dim-1?' ':'\n');
return 0;
}
Nur eine Anmerkung: * Der Compiler * ist sicherlich nicht "Beenden" Ihres Programms. Der Compiler ist fertig und nicht mehr in der Nähe, wenn Sie Ihr Programm * ausführen *. An diesem Punkt kann es einen Fehler verursachen und vorzeitig beenden. Beschuldige den Compiler nicht! – unwind