Matrix erstellen mit header Datei

BasicC

Erfahrenes Mitglied
Morgen Leute,
Code:
main.c

   #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "myfuncs.h"
   int main (){
   
    enum {dim=3};
    double mat[dim][dim]= {0};
   
    double vec_a[dim];
    double vec_b[dim] = {0};
    double ;
    FILE *fp;
   
    if((fp=fopen("/Users/********/Desktop/INF 1/INF 1/Übg4/A4-3.txt" , "r"))==NULL) {
        fprintf(stderr, "Konnte Datei nicht finden\n");
        return 1;
       
        while(read_mat(mat,fp)){
            printf("Originale-Matrix\n");
            print_mat(mat);
           
            transp_mat(mat);
            printf("Transponente Matrix\n");
            print_mat(mat);
        }
        fclose(0);
       
       
        }
    }
   
[ATTACH=full]65358[/ATTACH]
myfuncs.c

#include "myfuncs.h"
#define myfuncs_h
#include <math.h>
#include <stdlib.h>
enum {DIM=3};
void func1(..);
int func2(..);
#endif

int main(void){

int read_mat(double mat [DIM][DIM]; FILE *fp);
void print_mat(double mat[DIM][DIM]);
void transp_mat(double mat[DIM][DIM]);
void swapd(double *a, double *b);
}

upload_2017-12-18_10-22-56.gif
Code:
myfuncs.h

   #ifndef MYFUNCS//.h //
#define MYFUNCS//.h//
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
   enum {DIM=3};
   void func1();
int func2();
   #endif
upload_2017-12-18_10-22-56.gif
Also ich habe etwas an meiner main.c Datei gearbeitet was muss ich in der main.c Datei machen genau um zur myfuncs.c Datei zu wechseln und wozu dient die Header Datei dabei.?
Ich weiß ist etwas dürre hab mich mit der main.c Datei mehr beschäftigt.
 

Anhänge

  • upload_2017-12-18_10-22-56.gif
    upload_2017-12-18_10-22-56.gif
    43 Bytes · Aufrufe: 1

cwriter

Erfahrenes Mitglied
Ich weiß ist etwas dürre
Definitiv.

hab mich mit der main.c Datei mehr beschäftigt.
Ach komm, sei wenigstens ehrlich. Du hast einfach die Funktionsdeklarationen da reinkopiert. Das kompiliert ja nicht einmal.

Ich schreibe dir noch immer keinen Code, beantworte aber deine Frage:

upload_2017-12-18_10-22-56-gif.65360
Also ich habe etwas an meiner main.c Datei gearbeitet was muss ich in der main.c Datei machen genau um zur myfuncs.c Datei zu wechseln und wozu dient die Header Datei dabei.?
C kennt sogenannte Compilation Units.
Wenn du den Compiler über eine .c (.cpp)-Datei laufen lässt, erstellt er dir eine .o (object)-Datei. Diese beinhaltet die Funktionen im Maschinencode und einige Metainformationen. Das wird für jede .c-Datei so gemacht, sodass du am Ende eine oder mehrere .o-Dateien hast.
Wenn du eine Funktion aufrufst, die in einer anderen .c-Datei ist, dann wird im .o-Code nur ein Platzhalter als Verweis auf diese Funktion eingefügt.
Z.B.:
C:
//Datei A.c
void funcA()
{
    funcB();
}

//Datei B.c
void funcB()
{

}

Wenn der Compiler über die A.c geht, kennt er die Funktion "funcB" nicht. In diesem Fall würde er ein "-Wimplicit-declaration" ausgeben: Die Funktion "funcB" wurde nicht deklariert, der Compiler kann also nicht prüfen, ob die Funktion korrekt benutzt wird (richtiger Rückgabetyp, richtige Argumente, ...).
Die A.o wird dennoch erstellt, nur ist das nicht ausführbar. Es wird statt "funcB()" ein "Füge den Aufruf von funcB hier ein, wenn die Funktion bekannt ist".
Dann kommt der Linker, der nach diesen Verweisen sucht und dann die korrespondierende Definition in den Object Files sucht und einfügt. Wenn die Funktion dann immer noch unbekannt / nicht definiert ist, dann gibt es einen Fehler.

Nun ginge das recht gut, aber Programmierer haben ein schlechtes Gedächtnis. Daher gibt es die Funktionsdeklarationen.

C:
//Datei A.c
#include "B.h"
void funcA()
{
    funcB();
}

//Datei B.c
void funcB()
{

}

//Datei B.h
#pragma once //Include Guard

void funcB();

So gibt es keinen "implicit declaration error" mehr, die Deklaration steht ja explizit da: Sie wird durch das #include direct in die A.c kopiert, bevor die Funktion benutzt wird. Wäre das #include am Ende der Datei, gäbe es noch immer einen Fehler.

Zu den Include Guards (#ifdef DATEI_H #define DATEI_H ... #endif:
Die werden benötigt, wenn Variablen definiert werden.
(int i; //Deklaration)
(int i = 0; //Definition).

Das Problem: Wenn du eine Headerdatei mehrmals (in unterschiedlichen Dateien, in der selben Datei oder rekursiv o.ä.) inkludierst, würde mehrmals ein int i = 0; int i = 0; ... dastehen, sodass dasselbe Symbol mehrmals vorkäme, womit der Compiler nicht umgehen kann.

Warum benutzt man nun Header?
Zum einen lassen sich Compilation Units relativ gut parallelisieren, sie hängen nicht voneinander ab. Würdest du die .c-Datei inkludieren, hättest du diesen Vorteil nicht mehr.
Wenn du gar keine .c-Datei, sondern eine Bibliothek (.a/.lib) bekommst, dann hilft der Header, die richtige Funktion zu finden. Zu guter Letzt wird es bei den Overloads von C++ so unübersichtlich, dass nur noch ein Compiler das Name Mangling einigermassen stabil umsetzen kann.



Zu deinem Code:
enums sind nicht dafür gedacht. Nutze #define oder const int (oder, unter C++, constexpr).

Dein return 1 lässt den Rest des Codes gar nicht ausführen, deine geschweiften Klammern sind falsch.
fclose(fp) sollte statt fclose(0) hin.

(Mit diesen Verbesserungen läuft der Code immer noch nicht, weil es so viele Syntaxfehler drin hat, da mache ich mir gar nicht die Mühe der tiefen semantischen Analyse. Gib dir mehr Mühe, dann gebe ich auch mir mehr Mühe)

Gruss
cwriter
 

BasicC

Erfahrenes Mitglied
Code:
#include <stdio.h>

#include <stdlib.h>

#include "matrix.h"





int main(){



    FILE *fp;



    double mtx[DIM][DIM];

    int count=0;



    if((fp=fopen("/Users/********/Desktop/INF 1/INF 1/Übg4/A4-3.txt","r"))==NULL){

          fprintf(stderr, "Datei 'A4-3.txt' kann nicht geöffnet werden");

          return 1;

    }

   



    while (read_matrix(fp,mtx)){

        /*Ausgabe der Matrix*/

        count++;

        printf("\n%d. Originalmatrix \n\n",count);

        print_matrix(mtx);

        /*Transponieren der Matrix*/

        printf("\n");       

        transp_matrix(mtx);

        /*Ausgabe der Transp. Matrix*/

        printf("%d. Transponierte Matrix \n\n",count);

        print_matrix(mtx);

        printf("\n");         

    }



    fclose(fp);



    return 0;



}

Ich hab mich jetzt auf die C Datei konzentriert .
Wie fahre ich jetzt fort ?
 

cwriter

Erfahrenes Mitglied
Muss ich nun Funktionen schreiben wie ich was berechne ?

int read_mat(double mat [DIM][DIM]; FILE *fp);
void print_mat(double mat[DIM][DIM]);
void transp_mat(double mat[DIM][DIM]);
void swapd(double *a, double *b);
Diese vier Funktionen musst du inplementieren. Was eine Transponierte Matrix ist, kannst du googlen. Swap-Funktionen ebenfalls.
Tipp:
Implementiere zuerst read_mat, dann print_mat, dann swap, dann transpose_mat.

cwriter
 

BasicC

Erfahrenes Mitglied
Code:
# include "myfuncs.h"



int read_matrix (FILE *fp,

                double mtx[DIM][DIM]){

    int i,j;

   

    double zahl=0;

    for (i=0;i<DIM;i++){

        for (j=0;j<DIM;j++){

            if (fscanf(fp,"%lf",&zahl)==1){

                mtx[i][j]=zahl;

            }else{

                return 0;

            }

        }

    }

    return 1;

}

void print_matrix (    double mtx[DIM][DIM]){

   

    int i,j;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<DIM;j++){

            printf("%4.2lf ",mtx[i][j]);

        }

        printf("\n");

    }

}

void transp_matrix (    double mtx[DIM][DIM]){

   

    int i,j;

    double temp;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<i;j++){

            temp=mtx[i][j];

            mtx[i][j]=mtx[j][i];

            mtx[j][i]=temp;

            void swapd(double *i, double *j);

        }

    }

}

ist die swap Funktion an der richtigen Stelle ?
 

BasicC

Erfahrenes Mitglied
Code:
# include "myfuncs.h"



int read_matrix (FILE *fp,double mtx[DIM][DIM]){

   

    double i,j;

    double zahl=0;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<DIM;j++){

           

            if (fscanf(fp,"%lf",&zahl)==1){

               

                mtx[i][j]=zahl;

               

            }else{

                return 0;

            }

        }

    }

    return 1;

}

void print_matrix (double mtx[DIM][DIM]){

   

    double i,j;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<DIM;j++){

           

            printf(" %4.1lf ",mtx[i][j]);

        }

        printf("\n");

    }

}

void transp_matrix (double mtx[DIM][DIM]){

   

    int i,j;

    double temp;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<i;j++){

           

            void swap(double *i,double *j);

            double t = *i;

            *i = *j;

            *j = t;

        }

        }

    }

Also der gibt mir den Fehler Array subscript is not an integer -.-
 

BasicC

Erfahrenes Mitglied
Code:
# include "myfuncs.h"



double read_matrix (FILE *fp, double mtx[DIM][DIM]){

   

    int i,j;

    double zahl=0;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<DIM;j++){

           

            if (fscanf(fp,"%lf",&zahl)==1){

               

                mtx[i][j]=zahl;

               

            }else{

                return 0;

            }

        }

    }

    return 1;

}

void print_matrix (double mtx[DIM][DIM]){

   

    int i,j;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<DIM;j++){

           

            printf(" %4.1f ",mtx[i][j]);

        }

        printf("\n");

    }

}

void transp_matrix (double mtx[DIM][DIM]){

   

    int i,j;

    double temp;

    int swap;

   

    for (i=0;i<DIM;i++){

        for (j=0;j<i;j++){

           

            swap(mtx[i][j]);

            mtx[j][i];

        }

    }

        for (i=0;i<DIM;i++){

            for (j=0;j<DIM;j++){

               

                void swap(double i, double j){

                double tmp;

                tmp = i;

                i= j;

                j < tmp;

            }

        }

    }

}

Ich komme nicht drauf -.-