Max. Anzahl an Einträgen in einem Listenelement



  • Hallo,
    ich schreibe seit vielen Monaten an einem Programm zur technischen Wertpapieranalyse und habe dabei bislang aber immer nur vergleichsweise kurze Zeitreihen analysiert (bis 356 Tage). Heute wollte ich die Daten des Dax seit 2000 einspielen und dabei kriege ich aber immer nur max. 1922 Einträge in das Listenelement, in das die Daten geladen werden.

    Da ich mal gehärt habe, dass z.B. bei Excel nur eine begrenzte Anzahl von Werten eingetragen werden kann, bin ich jetzt auf die Idee gekommen, dass das bei dem Listenelement auch der Fall sein könnte. Habt ihr ähnliche Erfahrungen gemacht?

    Zur Information: Ich lade die Daten aus einer csv. könnte es auch sein, dass der Fehler hier liegt?

    Für jede Hilfe dankbar,
    Michael



  • poste mal den code



  • Ich hab soeben mit VC++ 2003 in ein ListCtrl im Berichtsmodus und in eine ListBox 2000 Elemente eingefügt, kein Problem.
    Das Problem wird wohl woanders liegen...



  • Hier der Code:

    void CBullmuhsDlg::On_Daten_einlesen(){
    	if(m_Datei_neu==""){
    
        CFileDialog m_dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bullmuhs-Dateien (*.csv)|*.csv||");
    
    	if( m_dlgFile.DoModal() == IDOK ){ 
    		m_pathname = m_dlgFile.GetPathName(); 
    		m_strList1 = m_dlgFile.GetFileTitle();
    		m_strList1.MakeUpper();
    	}
    
    	}else{
    	m_pathname=m_Datei_neu;
    	}
    
    	if(m_pathname==""){
    	CString error="Sie haben keine Datei ausgewählt";
    	MessageBox(error);
    	}else{
    	LockWindowUpdate();
    
    	m_List1.DeleteAllItems();
    	CFile datei( m_pathname, CFile::modeRead ); 
    
    	UINT nActual = 0;
    	TCHAR str[100000];
    
    	nActual = datei.Read(str, sizeof(str));
    	datei.Close();
    	str[nActual] = 0;
    
    	sDaten = str;
    
    	//Daten bereinigen
    	sDaten.Replace("Date,Open,High,Low,Close,Volume,Adj. Close*\n","");
    	sDaten.Replace("\n",",");	
    
    	//Daten in das Listenelement einfügen
    		//Zahl der Spalten
    		const int iSpalten = 7;
    
    		//Zahl der Einträge
    		int k=0, iEintraege=0;
    
    		for(int i=0;i<=sDaten.GetLength();i++){
    		k=sDaten.Find(",", i);
    			if(k!=-1){
    			i=k;
    			iEintraege++;
    			}else{
    			i=sDaten.GetLength()+1;
    			}
    		}
    
    		//Einträge ins Listenelement übernehmen
    		int iPos=0, iPos_alt=0;
    		int spalte=1,iLaenge=0;
    		reihe=-1;
    
    		for(i=0;i<=iEintraege;i++){
    			iPos = sDaten.Find(",",iPos_alt);
    			CString sSub;
    
    			iLaenge=iPos-iPos_alt;
    			sSub=sDaten.Mid(iPos_alt,iLaenge);
    			iPos_alt=iPos+1;
    
    			if(i==0 || i%iSpalten==0){
    				reihe++;
    				sReihe.Format("%i",reihe+1);
    
    				m_List1.InsertItem(reihe, sReihe);
    				spalte=1;
    				m_List1.SetItemText(reihe, spalte, sSub);
    				spalte++;
    
    			}else{
    			m_List1.SetItemText(reihe, spalte, sSub);
    			spalte++;
    			}
    
       		}
    
    		if(m_List1.GetItemText(reihe,spalte)==""){
    		m_List1.DeleteItem(reihe);
    		reihe--;
    		}
    
    		CString title;
    		title.Format("bullmuhs - Aktuelles Papier: %s",m_strList1);
    		SetWindowText(title);
    
    		m_Datei_neu="";
    		m_pathname="";
    
    		::MessageBeep(0xFFFFFFFF);
    		::Sleep(1000);
    
    		interne_nachricht="";
    		CBullmuhsDlg::Indikatoren_Init();
    	}
    
    	UnlockWindowUpdate();
    }
    

    Ich bin gerade wirklich etwas verzweifelt.
    Danke für eure Hilfe!



  • Ich habe gerade nochmal die csv überprüft und dort liegt der Fehler auch nicht.

    Im Moment glaube ich, dass der Fehler hier liegt:

    //Zahl der Einträge
    		int k=0, iEintraege=0;
    
    		for(int i=0;i<=sDaten.GetLength();i++){
    		k=sDaten.Find(",", i);
    			if(k!=-1){
    			i=k;
    			iEintraege++;
    			}else{
    			i=sDaten.GetLength()+1;
    			}
    		}
    
    		//Einträge ins Listenelement übernehmen
    		int iPos=0, iPos_alt=0;
    		int spalte=1,iLaenge=0;
    		reihe=-1;
    
    		for(i=0;i<=iEintraege;i++){
    

    Wie kann ich das eleganter lösen?



  • Folgendes ist mir durch den Kopf gegangen:

    • Kann es sein, dass alle Daten zusammen eine von über 100000 Zeichen besitzen? Wenn ja musst du nur
    TCHAR str[100000];
    

    in [cpp]TCHAR str[200000];[/cpp] umwandeln.

    • Vielleicht bin ich blind aber welches Format hat
    sDaten
    

    ? Wahrscheinlich muss es auch aufgestockt werden ...

    • Offsets in "str": 100000; Der Zähler "i", vom Typ Integer kann aber nur bis 65535 oder 32767 zählen!

    Mit freundlichen Grüßen und ohne Extras
    Rhombicosidodecahedron



  • DAS IST ES!

    VIELEN DANK! Habe die TCHAR vergrößert und schon hat alles gepasst. Super!
    Gibt es für TCHAR eigentlich eine maximale Größe?

    Danke,
    Michael

    P.S.: sDaten ist ein CString. Der Engpass ist also tatsächlich die TCHAR



  • was Rhombicosidodecahedron schreibt wäre ne möglichkeit, nur würde dich das selbe problem dann bei 3844 einträgen wiedereinholen 😉

    sollte das problem daher kommen das es an der größe des chars (str) liegt, wie Rhombicosidodecahedron vermutet.
    lege den auf dateigröße fest dann solltest du nie mehr probleme bekommen.

    CStdioFile *file = new CStdioFile(); 
    CFileStatus rStatus; char *pBuf; 
    if( file->Open( lpstrFileTitle, CFile::modeRead | CFile::typeBinary ) ) 
    { 
    file->GetStatus(rStatus); 
    pBuf = new char [rStatus.m_size 1];
    file->Read(pBuf,rStatus.m_size); file->Close();//Schließe datei 
    }
    

    mfg
    LowFly



  • Ich hatte zwar auch schon eine andere Lösung gefunden, um die Größe von tchar dynamisch zu bestimmen aber die war nur halb so elegant.

    Ich habe deinen Ansatz also implementiert und verbleibe mit Dank!


Anmelden zum Antworten