Autor Beitrag
hibbert
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 11.09.07 11:16 
Hallo,
ich benutze gerade die csp2.dll um gespeicherte Barcodes auf einem an den USB angeschlossenen Gerät auszulesen.

Das Barcod auslesen funktioniert auch schon ganz gut. Das auslesen des Timestamps (also wann der Barcode gescannt wurde) funktioniert auch. Nur gibt es dabei ein kleines Problem:

Wenn ich nun diesen Timestamp weiter verarbeiten möchte kommt immer eine AV.

Damit ihr euch besser in meine Lage versetzen könnte, zeige ich euch mal, was ich bisher habe:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
Function csp2GetPacket (stPacketData : array of char ; lgBarcodeNumber : integer; nMaxLength : integer): integer; stdcallExternal 'csp2.dll';
Function csp2TimeStamp2Str(var Stamp: char;value: PChar;nMaxLength: integer): longint; stdcallExternal 'csp2.dll';
{...}
procedure TForm1.Button2Click(Sender: TObject);
var count : integer;
  k,x: Integer;
  i,AsciiMode,RTC,PacketLength : integer;
  nRetStatus: longint;
  Packet : array[0..100of char;
  Barcode : string;
  tmp: pchar;
  Timestamp:string[21];
  nComPort : longInt;
begin
listbox1.clear;
csp2Init(port);
count := csp2ReadData;
statusbar1.Panels[0].Text:='Anzahl der vorhandenen Barcodes: '+inttostr(count);

for i := 0 to 100 do
  packet[i] := #0;

if count > 0 then
begin
  for I := 0 to count-1 do
  begin
    barcode := '';
    //PacketLength := csp2GetPacket(Packet,i,63);
    for k := 0 to 100 do
    PacketLength := csp2GetPacket(packet[1],k,100);
    for k := 3 to PacketLength -4 do
      barcode := barcode + packet[k];
    listbox1.Items.Add('Barcode: '+barcode);
for k := PacketLength-3 to PacketLength-2 do
begin
    nRetStatus := csp2TimeStamp2Str(packet[k],tmp,21);
    timestamp := string(tmp);
    listbox1.Items.Add(timestamp);

end;
end;
end;


In dem markierten bereich kommt es zur AV.
Im Debug-Modus kann ich in der zeile nRetStatus:=csp2TimeStamp2Str(packet[k],tmp,21); die tmp Var auslesen und mir wird der richtige Timestamp angezeigt.

Hat wer vllt eine Idee, wie ich nun die tmp in eine String umwandeln kann und diesen anschließend dann ausgeben kann?

thx hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
azrael_7
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 78

Windows Vista
D2005 Pers. [de]
BeitragVerfasst: Di 11.09.07 11:39 
erm... bin ich blind? wo wird denn die Variable tmp befüllt?

hab nur die deklaration als pchar gefunden und die Übergabe als value an csp2TimeStamp2Str...

_________________
-·- Es gibt Leute die bringen Freude, wohin sie gehen -·-
-·- und es gibt Leute, die bringen Freude, wenn sie gehen -·-
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 11.09.07 11:44 
user profile iconazrael_7 hat folgendes geschrieben:
erm... bin ich blind? wo wird denn die Variable tmp befüllt?

hab nur die deklaration als pchar gefunden und die Übergabe als value an csp2TimeStamp2Str...

Stichwort: Aliasparameter ;)

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
azrael_7
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 78

Windows Vista
D2005 Pers. [de]
BeitragVerfasst: Di 11.09.07 12:19 
hmmm.. oki... immerhin net blind :) dafür aber keine Ahnung... :nixweiss:

_________________
-·- Es gibt Leute die bringen Freude, wohin sie gehen -·-
-·- und es gibt Leute, die bringen Freude, wenn sie gehen -·-
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 11.09.07 13:05 
Aliasparameter:
das var in der Deklaration der Funktion csp2TimeStamp2Str kennzeichnet die variablen als Aliasparameter. D.h. du übergibtst an die procedure einen parameter, die Procedure verändert diesen und danach arbeitest du mit dem veränderten wert weiter.

ein kleines beispiel dazu:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure meineFunc(var zahl:integer);
var i:integer;
begin
for i := 1 to 10 do
inc(zahl);
end;
{...}
var count : integer;
begin
count := 1;
meineFunc(count);
showmessage(inttostr(count));
{...}


So dann wieder zurück zu meinem problem :)

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Di 11.09.07 14:33 
Muss man eventuell den Speicher für Temp erstmal anfordern ? Oder falls nicht, musst Du Temp vllt. erstmal auf nil setzen bevor Du die Variable übergibst...

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Di 11.09.07 14:36 
Grad nochmal die Deklaration der externen Funktionen angeschaut. Es sieht aus, als müsstest Du den Speicher reservieren, da deine PCHar-Variable NICHT als Var-Param übergeben wird und die Routine deshalb nicht selber Speicher reservieren kann. Im Param danach musst Du ja auch die Länge für den PChar angeben...

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 11.09.07 14:50 
user profile iconHelgeLange hat folgendes geschrieben:
Grad nochmal die Deklaration der externen Funktionen angeschaut. Es sieht aus, als müsstest Du den Speicher reservieren, da deine PCHar-Variable NICHT als Var-Param übergeben wird und die Routine deshalb nicht selber Speicher reservieren kann. Im Param danach musst Du ja auch die Länge für den PChar angeben...


Alles klar, ich habe das ganze jetzt mit nem Pointer gemacht und mir den speicher vorreserviert.

nun funktioniert so wie es soll.

danke für den tipp.

hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Di 11.09.07 14:55 
dazu sind wir ja da :)

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
azrael_7
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 78

Windows Vista
D2005 Pers. [de]
BeitragVerfasst: Di 11.09.07 14:58 
user profile iconhibbert hat folgendes geschrieben:
Aliasparameter:
das var in der Deklaration der Funktion csp2TimeStamp2Str kennzeichnet die variablen als Aliasparameter. D.h. du übergibtst an die procedure einen parameter, die Procedure verändert diesen und danach arbeitest du mit dem veränderten wert weiter.



ahh!! :idea: :idea: :idea:
Was "var" macht war mir bekannt, aber net, dass das aliasparameter heisst :) ... aber das var hätte mir auffallen können :oops: also doch blind :D

_________________
-·- Es gibt Leute die bringen Freude, wohin sie gehen -·-
-·- und es gibt Leute, die bringen Freude, wenn sie gehen -·-