mercoledì 11 settembre 2013

Big Array in C++

Mentre cercavo di creare un array un po' grandino (6000x6000..dati derivanti da Shuttle Radar Topography Mission) mi sono accorto di una cosa un po' strana.
Il file origine e' composto da un header di 5 righe e poi 6000 righe con 6000 elementi di dati di elevazione

La compilazione del programma sottostante avviene corretamente ma quando viene messo in esecuzione

Errore di segmentazione

L'errore viene creato quando viene creata la matrice bidimensionale
-------------------------
int main()
{

int t;
stringstream textstr;
string s="";
int riga,colonna;
int srtm[6000][6000];

ifstream infile( "E010_N40.asc" );

// salta l'header
for (t = 0; t <= 5; t++)
{
getline(infile, s);
}

riga = 0;
colonna = 0;

while (infile)
  {
    string s;
    if (!getline( infile, s )) break;
    istringstream ss(s);
    colonna = 0;
    while (ss)
    {
      string s;
      if (!getline( ss, s, ' ' )) break;
      cout << riga << ":" << colonna << ":" << atoi(s.c_str()) << endl;
      
      srtm[riga][colonna] = atoi(s.c_str());
      colonna++;
      }
     riga++;
  }
return 0;


-------------------------

La soluzione, molto semplice, e' sostituire il tipo dati matrice con un vector
-------------------------
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <stdlib.h> 
#include <vector>    


using namespace std;

int main()
{

int t;
stringstream textstr;
string s="";
int riga,colonna;
vector<int> srtm;

ifstream infile( "E010_N40.asc" );

// salta l'header
for (t = 0; t <= 5; t++)
{
getline(infile, s);
}

while (infile)
  {
    string s;
    if (!getline( infile, s )) break;
    istringstream ss(s);
    colonna = 0;
    while (ss)
    {
      string s;
      if (!getline( ss, s, ' ' )) break;
      cout << riga << ":" << colonna << ":" << atoi(s.c_str()) << endl;
      
      srtm.push_back(atoi(s.c_str()));
     
      }
     
  }
return 0;