Newsgroup: it.comp.lang.c++
Titolo: Problemino..... Cerco Assolutamente aiuto...

In un programma ho inserito delle stringhe in un vettore e poi le devo
confrontare con i dati inseriti in una variabile stringa. Se il valore
inserito nella variabile esiste nel vettore allora deve eseguire una
funzione il frammento di codice è il seguente...
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
void DatiDaVisualizzare(vector<string>::iterator in, vector<string> V1);
int main()
{
vector<string> Pianeti_;
  Pianeti_.push_back("Mercurio");
  Pianeti_.push_back("mercurio");
  Pianeti_.push_back("Venere");
  Pianeti_.push_back("venere");
  Pianeti_.push_back("Terra");
  Pianeti_.push_back("terra");
  Pianeti_.push_back("Marte");
  Pianeti_.push_back("marte");
  Pianeti_.push_back("Giove");
  Pianeti_.push_back("giove");
  Pianeti_.push_back("Saturno");
  Pianeti_.push_back("saturno");
  Pianeti_.push_back("Urano");
  Pianeti_.push_back("urano");
  Pianeti_.push_back("Nettuno");
  Pianeti_.push_back("nettuno");
  Pianeti_.push_back("Plutone");
  Pianeti_.push_back("plutone");
 vector<string> vec;
 vector<string>::iterator ini;
 string inBuf;
 while(cin >> inBuf)
 {
  vec.push_back(inBuf);
  vector<string>::iterator exi = find(vec.begin(),vec.end(),"exit");
  if(exi != vec.end())
  {
   if(!vec.empty())
    vec.erase(vec.begin(),vec.end());
   exit(1);
  }
  ini  =
find_first_of(vec.begin(),vec.end(),Pianeti_.begin(),Pianeti_.end());
  DatiDaVisualizzare(ini,Pianeti_);
  ini != vec.end() ? Exe() : cout << "Nessun pianeta del Sistema Solare
presenta questo nome!\n\n\r";
 }
 return 0;
}
void DatiDaVisualizzare(vector<string>::iterator in, vector<string> V1)
{
 int y;
 for(int x = 0; x<= 18; x++)
 {
  if(*in == V1[x])
   y = x;
 }
 switch(y)
 {
 case 0:
 case 1:
  DatiMercurio(); // Funzione esistente su un altro file Astri.h la quale
mostra su schermo tutti i valori del pianeta
  break;
 }
}
Una volta compilato il codice mi crea un errore:
"Unhandled exzeption in Astri.exe: 0xC0000005: Access Violation"
Potrei sapere come risolvere il problema?
credo che tutto il trambusto sia nella funzione DatiDaVisualizzare(...)...
Vi ringrazio in anticipo by Tony'84


A questo punto ecco come scriverei io il codice (a grandi linee).
NOTA: non compilato.
Per prima cosa il funzionale per una comparazione case-insensitive:
(std::map richiede un less)
#include <functional>
#include <cctype>
struct less_nocase: public std::binary_function<std::string, std:string, bool>
{
    bool operator()(const std::string& x, const std::string& y)
    {
        std::string::const_iterator px = x.begin();
        std::string::const_iterator py = y.begin();
        // comparazione 'standard'
        while(px != x.end() && py != y.end())
        {
            if(std::toupper(*px) != std::toupper(*py))
                return std::toupper(*px) < std::toupper(*py) ? true : false;
            ++px;
            ++py;
        }
        return x.size() < y.size() ? true : false;
    }
};
A questo punto si puo usare una mappa che associ ad una stringa una funzione.
void DatiMercurion();
// ...
typedef void (*fun_type)();
std::map<std::string, fun_type, less_nocase> PlanetsData;
PlanetsData["Mercurio"] = &DatiMercurio;
// ...
Per la lettura da stream:
std::string input;
while(std::cin >> input)
{
    if(input == "exit) { /*...*/ }
    // cerca il nome nella mappa:
    if(PlanetsData.find(input) != PlanetsData.end())
    {
        // esegue la funzione corrispondente
        PlanetsData[input]();
        Exe();  // a che serve?
    }
    else /*...*/
}
Saluti  Manlio Perillo

  for(int x = 0; x<= 18; x++)
probabilmente il problema sta in quel <=. Il vettore che gli passi ha 18 
elementi, quindi l'indice massimo possibile e` 17, mentre tu gli dici di 
considerare anche l'inesistente 18. 
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

         }
perche` scrivi un ciclo esplicito? IMHO meglio appoggiarsi su 
std::lexicographical_compare:
class less_string_no_case: public std::binary_function<std::string, 
std::string, bool>
{
  struct less_char_no_case: public std::binary_function<char,char,bool>
  {
    bool operator()(char x, char y) const
    {
      return std::toupper(x) < std::toupper(y);
    }
  };
public:
  bool operator()(const std::string& x, const std::string& y) const
  {
    return std::lexicographical_compare(x.begin(),
                                        x.end(),
                                        y.begin(),
                                        y.end(),
                                        less_char_no_case()
                                        );
  }
};



Ciao  Manlio Perillo