Gebruikersavatar
Jeroen
Artikelen: 0
Berichten: 351
Lid geworden op: wo 28 jan 2004, 22:47

Matrix in c

Ik probeer een matrix met floats te maken, waarvan de waardes uitgelezen worden uit een tekstbestand. Nou heb ik een stukje code gekregen waar ik mee verder zou moeten kunnen, maar hij compileerd niet. Ik krijg de foutmelding "called object is not a function". Dit is het stukje code:

Code: Selecteer alles


char data[1000];

float **matrix;

*matrix = (float **) malloc (nr_rows*sizeof(float *)); //allocate memory for every row in matrix

i=1;

while (i <= nr_rows)

   {

    fgets(data, 1000, file);

    printf("Line %d: %s\n\n",i,data);

    char *number = strtok(data," ");

    float num=0;

    while (number != NULL)

         k=0; //second index for the matrix

       

        {

         printf ("%s\n",number);

         num = atof(number);

         printf("num: %1.1f\n",num)

         (matrix)[i][k]=number;//fill matrix

         number = strtok (NULL, " ");

         k++;

        

        }

    i++;

}

Er zijn ook een paar dingen die ik niet begrijp:

- Waarom staat in deze regel: "(matrix)[k]=number;//fill matrix"

"matrix" tussen haakjes?

- Wat doet deze regel nou eigenlijk?:

"*matrix = (float **) malloc (nr_rows*sizeof(float *));"
Nothing to see here, move along...
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Matrix in c

Ik weet niet waar je dat stukje code vandaan hebt, maar je hebt er werkelijk helemaal niks aan. Google eens op "dynamic array in C". Je komt dan geheid informatie over pointers en malloc tegen.
Gebruikersavatar
Revelation
Artikelen: 0
Berichten: 2.364
Lid geworden op: do 24 mar 2005, 20:56

Re: Matrix in c

Volgens mij kloppen er een aantal dingen niet in die code.

Eigenlijk wil je een tweedimensionale array maken waarin je je matrix zet. In C gaat dat door een keer geheugen te reserveren voor de breedte en dan voor iedere van die breedte eentje voor lengte. Je hebt dus eigenlijk een pointer naar een pointer.

Gelukkig voor jou had ik zojuist een beetje tijd en ik heb dus een lezer voor je gemaakt. Ik hoop dat je er wat aan hebt, anders is het zonde van mijn tijd geweest.

Code: Selecteer alles

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

// VOORWAARDE VOOR ARRAY: het moet een vierkantige of rechthoekige array zijn (zoals een matrix behoort te zijn)

int main (int argc, char** argv)

{

FILE *f = fopen("matrix.txt", "rt"); // file MOET bestaan

float **matrix; // 2d array

int matrow, matcol;

if (f == NULL)

return 1;

// we tellen het aantal regels, dat is dus je aantal rijen. dit is lekker dynamisch

int numrows = 0;

char buffer[1000];

while (!feof(f))

{

fgets(buffer, 1000, f);

numrows++;

}

// alloceer genoeg ruimte voor de rijen

matrix = (float**) malloc(numrows * sizeof(float*));

matrow = numrows;

rewind(f); // ga terug naar het begin

// tel het aantal kolommmen

float valbuf[100]; // tijdelijke opslag waarden, voordat het aantal kolommen bekend is

fgets(buffer, 1000, f);	 

char *number = strtok(buffer, " "); // gescheiden door spatie

int colpos = 0;

while (number != NULL)

{

float val = atof(number); // string naar float

valbuf[colpos] = val;

number = strtok (NULL, " ");

colpos++;

}

matrix[0] = (float*) malloc(colpos * sizeof(float));

matcol = colpos;

for (int i = 0; i < colpos; i++)

matrix[0][i] = valbuf[i];

for (int i = 1; i < numrows; i++) // geen while maar for, nu hebben we een counter

{

matrix[i] = (float*) malloc(colpos * sizeof(float)); // voor iedere rij kolommmen vrijmaken

fgets(buffer, 1000, f);	 

number = strtok(buffer, " "); // gescheiden door spatie

colpos = 0;

while (number != NULL)

{

float val = atof(number); // string naar float

matrix[i][colpos] = val;

number = strtok (NULL, " ");

colpos++;

}

}

fclose(f);

// print de array

for (int i = 0; i < matrow; i++)

{

for (int j = 0; j < matcol; j++)

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

printf("\n");

}

getchar();

return  0;

}
“Quotation is a serviceable substitute for wit.” - Oscar Wilde

Terug naar “Informatica en programmeren”