Alte Daten von Pascal in C++ einlesen



  • http://de.wikipedia.org/wiki/Gleitkommazahl oder hier
    http://de.wikipedia.org/wiki/IEEE_754
    Schau dir das mal an.

    Gleitkommazahlen bestehen aus Vorzeichenbit, Charakteristik, dem versteckten Bit(was man nicht mit speichert^^) und der Mantisse.
    Grund sätzlich bringt man ne Gleitkommazahl im rechner immer auf
    "(Vorzeichen) 1,Mantisse * 2^Exponent"
    Im real bei Pascal ist es "(Vorzeichen) 0,Mantisse + 2^Exponent"

    edit:
    also eigentlich 2^Charakertistik, wobei die Charakteristik sich aus dem Exponenten berechtnet(exponent + 2^c - 1 wobei c die Anzahl der Bits für den Exponentenanteil ist) Bei real fällt das - 1 dagegen weg.



  • Das ist sicher alles richtig, oder auch nicht. Exponent,Charakertistik und Mantisse sind sicher schöne Worte, deren Erwerb auch ich anstrebe.
    Das Problem ist nur, ich versteh euch nicht. Ich versprech auch, sobald ich mein Problem gelöst habe, gehe ich in den Keller und schäm mich.... meinetwegen auch ausdauernd. In den Hilfeforen gibt es mittlerweile mehr Links zu Fragen als Antworten selbst. Bedauerlicherweise auch recht viele zu toten Links.
    Ich weiss wirklich, ihr bemüht euch und schüttelt den Kopf, dass es jemanden gibt der all die Fachausdrücke nicht kennt.
    Ich will euch auch nicht unnötig nerven, aber einmal versuch ichs noch.
    Hier mal 2 mal 6 bytes in denen sich die real versteckt.

    84 33 33 33 33 4B und
    81 CD CC CC CC 0C

    Kann mir vielleicht doch noch einer helfen wie ich das umrechne?



  • das musst du sicher bitweise machen,
    So sieht ein float aus

    Vorzeichen(1 Bit) Charakteristik(8 Bit) Mantisse(23 Bit)

    0 01100110 00110001100011000100011

    bei double:

    Vorzeichen(1 Bit) Charakteristik(11 Bit) Mantisse(52 Bit)

    1 11001110001 1001100110100110011010011001101001100110100110011000

    Beim Pascal-Real sieht das so aus

    Vorzeichen(1 Bit) Mantisse(39 Bit) Charakertistik(8 Bit)

    0 10101010101010101010101010101011010101010 00110001

    Vorzeichenbit kannst du 1 : 1 übernehmen
    Die Mantisse auch, bei float musst du aber hinten abschneiden, also ist double bestimmt besser geeignet.
    Bei dem Charakteristik-Teil dagegen musst du vom real zum float -1 rechnen.

    Wäre zu üeberlegen ob du das ganze mit nem vector<bool> evtl umsetzt. Lässt sich evtl. leichter programmieren. Wird aber so oder so fein auf arbeit mit bit-operatoren und shiften rauslaufen^^



  • Ich weiss natürlich, dass ich unverschämt bin, aber hättest du nicht zufällig einen Codeschnippsel der das ganze irgendwie erledigt?



  • *lol* nein hab ich nicht. Hatte grad nen Blatt aus meinem "Grundlagen der Informatik"-Skript vor mir liegen und das was da stand habsch dir kurz zusammen gefasst.
    Is doch ne schöne Aufgabe 🙂

    Ansonsten hast schonmal gegoogelt? Bist doch sicher nicht der erste, der das Problem hat



  • Natürlich hab ich gegoogelt und Treffer dazu gibts ne Menge (4 Millionen), bisher jedoch fand ich noch nirgends eine Anleitung wie es wirklich gemacht wird. Schon klar, ich hab noch nicht alle 4 Millionen durch 😉
    Ich hab 2 Seiten gefunden in denen ein Codebeispiel steht, leider sind beide nicht zum laufen zu bewegen.

    Nein, ich bin nicht der erste der das Problem hat, es gibt halt nur theoretische Erklärungen wie es gehen müsste und da steig ich nicht durch.

    Ebensowenig wie ich verstehe wie die Formel zur Berechnung eines Kreisunfangs zustande kommt. Ich kenn einfach die Formel und kann (mit Hilfe des Taschenrechners) dann das ausrechnen.
    Bit schiften ist bestimmt ein lustiges Hobby, aber ich weiss nicht wie das geht (naja >> und << macht das) aber ich weiss nicht was dabei herauskommt. Gerne gebe ich zu, dass ich nur einen IQ knapp über Zimmertemperatur habe... irgendwie sollt es doch egal sein. Ich will autofahren nicht wissen wie eine elektronische Einspritzpumpe zu fertigen ist.

    Vielleicht erbarmt sich doch noch einer meines Problems



  • DaDings schrieb:

    Ebensowenig wie ich verstehe wie die Formel zur Berechnung eines Kreisunfangs zustande kommt. Ich kenn einfach die Formel und kann (mit Hilfe des Taschenrechners) dann das ausrechnen.

    Das mit dem Kreisumfang ist leichter erklärt als Du denkst. Rechne Dein Koordinatensystem in Zylinder- oder Polarkoordinaten um. Dann muss man nur einmal über den Radius (von 0 bis r) und einmal über einen Vollkreis (entsprechen 0 bis 2Pi für 360°) integrieren und schon hast Du das.
    Ich habe auch jahrelang Pascal gemacht, das war zumindest ein schöner Start in die Programmiererei. Allerdings fliegt Dir da auch nicht alles zu. Du hast hier schon gute Tipps bekommen. Du solltest Dich vielleicht erst mal mit den Grundlagen vertraut machen. Das ist nicht böse gemeint aber ist aber notwendig. Wenn Du den grundlegenden Aufbau von Gleitkommazahlen verstanden hast wird Dir auch der Algorithmus leicht fallen. Der Vergleich mit dem Autofahren und er Einspritzpumpe war zwar gut, der trifft aber nur auf den Endbenutzer zu. Du bist der Automechaniker, der die Karre im Notfall auch reparieren muss. Und somit ist es schon von interesse, dass Dir die Funktionsweise der Einspritzpumpe klar ist.
    Und dann noch was: mach Dich nicht so runter von wegen IQ unter Raumtemperatur. Sicher sieht man mal Dinge nicht gleich auf den ersten Blick. Das sollte einen nicht entmutigen. So ein fishing-for-compliment macht keinen guten Eindruck. Es gibt im übrigen keine dummen Fragen, nur dumme Antworten.
    Nochmal zu Deinem Problem. Wo stehen denn überhaupt die Daten deines Records? in einer Binärdatei oder einer Textdatei? Ich habe immer Texdateien genommen, die man dann zeilenweise auslesen konnte. Bei Binärdateien bin ich mich nicht sicher wie Pascal die Daten darin ablegt. Es gibt ja da zwei Mechanismen, Collection und Streams und die legen bekanntlich verschieden die Daten ab.



  • Mag sein, dass ich hier jetzt quer schieße, aber kannst du nicht ein Pascal Programm machen, was die Daten in ein besser verwertbares Format konvertiert? 😃
    Den Preis dann z.B. als Zeichenkette schreibt?

    Also, so als letzten Notnagel würde ich sowas versuchen. 🙂

    Ich glaube, die Records in TP waren keine Zeilen, aber ich habe das ehrlich gesagt nie nachgeschaut. 🙄



  • estartu schrieb:

    Mag sein, dass ich hier jetzt quer schieße, aber kannst du nicht ein Pascal Programm machen, was die Daten in ein besser verwertbares Format konvertiert? 😃
    Den Preis dann z.B. als Zeichenkette schreibt?

    Also, so als letzten Notnagel würde ich sowas versuchen. 🙂

    Ich glaube, die Records in TP waren keine Zeilen, aber ich habe das ehrlich gesagt nie nachgeschaut. 🙄

    Ja genau das hatte ich auch vorschlagen wollen (habs nur nicht explizit gesagt). Du hast Recht, Records werden nicht nicht in Zeilen abgespeichert. Wie gesagt ich habe immer die Turbo-Vision-Klassen TStream und TCollection genutzt. Das sind ja Mechanismen die der Serialisierung in Visual C++ gleichkommen. Aber wie ich ihn verstanden habe gibts die Datenfiles schon und er will nur unter C ein Programm, was auch damit arbeiten kann.



  • Aber wie ich ihn verstanden habe gibts die Datenfiles schon und er will nur unter C ein Programm, was auch damit arbeiten kann.

    Naja, um beim Auto zu bleiben: Wenn ein Schlauch kaputt ist kommt erstmal Panzerband drum, dann gehts wieder.

    Für Programmieren soll das heissen: Wenn er das File mit C++ nicht in vertretbarer Zeit eingelesen kriegt, hilft ein kleines Vorkonvertierprogramm in TP vielleicht aus. 🙂

    Man muss sich nur zu helfen wissen. 😉



  • Naja, ist immer die Frage des Aufwandes. Du machst ja kein Panzerband drum wenn 200m neben Dir ein Reifendienst ist. Bei einem aktuellen Problem von mir fallen pro Monat ca. 35.000 Datensätze mit ca. 20-30 Feldern an. Eine zuzsammengeflickte Lösung wäre hier zu zeitaufwendig. Außerdem wenn die Daten immer wieder anfallen und ich das auch weiterverwenden will muss ich mir auf kurz oder lang sowieso Gedanken über die Konvertierung machen. Aber das sind alles Dinge die wir so nicht beurteilen können. Fürs prinzipelle Probieren hat Deine Aussage natürlich Gültigkeit.


Anmelden zum Antworten