Zus.-setzen einer großen Matrix in C

Hallo,
ich habe ein Problem mit meinem Programm und weiß leider nicht so recht wo der Fehler steckt. Es geht um den Teil „Bau der Matrix (LHS) für das zu lösende Gleichungssystem“. In dieser Funktion soll eine große Matrix erstellt werden, im Bsp. 13x13. Wenn ich das ganze in Dev C++ als .cpp speicher und kompiliere dann gibt er mir die gewünschte Matrix aus, ABER als .c gespeichert leider nicht mehr. Vielleicht kann ja mal jemand drüber sehen und findet das Problem.
Die LHS hat die Form
(0 At E)
(A 0 0)
(E 0 E)
E = Einheitsmatrix, At ist A transponiert, 0 = Nullmatrix.

Ich bin jeder Hilfe dankbar.
Bis dann
Constanze

#include
#include
#include
#include
#include
#include
#define TOL 1.0e-12
#define EPS 1.0e-5

#define ROWS 3
#define COLS 5
#define e(row,col,d) ((col)*d)+(row)

/*---------------------------------------------------------------*/

/* Beispiel Nr.2 */
void initExample_2(double* A, double* b, double* c, double* e,double* x,double* s, double* y)
{
//double Aref[COLS][ROWS] = {{1, 2, 0}, {-1, -1, 1}, {1, 1, -1}, {0, 1, 1}, {1, -2, -4}};
//show(Aref,ROWS,COLS);
//A=&Aref[0];
//show(A,ROWS,COLS);
A[e(0,0,ROWS)] = 1.0;
A[e(0,1,ROWS)] = 2.0;
A[e(0,2,ROWS)] = 1.0;
A[e(0,3,ROWS)] = 0.0;
A[e(0,4,ROWS)] = 0.0;
A[e(1,0,ROWS)] = 1.0;
A[e(1,1,ROWS)] = 1.0;
A[e(1,2,ROWS)] = 0.0;
A[e(1,3,ROWS)] = 1.0;
A[e(1,4,ROWS)] = 0.0;
A[e(2,0,ROWS)] = 0.0;
A[e(2,1,ROWS)] = 3.0;
A[e(2,2,ROWS)] = 0.0;
A[e(2,3,ROWS)] = 0.0;
A[e(2,4,ROWS)] = 1.0;

b[0]=170;
b[1]=150;
b[2]=180;

c[0]=-300;
c[1]=-500;
c[2]=0;
c[3]=0;
c[4]=0;

e[0]=1;
e[1]=1;
e[2]=1;
e[3]=1;
e[4]=1;

x[0]=1;
x[1]=1;
x[2]=1;
x[3]=1;
x[4]=1;

s[0]=1;
s[1]=1;
s[2]=1;
s[3]=1;
s[4]=1;

y[0]=1;
y[1]=1;
y[2]=1;

return;
}

/*------------------------------------------------------------------*/

/*------------------------------------------------------------------*/
/* zur übersichtlicheren Ausgabe */
void show(double* A, int rows, int cols)
{
int row,col;
printf("\n---------------------------------------------------------\n");
for(row=0;row

Hiho

Wenn ich das ganze in Dev C++ als .cpp speicher und
kompiliere dann gibt er mir die gewünschte Matrix aus, ABER
als .c gespeichert leider nicht mehr. Vielleicht kann ja mal
jemand drüber sehen und findet das Problem.

(… aber du kennst die Unterschiede zwischen C/C++ ? - bitte nicht über diese
Frage ärgern :smile:

Wenn du die Datei als .c speicherst, nimmt der Compiler (offensichtlich) an,
das es sich um einen C-Quelltext handelt; wenn du .cpp hast, dann nimmt er C++
an.
Du verwendest aber ein C+±Feature wenn du _zwei_ Funktionen „copy“
definierst, nämlich Funktionsüberladung.
Ergo bekommst du in den Zeilen 96/108 einen Fehler.

Also: eine der beiden Funktionen umbenennen, wenn du in C schreiben willst,
oder es so lassen, wenn du C++ schreiben willst.

(Außerdem fehlen unten noch sigma und mu.)

mfg TLF

Hi,
also ich bin mir der Unterschiede von C und C++ bewusst, auch wenn ich das ganze anders abspeichere, dass er dann andere Kompiler benutzt. Mir hat ein Kumpel dabei geholfen, der allerdings mehr C++ programmiert, aber ich brauche es in C. Die copy-Funktionen habe ich als erstes geändert, eine heißt copy, die andere copy2 (ich arbeite meist am Laptop, der ist nicht mit meinem PC verbunden, weswegen ich das gestern auf die schnelle so nochmal zusammengestellt habe, offensichtlich nicht so gut :smile: weswegen ich auch vergessen habe mu und sigma anzugeben, entschuldigung.)
Also, ich habe es jetzt so, dass er es als .c kompiliert, aber mir bei der LHS immer nur Nullen reinschreibt, was ja nicht richtig ist. Ich weiß halt nicht, was genau in der Funktion „baueMatrix“ nicht stimmt, damit er die Matrix A sowie die Diagonalmatrizen reinkopiert. Stimmt die copy2-Funktion nicht?
Danke für die Hinweise TLF :smile:

MFG, Constanze

#include
#include
#include
#include
#include
#include

#define TOL 1.0e-12
#define EPS 1.0e-5

#define ROWS 3
#define COLS 5
#define e(row,col,d) ((col)*d)+(row)

/*---------------------------------------------------------------------------------*/

/* Beispiel Nr.2 */
void initExample_2(double* A, double* b, double* c, double* e,double* x,double* s, double* y)
{
A[e(0,0,ROWS)] = 1.0;
A[e(0,1,ROWS)] = 2.0;
A[e(0,2,ROWS)] = 1.0;
A[e(0,3,ROWS)] = 0.0;
A[e(0,4,ROWS)] = 0.0;
A[e(1,0,ROWS)] = 1.0;
A[e(1,1,ROWS)] = 1.0;
A[e(1,2,ROWS)] = 0.0;
A[e(1,3,ROWS)] = 1.0;
A[e(1,4,ROWS)] = 0.0;
A[e(2,0,ROWS)] = 0.0;
A[e(2,1,ROWS)] = 3.0;
A[e(2,2,ROWS)] = 0.0;
A[e(2,3,ROWS)] = 0.0;
A[e(2,4,ROWS)] = 1.0;

b[0]=170;
b[1]=150;
b[2]=180;

c[0]=-300;
c[1]=-500;
c[2]=0;
c[3]=0;
c[4]=0;

e[0]=1;
e[1]=1;
e[2]=1;
e[3]=1;
e[4]=1;

x[0]=1;
x[1]=1;
x[2]=1;
x[3]=1;
x[4]=1;

s[0]=1;
s[1]=1;
s[2]=1;
s[3]=1;
s[4]=1;

y[0]=1;
y[1]=1;
y[2]=1;

return;
}

/*-----------------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------------------------*/
/* zur übersichtlicheren Ausgabe */
void show(double* A, int rows, int cols)
{
int row,col;
printf("\n----------------------------------------------------------------\n");
for(row=0;row

hiho

Danke für die Hinweise TLF :smile:

huh, ja, nichts für ungut - hätte doch sein können …
also wenn kein anderer was dran macht, dann kann ich nachm wochende was dazu schreiben, aber das bedeutet ja, das ich mir direkt angucken muß, was der code eigentlich erreichen will :wink:
mfg TLF

Ich hab mein Problem gelöst.

ich hätte sonst angemerkt, das in baue_matrix das erneute Anlegen von M fehlerhaft ist (und es ohne das funzt)