AGB  ·  Datenschutz  ·  Impressum  







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

Labels in C

Ein Thema von Horst0815 · begonnen am 11. Mai 2016 · letzter Beitrag vom 11. Mai 2016
Antwort Antwort
Horst0815

Registriert seit: 23. Mai 2011
Ort: Görlitz
150 Beiträge
 
Delphi XE Starter
 
#1

Labels in C

  Alt 11. Mai 2016, 12:31
Delphi-Version: 5
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;

Geändert von Horst0815 (11. Mai 2016 um 12:33 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Labels in C

  Alt 11. Mai 2016, 13:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Labels in C

  Alt 11. Mai 2016, 13:38
Result ist nicht immer initialisiert.
return 0; ist kein Exit; , sondern Result:=0; Exit; oder 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 .


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)
$2B or not $2B

Geändert von himitsu (11. Mai 2016 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Horst0815

Registriert seit: 23. Mai 2011
Ort: Görlitz
150 Beiträge
 
Delphi XE Starter
 
#4

AW: Labels in C

  Alt 11. Mai 2016, 14:15
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œwietlenie informacji o b³êdzie
 hIcon = LoadIcon(0, IDI_ERROR); // Wczytanie ikony b³êdu systemu Windows
SendMessage(hWin3, STM_SETIMAGE, 1, hIcon); // Wyœ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œæ, wysokoœæ 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

Geändert von Horst0815 (11. Mai 2016 um 14:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Labels in C

  Alt 11. Mai 2016, 14:26
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');
}
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:14 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