The program takes in input a string from a text file like:
2 1.0 2.0 3.0 4.0
where the first number is the dimension of a square matrix, and other numbers are the matrix’s elements(stored in column major form).
Every number is separated by others with a “space” char
The program adds all number on a single column and multiply every result of this kind.
I.E. with this string the result will be: 21.0
The problem is: using this input, the output of the program will be:
Input string is 2 1.0 2.0 3.0 4.0
Extracted char type token 1.0 from the string
Extracted char type token 2.0 from the string
Extracted char type token 3.0 from the string
Extracted char type token 4.0 from the string
Converted char type token 1.0 into float type
Converted char type token 2.0 into float type
Converted char type token 2.0 into float type
Converted char type token 3.0 into float type
Printing matrix of float types:
1.000000
2.000000
2.000000
3.000000
Final result is 15.000000
Instead it should be:
Input string is 2 1.0 2.0 3.0 4.0
Extracted char type token 1.0 from the string
Extracted char type token 2.0 from the string
Extracted char type token 3.0 from the string
Extracted char type token 4.0 from the string
Converted char type token 1.0 into float type Converted char type token 2.0 into
float type Converted char type token 2.0 into float type Converted
char type token 3.0 into float type
Printing matrix of float types:
1.000000
2.000000
3.000000
4.000000
Final result is 24.000000
Here the code
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
/* void calculus(char string[], int matrixDimension)
* Executes the following procedure:
* 1) it extracts from the string, various char type tokens
* 2) converts these char type tokens into float types and stores it into "squareMatrix" bidimensional vector
* 3) does the calculus
*/
void calculus(char string[]);
int main()
{
FILE* fileToReadFd;
int nRead;
char string[500] = {0};
const char pathNameRead[] = "/home/caterpillar/canc/matrice2.txt";
if((fileToReadFd = fopen(pathNameRead, "r")) == NULL)
{
printf("Ho provato ad aprire %s\n", pathNameRead);
printf("errore nell'aprire il file\n" "%s\n", strerror(errno));
}
nRead=fread(&string[0],sizeof(char),100,fileToReadFd);
printf("Input string is %s\n", &string[0]);
calculus(string);
fclose(fileToReadFd);
return 0;
}
void calculus(char string[])
{
int matrixDimension = atoi(&string[0]);
float finalResult = 1;
// float type square matrix to be filled
float squareMatrix[matrixDimension][matrixDimension];
// stores the result of every column addition
float columnAddition[matrixDimension];
/*
* stores tokens from the string
* I.E.:
* token[0] contains "1.0"
* token[1] contains "2.0"
* token[2] contains "3.0"
* token[3] contains "4.0"
*/
char tokens[matrixDimension * matrixDimension][8];
/*
* zero initialize columnAddition vector
*/
for(int i = 0; i < matrixDimension; i++)
{
columnAddition[i] = 0;
}
/*
* First strtok is necessary to be left alone since it takes away
* the first token that is not usefull ( it is the matrix dimension)
*/
strtok(&string[0], " ");
for(int i = 0; i < (matrixDimension * matrixDimension); i++)
{
strcpy(&tokens[i][0], strtok(NULL, " "));
printf("Extracted char type token %s from the string\n", &tokens[i][0]);
}
for(int i = 0; i < matrixDimension; i++)
{
for(int j = 0; j < matrixDimension; j++)
{
squareMatrix[i][j] = atof(&tokens[i+j][0]);
printf("Converted char type token %s into float type\n", &tokens[i+j][0]);
}
}
printf("\nPrinting matrix of float types:\n");
for(int i = 0; i < matrixDimension; i++)
{
for(int j = 0; j < matrixDimension; j++)
{
printf("%f\n", squareMatrix[i][j]);
}
}
// does calculus
for(int j = 0; j < matrixDimension; j++)
{
for(int i = 0; i < matrixDimension; i++)
{
columnAddition[j] = columnAddition[j] + squareMatrix[i][j];
}
}
for(int i = 0; i < matrixDimension; i++)
{
finalResult = finalResult * columnAddition[i];
}
printf("Final result is %f\n", finalResult);
}
I believe this is the problem:
As this will reference the same token for both (i=0, j=1) and (i=1, j=0) since both 1+0 = 1 and 0+1 = 1
It should be