Forum: PC-Programmierung LabWindows Daten aus TXT in struct lesen


von Andreas R. (noobsen)


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
}

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Wo reservierst du dir den Speicher für ein Array von "Config_Struct"?

von Andreas R. (noobsen)


Lesenswert?

Irgend W. schrieb:
> Wo reservierst du dir den Speicher für ein Array von
> "Config_Struct"?

Hi,
dieser wird nicht reserviert.
Ich dachte die Funktion "malloc" muss nur verwendet werden, wenn unter 
der Laufzeit es variabel "gebaut / erschaffen" wird. Das struct steht in 
der .h File.
Verstehe ich da was falsch?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.