Frage zur formatierten Ausgabe
-
jack05 schrieb:
Vlt. einfach mal den Compiler anschalten und gucken?

Vielleicht einfach mal den Debugger anschalten und gucken?
-
Wieso denn eigentlich double als Pointer übergeben?!? Gib doch als Funktionsparameter nur double an...
double flaeche(double a, double b, double y);
-
Vlt. einfach mal den Compiler anschalten und gucken?
Er gibt keinen Fehler an...
Ich frage, was beim Rechenvorgang schief geht.Wieso denn eigentlich double als Pointer übergeben?!? Gib doch als Funktionsparameter nur double an...
Hatte ich anfangs, aber ich möchte gleich mit dem erarbeiteten Wissen vorgehen. Klar, außerdem ist Call-by-reference Platzschonender
auch wenn es ein Miniprog ist.Ich möchte doch nur wissen, was da schief läuft. Ich kann keinen Fehler in der Rechnung sehen

-
jack05 schrieb:
Hatte ich anfangs, aber ich möchte gleich mit dem erarbeiteten Wissen vorgehen. Klar, außerdem ist Call-by-reference Platzschonender
auch wenn es ein Miniprog ist.doll...
printf("double: %ld\n", sizeof(double)); printf("doublePtr: %ld\n", sizeof(double *));double: 8 doublePtr: 8Bringt gar keine Platzersparniss

Und nur zur Info: Das was du gepostet hast kompiliert nicht mal...
-
jack05 schrieb:
Vlt. einfach mal den Compiler anschalten und gucken?
Er gibt keinen Fehler an...
Ich frage, was beim Rechenvorgang schief geht.audacia sprach auch von Debugger, nicht Compiler. Weisst du, was ein Debugger ist?
jack05 schrieb:
Hatte ich anfangs, aber ich möchte gleich mit dem erarbeiteten Wissen vorgehen. Klar, außerdem ist Call-by-reference Platzschonender
auch wenn es ein Miniprog ist.Sicher, bei
doublemacht das besonders viel aus. Wenn schon, sollte man aber auch den Aufwand der Dereferenzierung bedenken. Und setze dein Wissen lieber dort ein, wo man Zeigerübergabe wirklich braucht: Bei grossen Objekten oder für Output-Parameter.Wäre gut, wenn ein Moderator das ins C-Forum verschieben könnte.
-
audacia sprach auch von Debugger, nicht Compiler. Weisst du, was ein Debugger ist?
Achso, nein weiß ich nicht. Ich arbeite das Buch "C von A-Z" durch. Bisher bin ich bei Streams, aber wo was wie ein Debugger ist weiß ich nocht nicht.
Aber mal im Ernst, Zeiger sollte auch ein C++ Programmierer verstehen und nebenbei ändert sich nichts wenn ich auf Call-by-Value verwende.
Irgendwas ist bei der Funktion und der Rückgabe nicht in Ordnung.
C/C++ Code:
printf("double: %ld\n", sizeof(double));
printf("doublePtr: %ld\n", sizeof(double *));Code:
double: 8
doublePtr: 8
Code:
double: 8
doublePtr: 8
Code:
double: 8
doublePtr: 8Bringt gar keine Platzersparniss

Und nur zur Info: Das was du gepostet hast kompiliert nicht mal...
Bei Call-by-Value wird der Wert virtuell für die Funktion kopiert. Bei Call-by-Reference arbeite ich direkt mit den Werten über Adressen
Nochmal der Code:
#include <stdio.h> #include <stdlib.h> #include <math.h> double flaeche(double *a, double *b, double *y); int main(int argc, char *argv[]){ double a, b, y; short w; printf("-----------Hallo!-----------"); printf("\n\n"); printf("Berechnung der Flaeche eines Dreiecks\n\n\n"); printf("Bitte Seite Seite a, b und Winkel y angeben: \n\n\n"); scanf("%lf", &a); scanf("%lf", &b); scanf("%lf", &y); printf("Waehle: 1- Bogenmass oder 2- Grad: \n\n\n"); scanf("%d", &w); printf("%lf %lf %lf \n\n\n", a, b, y); if(w==1) { printf("Erg: %ld", flaeche(&a, &b, &y)); } else { y=y*180/M_PI; printf("Erg: %ld\n\n\n", flaeche(&a, &b, &y)); } /* int i; for(i=0; i< 255;i++) { if (i==10) { continue; } printf("%d : %c\n", i, i); } */ system("PAUSE"); return 0; } double flaeche(double *a, double *b, double *y) { return ((*a)*(*b)/2)*sin(*y); }Nehmt mir das nicht krumm, aber gibt es den überhaupt noch Menschen, die konkret Antworten und nicht versuchen Pessimisten von morgens bis abends zu sein.
-
Eines vorweg: Ich kenne mich mit diesen Formatierungs-Platzhaltern nicht wirklich aus.
Es sieht so aus, als ob
"%ld"fürlong intund nichtdoublesteht. Bei Deiner Ausgabe wird also wahrscheinlich ein double übergeben und als long int reinterpretiert.
-
jack05 schrieb:
Nehmt mir das nicht krumm, aber gibt es den überhaupt noch Menschen, die konkret Antworten und nicht versuchen Pessimisten von morgens bis abends zu sein.
Kannst Du keine Verbesserungsvorschläge vertragen, die nichts mit Deinem Problem zu tun haben?

-
jack05 schrieb:
Achso, nein weiß ich nicht. Ich arbeite das Buch "C von A-Z" durch. Bisher bin ich bei Streams, aber wo was wie ein Debugger ist weiß ich nocht nicht.
Ein Debugger ist eine Laufzeitumgebung, mit der du Haltepunkte setzen, Variablenwerte anschauen und noch einiges mehr machen kannst. Das ist ein sehr effizientes Werkzeug, um Fehler zu finden.
jack05 schrieb:
Aber mal im Ernst, Zeiger sollte auch ein C++ Programmierer verstehen [...]
Dazu hat auch niemand etwas anderes behauptet, aber das hat nichts mit dem Thema zu tun.
jack05 schrieb:
[...] und nebenbei ändert sich nichts wenn ich auf Call-by-Value verwende.
Ja, an der Programmlogik vielleicht nicht. Du kannst dir aber gerne mal den Assemblercode anschauen, der sieht wahrscheinlich anders aus.
Was hast du eigentlich gegen den sinnvollen Einsatz von Sprachmitteln? Nur weil du jetzt Zeiger kennst, musst du sie nicht überall als Funktionsparameter verwenden. So hat man nämlich eher das Gefühl, du hast das Konzept nicht verstanden.
jack05 schrieb:
Bei Call-by-Value wird der Wert virtuell für die Funktion kopiert. Bei Call-by-Reference arbeite ich direkt mit den Werten über Adressen
Ja. Überleg mal, wie die Funktion die Adresse kennt. Genau, über Zeiger. Zeiger sind nicht ein imaginäres Gedankenkonstrukt, die brauchen genauso Speicher. Und wieviel sparst du, wenn eine
double-Kopie 8 Bytes benötigt und ein Zeiger 4? Exakt, 4 ganze Bytes. Beiint(angenommen 4 Bytes) sparst du zum Beispiel rein gar nichts. Dafür hast du den Performance-Overhead der Dereferenzierung. Was meinst du eigentlich mit "virtuell"?jack05 schrieb:
ehmt mir das nicht krumm, aber gibt es den überhaupt noch Menschen, die konkret Antworten und nicht versuchen Pessimisten von morgens bis abends zu sein.
Wir sind Pessimisten, weil wir dich auf Dinge aufmerksam machen, die du an deiner Programmiertechnik ändern solltest? Von mir aus, du brauchst meine Ratschläge ja nicht zu beachten und kannst weiterhin für alles Zeiger verwenden. Es war im Übrigen nur gut gemeint, aber das scheinst du wohl nicht zu sehen...

P.S. double entspricht %f
-
Endlich. Wenigstens hast du es versucht, aber ist schon richtig mit %lf
Tabelle 7.4 Datentypen zur Darstellung von Gleitpunktzahlen Name Größe Wertebereich Genauigkeit Formatzeichen float 4 Byte 1.2E-38 3.4E+38 6-stellig %f double 8 Byte 2.3E-308 1.7E+308 15-stellig %lf long double 10 Byte 3.4E-4932 1.1E+4932 19-stellig %Lf
-
Ich behaupte mal, dass hier alle wissen, wie groß ein float/double/long double ist - so weiß auch jeder, dass auf 32bit Systemen bei nem double 8byte kopiert werden müssen und bei nem pointer nur 4 - allerdings ist die fkt so klein, dass sie wahrscheinlich eh geinlined wird - und zusätzlich dazu bringen 4byte da einfach noch nichts... es ist egal, ob man auf dem stack dort insg. 12byte mehr belegt oder nicht - aber für diese 12byte hat man eben mind. 3 dereferenzierungen drin...
ich glaub nicht, dass du hier irgendjmd findet, der das als sinnvoll ansieht... noch dazu hast du auf 64bit systemen dann gar keinen vorteil mehr und trotzdem noch die 3 dereferenzierungen...und zu allererst sollte es doch um die lesbarkeit gehen...
double flaeche(double *a, double *b, double *y) { return ((*a)*(*b)/2)*sin(*y); }vs.
double flaeche(double a, double b, double y) { return (a*b/2)*sin(y); }wen es dir auf performance ankommen würde und du deinem compiler so wenig vertraust, dann musst du hier noch die /2 durch nen rightshift ersetzen...
ich würds btw so machen:double flaeche(double a, double b, double y) { return sin(y)*a*b/2; }das du double nimmst ist imho an sich schon ein fehler - da ein float hier auf jeden fall ausreichen würde...
bb
-
unskilled schrieb:
wen es dir auf performance ankommen würde und du deinem compiler so wenig vertraust, dann musst du hier noch die /2 durch nen rightshift ersetzen...
Bei doubles? Das wird aber häßlich

-
audacia schrieb:
unskilled schrieb:
wen es dir auf performance ankommen würde und du deinem compiler so wenig vertraust, dann musst du hier noch die /2 durch nen rightshift ersetzen...
Bei doubles? Das wird aber häßlich

hmm... richtig xD
ich war noch bissl verschlafen ^^bb
-
jack05 schrieb:
Endlich. Wenigstens hast du es versucht, aber ist schon richtig mit %lf
Was meinst Du mit "es ist schon richtig mit %lf"? Du hast doch "%ld" in Deinem Quelltext stehen. Ist Dir das bis jetzt nicht aufgefallen oder bist Du einfach nur undankbar?
Gruß,
SP
-
Also, jop ich habe es gesehen %ld bei der Ausgabe o.O
ich habe bereits gesagt, dass es als Übung gedacht ist und ob ich da nun was rechne und das auf ne Struktur packe und noch in ne Klasse, ist im Grunde nicht wichtig. Es ist eine Übung!Mit dem Debugger scheint ne feine Sache zu sein, Danke.
und double ist %lf für long float
ich habe es jetzt gelöst und es lag an den formatierungen
Danke an die die es versucht haben
-
jack05 schrieb:
Endlich. Wenigstens hast du es versucht, aber ist schon richtig mit %lf
Wenigstens. Auf www.cplusplus.com steht zum Beispiel nichts davon, dass "%lf" für
doublesteht. Allerdings hat die Referenz ab und zu ein paar Fehler.Deine Einstellung regt mich ehrlich gesagt ziemlich auf. Ich versuche dir zu helfen, weise dich auf etliche Dinge hin und probiere noch, dir die Hintergründe zu erklären. Anstatt dankbar zu sein oder wenigstens eine Sekunde darüber nachzudenken, dass die Einwände nicht völlig aus der Luft gegriffen sein könnten, hast du nichts besseres als "Pessimisten" und "Wenigstens hast dus versucht" parat. Etwas respektvoller könntest du durchaus sein, wenn man bedenkt, dass wir dir hier freiwillig helfen.

Edit: Okay, im letzten Post hast du wenigstens noch Dankbarkeit gezeigt. Trotzdem solltest du beim nächsten Mal vielleicht nicht so stark den Eindruck machen, dass dich unsere Vorschläge kein bisschen interessieren. Das kommt nämlich ziemlich abschätzig rüber.
-
wie lächerlich...
jack05 schrieb:
und double ist %lf für long float
ich habe es jetzt gelöst und es lag an den formatierungen
etliche posts davor:
Sebastian Pizer schrieb:
Eines vorweg: Ich kenne mich mit diesen Formatierungs-Platzhaltern nicht wirklich aus.
Es sieht so aus, als ob "%ld" für long int und nicht double steht. Bei Deiner Ausgabe wird also wahrscheinlich ein double übergeben und als long int reinterpretiert.
und dann noch mal ganz direkt
Sebastian Pizer schrieb:
jack05 schrieb:
Endlich. Wenigstens hast du es versucht, aber ist schon richtig mit %lf
Was meinst Du mit "es ist schon richtig mit %lf"? Du hast doch "%ld" in Deinem Quelltext stehen. Ist Dir das bis jetzt nicht aufgefallen oder bist Du einfach nur undankbar?
Gruß,
SPbb