![]() |
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; |
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.
|
AW: Labels in C
Result ist nicht immer initialisiert.
Delphi-Quellcode:
ist kein
return 0;
Delphi-Quellcode:
, sondern
Exit;
Delphi-Quellcode:
oder
Result:=0; Exit;
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 ![]() 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) |
AW: Labels in C
ja wollt ich jetzt auch mit while Schleife umstellen
hatte gehofft das nur die nachfolgende Zeile zählt
Delphi-Quellcode:
Rufen sich die Labels hier nicht gegenseitig auf das endet doch im loop (Goto: A)
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;} 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 |
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 08:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz