Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Ongelmia Windows kahvojen kanssa

fishman [12.11.2012 18:51:40]

#

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!

mietinvaan [12.11.2012 19:11:06]

#

Laitahan ne kääntäjän antamat virheet näkyville, se varmasti auttaisi auttamista.

EDIT: ja ihmiset tykkää kun käyttää kooditageja.

fishman [12.11.2012 19:14:38]

#

Types of actual and formal var parameters must be identical, tämä sama virhe tulee sekä writefile ja readfile lauseessa.

Metabolix [12.11.2012 19:59:46]

#

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.

mietinvaan [12.11.2012 20:07:01]

#

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.

User137 [12.11.2012 23:20:31]

#

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]

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta