iterator zugrifffehler ?



  • Hallo, hätte da mal eine bescheidene frage, ich hab einen iterator der einen vector nach einer bestimten zahl zuschen soll aber ich bekomme sementation fault (core dumped)...blos warum denn ?

    /*** Datei oeffnen zum schalten ***/
    void leseDateischalt()
    	{
    	 dynSchaltspeicher.clear();
    	 char lesestring[20];
    	 ifstream leseDateischalt("zeitdaten.txt",ios::in);
    	 while (!leseDateischalt.eof())
    	  {
    	   leseDateischalt.getline(lesestring, sizeof(lesestring),' ');
    	   dynSchaltspeicher.push_back(" ");
    	   dynSchaltspeicher.push_back(lesestring);
    	  }
    	 leseDateischalt.close();
    	 vector<string>:: iterator itera;
    	 for (itera = dynSchaltspeicher.begin(); itera != dynSchaltspeicher.end();itera++);
    	   {
    	    cout <<"test";
    	    if (*itera == "110"){cout<<"yes";}
    	    else {cout<<"no";}
    	   }
    	}
    

    grüße



  • Ich nehme an, du hast dir den Speicher überschrieben.
    Benutze statt dem char-Array "lesestring" lieber std::string.



  • komisch hier klappt das das ja auch

    /*** Datei oeffnen ***/
    void leseDatei()
    	{
    	 char lesestring[20];
    	 ifstream leseDaten("zeitdaten.txt",ios::in);
    	 while (!leseDaten.eof())
    	  {
    	   leseDaten.getline(lesestring, sizeof(lesestring),' ');
    	   dynSpeicher.push_back(" ");
    	   dynSpeicher.push_back(lesestring);
    	  }
    	 leseDaten.close();
    	}
    

    da lese ich und hier später suche ich

    /*** Datenvergleich und im dynSpeicher schreiben ***/
    void imdynSpeicherschreiben (string objektart, string objekteingang, string anzahl,
    			     string objektzustand, string schalttag, string uhrzeit)
    	{
    	 string erkennung = objektart+" "+objekteingang+" "+anzahl+" "
    			  + objektzustand+" "+schalttag;
    	 string schaltzeit = uhrzeit + "\n";
    	 string komplettdatensatz =" " + erkennung + " " + schaltzeit;
    	 vector<string>:: iterator iter;
    	 int gefunden = 0;
    	 for ( iter = dynSpeicher.begin();iter != dynSpeicher.end();iter++)
    	   {
    	    if (*iter == objektart)
    	      {
    	       iter = iter+2;
    	       if (*iter == objekteingang)
    		 {
    		  iter = iter+2;
    		  if (*iter == anzahl)
    		    {
    		     iter = iter+2;
    		     if (*iter == objektzustand)
    		       {
    			iter = iter+2;
    			if (*iter == schalttag)
    			  {
    			   iter = iter+2; 
    		  	   gefunden = 1;
    	          	   dynSpeicher.erase(iter);
    	         	   dynSpeicher.insert(iter,schaltzeit);
    			  }
    		       }
    		    }
    		 }	
    	      }
    	   }
    	 if (gefunden == 0)
    	   {dynSpeicher.push_back(komplettdatensatz);}
    	}
    

    und hierbei meldet er mir no matching funtion for call to....
    in zeile mit getline.

    /*** Datei oeffnen ***/
    void leseDatei()
    	{
    	 string lesestring;
    	 ifstream leseDaten("zeitdaten.txt",ios::in);
    	 while (!leseDaten.eof())
    	  {
    	   leseDaten.getline(leseDatei,lesestring,' ');
    	   dynSpeicher.push_back(" ");
    	   dynSpeicher.push_back(lesestring);
    	  }
    	 leseDaten.close();
    	}
    

    ok die matching fehler gibs nicht mehr mus ja vor getline das wegnehmen hier leseDaten. Aber der segmentation fault ist noch da



  • also,
    1.:

    leseDaten.getline(leseDatei,lesestring,' ');
    =>
     getline(leseDatei,lesestring,' ');
    /*
    oder
     leseDaten.getline(lesestring,' ');
    geht bestimmt auch ^^
    */
    

    2. Die Funktion:
    1.

    void imdynSpeicherschreiben (string const &objektart, string const &objekteingang, string const &anzahl, string const &objektzustand, string const &schalttag, string const &uhrzeit)
    

    2. müssen das wirklich alles strings sein? Oo
    3.:

    string erkennung = objektart+" "+objekteingang+" "+anzahl+" "+ objektzustand+" "+schalttag;
    => " " würde ich als ' ' schreiben
    => const string erkennung (das trifft wahrscheinlich auch auf komplettdatensatz und schaltzeit zu
    

    4. bist du dir sicher, dass \n reicht und nicht \r\n hin muss?
    5.

    int gefunden = 0;
    ==> bool gefunden (false);
    /*usw.*/
    gefunden = 1; //geht zwar, aber ich würd gefunden = true; schreiben ^^
    
    for (vector<string>::iterator iter (dynSpeicher.begin());iter != dynSpeicher.end(); ++iter);
    
    (*iter == objektart)
    (*iter == objekteingang)
    (*iter == objektzustand)
    etc.
    //wie soll das gehen?
    iter->find (objektart)
    etc.
    


  • ich habe es nun erstmal in string weil z.b als uhrzeiteingabe 00001 als 1 angegeben wird. Evtl ändere ich das noch auf int.
    Const hatte ich am anfang probleme, evtl ändere ich das auch noch so geht es auch.
    (*iter == objektart) klatt einwandfrei er findet es so wie ich das will.

    ich hatte ein semikolon hinter der for zeile das iss ja wohl falsch habe ich blos immer übersehen.



  • nun gut - das hab ich auch nicht gesehen ^^
    aber auch wenns geht kannste ja ma gucken, ob du nicht vll wenigstens den for-schleifenkopf-umbaust - das als bool nimmst etc - und wenn du schon strings übergibst, dann wenigstens (konstante) referenzen - weil du sie ja nicht veränderst... is nur der fkt-kopf, der sich da ändert und das hab ich dir ja scho gepostet, in wie fern der sich verändert...



  • das versuche ich dann auch die tage es noch weiter zu "verschönern und sicherer" umzubauen mir geht es erst mal kurz dadrum ob es so geht wie ich mir das vorstelle 🙂 aber vielen dank schonmal ohne diese forum wäre ich nie soweit *g*


Anmelden zum Antworten