If Abfrage und Platzhalter
-
moin
Ich bin mir ganz sicher Ihr könnt mir helfen.
Ich habe mit 'C' bis jetzt noch nichts zu tun.
Und habe mich an ein AVR Projekt herran getraut, wo ich nun nicht mehr weiter komme.
Die HP mit G... hatte ich um Hilfe gefragt und auch viele Antworten bekommen.
Nur mit der Umsetzung klappt es einfach nicht.Mein Problem:
In einer Datei 'httpd.c' will/muß ich eine If Abfrage einbauen die mir dann wiederum einen Platzhalter für eine Webpage 'webpage.h' bereithält.
Dies ist mein kläglicher Versuch mit bestimmt vielen Fehlern.//Visualisierung ADC3 //Anlage aus if(var_array[6] == 0) Stufe == "Anlage aus" //Anlage 1. Betriebsstufe if(var_array[6] => 375) Stufe ="Stufe 1 = 44 % ~ 132 m³/h" if (var_array[6] =< 385) Stufe ="Stufe 1 = 44 % ~ 132 m³/h" //Anlage 2. Betriebsstufe if(var_array[6] => 590) Stufe ="Stufe 2 = 76 % ~ 228 m³/h" if (var_array[6] =< 610) Stufe ="Stufe 2 = 76 % ~ 228 m³/h" //Anlage 3. Betriebsstufe if(var_array[6] => 676) Stufe ="Stufe 3 = 100 % ~ 300 m³/h" if (var_array[6] =< 686) Stufe ="Stufe 3 = 100 % ~ 300 m³/h"
Könnt od. wohlt Ihr mir Helfen.
Gruß Michael
-
Die Informationen die du gibst sind unzureichend um dir zu helfen. Potentielle Helfer müssen wissen:
- Was hast du gemacht und was genau klappt nicht
- Was genau willst du erreichenBisher wirft dein Beitrag eher Fragen auf:
- Was soll die if-Abfrage überhaupt prüfen?
- Was soll dann geschehen?
-> Was ist ein Platzhalter für eine Webpage?
--> Wie halt man ihn bereit?
- Was ist an einer if-Abfrage so schwierig? (if (Bedingung) was_passieren_soll_wenn_bedingung_wahr();
)
- Was hat dein Code mit der ganzen Sache zu tun?
- Du weißt, dass du Klammern {} anstatt Einrückung benutzen musst, um Codeabschnitte zu kennzeichnen? Deine if-Abfragen im Beispielcode beziehen sich so immer nur auf den nächsten Befehl.
-
Sorry
Habe nicht gedacht das ich zuwenig zu meinem Problem geschrieben habe.SeppJ schrieb:
- Was hast du gemacht und was genau klappt nicht
Habe mir schon einige Seiten im Netz durch gelesen nur es will wohl nicht bei mir fruchten. Es scheint mir als ob der Platzhalter (Variable) nicht mit Text gefühlt wird.
SeppJ schrieb:
- Was genau willst du erreichen
- Was soll dann geschehen?Ich möchte gern den Platzhalter mit der If Abfrage, mit dem entsprechende Text füllen.
- Was soll die if-Abfrage überhaupt prüfen?´
- Was soll dann geschehen?Geprüft werden soll ob die Variable (var_array[6]) kleiner, gleich od. größer ist. Und der Platzhalter soll mit Text gefühlt werden.
- Was ist ein Platzhalter für eine Webpage?
- Wie halt man ihn bereit?Platzhalter, hätte ich wohl besser Variable geschrieben.
Eingefügt würde er den so : "<td>Stufe</td>\r\n", wobei Stufe dann der Platzhalter wäre.- Was ist an einer if-Abfrage so schwierig? (
if (Bedingung) was_passieren_soll_wenn_bedingung_wahr();
)Wenn man noch gar nicht damit zu tun hatte.
Ich hoffe das jetzt die Information eindeutiger sind.
Gruß
Michael
-
Dann scheint es mir, hast du bloß ein Syntaxproblem. Bei dir sind alle Vergleichsoperationen falschrum, das heißt >= und <=. Weiterhin fehlen massig Semikolons, nach jeder Zuweisung eines. Außerdem ist die erste Zuweisung keine Zuweisung.
Ich wollte eigentlich deinen Programmcode korrigieren, weil die Klammerung vermutlich falsch ist, aber ich sitze jetzt schon 5 Minuten hier und werde daraus nicht schlau, für welchen Wert welche Stufe genommen werden soll.
-
Hallo SeppJ
SeppJ schrieb:
Ich wollte eigentlich deinen Programmcode korrigieren, weil die Klammerung vermutlich falsch ist, aber ich sitze jetzt schon 5 Minuten hier und werde daraus nicht schlau, für welchen Wert welche Stufe genommen werden soll.
Das Ihr das schwer mit mir habt kann ich mir Vorstellen.
Gedacht war es so:
Diese If Abfrage sollte meine Technik Überwachen, ob sie in Betrieb ist und auf was für eine Betriebsstufe sie gerade Läuft.Die Varieble "var_array[6]" kann einen Wert aus den vier Bereichen besitzen.
Betriebsstufe1 = 0 | Stufe = "Anlage aus" oder
Betriebsstufe1 = 375 bis 385 | Stufe = "Anlage Stufe1" oder
Betriebsstufe2 = 590 bis 610 | Stufe = "Anlage Stufe2" oder
Betriebsstufe2 = 676 bis 686 | Stufe = "Anlage Stufe3"Die 'C' Dateien werden zum Schluss mit einem Compeiler in eine hex Datei umgewandelt und in einen ATMega644 Chip Übertragen, den ich dann wiederum übers LAN ansprechen kann.
Technik
Ich habe eine Wärmerückgewinnungsanlage die ich überwachen möchte.
Ein teil des Ergebniss kann man unter : http://www.wrg29378.selfhost.me:4711/ sehen.Gruß
Michael
-
FKF schrieb:
Die Varieble "var_array[6]" kann einen Wert aus den vier Bereichen besitzen.
Betriebsstufe1 = 0 | Stufe = "Anlage aus" oder
Betriebsstufe1 = 375 bis 385 | Stufe = "Anlage Stufe1" oder
Betriebsstufe2 = 590 bis 610 | Stufe = "Anlage Stufe2" oder
Betriebsstufe2 = 676 bis 686 | Stufe = "Anlage Stufe3"Ok, dann passte das ja sogar so wie ich es mir dachte. Es hat mich bloß schwer verwirrt, dass zum Beispiel zwischen 0 und 375 nichts ist.
Da ich nun weiß, was Sache ist, kann man das natürlich noch etwas schöner formulieren indem man logische Verknüpfungen und ein paar else benutzt:
if(var_array[6] == 0) Stufe = "Anlage aus"; else if((var_array[6] >= 375) && (var_array[6] <= 385)) Stufe ="Stufe 1 = 44 % ~ 132 m³/h"; else if((var_array[6] >= 590) && (var_array[6] <= 610)) Stufe ="Stufe 2 = 76 % ~ 228 m³/h"; else if((var_array[6] >= 676) && (var_array[6] <= 686)) Stufe ="Stufe 3 = 100 % ~ 300 m³/h";
-
Betriebsstufe1 = 0 | Stufe = "Anlage aus" oder
Betriebsstufe1 = 375 bis 385 | Stufe = "Anlage Stufe1" oder
Betriebsstufe2 = 590 bis 610 | Stufe = "Anlage Stufe2" oder
Betriebsstufe2 = 676 bis 686 | Stufe = "Anlage Stufe3"int val = 300; int stage; if(val >= 590){ if(val >= 676) stage = 3; else stage = 2; }else{ if(val >= 375) stage = 1; else stage = 0; }
so muß das aussehen
-
no_code schrieb:
if(val >= 590){ if(val >= 676) stage = 3; else stage = 2; }else{ if(val >= 375) stage = 1; else stage = 0; }
so muß das aussehen
Was manche Leute für Ansprüche haben... :p
stage = (val >= 375) + (val >= 590) + (val >= 676);
Etwa 90% weniger Code und bei mir 15% schneller.
-
Nexus schrieb:
stage = (val >= 375) + (val >= 590) + (val >= 676);
Etwa 90% weniger Code und bei mir 15% schneller.
wow so hab ich das ja noch nie verwendet
-
Nexus schrieb:
no_code schrieb:
if(val >= 590){ if(val >= 676) stage = 3; else stage = 2; }else{ if(val >= 375) stage = 1; else stage = 0; }
so muß das aussehen
Was manche Leute für Ansprüche haben... :p
stage = (val >= 375) + (val >= 590) + (val >= 676);
Etwa 90% weniger Code und bei mir 15% schneller.
Wäre nicht
if(val>=676) stage=3; else if(val>=590) stage=2; else if(val>=375) stage=1; else stage=0;
schneller? Bei Dir müssen immer 3 Bedingungen getestet werden. Bei mir mir je nachdem bis zu 3.
Wobei no_code sogar optimiert hat auf die Garantie, daß nur zwei Bedingungen getestet werden.
Warum ist Dein Code schneller? Gibt es am Ende einen Prozessorbefehl, der genau dein Konstrukt unterstützt, zum Beisipiel den Wahrheitswert einer geprüften Bedingung als 0 oder 1 in ein Register schubst?
Welcher Wertebereich ist zum Messen sinnvoll? Ich nehme an so zwischen 0 und 1000.
-
volkard schrieb:
Welcher Wertebereich ist zum Messen sinnvoll? Ich nehme an so zwischen 0 und 1000.
Du denkst doch nicht etwa an eine Lookup-Tabelle?
-
Tim schrieb:
volkard schrieb:
Welcher Wertebereich ist zum Messen sinnvoll? Ich nehme an so zwischen 0 und 1000.
Du denkst doch nicht etwa an eine Lookup-Tabelle?
würd ja fast behaupten das eine so große lookuptable das eher langsamer machen würde...
-
Wobei ihr alle vergesst, dass der Threadersteller etwas ganz anderes will. Die Anforderungen sind zwar total wirr (so wirr, dass ich es zuerst für einen Programmierfehler hielt, obwohl es richtig war), aber sie sind anders.
-
SeppJ schrieb:
Die Anforderungen sind zwar total wirr (so wirr, dass ich es zuerst für einen Programmierfehler hielt, obwohl es richtig war), aber sie sind anders.
die müssen dann eben an das programm angepasst werden :p
-
no_code schrieb:
würd ja fast behaupten das eine so große lookuptable das eher langsamer machen würde...
Wiso das denn? Wenn die Tabelle auf dem Heap liegt und man sie einmal initialisiert hat, dürfte das doch schnell sein. Wird die Tabelle dann oft benutzt, rentiert sich das wieder. Und es reichen ja auch 1 Byte pro Element. Mit 1 kByte ist die Tabelle dann auch nicht allzu groß
-
Hi
Mit 1 Byte pro Element, ist es nicht so effizient wie eine Variable mit 32Bit, jenachdem was du für ein Prozessor hast bzw. OS.
lowbyte
-
FKF schrieb:
Die Varieble "var_array[6]" kann einen Wert aus den vier Bereichen besitzen.
und wenn der wert außerhalb der bereiche ist(390, 620, 690, etc), liefern die meisten 'optimierten' lösungen falsche ergebnisse. der einzige,zuverlässige ansatz ist von SeppJ
mfg
-
volkard schrieb:
Warum ist Dein Code schneller? Gibt es am Ende einen Prozessorbefehl, der genau dein Konstrukt unterstützt, zum Beisipiel den Wahrheitswert einer geprüften Bedingung als 0 oder 1 in ein Register schubst?
setge
tut das für>=
. Aber weshalb ist das eine spezielle Instruktion? Wahrscheinlich liegt ein Teil des Geschwindigkeitsschubs an den wegfallenden (vielleicht teilweise falsch vorhergesagten) Sprüngen fürs If. Assembler-Codes unter Microsoft Visual Studio 2008 Professional, kompiliert wurde mit /O2 (auf Geschwindigkeit optimieren) im Release-Modus:; volkard (4 Sprünge) 013D1120 cmp eax,2A4h 013D1125 jl MeasureVolkard+2Eh (13D112Eh) 013D1127 mov ecx,3 013D112C jmp MeasureVolkard+46h (13D1146h) 013D112E cmp eax,24Eh 013D1133 jl MeasureVolkard+3Ch (13D113Ch) 013D1135 mov ecx,2 013D113A jmp MeasureVolkard+46h (13D1146h) 013D113C xor ecx,ecx 013D113E cmp eax,177h 013D1143 setge cl 013D1146 mov dword ptr [esp+eax*4],ecx 013D1149 inc eax 013D114A cmp eax,3E8h 013D114F jb MeasureVolkard+20h (13D1120h)
; Nexus (0 Sprünge) 013D10A0 xor ecx,ecx 013D10A2 cmp eax,2A4h 013D10A7 setge cl 013D10AA xor edx,edx 013D10AC cmp eax,24Eh 013D10B1 setge dl 013D10B4 add ecx,edx 013D10B6 xor edx,edx 013D10B8 cmp eax,177h 013D10BD setge dl 013D10C0 inc eax 013D10C1 add ecx,edx 013D10C3 mov dword ptr [esp+eax*4-4],ecx 013D10C7 cmp eax,3E8h 013D10CC jb MeasureNexus+20h (13D10A0h)
; no_code (2 Sprünge) 013D1020 xor ecx,ecx 013D1022 cmp eax,24Eh 013D1027 jl MeasureNocode+36h (13D1036h) 013D1029 cmp eax,2A4h 013D102E setge cl 013D1031 add ecx,2 013D1034 jmp MeasureNocode+3Eh (13D103Eh) 013D1036 cmp eax,177h 013D103B setge cl 013D103E mov dword ptr [esp+eax*4],ecx 013D1041 inc eax 013D1042 cmp eax,3E8h 013D1047 jb MeasureNocode+20h (13D1020h)
volkard schrieb:
Welcher Wertebereich ist zum Messen sinnvoll? Ich nehme an so zwischen 0 und 1000.
Hab ich jetzt auch genommen. Ich hatte gestern wohl einen zu grossen Wertebereich, jetzt ist der Unterschied zwischen no_code und mir weniger deutlich. Dafür ist dein Code relativ langsam. Ausgabe (die Ergebnisse sind immer etwa in der Grössenordnung):
nocode: 0.311074 nexus: 0.286751 volkard: 0.435285 nocode: 0.294478 nexus: 0.27204 volkard: 0.417075 nocode: 0.304381 nexus: 0.274707 volkard: 0.40705
Mit AMD CodeAnalyst die Timer Samples für den Aufruf der
Nexus()
/Nocode()
/Volkard()
-Funktion gemessen, wobei diese etwas stärker gestreut sind:buf[i] = Nocode(i); // 27.34 | 30.02 | 26.11 buf[i] = Nexus(i); // 24.69 | 22.30 | 27.08 buf[i] = Volkard(i); // 44.35 | 44.24 | 44.03
Ich hoffe, mir sind keine groben Messfehler unterlaufen. Ich habs in C++ (nicht C) gemessen, im Folgenden der Code.
StopWatch
ist eine Stoppuhr-Klasse; die Arrays habe ich hingeschreiben, um Wegoptimierung zu verhindern; zudem habe ich das Inlinen einzelner Funktionen erzwungen. Eine Vertauschung der Aufrufe hat zu den selben Ergebnissen geführt.__forceinline int Nocode(int val) { int stage; if(val >= 590){ if(val >= 676) stage = 3; else stage = 2; }else{ if(val >= 375) stage = 1; else stage = 0; } return stage; } __forceinline int Nexus(int val) { int stage; stage = (val >= 375) + (val >= 590) + (val >= 676); return stage; } __forceinline int Volkard(int val) { int stage; if(val>=676) stage=3; else if(val>=590) stage=2; else if(val>=375) stage=1; else stage=0; return stage; } const size_t innerCount = 1000; const size_t outerCount = 80000; int MeasureNocode(StopWatch& s) { int buf[innerCount]; s.Start(); for (int i = 0; i < innerCount; ++i) { buf[i] = Nocode(i); } s.Stop(); return buf[rand() % innerCount]; } int MeasureNexus(StopWatch& s) { int buf[innerCount]; s.Start(); for (int i = 0; i < innerCount; ++i) { buf[i] = Nexus(i); } s.Stop(); return buf[rand() % innerCount]; } int MeasureVolkard(StopWatch& s) { int buf[innerCount]; s.Start(); for (int i = 0; i < innerCount; ++i) { buf[i] = Volkard(i); } s.Stop(); return buf[rand() % innerCount]; } int main() { StopWatch nocode, nexus, volkard; int buf[outerCount]; for (int i = 0; i < outerCount; ++i) { int vol = MeasureVolkard(volkard); int nex = MeasureNexus(nexus); int noc = MeasureNocode(nocode); buf[i] = nex + noc + vol; } std::cout << "\n\n"; std::cout << "nocode: " << nocode.GetElapsedTime() << std::endl; std::cout << "nexus: " << nexus.GetElapsedTime() << std::endl; std::cout << "volkard: " << volkard.GetElapsedTime() << std::endl; std::cout << "\n\n"; std::cout << buf[rand() % outerCount]; }
-
Dank euch allen.
Ich werde wohl SeppJ einen Vorschlag nehmen.
Denn die anderen sind für mich ganz Fremd.Gruß
Michael
-
[at] Nexus cool vielen dank für deine mühe. finde das ganz super mal so schön die unterschiede zu sehen. was doch diese kleinen dinge schon ausmachen können.
B.B. schrieb:
FKF schrieb:
Die Varieble "var_array[6]" kann einen Wert aus den vier Bereichen besitzen.
und wenn der wert außerhalb der bereiche ist(390, 620, 690, etc), liefern die meisten 'optimierten' lösungen falsche ergebnisse. der einzige,zuverlässige ansatz ist von SeppJ
mfg
so_schauts_aus schrieb:
SeppJ schrieb:
Die Anforderungen sind zwar total wirr (so wirr, dass ich es zuerst für einen Programmierfehler hielt, obwohl es richtig war), aber sie sind anders.
die müssen dann eben an das programm angepasst werden :p