Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno C++, pole konstant, předání parametrů, jak na to?

Ahoj.... mám v tom hokej, přímo NHL...
potřebuju udělat něco takovýho:


const char pole1[] PROGMEM={1,2,3,4,5};
const char pole2[] PROGMEM={6,7,8,9,0};
const char pole3[] PROGMEM={a,s,d,f,g};

void ctipole(int pole) {
  for(byte i=0; i<5; i++) {
    byte hodnota=pgm_read_byte(&pole[i]);
    //nějaké další akce....
  }
}

int main(void) {
  ctipole(*pole1);
  ctipole(*pole2);
  ctipole(*pole3);
}   

kompilátor mě s tím posílá do prdele a já nevím jak to udělat, kde dát *, &, kde dát int nebo byte nebo co vlastně...
Když to napíšu takhle:


....
void ctipole() {
  for(byte i=0; i<5; i++) {
    byte hodnota=pgm_read_byte(&pole1[i]);
    //další akce...
  }
}

tak to chodí. Jenže to bych musel psát tři podprogramy pro jednu a tu samou věc, která se liší jen ukazatelem na pole konstant

Jak 100hoven?

Předmět Autor Datum
* je pointer na premennú. Pomocou hvezdičky ukazuješ na miesto v pamäti a nie priamo na hodnotu (res…
Mlocik97 03.07.2018 11:58
Mlocik97
#include <iostream> const char* A[][5] PROGMEM = { {1,2,3,4,5}, {6,7,8,9,0}, {a,s,d,f,g} // aby byl…
Mlocik97 03.07.2018 12:22
Mlocik97
Mlocika si nevsimej. I kdyby ti tvuj kompilator prelozil tu blbost, kde micha chary a inty prelozil,…
vladah 03.07.2018 13:22
vladah
Ja to tak napsal z dôvodu že neviem čo chce dosiahnuť a akého dátového typu mať pole. Možno fakt chc…
Mlocik97 03.07.2018 13:25
Mlocik97
neviem čo chce dosiahnuť tak sem nepis
vladah 03.07.2018 13:26
vladah
Nepýtala sa na dátový typ ale na pointre a prechádzanie polom. I kdyby tak môj kód je funkčný a jedi…
Mlocik97 03.07.2018 13:28
Mlocik97
"polom"? Já tam vidím tři. To dělá tvůj kód k ničemu. Co kdyby chtěla jiné datové typy? Co kdyby cha…
vladah 03.07.2018 13:30
vladah
ja v mojom kóde vidím jedno 2D pole s "3 vnorenými" "podpolami". Myslím že v pohode to vie nahradiť…
Mlocik97 03.07.2018 13:32
Mlocik97
Ano, tvoje krásně nekompilovatelné pole. {1,2,3,4,5}, {6,7,8,9,0}, {a,s,d,f,g} ukazuje, jak vnímáš…
vladah 03.07.2018 13:35
vladah
Moje pole je kompilovatelné. Když chci do charu uložiť číslo trebárs 72 tak uložím znak "H", to skôr…
Mlocik97 03.07.2018 13:40
Mlocik97
Zkusim to jinak, treba to pochopis takhle. char c = a; Dava ti to smysl? A co treba tohle? char c…
vladah 03.07.2018 13:45
vladah
samozrejme že to rozdiel je.... v prvom prípade ukladáš do c hodnotu premennej a, v druhom prípade h…
Mlocik97 03.07.2018 13:46
Mlocik97
Jen pro tebe puso :-) http://cpp.sh/6g5zj
vladah 03.07.2018 13:55
vladah
to som ale nenapsal. to že si tam už sám pridal "int" je pak jasné že to už fungovať nebude. kto pov…
Mlocik97 03.07.2018 13:57
Mlocik97
https://www.arduino.cc/reference/en/language/variables/data-types/byte/ porad jeste nechapes, ze to…
vladah 03.07.2018 14:02
vladah
To je veľký roblém zmeniť dátové typy, resp. rozdeliť pole v prípade že nejaká časť hodnot má byť in…
Mlocik97 03.07.2018 13:37
Mlocik97
#include <iostream> #include <string> const int pole[] = {1,2,3,4,5}; void ctiPole(const int *pole)…
MaSo 03.07.2018 13:36
MaSo
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
vladah 03.07.2018 13:41
vladah
ufff... Jediné čeho chci dosáhnout je předat adresu konkrétního pole konstant podprogramu, tak abych…
mia 03.07.2018 13:44
mia
const char pole1[] PROGMEM={ 1, 2, 3, 4, 5}; const char pole2[] PROGMEM={ 6, 7, 8, 9, 0}; const char…
vladah 03.07.2018 13:48
vladah
int main(void) { ctipole(pole1); ctipole(pole2); ctipole(pole3); } sa mi zdá ako zbytočné opakovani…
Mlocik97 03.07.2018 13:52
Mlocik97
Možná se zkus nesoustředit jenom na mě, ale třeba i na tazatele :-) int main(void) { ..... if(podmi…
vladah 03.07.2018 13:56
vladah
Máš to marný, tohle přerostlý děcko chce a musí být středem pozornosti, jakmile ji nemá, začne ti mí…
Killer of amphibians 03.07.2018 14:00
Killer of amphibians
Ty čská nudle choď do piče :-) zasedlej týpek.... čo dislikuje len preto že mám za nickom číslo vätš…
Mlocik97 03.07.2018 14:02
Mlocik97
Nebo co? Hodláš mi vyhrožovat? Jediný se tu chováš jako pablb a jediný porušuješ pravidla fóra, já s…
Killer of amphibians 03.07.2018 14:04
Killer of amphibians
tebe fakt dobre jebe.... ;-) ostatne tys porušil pravidlá fóra už toľko krát taky... a nie len to,..…
Mlocik97 03.07.2018 14:06
Mlocik97
Oneskorená puberta? poslední
pozorovateľ 03.07.2018 16:45
pozorovateľ
Když som to psal tak tazatel nepísal nič o tom že by nechcel jednotlivé polia použiť naraz. To napsa…
Mlocik97 03.07.2018 14:02
Mlocik97
Mel jsem predtim jenom pocit, ze tady celou dobu jenom trollujes, ale ted uz to vim jiste. Nikdo nem…
vladah 03.07.2018 14:05
vladah
To som psal k tvojmu kódu nie ku kódu tazatele. Chápeš? Neviem kto je tady tupý. Ostatne pravda, kdy…
Mlocik97 03.07.2018 14:09
Mlocik97
Já bych to neudělal, pokud bys nenapsal blbost. Nebo kdybys alespoň odpověděl na otázku. PS: všiml…
vladah 03.07.2018 14:27
vladah
Aby si nezačal stěžovat, že ho diskriminuješ prosím tě :D
Killer of amphibians 03.07.2018 14:50
Killer of amphibians
ano, tohle funguje, jen ve "void ctipole (int *pole)" nesmí být (int *pole) ale (const char *pole),…
mia 03.07.2018 15:33
mia
Takže som správne napsal s tým char* .... vladah napíšeš mi niečo k tomuto? inak som rád že to tazat…
Mlocik97 03.07.2018 16:06
Mlocik97

* je pointer na premennú. Pomocou hvezdičky ukazuješ na miesto v pamäti a nie priamo na hodnotu (resp. adressa je taky len premenná v pamäti a ak teda neco ukladáš na určité miesto v pämeti, musíš čítať práve z toho miesta, bez hviezdičky by si prečítala hodnotu premennej ktorá obsahuje adressu pamäte kde sa nachádza vieľová premenná)... v prípade & práce získavaš adressu a dostávaš sa k hodnote premennej. & využiješ typicky pri čítaní dat.

vo for cykle takmer furt používam size_t. Ak máš compare tak vždy musia byť obe value stejného typu. Pretypovanie deláš spôsobom:

int i = 36;
char c = (char)i;

sú to základy.

Inak pre tvoj prípad prechádzanie viacerými polami alebo viac rozmernými polami je vhodné do seba zanoriť niekoľko for cyklov (koľko ich je potreba).

Tento obrázok ti objasní čo pointer je:

[pointer_memory_representation.png]

v C++ je to podobne / rovnako.

#include <iostream>

const char* A[][5] PROGMEM = {
  {1,2,3,4,5},
  {6,7,8,9,0},
  {a,s,d,f,g} // aby byl týpek podomňou spokojenej, tak dodám že ak a, s, d, f, g nie sú premenné (resp. konštanty a pod.) ale ak chceš hodnotu rovnej danému písmenu uložiť do tochto poľa tak všetky písmená obal medzi apostrofi.
}

void readA(){
  for (size_t i = 0; i < 3; i++) {
    for (size_t j = 0; j < 5; j++) {
      byte hodnota=pgm_read_byte(A[i][j]);
      // ďalší akce
    }
  }
}

int main(void) {
  readA();
  return 0;
}

neco som napsal, neskúšal či funguje.
tie byte a PROGMEM máš asi definované v nejakej knižnici či inom .h súbore.

(sry za chyby (a nezmyslnosti v #1) a že to som napsal tak sakra pomalu ale ešte som len vstal z postele a na mobilu to psát taky není zábava).

Mlocika si nevsimej. I kdyby ti tvuj kompilator prelozil tu blbost, kde micha chary a inty prelozil, rozhodne bych to nedoporucil. Pohybuju se spíše v C#, ale co tak koukam, tak v metode ctipole musis prijimat pointer. Tzn. místo "int pole", napis "int *pole" a pak do ty metody posli to pole bez *. To co ty tam ted delas je to, ze prijimas hodnotu a posilas tam prvni prvek toho pole (coz nemuze ocividne fungovat, uz jenom proto, ze to chces tahat z progmem)

Ja to tak napsal z dôvodu že neviem čo chce dosiahnuť a akého dátového typu mať pole. Možno fakt chce pracovať s tými špeciálnymi znakmi ako SOH, STX, ETX.... neviem čo má byť cieľom programu tak som dátový typ pola nemenil, iba logiku / zvyšok. Mne celé to prijde divné.

ja v mojom kóde vidím jedno 2D pole s "3 vnorenými" "podpolami". Myslím že v pohode to vie nahradiť 2D polom. Ak to tak ovšem nechce tak si to vie upraviť. Ostatne stále som poradil viac než ty čo len tu pičuješ. A ani ty nevieš čo vlastne chce spraviť, takže nemôžeš tvriť že to mám špatne, nič bližšie nenapísala k tomu než kód a pár vecí o hviezdičkach. Takže sa neozývaj. V druhej časti píše že jej to spôsobom cez 3 funkce funguje, takže zrejme to skutočne chce ako char.

Moje pole je kompilovatelné. Když chci do charu uložiť číslo trebárs 72 tak uložím znak "H", to skôr nevnímaš ty dátové typy. A jak my vysvetlíš že jej:

const char pole1[] PROGMEM={1,2,3,4,5};
const char pole2[] PROGMEM={6,7,8,9,0};
const char pole3[] PROGMEM={a,s,d,f,g};

skompilovalo? když stále nenapsala že čo má program robiť tak nič nemôžeš tvrdiť.

samozrejme že to rozdiel je.... v prvom prípade ukladáš do c hodnotu premennej a, v druhom prípade hodnotu rovnej písmenu a. Ale prečítaj si "zadanie". Je to len úrivok kódu, neviem čo sa nachádza pred tým kódom. A nevieš ani ty. Takže nemôžeš čokoľvek tvrdiť. Pridal som do kódu koment, snaď si pokojenej.

To je veľký roblém zmeniť dátové typy, resp. rozdeliť pole v prípade že nejaká časť hodnot má byť iného dátového typu než zvyšok? hmm. Na to se neptala. Ostatne jej to funguje když to má rozdelené do 3 funkcií a všade má stejný typ. takže je jasné že to tak chce.

ufff... Jediné čeho chci dosáhnout je předat adresu konkrétního pole konstant podprogramu, tak abych mohl podprogram volat z mainu kdykoliv a v závorce mu předat z čeho má číst. Takže vícerozměrné pole nechci, protože nebudu konstanty číst najednou ale různě, v závislosti např výsledku podmínky...


int main(void) {
.....
  if(podminka) ctipole(pole1);
  if(jinapodminka) ctipole(pole3);
.....
}

v ctipole() v cyklu bych použil for(byte i=0; i<sizeof(pole); i++)

cout neznám, půjde to použít pro vyčtení hodnoty z FLASH paměti? (pole je v PROGMEM)

const char pole1[] PROGMEM={ 1, 2, 3, 4, 5};
const char pole2[] PROGMEM={ 6, 7, 8, 9, 0};
const char pole3[] PROGMEM={ 'a', 's', 'd', 'f', 'g'};

void ctipole(int *pole) {
  for(byte i=0; i<5; i++) {
    byte hodnota=pgm_read_byte(&pole[i]);
    //nějaké další akce....
  }
}

int main(void) {
  ctipole(pole1);
  ctipole(pole2);
  ctipole(pole3);
}

viz. moje prvni odpoved.

int main(void) {
  ctipole(pole1);
  ctipole(pole2);
  ctipole(pole3);
}

sa mi zdá ako zbytočné opakovanie,... čo tak for cyklus a "číslo pola" dosadzovať z indexu cyklu for? (i když ak to budú stále len 3 "čítania" tak pre také množstvo je to ešte ok.

Máš to marný, tohle přerostlý děcko chce a musí být středem pozornosti, jakmile ji nemá, začne ti mínuskovat komentáře :D Prostě poraď tazateli a na Mloka se vykašli, je to šašek co nic neumí a do všech rýpe.

Nebo co? Hodláš mi vyhrožovat? Jediný se tu chováš jako pablb a jediný porušuješ pravidla fóra, já si jen počkám :) Užívej dne Mloku, karma tě stejně dostane ;) (Btw jsem rád že si už začal nadávat, alespoň se konečně vybarvuješ :)))

tebe fakt dobre jebe.... ;-) ostatne tys porušil pravidlá fóra už toľko krát taky... a nie len to,... hanovenie národnosti ti taky nic nevraví, ešte stále si myslíš že jsem čech? Ty seš už vyfarbil úplne. Čo si zatím poradil ty? celú dobu v tomto vlákne len pičujete. A ty nudle pičuješ v každom vlákne a nič neradíš.

Když som to psal tak tazatel nepísal nič o tom že by nechcel jednotlivé polia použiť naraz. To napsal kedy? už dávno potom. Ostatne po tom čo dodal tazateľ že bude tie poľa čítať nezávysle na sebe tak pak áno súhlasím že 2D tam použiť je nie nemožné ale zbytočne problematické.

To som psal k tvojmu kódu nie ku kódu tazatele. Chápeš? Neviem kto je tady tupý. Ostatne pravda, když som psal ten jeden konkrétny príspevok som ešte nemal prečítaný koment od tazatele. OK uznávam že v prípade toho jedneho komentu som to napsal blbo, i když to je rovnako blbo napsané v tvojom kóde. Za to ovšem nemusíš hneď útočiť. Kdybys nezaútočil na mňa hneď v prvom príspevku celé by toto tu vyzeralo inak :-)

Já bych to neudělal, pokud bys nenapsal blbost. Nebo kdybys alespoň odpověděl na otázku.

PS: všiml jsem si, že kromě dislajkování všech mých komentářů, jsi opravil všechny ty své. To by odpovídalo tomu, že píšeš první blbost co tě napadne. Není divu, že pak vybleješ to, co jsi vyblil nahoře :-)
Nejhorší pak je, že si to za každou cenu pak snažíš obhajovat.

Zpět do poradny Odpovědět na původní otázku Nahoru