Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C++ Labels in C (https://www.delphipraxis.net/189165-labels-c.html)

Horst0815 11. Mai 2016 11:31

Delphi-Version: 5

Labels in C
 
muss ich bei Labels in C nur die nächste Zeile beachten oder wie weit ersteckt sich hier das Label Z:

fsih ist als DWord deklariert und wird ohne Umwandlung als PLPSTR ausgegeben hab ich da was übersehen

Delphi-Quellcode:
LPSTR *FindData(LPSTR *buff, long bnum, char *data, int dnum)
{
Z: fsih = memchr(buff, data[0], bnum); // Szukanie pierwszego bajtu danych
if(fsih) // Znaleziono pierwszy bajt danych
 {if(fsih+dnum > (long)buff+bnum) return 0; // Szukane dane są dłuższe od liczby bajtów, które pozostały do końca bloku pamięci
  if(!memcmp(fsih+1, data+1, dnum-1)) return fsih; // Znaleziono kolejne bajty danych
  else // Nie znaleziono kolejnych bajtów danych (zwiększenie pozycji szukania o 1 i ponowne szukanie)
   {bnum = bnum-(fsih+1-(long)buff);
    buff = fsih+1;
    goto Z;}}
else return 0; // Nie znaleziono pierwszego bajtu danych
}

Delphi-Quellcode:
function memchr(const buf: Pointer; c: Char; len: size_t): Pointer;
var
  l: Char;
begin
  Result := buf;
  l := c;
  while len <> 0 do
  begin
    if PChar(Result)[0] = l then
      Exit;
    Inc(Integer(Result));
    Dec(len);
  end;
  Result := Nil;
end;

  Function FindData(buff: PLPSTR; bnum: long; data: PChar; dnum: Integer): PLPSTR;
begin
  if (fsih) <> 0 then // Znaleziono pierwszy bajt danych
  begin
    if (fsih + dnum) > (long(buff) + bnum) then
      Exit; // Szukane dane są dłuższe od liczby bajtów, które pozostały do końca bloku pamięci
    if not CompareMem(Pointer(fsih + 1), data + 1, dnum - 1) then
      Result := PLPSTR(fsih) // Znaleziono kolejne bajty danych
    else // Nie znaleziono kolejnych bajtów danych (zwiększenie pozycji szukania o 1 i ponowne szukanie)
    begin
      bnum := bnum - (fsih + 1 - long(buff));
      buff := PLPSTR(fsih + 1);
      fsih := DWord(memchr(buff, data[0], bnum));
    end;
  end
else
  Exit; // Nie znaleziono pierwszego bajtu danych
end;

Namenloser 11. Mai 2016 12:25

AW: Labels in C
 
Versteh ich nicht. Labels in C verhalten sich genau wie Labels in Delphi. Labels haben keine Ausdehnung sondern geben einen Punkt im Programm an. Wenn ein Label angesprungen wird, dann lässt das Programm sozusagen alles stehen und liegen und der Programmfluss geht nach dem Label weiter. Vielleicht ist dein Missverständnis hier: Goto heißt nicht, dass nur die Zeile nach dem Label ausgeführt wird, sondern auch die Zeile danach, die Zeile danach usw. (solange kein weiterer Sprungbefehl kommt). Es wird nie zurückgekehrt.

himitsu 11. Mai 2016 12:38

AW: Labels in C
 
Result ist nicht immer initialisiert.
Delphi-Quellcode:
return 0;
ist kein
Delphi-Quellcode:
Exit;
, sondern
Delphi-Quellcode:
Result:=0; Exit;
oder
Delphi-Quellcode:
Exit(0);
.

Dann würde ich kein GOTO mehr verwenden, sondern eine Schleife (For/While/Repeat).

Namenloser hat es schon gesagt: GOTO hat kein Ende ... hat nur einen Anfang, nicht so wie https://en.wikipedia.org/wiki/GOSUB . :angle2:


Und memchr ist auch falsch, denn XE ist Unicode und da drin wird mit Ansi gerechnet.

Ähhh, wo ist fsih definiert?
Und wieso ist das DWORD, wo doch memchr einen Pointer zurück gibt?

Ich würde ja PChar verwenden und die Pointer-Arithmetik ausnutzen, damit "richtig" gerechnet wird. (bei Unicode jeweils 2 Byte)

Horst0815 11. Mai 2016 13:15

AW: Labels in C
 
ja wollt ich jetzt auch mit while Schleife umstellen

hatte gehofft das nur die nachfolgende Zeile zählt

Delphi-Quellcode:
 A: SendMessage(hWin0, WM_SETTEXT, 0, smsg); // Wy&#339;wietlenie informacji o błędzie
 hIcon = LoadIcon(0, IDI_ERROR); // Wczytanie ikony błędu systemu Windows
SendMessage(hWin3, STM_SETIMAGE, 1, hIcon); // Wy&#339;wietlenie wczytanej ikony
break;}
fsil = GetFileSize(hFile, &fsih);
if(fsih) // Rozmiar pliku >4294967295 bajtów
B: {sprintf(smsg, "\nWrong size of file.\nOnly 256/512kB Kickstarts are supported.");
C: CloseHandle(hFile); // Zamknięcie otwartego pliku
goto A;}
Rufen sich die Labels hier nicht gegenseitig auf das endet doch im loop (Goto: A)

Edit : Break übersehen



Delphi-Quellcode:
HICON hIcon;
HFONT hFont;
HANDLE hFile;
HBRUSH hbLis;
OFSTRUCT ofs;
HINSTANCE hInst;
OPENFILENAME ofn;
signed char mpri[44];
LPSTR mBuf, tBuf, tpos, madr[44], mend[44];
char mnam[44][33] = {""}, mver[44][70] = {""};
int csel, mnum, scrx, scry, winx = 455, winy = 480; // szeroko&#339;ć, wysoko&#339;ć głównego okna programu
DWORD hCol, fsih, fsil, ftmp, base, skip, ksum, ktmp;
HWND hWnd, hBut0, hBut1, hBut2, hBut3, hBut4, hBut5, hBut6, hLis0, hWin0, hWin1, hWin2, hWin3, hTemp;



Edit: Code Tags funktionieren doch

himitsu 11. Mai 2016 13:26

AW: Labels in C
 
Ich meinte mehr "das ist eine lokale Variable, aber lokal seh ich da nichts, in dem Delphi-Code".

und doch?
Code:
das ist ein Block
Code:
if (true) {
  print ('und das sogar in C');
}
PHP-Quellcode:
if (true) {
  print ('nee o_O , C ist nicht formatiert, aber wenigstens PHP ... sieht genauso abgeschweift aus');
}


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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