Eingabe von Matrix in einer Funktion



  • Hallo,

    ich habe ein Problem bei der Eingabe von Matrixelementen in einer Funktion. Es geht hierbei um eine Verständnisfrage, daher werd ich nicht den ganzen Code reinsetzten.

    static double XY[5][5];
    
    void init ()
     {
    
         XY[5][5]={{1, 2, 3, 4, 5},{ 4, 2, 2, 6, 7},{ 1, 4, 4,7, 8},{ 3, 4, 6,4,5},{ 9, 8, 1,4 ,5}};  
    }
    

    Ich möchte innerhalb meiner C datei XY als global haben, da ich sie in meheren Funktionen benötige, in der void init() möchte ich nun Startwerte einlesen.
    Auf diese Weise krieg ich nen Fehler XY[5] out of bounds (Compiliere es in Matlab, da ich es später in einer S-Function benutzen möchte).

    Benutze ich aber:

    void init ()
     {
    
         static double XY[5][5]={{1, 2, 3, 4, 5},{ 4, 2, 2, 6, 7},{ 1, 4, 4,7, 8},{ 3, 4, 6,4,5},{ 9, 8, 1,4 ,5}};   
    }
    

    hat er keine Probleme.

    Kann ich in einer Funktion einer Matrix die Elemente nicht mit den geschweiften Klammern eingeben? Denn wenn ich jeden wert einzeln zuweise, klappt das.
    Sprich:

    XY[0][0]=234;
    XY[0][1]=6;
    

    usw.

    Wenn ich die Codes mit dem Dev C++ compiliere dann kommt syntax error before ´{´

    Wäre um eine Meinung hierzu sehr froh 🙂



  • maci schrieb:

    Kann ich in einer Funktion einer Matrix die Elemente nicht mit den geschweiften Klammern eingeben?

    Ja, du kannst nicht.
    Die Klammern funktionieren nur für eine Initialisierung (bei einer gleichzeitigen Definition) einer Variablen.



  • Diese Initialisierungsliste (so nennt sich dieses {...}) kannst du nur bei der Variablen-Definition verwenden, nicht bei einer Zuweisung. Außerdem liegt versuchst du in deinem ersten Beispiel, ein Array-Element zu füllen, das weit außerhalb des Arrays liegt.



  • Gut, damit hat sich meine Vermutung bestätigt.
    Allerdings:
    Warum liegt das Array weit aus meinem Bereich?
    Es ist doch ein 5x5 Feld, daher fülle ich es mit 25 elementen.

    da ich nun das problem kenne, gibt es eine Möglichkeit das zu umgehen, ansonsten müsste ich 125 Elemente einzeln einlesen:-(



  • Etwas in dieser Art wäre denkbar:

    double XY[5][5];
    
    void init() {
      static double const vorlage[5][5] = { { 1, 2, 3, 4, 5 },
                                            { 4, 2, 2, 6, 7 },
                                            { 1, 4, 4, 7, 8 },
                                            { 3, 4, 6, 4, 5 },
                                            { 9, 8, 1, 4 ,5 } };
    
      memcpy(XY, vorlage, sizeof(double[5][5]));
    }
    

    Mal abgesehen davon, dass die Verwendung von globalen Variablen eine höchst fragwürdige Designentscheidung ist, gibt es einen Grund, die Initialisierung nicht außerhalb der Funktion direkt vorzunehmen?



  • maci schrieb:

    Gut, damit hat sich meine Vermutung bestätigt.
    Allerdings:
    Warum liegt das Array weit aus meinem Bereich?
    Es ist doch ein 5x5 Feld, daher fülle ich es mit 25 elementen.

    Die Zuweisung XY[5][5]=... greift nur auf ein Array-Element zu, nicht auf das gesamte Array - und da die erlaubten Indizes in beide Richtungen von 0 bis 4 gehen, liegt dieses Element außerhalb des Bereiches, den du reserviert hast.


Anmelden zum Antworten