2017-01-11 6 views
-1

Ich versuche zu verstehen, wie eine Matrix in C funktioniert.Matrix in C mit rand() füllen

Ich habe den folgenden Code:

#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 

    /* random number generator for matrix dimensions */ 
    int xDim, yDim; 
    srand(time(NULL)); //init. is needed only once 
    xDim = (rand() % (10000+1) + 50); 
    yDim = (rand() % (10000+1) + 50); 

    /* random number generator for matrix contents */ 
    double* myMatr; 
    myMatr = (double *)malloc(xDim * yDim * sizeof(double)); 
    for(int i=0; i<xDim; i++) 
    { 
     for(int y=0; y<yDim; y++) 
     { 
      myMatr[i][y]= (double)rand()/RAND_MAX*100.0; 
     } 
    } 
} 

Allerdings habe ich diese Störung erhalte:

test.c:24:13: error: subscripted value is neither array nor pointer nor vector 
myMatr[i][y]= (double)rand()/RAND_MAX*100.0; 
+3

'myMatr [i]' ist 'double', also können Sie es anscheinend nicht weiter subskribieren. –

+0

Was bedeutet das? – Diaman

+3

'myMatr [i] [y]' -> 'myMatr [i * yDim + y]' – BLUEPIXY

Antwort

1

Die minimale Änderung an Ihrem Code ist wahrscheinlich myMatr in einen Zeiger auf ein Array zu machen.

Wechsel:

double *myMatr = (double *)malloc(xDim * yDim * sizeof(double)); 

(die derzeit über zwei Zeilen in der Quelle verteilt wird) in:

double (*myMatr)[yDim] = malloc(xDim * yDim * sizeof(double)); 

Der Rest des Codes gezeigt dann funktioniert. Sie sollten natürlich vor dem Ende free(myMatr); hinzufügen.

#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 
#include <stdio.h> 

int main(void) 
{ 
    srand(time(NULL)); // init. is needed only once 

    /* random number generator for matrix dimensions */ 
    int xDim = (rand() % (10000 + 1) + 50); 
    int yDim = (rand() % (10000 + 1) + 50); 

    //double *myMatr = (double *)malloc(xDim * yDim * sizeof(double)); 
    double (*myMatr)[yDim] = malloc(xDim * yDim * sizeof(double)); 

    /* random number generator for matrix contents */ 
    for (int i = 0; i < xDim; i++) 
    { 
     for (int y = 0; y < yDim; y++) 
     { 
      myMatr[i][y] = (double)rand()/RAND_MAX * 100.0; 
     } 
    } 

    /* print matrix contents */ 
    for (int i = 0; i < xDim; i++) 
    { 
     for (int y = 0; y < yDim; y++) 
      printf("%6.2f", myMatr[i][y]); 
     putchar('\n'); 
    } 

    free(myMatr); 
    return 0; 
} 
1

In C, a[x][y] ein paar Dinge bedeuten kann: Erstens, kann es bedeuten, dass a ist ein Array von oder ein Zeiger auf Arrays bekannter Länge, die wie folgt deklariert sind:

Das heißt, a Punkte auf Arrays von 5 Doppelzimmer. Da diese Größe im Voraus bekannt ist, können Sie einen großen Block zuweisen und die doppelte Indizierung ausführen. Dies funktioniert jedoch nicht, wenn Sie die Größe beider Indizes zur Laufzeit bestimmen müssen. In diesem Fall haben Sie keine andere Wahl, als a als ein Array von Zeigern zu erklären, und ordnen Sie dieses Array und jedes seiner Teilarrays getrennt:

double **a; 
a = malloc(xDim * sizeof(double *)); 
for (int i = 0; i < xDim; i += 1) { 
    a[i] = malloc(yDim * sizeof(double)); 
} 

Nun bedeutet a[x][y] „die x-te Zeiger in Array a finden , dann finde das yth double im Array, auf das es zeigt ".