| Autor |
Nachricht |
Evilmachine
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.05.2012
Beiträge: 41
|
Evilmachine Mitglied
09:07:20 04.05.2012 Titel: |
Problem mit Config auslesen und dem Zuordnen eines Array Wertes |
Zitieren |
Guten Morgen Liebe User,
nächstes Problem.
Mein Programm sieht mittlerweile so aus | C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #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 = \"javascript: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 = \"javascript: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:
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 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? |
Zuletzt bearbeitet von Evilmachine am 09:32:28 04.05.2012, insgesamt 1-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
09:25:14 04.05.2012 Titel: |
|
Zitieren |
| Evilmachine schrieb: | | C++: | 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:
| C++: | | 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. |
|
|
|
 |
Evilmachine
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.05.2012
Beiträge: 41
|
Evilmachine Mitglied
09:28:10 04.05.2012 Titel: |
|
Zitieren |
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. |
|
|
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
09:33:10 04.05.2012 Titel: |
|
Zitieren |
Das| C++: | if(config[i] == NULL)
{
config[i] = "Display";
} | | macht sicher nicht, was du möchtest.
In deinem Array config steht gar keine NULL. |
|
|
|
 |
Evilmachine
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.05.2012
Beiträge: 41
|
Evilmachine Mitglied
09:35:03 04.05.2012 Titel: |
|
Zitieren |
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. |
Zuletzt bearbeitet von Evilmachine am 09:35:28 04.05.2012, insgesamt 1-mal bearbeitet |
|
 |
Wutz
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2705
|
Wutz Mitglied
09:39:44 04.05.2012 Titel: |
|
Zitieren |
| DirkB schrieb: |
| C++: | | char* config[] = ("Frequenz", "FDM Analog Wert 1", "FDM Analaog Wert 2", "Monitoring" , "Oberes Limit", "Unteres Limit" ); | |
|
Das ist falsch. Da gehört statt () {} hin. |
_________________ Java, the best argument for Smalltalk since C++. -- Frank Winkler
|
|
 |
Evilmachine
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.05.2012
Beiträge: 41
|
Evilmachine Mitglied
09:41:51 04.05.2012 Titel: |
|
Zitieren |
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 |
Zuletzt bearbeitet von Evilmachine am 09:42:51 04.05.2012, insgesamt 1-mal bearbeitet |
|
 |
Wutz
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2705
|
Wutz Mitglied
09:42:47 04.05.2012 Titel: |
|
Zitieren |
| 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 dein
bei dir anschließend beim Zugriff immer 0. |
_________________ Java, the best argument for Smalltalk since C++. -- Frank Winkler
Zuletzt bearbeitet von Wutz am 09:44:00 04.05.2012, insgesamt 1-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
09:43:06 04.05.2012 Titel: |
|
Zitieren |
| 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:
| C++: | | 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. | | |
|
|
|
 |
Evilmachine
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.05.2012
Beiträge: 41
|
Evilmachine Mitglied
09:44:33 04.05.2012 Titel: |
|
Zitieren |
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. |
Zuletzt bearbeitet von Evilmachine am 09:47:01 04.05.2012, insgesamt 1-mal bearbeitet |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|