Entwickler-Ecke

Alle Sprachen - Alle Plattformen - c++ Struktur Fehler


ssb-blume - Do 30.05.19 14:15
Titel: c++ Struktur Fehler
Hallo;
Ich habe unter C++ eine Struktur mit folgenden Inhalt:


C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
const int maxM = 64;

typedef struct _TRegister
  {
    string Name;         // name des registers
    bool On;             // register ist an? 
    char Werk;           // H, O, S, P, A, K, X
    byte Led;            // led-adresse (0..63)
    int i;               // nr. für koppel, programm oder setzer
    DWORD sample[maxM];  // sample rumpf 
    DWORD sampler[maxM]; // sample schwanz
    bool on[maxM];       // taste an? 
  }
  TRegister;

  _TRegister REG[maxMidi];      // ohne new

  _TRegister *REG;              // another 
  REG = new _Tregister[maxM]


Das Array REG wird nun mit Daten gefüllt.
Dabei entsteht immer ein Ram-Zugriff-Fehler bei einem Element (7. Element des Array, Element Name). Und nur bei diesem!

Nun die Frage:
Wenn ich das Array mit new Erzeuge entsteht kein Fehler, die im Record vorhandenen Unterarrays sind jedoch nicht richtig erzeugt.
Wie muß ich die Unterarrays deklarieren, das Sie in voller Länge in REG vorhanden sind?

Ich mache C++ sehr selten, daher die Frage wie ein Anfänger.-..

Übrigens: Memtest gemacht, (16GB) kein Fehler!

Hansi


Th69 - Do 30.05.19 14:54

Welchen Wert hat denn maxMidi?
Und sollte es nicht auch REG = new _TRegister[maxMidi] heißen?

Ich nehme an beim Befüllen entsteht der Fehler, weil du außerhalb der erlaubten Array-Indizes zugreifst.


ssb-blume - Do 30.05.19 15:54

Danke für die schnelle Reaktion.

Quelltext
1:
maxmidi = 64;                    

da sind 2 bereiche als auswahl, mit und ohne new! ( zur Auswahl! natürlich im Programm nur eine deklaration!)

Der Zugriffsfehler ist immer an der gleichen Stelle des Array: Element-nr. 7: name
Wird die Struktur-Reihenfolge geändert, ändert sich auch die Fehlerstelle!

Die frage ist eigentlich:
wie muß ich die Arrays (DWORD..) initialisieren, damit sie im Record-array existieren???

hansi

Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Fr 31.05.19 09:29

Wenn es nur an dem Member Name liegt, dann habe ich die Vermutung, daß du die Struktur als POD (plain old data) benutzt - aber da string ja eine Klasse ist, nicht byteweise kopiert werden sollte.
Teste mal, ob es ohne den Member Name funktioniert (oder mit einem char Name[maxName]).

Wenn du trotzdem nicht weiterkommst, dann zeige mal relevanten Code zum Erzeugen, Befüllen und Auslesen der Struktur.


ssb-blume - Sa 01.06.19 09:46

Auf die Idee muss man erst mal kommnen!

Der Membername war schon auf nam geändert, man weis ja nie..

Natürlich, da string etwas besonderes in C ist, ist ein Char genau das richtige!
Der Text bei dem Fehler war besonders lang, alle anderen waren wesentlich kürzer.
Hab die Länge geändert und der Fehler war weg; Man sollte bei solchen Rekords immer auf gleiche Länge achten.
Also, nochmals vielen Dank für die Antwort!!

Hansi