Delphi-PRAXiS
Seite 1 von 2  1 2      

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

simjoh 23. Mär 2007 12:14

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

also einfach @ weglassen??

simjoh 23. Mär 2007 12:16

Re: Hilfe beim Übersetzten von C in Delphi
 
Nee, geht auch nicht, dann meldet der Compiler

Inkompatible Typen Char und PAnsiChar

Was tun?

Robert Marquardt 23. Mär 2007 12:49

Re: Hilfe beim Übersetzten von C in Delphi
 
Wie ist denn die genaue Fehlermeldung? Ich habe oben in der Source die fehlenden Klammern ergaenzt (zu viel C in letzter Zeit).

simjoh 23. Mär 2007 13:27

Re: Hilfe beim Übersetzten von C in Delphi
 
Die Fehlermeldung taucht bei

StrLComp(@Buffer[I], SubString, SubLen) = 0)

auf, und ist (mit dem @): "Inkompatible Typen". Der Cursor bleibt hinter dem Komma stehen.

Ohne das @ ist die Fehlermeldung: "Inkompatible Typen Char und AnsiChar".

Gruß

simjoh 23. Mär 2007 13:29

Re: Hilfe beim Übersetzten von C in Delphi
 
Ach so, die Klammern habe ich natürlich schon gesetzt, daran liegts nicht.

simjoh 23. Mär 2007 13:34

Re: Hilfe beim Übersetzten von C in Delphi
 
By the way, wie könnte man den C-Code

sprintf_s(NewName,"%s.%s",TableName,GL_Extention);

übersetzen?

Enspricht sprintf_s in Delphi writeln?

mkinzler 23. Mär 2007 13:35

Re: Hilfe beim Übersetzten von C in Delphi
 
Delphi-Quellcode:
StrLComp(PAnsiChar(Buffer), SubString, SubLen) = 0)

Robert Marquardt 23. Mär 2007 13:36

Re: Hilfe beim Übersetzten von C in Delphi
 
Hast Du typed Pointers an in den Projektoptionen? "StrLComp(PChar(@Buffer[I]), SubString, SubLen) = 0)" duerfte helfen.
@Buffer[I] ist vom Typ Pointer waehrend StrLComp dort einen PChar erwartet. Alternativ versuche "StrLComp(Buffer + I, SubString, SubLen) = 0)", denn fuer PChar und Integer ist die Addition definiert und das Ergebnis vom Typ PChar.

@mkinzler, das geht daneben, denn der Offset I wurde vergessen.

simjoh 23. Mär 2007 13:40

Re: Hilfe beim Übersetzten von C in Delphi
 
Jaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, super!! Es funzt. Herzlichen Dank!!

Wenn ich mal wieder ein Problem hat mit C, ich frag dann halt nochmal nach in der Hoffnung, dass du (ihr) weiterhelfen wollt und könnt.

Wie ist das mit sprintf_s? Haste da nochma en Tipp?

Robert Marquardt 23. Mär 2007 13:40

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

Zitat von simjoh
By the way, wie könnte man den C-Code

sprintf_s(NewName,"%s.%s",TableName,GL_Extention);

übersetzen?

Enspricht sprintf_s in Delphi writeln?

An sich neues Problem, neue Frage.

sprintf_s:
s = in einen String ausgeben
print = Zeichen ausgeben
f = formatted
_s = (eine MS-Erfindung) safe also sicher gegen Pufferueberlaeufe

Delphi-Quellcode:
NewName := Format('%s.%s', [TableName, GL_Extention]);
ist die Entsprechung.

simjoh 23. Mär 2007 13:44

Re: Hilfe beim Übersetzten von C in Delphi
 
Suuuper, geht auch. Nochma danke.
Haste auch ne Entsprechung für:

ofstream OutFile;

Danke, ich weiß, ich nerve. Vielleicht sollte ich dir mal das gesamte Programm zusenden?

simjoh 23. Mär 2007 13:45

Re: Hilfe beim Übersetzten von C in Delphi
 
Ach so, wenig später kommt:

OutFile.open(NewName,ios::app|ios::binary);

Robert Marquardt 23. Mär 2007 13:52

Re: Hilfe beim Übersetzten von C in Delphi
 
Das ist jetzt C++. Die Entsprechung waere wohl ein TFileStream. ios::app ist eine Zahlen-Konstante aus dem Namespace ios genau wie ios::binary. | macht ein bitweises oder der beiden Werte, daher ist es klar das es Zahlen sind. Was die Konstanten jetzt genau bedeuten weiss ich nicht, aber es ist klar das nun in ein File geschrieben wird.

simjoh 23. Mär 2007 13:59

Re: Hilfe beim Übersetzten von C in Delphi
 
Die gesamte Funktion sieht so aus:

Delphi-Quellcode:
   bool WriteHandHistoryLog(const char* TableName,const char* HandNumber,
      const char* Buffer,const unsigned int BufferLen)
   {   // This function writes the Buffer out to the given logfile.
      // It writes in binary mode exactly BufferLen bytes.
      // NOTE: If HandNumber is NULL, then we wont print the hand start prefix.
      // Returns true on success, else false.

      // Used to make the full filename.
      char NewName[MAX_STRING];

      // Output filestream.
      ofstream OutFile;

      // Make the new name.
      sprintf_s(NewName,"%s.%s",TableName,GL_Extention);

      // Attempt to open the logfile.
      OutFile.open(NewName,ios::app|ios::binary);
      if (OutFile.fail())
         return false;                  // Failed to open the file.

      // First we need to write the prefix string for new hand.
      if (HandNumber!=NULL)
         OutFile << "Game #" << HandNumber << " starts." << endl << endl;

      // v0.06: If we have been asked to add the 6-max tag, then do so here.
      //        ### NOT really a good place to do this... ###
      if (GL_Add6MaxTag==true) {
         int RMIndex=GetIndexToNextSubString(Buffer," (Real Money)",BufferLen);
         if (RMIndex>=0) {
            OutFile.write(Buffer,RMIndex);
            OutFile.write(" (6 max)",strlen(" (6 max)"));   // Add the 6-max tag.
            OutFile.write(Buffer+RMIndex,BufferLen-RMIndex);
         }
         else {
            OutFile.write(Buffer,BufferLen);   // If can't find, just write as normal.
         }
      }
      else {

         // Write the rest of the buffer.
         OutFile.write(Buffer,BufferLen);
      }

      // Close the file.
      OutFile.close();

      // If we got here, then all ok.
      return true;

   } // End WriteHandHistoryLog.
Scheiße, dass ich so gar keine Ahnung von C hab.

Robert Marquardt 23. Mär 2007 14:28

Re: Hilfe beim Übersetzten von C in Delphi
 
Ah, jetzt ist klar. app heisst append.
Delphi-Quellcode:
var
  OutStream: TFileStream;
  NewName: string;
begin
  NewName := TableName + '.' + GL_Extention;

  // das ist das Aequivalent des append mode
  if FileExists(NewName) then
    OutStream := TFileStream.Create(NewName, fmOpenReadWrite, fmShareDenyWrite)
  else
    OutStream := TFileStream.Create(NewName, fmCreate, fmShareDenyWrite);
  OutStream.Seek(0, soFromEnd);

  // jetzt mal das Zeugs mit GL_Add6MaxTag weggelassen das eh nur einen extra Header schreibt
  OutStream.Write(Bufer[0], BufLen);
  OutStream.Free;
end;

simjoh 23. Mär 2007 15:16

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

vielen Dank.

Was mach ich denn mit
Delphi-Quellcode:
OutFile << "Game #" << HandNumber << " starts." << endl << endl;
Da wird doch nur ein String in das File geschrieben, oder?

Robert Marquardt 23. Mär 2007 17:28

Re: Hilfe beim Übersetzten von C in Delphi
 
Genau. Der <<-Operator ist fuer die Klasse ueberschrieben und ist nicht anderes als ein Write. Genaugenommen sind es mehrere unterschiedliche <<-Operatoren.
Es duerfte auf ein
Delphi-Quellcode:
var
  S: string;
begin
  S := Format('Game #%d starts.'#13#10#13#10, [HandNumber]);
  OutFile.Write(S[1], Length(S));
hinauslaufen. Sollte HandNumber ein unsigned-Typ sein, so duerfte %u statt %d korrekt sein.
Der erste << Operator ist fuer OutFile und String und liefert einen String mit dem Nebeneffekt eines Write. Der zweite ist logischerweise zwischen String und Zahl und ist eine Stringkonkatenation mit einer zum String umgewandelten Zahl. Dritter, vierter und fuenfter Operator sind Stringkonkatenation. Ist ein bischen verzwickt, aber elegant.

simjoh 24. Mär 2007 06:40

Re: Hilfe beim Übersetzten von C in Delphi
 
Lieber Robert,

vielen Dank bis hierhin. Alle deine Tipps sind Volltreffer. Ich erlaube mir mal noch ein paar Fragen zu stellen.

1. Bei
Code:
if (GL_Add6MaxTag=true) then
begin
  RMIndex:=GetIndexToNextSubString(Buffer,' (Real Money)',BufferLen);
  if (RMIndex>=0) then
  begin
    OutStream.write(Buffer,RMIndex);
    OutStream.write(' (6 max)',strlen(' (6 max)'));   // Add the 6-max tag.
    OutStream.write(Buffer+RMIndex,BufferLen-RMIndex);
  end
  else
  begin
    OutStream.write(Buffer,BufferLen);   // If can't find, just write as normal.
  end;
end
else
begin // Write the rest of the buffer.
    OutStream.Write(Buffer, BufferLen);
end;
motzt der Compiler bei
Code:
OutStream.write(Buffer+RMIndex,BufferLen-RMIndex);
nach Buffer+RMIndex. Die Meldung: Variable erforderlich.

2. Wie würdest du das übersetzten:
Code:
if (MBI.RegionSize>BufferLen)
{
  if (Buffer!=NULL)
    delete [] Buffer;
  Buffer = new char[MBI.RegionSize];
  BufferLen=MBI.RegionSize;
}
3. Und das
Code:
static unsigned int MinRegionSize=~0;
Was bedeutet das =~ ?


4. Damit kann ich garnix anfangen:
Code:
for (register unsigned int I=MaxLen;I!=0;I-=GL_StringAlignment)
{
  // Look for "#Game No : " - Don't use stncmp - slow as fuck...
  // v0.04: Use the fact always alligned to just check via a 32bit comp.
  // NOTE: Will even cast to non-aligned int, but will be slower.
  if ((*((unsigned int*)(&Buffer[I]))) == ((((unsigned int)'m')<<24)
   |(((unsigned int)'a')<<16)
   |(((unsigned int)'G')<<8)
   |(((unsigned int)'#'))) // Remember: big-endian...
   && Buffer[I+4]=='e'
   && Buffer[I+5]==' '
   && Buffer[I+6]=='N'
   && Buffer[I+7]=='o'
   && Buffer[I+8]==' '
   && Buffer[I+9]==':'
   && Buffer[I+10]==' '
   && Buffer[I+11]>='0'
   && Buffer[I+11]<='9')                         
{
Wie kann man denn das übersetzten? Muss ich das mit ner while-Schleife erschlagen?


5. Was ist denn char** ?:
Code:
void ParseArgs(int argc,char** argv)
6. Und das:
Code:
char GL_Extention[4]="hhf";   
strcpy_s(GL_Extention,argv[I+1]);
in Delphi: strcopy frisst GL_Extention nicht.

7. Hier wird wohl eine Procedure deklariert:
Code:
DWORD WINAPI MainThread(void *Param)
Wie übersetz ich das denn?

Die ganze Proc:
Code:
DWORD WINAPI MainThread(void *Param)
{  // Used so we can start with different priorities (saves messing with    
      the batch file).

  static PartyHandGrabber PHG;

  // Start the main loop (never returns...).
  PHG.StartLoop();
  // ### NEVER RETURNS - BUT MIGHT BE USEFUL IF WE ONE DAY ADD A GUI ###
  //ExitThread(0);
  return 0;
}
Merkwürdig, dass Param in der Procedur nicht mehr auftaucht.

8. Und dann noch:
Code:
int main(int argc, char** argv)
{

   DWORD ThreadID;   // Unused, but must have for win9x...
   HANDLE ThreadHandle;

   // Parse the arguments.
   ParseArgs(argc,argv);

   // Display something just to let the user know that we have started.
   if (GL_Verbose==true)
      DisplayStartupInfo();

   // Start the thread.
   ThreadHandle=CreateThread(NULL,0,MainThread,0,0,&ThreadID);

   // Set the desired priority of the thread.
   if (GL_Priority==-2)
      SetThreadPriority(ThreadHandle,THREAD_PRIORITY_LOWEST);
   else if (GL_Priority==-1)
      SetThreadPriority(ThreadHandle,THREAD_PRIORITY_BELOW_NORMAL);
   else if (GL_Priority==0)
      SetThreadPriority(ThreadHandle,THREAD_PRIORITY_NORMAL);
   else if (GL_Priority==1)
      SetThreadPriority(ThreadHandle,THREAD_PRIORITY_ABOVE_NORMAL);
   else if (GL_Priority==2)
      SetThreadPriority(ThreadHandle,THREAD_PRIORITY_HIGHEST);

   // Lets just let the thread do it's work (just idle here forever).
   WaitForSingleObject(ThreadHandle,INFINITE);

   return 0;
}
Wie wird denn hier
Code:
ThreadHandle=CreateThread(NULL,0,MainThread,0,0,&ThreadID);
In Delphi übertrage?

Viiiiiiiielen Dank für deine Hilfe, wenn du denn überhaupt Lust dazu hast.

Robert Marquardt 24. Mär 2007 07:24

Re: Hilfe beim Übersetzten von C in Delphi
 
1. Aufpassen. Bei Write gibt man das erste Element des Puffers an das man schreiben will, nicht den Puffer selbst. Die Deklaration von Write ist mit "const Buffer" fuer den Parameter was heisst bei der Parameteruebergabe addiert Delphi eine Indirektion, sprich uebergibt die Adresse des Elementes.
Delphi-Quellcode:
if (GL_Add6MaxTag=true) then
begin
  RMIndex:=GetIndexToNextSubString(Buffer,' (Real Money)',BufferLen);
  if (RMIndex>=0) then
  begin
    OutStream.write(Buffer[0], RMIndex);
    OutStream.write(' (6 max)', strlen(' (6 max)'));  // Add the 6-max tag.
    OutStream.write(Buffer[RMIndex], BufferLen - RMIndex);
  end
  else
  begin
    OutStream.write(Buffer[0], BufferLen);  // If can't find, just write as normal.
  end;
end
else
begin // Write the rest of the buffer.
    OutStream.Write(Buffer[0], BufferLen);
end;
2.
Delphi-Quellcode:
if MBI.RegionSize > BufferLen then
begin
  // Realloziierung des Puffers
  if Buffer <> nil then
    FreeMem(Buffer);
  GetMem(Buffer, MBI.RegionSize);
  BufferLen := MBI.RegionSize;
  // sicherheitshalber den Puffer auf C Leerstring initialisieren
  Buffer[0] := #0;
end;
3. Bei "static unsigned int MinRegionSize=~0;" ist ~ das bitweise not. Die Zahl wird also auf alle Bits 1" gesetzt.
Delphi-Quellcode:
var
  MinRegionSize: Cardinal = not 0;
  // alternativ
  MinRegionSize: Cardinal = $FFFFFFFF;
Fuer den Rest habe ich gerade keine Zeit bei den Einzelheiten. Spaeter.

4. Letzlich nur ein Stringvergleich.
5. Hier geht es um die ParamStr, also die Parameter beim Programmaufruf.
6. var GL_Extention = 'hhf': string; GL_extention := ParamStr(I+1);
7. Das ist ein Thread. Da muss ein Delphi-Threadobjekt her.
8. Das ist das Hauptprogramm. Entspricht dem was du in einem .dpr findest. Es wird etwas angezeigt und dann nur der Thread gestartet der die Arbeit macht. Es ist uebrigens ein DOS-Box-Programm (aka Konsolenprogramm) was wir hier haben.

simjoh 24. Mär 2007 16:03

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

danke für die Tipps. Antwort 1, 2 und 6 funzen. Bei den anderen gehts mir noch eher so: :wall:

Es irritiert mich, dass du argv einfach durch ParamStr ersetzt. Der Delphi-Compiler schluckts aber. Welche Bedeutung hat denn dann argv?

Was mich noch irritiert: Die Parameter argc und argv in (siehe 6.):
Code:
int main(int argc, char** argv)
Ich weiß nicht, welche Parameter da beim Programmaufruf übergeben werden müssen. Wenn ich das richtig verstanden habe, startet ein C-Programm mit der Funktion main. Leider kann ich das C-Programm, welches ich hier verzweifelt versuche zu übersetzen, nicht debuggen, also Schritt für Schritt durchlaufen. Es werden aber eigentlich zum Beginn keine Parameter übergeben. Hm.

Vielleicht kannste mir da ja auch noch eine Hilfestellung geben.

Grüße
Markus

Robert Marquardt 24. Mär 2007 16:23

Re: Hilfe beim Übersetzten von C in Delphi
 
argc entspricht ParamCount bei Delphi und argv entspricht den strings die ParamStr liefert.
argv ist ein Array von PChars. In C ist array und Zeiger auf das erste Element weitgehend synonym.
Jedes C Programm bekommt also die in elemente zerlegte Kommandozeile mitgeliefert. argv[0] ist der Pfadname des Programms selbst und argv[1] bis argv[argc-1] sind die C Strings der Kommandozeilenparameter. argv[argc] ist immer nil. Das ist wie beim C String und #0 ein (hier zusaetzliches) Endezeichen.
Das ist die C-Art eine Stringliste zu machen.

simjoh 24. Mär 2007 16:32

Re: Hilfe beim Übersetzten von C in Delphi
 
Versteh ich leider nicht.

Robert Marquardt 24. Mär 2007 16:37

Re: Hilfe beim Übersetzten von C in Delphi
 
Unbedingt C lernen. Da lernt man was ein Pointer ist und wozu man ihn gebrauchen kann.

simjoh 24. Mär 2007 16:40

Re: Hilfe beim Übersetzten von C in Delphi
 
Ich kenn mich in Delphi so einigermaßen aus. Deshalb denke ich, dass an die Hauptfunktion zwei Argumente beim Aufruf übergeben werden müssen. Das scheint auch so zu sein, ich weiß halt nur nicht welche.

Könntest du mir bei den anderen Fragen nochmal zur Seite stehen?

Klaus01 24. Mär 2007 17:51

Re: Hilfe beim Übersetzten von C in Delphi
 
Entschuldige, dass ich mich einmische,
aber es gibt eine schöne Webseite da wird C ganz gut erklärt.
Auch argc und argv.

Grüße
Klaus

simjoh 24. Mär 2007 18:00

Re: Hilfe beim Übersetzten von C in Delphi
 
Ja, danke. Bin noch nicht so fit, glaube, ich schmeis mein Prog weg. Schade.

Danke an alle!!

Klaus01 24. Mär 2007 18:08

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

Zitat von simjoh
Ja, danke. Bin noch nicht so fit, glaube, ich schmeis mein Prog weg. Schade.

Danke an alle!!

Warum? Jetzt hat Dir der Robert schon so weit geholfen.
Ein wenig mehr in die Materie eingraben und etwas Ergeiz entwickeln dann wird das schon.

Ich bin in C auch nicht fit, aber wenn man schonmal weiß wo nachschauen und nachfragen kann ...

Grüße
Klaus

simjoh 24. Mär 2007 18:12

Re: Hilfe beim Übersetzten von C in Delphi
 
Danke für deinen Zuspruch. Hab das Programm jetzt auch komplett in Delphi übertragen, bis auf die Fragen, die Robert noch nicht beantwortet hat. Die Teile hab ich erstmal in Kommentar gesetzt. argc hab ich überall durch ParamCount ersetzt und argv durch ParamStr. Leider ist in ParamCount der Wert 0 enthalten, müsste eigentlich 1 sein. Warum, weiß ich nett.

Klaus01 24. Mär 2007 18:22

Re: Hilfe beim Übersetzten von C in Delphi
 
Nun, wenn Dein Programm ohne Parameter gestartet wird, ist ParamCount auch 0.
Und im ParamStr(0) steht Dein Programmname.

Wenn Du Dein Programm mit Parameter startest wird ParamCount auch <> 0 sein.

Schau mal in der Delphi IDE unter der Option run nach Parameters, dort
kannst Du die Parameter übergeben.

Oder Du startes Deine Exe mit einer Verknüpfung, in der Verknüpfung
kannst Du dann den Parameter fest vergeben.

Oder Du startest Dein Programm aus der Console (cmd) und gibst
ihm dan manuell einen Parameter mit.

Ergänzung:

~ -> bitweises Komplement -> http://www.pronix.de/pronix-676.html

Zitat:

Was ist denn char** ?:
C-Quellcode: markieren
void ParseArgs(int argc,char** argv)
char ** entspricht in Delphi einer StringList, also einer Aufreihung von Strings.
Bei argv kannst Du dann mit argv[0], argv[1] usw. darauf zugreifen.


Grüße
Klaus

simjoh 24. Mär 2007 18:37

Re: Hilfe beim Übersetzten von C in Delphi
 
Lieber Klaus,

wenn ich mein Prog mit Parameter starten könnte, weiß ich immer noch nicht, welche Parameter ich übergeben sollte. So, jetzt weißt du, wie weit ich weg bin von einer erfolgreichen Übertragung eines C-Programms in ein Delphi-Programm. :roll: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 1 von 2  1 2      

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