Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Hilfe beim Übersetzten von C in Delphi (https://www.delphipraxis.net/88928-hilfe-beim-uebersetzten-von-c-delphi.html)

simjoh 23. Mär 2007 05:26


Hilfe beim Übersetzten von C in Delphi
 
Hallo,

kann bitte jemand helfen:

Code in C:
Delphi-Quellcode:
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

}
Meine vermutete Übersetzung:

Delphi-Quellcode:
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;
Die Fehlermeldung beim Compilieren in Delphi:

if ((length(@Buffer[I])>=... : Inkompatible Typen, 'String' und 'Pointer'.

Wer weiß Rat??
Danke.

Corpsman 23. Mär 2007 06:03

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.

r_kerber 23. Mär 2007 06:11

Re: Hilfe beim Übersetzten von C in Delphi
 
Und den Typ unsigned int würde ich mit UINT nach delphi übersetzen.

DP-Maintenance 23. Mär 2007 06:13

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.

Robert Marquardt 23. Mär 2007 07:18

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:
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;
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.

QuickAndDirty 23. Mär 2007 07:28

Re: Hilfe beim Übersetzten von C in Delphi
 
@Robert Marquardt:
Vertragsprogrammierung löst das Problem.

Robert Marquardt 23. Mär 2007 08:59

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.

Flocke 23. Mär 2007 11:14

Re: Hilfe beim Übersetzten von C in Delphi
 
Zitat:

Zitat von Robert Marquardt
Ich glaube es ist besser nur herauszubekommen was die Funktion macht und sie neu zu implementieren.

Liefert einen Zeiger auf das erste Zeichen hinter der Fundstelle von SubString:
Delphi-Quellcode:
p := Pos(SubString, Buffer);
if p > 0 then
  Result := @Buffer[p + Length(SubString)];
oder alternativ mit Indizes:
Delphi-Quellcode:
p := Pos(SubString, Buffer);
if p > 0 then
  Result := p + Length(SubString);

simjoh 23. Mär 2007 11:59

Re: Hilfe beim Übersetzten von C in Delphi
 
Hallo,

vielen Dank für die zahlreichen Rückmeldungen, die Fehlermeldung "inkompatible Typen" bei
Delphi-Quellcode:
StrLComp(@Buffer[I], SubString, SubLen) = 0)
ist aber immer noch da. Was kann man da tun?

Danke.

Klaus01 23. Mär 2007 12:09

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 08:56 Uhr.
Seite 1 von 6  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz