Arduino schéma - arduino.sk

Dopisovanie do poli

Programovanie arduina
Obrázok užívateľa
Príspevky: 43
Registrovaný: Str 25. Feb 2015 22:19:54
Bydlisko: Fintice

Dopisovanie do poli

Poslaťod dzooky » Štv 19. Nov 2015 12:42:08

Pani chcel by som sa opytat ci viem dopisovat hodnoty do pola.

Na zaciatku mam zadefinovane pole takto:
Kód: Vybrať všetko
char *slave_numbers[]={"0901234567"};

Vierm do neho potom v kode podla poziadavky dopisovat dalsie cisla?
Skusam ale nedari sa mi :(

Skusal som nieco take, ale nefunguje mi to, vzdy je tam len to povodne cislo
Kód: Vybrať všetko
slave_numbers[sizeof(slave_numbers)/2] = number;


Any ideas?

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Dopisovanie do poli

Poslaťod budvar10 » Štv 19. Nov 2015 16:59:05

Nie, štandardne sa nedá. Takto definované pole je konštanta a je povedzme umiestnené niekde v pamäti, hneď za ním ale nasleduje niečo iné, čo by si prepísal. Kompilátor chráni konštanty proti prepisu.
Musíš si definovať buď takto:
Kód: Vybrať všetko
char slave_numbers[34];

potom tam dostaneš max. 34 prvkov. GCC myslím dokonca akceptuje aj premennú v počte prvkov.
Iné riešenie je pomocou malloc alebo new.

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Dopisovanie do poli

Poslaťod budvar10 » Štv 19. Nov 2015 17:05:39

Ak chceš prepísať vnútro, to by mohlo ísť cez pomocný pointer, skús toto:
Kód: Vybrať všetko
char *xxx = slave_numbers;

    xxx += 5;
   *xxx = number;

Obrázok užívateľa
Príspevky: 43
Registrovaný: Str 25. Feb 2015 22:19:54
Bydlisko: Fintice

Re: Dopisovanie do poli

Poslaťod dzooky » Štv 19. Nov 2015 22:49:17

Tomu dajak prestavam rozumiet :D
Skusam jenoduchy kod ale s integer.

Kód: Vybrať všetko
#include <SoftwareSerial.h> 

int jmeno[] = {2, 3, 4, 5};


void setup() {
  // put your setup code here, to run once:
jmeno[4]=6;
Serial.begin(9600);

}


void loop() {
  // put your main code here, to run repeatedly:
 
  jmeno[5]=7;
            Serial.println(jmeno[5]);

}


Toto v pohode ide prvok s indexom 5 vypise ze je 7.

Cize integer v pohode doplnilo

Co ma vsak uplne zmietlo bolo, ked som do hlavneho kodu dal vypisat celu premennu cez for a sizeof, kde mi vypisalo ze sizeof(jmeno) je 8 comu nechapem kedze tam mam 6 cisel kazde je na 2 bajtoch takze malo by byt 12 ne 8. Ked som uplne hore doplnil dalsie cislo teda dal int jmeno[] = {2, 3, 4, 5, 6}; uz pisalo 10. Cize sizeof rata velkost povodne zadefinovanu ale hodnotu ulozi a vie vyvolat, WTF?

Príspevky: 74
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Dopisovanie do poli

Poslaťod Robo Ulbricht » Pia 20. Nov 2015 16:21:05

To že ti to C dovolí urobiť neznamená, že to funguje dobre. C nekontroluje presahy pri indexovaní a ako index môžeš dať hocijaké číslo a program to kdesi do RAM zapíše. V C musíš sám striehnuť na to, aby si nezapisoval za rozsah, ktorý si si vyčlenil.

int jmeno[] = {2, 3, 4, 5};
sizeof(jmeno) je preto 8, lebo ti to ráta ako 4*sizeof(int)=4*2=8.

Čiže riešenie tvojho problému s tým poľom textov, nie je triviálne. Osobne by som v tomto prípade ignoroval cele to rátanie cez sizeof a proste si pridal do kódu premennú, kde by som ručne napísal počet záznamov vtedy, keď ich edituješ a vieš, koľko si ich tam zapísal.

Pokiaľ by si chcel robiť takéto veci dynamicky, vo svete väčších kompilátorov existuje knižnica stl a v nej vector, ktorý vie robiť všetky želané operácie. Ale na to nemá Arduino dostatok pamäte, aby vôbec malo zmysel sa na ňom s touto knižnicou zaoberať.

Obrázok užívateľa
Príspevky: 43
Registrovaný: Str 25. Feb 2015 22:19:54
Bydlisko: Fintice

Re: Dopisovanie do poli

Poslaťod dzooky » Pia 20. Nov 2015 17:22:23

Dik za odpoved.
No ono ani tak nejde o sizeof, tu velkost by som si ako hovoris ukladal alebo spocitaval.
Ale chcel som poukazat na to ze pri char pri manualnom vkladani napr slave_numbers[1] = number; mi to neslo ale pri integer islo hoci to potom sizeof s tym nepocitalo

Späť na Software