Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

OnkelJürgen

Moderator

Dabei seit: 30.12.2002

Beiträge: 1 719

 

1 Zum Seitenanfang

Montag, 21. Januar 2008, 14:53

C-Programm optimieren

Hallo,

hätte da mal ne kleine Frage bzgl. C, nämlich ob man den folgenden Teil auch kürzer schreiben könnte. Bei PHP würd ich ja aus den 2 double-Werten und dem Operationssymbol einen neuen String zusammensetzen und den mit eval() ausführen. Gibt es in C vielleicht eine ähnliche, oder bessere, Methode?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(strcmp(op,"+")==0) {
               element->value = (b + a);
          } else if(strcmp(op,"-")==0) {
               element->value = (b - a);
          } else if(strcmp(op,"*")==0) {
               element->value = (b * a);
          } else if(strcmp(op,"/")==0) {
               if(a==0.0) {
                   printf("Fehler: Division durch 0 nicht erlaubt!\n");
                   element->value = b;
               } else {
                   element->value = (b / a);
               }
          }


Grüße,

OnkelJürgen
Auf jede Frage gibt es eine Antwort, man muss nur lange genug danach suchen.


z.B. auf www.netscripter.de :-P
 

narfnarf

Haudegen

Dabei seit: 30.11.2002

Beiträge: 678

 

2 Zum Seitenanfang

Dienstag, 22. Januar 2008, 10:56

RE: C-Programm optimieren

Zitat

Original von OnkelJürgen
Bei PHP würd ich ja aus den 2 double-Werten und dem Operationssymbol einen neuen String zusammensetzen und den mit eval() ausführen.


Und dich ganz weit vom Optimieren entfernen. Du schaffst a) eine potentielle Sicherheitslücke, da Eingaben an eval() weitergegeben werden (hier muss also ordentlich gefiltert werden) und b) führst du zusätzliche Stringoperationen aus. Ich wette mal ganz stark, dass auch in PHP Strings konstant sind und daher beim zusammenfügen ein neuer erstellt wird. Das natürlich 2 mal...
Und wofür? Kürzester Code? Der gewinnt nicht.
Willst du Flexibilität? Arbeite mit C++, Objekten und Strategiepattern.
Willst du effizientes Laufzeitverhalten werf die strcmp raus. Die Operatoren sind doch nur ein Zeichen lang, da kannst du die erste Stelle des char-Arrays direkt vergleichen; Chars sind ind C doch auch nur Zahlen...
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

3 Zum Seitenanfang

Dienstag, 22. Januar 2008, 11:42

Wie narfnarf schon sagte, wenn du nur auf ein Zeichen vergleichen willst, brauchst du kein strcmp:

Quellcode

1
2
char op = ' ';
if(op == '+') ...
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

OnkelJürgen

Moderator

Dabei seit: 30.12.2002

Beiträge: 1 719

 

4 Zum Seitenanfang

Dienstag, 22. Januar 2008, 20:46

@narfnarf

Das mit PHP war ja nur ein Beispiel, dass ich das rundherum noch absichern müsste ist klar, aber da hätte ich ja auch nicht derartige Eingaben. ;)
C++ darf ich in dem Fall nicht verwenden, es wird ausdrücklich C vorausgesetzt. :)

@silence
Ist kein Char, sondern ein String, weil u.a. auch längere Zeichenketten verarbeitet werden, da hatte ich auch Probleme das derart zu vergleichen, deswegen strcmp ... aber so genau kenn' ich mich in C natürlich auch noch nicht aus.

Trotzdem danke euch beiden.
Auf jede Frage gibt es eine Antwort, man muss nur lange genug danach suchen.


z.B. auf www.netscripter.de :-P
 

narfnarf

Haudegen

Dabei seit: 30.11.2002

Beiträge: 678

 

5 Zum Seitenanfang

Mittwoch, 23. Januar 2008, 09:33

Es gibt in C keine Strings. "Strings" sind doch nur Arrays mit Chars drin (und hoffentlich null terminiert...). Da nimmst du einfach die erste Stelle.

Mir ist schon klar, dass PHP nur ein Beispiel war. Nur stellte sich mir die Frage, was du mit einer solchen Vorgehensweise erreichen willst. IMHO stellt das keine Verbesserung dar.

Zu Strings, Chars und dergleichen Teufelszeug:
String stellt man in C ja wie folgt dar:

Quellcode

1
2
char name1[16] = "Frans Coenen";
char name2[16] = {'F','r','a','n','s',' ','C','o','e','n','e','n','\0'};


Möchtest du prüfen, ob und welche Rechenoperation gewünscht ist reicht ein Vergleich folgender Art:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(op[0] == "+") 
{
   element->value = (b + a);
}
else if(op[0] == "-") 
{
   element->value = (b - a);
}
else if(op[0] == "*")
{
   element->value = (b * a);
}
else if(op[0] == "/")
{
    if(a==0.0) {
        printf("Fehler: Division durch 0 nicht erlaubt!\n");
        element->value = b;
    }
    else
    {
        element->value = (b / a);
    }
}


Davon mal abgesehen ist es relativ kritisch, Gleitkommazahlen auf Gleichheit mit 0.0 zu prüfen. Nach wenigen Rechenoperationen nehmen die diesen Wert aufgrund von möglichen Rundungsfehlern nämlich oftmals nie wieder an.
Bsp:
a sei eine Gleitkommazahl im Bereich von 1-10,
q=563957593012421346345;
a/q = b;
b*q = c;
Jetzt sollte theoretisch c == a gelten (bzw. (a - c) == 0). Je nach dem konkreten Wert von q und vor allem dem Verhältnis von a und q ist das aber nicht der Fall. Da bleibt dann oft ein klitzekleiner Rest, der ein == 0.0 an die Wand fahren lässt.
Eigentlich macht das kein Problem, weil ja auch de facto nicht durch 0.0 geteilt wird. Da könnten aber schon unerwartete Ergebnisse auftreten.
Im obigen Beispiel würde ein Benutzer erwarten, das q/(a-c) verboten sei und nicht aufgrund von technischen Eigenheiten doch funktioniert.

Nach den
 

proNFP.de

Mitglied

Dabei seit: 24.10.2007

Beiträge: 32

 

6 Zum Seitenanfang

Mittwoch, 23. Januar 2008, 19:15

Hi zusammen,

kann man dan nichtr auch mit ner case-Anweisung realisieren?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
char op = '*';
	switch op[0] {
	case '+':
		element->value = (b + a);
		break;
	case '-':
		element->value = (b - a);
		break;
	case '*':
		element->value = (b * a);
		break;
	case '/':
		if(a==0.0) {
	        printf("Fehler: Division durch 0 nicht erlaubt!\n");
	        element->value = b;
	    }
	    else
	    {
	        element->value = (b / a);
	    }
		break;
	default:
		printf("Fehler: Falsche Angabe!\n");
	}


So ähnlich würd ichs in java realisieen (ja ich bring C und Java gerade n bissel durcheinander aber vllt hilfts ja weiter...)

Gruß,
proNFP
 

narfnarf

Haudegen

Dabei seit: 30.11.2002

Beiträge: 678

 

7 Zum Seitenanfang

Mittwoch, 23. Januar 2008, 19:59

Klar, switch sollte auch gehen.
aber der zu prüfende Ausdruck gehört IIRC in eine Klammer, also

Quellcode

1
2
3
4
switch(op[0])
{
    // ...
}
 

OnkelJürgen

Moderator

Dabei seit: 30.12.2002

Beiträge: 1 719

 

8 Zum Seitenanfang

Donnerstag, 24. Januar 2008, 00:40

Stimmt, auf [0] bin ich bei so ner Überprüfung gar nicht gekommen. Bei längeren Ausdrücken wie inv, neg usw. dann aber auch schon wieder unpraktischer ... am liebsten wäre mir eben eine Möglichkeit gewesen das Symbol direkt einzusetzen, statt mehrer einzelner Bedingungen, aber ich seh langsam ein, dass das Vorhaben wohl eher unpraktikabel ist.

Letztendlich ist das ganze sowieso nur für mich persönlich, die eigentliche Aufgabe sollte bei weitem erfüllt sein. Die Tatsache mit den Dualzahlen und deren Speicherung als Vorzeichen, Charakteristik und Mantisse ist mir durchaus auch bewusst. ;)

Strings als Array, okay, müsste ich wissen. *g*

Danke trotzdem nochmal vielmals.
Auf jede Frage gibt es eine Antwort, man muss nur lange genug danach suchen.


z.B. auf www.netscripter.de :-P
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

9 Zum Seitenanfang

Dienstag, 15. April 2008, 13:11

Im grunde ist jeder Pointer ein array.
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

10 Zum Seitenanfang

Dienstag, 15. April 2008, 17:12

Im grunde ist jeder Pointer ein array.
Nein.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

11 Zum Seitenanfang

Dienstag, 15. April 2008, 18:31

er meinte es wahrscheinlich anders herum ...
was gegen einzuwenden, wenn man einen Array als eine Art Liste von Zeigern, Referenzen bezeichnen würde?
edit: -mal abgesehen von Sammlungen primitiver Datentypen-

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (15. April 2008, 18:34)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

12 Zum Seitenanfang

Dienstag, 15. April 2008, 18:50

er meinte es wahrscheinlich anders herum ...
was gegen einzuwenden, wenn man einen Array als eine Art Liste von Zeigern, Referenzen bezeichnen würde?
edit: -mal abgesehen von Sammlungen primitiver Datentypen-
Stimmt in C ebenfalls nicht - ein Zeiger ist lediglich ein maschinenabhängiger, ganzzahliger Wert - bei 32Bit wäre er 4Byte lang, bei 64Bit 8Byte. Dieser verweist auf eine Speicheraddresse, unter der dann der Inhalt abgelegt ist
Ein Array ist eine Sammlung von Elementen, deren Typ ist aber beliebig und besteht keineswegs nur aus Referenzen, Zeigern und primitiven Datentypen.
In Java stimmt die Aussage jedoch.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (15. April 2008, 18:50)