BOOL WriteFile( HANDLE hFile, // handle to file to write to LPCVOID lpBuffer, // pointer to data to write to file DWORD nNumberOfBytesToWrite, // number of bytes to write LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O );
Tässä koodi jolla yritin.
procedure jotain; Var DeviceName: Array[0..80] of Char; ComFile: THandle; s: String; BytesWritten: integer; d: array[1..80] of Char; BytesRead: Integer; begin s := 'Test string' + #13 + #10; if not WriteFile (ComFile, s, Length(s), BytesWritten, nil) then... ... ... if not ReadFile (ComFile, d, sizeof(d), BytesRead, Nil) then... end;
ELI miten tämä kahva pitäisi määritellä lähinnä pascal kielessä mutta käy myös c-kielellä. Kokoajan kääntäjä ilmoittaa jotain virhettä, olen aloittelija näiden windowsin kahvojen kanssa, jos joku voisi auttaa suomenkielellä tämän olisin hyvin kiitollinen, hiukset harmaantuu ennen aikojaan kun ei onnistu.
Tarkoituksena olisi kommunikoida sarjaportin kautta mikrokontorollerin kanssa.
Mod. korjasi kooditagit!
Laitahan ne kääntäjän antamat virheet näkyville, se varmasti auttaisi auttamista.
EDIT: ja ihmiset tykkää kun käyttää kooditageja.
Types of actual and formal var parameters must be identical, tämä sama virhe tulee sekä writefile ja readfile lauseessa.
Eikö ole ihan selvää, että kun virheilmoituksessa lukee "var parameters", vika ei ole kahvassa vaan jossain sellaisessa parametrissa, joka on Pascalissa var-parametri eli C:ssä osoitin? Ensiksi hyppää silmille, että BytesRead ja BytesWritten ovat Integer-tyyppisiä, vaikka molemmille funktioille pitäisi antaa DWORD. Epäilen myös, että puskuria ei voi välittää noin vaan siitä pitää jotenkin saada Pointer.
Tuolla näyttää olevan selitystä ko. virheviestille.
En tiedä onko tuo Pascal case-sensitive, mutta sinulla on tuolla arvoja "nil" ja "Nil". Yhden taulukon indeksointi on aloitettu nollasta ja toisen ykkösestä. Pistävät silmään, mutta en tiedä johtuuko vika niistä.
EDIT: no Metabolix se vastasikin jo paremmin. Itsellä ei Pascalista ole aiempaa kokemusta.
Windows-unitissa on tuon funktion headeri (ctrl-klikkaa tekstiä WriteFile) josta näkee tarkat parametrit:
function WriteFile( hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped ): BOOL; external 'kernel32' name 'WriteFile';
DWORD on ehkä määritelty Windows-unitissa, mutta tavallisesti käytetään myös tyyppiä cardinal (32-bit unsigned int). Var-parametrin pitää siis vastata tarkalleen, integer ei käy.
Kirjainkoolla ei ole merkitystä, ja taulukon alkaminen ykkösestä tai nollasta ei vaikuta tuossa. Mutta käytät string-tyyppiä yhtenä parametrina, ja pitäisi antaa buffer-tieto ekaan merkkiin. Eli korvaa:
s -> s[1]
Aihe on jo aika vanha, joten et voi enää vastata siihen.