Beiträge von Plantschkuh!

    Soweit ich weiß, ist es ja nicht damit getan, bei der Programmierung einfach auf Multi-Threading zu achten, oder?


    Was heißt "einfach auf Multi-Threading achten"? Üblicherweise gilt auf jeden Fall, daß du explizit um Multithreading bitten mußt. Aber ja, nur weil du N Threads hast, läuft dein Programm nicht gleich um einen Faktor N schneller: Idealerweise sollten deine Threads prozessorlastig sein, weil die Speicherbandbreite recht schnell ausgeschöpft ist. Je weniger Kommunikation/Synchronisation/sonstige Abhängigkeiten, umso besser.

    Zitat

    -) Im Tuwis finde ich keine Lehrveranstaltung zu dem Thema, obwohl es doch zumindest eine Vertiefungs-LVA wert wäre


    Das ist eines von vielen Themen, die Vertiefungs-LVAs wert wären, aber unsere Uni ist leider nun mal so...

    Zitat

    Da ich fürs erste aber auch noch recht viel C++ entwickeln werde, würde mich interessieren, wie ich dabei mehrere CPU-Cores ausnutzen kann.


    Libraries, die den pthreads-Standard implementieren, sind glaub ich so ziemlich überall verfügbar; das ist vielleicht die beste Wahl zur Zeit. (Außer vielleicht Microsoft tut was anderes und hat vor, noch lange was anderes zu tun, und man ist sicher, daß man bestimmt immer explizit nur für Windows entwickeln wollen wird.)

    Ich habe dieses Buch gelesen und ganz brauchbar gefunden, aber wenn man ein bissi herumsucht, werden andere enthusiastischer empfohlen. Auf amazon.de meint z.B. einer: "If you want to write code, get "Programming with POSIX Threads" by David Butenhof." Allerdings meint der auch, daß er es nach dem Nichols-Buch nicht geschafft hat, Programme zu schreiben; ich habe es aber geschafft.

    Es gibt auch noch OpenMP, das in gewissen Hinsichten komfortabler ist, aber spezielle Compiler braucht. Ein coding standard dort, wo ich im Sommer gearbeitet habe, hat davon abgeraten, aber vielleicht ist es einen Blick wert. Ich weiß nicht viel darüber.

    Edit: Naja, und MPI erwähne ich dann auch noch. Ist aber weniger für Multicore und mehr für echt verteilte Cluster und single program multiple data gedacht (sprich numerische Simulationen, unabhängige Bilder rendern könnte man damit sicher auch sehr fein).

    WTF?


    Der März hat mehr Tage als der April. Zur besseren Vergleichbarkeit wäre es also interessant, die Anzahl der Geburten im März durch 31 und die im April durch 30 zu dividieren, und diese Resultate (Geburten pro Tag im betreffenden Monat) zu vergleichen. Normierung halt.

    Der Februar macht da mal wieder Probleme, aber da kann man wiederum die durchschnittliche Anzahl von Februartagen im Untersuchungszeitraum heranziehen.

    Der dreiparametrige Konstruktor von Point sollte ziemlich sicher kein dreiparametriger Konstruktor von Point sein, da du ja keinen Punkt konstruierst... Und dasdada:


    könnte man lesbar auch so irgendwie schreiben:


    Die Variablen ab, bc, ac stehen für die jeweiligen Distanzen zwischen den Punkten und sind marginal aussagekräftiger als ergebnis123.

    Ich glaube, Spitzwinkligkeit kann man mit einer Pythagoras-ähnlichen Formel überprüfen: Seien a, b, c die Seitenlängen des Dreiecks, wobei c > a und c > b. Dann ist das Dreieck spitzwinklig genau dann, wenn [tex='a^2 + b^2 > c^2'][/tex]

    . Den Beweis bleibe ich jetzt mal schuldig. Wenn man das so implementiert, dann aber bitte nicht mit einer Fallunterscheidung nach der längsten Seite, sondern: Die Seitenlängen in ein array tun und mittels Arrays.sort() sortieren, das letzte Element ist dann das längste.

    Bitte Code immer zwischen [ code ] und [/ code ] schreiben (ohne Leerzeichen), sonst ist er unlesbar, und keiner mag dir helfen. Also:

    Code
    static void up(int zahl) {
        if (zahl > 0) {
            up(zahl-1);
            System.out.print(",");
        }
        System.out.print(zahl);
    }

    Man kann sich einen Funktionsaufruf ganz ganz ganz ganz grob so denken (sprich: tu es nicht), daß man im Körper der aufgerufenen Funktion die Parameter (in diesem Fall die Variable Zahl) durch die Argumentausdrücke (in deinem Fall die Zahl 10) ersetzt. So viel Zeit haben wir jetzt nicht, aber mal sehen, was der Aufruf up(2) tut:

    Code
    static void up(2) {
        if (2 > 0) {
            up(2-1);
            System.out.print(",");
        }
        System.out.print(2);
    }

    2 ist größer als 0, es wird also der Körper des if-Statements ausgewertet, und 2-1 ist 1, also bleibt:

    Code
    static void up(2) {
        up(1);
        System.out.print(",");
        System.out.print(2);
    }

    Den Aufruf up(1) ersetzen:

    Code
    static void up(2) {
        if (1 > 0) {
            up(1-1);
            System.out.print(",");
        }
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }

    1 ist größer als 0 und 1-1 ist 0, also haben wir:

    Code
    static void up(2) {
        up(0);
        System.out.print(",");
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }

    Aufruf up(0) ersetzen:

    Die Bedingung 0 > 0 ist falsch, also fällt der Körper des if-Statements weg. Es bleibt:

    Code
    static void up(2) {
        System.out.print(0);
        System.out.print(",");
        System.out.print(1);
        System.out.print(",");
        System.out.print(2);
    }

    Daß das dann "0,1,2" ausgibt, ist hoffentlich klar :)

    Das ist wie gesagt nicht wirklich das, was der Computer zur Ausführungszeit macht, aber es beschreibt ungefähr die Bedeutung des Programms.

    Ich denke nicht, dass es eine legale Möglichkeit gibt, aus einem (hundertprozentig legal erworbenen) koreanischen Office ein englisches Office zu machen


    Das denke ich jetzt spontan auch nicht, aber...

    Zitat

    und habe daher den Thread einmal mit dem Kommentar "Warez" gemeldet.


    ... wieso das? Wenn die Antwort "das geht legal nicht" ist, dann ist das die Antwort. Er hat nichtmal implizit nach Warez gefragt, sondern die Antwort einfach nicht gewußt.

    Der Begriff scheint vor allem in der Pascal-Welt gebräuchlich. Es geht dabei um Records (structs in C), die unterschiedliche Formen annehmen können. D.h. du hast einen Recordtyp, aber abhängig von irgendeinem Flag nimmt er unterschiedliche Formen an. Ein gegoogeltes Beispiel in Pascal:


    Ein TRect hat einen Flag, der angibt, ob die Koordinaten der Eckpunkte einzeln gespeichert sind oder zu Punkten zusammengefasst. Die beiden Darstellungsformen überlappen sich üblicherweise im Speicher.

    Das macht in C sowas:

    In Haskell wäre es:

    Code
    type Point = (Integer, Integer)
    data TRect = Coordinates Integer Integer Integer Integer
               | Corners Point Point

    Der Witz an der Sache ist, daß du eben je nach Flag (bzw. Typkonstruktor in Haskell) unterschiedliche Strukturen hast, aber nur einen gemeinsamen "Obertyp". Damit kannst du verwandte, aber verschiedene Strukturen z.B. in einer Liste speichern.

    Insbesondere kann ich nicht nachvollziehen, warum die Variablendeklaration (die der Prozedur von I und H) nicht im Prozedurkopf sondern darunter stehen (wann muss ich sie in den kopf schreiben, wann nicht?).


    Du schreibst sie in den Kopf, wenn sie Parameter sein sollen, die beim Aufruf der Prozedur übergeben werden. Die Variablen i und h haben nur innerhalb der Prozedur eine Bedeutung, i als Schleifenzähler und h als Zwischenspeicher beim Vertauschen von zwei Elementen. Deswegen hat es keinen Sinn, sie zu Parametern der Prozedur zu machen, sie sollen ihre Werte innerhalb der Prozedur erhalten und nicht von außen.

    Zitat

    Desweiteren sind mir die Schleifen nicht ganz klar


    Welche Schleife(n)?

    Zitat

    sowie der Dreieckstausch


    Was daran ist dir nicht klar?


    Bäh. Verwende [code]-Tags um den Code herum und formatiere ihn lesbar.

    wasser und strom müssen auch fließen.


    In Privathaushalte? Sag das mal den Leuten, die am Sabbat nichtmal den Lichtschalter umlegen. Für die gehts auch ohne diesen Luxus, da kann es auch für dich ohne diesen Luxus gehen.

    Zitat

    es muss doch möglich sein, mal den ganzen wochenscheiß abzustellen und sich nur und ausschliesslich den sachen zu widmen, die einem taugen und entspannend sind. familie, freunde, usw...


    Ja, das wäre gut. Aber alle hier lassen irgendwen anderen am Wochenende für sich arbeiten (siehe unten), und nur bei Handelsangestellten packt einige das scheinheilige schlechte Gewissen, dabei sind sie nicht weniger sichtbar als Kellner.

    1.) Mo-Fr normale arbeitszeit, wo quasi "jeder" arbeiten muss
    2.) Sa eingschraenkt, hauptsaechlich zum einkaufen/im restaurant essen gehen, wozu leute die nach 1.) arbeitszeiten arbeiten einfach nicht so dazukommen


    Gerechtigkeit für alle!!1! Außer ein paar. Naja, du tust wenigstens nichtmal so, als ob es dir um die soziale Frage ginge, sondern bist fest im Klassendenken verankert. Ehrlicher als der Rest hier :)

    mit Freunde weggehn,....


    ... in die oben erwähnte Höhle fernab der Zivilisation? Oder in Lokale, wo es so dunkel ist, daß man übersieht, daß da eine Barfrau am Sonntag am Abend ausgebeutet wird?

    Zitat

    Aber was kauft ihr am So? Ganz normal was ihr so braucht, oder wenn etwas ausgeht?


    Mal abgesehen von den Dienstleistungen, die gerne ausgeblendet werden, kauf ich sonntags meist nur was frisches beim Bäcker, und auch nur, wenn ich meine Freundin vom Nachtdienst abhole (Samstag auf Sonntag, 12 Stunden, 4 Euro die Stunde).

    juhu, geht alle am So einkaufen, vll wird er dann endlich abgeschafft und wir dürfen 7 tage/Woche studieren, arbeiten, lernen.


    Sonntags einkaufen ist nicht böser als sonntags in irgendein Lokal oder ins Kino zu gehen, mit dem Bus oder mit der Bahn zu fahren, Strom und Wasser zu konsumieren, oder darauf zu vertrauen, daß Polizei, Rettung und Feuerwehr für einen da sind.

    Wer sich fürs Wochenende zu Fuß in eine abgelegene Höhle verzieht, werfe das erste Schwein.


    Nach meiner Rechnung sind es 4:20:33 +/- Rundungsfehler. Hast du auch nachgerechnet?

    Zitat

    u. was heist bei diesem programm modf


    Da deine Variable alle vom Typ float sind, mußt du modff verwenden (oder die Variablen auf double ändern). Achte auf die Warnungen von deinem Compiler! Er sollte dich darauf hingewiesen haben, daß modf nicht deklariert ist.

    Naja, ich habe nun noch eine Variante in einem C Buch gefunden:

    Code
    void main(void)


    Das ist nicht eine der Formen, die vom C-Standard vorgeschrieben sind. Viele Compiler akzeptieren das, andere nicht, oder sie erzeugen falschen Code. Zum Beispiel kann es sein, daß ein undefinierter Fehlerstatus von deinem Programm zurückgegeben wird. Lies ein Buch, das dir zu void main rät, nicht weiter, denn der Autor weiß nicht genug über C, um das zu wissen; es gibt genug gute Bücher.

    Zitat

    Im moment geht es darum C zu lernen und finde verschiedenes darüber.

    Ist das Compiler abhängig?

    Woher kommt das?

    Oder gibt es verschiedene Versionen von C?


    Es gibt zwei Versionen von C, nämlich C89 (manchmal auch C90 genannt) und C99. (Es gibt sogar noch C95, das ist aber bis auf winzigste Details identisch mit C89.) Allerdings gilt für beide Versionen: Die anerkannten Formen von main sind "int main(void)" und "int main(int argc, char **argv)". (Wobei man "char **argv" auch als "char *argv[]" schreiben kann.) In C89 kann man das int und den Teil in den Klammern weglassen, da ist also auch "main()" erlaubt. Allerdings ist das ein Stil, zu dem seit 20 Jahren nicht mehr geraten wird.

    Compiler dürfen prinzipiell auch andere Formen unterstützen, aber es ist ihre Sache, was sie damit tun. Wenn du auf einen anderen Compiler oder auch nur eine etwas andere Version des selben Compilers wechselst, kann es schon sein, daß dein Programm nicht mehr funktionieren wird!

    Halte dich an den Standard. Es gibt oft sehr sehr gute Gründe, sich nicht an den Standard zu halten, aber die Deklaration von main ist kein Grund.

    Zitat

    Die Programme erstell ich mit dem Dev-C++.


    Achte darauf, daß du den C-Modus verwendest, wie immer das geht. Und möglichst alle Warnungen und Fehlermeldungen einschalten, du willst so viel über dein Programm wissen wie nur möglich.

    Ich würde wohl jede Zeile in ein Array von unsigned char lesen und mir dann die einzelnen Felder mit memcpy rauskopieren. Soweit ich die Problemstellung richtig verstehe. Wenn du zur Laufzeit dynamische Typen brauchst, nimmt man üblicherweise ein struct bestehend aus einem enum für den Typen und einer union, wo die Daten drinstehen.