Jednorozměrné pole
Napsal: 22 dub 2020, 16:51
Ahoj,
chci se zeptat. Mám tento problém (asi s polem), jak mně to je hlášeno od kolegů - uvažuji, jestli není problém právě zde.
Mám nadeklarováno pole o 216 prvků
Nepsal jsem tam 216x0.. To by mělo být všude, ne? Když to vypíši, tak nula je u každého prvku.
Podle mě je někde problém zde v následujícím kódu při nulování. Vlastně to pole pocet slouží jen k tomu, kolikrát uživatel přiložil kartu a prováděl odběr... může až 8x za 600 minut = 10 hodin... až bude p = 600 minut, tak dojde k nulování viz níže: Jenže zde nuluji pouze prvky pole které měly alespoň jeden vstup... ostatní byly nula, tak proč je zase nulovat zpět... ovšem možná toto je právě ta chyba měl bych nulovat vše? Ovšem i při nulování, když vypíšu do Serialu všechny prvnky pole pocet, tak jsou všechny nula... Takže problém nevidím... Přeskočím kod a pokračuji dále.
Zde pokračuji viz další kody - jestliže uživatel měl v cyklu (čas na otevření 40 s a dosáhlo tedy cyklus 1 s = tak se mu přiřadí do pole 8 i když vstupoval jen jednou, tak už poté prostě nevstoupí - přečerpal limit - cyklus je dole). pokud vstupuje poprvé tak se mu z pocet [a] k dané kartě přiřadí 1 viz kod niže
podle vstupu se mu přiřazuje jednotlivý čas: (doba otevření): jinak dodám, že z je nastaveno u všech na 40. Další pole z o 216 prvcich
No a na základě přiřazeného b (to je vlastně čas jak dlouho daná věc zůstane otevřená, tak má být vlastně tak dlouhý odpočet)
viz cykl níže:
Jenže... Někdy dojde prostě k tomu, že má povolený přístup a ihned se to uzavře... tzn okamžitě.. Schváleno, uzavřeno... jako by v cyklu pod b byla přiřazena nula... A já nevím proč.. testuji to v domácím prostředí..
Podle mě problém nastává až při uběhnutí prvních 10 hodin a nulování prvků karet (vlastně nuluji všem přístupy na 0 a přiřazuji všem znova čas 40 s)
Děkuji moc
Edit: s tím časem, že se jim přístup schválí ale pak hned zamítne mi hlásí dle mě většina lidí kteří během 10 hodin právě nevyužili přístup ani jednou.. Uvažuji jestli však pomůže tam dát ještě při nulováni početu do podmínky pocet == 0... Ale jestli to pomůže, když mi to vypisuje že je vše nula..
chci se zeptat. Mám tento problém (asi s polem), jak mně to je hlášeno od kolegů - uvažuji, jestli není problém právě zde.
Mám nadeklarováno pole o 216 prvků
Kód: Vybrat vše
unsigned int pocet [216] = {}; //
Podle mě je někde problém zde v následujícím kódu při nulování. Vlastně to pole pocet slouží jen k tomu, kolikrát uživatel přiložil kartu a prováděl odběr... může až 8x za 600 minut = 10 hodin... až bude p = 600 minut, tak dojde k nulování viz níže: Jenže zde nuluji pouze prvky pole které měly alespoň jeden vstup... ostatní byly nula, tak proč je zase nulovat zpět... ovšem možná toto je právě ta chyba měl bych nulovat vše? Ovšem i při nulování, když vypíšu do Serialu všechny prvnky pole pocet, tak jsou všechny nula... Takže problém nevidím... Přeskočím kod a pokračuji dále.
Kód: Vybrat vše
if (p == 600){
lcd.setCursor (0, 1);
lcd.print(" ");
p = 0;
for (int i = 0; i != length_card; i++) {
if (pocet [i] == 1 || pocet [i] == 2 || pocet [i] == 3 || pocet [i] == 4 || pocet [i] == 5 || pocet [i] == 6 || pocet [i] == 7 || pocet [i] == 8){
pocet [i] = 0;
z [i] = 40;
}
if (pocet [i] == 8) {
card [i] = card [i] - 10;
Serial.print ("card [i] po nulovani: ");
Serial.println (card [i]);
}
Serial.print ("pocet [i] po nulovani: ");
Serial.println (pocet [i]);
Serial.print ("Vraceni z [i] zpet na 40: ");
Serial.println (z [i]);
}
Serial.print ("p po nulovani");
Serial.println (p);
}
Kód: Vybrat vše
if (z[a] == 1){
pocet [a] = 8;
lcd.clear();
lcd.setCursor (0, 0);
lcd.print ("Prekrocen denni");
lcd.setCursor (0, 1);
lcd.print ("limit.");
delay (1500);
break;
}
else
pocet [a]++;
Kód: Vybrat vše
if (pocet [a] == 1)
{
b = 40;
}
if (pocet [a] == 2 && z [a] > 35)
{
b = 35;
}
if (pocet [a] == 3 && z [a] > 30)
{
b = 30;
}
if (pocet [a] == 4 && z [a] > 25)
{
b = 25;
}
if (pocet [a] == 5 && z [a] > 20)
{
b = 20;
}
if (pocet [a] == 6 && z [a] > 15)
{
b = 15;
}
if (pocet [a] == 7 && z [a] > 10)
{
b = 10;
}
if (pocet [a] == 8 && z [a] > 5)
{
b = 5;
}
if (pocet [a] == 8)
{
card [a] = card [a] + 10;
Serial.print ("Card [a]");
Serial.println (card [a]);
}
viz cykl níže:
Kód: Vybrat vše
for (int i = b; i > 0; i = i - 1) {
// Unlock the door and lock it after 5 seconds
digitalWrite(RELAY_IN1, LOW);
digitalWrite(RELAY_IN2, LOW);
digitalWrite(RELAY_IN3, LOW);
digitalWrite(RELAY_IN4, LOW);
digitalWrite (LED_BLUE, HIGH);
/* Serial.println ("Aaaaaaaaaaaa");
Serial.println (a);
Serial.println ("IIIIIIIIII");
Serial.println (i); */
if (i == 1)
z [a] = 1;
Serial.println (i);
g++;
/*cteni = digitalRead (vyp);
Serial.println (cteni);
Serial.println (vyp);
if (cteni == LOW)
{
lcd.setCursor (0,0);
lcd.print (" ");
lcd.setCursor(3, 0);
lcd.print("!Ukonceno!");
Serial.println ("Ukonceno zmacnutim tlacitka");
digitalWrite (LED_YELLOW, HIGH);
delay(300);
digitalWrite (LED_RED, HIGH);
delay(300);
digitalWrite (LED_BLUE, HIGH);
delay(300);
digitalWrite (LED_YELLOW, LOW);
delay(300);
digitalWrite (LED_RED, LOW);
delay(300);
digitalWrite (LED_BLUE, LOW);
delay(300);
// z [a] = i;
break;
}
Jenže... Někdy dojde prostě k tomu, že má povolený přístup a ihned se to uzavře... tzn okamžitě.. Schváleno, uzavřeno... jako by v cyklu pod b byla přiřazena nula... A já nevím proč.. testuji to v domácím prostředí..
Podle mě problém nastává až při uběhnutí prvních 10 hodin a nulování prvků karet (vlastně nuluji všem přístupy na 0 a přiřazuji všem znova čas 40 s)
Děkuji moc
Edit: s tím časem, že se jim přístup schválí ale pak hned zamítne mi hlásí dle mě většina lidí kteří během 10 hodin právě nevyužili přístup ani jednou.. Uvažuji jestli však pomůže tam dát ještě při nulováni početu do podmínky pocet == 0... Ale jestli to pomůže, když mi to vypisuje že je vše nula..