Multidimensional array of strings with vector.

I've been struggling with this for quite some time. I decided I should get some help with this. Nothing is working. I'm getting a segmentation fault or out of bounds error when I try to load the entries in the for loop.I'm really frustrated. :mad: Compiling isn't the problem. It's crapping out on me at runtime.

  vector< vector<string> > tl;
  vector< vector<string> > tld;
  
  for(int i=0;i<todayslive.size();i++) {
    mysqlpp::String transfer;
    string transfer2;
      
    transfer = todayslive.at(i)["tf_database_key"];
    transfer2 = string(transfer.data(),transfer.length());
    tl.at(i).push_back(transfer2);
    transfer = todayslive.at(i)["tf_air_time"];
    transfer2 = string(transfer.data(),transfer.length());
    tl.at(i).push_back(transfer2);
    transfer = todayslive.at(i)["tf_duration"];
    transfer2 = string(transfer.data(),transfer.length());
    tl.at(i).push_back(transfer2);

    transfer = todayslivedet.at(i)["tf_database_key"];
    transfer2 = string(transfer.data(),transfer.length());
    tld[0]=transfer2;
    transfer = todayslivedet.at(i)["tf_title"];
    transfer2 = string(transfer.data(),transfer.length());
    tld[1]=transfer2;
    transfer = todayslivedet.at(i)["tf_genre_desc138"];
    transfer2 = string(transfer.data(),transfer.length());
    tld[2]=transfer2;
    transfer = todayslivedet.at(i)["tf_epi_title"];
    transfer2 = string(transfer.data(),transfer.length());
    tld[3]=transfer2;
  }
  //End Load tl & tld.

  vector<string> genres;
  cout << tl.size() << endl;
  cout << tl[0][2] << endl;

we need to see more of the code. what is "todayslive"?

Thanks for your reply. Your welcome to all of it. Since I posted I tried changing to string tl[10000][3] which seems to work nicer but still ends in a fatality at run time.

#include </usr/include/mysql++/mysql++.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <ostream>
#include <string>
#include <vector>

using namespace std;
using namespace mysqlpp;

int main()
{
  //<----------------------------------------------------->
  mysqlpp::Connection conn;
  if (conn.connect("dsgsports","127.0.0.1" , "root", "")) {
          printf("Creating guides...\n");  
  }
  else {
    printf("Database connection failure.");
    return 1;
  }
  //<----------------------------------------------------->

  string todaysdate;  
  stringstream transfer;
  time_t rawtime;
  struct tm* timeinfo;
  time(&rawtime);
  timeinfo = localtime(&rawtime);
  //Format todaysdate.
  transfer << timeinfo->tm_year + 1900;
  transfer << timeinfo->tm_mon+1;
  transfer << timeinfo->tm_mday;
  todaysdate = transfer.str();
  cout << "Todays date:" << todaysdate << endl;

  vector<Row> todayslive;
  Query querya = conn.query();
  querya << "select * from sports_schedule where tf_air_date='" << todaysdate + "' " << "and tf_live_tape_delay='Live' order by tf_database_key";
  querya.storein(todayslive);
  cout << "'todayslive.size()'=" <<  todayslive.size() << endl;

  vector<Row> todayslivedet;
  for(int i=0;i<todayslive.size();i++) {
    mysqlpp::String transfer = todayslive.at(i)["tf_database_key"];
    string tf_database_key = string(transfer.data(),transfer.length());
    //cout << i << " " << tf_database_key  << endl;
    Query queryb = conn.query();
    queryb << "select * from sports_program where tf_database_key='" << tf_database_key + "'";
    queryb.storein(todayslivedet);
    //StoreQueryResult res = queryb.store();
    //todayslivedet.push_back(res);  
  }
 
  cout << "'todayslivedet.size()='" << todayslivedet.size() << endl;
  
  for(int i=0;i<todayslive.size();i++) {
    cout << todayslive.at(i)["tf_database_key"] << " " <<  todayslivedet.at(i)["tf_database_key"] << endl;
  }

  
  //Load tl & tld.i
  string tl[todayslive.size()][2];
  string tld[todayslivedet.size()][3];
  
  for(int i=0;i<todayslive.size();i++) {
    mysqlpp::String transfer;
    string transfer2;
      
    transfer = todayslive.at(i)["tf_database_key"];
    transfer2 = string(transfer.data(),transfer.length());
    tl[0]="mystring";
    transfer = todayslive.at(i)["tf_air_time"];
    transfer2 = string(transfer.data(),transfer.length());
    tl[1]="mystring";
    transfer = todayslive.at(i)["tf_duration"];
    transfer2 = string(transfer.data(),transfer.length());
    tl[2]="mystring";

    //transfer = todayslivedet.at(i)["tf_database_key"];
    //transfer2 = string(transfer.data(),transfer.length());
    //tld[0]=transfer2;
    //transfer = todayslivedet.at(i)["tf_title"];
    //transfer2 = string(transfer.data(),transfer.length());
    //tld[1]=transfer2;
    //transfer = todayslivedet.at(i)["tf_genre_desc138"];
    //transfer2 = string(transfer.data(),transfer.length());
    //tld[2]=transfer2;
    //transfer = todayslivedet.at(i)["tf_epi_title"];
    //transfer2 = string(transfer.data(),transfer.length());
    //tld[3]=transfer2;
  }
  //End Load tl & tld.

  //vector<string> genres;
  //cout << tld[0][2] << endl;
  //cout << tld[1][2] << endl;
  //cout << tld[2][2] << endl;
  
  //File IO is done here.  
  std::ofstream outfile("guide.txt", std::ios::out);
  if(outfile.is_open())
  {
    //for(int i=0;i<todayslive.size();i++) {
      //for(int x=0;x<tl.size();x++){ outfile << tl.at(x) + " "; }
      //outfile << endl;
      //for(int x=0;x<tld.size();x++) { outfile << tld.at(x) + " "; }
      //outfile << endl;    
    //}
    //outfile.close();
  }
  else
    std::cout << "Could not open file." << endl;
  //End of File IO.





  cout << "Guides created successfully." << endl;    
  return 0;
}

compile with debugging symbols, and analyze the core. If you're on Linux, you may try to run your program under valgrind's supervision.

Cheers, Lo�c

"when things crash, make the array bigger" is not the answer.

I'm still trying to boil down just what you're trying to do, but my guess so far? There's no error checking for most of what you do. If you ever get data (or lack of data) you don't expect, it uses it anyway. Check everything.

Also, since you're using localtime() anyway, you might as well save yourself a mountain of work and use strftime too:

#include <time.h>
#include <string>
#include <iostream>
using namespace std;

int main(void)
{
        time_t t=time(NULL);
        char todaysdate[32];
        strftime(todaysdate, 32, "%Y%m%d", localtime(&t));

        cout << "today's date is " << todaysdate << endl;
}

---------- Post updated at 03:04 PM ---------- Previous update was at 02:08 PM ----------

mysql's row type seems very twitchy.

 Query querya=conn.query();
  querya << query;
  querya.storein(results);

  printf("%d rows\n", results.size());

  for(int n=0; n<results.size(); n++)
  {
    printf("row has %d fields\n", results[n].size());
  }
2 rows
row has 2520205 fields
row has 2520205 fields

Needless to say, you're not the only one mystified. Are you sure you want to use the C++ interface and not the C one?

vector<vector<string>> big;
vector<strings> small;

small.push_back("Cell One");
small.push_back("Cell Two");
small.push_back("Cell Three");

big.push_back(small);

cout << big[0][0] << endl;

Try it! It works for me! For some reason all the other examples I tried have failed me (Fedora14,g++,gdb) :):b: