Przepisanie buffora

0

Witam wszystkich ktorzy moga mi pomóc.
nie jestem z zawodu programmista dlatego moje pytanie bedzie banalne.
mam pewna funkcje w ktorej musze przepisac wartosc z jednego buffora do drogiego obcinajac pierwsze dwa symbole i ostatni, to wszystko funkcja jeszcze na koniec daje wartosc boolean czy sie udalo.

Dziekuje za pomoc :)

0
marco123 napisał(a)

nie jestem z zawodu programmista dlatego moje pytanie bedzie banalne

Banalność tego pytania chyba powoduje, iż jest ono niewidoczne...

0

Jak byś jeszcze owy bufor pokazał to byłoby łatwiej. Nie jesteśmy jasnowidzami.

0

OK wiec moja funkcja z opisem wyglada nastepujaco :)

 { Called from DoCharIn.
  Extracts from completed FCurPkt next data value, assign it to FCurVal,
  return true is there was some value, otherwise false. Called repeatedly
  until returns false, i.e. if in one packet contains more values, some
  returned points counter should be set to 0 in IsInputPacketFinished method
  or the FCurPkt can be trimmed sequentially.
  Always override if not overriding DoCharIn. }

function ExtractCurVal: boolean; virtual; abstract;

Gdzie:

{Currently beeing contructed input packet from incoming bytes (in DoCharIn method) }
FCurPkt: shortstring;

{ Current value used in the process of extracting values from the finished incoming packet. }
<b>FCurVal</b>: single;

Oraz:

{Called during acquisition when a character ch comes through the device's port
(i.e., all characters are read by Chromulan and given (forwarded) to the
device driver using this method.) More devices can share the same port, if they
do not want to control the port (see ExtDevGetStr). }
function ExtDevDoCharIn(AExtDevDrv: PExtDevDrv; ch:char): integer; export;

Problem z portu RS 232 dostaje sygnal o dlugosci slowa 11 i formacie:
*+00000.00{CR}
i z tego potrzebuje tylko:
+00000.00

I to wszystko jak na razie:
Jeszcze raz dzieki za wszelka pomoc :)

0

Mam tu nie do końca zrozumałe przesłanie, ale spróbuję. Jako znak traktuje np. 'a', itp. Gdybyś napisał bity to zagadnienie wyglądało by trochę inaczej. Zakładam więc, że mamy do czynienia z typem string (sądząc po znaku {cr} na końcu.
Moja wizja jest następująca:
Tworzę dwa stringi

S1 :string[11]; //oryginalny
S2 :string[9]; // okrojony
for i := 3 to 9 do  S2[i] := S1[i];

Nie wiem czy o to Ci chodziło.</delphi>

0

Ale strzeliłem byka.
pętelka musi mieć postać

var
 S1 :string[11];
 S2 :string[8];
for i := 1 to 8 do S2[i] := S1[i+2];

Sorki za pomyłkę ;-)

0

jak już to prościej

var
  s1, s2: string; 
begin
  s1 := '*+00000.00{CR}';
  s2 := Copy(s1, 2, 9);
end;
0

OK juz zaczynam rozumiec, tylko jeszcze na przykladzie jakbyscie mi pomogli
Czyli tak moja funkcja ma deklaracje:

{ Called from DoCharIn.
Extracts from completed FCurPkt next data value, assign it to FCurVal,
return true is there was some value, otherwise false. Called repeatedly
until returns false, i.e. if in one packet contains more values, some
returned points counter should be set to 0 in IsInputPacketFinished method
or the FCurPkt can be trimmed sequentially.
Always override if not overriding DoCharIn. }
function ExtractCurVal: boolean; virtual; abstract;

gdzie:

{Currently beeing contructed input packet from incoming bytes (in DoCharIn method) }
FCurPkt: shortstring;

{ Current value used in the process of extracting values from the finished incoming packet.}
<b>FCurVal</b>: single;

Czyli musze przepisac z FCurPkt do FCurVal gdzie obie maja rozny format i z tym nie moge sobie dac rady ?

Dzieki za kazda pomoc.

0

Acha, moze dla przykladu podam jak to wyglada przy innym sygnale

function TOmegaMDrv.ExtractCurVal: boolean;
begin
if length(FCurPkt) >= 2 * ChannelCount then begin
FCurVal := ord(FCurPkt[Channel * 2 + 1]) * 256 + ord(FCurPkt[Channel * 2 + 2]);
FCurPkt := copy(FCurPkt, 2 * ChannelCount + 1, length(FCurPkt));
Result := true;
end else begin
Result := false;
end;
end;

jeszcze raz dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1