![]() |
Hilfe beim Übersetzten von C in Delphi
Hallo,
kann bitte jemand helfen: Code in C:
Delphi-Quellcode:
Meine vermutete Übersetzung:
unsigned int GetIndexToNextCharAfterSubString(const char* Buffer, const char* SubString, const unsigned int MaxLen)
{ for (unsigned int I=0;I<(MaxLen-(unsigned int)(strlen(SubString)-1));I++) { if (strlen(&Buffer[I])>=strlen(SubString) && Buffer[I]==SubString[0] && strncmp(&Buffer[I],SubString,strlen(SubString))==0) { return I+strlen(SubString); } } Hier steht weiterer Code }
Delphi-Quellcode:
Die Fehlermeldung beim Compilieren in Delphi:
function GetIndexToNextCharAfterSubString(Buffer: PChar;
SubString: PChar; MaxLen: integer): integer; var i: integer; begin for I:=0 to (MaxLen-length(SubString)-1) do begin if ((length(@Buffer[I])>=length(SubString) and (Buffer[I]=SubString[0]) and (StrLComp(@Buffer[I],SubString,length(SubString))=0)) then begin result:= I+length(SubString); end; end; Hier steht weiterer Code end; if ((length(@Buffer[I])>=... : Inkompatible Typen, 'String' und 'Pointer'. Wer weiß Rat?? Danke. |
Re: Hilfe beim Übersetzten von C in Delphi
Ist nur ne Vermutung aber las das @ vor Buffer weg.
2 Zeilen drüber hast du es ja auch nicht. |
Re: Hilfe beim Übersetzten von C in Delphi
Und den Typ unsigned int würde ich mit UINT nach delphi übersetzen.
|
DP-Maintenance
Dieses Thema wurde von "r_kerber" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Es geht ja hier eindeutig um eine Frage zur Delphi-Programmiersprache. |
Re: Hilfe beim Übersetzten von C in Delphi
Mit Length kommst du hier nicht weit. StrLen ist angesagt, da es sich um C strings handelt.
Delphi-Quellcode:
Der Code ist sowohl in C als auch in Delphi unsicher, da er erstens weder Buffer noch SubString auf NULL/nil testet und nicht beruecksichtigt das SubLen >= MaxLen sein koennte und damit die Schleife Amok laeuft.
function GetIndexToNextCharAfterSubString(Buffer: PChar; SubString: PChar; MaxLen: UINT): UINT;
var I: UINT; SubLen, BufLen: UINT; begin SubLen := StrLen(SubString); BufLen := StrLen(Buffer); for I := 0 to MaxLen - SubLen - 1 do begin // Vortest, falls in Buffer ein C string steht, der kuerzer als MaxLen ist // der originale Vortest ist idiotisch, da er dauernd strlen aufruft if (BufLen - I >= SubLen) and // Vortest, um weniger strncmp aufzurufen (Buffer[I] = SubString[0]) and (StrLComp(@Buffer[I], SubString, SubLen) = 0) then begin Result := I + SubLen; Exit; end; end; // Hier steht weiterer Code end; |
Re: Hilfe beim Übersetzten von C in Delphi
@Robert Marquardt:
Vertragsprogrammierung löst das Problem. |
Re: Hilfe beim Übersetzten von C in Delphi
Es faellt mir gerade auf das der Vortest "if BufLen - I >= SubLen and" in der Schleife auch Unsinn ist. Da ist es doch effizienter die Schleife nur bis Min(BufLen, MaxLen) -SubLen - 1 laufen zu lassen.
Ich glaube es ist besser nur herauszubekommen was die Funktion macht und sie neu zu implementieren. |
Re: Hilfe beim Übersetzten von C in Delphi
Zitat:
Delphi-Quellcode:
oder alternativ mit Indizes:
p := Pos(SubString, Buffer);
if p > 0 then Result := @Buffer[p + Length(SubString)];
Delphi-Quellcode:
p := Pos(SubString, Buffer);
if p > 0 then Result := p + Length(SubString); |
Re: Hilfe beim Übersetzten von C in Delphi
Hallo,
vielen Dank für die zahlreichen Rückmeldungen, die Fehlermeldung "inkompatible Typen" bei
Delphi-Quellcode:
ist aber immer noch da. Was kann man da tun?
StrLComp(@Buffer[I], SubString, SubLen) = 0)
Danke. |
Re: Hilfe beim Übersetzten von C in Delphi
Na, vielleicht verstehe ich es auch nicht,
aber Buffer[I] leifert doch nur einen Character zurück. Im Funktionskopf hast Du Buffer als PChar deklatiert also als eine Zeichenkette die Nullterminierend ist. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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 by Thomas Breitkreuz