Werte unterschiedlichen Types aufnehmen.

Dieses Thema im Forum "C/C++" wurde erstellt von ixs, 01.06.2012.

  1. ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Hi,

    ich möchte gerne Werte mit unterschiedlichen Datentyp, Größe und Anzahl in einem Programm aufnehmen und verarbeiten.
    Doch ich finde für das Problem keine richtige Lösung. Ich könnte zwar z.B. mit einem 2 dim. string Array Tricksen, doch beim Konvertieren der Datentypen würde ich dann später genau die gleichen Probleme bekommen.

    Bildlich versucht das Problem erklärt:
    Ich erhalte Werte:
    Code:
    1 | Mittwoch | grau | 11.1
    2 | Sonnabend | blau | 2.3
    ...
    n | Montag | gelb | 231
    
    oder:
    Code:
    1.3.1997 | 45 | text | 8 | 
    15.5.1999 | 45 | text | 8 | 
    21.8.1998 | 45 | text | 8 | 
    ...
    3.11.1912 | 45 | text | 8 | 
    
    Und muss sie zur weiteren Verarbeitung aufnehmen.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 HeadCrash, 01.06.2012
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Morgen,

    was genau willst du damit jetzt machen?
    Wie soll das aussehen wenn du fertig bist?

    mfg
    HeadCrash
     
  4. ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Abschließens möchte ich mit den Werte einfache Statistische Berechnungen ausführen, wie zum Beispiel ihren Durschnitt berechnen.
     
  5. #4 T-Virus, 01.06.2012
    T-Virus

    T-Virus Free Software Fan :p

    Dabei seit:
    06.01.2009
    Beiträge:
    107
    Zustimmungen:
    0
    Wenn du nur die 2 Formate hast kannst du doch entsprechend 2 Klassen definieren und speicherst diese dann in einer Liste.
    Oder können die Daten auch gemischt kommen?

    Falls die Daten gemischt kommen wird es knifflig.
    Da du wohl um einer Konvertierung nicht herrum kommst, wäre die einfachste Lösung wohl nur das String Array.
    Du musst am Ende so oder so prüfen wie das Format der Daten ist.
    Dort musst du dann mit Strings arbeiten.

    Deshalb ist es am einfachsten mit String Arrays zu arbeiten.

    T-Virus
     
  6. #5 ixs, 01.06.2012
    Zuletzt bearbeitet: 01.06.2012
    ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Ja das ist ja das Blöde. Ich komme an die Datentypen über eine Abfrage der Tabellenstruktur herran, doch kann die Werte nicht entsprechend ihrer Datentypen speichern.

    Es gibt noch die Möglichkeit:
    Code:
    
    struct datenbeschreibung{
           string Name; // Name des Wertes
           int Stelle[2]; // Stelle des Wertes im daten struct
           int Anzahl; // Anzahl der Werte
    }
    
    struct daten{
          int** i_daten;
          double** d_daten;
          ...
          string** str_daten;
    
          struct datenbeschreibung datbeschr[];
    };
    
    Es gibt auch noch einen dynamischen 2 dim. void*. Doch kann er nur Adressen aufnehmen, die beim Verlassen der Funktion wieder ungültig werden.
     
  7. #6 marcellus, 02.06.2012
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Ich würd dir eher raten die Daten Zeilenweise als String einzulesen und dann daraus zu parsen und dann gleich in ihrem Datentyp einzuordnen.

    Sowas ist normal recht mühsam, vor allem in C, aber du findest unter dem Begriff "Parser" sehr viel Tutorials, von denen du den Parser kopieren, und dann nur noch an dein Format anpassen musst. Falls dich das Parsen von files allgemein interessiert und du dich damit weiter auseinander setzen willst kannst du dir noch libpcre, flex und ggf bison ansehen, aber die wären für die Aufgabe echt overkill.

    Deine Speicherbereiche werden nur dann ungültig, wenn du nicht
    • Die Variablen statisch deklariert hast, aber in c++ hat man damit unter umständen mehr Probleme, als das es einem hilft.
    • Die Daten mit "new int ..." deklariert, die müsstest du auch händisch wieder freigeben
    • malloc :(
    Alle drei Varianten haben Nachteile, aber du kannst ansich schon mit void* arbeiten, es ist nur nicht empfehlenswert.
     
  8. ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Hallo marcellus,

    Erst meinmal herzlichen Dank, das Du mir helfen willst. Ein zweidimmensionales string Array kann ich aber nicht nach unterschiedlichen Typen Parsen, auch ein lokal erstellter Wert würde am Ende einer Funktion ungültig werden und ich weiß nicht, wie ich dann den Wert auserhalb halten soll. extern z.B. würde mir keinen Anstatz auf deren existens geben.
    Das ich Speicherbereiche deklariere die ich nicht verwende ist mir benwusst. Doch sehe ich es insgesammt wie die Verwendung von Pointern. Sie dürfen im Verlauf eines Programm, ja auch nicht später auf ungültige Adressen zeigen. Und der höhere Speicherbedarf, ist verschwinden gering, wenn man sich die Fülle von aufgenommenen Daten ansieht.
    Das die Daten statisch sein müssen, wüsste ich im Moment nicht warum. ein 2 dimensionales dynamisches Array mit new, oder malloc und drin sind sie.
    Aber eine nette void* Geschichte für int Stelle[2], wäre auch nicht schlecht.
     
  9. #8 marcellus, 04.06.2012
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Je nachdem, was du für Daten abspeichern willst leg dir eine klasse an und speicher die Daten darin. Dann kannst du die instanzen in einen vector reinstopfen. Ich seh nicht das große Problem dahinter.

    Wegen der Gültigkeit von Variablen und der statischen Deklaration probier das aus

    Code:
    #include <iostream>
    
    int foo()
    {
          static int bar=0;
          std::cout << bar++ << std::endl;
    }
    
    int main()
    {
          foo();
          foo();
          foo();
    }

    Aber ich denk dein Problem liegt woanders, du probierst anscheinend generisch irgendwelche Daten abzulegen. Was genau hast du vor? Willst du eine fixe Struktur runterarbeiten, oder soll das beliebige Formate einlesen können? Verwendest du überhaupt C oder C++?
     
  10. ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Hallo marcellius,

    Ich arbeite in C mit structs, da ich prozeduale Progrgrammierung als zu unaufgeräumt empfinde. "Da weiß ich am Ende nicht was ich habe." ;).
    Dabei versuche ich mit diesem Trick etwas zu generieren was es in C/C++ so nicht gibt. Ich will Variablen mit unterschiedlichen Datentypen zur Laufzeit generieren. Bei dem ganzen Programm habe ich auch gleich beide Probleme, zum Einen möchte ich die Daten aus Tabellen, Dateien, ftp holen und zum Zweiten möchte ich sie anschließend nach vordefinierten Allgorithmen verarbeiten. Das das nur bis zu einem gewissen Grad funktionieren wird, ist mir bewußt. Doch habe ich dann "wenigstens" das.
    Ich werde einmal schauen, ob mein Quellcode im Internet rumlungert, dann kann ich Dir zum besseren Verständnis einen Link dazu geben, kann aber eine Weile dauern.
     
  11. #10 marcellus, 04.06.2012
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    C ist eine rein prozedurale Programmiersprache, du kannst zwar übers hintertürchen Elemente vom objekt orientierten reinziehen, aber structs machen den code noch nicht so viel besser.

    Das, was du vor hast ist in C echt widerlich. Du hast in C++ zb die Möglichkeit Operatoren zu überladen, das würde bei dem, was du machen den code schon wesentlich besser lesbar machen.

    Wenn du eine eigene Skriptsprache schreiben willst ist das zwar eine nette Spielerei, aber sowas gibt es schon, das ist perl. Einerseits bezogen auf die Skriptsprache, andererseits auf die freaky datentypen, die irgendwie alles und/oder gar nichts sind.

    Für den Zweck schau dir aber eher bison an, bevor du alles in C schreibst.
     
  12. #11 ixs, 04.06.2012
    Zuletzt bearbeitet: 04.06.2012
    ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Hi,

    ich habe erst einmal den Quellcode ins Internet gestellt:
    xxx
    Werde den Link aber nach ca. 1/2h wieder entfernen. Es ist auch kein fertiges Programm, sondern im Entwicklungsstadion, also bitte von keinem funktionierenden Code ausgehen. Ich werde Deinen Tipp befolgen und mir einmal bison genauer anscheuen, vielleicht ist etwas für mich ja dabei.
     
  13. #12 marcellus, 04.06.2012
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Wenn du sowas vor hast würd ich dir fast raten die Berechnungen in gnumeric/koffice/libreoffice zu machen. Da solltest du ohne gröbere Probleme die Daten reinbekommen und hast schon die ganze Funktionalität von wegen rechnen, graphen plotten usw integriert.

    Wenn dus lieber etwas härter haben willst schau dir noch octave und maxima an.
     
  14. #13 ixs, 04.06.2012
    Zuletzt bearbeitet: 04.06.2012
    ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    gnumeric hört sich wirklich gut an, Danke für Deinen Tip.
    Doch bison empfinde ich als zu sehr über das Ziel hinnaus geschossen, auch würde der Aufwand nur dafür zu sehr steigen.
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 tgruene, 04.06.2012
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    Wenn Du nur diese beiden Formate hast, kannst Du erst testen, ob es Format A ist, und wenn nicht, es eine Zeile dann als Format B interpretieren. Falls Du C++ kannst, wuerdest Du dafuer zwei abgeleitete Klassen nehmen, deren Konstruktor eine Fehler ausschmeisst, damit dann der zweite Konstruktor die Arbeit uebernehmen kann. Aber an sich kannst Du dieses Konzept mit jeder Sprache Deiner Wahl realisieren, auch mit perl, awk, ...
     
  17. #15 T-Virus, 04.06.2012
    T-Virus

    T-Virus Free Software Fan :p

    Dabei seit:
    06.01.2009
    Beiträge:
    107
    Zustimmungen:
    0
    Saubere Programmierung wäre das aber nicht.
    Im einfachsten Fall musst du doch nur prüfen ob in der ersten Spalt ein . enthalten ist(Datum).
    Dann weißt du welches Format dort vorhanden ist.

    Aber hier müsste man eben als Außenstehender wissen ob es nur die beiden Möglichkeiten oder mehr gibt.
    Noch einfacher kann man es aber nicht haben als mit 2 Klasse als Container die Informationen zu speichern.
    Parsen per Hand wäre jetzt auch kein Weltuntergang.
    Du bräuchstest eigentlich nur ein paar einfaches Convert Methoden und schon hättest du alles.
    Für diese Aufgabe bräuchte man eigentlich keine 5 Tage :/

    Anbei würde ich die lexical_cast aus der Boost Library empfehlen.
    Damit könntest du deine Werte problemlos umwandeln wenn du dies benötigst.

    T-Virus
     
Thema:

Werte unterschiedlichen Types aufnehmen.

Die Seite wird geladen...

Werte unterschiedlichen Types aufnehmen. - Ähnliche Themen

  1. Free Software Foundation bewertet Codehosting-Dienste

    Free Software Foundation bewertet Codehosting-Dienste: Die Free Software Foundation (FSF) hat Bewertungen nach den selbst definierten Richtlinien für mehrere Codehosting-Dienste herausgegeben....
  2. Mit bash Skript bestimmte Werte aus Tabelle lesen

    Mit bash Skript bestimmte Werte aus Tabelle lesen: Hallo! Ich beschäftige mich erst seit Kurzem mit bash und bin deshalb noch nicht so fit darin. Und nun habe ich schon ein kleines Problem und...
  3. Logs von debsecan, tiger, chkrootkit richtig auswerten.

    Logs von debsecan, tiger, chkrootkit richtig auswerten.: Hallo! ich habe debsecan drüber laufen lassen und der zeigt mir einen Haufen an low/medium/high urgency an, mit oder ohne remotly exploitable....
  4. Wertebereich ersetzen mit sed

    Wertebereich ersetzen mit sed: Hallo Forenmitglieder, ich habe ein kleines Problem mit sed und zwar möchte ich in einer Datei mit mehren Spalten und Zeilen das Vorkommen eines...
  5. Jasper: Sprachsteuerung für preiswerte Rechner

    Jasper: Sprachsteuerung für preiswerte Rechner: Charlie Marsh und Shubhro Saha, Studenten der Princeton-Universität, haben mit Jasper eine Open-Source-Anwendung veröffentlicht, mit deren Hilfe...