LabWindows Daten aus TXT in struct lesen

OP #6949225
Lesenswert?

Hallo zusammen,

ich würde gerne Daten aus einer TXT in ein struct lesen. Das möchte ich 
recht dynamisch machen, sodass schnell Daten gelöscht oder hinzugefügt 
werden können. Ich habe mir dazu folgendes überlegt und würde dies gerne 
mit einem Pointer realisieren. Der Compiler akzeptiert meinen Code, 
jedoch die Prüfung der "Debugging level: Standard" titelt es mit "FATAL 
RUN-TIME ERROR" mit der Meldung "Dereference of out-of-bounds pointer: 1 
bytes past end of array".

Mir ist bewusst, dass am Schluss der Pointer außerhalb des Arrays steht, 
aber zu diesem Zeitpunkt wird er ja nicht mehr verwendet und schließt 
die Funktion, sodass auch der Zeiger aufgelöst wird. Im Release Mode 
wird das Programm ordnungsgemäß ausgeführt und alle Variablen befüllt. 
Wenn ich im Debug Mode das Debugging level auf "No run-time checking" 
stelle, funktioniert auch im Debug Mode mit Haltepunkten alles fein. 
Auffallend ist, dass der FATAL ERROR nach dem der pointer das erste mal 
erhöht wurde (pointer++) anschließend in Zeile 58 hängt, egal wie groß 
das Array ist.

Versteht die Prüfung / Debugging level meine Absicht nicht, oder stimmt 
etwas mit meinem Code formell nicht? Danke für eure Hilfe.

Daten in der TXT:
1
[START]
2
a=5
3
b=7
4
c=123456
5
[ENDE]

LabView Code:
1
// ACHTUNG: Anzahl der enthaltenen Variabeln muss bei #define "CONFIG_ANZAHL_VARIABELN" und struct "config" übereinstimmen!!
2
// Variabeln dürfen nur vom Typ "int" sein, damit Pointersprung funktioniert!!
3
#define CONFIG_ANZAHL_VARIABELN      3
4
#define CONFIG_ERSTES_ELEMENT      config.a
5
struct Config_Struct
6
{
7
  int a;
8
  int b;
9
  int c;
10
}config;
11

12
/**
13
  * @brief    Liest alle Variabeln aus der Datei config.txt aus.
14
  * @param    None
15
  * @retval   int: ERROR_KEINER (0), ERROR (-1);
16
  */
17
int config_lesen(void)
18
{
19
  int   return_Wert      = ERROR;
20
  int   cnt          = 0;
21
  int   cnt_Ende      = 0;
22
  int   check        = 0;
23
  ssize_t size         = 0;
24
  int   TXT_Info      = GetFileInfo(PFAD_CONFIG_TXT, &size);
25
  int   *p_config      = &CONFIG_ERSTES_ELEMENT;
26
  char   TXT_string[size];
27
  char   buffer_Wert[8];
28
  
29
  for(cnt=0;cnt<size;cnt++)  TXT_string[cnt]   = 0;
30
  for(cnt=0;cnt<8;cnt++)    buffer_Wert[cnt]   = 0;
31
  
32
  // Datei vorhanden und es stehen Daten darin
33
  if(TXT_Info==1 && size>=10)
34
  {
35
    TXT_Info = OpenFile(PFAD_CONFIG_TXT, VAL_READ_ONLY, VAL_OPEN_AS_IS, VAL_ASCII);
36
    ReadFile(TXT_Info, TXT_string, size);
37
    
38
    // Prüft, ob die Anzahl der Variabeln in der Datei mit dem struct übereinstimmt
39
    for(cnt=0;cnt<size;cnt++)
40
    {
41
      if(TXT_string[cnt]=='=')  check++; 
42
    }
43
    
44
    if(check==CONFIG_ANZAHL_VARIABELN)
45
    {
46
      for(cnt=0;cnt<size;cnt++)
47
      {
48
        if(TXT_string[cnt]=='=')
49
        {
50
          for(cnt_Ende=0;cnt_Ende<=7;cnt_Ende++)
51
          {
52
            if(TXT_string[cnt+1+cnt_Ende]==10)  break;// LineFeed
53
            buffer_Wert[cnt_Ende] = TXT_string[cnt+1+cnt_Ende];
54
          }
55
          
56
          if(my_atoi(buffer_Wert)!=ERROR)
57
          {
58
            *p_config = my_atoi(buffer_Wert);
59
            p_config++;
60
          }
61
          else  return return_Wert;
62
        }
63
      }
64
      
65
      CloseFile(TXT_Info);
66
      return_Wert = ERROR_KEINER;
67
    }
68
  }
69
  
70
  return return_Wert;
71
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren