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 | }
|