Array Inhalt Verschieben



  • Hi,

    ich versuche gerade in meinem Projekt den Inhalt eines Arrays (Mehrdimenisonal) um mehrer Indexe zu verschieben.

    Grund dafür ist, die Daten können evtl mehrfach vorhanden sein, weswegen ich sie aus meiner Liste lösche und anschliesend die die noch da sind eine fortlaufende Nummer zuweise.

    Leider übernimmt er die Werte erst, sobald ich über den Index von 316 gehe was zur Folge hat wenn ich das Array lösche eine Fehlermeldung kommt mit folgendem Inhalt "DAMAGA: after normal block (#862)..."

    Frage mache ich das überhaupt richtig?

    // m_kennlinie = new double[316][3][3000];
    
    	UpdateData(true);
    	// Nr, neu zuordnen
    	CString sNr;
    
    	for(int z=0; z < m_gesamtanzahl+1; z++) 
    	{
    		// Nr Besorgen
    		CString	ausw = m_liste.GetItemText(z, 0);
    		int sel = atoi(ausw);
    
    		// Auf Array Index bringen
    		sel -= 1;
    
    		// Nr ändern
    		sNr.Format("%d", z+1);
    		m_liste.SetItemText(z, 0, sNr);
    
    		int x = -1;		// da zu beginn x++ = 0
    
    		sDebug.Format("%f", m_kennlinie[315][2][sel]);
    		//AfxMessageBox(sDebug);
    
    		do
    		{
    			x++;
    
    			if(x > 315)
    				break;
    
    			for(int n = 0; n <= 2; n++) 
    			{
    				// Daten kopieren
    				m_kennlinie[x][n][z] = m_kennlinie[x][n][sel];
    				m_kennlinie[x][n][sel] = NULL;	 
    			}
    
    		} while( m_kennlinie[x][0][sel] != -1);
    	}
    

  • Mod

    Diese Schleifen sehen ja fürchterlich aus.
    Warum eine do/while Schleife, Warum kein normaler for?

    Was ist bitte mit Gesamtanzahl+1?
    Das wäre bei einem ab 0 laufenden Array falsch.

    Das Problem kann schon sein, dass z eine Zeile angibt, die nicht Existent ist.
    Die Folge: sel=0, --sel... Array Index -1?



  • Danke für deine Antwort...Mittlerweile versuche ich es mir folgenden Code:

    UpdateData(true);
    	// Nr, neu zuordnen
    	CString sNr;
    
    	for(int z=0; z <= m_gesamtanzahl; z++) 
    	{
    		// Nr aus Liste hollen (beginnt mit 1...) und auf Array Index bringen
    		int sel = atoi(m_liste.GetItemText(z, 0)) - 1;
    
    		if(sel < 0)
    			break;
    
    		// Nr ändern
    		sNr.Format("%d", z+1);
    		m_liste.SetItemText(z, 0, sNr);
    
    		int x=0;
    		for(x=0; m_kennlinie[x][0][sel] != -1; x++)
    		{
    			for(int n = 0; n < 3; n++) 
    			{
    				// Daten kopieren
    				m_kennlinie[x][n][z] = 0;
    				m_kennlinie[x][n][z] = m_kennlinie[x][n][sel];	
    				m_kennlinie[x][n][sel] = NULL;
    			}
    		} 
    	}
    

    Ich habe aber den Eindruck, das die Werte garnicht verschoben werden...



  • Habe mir jetzt mal eine Ausgabe von den Indexe:

    <14:55:48> m_kennlinie[0][0][0] = 0.287000 *** m_kennlinie[0][0][2] = 0.287000
    <14:55:48> m_kennlinie[0][1][0] = 0.314300 *** m_kennlinie[0][1][2] = 0.314300
    <14:55:48> m_kennlinie[0][2][0] = 0.564500 *** m_kennlinie[0][2][2] = 0.564500
    <14:55:48> m_kennlinie[1][0][0] = 0.297700 *** m_kennlinie[1][0][2] = 0.297700
    <14:55:48> m_kennlinie[1][1][0] = 0.312900 *** m_kennlinie[1][1][2] = 0.312900
    <14:55:48> m_kennlinie[1][2][0] = 0.579600 *** m_kennlinie[1][2][2] = 0.579600
    <14:55:48> m_kennlinie[2][0][0] = 0.308400 *** m_kennlinie[2][0][2] = 0.308400
    <14:55:48> m_kennlinie[2][1][0] = 0.308400 *** m_kennlinie[2][1][2] = 0.308400
    <14:55:48> m_kennlinie[2][2][0] = 0.590900 *** m_kennlinie[2][2][2] = 0.590900
    <14:55:48> m_kennlinie[3][0][0] = 0.319200 *** m_kennlinie[3][0][2] = 0.319200
    <14:55:48> m_kennlinie[3][1][0] = 0.301100 *** m_kennlinie[3][1][2] = 0.301100
    .
    .
    .
    <14:56:34> m_kennlinie[159][1][3] = 0.135700 *** m_kennlinie[159][1][9] = 0.135700
    <14:56:34> m_kennlinie[159][2][3] = 0.610300 *** m_kennlinie[159][2][9] = 0.610300
    <14:56:34> m_kennlinie[160][0][3] = 0.173200 *** m_kennlinie[160][0][9] = 0.173200
    <14:56:34> m_kennlinie[160][1][3] = 0.120900 *** m_kennlinie[160][1][9] = 0.120900
    <14:56:34> m_kennlinie[160][2][3] = 0.591300 *** m_kennlinie[160][2][9] = 0.591300
    <14:56:35> m_kennlinie[161][0][3] = 0.179300 *** m_kennlinie[161][0][9] = 0.179300
    <14:56:35> m_kennlinie[161][1][3] = 0.104300 *** m_kennlinie[161][1][9] = 0.104300
    <14:56:35> m_kennlinie[161][2][3] = 0.565000 *** m_kennlinie[161][2][9] = 0.565000
    <14:56:35> m_kennlinie[162][0][3] = 0.185300 *** m_kennlinie[162][0][9] = 0.185300
    <14:56:35> m_kennlinie[162][1][3] = 0.086100 *** m_kennlinie[162][1][9] = 0.086100
    <14:56:35> m_kennlinie[162][2][3] = 0.529900 *** m_kennlinie[162][2][9] = 0.529900
    <14:56:35> m_kennlinie[163][0][3] = 0.191400 *** m_kennlinie[163][0][9] = 0.191400
    <14:56:35> m_kennlinie[163][1][3] = 0.066400 *** m_kennlinie[163][1][9] = 0.066400
    <14:56:35> m_kennlinie[163][2][3] = 0.484100 *** m_kennlinie[163][2][9] = 0.484100
    <14:56:35> m_kennlinie[164][0][3] = 0.197400 *** m_kennlinie[164][0][9] = 0.197400
    <14:56:35> m_kennlinie[164][1][3] = 0.045300 *** m_kennlinie[164][1][9] = 0.045300
    <14:56:35> m_kennlinie[164][2][3] = 0.425600 *** m_kennlinie[164][2][9] = 0.425600
    <14:56:35> m_kennlinie[165][0][3] = 0.203500 *** m_kennlinie[165][0][9] = 0.203500
    <14:56:35> m_kennlinie[165][1][3] = 0.023100 *** m_kennlinie[165][1][9] = 0.023100
    <14:56:35> m_kennlinie[165][2][3] = 0.351800 *** m_kennlinie[165][2][9] = 0.351800
    <14:56:35> m_kennlinie[166][0][3] = 0.206500 *** m_kennlinie[166][0][9] = 0.206500
    <14:56:35> m_kennlinie[166][1][3] = 0.011550 *** m_kennlinie[166][1][9] = 0.011550
    <14:56:35> m_kennlinie[166][2][3] = 0.305850 *** m_kennlinie[166][2][9] = 0.305850
    <14:56:35> m_kennlinie[167][0][3] = 0.209500 *** m_kennlinie[167][0][9] = 0.209500
    <14:56:35> m_kennlinie[167][1][3] = 0.000000 *** m_kennlinie[167][1][9] = 0.000000
    <14:56:35> m_kennlinie[167][2][3] = 0.259900 *** m_kennlinie[167][2][9] = 0.259900

    Aber leider hat dies keine Auswirkung...

    So werden die Daten dann an ein anderes Dialog weitergegeben:

    //Beim klick auf den "Zeichnen" Button werden die Werte und die Kennlinie der markierten
    //Auslegung übergeben
    void OnButtonZeichnen()
    {
    	UpdateData(true);
    	CString	ausw=m_liste.GetItemText(m_liste.GetSelectionMark(),0);
    
    	int sel=atoi(ausw);
    	sel-=1;
    
    	if(sel>=0)
    	{
    		double aktKennlinie[316][3];
    		double aktSchallwerte[50][2];
    		int i=-1;
    		do
    		{
    			i++;
    			for(int n=0;n<=2;n++)
    				aktKennlinie[i][n]=m_kennlinie[i][n][sel];
    
    		} while(m_kennlinie[i][0][sel]!=-1);
    
    		int aktWinkel[16];
    		i=-1;
    
    		do
    		{
    			i++;
    			aktWinkel[i]=m_winkel[i][sel];
    
    		} while(m_winkel[i][sel]!=-1);
    
    		for(int n=0;n<=49;n++)
    			for(int j=0;j<=1;j++)
    				aktSchallwerte[n][j]=m_schallwerte[n][j][sel];
    ...
    ...
    }
    

  • Mod

    Sag mal kannst Du keine for Schleifen?
    Warum immer do/while und dann eigentümliche Initialisierung der Laufzeitwerte?

    Du bekommst Doch einen Break im Debugger. Schau Dir den Callstack an. Wann das passiert!



  • 😃 , leider ist das nicht meine Umsetzung, ich versuche nur ein vorhandenes Projekt zu erweitern. Und du hast Recht, diese Art von Schleife ist sehr Mehrkwürdig....


Anmelden zum Antworten