Home > Mobile >  Am I assigning values to the array incorrectly?
Am I assigning values to the array incorrectly?

Time:10-07

I have a code that is supposed to take a file with n lines, each with p doubles, and add each double to a 2d array. For some reason when I try to print the array it shows every other row being zeroed out. What am I doing wrong?

The text file would look like this

3.0 5.0 9.0 1.0
7.0 10.0 2.0 6.0
4.0 8.0 11.0 12.0
20.0 19.0 15.0 13.0
29.0 24.0 17.0 21.0

Here is my code

fileInStream.open(input);

cellArr = new double[rows * cols];

int i, j = 0;

while (getline(fileInStream, line)){
  stringstream ss(line);
  while (ss >> cell){
    *(cellArr   i * cols   j) = stod(cell);
    j  ;
  }      
  i  ;
}

for (int i = 0; i < rows; i  ) {
  for (int j = 0; j < cols; j  ) {
    cout << *(cellArr   i * cols   j) << " ";
  }
  cout << endl;
}

My output looks like this

3 5 9 1 
0 0 0 0 
7 10 2 6 
0 0 0 0 
4 8 11 12 

CodePudding user response:

You've made a few basic logic mistakes. i is unitialized, yielding undefined behavior. Also, j is never reset. It should reset to 0 at the beginning of each row.

As it is, if you run this for a simple 2x2 array, assuming i is 0 to start, we have:

i = 0, j = 0 -> cellArr[i * cols   j] -> cellArr[0]
i = 0, j = 1 -> cellArr[i * cols   j] -> cellArr[1]
i = 1, j = 2 -> cellArr[i * cols   j] -> cellArr[4]
i = 1, j = 3 -> cellArr[i * cols   j] -> cellArr[5]

Code I used to test, modified from your code:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
    int rows = 2;
    int cols = 2;

    auto cellArr = new double[rows * cols];

    int i = 0;
    string line;

    while (getline(cin, line)) {
       double cell;
       int j = 0;
       stringstream ss(line);

       while (ss >> cell) {
          cellArr[i * cols   j] = cell;
          j  ;
       }

       i  ;
    }

    for (int i = 0; i < rows; i  ) {
        for (int j = 0; j < cols; j  ) {
            cout << cellArr[i * cols   j] << " ";
        }

        cout << endl;
    }

    return 0;
}

We can use for loops to clean this up a bit.

#include <iostream>
#include <string>
#include <sstream>
#include <memory>

using namespace std;

int main() {
    int rows = 2;
    int cols = 2;

    auto cellArr = make_unique<double[]>(rows * cols);

    int i = 0;

    string line;

    for (int i = 0; i < rows && getline(cin, line);   i) {
       stringstream ss(line);
       for (int j = 0; j < cols && ss >> cellArr[i * rows   j];   j);
    }

    for (int i = 0; i < rows; i  ) {
        for (int j = 0; j < cols; j  ) {
            cout << cellArr[i * cols   j] << " ";
        }
        cout << endl;
    }

    return 0;
}

CodePudding user response:

move

int j = 0;

before

  while (ss >> cell){
  •  Tags:  
  • c
  • Related