Autor Beitrag
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 369
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Do 30.05.19 14:15 
Hallo;
Ich habe unter C++ eine Struktur mit folgenden Inhalt:

ausblenden 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

_________________
Brain: an apparatus with which we think we think.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4049
Erhaltene Danke: 838

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 369
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Do 30.05.19 15:54 
Danke für die schnelle Reaktion.
ausblenden 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

_________________
Brain: an apparatus with which we think we think.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4049
Erhaltene Danke: 838

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 369
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: 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

_________________
Brain: an apparatus with which we think we think.