dynamisches Array



  • Hallo Zusammen,
    ich soll innerhalb einer Struct dynamisch ein Array erzeugen. Die Struct ist:

    // Fehlermeldung
    struct fehlermeldungen_fi_rt
    {
    	header_rt header;			// Header
    	gps_zeit_rt gps_zeit;		// GPS-Zeit
    	u_short anforderungs_ident;		// Anforderungsidentitaet
    	flaeflu_komponente_et komponente;	// Kontrollkomponente
    	u_short anzahl;			// Anzahl der Fehler
    	struct
             {  			         // Fehlerliste
    		u_int fehlerliste_len;
    		fehler_rt* fehlerliste_val;
    	} fehlerliste;
    };
    typedef struct fehlermeldungen_fi_rt fehlermeldungen_fi_rt;
    
    struct fehler_rt
    {
    	fehler_klasse_et id;
    	char *fehlertext;
    };
    typedef struct fehler_rt fehler_rt;
    

    Die Datentypen ,,fehler_rt" und ,,char * fehlertext;" werden mit unterschiedlichen Längen erzeugt. Der Code hierzu ist:

    fehlermeldungen_fi_rt	Fehlermel;	// Fehlermeldung
    
    Fehlermel.fehlerliste.fehlerliste_val = new fehler_rt[ErrList->usAnzFehler-1];
    	// Textfelder generieren
    	for (i = 0; i < ErrList->usAnzFehler; i++)
    	{
    	 Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext = new char[255];
    	   // Feld loeschen
                for (j = 0; j < 255; j++)
    	     Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext[j] = '\0';
    	}
    

    Char werden in das so generierte Feld kopiert:

    for (i = 0; i < ErrList->usAnzFehler; i++)
       strcpy(Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext , ErrList->Err[i].cErrtxt);
    

    geloescht werden Die Felder mit:

    // Textfelder loeschen
    	for (i = ErrList->usAnzFehler-1; i >= 0 ; i--)
    		delete Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext;
    	delete Fehlermel.fehlerliste.fehlerliste_val;
    

    Ich erhalte beim beschreiben der Arrays mit dem letzten (größten) Index die Fehlermeldung ,,Zugriffsverletzung bei Adresse325509CA in Modul CC3250MT.DLL, schreiben von Adresse34303032". Die Schleifenzaehler habe ich überprüft. Die Arrays werden beginnend mit dem grössten Index gelöscht. Bei jedem Durchlauf der Funktion werden die Arrays mit anderen Längen angelegt und wieder gelöscht.

    Habe ich in meinem Code einen Fehler oder das Problem grundsätzlich falsch angefasst?
    Danke für Eure Hilfe
    Evi48

    Edit:
    Bitte die Code-Tags benutzen. Danke!



  • nimm statt char* einfach string.



  • Hallo,
    das würde ich sehr gern aber die Struktur ist leider so vorgeschrieben.

    Evi48



  • Wieso ist die Struktur so vorgeschrieben? Umwandlung von String zu Char: c_str(); (Klassenmethode von string/AnsiString)



  • Die Struktur ist Bestandteil einer XDR-Übertragung. Das heißt ein Rechner- und Systemunabhängiger Datenaustausch wird per LAN durchgeführt. Die Struktur wird durch Softwaretools (RPC-Gen) aus einer X-Datei erzeugt, in der die Datentypen und strukturen festgelegt werden. Diese Dateien werden unter allen Anwendern ausgetauscht, die die Daten nutzen wollen. Leider kommen wir erst jetzt in die Reihe der Nutzer und müssen uns an den Gegebenheiten orientieren.

    Evi48



  • HI,

    überprüfe, wann der Fehler kommt. bzw. wie Groß i dann ist

    übrigens wäre:

    delete [] Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext;
    

    nicht besser ?



  • Das ist richtig, aber die Version erzeugt leider den gleichen Fehler.

    Evi48



  • ich hab nciht behaubtet, das damit der Fehelr behoeben ist 😉

    wie groß ist i, wenn der Fehler auftritt ?



  • Hallo,

    Deine Fehlerliste ist um 1 zu klein.
    siehe

    Fehlermel.fehlerliste.fehlerliste_val = new fehler_rt[ErrList->usAnzFehler-1]; 
        // Textfelder generieren 
        for (i = 0; i < ErrList->usAnzFehler; i++) 
        { 
         Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext = new char[255];
    

    Du hast ein Feld mit ErrList->usAnzFehler-1 Elementen, schreibst aber ErrList->usAnzFehler Elemente rein (Schleifenindex beginnt bei 0).

    Ciao



  • Hallo,
    ich beginne bei Null und möchte 10 Felder reservieren. In

    ErrList->usAnzFehler
    

    steht eine 10. So habe ich von 0 bis 9 10 Felder reserviert. Beim löschen der Felder frage ich dann nach kleiner 10 ab und beginne wieder bei 0

    for (i = 0; i < ErrList->usAnzFehler; i++)
    		delete [] Fehlermel.fehlerliste.fehlerliste_val[i].fehlertext;
    

    das sollte eigentlich funktionieren.

    Mir ist heute Nacht der Gedanke gekommen, daß der Heap nicht ausreicht, wie kann ich den beeinflussen?

    Evi48



  • Man bin ich BLIND. Entschuldigung du hast recht!

    Evi48



  • Hallo,
    euch allen vielen Dank für eure Hilfe.

    Kaum macht mans richtig dann läuft es auch

    Evi48



  • evi48 schrieb:

    Kaum macht mans richtig dann läuft es auch

    Was hätte man auch anderes erwartet 😃


Anmelden zum Antworten