Springen naar inhoud

Matrix in c


  • Log in om te kunnen reageren

#1

Jeroen

    Jeroen


  • >250 berichten
  • 351 berichten
  • Ervaren gebruiker

Geplaatst op 31 maart 2008 - 17:28

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:

char data[1000];float **matrix;*matrix = (float **) malloc (nr_rows*sizeof(float *)); //allocate memory for every row in matrixi=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)[i][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...

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 31 maart 2008 - 20:29

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.

#3

Revelation

    Revelation


  • >1k berichten
  • 2364 berichten
  • Technicus

Geplaatst op 12 april 2008 - 10:17

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.

#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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures