Funktion mit Rückgabewert ohne Rückgabe



  • Wutz schrieb:

    Wade1234 schrieb:

    wenn man printf eine 1-byte-variable übergibt, dann sollte man auch den formatspezifizierer %hhd übergeben oder eben exlizit casten.

    Das ist Nonsens bzw. Weitertragen von aufgeschnapptem Halbwissen.
    Bei Funktionen mit variabler Parameterliste (printf...) gilt gemäß Standard die integer promotion, d.h. in printf kommen immer int/unsigned int an, für alle Argumente mit arithmetischem Typ kleiner int.
    Demzufolge ist %hd ebenso wie %hhd nur von formalem Wert, praktisch sind sie Augenwischerei, da immer ein %d/%u äquivalent ist, ebenso wie ein expliziter Cast Unsinn wäre (da die compilerinterne Promotion immer ggü. dem expliziten Cast gewinnt).

    dass das alles so funktioniert weiß ich auch. aber der compiler gibt doch eine warnung aus und auch wenn warnungen unter umständen ignoriert werden können, weil der compiler schon das richtige machen wird, ist es doch irgendwie guter stil, dem compiler klare und eindeutige anweisungen zu geben.



  • Es ist niemals guter Stil, du Casts irgendwas "dokumentieren" zu wollen oder gar Compilerwarnungen unterdrücken zu wollen.
    Ein standardkonformer Compiler warnt nie, falls interne Promotion zuschlägt:

    char c; printf("%hhd",c);
    char c; printf("%d",c);
    int c; printf("%hhd",c);
    int c; printf("%d",c);
    

    %hhd und %hd ist nur für die Galerie, wie schon gesagt.



  • Wutz schrieb:

    Es könnte ja sein, dass irgendein C-Profi genau dieses Verhalten benötigt - und eben nicht vom Compiler ausgebremst werden will.

    Ein C-Profi der undefiniertes Verhalten benötigt...

    Naja, wir wissen ja von wem es kommt...


  • Mod

    Der echte Tim schrieb:

    Wutz schrieb:

    Es könnte ja sein, dass irgendein C-Profi genau dieses Verhalten benötigt - und eben nicht vom Compiler ausgebremst werden will.

    Ein C-Profi der undefiniertes Verhalten benötigt...

    Naja, wir wissen ja von wem es kommt...

    Willst du damit sagen, solche Fälle kämen in der Realität nie vor? Die gibt es zuhauf.



  • SeppJ schrieb:

    Der echte Tim schrieb:

    Wutz schrieb:

    Es könnte ja sein, dass irgendein C-Profi genau dieses Verhalten benötigt - und eben nicht vom Compiler ausgebremst werden will.

    Ein C-Profi der undefiniertes Verhalten benötigt...

    Naja, wir wissen ja von wem es kommt...

    Willst du damit sagen, solche Fälle kämen in der Realität nie vor? Die gibt es zuhauf.

    Welche Fälle? Dass man als Profi bewusst UB provozieren will um sein Programm kaputt zu machen?



  • Natürlich kommt das vor.
    Du tappst mit deinem Halbwissen ebenso rum, wie du Vermutungen anstellst.
    Profis wissen natürlich für ihren Compiler und/oder Plattformbereich genau Bescheid, wie ihr Compiler reagiert.
    Torvalds kümmert sich auch nicht groß um den Standard, wenn er es in seinem Fall besser weiß - der Standard aber undefiniertes/unspezifiziertes/implementierungsabhängiges Verhalten vorschreibt.
    Der Standard definiert den größten gemeinsamen Nenner für alle Compiler auf allen Plattformen, das schließt das Ausnutzen von Compiler/Plattformspezifika durch Profis natürlich nicht aus, die in der Regel eben keine maximale Portabilität durch strikte Standardkonformität benötigen.



  • Dann geb doch mal ein Beispiel wo der Profi wissentlich Return-Werte unterlässt um genau irgendwelches Verhalten zu erzwingen?

    Dass teilweise auf UB geschissen wird ist ein ganz anderes Thema. Lern lesen.


  • Mod

    Der echte Tim schrieb:

    Welche Fälle? Dass man als Profi bewusst UB provozieren will um sein Programm kaputt zu machen?

    Alle Fälle, wo man den über die vom Sprachstandard angenommene Black-Box hinaus geht (diese Black-Box ist der minimale gemeinsame Nenner aller Computer). Sprich: Sobald man mal mehr macht als bloß zu rechnen und stattdessen den Computer voll ausnutzt. Einfachstes Beispiel: Was denkst du, wie der Computer mit seiner Hardware redet? Gerätetreiber und Betriebssysteme sind aus gutem Grund praktisch alle in C geschrieben.

    Oder wenn wir von Geschwindigkeit reden: Denkst du ernsthaft, Datenverarbeitung wäre heutzutage so schnell, wenn man sich dabei nie auf die interne Darstellung von Daten verlassen würde?


  • Mod

    Der echte Tim schrieb:

    Dann geb doch mal ein Beispiel wo der Profi wissentlich Return-Werte unterlässt um genau irgendwelches Verhalten zu erzwingen?

    Du verdrehst die Frage und stellst sie nun falsch. Die Frage lautet: Wo drin besteht der Vorteil, den Programmierer zu zwingen, für alle Ausführungspfade ein return anzugeben?

    Der Programmierer weiß schließlich was er will. Er weiß, welche Pfade überhaupt vorkommen können, weil er Zusatzinformationen hat, die der Compiler nicht hat. Wieso sollte der Experte eingeschränkt werden, um Stümper, die kein korrektes Programm schreiben können, zu ihrem Glück zu zwingen? C richtet sich nicht an Stümper.

    Hier noch ein dummes Beispiel. Es ist absichtlich dumm gewählt, damit jeder es nachvollziehen kann:

    int is_even(int i)
    {
      if (i % 2 == 0)
        return 1;
      if (i % 2 == 1)
        return 0;
    }
    

    Hat es irgendeinen Mehrwert, den Programmierer zu zwingen, am Ende noch ein weiteres return zu schreiben?



  • Wutz schrieb:

    Es ist niemals guter Stil, du Casts irgendwas "dokumentieren" zu wollen oder gar Compilerwarnungen unterdrücken zu wollen.

    naja casten bedeutet doch, dem compiler mitzuteilen, dass man zu wissen meint, was man macht und er das bitte so zuweisen möchte. in einem aktuellen fall mach ich z.b. sowas:

    returnvalue = (int) lstrcpy(strnew, strold);
    
    if(returnvalue==0)
    {
    //fehlerbehandlung
    }
    

    die adresse interessiert mich jetzt nicht wirklich, von daher denke ich, dass das so voll in ordnung ist. oder was kann da jetzt großartig passieren?

    Ein standardkonformer Compiler warnt nie, falls interne Promotion zuschlägt:

    char c; printf("%hhd",c);
    char c; printf("%d",c);
    int c; printf("%hhd",c);
    int c; printf("%d",c);
    

    %hhd und %hd ist nur für die Galerie, wie schon gesagt.

    macht meiner (visual studio) auch nicht, wurde aber weiter vorne so erzählt.
    aber hier steht hh z.b. in der dokumentation drin, von daher macht es doch sinn, hh auch zu verwenden. wenn der compiler das ignoriert, ist das ja sache des compilers.



  • Wutz: es geht um den Code vom OP (sein erster Beitrag):

    char *testval;
    
    testval = testfunc();
    printf("value = %d", testval);
    

    Oder habt ihr diesen Thread für ein anderes Thema gekapert???



  • Ein absichtlich dummes Beispiel? Mir wäre ein absichtlich sinnvolles Beispiel lieber. Muss ja nicht jeder verstehen, C ist ja eh nur für Profis... 🙄


  • Mod

    Der echte Tim schrieb:

    Ein absichtlich dummes Beispiel? Mir wäre ein absichtlich sinnvolles Beispiel lieber. Muss ja nicht jeder verstehen, C ist ja eh nur für Profis... 🙄

    Wenn du nicht in der Lage bist, die wichtigen Aspekte an dem Beispiel zu erkennen und auf andere Situationen zu übertragen, dann ist Programmieren nichts für dich. Dafür war es extra einfach gehalten.



  • Der echte Tim schrieb:

    Muss ja nicht jeder verstehen, C ist ja eh nur für Profis... 🙄

    Und für wen ist dann C++? Für Super-Profis? 😃



  • Tut mir leid, aber an dummem Code kann ich nichts lernen. Liest du dumme Bücher um dich weiterzubilden?



  • SeppJ schrieb:

    Hier noch ein dummes Beispiel. Es ist absichtlich dumm gewählt, damit jeder es nachvollziehen kann:

    int is_even(int i)
    {
      if (i % 2 == 0)
        return 1;
      if (i % 2 == 1)
        return 0;
    }
    

    Hat es irgendeinen Mehrwert, den Programmierer zu zwingen, am Ende noch ein weiteres return zu schreiben?

    Sehr dumm ist die zweite If-Zeile. Lässt du die weg, hast du plötzlich dein gesuchtes Return am Ende und alle sind wieder beruhigt.

    int is_even(int i)
    {
      if (i % 2 == 0)
        return 1;
      return 0;
    }
    

    oder schöner:

    int is_even(int i)
    {
      return (i % 2 == 0);
    }
    

  • Mod

    Der echte Tim schrieb:

    Tut mir leid, aber an dummem Code kann ich nichts lernen. Liest du dumme Bücher um dich weiterzubilden?

    Wie ich schon sagte: Wenn du nicht in der Lage bist, Beispiele auf reale Situationen zu übertragen, kannst du Programmieren sowieso vergessen. Wer von puts("Hello World!") nicht auf die Ausgabe von Zeichenketten in echten Programmen kommt, wird niemals etwas erreichen.


  • Mod

    Nichtprofi schrieb:

    [dummes Zeug]

    Super! Daran habe ich echt nicht gedacht. Wirklich. Toll, wie du uns allen die Augen öffnest!

    🙄 🙄 🙄

    Ich wollte ja ursprünglich an das Beispiel dran schreiben, dass Oberschlaumeier, die diese Verbesserung vorschlagen, zu dumm sind, um den Sinn von Beispielen zu verstehen. Aber ich fand das unhöflich und unnötig. Anscheinend war es absolut nötig. Und unhöflich bin ich dann auch gerne: Du bist zu dumm für einfachste Interaktion mit anderen Menschen. Du bist der Idiot, der nicht mitdenken kann und dem Professor in der Vorlesung dazwischen ruft, dass er das Integral von x^2 auch direkt ausrechnen könne, während die klugen Studenten lernen wollten, wie man Lebesgueintegration benutzt. Und hältst dich dabei auch noch für schlau und merkst nicht, wie dich jeder für dumm hält. Jetzt weiß du es: Du bist zu doof.



  • SeppJ schrieb:

    Der echte Tim schrieb:

    Tut mir leid, aber an dummem Code kann ich nichts lernen. Liest du dumme Bücher um dich weiterzubilden?

    Wie ich schon sagte: Wenn du nicht in der Lage bist, Beispiele auf reale Situationen zu übertragen, kannst du Programmieren sowieso vergessen. Wer von puts("Hello World!") nicht auf die Ausgabe von Zeichenketten in echten Programmen kommt, wird niemals etwas erreichen.

    Ich habe schon genug erreicht, ich lasse programmieren. Wenngleich es schwer fällt Code von nicht-Profis lesen zu müssen. Wie hier.

    Aber genug deiner Rückzugsgefechte.


  • Mod

    Der echte Tim schrieb:

    SeppJ schrieb:

    Der echte Tim schrieb:

    Tut mir leid, aber an dummem Code kann ich nichts lernen. Liest du dumme Bücher um dich weiterzubilden?

    Wie ich schon sagte: Wenn du nicht in der Lage bist, Beispiele auf reale Situationen zu übertragen, kannst du Programmieren sowieso vergessen. Wer von puts("Hello World!") nicht auf die Ausgabe von Zeichenketten in echten Programmen kommt, wird niemals etwas erreichen.

    Ich habe schon genug erreicht, ich lasse programmieren. Wenngleich es schwer fällt Code von nicht-Profis lesen zu müssen. Wie hier.

    Aber genug deiner Rückzugsgefechte.

    Rückzugsgefecht? Willst du mir ernsthaft sagen, du möchtest lieber ein Mathematikbuck lesen, das Integration direkt am Beispiel eines homeomorphen Endofunktors zwischen Submanigfaltigkeiten eines Hilberraums erklärt, anstatt an f(x)=x^2? Und dass du ein weniger anspruchsvolles Beispiel weder akzeptieren noch verstehen würdest? Träum weiter. Ich nehme dir nicht ab, dass du derart dumm wärst. Du willst nur Internetpunkte mit Scheinargumenten sammeln. Aber du bist halt sowohl in C als auch in Flamewars absoluter Anfänger, das funktioniert nicht.


Anmelden zum Antworten