![]() |
AW: wo kommt das type hin?
Zitat:
Edit: Es könnte jedoch auch bei der anschliessenden Übergabe an draw_raw_data sein Wenn ich jedoch
Delphi-Quellcode:
Einsetze und die Arrays "gebrauche" dann verliere ich Array Daten1 und Daten2 schonmal nicht.
cd1 := 1;
repeat Form1.Memo1.Lines.Add(inttostr(data1[cd1])); Form1.Memo1.Lines.Add(inttostr(data1[cd1+1])); cd1 := cd1 + 2; until (data1[cd1] = 5) or (data1[cd1-2] = 5); cd2 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data2[cd2])); Form1.Memo1.Lines.Add(inttostr(data2[cd2+1])); cd2 := cd2 + 2; until (data2[cd2] = 5) or (data2[cd2-2] = 5); cd3 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data3[cd3])); Form1.Memo1.Lines.Add(inttostr(data3[cd3+1])); cd3 := cd3 + 2; until (data3[cd3] = 5) or (data3[cd3-2] = 5); cd4 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data4[cd4])); Form1.Memo1.Lines.Add(inttostr(data4[cd4+1])); cd4 := cd4 + 2; until (data4[cd4] = 5) or (data4[cd4-2] = 5); cd5 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data5[cd5])); Form1.Memo1.Lines.Add(inttostr(data5[cd5+1])); cd5 := cd5 + 2; until (data5[cd5] = 5) or (data5[cd5-2] = 5); Zitat:
Etwa so?
Delphi-Quellcode:
Data[0][0] := xyz; //Array0 Feld 0
Zitat:
|
AW: wo kommt das type hin?
Zitat:
Heute bin ich schon müde, morgen (heute nach dem Aufstehen :) ) sehen wir weiter |
AW: wo kommt das type hin?
Dan sag ich mal Guten Morgen :)
|
AW: wo kommt das type hin?
Zitat:
Delphi-Quellcode:
Data[0, 0] := xyz;
|
AW: wo kommt das type hin?
Hab neuigkeiten
Wenn ich bei
Delphi-Quellcode:
Nur die Daten data1 und data2 verarbeite so wie hier, dan klappt es. Also data1 und data2 werden korrekt dargestellt.
procedure TForm1.refresh_all;
begin draw_raw_data(Image9,main_color,data1); draw_raw_data(Image12,main_color,data2); //draw_raw_data(Image13,main_color,data3); //draw_raw_data(Image14,main_color,data4); //draw_raw_data(Image15,main_color,data5); //draw_raw_data(Image16,main_color,data6); //draw_raw_data(Image17,main_color,data7); //draw_raw_data(Image18,main_color,data8); end; data3 hat abwechselnd immer 0 und 1 im Array data4 - data8 haben nichts im array |
AW: wo kommt das type hin?
Ich habe jetzt versucht, das Programm halbwegs zu verstehen - leider ist es so programmiert, dass es einem Aussenstehenden fast unmöglich gemacht wird, etwas zu begreifen:
Wenn ich es jetzt richtig verstanden habe, werden in data[x] und data [x+1] grundlegend verschiedene Arten von Daten abgespeichert, nämlich in data[x] daten, und Data[x+1] irgend eine Art von Index. SO GEHT ES EINFACH NICHT! Mit irgend etwas auf die Art
Delphi-Quellcode:
würde man auf Anhieb sehen, wie die Daten im Programm organisiert sind. So wie das Programm jetzt aussieht (Datenstrukturen, keine Schleifen, die falschen Schleifen) blicke ich einfach nicht durch, was gewollt ist und was passieren sollte, und wo deshalb der Fehler liegen könnte.
var
Data: array [1..4] of record Datenelement: integer; index: integer end; |
AW: wo kommt das type hin?
Zitat:
Also ich versuche es mal zu erklären... Ziel ist es, eine darstellung wie diese zu erzeugen: ![]() Dazu verwende ich ein Image auf welches ich mit canvas zeichne. Meine Hardware liest 50'000 mal ein ob es eine 1 oder eine 0 ist also oben oder unten. Ungeachtet dessen was es den nun ist, werden diese 50'000 bytes übertragen. Ein byte entspricht binär 8 zuständen also zb 1001 1010 deshalb auch 8 kanäle. Nun muss ich überprüfen wo in den 50'000 bytes eine änderung stattgefunden hat. Dazu wandle ich von Dezimal nach binär damit ich jeden kanal "sehe" ob er 1 oder 0 war. speichere ich das abbild in einem array
Delphi-Quellcode:
Danach mache ich die Dezimal -> Binär wandlung mit dem nächsten byte
Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren
Delphi-Quellcode:
und speichere
temp_data[0] := Store_Buffer[i] mod 2;
das ergebnis also die binär zahl in einem array. Anschliessend vergleiche ich jede Binärstelle mit dem vorhergehenden wert. Wenn nun eine 1 anstelle der 0 steht, so weiss ich das sich der zustand damals an der leitung der hardware geändert hat. Also speichere ich in das array data1 (für kanal 1) die änderung und damit ich weiss wo auf dem diagram speichere ich noch den index der 50'000 daten. Dieser ist ja proportional zur zeit und gibt mir anschliessend die position wo ich den den strich nach oben oder unten zeichnen muss.... Hoffe es ist nun verständlich :) |
AW: wo kommt das type hin?
So ich hab mal optimiert...
Delphi-Quellcode:
procedure TForm1.prepaire_data;
var alter_wert,i,a,temp_wert,Kanal1_Counter:integer; temp_data,old_data:Array[0..8] of integer; begin Kanal1_Counter := 0; for i := 0 to gesamt_einheit - 1 do begin temp_wert := store_Buffer[i]; for a := 0 to 7 do begin temp_data[a] := temp_wert mod 2; temp_wert := temp_wert div 2; end; if temp_data[0] <> old_data[0] then begin //Prüfen ob sich der wert geändert hat. Kanal1[Kanal1_Counter].Pegel := temp_data[0]; //Wenn ja, neuer Wert (0 oder 1) in den Pegel von Kanal1 schreiben Kanal1[Kanal1_Counter].Index := i; //Index übergeben damit ich weiss wo ich zeichnen muss Kanal1_Counter := Kanal1_Counter + 1; //Kanal1 Counter erhöhen end; Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren damit man anschliesend vergleichen kann end; Kanal1[Kanal1_Counter].Pegel := 2; //Terminierung des Arrays da Pegel nur 0 oder 1 sein kann end; Frage: Kann man da noch was optimieren? Weil ich müsste ja eigentlich für jeden kanal wieder das selbe machen wie für kanal1 Nochmal was Optimiert:
Delphi-Quellcode:
EDIT:
procedure TForm1.draw_raw_data(drawspace:TImage;color:TColor;data_in:Array of TKanal);
var counter:integer; begin counter := 0; repeat draw_up(drawspace,color,((data_in[counter].Index - start) div ein_pixel)); if (data_in[counter-1].Pegel) = 1 then draw_line(drawspace,color,(data_in[counter-1].Index-start) div ein_pixel,(data_in[counter].Index - start) div ein_pixel,5); if (data_in[counter-1].Pegel) = 0 then draw_line(drawspace,color,(data_in[counter-1].Index-start) div ein_pixel,(data_in[counter].Index - start) div ein_pixel,25); counter := counter + 1; until (data_in[counter].Pegel = 2); //Prüfen ob array ende erreicht ist. if data_in[counter -1].Pegel = 1 then draw_line(drawspace,color,(data_in[counter-1].Index-start)div ein_pixel,gesamt_einheit div ein_pixel,5); if data_in[counter -1].Pegel = 0 then draw_line(drawspace,color,(data_in[counter-1].Index-start)div ein_pixel,gesamt_einheit div ein_pixel,25); //Letzte linie erzeugen end;
Delphi-Quellcode:
Werde nun testen ob es nun kein verlust mehr gibt
type
TKanal = record Pegel: Byte; Index: integer; end; Kanal1:Array[0..10000] of TKanal; |
AW: wo kommt das type hin?
Ich hab den Fehler eingegrenzt
Er taucht hier auf:
Delphi-Quellcode:
Wenn ich anstelle von temp_data[0] temp_data[2] nehme gibts ne Access Violation
if temp_data[0] <> old_data[0] then begin //Prüfen ob sich der wert geändert hat.
Kanal1[Kanal1_Counter].Pegel := temp_data[0]; //Wenn ja, neuer Wert (0 oder 1) in den Pegel von Kanal1 schreiben Kanal1[Kanal1_Counter].Index := i; //Index übergeben damit ich weiss wo ich zeichnen muss Kanal1_Counter := Kanal1_Counter + 1; //Kanal1 Counter erhöhen end; temp_data ist
Delphi-Quellcode:
Ich denke das problem ist beim übergeben
temp_data,old_data:Array[0..8] of integer;
Delphi-Quellcode:
Pegel ist eine byte variable
Kanal1[Kanal1_Counter].Pegel := temp_data[0];
Delphi-Quellcode:
Was meinst du / ihr ?
type
TKanal = record Pegel: Byte; Index: integer; end; EDIT: Wenn ich Pegel auf integer umstelle, gibts keine veränderung... Auch eine Access Violation bei
Code:
00406ADC 50 push eax
|
AW: wo kommt das type hin?
Ich habe jetzt versucht, die Datentypen und Schleifen anzupassen, allerdings nur trocken, d.h. es werden sicher noch Tipp und andere kleine Fehler im Code sein.
edit: ein paar Fehler sind mir jetzt gleich aufgefallen (i und counter, werte beim Prozeduraufruf von 1..8 statt 0..7), aber die kannst Du leicht selbst ausbessern.
Delphi-Quellcode:
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, jpeg, ImgList, ComCtrls; type MyData = packed array[1..50000] of packed record data: byte; index: word; // Zwei byte sind genug für 1..50000 end; TForm1 = class(TForm) MainMenu1: TMainMenu; OpenLogic1: TMenuItem; About1: TMenuItem; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Image8: TImage; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Image9: TImage; Shape1: TShape; ScrollBar1: TScrollBar; ImageList1: TImageList; Label9: TLabel; Label10: TLabel; Image12: TImage; Image13: TImage; Image14: TImage; Image15: TImage; Image16: TImage; Image17: TImage; Image18: TImage; ProgressBar1: TProgressBar; ScrollBar2: TScrollBar; Label11: TLabel; About2: TMenuItem; KeineAktualisierungverfgbar1: TMenuItem; Label1: TLabel; Label12: TLabel; update_check: TTimer; marker1: TPanel; dispmarker1: TLabel; Button1: TButton; marker2: TPanel; dispmarker2: TLabel; GroupBox1: TGroupBox; dispdmarker: TLabel; dispfreq: TLabel; ComboBox1: TComboBox; Button2: TButton; Label13: TLabel; ListBox1: TListBox; Button3: TButton; Label14: TLabel; Memo1: TMemo; Button5: TButton; ComboBox2: TComboBox; procedure draw_raw_data(drawspace:TImage;color:TColor; typ: integer); procedure prepaire_data; procedure refresh_all; procedure FormCreate(Sender: TObject); procedure About2Click(Sender: TObject); procedure KeineAktualisierungverfgbar1Click(Sender: TObject); procedure update_checkTimer(Sender: TObject); procedure refresh_marker(X:integer;marker:TPanel;display:TLabel); procedure refresh_times; procedure marker1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure marker2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormShow(Sender: TObject); procedure ComboBox1DropDown(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComboBox1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure ScrollBar2Change(Sender: TObject); procedure clear_disp(disp:TImage); procedure clear_all; procedure ScrollBar1Change(Sender: TObject); private { Private-Deklarationen } public version_t:string; version,timems,timebasems,timeleft,timeright,marker1ms,marker2ms:integer; data: array[0..7] of MyData; Cd: array[0..7] of integer; // Aktuelle Anzahl der Elemente in Data end; var Form1: TForm1; implementation uses about, update,D2XXUnit, CfgUnit; var DevicePresent : Boolean; Selected_Device_Serial_Number : String; Selected_Device_Description : String; Store_Buffer : Array[0..512000] of byte; //512kb Speicher. Store_Buffer_Count:integer; gesamt_einheit:integer; ein_pixel,buffer_size,start,stop:integer; main_color:tcolor; {$R *.dfm} procedure TForm1.refresh_times; begin timeleft := ((timems div ScrollBar1.Max) * ScrollBar1.Position) - timebasems; timeright := ((timems div ScrollBar1.Max) * ScrollBar1.Position); Label9.Caption := inttostr(timeleft)+'ms'; Label10.Caption := inttostr(timeright)+'ms'; end; procedure TForm1.ScrollBar1Change(Sender: TObject); begin start := ScrollBar1.Position; Label9.Caption := inttostr(start); stop := ScrollBar1.Position + (gesamt_einheit div ScrollBar2.Position); Label10.Caption := inttostr(stop); clear_all; refresh_all; end; procedure TForm1.ScrollBar2Change(Sender: TObject); begin ScrollBar1.Max := (gesamt_einheit); Label11.Caption := inttostr(gesamt_einheit div ScrollBar2.Position); ein_pixel := (gesamt_einheit div ScrollBar2.Position) div Image9.Width; clear_all; refresh_all; end; procedure TForm1.refresh_marker(X:integer;marker:TPanel;display:TLabel); var mslen:integer; begin if ((marker.Left + X) > (Image9.Left - 1)) and ((marker.Left + X) < ((Image9.Left + Image9.Width) +1)) then begin mslen := (timebasems * timems div (Image9.width)); display.Caption := inttostr( ( ((marker.Left - Image9.Left) * mslen) div 10000) + timeleft + 1)+'ms'; marker.Left := marker.Left + X; display.Left := display.Left + X; if marker.Name = 'marker1' then marker1ms := ( ((marker.Left - Image9.Left) * mslen) div 10000) + timeleft + 1; if marker.Name = 'marker2' then marker2ms := ( ((marker.Left - Image9.Left) * mslen) div 10000) + timeleft + 1; dispdmarker.Caption := 'Delta ms: '+inttostr(marker2ms-marker1ms)+'ms'; dispfreq.Caption := 'Freq. Hz: '+ inttostr(1000 div ((marker2ms-marker1ms)))+'Hz'; end; end; procedure draw_up(pointer:TImage;color:TColor;x:integer); begin with pointer.Canvas do begin // Was ist hier pen.mode? Pen.Color := color; Pen.Width := 1; MoveTo(x,25); LineTo(x,5); end; end; procedure draw_down(pointer:TImage;color:TColor;x:integer); begin with pointer.Canvas do begin Pen.Color := color; Pen.Mode := pmMerge; // bei draw_up nicht? Pen.Width := 1; MoveTo(x,5); LineTo(x,25); end; end; procedure draw_line(pointer:TImage;color:TColor;x1,x2,y:integer); begin with pointer.Canvas do begin Pen.Color := color; Pen.Width := 1; MoveTo(x1,y); LineTo(x2,y); end; end; procedure TForm1.About2Click(Sender: TObject); begin Form2.ShowModal; end; procedure TForm1.Button1Click(Sender: TObject); begin dispmarker1.visible := not dispmarker1.visible; dispmarker2.Visible := dispmarker1.visible; marker1.Visible := dispmarker1.visible; marker2.Visible := dispmarker1.visible; end; procedure TForm1.Button2Click(Sender: TObject); begin If Open_USB_Device_By_Serial_Number(Selected_Device_Serial_Number) = FT_OK then begin FT_Current_Parity := 1; FT_Current_StopBits := 0; FT_Current_DataBits := 8; Set_USB_Device_DataCharacteristics; FT_Current_Baud := 3000000; Set_USB_Device_BaudRate; Label13.Caption := 'Status: Verbunden mit: ' + Selected_Device_Serial_Number; end else begin Label13.Caption := 'Status: Fehler beim verbinden mit: ' + Selected_Device_Serial_Number; end; end; procedure TForm1.Button3Click(Sender: TObject); begin ProgressBar1.Max := gesamt_einheit; ProgressBar1.Position := 0; repeat Read_USB_Device_Buffer(buffer_size); Move(FT_In_Buffer[0], Store_Buffer[Store_Buffer_Count], Length(FT_In_Buffer)); Inc(Store_Buffer_Count, buffer_size); ProgressBar1.Position := ProgressBar1.Position + buffer_size; Label14.Caption := 'Saved: '+inttostr(ProgressBar1.Position); Application.ProcessMessages; until ProgressBar1.Position = gesamt_einheit; end; procedure TForm1.refresh_all; begin draw_raw_data(Image9,main_color,1); draw_raw_data(Image12,main_color,2); draw_raw_data(Image13,main_color,3); draw_raw_data(Image14,main_color,4); draw_raw_data(Image15,main_color,5); draw_raw_data(Image16,main_color,6); draw_raw_data(Image17,main_color,7); draw_raw_data(Image18,main_color,8); end; procedure TForm1.Button5Click(Sender: TObject); begin clear_all; prepaire_data; refresh_all; end; procedure TForm1.ComboBox1Click(Sender: TObject); begin Selected_Device_Serial_Number := ListBox1.Items.Strings[ComboBox1.ItemIndex]; //Showmessage(Selected_Device_Serial_Number); end; procedure TForm1.ComboBox1DropDown(Sender: TObject); var S:String; DeviceIndex : DWord; I : Integer; LV : TListItem; begin ComboBox1.Items.clear; //Auswahl löschen ListBox1.Clear; //Geräte ID's löschen GetFTDeviceCount; S := IntToStr(FT_Device_Count); DeviceIndex := 0; If FT_Device_Count > 0 then Button2.Enabled := true; For I := 1 to FT_Device_Count do Begin GetFTDeviceDescription ( DeviceIndex ); ComboBox1.Items.Add(FT_Device_String); GetFTDeviceSerialNo( DeviceIndex ); ListBox1.Items.Add(FT_Device_String); DeviceIndex := DeviceIndex + 1; End; end; procedure TForm1.prepaire_data; var a,h,alter_wert,counter,i:integer; vorheriges_x,aktuelle_flanke:integer; linie_zeichnen:boolean; temp_data,old_data: Array[0..7] of byte; begin counter := 1; vorheriges_x := 0; aktuelle_flanke := 0; for a := 0 to 7 do begin cd[a] := 0; old_data[a] := 0; end; for i := 1 to gesamt_einheit do begin h := store_Buffer[i]; for a := 0 to 7 do begin temp_data[a] := h mod 2; temp_wert := h div 2; if temp_data[a] <> old_data[a] then begin inc(cd[a]); data[a][cd[a]].data := temp_data[a]; data[a][cd[a]].index] := i; end; end; Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren end; for a := 0 to 7 do begin if data[a][cd[a]].index <> gesamt_einheit then begin inc (cd[a]); data[a][cd[a]].index := gesamt_einheit; end; // damit alle 8 Graphiken bei gesamtindex enden Form1.Memo1.Lines.Add('Feld: '+inttostr(a)); for i:= 1 to Cd[a] do Form1.Memo1.Lines.Add(inttostr(data[a][i].data)+': '+(inttostr(data[a][i].index)); end; Form1.Memo1.Lines.Add(' |-| '); end; procedure TForm1.draw_raw_data(drawspace:TImage;color:TColor; typ: integer); const y: array[0..1] of integer = (5,25); var counter:integer; begin counter := 1; for i := 1 to Cd[typ]-1 do begin if i<>1 then draw_up(drawspace,color,((data[typ][counter+1] - start) div ein_pixel)); // ich nehme an, zwischen drawup und drawdown ist in Wirklichkeit kein Unterschied, sonst müsste man da unterscheiden draw_line(drawspace,color,(data[typ][i].index - start) div ein_pixel,(data[typ][i+1].index - start) div ein_pixel,y[data[typ][i].data]); end; end; procedure TForm1.clear_disp(disp:TImage); begin with disp.canvas do begin brush.Color:=$00575048; brush.Style:=bsSolid; rectangle(0,-1,disp.Width+2,disp.Height+2); end; end; procedure TForm1.clear_all; begin clear_disp(Form1.Image9); clear_disp(Form1.Image12); clear_disp(Form1.Image13); clear_disp(Form1.Image14); clear_disp(Form1.Image15); clear_disp(Form1.Image16); clear_disp(Form1.Image17); clear_disp(Form1.Image18); end; procedure TForm1.FormCreate(Sender: TObject); begin version_t := '1.0.0.21'; form1.DoubleBuffered := true; end; procedure TForm1.FormShow(Sender: TObject); begin FT_Enable_Error_Report := true; // Error reporting = on gesamt_einheit := 50000; //Anzahl Samples buffer_size := 1000; //Anzahl Samples pro übertragung start := 0; stop := gesamt_einheit; ein_pixel := gesamt_einheit div Image9.Width; main_color := clWhite; //DevicePresent end; procedure TForm1.KeineAktualisierungverfgbar1Click(Sender: TObject); begin Form3.Showmodal; end; procedure TForm1.marker1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin refresh_marker(X,marker1,dispmarker1); end; procedure TForm1.marker2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin refresh_marker(X,marker2,dispmarker2); end; procedure TForm1.update_checkTimer(Sender: TObject); begin update_check.Enabled := false; if paramstr(1) = 'update' then begin deletefile(extractfilepath(paramstr(0))+'old.exe'); showmessage('Herzlichen Glückwunsch... Update erfolgreich! Version: ' + version_t); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz