![]() |
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
![]() |
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
Was ich auch schon oft festgestellt habe, wenn man seine Frage etwas offener stellt und die KI dadurch nicht so stark einschränkt, kommen über die Antwort oft Ansätze die man sonst vielleicht nicht verfolgt hätte, bzw. auf die man vielleicht nicht gekommen wäre. Ich gehe auch oft gerne hin und werfe eine fertige Funktion in ChatGPT und frag nochmal wie er den Code unter dem Aspekt von Lesbarkeit, Performance und Aufbau findet und ob es aus seiner Sicht was zu verbessern gibt. So zu sagen Pair-Programming mit der KI. Das kann richtig laune machen und man kann sich dadurch selbst ständig verbessern. My 2 Cents. vG PJM |
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
|
AW: ChatGPT - Wow! (Cron-Job)
Ich habe ja in letzter Zeit öfter mal über KI gemeckert, besonders über Googles Bard bzw. jetzt Gemini. Aber Holladiwaldfee ... ChatGPT ist tatsächlich um Welten besser. :shock:
Da ich grade dabei bin, bei meiner Audio-Bibliothek auch Opus-Dateien zu unterstützen, habe ich für ein (bereits implementiertes) Teilproblem mal diese KIs befragt. Mein Input: Kannst du mir eine Funktion in der Programmiersprache Delphi schreiben, die aus einer gegebenen Ogg-Datei die maximale absolute granule position ermittelt? Gemini hat (mal wieder) irgendwelche nicht-existenten Klassen herbei-fantasiert und somit nutzlosen Code produziert.
Delphi-Quellcode:
ChatGPT liefert hingegen eine Struktur für den Ogg-Seitenheader, ermittelt nach einer Gültigkeits-Überprüfung daraus den gesuchten Wert. Dann wird korrekt die Größe der Seite berechnet, um sich seitenweise durch die Datei zu hangeln, um dann schließlich auf der letzten Seite den gesuchten Wert zu ermitteln.
unit OggGranulePosition;
interface uses Windows, Messages, StdCtrls, ExtCtrls, OggVorbis; implementation function GetMaxGranulePosition(oggFileName: string): LongWord; var oggFile: TOggVorbisFile; oggStream: TOggVorbisStream; granulePosition: LongWord; granuleCount: LongWord; i: LongWord; begin oggFile := TOggVorbisFile.Create; try oggFile.Open(oggFileName, ofRead); oggStream := TOggVorbisStream.Create(oggFile); try granulePosition := 0; granuleCount := oggStream.Info.Packets; for i := 0 to granuleCount - 1 do begin granulePosition := Max(granulePosition, oggStream.Packets[i].Granulepos); end; finally oggStream.Free; end; finally oggFile.Free; end; Result := granulePosition; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Maximal absolute granule position: ' + IntToStr(GetMaxGranulePosition('C:\path\to\oggFile.ogg'))); end; end.
Delphi-Quellcode:
Meine bisherigen Methode, vom Ende der Datei aus den letzten Ogg-Header zu suchen, ist zwar schneller, wenn die Seitengröße klein ist. Aber wenn die fehlschlägt (warum auch immer) ist das, was ChatGPT vorschlägt, die korrekte und sichere Variante.
program MaxGranulePosition;
uses Classes, SysUtils; type TOggPageHeader = packed record CapturePattern: array[0..3] of AnsiChar; Version: Byte; HeaderType: Byte; GranulePosition: Int64; BitstreamSerialNumber: Cardinal; PageSequenceNumber: Cardinal; Checksum: Cardinal; PageSegments: Byte; end; function ReadOggPageHeader(Stream: TStream; out Header: TOggPageHeader): Boolean; begin Result := Stream.Read(Header, SizeOf(TOggPageHeader)) = SizeOf(TOggPageHeader); end; function GetMaxGranulePosition(const FileName: string): Int64; var FileStream: TFileStream; OggPageHeader: TOggPageHeader; MaxGranulePosition: Int64; PageSegments: array of Byte; SegmentSize: Integer; I: Integer; begin MaxGranulePosition := 0; FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try while FileStream.Position < FileStream.Size do begin if not ReadOggPageHeader(FileStream, OggPageHeader) then Break; if (OggPageHeader.CapturePattern <> 'OggS') then Break; // Invalid Ogg page if OggPageHeader.GranulePosition > MaxGranulePosition then MaxGranulePosition := OggPageHeader.GranulePosition; SetLength(PageSegments, OggPageHeader.PageSegments); FileStream.Read(PageSegments[0], OggPageHeader.PageSegments); SegmentSize := 0; for I := 0 to OggPageHeader.PageSegments - 1 do Inc(SegmentSize, PageSegments[I]); FileStream.Seek(SegmentSize, soFromCurrent); end; finally FileStream.Free; end; Result := MaxGranulePosition; end; var FileName: string; MaxGranule: Int64; begin Write('Enter the Ogg file path: '); ReadLn(FileName); try MaxGranule := GetMaxGranulePosition(FileName); WriteLn('Max Granule Position: ', MaxGranule); except on E: Exception do WriteLn('Error: ', E.Message); end; ReadLn; end. Hat mich tatsächlich beeindruckt. Vor allem, weil das ja kein "Standard-Problem" ist, was ständig diskutiert wird. |
AW: ChatGPT - Wow! (Cron-Job)
Da fragt man sich dann natürlich, woher ChatGPT diesen Code geklaut hat, denn selbst produzieren kann es ja nicht.
|
AW: ChatGPT - Wow! (Cron-Job)
Und Claude Sonnet 3.5 kommt mit Deiner Frage wohl auch nicht sehr weit.
Das war auch auch ehrlicherweise nur das Standardmodell, weil ich noch keine Subscription habe. Falls jemand vollenm Zugriff darauf hat, dann würde mich das Ergebnis auch interessieren. Bisher ist ChatGPT 4o jedenfalls der klare Gewinner, aus meiner Sicht.
Delphi-Quellcode:
Interessehalber habe ich den Prompt auch nochmal hier eingegeben, bei ChatGPT, dann kommt das raus.
function GetMaxGranulePosition(const FileName: string): Int64;
var FileStream: TFileStream; Buffer: array[0..27] of Byte; PageHeader: array[0..3] of AnsiChar; GranulePosition: Int64; MaxGranulePosition: Int64; begin MaxGranulePosition := 0; FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try while FileStream.Position < FileStream.Size do begin FileStream.ReadBuffer(PageHeader, 4); if PageHeader <> 'OggS' then raise Exception.Create('Ungültiges Ogg-Dateiformat'); FileStream.ReadBuffer(Buffer, SizeOf(Buffer)); GranulePosition := PInt64(@Buffer[6])^; if GranulePosition > MaxGranulePosition then MaxGranulePosition := GranulePosition; // Zum nächsten Ogg-Page springen FileStream.Seek(PCardinal(@Buffer[22])^ + 27, soFromCurrent); end; finally FileStream.Free; end; Result := MaxGranulePosition; end; Ähnlich, aber nicht exakt gleich. Kannst Du ja mal vergleichen, sieht jedenfalls deutlich strukturierter aus als alles andere. Hier ist eine Delphi-Funktion, die die maximale absolute Granule-Position aus einer gegebenen Ogg-Datei extrahiert:
Delphi-Quellcode:
Erklärung der Funktion:
unit OggGranuleExtractor;
interface uses Classes, SysUtils; function GetMaxGranulePosition(const FileName: string): Int64; implementation type TOggPageHeader = packed record CapturePattern: array[0..3] of AnsiChar; // "OggS" Version: Byte; HeaderType: Byte; GranulePosition: Int64; BitstreamSerialNumber: Cardinal; PageSequenceNumber: Cardinal; Checksum: Cardinal; PageSegments: Byte; end; function ReadOggPageHeader(Stream: TStream; out Header: TOggPageHeader): Boolean; begin Result := Stream.Read(Header, SizeOf(TOggPageHeader)) = SizeOf(TOggPageHeader); if Result then begin Result := Header.CapturePattern = 'OggS'; if not Result then Stream.Seek(-SizeOf(TOggPageHeader) + 1, soCurrent); // Synchronize to the next potential page start end; end; function GetMaxGranulePosition(const FileName: string): Int64; var FileStream: TFileStream; OggHeader: TOggPageHeader; MaxGranulePos: Int64; begin Result := -1; MaxGranulePos := -1; try FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try while FileStream.Position < FileStream.Size do begin if ReadOggPageHeader(FileStream, OggHeader) then begin if OggHeader.GranulePosition > MaxGranulePos then MaxGranulePos := OggHeader.GranulePosition; // Skip page segments FileStream.Seek(OggHeader.PageSegments, soCurrent); end else Break; // No more valid headers end; Result := MaxGranulePos; finally FileStream.Free; end; except on E: Exception do Writeln('Error: ', E.Message); end; end; end. TOggPageHeader: Eine Struktur, die den Header eines Ogg-Pakets repräsentiert. ReadOggPageHeader: Eine Hilfsfunktion, die einen Ogg-Page-Header aus einem Stream liest und überprüft, ob das Capture-Muster ("OggS") korrekt ist. GetMaxGranulePosition: Die Hauptfunktion, die die Ogg-Datei öffnet, durch die Pakete iteriert und die maximale Granule-Position ermittelt. Schritte zur Verwendung: Speichere den obigen Code in eine Delphi-Unit, z.B. OggGranuleExtractor.pas. Verwende die GetMaxGranulePosition-Funktion, um die maximale absolute Granule-Position einer Ogg-Datei zu ermitteln:
Delphi-Quellcode:
uses
OggGranuleExtractor, SysUtils; var MaxGranulePos: Int64; begin try MaxGranulePos := GetMaxGranulePosition('path_to_your_ogg_file.ogg'); Writeln('Maximale Granule-Position: ', MaxGranulePos); except on E: Exception do Writeln('Fehler: ', E.Message); end; end. |
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
Edit: Vielleicht interessiert sich ja jemand wie es im inneren eines LLM so aussieht, ist hier sehr schön beschrieben. Pure Matritzenrechnung, wir sind in der Matrix :-D ![]() |
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
Ich vermute, Chatgpt wird das irgendwie umgehen und die Sachen nicht 1:1 wiedergeben. Müßte man mal bei seinen eigenen Sachen probieren... |
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
|
AW: ChatGPT - Wow! (Cron-Job)
Zitat:
Wenn "geklaut" dann vermutlich von einer anderen Sprache, und dann nach Delphi übersetzt. Aber alleine das ist dann auch schon beeindruckend, finde ich. Zitat:
Delphi-Quellcode:
Tatsächlich muss man nämlich "PageSegments" viele Bytes lesen, und aus diesen Werten die Größe der OggPage zu berechnen, die man anschließend per Seek überspringt. Das ist der Teil
// Skip page segments
FileStream.Seek(OggHeader.PageSegments, soCurrent);
Delphi-Quellcode:
aus meinem Ergebnis.
SetLength(PageSegments, OggPageHeader.PageSegments);
FileStream.Read(PageSegments[0], OggPageHeader.PageSegments); SegmentSize := 0; for I := 0 to OggPageHeader.PageSegments - 1 do Inc(SegmentSize, PageSegments[I]); FileStream.Seek(SegmentSize, soFromCurrent); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz