Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Problem mit Config auslesen und dem Zuordnen eines Array Wertes  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Evilmachine
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.05.2012
Beiträge: 41
Beitrag 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&nbsp;&nbsp;</span>", f);
    printf("<span class=cfglabel style=\"width:150px;\">Frequenz Differenz: %f Hz&nbsp;&nbsp;</span>", fd);
    printf("<span class=cfglabel style=\"width:100px;\">Referenzzeit: %s&nbsp;&nbsp;</span>",ref);
    printf("<span class=cfglabel style=\"width:100px;\">Powerlinetime: %s&nbsp;&nbsp;</span>",plt);
    printf("<span class=cfglabel style=\"width:100px;\">Zeit Differenz: %fs&nbsp;&nbsp;</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: &nbsp;</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




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




Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
C++:
int i = 0;

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




Beitrag 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
Beitrag 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
c++.de :: C (C89, C99 und C11) ::  Problem mit Config auslesen und dem Zuordnen eines Array Wertes  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.