Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Übertragung von C++source in C-source

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] > 6 < [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]
050
05.01.2004, 11:51 Uhr
Pablo
Supertux
(Operator)


Und bei welchem Unterpunk (1-3) bekommst du Mist? (ich werde nicht alles lesen, wenn etwas schon richtig funktioniert )


Bearbeitung von Pablo:

Was mir aufgefallen ist:

C++:
matrix = (double*)malloc (n*n*sizeof(double));

             printf(" \"Matrixinvertierung\" gewaehlt\n\n"
                    " Geben Sie den Rang/die Dimension der zu invertierenden Matrix an\n"
                    " (maximal 10): ");            
             scanf("%d", &Rang);
            
             EingabeDerMatrix(mat, Rang);


Du allokiert n*n*sizeof(double) Bytes für matrix, wobei n Anzahl der Zeilen sein soll. Das ist richtig so, aber du lässt von Anfang an n=3. Das heißt, du allokierst immer 9*sizeof(double) Bytes. Wenn aber der Anwender mehr als 3 angibt, z.b. 4 dann greifst du auf den Speicher von matrix, aber dort ist nicht initialisiert. Was ich meine, wenn der Anwender 4 oder 5 eingibt, braucht man 16*sizeof(double) bzw. 25*sizeof(double) aber du hast stets 9*sizeof(double)


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 05.01.2004 um 11:56 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
051
05.01.2004, 11:53 Uhr
Lumina



bei 1! 3 ist ja noch gar nicht angefangen und 2 funzt perfekt
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
052
05.01.2004, 11:59 Uhr
Lumina



ui, klassischer Fall von Copy and paste! Der urprüngliche Source ist ja in C++ von Windalf... meinst du, wenn ich das ändere, dass dann die Sache erledigt ist?

Wenn ich genau diese Funktion loslöse vom ganzen Programm und ein kleines main dafür verwende, gehts komischerweise mit dem gleichen Code!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
053
05.01.2004, 12:02 Uhr
Pablo
Supertux
(Operator)


Noch was, das ist aber kein Fehler. Wenn du mit malloc & co. arbeitest, wäre es besser, wenn du vor der Benutzung des allokierten Speichers immer auf NULL prüfst. Wenn du z.b. viel Speicher willst, aber nicht genügend zur Verfügung steht, dann wird kein Speicher reserviert und bekommst Segmentation Faults.


C++:
typ* var;
var = (typ*) malloc(size*sizeof(typ));
if (var==NULL) {
    fprintf(stderr, "Kein Speicher mehr");
    return 1; // das ist egal, was hier steht, Hauptsache werden die nächsten Zeilen nicht mehr ausgeführt
}
var = ......

...
free(var);



--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
054
05.01.2004, 12:02 Uhr
Lumina



Wie kann ich das anders machen?
Wenn ich die anfängliche Allokierung auf 10 erhöhe, krieg ich noch mehr Mist...
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
055
05.01.2004, 12:05 Uhr
Pablo
Supertux
(Operator)



Zitat:
Lumina postete
Wie kann ich das anders machen?
Wenn ich die anfängliche Allokierung auf 10 erhöhe, krieg ich noch mehr Mist...


Du musst später allokieren, und nur so viel du brauchst.

C++:

             printf(" \"Matrixinvertierung\" gewaehlt\n\n"
                    " Geben Sie den Rang/die Dimension der zu invertierenden Matrix an\n"
                    " (maximal 10): ");            
             scanf("%d", &Rang);
             matrix = (double*)malloc (Rang*Rang*sizeof(double));
             if (matrix==NULL) {
                    fprintf(stderr, "Kein Speicher mehr!\n");
                    exit(1);
             }
             EingabeDerMatrix(mat, Rang);


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 05.01.2004 um 12:05 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
056
05.01.2004, 12:08 Uhr
Lumina



krieg leider immer noch denselben Schmarrn...
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
057
05.01.2004, 12:15 Uhr
Pablo
Supertux
(Operator)


Ich habe so gemacht: (hab was geändert)

C++:
#include <stdio.h>
#include <malloc.h>

void EingabeDerMatrix(double* matrix, int Rang) //hier habe ich so geändert
{
    int Spalte, Zeile;
    int n=0;

    for (Zeile = 0; Zeile < Rang; Zeile++)
        for (Spalte = 0; Spalte < Rang; Spalte++)        
        {
            printf("%d. Zeile, %d. Spalte: ", Zeile+1, Spalte+1);
            scanf("%lf", &matrix[n]);
            n++;
        }
}

int main()
{
    int i, n;
    double* matrix;
    printf("Wir betrachten nur Quadartische Matrizen.\n");
    printf("Geben Sie die Anzahl der Zeilen an: ");
    scanf("%d", &n);
    matrix = (double*) malloc(n*n*sizeof(double));
    if (matrix==NULL) {
        fprintf(stderr, "Kein Speicher mehr!\n");
        return 1;
    }
    EingabeDerMatrix(matrix, n);

    for(i=0; i<n*n; ++i) {
    if (!(i% n)) printf("\n");
        printf("%f ", matrix[i]);
    }
    printf("\n");
    free(matrix);
    return 0;
}



Der Verlauf sieht so aus:

Code:
rex@supertux:~> ./mat
Wir betrachten nur Quadartische Matrizen.
Geben Sie die Anzahl der Zeilen an: 3
1. Zeile, 1. Spalte: 1
1. Zeile, 2. Spalte: 0
1. Zeile, 3. Spalte: 0
2. Zeile, 1. Spalte: 0
2. Zeile, 2. Spalte: 1
2. Zeile, 3. Spalte: 0
3. Zeile, 1. Spalte: 0
3. Zeile, 2. Spalte: 0
3. Zeile, 3. Spalte: 1

1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000



Genau das was ich wollte, eine Einheitsmatrix.


Bearbeitung von Pablo:

Bist du 100% sicher, dass die Eingabe Funktion richtig funktioniert? Dass die eingebenen Daten der Matrix entsprechen?




Bearbeitung von Pablo:


C++:
if (Det(mat,Rang) != 0) MatrInv(mat, Rang);



Welche der beiden Funktionen leifert immer nich richtige Ergebnisse?


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 05.01.2004 um 12:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
058
05.01.2004, 12:20 Uhr
Lumina



was passiert, wenn du
-1
-2
0
-2
3
-3
0
3
3

eingibst?

dann sollte sich

-0.60 -0.20 -0.20
-0.20 0.10 0.10
0.20 -0.10 0.23

ergeben...
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
059
05.01.2004, 12:27 Uhr
Lumina



(Det(mat,Rang) liefert immer das richtige.

bei deiner Bearbeitung krieg ich einen Fehler bei return = 1 !
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] > 6 < [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: