Problem mit Config auslesen und dem Zuordnen eines Array Wertes
-
Guten Morgen Liebe User,
nächstes Problem.
Mein Programm sieht mittlerweile so aus
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LAENGE 100 //länger der einzelnen Zeilen #define ANZAHL 10 //Anzahl der Zeilen int main(int argc, char** argv) { //Variablen setzen FILE* FDMFILE; FILE* FDMCONFIG; char data[80]; char* fdminfo; double f, fd,td; char ref[20] ="", plt[20] = ""; char* config[5]; char line[256]; int linenum=0; config[6] = ("Frequenz", "FDM Analog Wert 1", "FDM Analaog Wert 2", "Monitoring" , "Oberes Limit", "Unteres Limit" ); //fdm_info Datei öffnen FDMFILE = fopen("/fdm_info", "r"); //checken ob fdm_info geöffnet werden konnte if( !FDMFILE ) goto done; //Inhalt der fdm_info holen und ausgeben if( fgets(data,80, FDMFILE)) //fdm_info String aufsplitten sscanf(data,"F:%lf FD:%lf REF:%s PLT:%s TD:%lf", &f, &fd, ref, plt, &td); //hier beginnt das HTML gefrickel printf("<div class=confhead>\n"); printf("<a href='#10' onMouseUp = \"java\1:showHideInfo('id10','img_10');\">\n"); printf("<img class=opener src='/images/open.gif' alt='Open Box' border = 0 id=img_10 title = 'Aktuelle FDM Daten'>\n"); printf("Aktuelle FDM Daten</a></div>\n"); printf("<div style = 'display:none' id=id10>\n"); printf("<div class=cfgform><div class=cl-left></div><div class=cfgsubconfhead>FDM Daten</div><div class=cfgborders style='height:50px';><div class=cfginput>\n"); //Tabelle mit den Aktuellen Daten generieren printf("<span class=cfglabel style=\"width:100px;\">Frequenz: %f Hz </span>", f); printf("<span class=cfglabel style=\"width:150px;\">Frequenz Differenz: %f Hz </span>", fd); printf("<span class=cfglabel style=\"width:100px;\">Referenzzeit: %s </span>",ref); printf("<span class=cfglabel style=\"width:100px;\">Powerlinetime: %s </span>",plt); printf("<span class=cfglabel style=\"width:100px;\">Zeit Differenz: %fs </span>",td); printf("</div></div></div></div><br /><br />"); //fdm_info schließen fclose(FDMFILE); //HTML Gefrickel Teil 2 printf("<form action = 'mainv2' method=POST>\n"); printf("<div class=confhead>\n"); printf("<a href='#10' onMouseUp = \"java\1:showHideInfo('id11','img_11');\">\n"); printf("<img class=opener src='/images/open.gif' alt='Open Box' border = 0 id=img_11 title = 'FDM Konfiguration'>\n"); printf("FDM Konfiguration</a></div>\n"); printf("<div style = 'display:none' id=id11>\n"); printf("<div class=cfgform><div class=cl-left></div><div class=cfgsubconfhead>FDM Konfiguration</div><div class=cfgborders style='height:50px';><div class=cfginput>\n"); //FDM Konfiguration holen FDMCONFIG = fopen("/etc/fdm_monitor.conf", "r"); //Konnte FDM Config gelesen werden? if( !FDMCONFIG ) goto done; //Inhalt der FDM Config lesen und HTML Formular generieren while(fgets(line, 256, FDMCONFIG) != NULL) { char key[256], value[256]; int i = 0; //Feste Config Werte deklarieren linenum++; if(config[i] == NULL) { config[i] = "Display"; } if(line[0] == '#') continue; if(sscanf(line, "%255[^=]= %255s", key, value) != 2) { fprintf(stderr, "Syntax error, line %d\n", linenum); continue; } printf("<span class=cfglabel style=\"width:100px;\">%s: </span><<input type=text name = 'fdm.%s' value = '%s' size='30'id='fdm.frequenz' maxlength='100'><br />", config[i], config[i], value); i++; } //fdm_info schließen fclose(FDMCONFIG); //HTML abschließen printf("</div></div></div></div><br /><br /></form>"); done: return 0; }
Im Unterem Teil möchte ich nun meine Config auslesen. Diese sieht so aus:
# FDM Monitor Configuration File # fdm powerline frequency = 50 Hz fdm analog 1 = 500 mHz fdm analog 2 = 500 mHz # Enable automatic monitoring # if you disable this there will be no alarms sent monitor=1 # Set upper and lower limits upper limit = 50.500 lower limit = 49.500 # enable remote display connections # all displays need to accept TCP connections on port 10001 # and will receive the standard FDM string as described in the # manual # Please note that you can set up max. 15 displays here # by adding/uncommenting "display = " lines #display = 192.168.0.123 #display = 10.10.2.10 display = 172.16.25.66
Da das ganze als HTML Formular ausgegeben werden soll, versuche ich die config Werte mit eingedeutschten Werten zu ersetzen. Dafür habe ich das Array Config angelegt. Da in dem Config File bis zu 15 Display angegeben werden können, habe ich eine If Abfrage dazwischen geschoben um nicht jedes Display einzeln zu deklarieren, die erkennen soll wenn in der Schleife config = Null ist und diesen Wert dann mit Display überschreiben.
Im Netbeans sagt der Compiler mir noch Run Successful, aber die Config Werte sind alle mit Null versehen und im Webinterface erzeugt das Ding auf einmal gar keine Ausgabe mehr.
Einer ne Idee?
-
Evilmachine schrieb:
char* config[5]; .... config[5] = ("Frequenz", "FDM Analog Wert 1", "FDM Analaog Wert 2", "Monitoring" , "Oberes Limit", "Unteres Limit" );
config ist ein Array aus 5 Zeigern auf char.
Dann weist du dem Element 6 (mit dem Index 5, das gar nicht existiert) einen Wert zu.
Zudem stehen da auch 6 Werte.Du kannst in C einem Array nur bei der Definition Werte zuweisen.
Fasse die Zeilen zusammen:
char* config[] = ("Frequenz", "FDM Analog Wert 1", "FDM Analaog Wert 2", "Monitoring" , "Oberes Limit", "Unteres Limit" );
Bei der Definition eines Arrays stehen in der Klammer die Anzahl der Elemente.
Nicht der höchste Index.Nach mehr habe ich noch nicht geschaut.
-
Ah das war ein Gedankenfehler von mir. Habe die 0 mitgerechnet.
Habe das jetzt geändert.
im unterem Teil des Programms gibt er mir trotzdem noch null für die Config Werte aus.
ich vermute ich habe da einen Fehler in meiner while Schleife.
-
Das
if(config[i] == NULL) { config[i] = "Display"; }
macht sicher nicht, was du möchtest.
In deinem Array config steht gar keine NULL.
-
Ja eben.
Ich möchte ja das wenn die Schleife z.b. config[8] abfragt, was es ja nicht gibt, daraus ein Display macht.
Und wenn es einen Array Wert nicht gibt sollte er doch 0 zurück liefern oder nicht?
Die ersten 6 Werte in der Config sind immer fest. Die Displays sind optional.
-
DirkB schrieb:
char* config[] = ("Frequenz", "FDM Analog Wert 1", "FDM Analaog Wert 2", "Monitoring" , "Oberes Limit", "Unteres Limit" );
Das ist falsch. Da gehört statt () {} hin.
-
Wusste ich es doch.
Hatte ich erst aber dann hat der Compiler gemeckert expected token before {
Genau genommen
main.c:19:17: Fehler: expected expression before »{« token
-
Evilmachine schrieb:
Und wenn es einen Array Wert nicht gibt sollte er doch 0 zurück liefern oder nicht?.
Natürlich nicht. Du bist hier bei C und eben nicht bei "höheren" Programmiersprachen, die bei einem Zugriff außerhalb definierter Speicher/wertebereiche glauben, irgendwas Selbstberechnetes rückgeben zu müssen.
Außerdem ist deinint i = 0;
bei dir anschließend beim Zugriff immer 0.
-
Evilmachine schrieb:
Ich möchte ja das wenn die Schleife z.b. config[8] abfragt, was es ja nicht gibt, daraus ein Display macht.
Da es das Element nicht gibt, darfst du darauf nicht zugreifen. Nein, nicht, niemals.
Nicht lesend und schon gar nicht schreibend.Evilmachine schrieb:
Und wenn es einen Array Wert nicht gibt sollte er doch 0 zurück liefern oder nicht?
C macht keine Überprüfung der Arraygrenzen.
Das kostet nur Zeit.Evilmachine schrieb:
Die ersten 6 Werte in der Config sind immer fest. Die Displays sind optional.
Dann vergleich deinen Index i doch mit der 6.
Zählt i überhaupt weiter?Du kannst dein Array auch größer machen:
char* config[20] = {"Frequenz", "FDM Analog Wert 1", "FDM Analaog Wert 2", "Monitoring" , "Oberes Limit", "Unteres Limit" , NULL}; // der Rest wird mit 0 aufgefüllt.
-
Auch wenn ich das kurz vorm ende der Schleife mit i++; einen höher setze??
Sorry wie gesagt. Ich bin C Neuling und vorher von PHP und Java gekommen^^
EDIT: Ah Danke Dirk. Jetzt füllt er zumindest die Config Werte ein. Aber er zählt nicht höher. Er nimmt überall nur Frequenz.
Aber i++; sollte doch richtig sein??
linenum++: funzt ja auch.
-
Evilmachine schrieb:
EDIT: Ah Danke Dirk. Jetzt füllt er zumindest die Config Werte ein. Aber er zählt nicht höher. Er nimmt überall nur Frequenz.
Aber i++; sollte doch richtig sein??
linenum++: funzt ja auch.
Dann schau doch mal wann (in welchem Scope) du die Varablen definierst.
linenum ist im Scope von main.
i ist im Scope deiner while-Schleife.
Und da sagst du gleich am Anfang:i = 0;
Da du i aber initialisieren musst, musst du i demnach woanders definieren.
-
Ja hatte ich eben auch gesehen. Sorry.
Hatte zwischendurch auch noch mit nem Segfault zu kämpfen.
Jetzt geht es aber soweit.
Dankeschön.
-
Evilmachine schrieb:
Hatte zwischendurch auch noch mit nem Segfault zu kämpfen
Wolltest du ein Stringliteral verändern oder an Adresse NULL schreiben/lesen?
-
Das Problem beim Segfault war, das einer der Werte NULL war und deshalb ging es nicht.