Veröffentlicht 8. November 200420 j Hallo! Ich habe erst vor kurzem mit C angefangen und Teile eines Programms übernommen. Inzwischen habe ich einiges verändert und habe jetzt eben einen Fehler den ich mir nicht erklären kann. Ich habe 2 HTML Seiten die jeweils in der Variablen "site" ihren Namen (also "test" und "setup") übergeben. Anhand von dieser Variablen soll mein CGI Programm in C die Werte verarbeiten, und anschließend die gesetzten Werte auf der jeweiligen Seite wieder ausgeben. Allerdings gibt er mir bei if (site=="test") anschließend setup.html aus (bei (site=="setup") gibt er auch setup.html aus, setzt aber die Werte nicht ... if (site=="test") { param = fopen("/home/httpd/ohne_frames/test.html", "r"); if (!param) return 0; dynp = fopen("/home/httpd/test.html", "w"); if (!dynp) return 0; /* Kopieren des Templates als neues html file */ while (!feof(param)) { char * line = 0; size_t l = 0; getline(&line,&l, param); if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0)) { /* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */ fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par); if (prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n"); else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n"); else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n"); fprintf(dynp, "}</script>\n"); } fputs(line, dynp); } fclose(dynp); dynp_in = fopen("/home/httpd/test.html", "r"); while (!feof(dynp_in)) { char buf[1024]; len = fread(&buf, 1, 1024, dynp_in); fwrite(buf, 1, len, stdout); } fclose(dynp_in); } else if (site=="setup") { setup = fopen("/home/httpd/ohne_frames/setup.html", "r"); if (!setup) return 0; s_temp = fopen("/home/httpd/setup.html", "w"); if (!s_temp) return 0; while (!feof(setup)) { char * line = 0; size_t l = 0; getline(&line,&l, setup); if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0)) { fprintf(s_temp, "<script> function loaded(){\n"); if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n"); else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n"); if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n"); else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n"); else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n"); else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n"); else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n"); else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n"); fprintf(s_temp, "}</script>\n"); } fputs(line, s_temp); } fclose(s_temp); s_temp_in = fopen("/home/httpd/setup.html", "r"); while (!feof(s_temp_in)) { char buf[1024]; len = fread(&buf, 1, 1024, s_temp_in); fwrite(buf, 1, len, stdout); } fclose(s_temp_in); } [/PHP] Wo liegt denn der Fehler?
8. November 200420 j Ist site ein char-Array oder char-Zeiger? Falls ja: Die kannst du nicht mit == vergleichen, da dann nur ein Adressenvergleich durchgeführt wird. Du musst die Funktion strcmp verwenden.
8. November 200420 j Wenn ich das auf: if (strcpy (site, "site")=="test") ändere ... ändert sich nichts ...
8. November 200420 j okay: int main(int argc, char *argv[]) { int prog; int par; int lang; int unit; char site[20]; FILE * param; FILE * test; FILE * dynp; FILE * dynp_in; FILE * setup; FILE * s_temp; FILE * s_temp_in; int kom_handle; /* Lesen der Umgebungsparameter */ const char * rm = GetEnv("REQUEST_METHOD"); const char * cl = GetEnv("CONTENT_LENGTH"); int len = atoi(cl); char * buffer = malloc(len+1); if (strcmp(rm, "POST") == 0) { fread(buffer,1, len, 0); buffer[len+1] = 0; } else if (strcmp(rm,"GET")==0) { buffer = getenv("QUERY_STRING"); } /* Lesen aller Form Parameter */ ParseFormParameters(buffer); /* Zugriff auf ausgewaehlte Parameter */ prog = atoi(FindParameterValue("program")); par = atoi(FindParameterValue("parameter")); lang = atoi(FindParameterValue("language")); unit = atoi(FindParameterValue("torqueunit")); strcpy (site, "site"); /* Ablage der Daten in einer "Parameterdatei" */ test = fopen("test.dat", "w"); fprintf(test, "%i\n", prog); fprintf(test, "%i\n", par); fprintf(test, "%i\n", lang); fprintf(test, "%i\n", unit); /* Erzeugen der Antwort an den Browser */ printf("content-type: text/html\n\n"); /* Oeffnen des Templates */ if(0 == strcmp(site, "test")) { param = fopen("/home/httpd/ohne_frames/test.html", "r"); if (!param) return 0; dynp = fopen("/home/httpd/test.html", "w"); if (!dynp) return 0; /* Kopieren des Templates als neues html file */ while (!feof(param)) { char * line = 0; size_t l = 0; getline(&line,&l, param); if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0)) { /* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */ fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par); if (prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n"); else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n"); else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n"); fprintf(dynp, "}</script>\n"); } fputs(line, dynp); } fclose(dynp); dynp_in = fopen("/home/httpd/test.html", "r"); while (!feof(dynp_in)) { char buf[1024]; len = fread(&buf, 1, 1024, dynp_in); fwrite(buf, 1, len, stdout); } fclose(dynp_in); } else { setup = fopen("/home/httpd/ohne_frames/setup.html", "r"); if (!setup) return 0; s_temp = fopen("/home/httpd/setup.html", "w"); if (!s_temp) return 0; while (!feof(setup)) { char * line = 0; size_t l = 0; getline(&line,&l, setup); if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0)) { fprintf(s_temp, "<script> function loaded(){\n"); if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n"); else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n"); if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n"); else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n"); else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n"); else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n"); else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n"); else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n"); fprintf(s_temp, "}</script>\n"); } fputs(line, s_temp); } fclose(s_temp); s_temp_in = fopen("/home/httpd/setup.html", "r"); while (!feof(s_temp_in)) { char buf[1024]; len = fread(&buf, 1, 1024, s_temp_in); fwrite(buf, 1, len, stdout); } fclose(s_temp_in); }[/PHP]
8. November 200420 j strcpy (site, "site"); ... if(0 == strcmp(site, "test")) [/PHP] Du setzt site auf "site" und vergleichst dann mit "test"? [PHP] if(prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n"); else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n"); else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n"); Machs doch so: fprintf(dynp, "document.forms[0].program[%d].checked=true;\n", prog-1); [/PHP] Mit deinen anderen if-if/else-Kaskaden kannst du das gleiche machen. [PHP] getline(&line,&l, setup); Wie sieht getline aus? Ich vermute da ein massives Speicherleck. if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n"); else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n"); if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n"); else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n"); else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n"); else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n"); else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n"); else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n"); [/PHP] Auch hier reicht je eine Zeile: [PHP] fprintf(setup, "document.SetupForm.language[%d].checked=true;\n", lang - 1); fprintf(setup, "document.SetupForm.torqueunit[%d].checked=true;\n", unit - 1);
8. November 200420 j strcpy (site, "site"); ... if(0 == strcmp(site, "test")) [/PHP] Du setzt site auf "site" und vergleichst dann mit "test"? Hast Recht - ist üflü - strcpy ist gelöscht ... [PHP] getline(&line,&l, setup); Wie sieht getline aus? Ich vermute da ein massives Speicherleck. Das sind die einzigen 2 Vorkommen von getline ...
8. November 200420 j getline(&line,&l, setup); [/PHP] Wie sieht getline aus? Ich vermute da ein massives Speicherleck. So wie ich es verstehe, sind die Parameter falsch. Gibt er dir keine Fehlermeldung dazu aus? Der 3. Parameter (so wie ich es weiss), muss immer angeben, bis zu welchem Zeichen er die Zeile einlesen soll. Ich kenne getline nur in Verbindung mit ifstream. Du könntest es doch auch mit [PHP] char *gets(char *buffer); versuchen. Wenn du aber bei getline bleiben magst, kann ich dir nur das hier vorschlagen (es gibt vielleicht noch andere, aber ich kenne halt nur diese): #include <fstream.h> //muss vorhanden sein //... ifstream read_in; char *text[100]; string text2; //Datei öffnen read_in.open("Pfad", ios::in); //erste Möglichkeit getline(read_in, text2, '\n'); //liest bis ersten '\n' Zeichen alles ein //zweite Möglichkeit read_in.getline(text, 100, '\n'); //liest bis erstes '\n' Zeichen alles ein [/PHP] bei der zweiten Möglichkeit, solltest du darauf achten, dass das Feld groß genug ist, daher ziehe ich die erste Möglichkeit vor. Gruß Kitty ============================= Sorry, hatte es überlesen, dass er in C progammiert ... :floet: Aber der Wille, ihm zu helfen, zählt
8. November 200420 j Hallo Kitty82, Er programmiert in C, d.h. das getline ist nicht std::getline. Er kann auch mit ifstream nichts anfangen. @Quoth: Irgendwo muss getline herkommen. Vielleicht aus einer Headerdatei?
8. November 200420 j "sie" wäre mir lieber als "er" es kommt noch einmal in der main.c vor - wobei ich mir auch nicht sicher bin, wozu die Datei gut ist ... ist praktisch das selbe wie die cgiread.c an der ich jetzt arbeite - nur auf einem älteren Stand. Ansonsten sind das die einzigen 3x wo "getline" vorkommt im header file stehen nur ein Paar Zeilen aber nichts von "getline" habe das ganze Projekt danach durchsuchen lassen ...
8. November 200420 j "sie" wäre mir lieber als "er" Ich bitte vielmals um Entschuldigung :floet: Gehört die Datei main.c auch zu diesem Programm? Falls ja, gibt es da drin auch eine main-Funktion? Stellt sich der Fehler noch so dar, wie du ihn zu Anfang beschrieben hast?
8. November 200420 j kein Problem main.c ist auch in dem Projekt-Ordner wird aber nicht aufgerufen - ist wie gesagt die "Ursprungs-Version" von der cgiread.c an der ich jetzt arbeite - und da es praktisch eine alte Kopie ist, ist auch ne main-Funktion drin ... ja, der Fehler ist immer noch der selbe ... Daten werden übermittelt und verarbeitet (in test.dat geschrieben, ...), aber die erneute Anzeige im Browser ist immer noch falsch bei test.html kommt setup.html und bei setup.html eben auch, aber ohne die gesetzten Werte ...
9. November 200420 j Also, habe gerade rausgefunden, dass wenn ich die if-Anweisung weglasse und den 2. Teil (also die Seite setup.html und deren Auswertung) auskommentiere, dann klappt test.html einwandfrei. Also ist da der Wurm drin ... nur wo? :confused:
9. November 200420 j Was ich nicht verstehe: Wenn du die strcpy-Anweisung rausgenommen hast, wie wird site dann überhaupt mit Inhalt gefüllt?
9. November 200420 j Naja - im Moment mache ich ja keine Abfrage von der Variablen "site" mehr ... Aber im ursprünglichen Code doch, oder? Wie soll diese Abfrage funktionieren, wenn site nie mit Daten gefüllt wird?
9. November 200420 j Aber im ursprünglichen Code doch, oder? Wie soll diese Abfrage funktionieren, wenn site nie mit Daten gefüllt wird? Versteh deine Frage nicht ganz - die Variable "site" speichert doch bloß WELCHE Seite jetzt gerade Daten übertragen hat. Was im Moment übrig ist und funktioniert sieht so aus: /*#define _GNU_SOURCE*/ #include <stdlib.h> #include <string.h> #include <malloc.h> #include <stdio.h> #include <signal.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <kommun.h> #include <sys/types.h> #include <sys/stat.h> char translateHex(char hex); void ParseFormParameters(char * inp); const char * FindParameterValue(const char * name); const char * GetEnv(const char * what); struct Parameter_s { char * name; char * value; }; typedef struct Parameter_s Parameter; static Parameter * FormParameters = 0; static int NumFormParameters = 0; char translateHex(char hex) { if(hex >= 'A') return (hex & 0xdf) - 'A' + 10; else return hex - '0'; } void ParseFormParameters(char * inp) { static char * result; int tp,i; int num_par = 1; char * rp, * gp; int len = strlen(inp); if (len == 0) { NumFormParameters = 0; } result = 0; if (result != 0) free(result); result = (char *) malloc(len); tp=0; for(i = 0; i < len; i++) { if(inp[i] == '+') result[tp++] = ' '; else if(inp[i] == '%') { result[tp++] = translateHex(inp[i + 1]) * 16 + translateHex(inp[i + 2]); i += 2; /* Move past hex code */ } else /* An ordinary character */ result[tp++] = inp[i]; } len = tp; for (i = 0; i<len; i++) { if (result[i] == '&') num_par++; } if (FormParameters != 0) free(FormParameters); FormParameters = (Parameter *) malloc(sizeof(Parameter) * num_par); NumFormParameters = num_par; rp = result; for (i=0; i< num_par; i++) { FormParameters[i].name = ""; gp = strchr(rp, '='); if (gp == 0) break; /* error missing assignment */ *gp = 0; FormParameters[i].name = rp; gp++; rp = gp; gp = strchr(rp, '&'); if (gp != 0) *gp = 0; FormParameters[i].value = rp; if (gp!=0) rp = gp+1; else break; } } const char * FindParameterValue(const char * name) { int i; for (i=0; i< NumFormParameters; i++) { if (strcmp(name, FormParameters[i].name) == 0) { return FormParameters[i].value; break; } } return ""; } const char * GetEnv(const char * what) { char * r = getenv(what); if (!r) return ""; else return r; } int main(int argc, char *argv[]) { int prog; int par; int lang; int unit; char site[20]; FILE * param; FILE * test; FILE * dynp; FILE * dynp_in; FILE * setup; FILE * s_temp; FILE * s_temp_in; int kom_handle; /* Lesen der Umgebungsparameter */ const char * rm = GetEnv("REQUEST_METHOD"); const char * cl = GetEnv("CONTENT_LENGTH"); int len = atoi(cl); char * buffer = malloc(len+1); if (strcmp(rm, "POST") == 0) { fread(buffer,1, len, 0); buffer[len+1] = 0; } else if (strcmp(rm,"GET")==0) { buffer = getenv("QUERY_STRING"); } /* Lesen aller Form Parameter */ ParseFormParameters(buffer); /* Zugriff auf ausgewaehlte Parameter */ prog = atoi(FindParameterValue("program")); par = atoi(FindParameterValue("parameter")); lang = atoi(FindParameterValue("language")); unit = atoi(FindParameterValue("torqueunit")); /* Ablage der Daten in einer "Parameterdatei" */ test = fopen("test.dat", "w"); fprintf(test, "%i\n", prog); fprintf(test, "%i\n", par); fprintf(test, "%i\n", lang); fprintf(test, "%i\n", unit); /* Erzeugen der Antwort an den Browser */ printf("content-type: text/html\n\n"); /* Oeffnen des Templates */ param = fopen("/home/httpd/ohne_frames/test.html", "r"); if (!param) return 0; dynp = fopen("/home/httpd/test.html", "w"); if (!dynp) return 0; /* Kopieren des Templates als neues index file */ while (!feof(param)) { char * line = 0; size_t l = 0; getline(&line,&l, param); if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0)) { /* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */ fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par); fprintf(dynp, "document.forms[0].program[%d].checked=true;\n", prog-1); fprintf(dynp, "}</script>\n"); } fputs(line, dynp); } fclose(dynp); dynp_in = fopen("/home/httpd/test.html", "r"); while (!feof(dynp_in)) { char buf[1024]; len = fread(&buf, 1, 1024, dynp_in); fwrite(buf, 1, len, stdout); } fclose(dynp_in); umask(~0666); /* Erzeugen einer benannten Fifo Datei */ mknod("/tmp/deprag_simul_cgicom.pipe", 0666 | S_IFIFO, 0); kom_handle = open("/tmp/deprag_simul_cgicom.pipe", O_RDWR | O_NONBLOCK); if (kom_handle != -1) { KommunikationsStruktur ks; ks.ProgrammNummer = prog; ks.Parameter = par; ks.Sprache = lang; ks.Momenteinheit = unit; write(kom_handle, &ks, sizeof(ks)); close(kom_handle); } return 0; } [/PHP]
9. November 200420 j Versteh deine Frage nicht ganz - die Variable "site" speichert doch bloß WELCHE Seite jetzt gerade Daten übertragen hat. Wie kommt diese Information in site rein? In dem Code auf Seite 1 dieses Threads ist site ein Array von 20 char, das nicht initialisiert wird. site kann nichts speichern, weil nirgendwo im Code irgendein Inhalt in site abgelegt wird.
11. November 200420 j Hab das Problem jetzt "gelöst" - bzw umgangen, indem ich einfach eine Zahl statt "test" übergebe ... Danke für die Hilfe!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.