Zum Inhalt springen

Klotzkopp

Mitglieder
  • Gesamte Inhalte

    9912
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    3

Alle Inhalte von Klotzkopp

  1. Nein. Du hast immer noch nicht das Problem ordentlich beschrieben. Es ist schön, dass du fürs nächste Mal Besserung gelobt hast, aber wenn du mit diesem Problem Hilfe suchst, solltest du auch hier die Problembeschreibung verbessern. Was genau hast du vor, und was genau passiert?
  2. Zugriff über einen Nullzeiger erzeugt genauso undefiniertes Verhalten wie Zugriff über einen Zeiger, der an delete übergeben wurde. Es trifft allerdings zu, dass ein Nullzeigerzugriff in der Realität meist verlässlich einen Laufzeitfehler auslöst (Access Violation / Segmentation Fault). Sauberer ist es, auf dynamische Speicheranforderung ganz zu verzichten bzw. diese ordentlich zu kapseln - Stichwort RAII. Wenn man passende Container und Smartpointer verwendet, kann man auf new weitestgehend und auf delete komplett verzichten.
  3. Der Code erzeugt undefiniertes Verhalten. Undefiniert heißt, dass alles passieren kann. Der Compilerhersteller braucht sich nicht darum zu kümmern, dass solcher Code ein definiertes Verhalten zeigt - und ein garantierter Laufzeitfehler wäre ein definiertes Verhalten. Das ist einer der Gründe, warum C und C++ so performant sind: Es gibt fast keine automatischen Sicherheitsmechanismen, die (möglicherweise unnötig) Performance kosten könnten. Statt dessen ist es Aufgabe des Programmiers, sich um so etwas zu kümmern.
  4. Warum? Hauptsache ist doch, dass jede Permutation drankommt. Bau deine Prüfung an Stelle der Ausgabe in Main ein.
  5. Du brauchst gar keine Rekursion, die Funktion oben ist alles, was du brauchst. Das funktioniert übrigens mit jedem Array, egal ob Zahlen oder Buchstaben, egal wie lang. Ich mach einfach mal ein ganzes Programm draus: class Program { private static void swap(char[] a, int iPos1, int iPos2) { char c = a[iPos1]; a[iPos1] = a[iPos2]; a[iPos2] = c; } static Boolean get_next(char[] a) { int i = a.Length - 1; while (a[i - 1] >= a[i]) { i = i - 1; if (i == 0) return false; } int j = a.Length; while (a[j - 1] <= a[i - 1]) j = j - 1; // swap values at positions (i-1) and (j-1) swap(a, i - 1, j - 1); i++; j = a.Length; while (i < j) { swap(a, i - 1, j - 1); i++; j--; } return true; } static void Main(string[] args) { char[] a = "123456789".ToCharArray(); do { System.Console.Out.WriteLine(a); } while (get_next(a)); } }[/code]
  6. Du musst doch einfach nur das Beispiel, auf das ich verlinkt habe, nach C# übersetzen, und dort, wo in dem Beispiel swap steht, deine Funktion aufrufen. Zusätzlich wäre es noch gut, wenn die Funktion erkennt, wann das Ende erreicht ist: static Boolean get_next(char[] a) { int i = a.Length - 1; while (a[i - 1] >= a[i]) { i = i - 1; if (i == 0) return false; } int j = a.Length; while (a[j - 1] <= a[i - 1]) j = j - 1; // swap values at positions (i-1) and (j-1) swap(a, i - 1, j - 1); i++; j = a.Length; while (i < j) { swap(a, i - 1, j - 1); i++; j--; } return true; }[/code] Diese Funktion rufst du solange auf, bis sie false zurückgibt. Es sind übrigens 9! = 362880 Permutationen.
  7. Du suchst alle Permutationen in lexikographischer Ordnung. Algorithmus Nr. 2 auf dieser Seite könnte für dich interessant sein.
  8. Was soll result(line) sein? Was hat das ganze mit Dateien zu tun? "Das funzt nicht" ist keine ausreichende Fehlerbeschreibung. a[0] ist ein char, also ein einzelnes Zeichen. Wenn du Strings speichern willst, brauchst du ein Array von char-Zeigern. Könntest du das bitte lassen? Oder alternativ klären, was du hier für Prügel hältst? Dass dir jemand etwas sagt, was du nicht hören willst, sind keine "Prügel".
  9. Genau das war ja seine Frage. Und dass es nicht geht, haben wir schon geklärt. Die Idee wäre nicht schlecht, scheitert aber an zwei Dingen: Erstens findet das "Umwandeln" der Enum-Konstanten in Integer zur Compilezeit statt. Dadurch ist es nicht mehr möglich, den Enum später zu erweitern. Zweitens ist es eben nicht möglich, zur Laufzeit irgendeinen anderen Wert (wie den Inhalt eines Strings) in einen Enumwert umzuwandeln.
  10. Kurze und knappe Antwort: Nein. Wozu brauchst du das denn? Vielleicht lässt sich das ja auch anders lösen.
  11. Bei den Zitaten von bytes.com solltest du darauf hinweisen, dass es da um C++ geht. Darin stimme ich zu: In C++ sollte man strtok wirklich nicht benutzen. In C sehe ich das weniger kritisch. Man muss bei der Verwendung von strtok wissen, was man tut, aber das muss man in C sowieso allgemeiner als bei C++. Richtig. Was anderes haben wir in C auch nicht Richtig. Muss man halt wissen. Das folgert direkt aus dem vorigen Punkt. Ist hier nicht relevant. Genauer gesagt, die Funktion ist weder reentrant noch threadsafe. Beides ist hier nicht von Bedeutung. Trotzdem muss man das natürlich wissen. strncpy ist übrigens auch nicht ohne. Diese Funktion setzt nämlich manchmal eine Nullterminierung, und manchmal nicht.
  12. Es wäre schon gut zu wissen, für welche Programmiersprache du das suchst.
  13. Du hast doch strtok schon benutzt. Beim ersten Aufruf übergibst du line, für die nachfolgenden Aufrufe NULL als ersten Parameter.
  14. Dieser Code hat ähnliche Fehler wie deiner. Du darfst an anfang nichts mit strcat anhängen. Und strlen( zeichen ) kann nie 8 sein, ohne dass das Programm vorher über die Grenzen des Arrays zeichen hinausgeschrieben hat, denn in zeichen passen nur 5 Zeichen. Jetzt habe ich es verstanden. Dieser an sich gute Ansatz scheitert bei dir daran, dass du die Bedeutung der einzelnen Variablen falsch in dein Programm übertragen hast. Was wiederum daran liegt, dass du den Code nicht verstanden hast. Womit wir wieder beim Grundproblem wären. Es würde dir aber guttun, wenn du dir mal eine Arbeitsweise angewöhnen würdest, die die Fehlersuche erleichtert. Warte doch nicht ab, bis du wegen eines fehlgeschlagenen fopen wieder Stunden und Tage mit der Fehlersuche vergeudest. Ich würde den fraglichen String Zeichen für Zeichen in die Ausgabedatei schreiben, und wenn der Punkt kommt, diesen einfach überspringen. Du musst nicht den ganzen String auf einmal in die Datei schreiben, daher brauchst du den auch nicht mühsam zusammenzusetzen. Was soll denn bitte "wenigstens" heißen? Ich versuche hier nun schon seit einiger Zeit, dir klarzumachen, dass deine Vorgehensweise nicht zielführend ist. Leider nimmst du dir davon nichts an, sondern machst genau so weiter. Du bastelst anscheinend irgendwelche Codefetzen zusammen, ohne genau zu verstehen, was diese tun. Das funktioniert nicht, zumindest nicht, sobald die Programme nicht mehr trivial sind. Ich kann auch nicht zufällig irgendwelche Ziegelsteine auf einen Haufen werfen, und dann hoffen, dass daraus ein Haus wird, wenn ich das nur lange genug mache. Es gibt für all diese Sachen relativ einfache Ersetzungen in C, wenn man sich ein wenig mit Arrays auskennt, und wie Strings in C dargestellt werden. Das Problem ist, dass damit meistens die Notwendigkeit verbunden ist, dynamischen Speicher zu benutzen. Das alles brauchst du hier aber gar nicht. Ich gebe dir mal ein Beispiel für den Inhalt der fgets-Schleife: Ersten Teilstring ermitteln und schreiben. ";76" schreiben Ersten Teilstring nochmal zeichenweise schreiben, dabei '.' überspringen. Wenn der Teilstring die Länge 7 hat, "00" schreiben. Die restlichen Teilstrings ermitteln und schreiben. Etwas in dieser Art aufzustellen, wäre deine Aufgabe gewesen, und zwar bevor du auch nur eine einzige Zeile Code hättest schreiben sollen. Gerade als "blutiger Anfänger" solltest du das Erarbeiten des Algorithmus und das Ausprogrammieren nicht mischen, weil du in beidem noch nicht sattelfest bist. Formuliere zuerst den Algorithmus, und übertrage ihn dann in eine Programmiersprache. Mit der Zeit wirst du genügend Erfahrung sammeln, um Algorithmen so zu formulieren, dass sie in der jeweiligen Sprache leicht umzusetzen sind. Ich habe dir jetzt den ersten und wichtigsten Teil der Arbeit abgenommen. Setz das jetzt bitte mal in C um, genau so, wie es da steht. Dafür brauchst du weder str(n)cpy noch strcat.
  15. Ich wollte eigentlich wissen, wie der Code das beschriebene Ziel erreichen soll. Ich habe aber so langsam den Eindruck, dass du das selbst nicht weißt, sondern ziellos herumfrickelst. Korrigiere mich, wenn ich mich da irre. Das ist übrigens kein "Herumprügeln", sondern eine sachliche Einschätzung deiner Vorgehensweise. Hier mal ein paar allgemeine Kommentare: FILE *datei = fopen("Datei1csv", "r"); FILE *datei_neu = fopen("Datei2.csv", "w+");[/CODE] Hier fehlt die Fehlerbehandlung. [CODE]while (fgets(line, sizeof line, datei)) Sicher, dass du nie mehr als 23 Zeichen lesen musst? Mehr passt nämlich in line nicht rein. if (strlen(zeichen)==5) Warum 5? strcat(anfang,zeichen); Du darfst an anfang nichts anhängen. Das Array ist so groß, wie du es initialisiert hast, und damit voll. result = strtok(line, delims); Nachfolgende strtok-Aufruf musst du mit NULL als erstem Parameter machen, wenn du den String weiter zerlegen willst. else if (strlen(zeichen)==10) Auch hier: Warum 10? substring= strstr (zeichen,"."); result = strncpy(substring,"01",5);[/code] Auch hier: Warum 5? Klar, mehr passt nicht rein. Die Strings, die du einfügen willst, sind aber anscheinend länger. [code] result = strcat(anfang,zeichen); Siehe oben. result = strtok(line, delims); Siehe oben.
  16. Und warum? Debugger geben in ihren Meldungen selten Hinweis auf irgendwelche "Ohren". Welche Werte haben substring und result an dieser Stelle? Nur als Hinweis: Du würdest vermutlich mehr und bessere Hilfe bekommen, wenn du erklären würdest, was der Code eigentlich im Detail tun soll. Das ist nämlich aus deinem etwas verworrenen Code nicht so einfach zu erkennen. Und wenn man nicht erkennen kann, was der Code tun soll, kann man auch keine Logikfehler finden. Aber um einen solchen handelt es sich offenbar.
  17. Du irrst dich. Und laut Lizenzvertrag darfst du die Debug-Versionen der Laufzeitumgebung gar nicht weitergeben. Du brauchst das hier: Download details: Visual C++ 2005 Redistributable Package (x86)
  18. Irgendwas passt da nicht zusammen. VB6 ist nicht .NET. Ich richte mich mal nach der letzten Information: Verschoben -> Basic.
  19. Öffnest du etwa dasselbe fstream-Objekt mehrfach? Das ist keine gute Idee. Soweit man das aus dem kurzen Codeabschnitt erkennen kann, sieht dein Code ziemlich unstrukturiert aus. Du solltest etwas weniger Wert auf schick formatierte Ausgaben, und dafür mehr auf eine bessere Strukturierung des Codes legen. Die Gotos müssen raus, dafür muss eine ordentliche Fehlerbehandlung rein. Du siehst ja, dass deine Ausgabe "Schreiben der Daten erfolgreich" gar nicht stimmt. In einem riesigen, unstrukturierten Codehaufen ist es nunmal sehr schwierig, einen Fehler zu finden.
  20. Close macht automatisch ein flush, das sollte keinen Unterschied machen. Welchen Typ hat change_yn? Wurde die Datei überhaupt erfolgreich geöffnet?
  21. Richtig. Nein, das sieht gut aus. Die Vorgehensweise ist eigentlich ganz einfach. Man benutzt die Preorder-Reihenfolge, um den Wurzelknoten zu ermitteln (im ersten Schritt C), denn der steht bei Preorder immer am Anfang. Dann ermittelt man mit der Inorder-Reihenfolge die Teilbäume (denn da steht die Wurzel dazwischen). Also haben wir im ersten Schritt AD im linken und GBHEFI im rechten Teilbaum. Damit verfährt man jetzt genauso weiter wie im ersten Schritt.
  22. Wenn du eine cvs-Datei hast, dann sind die einzelnen Felder doch mit Semikolon abgetrennt, oder? Dann kannst du so vorgehen, wie LadyPreis es vorgeschlagen hat.
  23. Nein, kann nicht funktionieren. Du brauchst ein Zeichen, das im Text selbst nicht vorkommen kann oder durch eine Escapesequenz geschützt wird, wenn es dennn vorkommt. In deinem Beispiel tritt das Trennzeichen (das Leerzeichen) auch in den Texten auf. Woher willst du wissen, ob das text1 text2 text 3 text 4 oder text1 text2 (leer) text 3 text 4 (leer) oder (leer) (leer) text1 text2 text 3 text 4 oder irgendeine andere mögliche Kombination ist?
  24. Falls in den Texten selbst keine Apostrophen vorkommen dürfen: Such den siebten Apostroph, und prüfe, ob das Zeichen danach wieder ein Apostroph ist.
  25. Eine MP3-Datei besteht normalerweise aus mehreren Frames, und jeder Frame kann eine eigene Bitrate haben. Es gibt also nicht zwangsläufig eine eindeutige Bitrate für die gesamte Datei. Die Bitrate eines Frames steht im Frameheader. Eine Formatbeschreibung findest du beispielsweise hier: MP3 File Format Specification Mit CStdioFile wohl eher nicht, diese Klasse ist für Textdateien. Das kann zu seltsamem Verhalten führen, wenn im Datenstrom das Zeichen für Zeilenumbruch auftaucht. Nimm CFile.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...