Announcement

Collapse
No announcement yet.

C++ -nach Delphi

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C++ -nach Delphi

    Hallo !

    Vielleicht kann von Euch einer weiter helfen.
    Ich habe eine Function in "C", die muss ich nach Delphi übersetzen.:-(

    Ich bekomme das nicht hin. "C" ist mir zu kompliziert.

    Hier ist der C-Source

    void FIRMWARE:pen()
    { if(!file.openFileName()) return ;

    FILE* fp=fopen(file.name(),"r") ;
    if(!fp) throw "firmware file not found" ;

    int errors=0 ; for(int i=0;i<128;i++) touched[i]=false ;

    char line[4096] ;
    for(bool run=true;run && fgets(line,4096,fp)
    { try
    { int adr=0 ;
    if(line[0]=='@')
    { if(line[5]!=':') throw ": missing" ;
    if(sscanf(line+1,"%x",&adr)!=1) throw "no address" ;
    if(adr&0x1FF) throw "low bits in address" ;
    adr/=512 ; if(adr<0 || adr>=128) throw "bad address" ;
    if(touched[adr]) throw "same page more than one time" ;
    touched[adr]=true ;

    for(int i=0;i<512;i++)
    { char z[3] ; z[0]=line[6+2*i] ; z[1]=line[7+2*i] ; z[2]=0 ;
    int val=0 ;
    if(sscanf(z,"%x",&val)!=1) throw "bad hex" ;
    data[adr][i]=val ;
    }
    }
    }
    catch(const char* err)
    { protocol.msg("Error: %s in: %s",err,line) ; errors++ ; }
    }
    fclose(fp) ;
    if(errors)
    { protocol.msg("There were %d errors encountered.",errors) ;
    throw "Bad file" ;
    }
    }

    Was ich gar nicht verstehe,
    da bin ich auch mit dem Debugger durch gegangen:

    if(sscanf(line+1,"%x",&adr)!=1) throw "no address" ;

    Da wird einfach mit "Line" um 1 addiert und dann gibt man den Paramter "%x" an und zup hat man Hex.

    Wäre sehr nett, wenn mir einer von Euch weiter helfen könnte.

    Gruss Sascha

  • #2
    hi Sascha,<br><br>
    also, erstmal aufdrisseln.<br><br>
    sscanf(line+1,"%x",&adr) formatiert ab dem 2ten zeichen bis zum naechsten blank oder dem ende von line,<br>
    zu hex und speichert es in der var adr.<br>
    besonderheit ist, wenn die 2te stelle leer (ein blank) ist,<br>
    dann werden die naechsten aufeinanderfolgenden zeichen gelesen,<br>
    bis ein weiterer blank, oder ende von line auftritt.<br>
    bei erfolg gibt sscanf() eine 1 zurueck.<br>
    also sprachlich uebersetzt, heisst es:<br><br>
    steht in line ab dem zweiten zeichen nix mehr drin, dann "no adress".<br><br>
    ich hoff mal, das ist richtig so.<br><br>
    gruss ro

    Comment


    • #3
      Hi Roy,

      danke erst mal für deine Antwort.
      Du schreibst, das der Text in Hex formatiert wird. Wie kann man das in Delphi machen ?
      Es gibt die Möglichkeiten z.B: IntToHex...u.s.w.
      Was macht man am besten, wenn eine Zeile
      4096 Zeichen hat. -> "fgets(line,4096,fp)".
      Was macht man da am besten ?
      Weiss du das ?

      Gruss Sasch

      Comment


      • #4
        hi sascha,<br><br>
        zu hex-formatierung:<br>
        naja, geht denn IntToHex() nicht?<br>
        muesstest natuerlich erst A bis F in dezimal umwandeln.<br>
        wenn zeichen > F auftreten ist die bedingung auch ungueltig.<br>
        sorry, hab ich oben garnich reingeschrieben, vergib mir.<br><br>
        zu fgets:<br>
        das fgets() duerfte man mit TFileStream und dessen methoden<br>
        funktion Read(var Buffer; Count: Longint): Longint;<br>
        oder<br>
        procedure ReadBuffer(var Buffer; Count: Longint);<br>
        nachbasteln koennen.<br><br>
        gruss ro

        Comment


        • #5
          Hi Roy,

          Danke dir.
          Ich probiere das mal aus und sage dir
          dann Bescheid.

          Gruss Sasch

          Comment


          • #6
            zu hexadezimal nochmal:<br>
            wenn ich's mir recht ueberleg...<br>
            kommt in der zeichenkette ab der zweiten stelle schon solche werte an: ab15c ?<br>
            in dem fall sollte es sich bereits um einen hex-wert handeln.<br>
            oder kommen nur dezimalwerte, oder kann auch text drinstehn?<br>
            ich hab mir das ganze konstrukt noch garnicht angesehen,<br>
            nur die teile auf die sich deine fragen bezogen.<br><br>
            gruss ro

            Comment


            • #7
              nochmal ich.<br>
              folgendes verhalten unter c:<br><br>

              fall 1:<br>
              char line[] = "@ab15: usw...";<br>
              'ab15' erfuellt die bedingung und wird an adr weitergegeben,<br>
              da der wert schon als hex interpretiert wird.<br>
              der doppelpunkt ist ungueltig und wird ignoriert.<br><br>

              fall 2:<br>
              char line[] = "@6542: usw...";<br>
              '6542' erfuellt die bedingung und wird an adr weitergegeben,<br>
              da der wert schon als hex interpretiert wird.<br>
              der doppelpunkt ist ungueltig und wird ignoriert.<br><br>

              fall 3:<br>
              char line[] = "@gabc: usw...";<br>
              erstes zeichen 'g' ist schon ungueltig (faellt nicht in die hex-symbolik '0'-'9' und 'a'-'f'),<br>
              bedingung nicht erfuellt.<br>
              an adr wird nichts weitergegeben.<br><br>

              fall 4:<br>
              char line[] = "@a1fk: usw...";<br>
              die ersten 3 zeichen 'a1f' sind gueltig, 'k' allerdings nicht.<br>
              an adr wird 'a1f' weitergegeben und die bedingung gilt dennoch als erfuellt.<br>
              'k' und doppelpunkt wird ignoriert.<br><br>

              wie schon oben gesagt, sollten blanks auftreten,<br>
              wird bis zum naechsten lesbaren zeichen gesprungen.<br>
              du musst also garnich in hex umwandeln, sondern nur auf hex pruefen.<br><br>

              falls ein c/c++-compiler zur verfuegung steht,<br>
              hier die console-testanwendung:<br>
              <pre>
              //sscanf-verhalten
              #include <stdio.h>
              #include <conio.h>

              int main( void )
              {
              char line[] = "@ab15: 6542: gabc: a1fk: usw...";
              int suc, adr;
              int i, j = 1;

              printf( "info:\tsuccess = 1 = gueltig\n" );
              printf( "\tsuccess = 0 = ungueltig\n" );
              printf( "\tarray-inhalt = %s\n\n", line );

              for(i=1; i<=4; i++, j+=6)
              {
              adr = 0;
              suc = sscanf( line+j, "%x", &adr );

              printf( "success: = %d\n", suc );
              printf( "adr-Dezimal: = %d\n", adr );
              printf( "adr-Hexadez: = %x\n\n", adr );
              }

              getch();

              return 0;
              }
              </pre>

              gruss roy

              Comment


              • #8
                Delphi syntax:

                function IntToHex(Value: Integer; Digits: Integer): string;

                <pre>
                uses
                SysUtils;

                IntToHex(255,4);
                </pre>

                Der Rückgabewert ist: "00FF&quot

                Comment


                • #9
                  Hallo Roy !

                  Ich habe es geschafft!
                  Es funktioniert:-)

                  Ich habe erst mit stringlist rumexperementiert.
                  Dann habe ich gemerkt, das eine Zeile nur 255 Zeichen haben kann.
                  Bei mir ist eine Zeile 512 Bytes.

                  Hier ist das übersetzte:

                  function TaMain.Firmware_Open(Value: string): boolean;
                  var
                  RRun : boolean;
                  posi, val, adr, i,l, len : integer;
                  Z : string;
                  fp : TFileStream;
                  Line : array[0..1031] of char;
                  begin
                  Result := True;
                  for i := 0 to length(touched) -1 do touched[i] := False;
                  for i := 0 to 127 do for l := 0 to 511 do data[i][l] := #0;
                  fp := TFileStream.Create(Value,fmOpenRead);
                  try
                  if fp = nil then
                  begin
                  InfoAdd('firmware file not found');
                  Result := False;
                  exit;
                  end;
                  while fp.Position < fp.Size do
                  begin
                  try
                  fp.ReadBuffer(Line,1032);
                  except
                  exit;
                  end;
                  Adr := 0;
                  Z := ' ';
                  if Line[0] = '@' then
                  begin
                  if Line[5] <> ':' then
                  begin
                  InfoAdd(': missing');
                  Result := False;
                  Exit;
                  end;
                  Adr := StrToInt('$'+Line[1] + Line[2] + Line[3] + Line[4]);
                  Adr := Adr div 512;
                  if( Adr < 0) or (Adr >= 128) then
                  begin
                  InfoAdd('bad address');
                  Result := False;
                  Exit;
                  end;
                  if (touched[adr]) then
                  begin
                  InfoAdd('same page more than one time');
                  Result := False;
                  Exit;
                  end;
                  touched[adr] := True;
                  for i := 0 to 511 do
                  begin
                  Z[1] := Line[6+(2*i)];
                  Z[2] := Line[7+(2*i)];
                  Z[3] := ' ';
                  val := StrToInt('$'+trim(Z));
                  data[adr][i] := Chr(val);
                  end;
                  InfoBox.Items.Add(IntToStr(adr)+';'+data[adr]);
                  end;
                  end;
                  finally
                  If Assigned(fp) then FreeAndNil(fp);
                  end;
                  end;

                  Gruss Sasch

                  Comment


                  • #10
                    Ich nochmal !

                    Warum ist der Text nicht formatiert ?
                    Sieht ja so blöd aus..

                    Comment


                    • #11
                      hi sascha,<br><br>
                      der quellcode muss bei der eingabe in &lt;PRE&gt; -tags gesetzt werden.<br>
                      steht auch neben dem kommentar-eingabe-fenster. <br><br>
                      gruss roy<br><br>
                      PS: ich wollt grad eine HexToDecimal-funktion fuer delphi posten.<br>
                      da ja an adr der dezimal-wert uebergeben wird.<br>
                      das hat sich ja somit erledigt. <br&gt

                      Comment

                      Working...
                      X