AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe beim Übersetzten von C in Delphi

Ein Thema von simjoh · begonnen am 23. Mär 2007 · letzter Beitrag vom 1. Apr 2007
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
simjoh

Registriert seit: 13. Nov 2006
Ort: Asslar
99 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 13:44
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?
  Mit Zitat antworten Zitat
simjoh

Registriert seit: 13. Nov 2006
Ort: Asslar
99 Beiträge
 
Delphi 7 Enterprise
 
#22

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 13:45
Ach so, wenig später kommt:

OutFile.open(NewName,ios::app|ios::binary);
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#23

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 13:52
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.
  Mit Zitat antworten Zitat
simjoh

Registriert seit: 13. Nov 2006
Ort: Asslar
99 Beiträge
 
Delphi 7 Enterprise
 
#24

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 13:59
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#25

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 14:28
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;
  Mit Zitat antworten Zitat
simjoh

Registriert seit: 13. Nov 2006
Ort: Asslar
99 Beiträge
 
Delphi 7 Enterprise
 
#26

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 15:16
Hallo Robert,

vielen Dank.

Was mach ich denn mit
OutFile << "Game #" << HandNumber << " starts." << endl << endl; Da wird doch nur ein String in das File geschrieben, oder?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#27

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 23. Mär 2007, 17:28
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.
  Mit Zitat antworten Zitat
simjoh

Registriert seit: 13. Nov 2006
Ort: Asslar
99 Beiträge
 
Delphi 7 Enterprise
 
#28

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 24. Mär 2007, 06:40
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#29

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 24. Mär 2007, 07:24
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.
  Mit Zitat antworten Zitat
simjoh

Registriert seit: 13. Nov 2006
Ort: Asslar
99 Beiträge
 
Delphi 7 Enterprise
 
#30

Re: Hilfe beim Übersetzten von C in Delphi

  Alt 24. Mär 2007, 16:03
Hallo Robert,

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

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr.
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