Werte unterschiedlichen Types aufnehmen.

I

ixs

Foren As
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.
 
Morgen,

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

mfg
HeadCrash
 
Abschließens möchte ich mit den Werte einfache Statistische Berechnungen ausführen, wie zum Beispiel ihren Durschnitt berechnen.
 
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
 
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.
 
Zuletzt bearbeitet:
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.

Es gibt auch noch einen dynamischen 2 dim. void*. Doch kann er nur Adressen aufnehmen, die beim Verlassen der Funktion wieder ungültig werden.

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.
 
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.
 
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++?
 
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.
 
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.
 
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.
 
Zuletzt bearbeitet:
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.
 
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.
 
Zuletzt bearbeitet:
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, ...
 
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, ...

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
 
Zurück
Oben