Programiranje

Programiranje u C++-u - pitanja i odgovori

Dex.pwn pet 12.4.2019 18:11
ihush kaže...

pogrešan pristup.. sve pripremiš pa onda zapišeš (može i backup prije..), koristit kao sekvencijalne memorije, ne kao ram.. jer je to eeprom (sporo). Zato se u nromalnom radu i ne koriste romovi nego se kopiraju u ram itd..

tj KISS kaže, što manje čačkanja eeproma, ako je moguće skoro nikad.. za pristup-korištenje koristiti bilo što drugo, sd/flash/ssd... ili ram ako ga ima dovoljno, jer eeprom nije ram.

 

Oke, sad budem koristio SSD s Arduinom.

Napravio sam tako da spremam cache(svaki bajt koji je u EEPROMu) u RAM i prilikom pisanja provjerava da li je vrijednost koju treba zapisati u EEPROM ista kao u cacheu. Ako je, ne zapisuje, ako nije zapiše ju i updatea cache.

CyberK pet 12.4.2019 20:48

unsigned int maska = 0xff;

unsigned int byte0 = broj & maska;
unsigned int byte1 = (broj >> 8) & maska;
unsigned int byte2 = (broj >> 16) & maska;
unsigned int byte3 = (broj >> 24) & maska;

 

Ukratko byte[k] = (broj >> k*8) & maska;

'broj' uzimam da je 32-bitni, za 64 bita vjerojatno koristis 'unsigned long long'.

 

etnes sub 25.5.2019 20:22

Pozdrav!

Imam problem prilikom parsiranja linije. Naime struktura linije je fiksna i prikaza na slici (radi se .pdb formatu za zapis strukture proteina):

 Naravno, odmah sam krenuo koristiti sscanf(), medjutim tijekom citanja, "%4s" nece procitati tocno 4 znakova vec ce zanemariti space-ove i zadati mi probleme (narusiti ostatak parsiranja). probao sam i umjesto "%4s" koristiti "%4[A-Z ]" (sva slova koja ocekujem su velika) medjutim i to mi zbog nekog razloga stvara probleme.

U nastavku je kod koji trenutno imam i slika rezultata. (stavio sam sliku jer imam problema sa formatiranjem koda)

 

 

Linija koju je potrebno isparsirati:

ATOM   238  CA ALEU A  14   -18.441  -9.508  36.673  0.64 12.05      C

 

Linija altLocationIndicator bi trebala biti 'A' dok bi residueName trebao biti "LEU", medjutim 'A' je pobjegao u residueName a 'U' koji je trebao biti zadnje slovo u residueName-u je pobjegao u chainID)

 

 

 

Ako imate neko drugo rjesenje za parsiranje (di se ne koristi sscanf ili nesto sa streamovima), slobodno predlozite. 

 

Nikolacurak uto 28.5.2019 20:48

Zadatak je ucitati n brojeva u nizu i ispisati najmanji.

 

#include <iostream>
using namespace std;
int main(){
int i, n, min=0;
cout<<"Unesi n: ";  /// Ovdje unesem 5
cin>>n;
int niz[n];
for(i=0; i<n; i++){
cin>>niz[i]; /// Upisem 1,2,3,4,5
}
for(i=0; i<n; i++){
if(niz[i]<min){
min=niz[i];
}
}
cout<<min;
}

 

Ako upisem brojeve 1,2,3,4,5 meni ispise 0 umjesto 1

etnes uto 28.5.2019 21:48
andrijam kaže...

Pa jesu li ti tabovi između parametara ili spaceovi? Parametri su uvijek fiksni broj znakova? Zašto sam ne napišeš funkciju koja odrađuje parsiranje?

 Spaceovi. Na kraju sam i napravio svoju funkciju. Mislio sam da mozda nekako mogu iskoristiti vec gotov sscanf

Nikolacurak čet 30.5.2019 14:59

Zadatak je unijeti 10 clanova u niz i ispisati one koji su veci od 5. clana u nizu.

#include <iostream>

using namespace std;

int main()
{
int i;
int niz[10];
for (i=0; i<10; i++){
cin>>niz[i];
}

for (i=0; i<10; i++){
if(niz[i]>niz[4]){
cout<<niz[i];
}
}
return 0;
}

Ovo je moj kod, neki tvrde da u deklaraciji niza int niz[10]; treba pisati 9 umjesto 10. Nisam vise siguran sta je tocno. Upomoc 

PzKpfw čet 30.5.2019 19:48

 

@Nikolacurak

 

O.k., well uneseš 10 elemenata u niz, te ispišeš sve one koji su veći od petog člana niza.

Kôd je O.K., samo ga radi provjere komplajliraj.

 

Ne, u deklaraciji niza ispravno piše. Niz ima deset elemenata, ako tako odrediš. Ako staviš broj 9, onda ima devet elemenata.

Ekipu, kaj počinje učiti zbunjuje to, jer kod polja, odnosno nizova (eng. Arrays), elementi se broje od 0.

Tako da je prvi element niza:niz[0], slijedeći niz[1], te tako  dalje,  niz[n - 1], gdje je n broj elemenata niza.

 

 

 

 

Nikolacurak čet 30.5.2019 21:06

U skoli smo imali blic test i bio je taj zadatak. Uradio sam ovako kako je napisano i ostatak 10 ucenika. Mi smo dobili ocjenu 4. Jedan momak je napisao niz[9]; Profesor je rekao da je njegovo jedino ispravno i on je dobio 5. Ja mislim i dalje da je moje tocno a njegovo krivo. Sljedeci put cu pitat profesora mozda se zabunio

slavenP22 uto 4.6.2019 17:15

Da li moze mala pomoc oko ovoga, napisao sam kod koji radi ali provjerava svaki karakter posebno i ispisuje rjesenje ali me zanima da li bi se ovo pomoci regexa moglo na laksi nacin uraditi?

Da se napravi neki regular expression i da ako se poklapa linija u fajlu sa tim, da izdvaja dijelove tog stringa i racuna izraz?

NAravno sve to treba da se uradi u C-u, pa ako bi mogla pomoc oko toga, bio bih zahvalan.

andrijam čet 4.7.2019 09:59

Napravi si mali test

 

int a[10] = {}; // Inicijalizira sve elemente niza na 0


std::cout << a[0] << std::endl; // 0
std::cout << a[9] << std::endl; // 0
std::cout << a[10] << std::endl; // izbacit će bezvezne brojeve jer pokazuje na vrijednost mem. adrese van niza
std::cout << a[11] << std::endl; // izbacit će bezvezne brojeve jer pokazuje na vrijednost mem. adrese van niza

Graco12 čet 4.7.2019 13:16

Pozdrav!

 

Imam jedan problem ako mi je netko voljan pomoći.

Dakle, radi se o pokazivačima i vezanim listama. Razumijem što su to pokazivači, ali jednostavno ne mogu shvatiti način na koji se primjenjuju u vezanoj listi.

Znači, vezana lista se radi na ovaj način:

 

struct element {

       int vrijednost;

       element *sljedeci;

};

typedef element *lista; 

 

Znači prvo se radi struktura u kojoj se kao jedan od komponenti pojavljuje pokazivač koji pokazuje - na što?

I nakon toga se izvan strukture definira pokazivač tipa te strukture. Ne razumijem na koji način se sada manipulira tom vezanom listom, imam dva pokazivača, a nije mi jasno na što točno pokazuju?

Dex.pwn sub 6.7.2019 22:45

Pozz,

imam čudam problem s Arduino kodom.

Naime, imam array s deset jedan bajtnih vrijednosti(može biti sve to 8 bajta vrijednost) kojeg želim zapisati na EEPROM.

U ovom slučaju nije problem sa zapisivanjem i Arduino funkcijama već u tome da mi ne rastavlja vrijednost dobro.

Ovdje zapravo ne bi ni trebalo rastavljati jer je vrijednost već jedno bajtna.

U slučaju da je array 8 bajtni, vrijednost bi trebalo rastaviti na osam bajtova(u EEPROM se zapisuju bajtovi).

Za vrijednost iz slota nula(test1Byte[0]) dobro odradi posao(da li je slučajno ispalo dobro ili ne to ne znam), no za svaku drugu vrijednost iz arraya(ne samo ovog, već i drugih, ne odradi dobro).

Array u funkciju ide preko pointera. No ako želim ispisati vrijednost arraya u funkciji dobijem neke divlje brojeve.

Zašto? Kod i debug je na pastebinu

 

 

 

https://pastebin.com/M8ZzbRdP

Rastavljanje vrijednosti iz arraya se odrađuje na 34. liniji.

 

 

@EDIT:

Napravio sam jednostavniji primjer

https://pastebin.com/Yakqa00k

Izlaz je

 

260681968260106
10

 

70453687222272
0

0


0

Zašto se to događa?
andrijam ned 7.7.2019 20:43

Zbunjuju te 64bit unsigned integer i kako je posloženo u memoriji. s data[0] ne ispisuješ int8 nego int64 zato dobiješ čudan broj. Ako imaš neki bolji IDE trebao bi moći otvoriti memorijsku adresu na koju pokazuje data u memoriji. Stavio sam privitak. Onda će ti sve biti jasno.  

 

tvoji podaci se nalaza u

0A - 10

14 - 20

1E - 30

 

a s data[0] ispisuješ uint64 =0A141ECCCCCC naravno u decimalnom formatu. A ne int8

 

data[1] ispisuje sljedeći broj iz memorije, drugi crveni krug na slikici.

Dex.pwn ned 7.7.2019 21:33

Pomogao mi je korisnik na Stacku.

Rješenje je ovako:

 

 

void writePage(uint16_t address,char*data,uint8_tconst len){for(uint8_t dataIndex =0; dataIndex < len; dataIndex++){ std::cout <<(int)data[dataIndex]<< std::endl;}}

writePage(0,reinterpret_cast<char*>(&array[0]),sizeof(array));

 

Na koji to način radi, nemam pojma.

Mogao sam još i u funkciji vraćati s uint64_t na original.

saynom pon 22.7.2019 16:33

Pozdrav,

 

Pokušavam riješiti Katu na CodeWars stranici, ali ne uspijevam dobiti dobar rezultat tj.,  ne mogu pronaći bug u svom kodu, pa ako može netko pomoći. Tekst zadatka:

 

Two tortoises named A and B must run a race. A starts with an average speed of 720 feet per hour. Young B knows she runs faster than A, and furthermore has not finished her cabbage.

When she starts, at last, she can see that A has a 70 feet lead but B's speed is 850 feet per hour. How long will it take B to catch A?

More generally: given two speeds v1 (A's speed, integer > 0) and v2 (B's speed, integer > 0) and a lead g (integer > 0) how long will it take B to catch A?

The result will be an array [hour, min, sec] which is the time needed in hours, minutes and seconds (round down to the nearest second) or a string in some languages.

If v1 >= v2 then return nil, nothing, null, None or {-1, -1, -1} for C++, C, Go, Nim, [] for Kotlin or "-1 -1 -1".

Examples: (form of the result depends on the language)

race(720, 850, 70) => [0, 32, 18] or"0 32 18"

race(80, 91, 37) => [3, 21, 49] or "3 21 49"

 

Uglavnom, problem koji mi se pojavljuje je da vrijeme koje dobim, kod mijenjanja formata iz decimalnog u HH:MM:SS, kod nekih test caseova mi je uvijek za sekundu manje od točnog rezultata. Mislim da je problem kod zaokruživanja, ali ne znam u kojem smjeru da idem. Moj (dio) koda:

 

class Tortoise
{
public:
static std::vector<int> race(int v1, int v2, int g)
{
   if (v1 > v2)
     return {-1, -1, -1};

     long double time = (long double)g / ((long double)v2 - v1); // time calc formula


     int hours = (int)time; //0
     long double minutesRemainder = (time - hours) * 60;
     int minutes = minutesRemainder; //32
     long double secondsRemainder = (minutesRemainder - minutes) * 60;
     int seconds = secondsRemainder;

     return { hours, minutes, seconds };
   }
};

 

 

Dex.pwn pon 2.9.2019 22:21

Malo žešći problem jel kod mene ne postoji ništa osim toga.

Radim funkciju koja zapisuje bajtove u EEPROM memoriju(Arduino), no ne koristi se niti jedna Arduino funkcija ovdje, već samo testiram da li sve radi po pitanju C++a

Stvar je da mogu 64 bitne arraye zapisati pomoću page funkcije(tad 32 bajta zapiše u jednom udarcu, inače bi zapisivao 32 puta, a EEPROM se troši/slabi zbog toga).

Page od mog EEPROM čipa je 32 bajta(nebitno). Dakle, array od 10 "mjesta" ima 80(10 * 8), to je 3 stranice(tri puta će zapisivati u EEPROM).

 

Stvar je u tome da funkcija dođe do druge stranice, bajt 44(44. bajt u globalu, no 13. bajt na drugoj stranici) i odjednom se vrati na bajt 0(koji je na prvoj stranici).

Zašto se to događa

Doslovno nigdje nisam taknio granice petlje.

 

https://pastebin.com/ShUdxi5g

https://imgur.com/xyi9IOY

 

Ako bi mogla pomoć

Zahvaljujem

 

@Našao gdje je memory leak bio.

Treba bolje gledati :D

Dex.pwn pet 27.9.2019 13:42

Napravio sam ovaj kod. Uzima string podataka, i njega razbija na pojedine podatke.

Preko sscanfa sam izdvojio ime podatka i vrijednost istog. Sad kad trebam provjeriti da li je podatak taj i taj(znači, ime podatka), provjera ne radi.

Koristim C-string jel će se kod vrtiti na Arduinou koji nema baš puno memorije.

 

 

 

 char data[] = "v 35,rpm 80,temp 25,dist 31051999,vbat 33";
 char *dio;

 dio = strtok(data, ",");

 while (dio != NULL)
 {
  long value = 0;
  char *type;
  printf("%s\n", dio);

  sscanf(dio, "%s %d", type, &value);
  printf("-----Type: %s\n", type);
  printf("-----Value: %d\n\n", value);

  if (type == "temp") printf("Jel vruce lega?\n");

  dio = strtok(NULL, ",");
 }

 

 

Ako bi mogla pomoć mala. Zahvaljujem
Dex.pwn pet 27.9.2019 17:51

Napravio sam sve, radilo je kak treba, no za Arduino sscanf je killer. Previše ROMa zauzima.

Tako da sam odlučio koristiti metodu koju koristim za razdvajanje komandi.

Radi super za prvu komandu, no onda tu stane.

 

 

 char data[] = "v=35,rpm=80,temp=25,dist=31051999,vbat=33";
 char *dataPart;

 dataPart = strtok(data, ",");

 while (dataPart != NULL)
 {
  long cmdValue = 0;
  char *cmd;

  printf("Izdvojeni dio: %s\n", dataPart);

  cmd = strtok(dataPart, "=");
  cmdValue = atoi(strtok(NULL, "="));

  printf("%s | %d\n", cmd, cmdValue);

  printf("Izdvojeni dio OPET: %s\n\n", dataPart);
  dataPart = strtok(NULL, ",");
 }

Izlaz mi je
Izdvojeni dio: v=35
v | 35
Izdvojeni dio OPET: v
Ako bi mogla mala pomoć. Prednostavljam da trebam napraviti "kopiju" ulaznih podataka.