OK, pokazuję kod.
Oto moja problematyczna funkcja(ona jest wywoływana z innej formy, ale tamta raczej nie ma znaczenia).
Żeby była jasność - stringListę tworzę w formie, która wywołuje tą funkcję.
Jest fo funkcja przeciążona
function FindReaders(IP: string; DeviceCount: integer; var IDs: TStringList): integer;
var
am: boolean;
pr: integer; //zmienn pr i am potrzebne do wywołania funkcji z SDK
id: integer; //id
e: integer; //błąd
i: integer; //aktualna iteracja
found: integer; //ilość znalezionych urządzeń
begin
found:=0;
IDs.Clear;
i:=0;
//deviceCount to ilość urządzeń do znalezienia
while (found<DeviceCount) and (i<DeviceCount*10) do //*1
begin
e:=UF_SearchModuleBySocket(PChar(IP), 1470, am, pr, id); //szukanie urządzenia - funkcja z SDK
if e = 0 then
begin
if not isValueInList(intToStr(id), IDs) then //to jest moment wywalenia: *2
begin
found:=found+1;
IDs.Add(intToStr(id))
end;
end;
i:=i+1;
end;
result:=found;
end;
OK, mały opis:
Miejsce: 1
Najpierw była dodatkowa zmienna o nazwie MaxIterate typu integer.
MaxIterate na począku funkcji dostawało przyrównanie: DeviceCount10 i było umieszczone w drugim nawiasie (i<MaxIterate). Jednak z niewiadomego mi powodu ta zmienna zerowała się po wykonaniu funkcji z SDK(zmieniłem nazwę i było to samo). Więc postanowiłem wpisać na sztywno tak jak teraz i zaczęło się wywalać a AV w miejscu *2.
Najbardziej mnie denerwuje miejsce wywalenia. Debugger nawet nie wchodzi do funkcji isValueInList.
Co tu jest nie tak albo co można poprawić, żeby to w końcu zaczęło działać?
Zaznaczę, że tą funkcję z SDK wykorzystuję jeszcze w innym miejscu i tam nie ma problemów, więc podejrzewam, że to nie jest kwestia tej fukcji.
[DOPISANE]
Po pierwsze ile zajmuje zmienna string? Tyle, ile ma długości, prawda? Więc sizeof(IP) zwróciło mi 4, gdzie IP = '192.168.1.227', a więc po mojemu powinno być 13.
Po drugie, znalazłem pewną rzecz. Otóż okazało się, że zmienna DeviceCount ma ten sam adres co zmienna i, krótko mówiąc: @DeviceCount = @i.