Quoth Geschrieben 8. November 2004 Geschrieben 8. November 2004 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? Zitieren
Guybrush Threepwood Geschrieben 8. November 2004 Geschrieben 8. November 2004 Wie hast du site denn deklariert? Zitieren
Klotzkopp Geschrieben 8. November 2004 Geschrieben 8. November 2004 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. Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 ich hab: char site [20]; und strcpy(site, "site"); Zitieren
Guybrush Threepwood Geschrieben 8. November 2004 Geschrieben 8. November 2004 Da aber nicht: if (site=="test") [/PHP] Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 Wenn ich das auf: if (strcpy (site, "site")=="test") ändere ... ändert sich nichts ... Zitieren
Klotzkopp Geschrieben 8. November 2004 Geschrieben 8. November 2004 Ändere if (site=="test") in if(0 == strcmp(site, "test")) Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 ändert leider auch nichts ... versteh das nicht Zitieren
Klotzkopp Geschrieben 8. November 2004 Geschrieben 8. November 2004 Zeig bitte mal den aktuellen Code. Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 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] Zitieren
Klotzkopp Geschrieben 8. November 2004 Geschrieben 8. November 2004 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); Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 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 ... Zitieren
Kitty82 Geschrieben 8. November 2004 Geschrieben 8. November 2004 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 Zitieren
Klotzkopp Geschrieben 8. November 2004 Geschrieben 8. November 2004 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? Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 "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 ... Zitieren
Klotzkopp Geschrieben 8. November 2004 Geschrieben 8. November 2004 "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? Zitieren
Quoth Geschrieben 8. November 2004 Autor Geschrieben 8. November 2004 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 ... Zitieren
Quoth Geschrieben 9. November 2004 Autor Geschrieben 9. November 2004 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: Zitieren
Klotzkopp Geschrieben 9. November 2004 Geschrieben 9. November 2004 Was ich nicht verstehe: Wenn du die strcpy-Anweisung rausgenommen hast, wie wird site dann überhaupt mit Inhalt gefüllt? Zitieren
Quoth Geschrieben 9. November 2004 Autor Geschrieben 9. November 2004 Naja - im Moment mache ich ja keine Abfrage von der Variablen "site" mehr ... Zitieren
Klotzkopp Geschrieben 9. November 2004 Geschrieben 9. November 2004 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? Zitieren
Quoth Geschrieben 9. November 2004 Autor Geschrieben 9. November 2004 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] Zitieren
Klotzkopp Geschrieben 9. November 2004 Geschrieben 9. November 2004 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. Zitieren
Quoth Geschrieben 9. November 2004 Autor Geschrieben 9. November 2004 Hast Recht ... ich blick da irgendwie nicht (mehr) durch ... Zitieren
Quoth Geschrieben 11. November 2004 Autor Geschrieben 11. November 2004 Hab das Problem jetzt "gelöst" - bzw umgangen, indem ich einfach eine Zahl statt "test" übergebe ... Danke für die Hilfe! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.