Complexe String vergelijkingen berekenen C++

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
ik heb een variabel aantal ID's.
elk ID is were opgesplits uit 9 stukjes.
dus in totaal heb ik 9*aantal ID's aan stukjes

ik ontvang nu een string array (variabele groote) met daarin als voorbeeld de data:

2,9,11,18,36 // wat letterijk betkent stukje 2, sukje 9 enz
of
2,10,12

nu is het al zo uitgerekend dat stukje 2 altijd in ID 0 staat.
en stukje 11 in ID1.

Stukje 2 staat dus op positie 1 in ID0.
en Stukje 11 in positie 1 van ID1


oftewel ik heb een tabel :
Java: test
1
2
3
4
5
6
7
8
 
         Stukje
 ID              0     1      2       3     4     5    6    7     8    
0                      x                                          x

1                      x                                          x        

2                                                                 x


nu wil ik de situatie wat je ziet onder stukje 8 detecteren wanneer er vaker dan 3 keer "true" in voorkomt.
met als uitkomst welke ID's er onder vallen, en dat het om Stukje 8 gaat.


nu wordt het ID uitgerekend met
Java: test
1
2
 
ID[i] = ceil((j[i] / 9) * 10) / 10;

waar j[] de data uit de string array is.

De stukjes (kolommen)

Java: test
1
2
3
4
 
 p[i] = (j[i] - (floor(j[i] / 9) * 9)) - 1;
   if (p == 65535) { // if roll over 
      p = 8;   }

waar j[] de data uit de string array is.
en p[] is dan je Stukje/kolom


dit werkt goed, maar hoe ga ik de vergelijking met de kolommen nu aan ?


om nou de hele string door te gaan scannen met de "for()" functie, binnen in een "for()" functie, enz
lijkt mij een beetje overdreven, en kost een hoop tijd als mij String 1000 waardes kan bezitten

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
Snap niet precies wat je nu gedaan hebt (het kruisje in je tabel betekent dat je dat "stukje" hebt ontvangen? ), maar als je een "tabel" hebt (array, vector,bitset) kun je de kolommen direct adresseren.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Wat wil je nu precies detecteren? Of er meer dan 3 ID's zijn die 'bit' (of 'stukje', zoals jij het lijkt te noemen?) 8 geset hebben?
Het ligt er zoals farlane aangeeft hoe je de ID's opslaat, kun je daar wat meer inzicht ingeven? Ik snap niet zo goed wat Strings met dit verhaal te maken hebben.

(overigens ben ik ook wel benieuwd naar de rest van de context ;))

[ Voor 13% gewijzigd door EddoH op 19-02-2016 11:38 ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Is "stukje" 2 onderdeel van ID 0 omdat 2/9 = 0 ? M.a.w. zijn stukjes 0..8 ID0, stukjes 9..17 ID1 etcetera? Dan is het verband dus een simpele deling. Je "positie" is dan simpelweg het restant, 2%9. Die formule met ` ceil` ziet er zwaar verdacht uit.

Anyway, je wil een 9x2 array met ID's, namelijk de eerste 2 ID's voor elke positie. Alle 18 waarden beginnen op -1. Voor een gegeven input X bepaalt je ID en positie (X/9 en X%9). De positie geeft je een array van 2 ID's. Als de eerste waarde -1 is, vervang die door het ID. Zoniet, check de tweede ID. Is die -1, vervang dan de tweede waarde. Zijn beide -1, dan heb je dus de 2 vorige en het huidige ID, samen de 3 die je zoekt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

MSalters schreef op vrijdag 19 februari 2016 @ 13:30:
Anyway, je wil een 9x2 array met ID's, namelijk de eerste 2 ID's voor elke positie. Alle 18 waarden beginnen op -1. Voor een gegeven input X bepaalt je ID en positie (X/9 en X%9). De positie geeft je een array van 2 ID's. Als de eerste waarde -1 is, vervang die door het ID. Zoniet, check de tweede ID. Is die -1, vervang dan de tweede waarde. Zijn beide -1, dan heb je dus de 2 vorige en het huidige ID, samen de 3 die je zoekt.
Zo zou ik het inderdaad ook oplossen.
Eigenlijk roteer je jouw tabel in je post een kwartslag naar links en vul je op positie van de 'x' het ID nummer in:

code:
1
2
3
4
5
6
7
8
9
10
11
"stukje"       "ID's"

  0              1     -1 
  1              4      1
  2              3      3
  3             -1     -1
  4              6      2
  5              2      3
  6             -1     -1
  7              1     -1
  8              3     -1


Blijf ik mij nog steeds afvragen wat je in hemelsnaam aan het implementeren bent :+

Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
ok , ik ga via een PCB(master) via de seriële bus tegen de master zeggen, motor 2, 9, 11, 18, 36, 40, 42
draaien.
de slave's kunnen elk maar 9 motoren adresseren.
dus moet ik op de master dit opsplitsen, in ID's en motororen(stukjes)

dit werkt prima en gaat top.
nu wordt elke keer maximaal 9 motoren (per ID) over de can bus verstuurd naar een desbetreffende slave)
met een paar honderd motoren gaat dit heel erg traag.

dus nu wil ik de bus load verlagen doormiddel van te detecteren hoe vaak motor X word aangesproken
terwijl motor X op verschillende ID's kan zitten.

zodat ik via de master kan zeggen, via een ander adres Let op slave!
0x07 luister!, 0x10 motor 8 draaien!

wat betekent binair 111 oftewel ID 1 , 2 en 3 motor 8 draaien.
het is niet alleen voor motor 8, het zelfde geld voor motor 0, 1, 2, 3 enz

de rest waar dan niet het Motor nummer van overeenkomt word op de standaard manier aangesproken.

op die manier probeer ik dan de can bus load naar beneden te brengen.


ik moet dus op een of andere manier de motornummers tellen hoe vaak deze voorkomt en welk ID daar bij hoort. zodra het ID anders is, en het vaker dan 3x voorkomt (anders is het niet efficient) dan mag ik via het andere adress versturen over de bus.


maar omdat ID een array is, en motornummers ook, raak ik zelf een beetje het overzicht kwijt hoe ik dit moet uitpakken.
zodra ik het woord String, of array zie dan gaan mijn haren al overeind.

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ik heb je post nu 2 keer gelezen. Ik snap niet wat het probleem is, en hoe je het nu aan het optimaliseren bent, maar ik hoop dat je originele probleem is opgelost :+

Voor zover ik begrijp zit moter 0-8 aan slave 0, motor 9-17 aan slave 1, etc. Dus als je motor 10 aan wilt sturen, dan hoef je toch alleen een bericht aan slave 1 (slaveNum = motorNum/9) te sturen?

[ Voor 3% gewijzigd door EddoH op 19-02-2016 15:32 ]


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
EddoH schreef op vrijdag 19 februari 2016 @ 15:21:
Ik heb je post nu 2 keer gelezen. Ik snap niet wat het probleem is, en hoe je het nu aan het optimaliseren bent, maar ik hoop dat je originele probleem is opgelost :+

Voor zover ik begrijp zit moter 0-8 aan slave 0, motor 9-17 aan slave 1, etc. Dus als je motor 10 aan wilt sturen, dan hoef je toch alleen een bericht aan slave 1 te sturen?
dat klopt, 9-17 zit aan slave 1.

als ik dus alleen motor 10 wil, dan stuur ik dat rechtstreeks.

wil ik motor, 0, 18, 36 hebben
dan wil ik een nieuw adress aanmaken, een adress waar de eerste bytes aangeeft welke slaves er mogen luisteren, en daarna in een keer al die motoren adresseren.

zodat ik niet voor elke ID een nieuwe buffer moet versturen.

een gewone adress ziet er als volgt uit

unsigned char Motor_adress[9] = {Request_Action, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, DirectionS};
waar alle 0x00 ingevuld kunnen worden met een bitje dat het om die motor gaat.
het ID is dan de ID van de slave. dit wordt dus verstuurd waneer 1 slave wordt aangestuurd

wil ik nu meerdere tegelijk aanspeken, omdat bijvoorbeeld 5 verschillende ID's dezelfde motor moet worden aangesproken.

dan gebruik ik speciaal adress. elke slave luisterd hier na.
de eerste Bytes in het adress geeft aan welke Slaves hier iets mee moeten doen, en de volgende Bytes geeft aan om welke motoren het gaat.

deze bitjes worden hoog gemaakt waneer 1 motor (stukje) vaker dan 3 keer verstuurd moet worden.


op die manier hoef ik niet voor elke motor het id van de slave appart aan te spreken

[ Voor 12% gewijzigd door itcouldbeanyone op 19-02-2016 15:40 ]

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ik snap nu denk ik wat je wilt bereiken. Echter vraag ik mij af of je niet onnodig moeilijk aan het doen bent en betwijfel ik of de CAN bus de bottleneck is, maargoed.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
Als je baas bent over de slaves die op de CAN bus zitten is er volgens mij een veel simpeler oplossing: laat de slaves weten welke "index" ze hebben ( dus welke motor id's ze sturen ).
Vervolgens definieer je 1 (of meerdere ID's) "MotorOn" die alle CAN slaves ontvangen. Je kunt op die manier per ID 8 * 8 = 64 motoren aan of uit zetten met 1 bericht.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

farlane schreef op vrijdag 19 februari 2016 @ 16:09:
Als je baas bent over de slaves die op de CAN bus zitten is er volgens mij een veel simpeler oplossing: laat de slaves weten welke "index" ze hebben ( dus welke motor id's ze sturen ).
Vervolgens definieer je 1 (of meerdere ID's) "MotorOn" die alle CAN slaves ontvangen. Je kunt op die manier per ID 8 * 8 = 64 motoren aan of uit zetten met 1 bericht.
8 * 7, er is zo te zien nog een Direction parameter. Echter zou je voor direction ook aparte ID's kunnen definiëren. Dan kun je inderdaad met max 2 berichten alle motoren aansturen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
EddoH schreef op vrijdag 19 februari 2016 @ 16:13:
[...]
8 * 7, er is zo te zien nog een Direction parameter.
Oh ja, die had ik even gemist.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
farlane schreef op vrijdag 19 februari 2016 @ 16:09:
Als je baas bent over de slaves die op de CAN bus zitten is er volgens mij een veel simpeler oplossing: laat de slaves weten welke "index" ze hebben ( dus welke motor id's ze sturen ).
Vervolgens definieer je 1 (of meerdere ID's) "MotorOn" die alle CAN slaves ontvangen. Je kunt op die manier per ID 8 * 8 = 64 motoren aan of uit zetten met 1 bericht.
het klopt wat je zegt, alleen moet ik elke keer de slave laten weten welke index ze zitten.
waarom , omdat het een plug and play systeem word.
staat de index van een slave niet vast in zijn memory.
plus het feit dat ik een beperkt aantal COB-ID's kan gebruiken op het bus systeem.


vandaar dat ik ze onafhankelijk, en allemaal tegelijk wil kunnen aansturen.

ik kan dan 32ID's per adresregel aansturen elk 9 motoren
doormiddel van eenmalig een regel te versturen wie er moet luisteren.
en daarna wat ze moeten doen.

[ Voor 4% gewijzigd door itcouldbeanyone op 19-02-2016 16:29 ]

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
itcouldbeanyone schreef op vrijdag 19 februari 2016 @ 16:26:
[...]
het klopt wat je zegt, alleen moet ik elke keer de slave laten weten welke index ze zitten.
waarom , omdat het een plug and play systeem word.
Laat de slaves een heartbeat sturen waar je aan kunt zien welke er zijn. De "master" kan dan op basis van ontvangen heartbeats zien welke slaves er aanwezig zijn, en dus ook welke slaves nog geen index hebben.

Dat je deze methode gebruikt sluit niet uit dat je ze op hun uniek id kunt aansturen natuurlijk.

Ik vind de state die jij dmv je berichtenvolgorde aanbrengt niet echt een goed idee eigenlijk.

[ Voor 16% gewijzigd door farlane op 19-02-2016 16:45 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
farlane schreef op vrijdag 19 februari 2016 @ 16:29:
[...]

Laat de slaves een heartbeat sturen waar je aan kunt zien welke er zijn. De "master" kan dan op basis van ontvangen heartbeats zien welke slaves er aanwezig zijn, en dus ook welke slaves nog geen index hebben.

Dat je deze methode gebruikt sluit niet uit dat je ze op hun uniek id kunt aansturen natuurlijk.

Ik vind de state die jij dmv je berichtenvolgorde aanbrengt niet echt een goed idee eigenlijk.
ik heb het ene en andere aangepast.
als ik een of 2 motoren wil aansturen dan gaat dat gewoon per id.

3 of meer, via de manier die jij omschreef.


ik zoek nu eerst bij elke motor de desbetreffende id en sla dit op in een buffer.
tegelijkertijd tel ik hoe vaak deze situatie voorkomt(dit is dan ook de grootte van de buffer).
las dat vaker dan 3 keer voor komt, dan configureer ik via "bitSet()" de bitjes in een bepaalde byte
de id's die deelnemen voor motor 0.

dit process herhaal ik voor motor 1, 2 enz

en nu heb ik het resultaat wat ik wilde

Thankzz

[ Voor 23% gewijzigd door itcouldbeanyone op 19-02-2016 17:20 ]

Ben niet slim, maar wel dom

Pagina: 1