2016-04-29 11 views
0

Ich muss eine Funktion schreiben, die mir helfen sollte, eine Matrix unter Verwendung einer Struktur zuzuordnen. Ich fing an, die Strukturen heute zu studieren. Also schrieb ich diesen Code mit dieser Struktur und der relativen Haupt die Funktion zu beweisen:Wie kann ich eine Matrix mit Strukturen zuordnen?

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

typedef struct { 

    int rows; 
    int cols; 
    float **row_ptrs; 
} Mat; 

Mat* Mat_alloc(int rows, int cols); 

int main(int argc, char **argv) 
{ 
     Mat *m1 = Mat_alloc(int rows, int cols); 

    return 0; 
} 
Mat* Mat_alloc(int rows, int cols) 
{ 
    Mat matrice; 
    matrice.rows = rows; 
    matrice.cols = cols; 
    float** matrice= (float**)malloc((matrice.rows)*sizeof(float*)); 
    for(int i = 0; i < matrice.cols; i++) 
    { 
     matrice[i] = (float*)malloc((matrice.cols)*sizeof(float)); 
    } 
    matrice.row_ptrs = matrice; 
    return matrice; 
} 

Ich weiß, dass ich einige mistakes.Someone machen kann mir helfen, undestand, wie ich es tun kann?

+0

Zuerst finden sie eine [gute Anfänger Buch] (http://stackoverflow.com/questions/562303/the -definitive-c-book-guide-and-list) und lernen, Funktionen aufzurufen. Dann lese weiter die Bücher und lerne über * scopes * und was mit lokalen Variablen passiert, sobald die Funktion, in der sie definiert wurden, zurückkehrt. –

+0

Hinweis: Code wird eventuell mit einem Begleiter benötigt 'Mat_free (Mat *);' – chux

+0

Es gibt keine Matrix (auch bekannt als 2D-Array) in Ihrem Code und nichts, was als ein verwendet werden kann. Ein Zeiger ist kein Array und umgekehrt. – Olaf

Antwort

0

chrisd1100 gab eine gute Antwort, aber nur ein wenig pedantisch das ist mein zu sein:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

typedef struct { 

    int rows; 
    int cols; 
    float **row_ptrs; 
} Mat; 

Mat* Mat_alloc(int rows, int cols); 

int main(void) 
{ 
    int i; 

    int rows = 10; 
    int cols = 10; 

    Mat *m1 = Mat_alloc(rows, cols); 

    for (i=0; i<cols; i++) 
    { 
     free(m1->row_ptrs[i]); 
    } 
    free(m1->row_ptrs); 
    free(m1); 

    return 0; 
} 

Mat* Mat_alloc(int rows, int cols) 
{ 
    Mat *m1 = malloc(sizeof(Mat)); 
    m1->rows = rows; 
    m1->cols = cols; 
    m1->row_ptrs = malloc((m1->rows)*sizeof(float*)); 
    for(int i = 0; i < m1->rows; i++) 
    { 
     m1->row_ptrs[i] = malloc((m1->cols)*sizeof(float)); 
    } 

    return m1; 
} 
+0

lassen Sie mich sehen, wenn ich wirklich wusste, wie man es austeilt. Ich musste erst zwei Freigaben machen, damit ich die in den Strukturen Mat (float ** row_ptrs) definierte Matrix freigeben kann, aber dann musste ich auch m1 vom Typ Mat freigeben. Isn es? –

+0

Ja, ist es. Sie befreien sie in der umgekehrten Reihenfolge, die Sie ihnen zuweisen. – LPs

+0

Vielen Dank für Ihre Unterstützung :) –

1

int rows und int cols sind nicht initialisiert in Mat_alloc gehen. Sie müssen diese numerischen Werte angeben!

int main(int argc, char **argv) 
{ 
     int rows = 10; 
     int cols = 10; 
     Mat *m1 = Mat_alloc(rows, cols); 

     //do something 
     //call your Mat_free(m1) function 

    return 0; 
} 

Achten Sie darauf, den Zeiger auf eine Mat Struktur in dieser Funktion zurückkehren zu:

Mat* Mat_alloc(int rows, int cols) 
{ 
    Mat *m1 = malloc(sizeof(Mat)); 
    m1->rows = rows; 
    m1->cols = cols; 
    float** matrice= (float**)malloc((m1->rows)*sizeof(float*)); 
    for(int i = 0; i < m1->rows; i++) 
    { 
     matrice[i] = (float*)malloc((m1->cols)*sizeof(float)); 
    } 
    m1->row_ptrs = matrice; 
    return m1; 
} 

Also, stellen Sie sicher, dass Sie eine Mat_free Funktion free bis der in Mat_alloc zugewiesenen Speicher erstellen.

+0

Vielen Dank für Ihren Kommentar! –

+0

Neugierig: Warum die unnötige Besetzung '(float *)' in 'matrice [i] = (float *) malloc ((m1-> cols) * sizeof (float));'? – chux

+0

@chux freche Frage;) – LPs

Verwandte Themen