struct Array sortieren

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
ernyberty
Beiträge: 1
Registriert: 12. Juni 2012 15:47

struct Array sortieren

Beitrag von ernyberty »

Hallo liebe Community

Ich habe ein komplexeres Problem und bitte deshalb um eure Mithilfe.

Ich habe 2 Klassen, welche auf eine gemeinsame globale Struktur zugreifen.
Nehmen wir an die struct sieht so aus:

Code: Alles auswählen

typedef struct can_structure 
{ 
 int data[10]; 
 int id; 
 int length; 
}can_data; 

extern can_data can[70];	

Soweit sogut. Nun möchte ich in einer Funktion einer der beiden Klassen einen CAN-Wert aus meinem CAN-Bus holen und in die obige Struktur hereinsortieren.
Das würde heißen(Beispiel):
CAN-Nachricht mit der ID:0x002 -> can[0],
CAN-Nachricht mit der ID:0x050 -> can[1],
.
.
.
CAN_Nachricht mit der ID:0x750 -> can[50]
(Beispiel ende)

Wie müsste ich dann also eine funktion aufbauen, die diese an bestimmte Stellen speichert? Ich muss am Ende aber wissen, an welcher Stelle welche ID steht, um die Daten überschrieben zu können UND um diese Struktur wieder auslesen zu können.

Die zweite Klasse beinhaltet dann eine Funktion, die diese Struktur nimmt und bestimmte Daten dann irgendwo ausgibt.


Ich hoffe echt Ihr könnt mir bei meinem Problem weiterhelfen.

Grüße, Erny
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: struct Array sortieren

Beitrag von RHBaum »

erstmal was zum verstaendniss:

du magst int ? ^^
warum int[10] statt unsigned char [8] !? Ich kenne keinen CAN-Bus der mehr als 8 Byte Daten pro Paket transportiert ....
die ID sollte auch unsigned sein, es gibt keine negativen ID's, und fuer ungueltige ID's kannst 0 hernehmen, die gibts eigentlich auch nicht ... (bei uns ist 0 zumindest der indikator fuer errorframes)
Notfalls koenntest immer noch 0xFFFFFFF als ungueltig nehmen, weil das kann selbst ne Extended CAN ID ned

Warum mit 2 Klassen auf die Daten zugreifen ?
Warum nicht eine fuer die Verwaltung der Daten und eine fuers Managment. Und die eine Klasse nutzt die Methoden der anderen ???

Du solltest Dir auch angewohenen abstrakt an Probleme ranzugehen ... du versuchst ein Teilproblem technisch perfekt zu lösen und dann erst die anderen "probleme" anzugehen....
richtiger ist, dein Problem zuerst in Teilprobleme zu splitten, damits ueberschaubar wird, dann die Use-Cases fuer die Teilloesungen bestimmen, dann die Teilloesungen implementierung, zum schluss die Loesungen zusammensetzen zu einem Ganzen. (OOP / OOD).

zu deiner Problematik:
DU brauchst nen zugriff um schnell von der ID aus auf eine Klasse / Struktur zuzugreifen ....

was fuer moglichkeiten hasst ?
der schnellste zugriff ist per index position.
Dein Problem, deine ID ist vom typ int, das sind 4 Milliarden Zahlen die darstellen kannst. du brauchst die ID (4 byte) + nen Zeiger auf deine struktur, selbst wenn da keine Object existiert. das sind auf 32bit noch mal 4 byte.
8Byte * 2^32 = jenseits jeglichen Speichers den jemals bekommen koenntest.
Nun belegen die CAN IDs aber nicht 4 Milliarden ...
Normale (nicht extended) CAN-Busse sind auf 11 bit beschraenkt ....
Extended CAN-Busse sind auf 29 bit beschraenkt ....
8* 2^29 = 4.294.967.296 Byte sind immer noch 4 GiByte. bekommst auch nicht allokiert ^^

Also reiner Index zugriff scheidet aus ... und du musst beten, das nicht alle IDs aufn Extended CAN benutzt werden, sonst kannst auch nicht alles im Speicher halten

also bleiben Hashmaps, oder Sortierte ablage mit optimierter suche (Bäume) ueber ...

Hashmaps wuerd ich eher nicht empfehlen, weil du ne passende hashfunktion brauchst, um die kollisionen zu minimieren. weiss ned ob man das fuer einen CAN ID bereich gut hinbekommt.
Besser sind also Baeume. Und das ist in der Progrommierung so üblich, das es sogar fertige implementationen gibt ^^
Stichwort Maps ! std::map / QMap

also std::map<int,can_structure> koennte helfen ...

wobei typedef struct can_structure typisches c ist ...
bei c++ kannst das typedef weglassen ....
und noch besser waer, in ner klasse zu kapseln ...
Da du hier in dem Forum postest, nehm ich an du willst ne c++ lösung, keine c-lösung, die aufn embedded controller bekommst ...

Ciao ....
Antworten