Programovanie ccs C

C,C++,C#

Moderátori: psichac, Moderátori

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2564
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Programovanie ccs C

Príspevok od používateľa maskrtnik01 » 27 Aug 2020, 11:02

Keďže pS v prvej funkcii už je pointer, pošlite do druhej jeho hodnotu. Ak sa nemýlim, takto tam posielate pointer na pointer, potom adresa samozrejme nesedí.
0

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 27 Aug 2020, 14:13

To je pravda, lenže s hodnotou sa to nedá skompilovať.
Funkcia preberie iba adresu, nic ine kompilator neberie.
0
Niki31

JohnnyElektro
Stály člen
Stály člen
Príspevky: 386
Dátum registrácie: 16 Júl 2019, 14:22

Re: Programovanie ccs C

Príspevok od používateľa JohnnyElektro » 27 Aug 2020, 14:20

Predavas adresu pointra, skus volat: funct2(pS);
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2564
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Programovanie ccs C

Príspevok od používateľa maskrtnik01 » 27 Aug 2020, 14:26

Kód: Vybrať všetko

(const char *pS)
Obidva funkcie majú takto definovaný parameter. Tak prečo by sa nemalo dať skompilovať, keď hodnotu toho pointera(čiže adresu v ňom) pošlete ďalej? Keď pošlete adresu pointera, inak povedané pointer na pointer, jasné že tam bude iná adresa.


Hodil som to do XCode na macOS Catalina, takto sa to správa:

Kód: Vybrať všetko

#include <stdio.h>

void func2(char *ptr)
{
    printf("Address: %p, Value: %c\n",ptr,*ptr);
}
void func1(char *ptr)
{
    printf("Address: %p, Value: %c\n",ptr,*ptr);
    func2(ptr);
}

int main(int argc, const char * argv[]) {
    char c = 'v';
    printf("Address: %p, Value: %c\n",&c,c);
    func1(&c);
    return 0;
}

Kód: Vybrať všetko

Address: 0x7ffeefbff4ef, Value: v
Address: 0x7ffeefbff4ef, Value: v
Address: 0x7ffeefbff4ef, Value: v
-- Spojený príspevok 27 Aug 2020, 13:54 --
niki31 napísal:To je pravda, lenže s hodnotou sa to nedá skompilovať.
Funkcia preberie iba adresu, nic ine kompilator neberie.
Asi som už pochopil, samozrejme, keď funkcia chce pointer, nemôžete ho takto dereferencovať:

Kód: Vybrať všetko

funct2(*pS)
Správne je to v kóde, čo som poslal.
0

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 27 Aug 2020, 17:00

Bohužiaľ toto (const char *pS) s hviezdičkou to nejde skompilovať. Hlási to že nieje možné zostaviť ukazateľ.
0
Niki31

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Programovanie ccs C

Príspevok od používateľa peterple » 27 Aug 2020, 17:39

Kód: Vybrať všetko

void funct1 (const char *pS)
{
	uint16_t str = &pS; //tu str obsahuje správne adresu písmena A. !!!!!! toto nie je pravda
	char chr = *pS; // tu sa do chr správne priradí písmeno A
	funct2 (pS); //tu volám funkciu 2 a chcem jej ako parameter predať reťazec "Ahoj" na ktorý ukazuje pS
}
void funct2 (const char *pS)
{
	uint16_t str = &pS; //tu str obsahuje úplne inú adresu než je pismeno A.
	char chr = *pS; // tu je iný znak než pismeno A
}
main()
{
	funct1("Ahoj");
}
Ty si ale tvrdohlavý. maskrtnik01 ti pošle opravu a ty si hudieš stále svoje.
Tak si nakopni debugger ako som to urobil ja a krokuj. Potom môžeš zbadať to kde sa mýliš.

Kód: Vybrať všetko

	uint16_t str = &pS; //tu str obsahuje správne adresu písmena A. !!!!!! toto nie je pravda
toto nie je pravda ani náhodou. pozri sa do okienok debuggera dole. Adresa textu je 0x100 čo je 256
a do str ti to strčilo číslo 2294 čo je 0x8f6. teda ani náhodou to nie jej adresa toho textu. Čo to je ti tu už tiež vysvetlili (ukazateľ na ukazateľ). Operátor & v tomto prípade vypočíta adresu premennej pS. Teda adresu ukazateľa pS. Tá je lokálna, a je preto niekde v zásobníku - preto také veľké číslo.
Preto nesedí typová kontrola a preto ty to nechce skompilovať. Takže ak tam dáš meno premennej pS a nič viac (ani jej adresu čo sa robí cez &, ani dereferenciu to je zase tá hviezdička) tak to funguje ako má.
Holt pochopiť ukazateľe nie je úplne najľahšie. Preto ich od JAVA vyššie radšej skovali aby ich programátor nemohol používať.
Prílohy
ukazatel.png
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 27 Aug 2020, 20:28

No skompiloval si to v úplne inom kompilátore, tak si dosiahol uplne iné výsledky. Nikto mi tu neposkytol žiadne riešenie, len plno teoretizovania. Na internete som našiel fórum kde sa to riešilo a údajne sa jedná o chybu kompilátora. Plánujem update a uvidím či to pomôže.
0
Niki31

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Programovanie ccs C

Príspevok od používateľa peterple » 27 Aug 2020, 20:35

Si slepý? Ja som ti to dal na zlatom podnose. Presne tvoj kód s umazaným jedným písmenkom. A už je to OK. A k tomu presne ukázaný tvoj omyl v debuggere.
Predo mnou maskrtnik01 a pred ním ešte aj JohnnyElektro.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2564
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Programovanie ccs C

Príspevok od používateľa maskrtnik01 » 27 Aug 2020, 20:43

Plno teoretizovania....smola, pointery sa treba proste naučiť. Predtým než obviníte compiler a budete ho všelijako up/downgradovať, skúste dať preč tie &. Keď to náhodou aj tak nepôjde, potom sa môže riešiť compiler.
0

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 27 Aug 2020, 20:50

Niesom slepý, akkýkoľvek iný zápis než (&pS) kompilátor odmieta. buď hlási že nemožno zostaviť ukazateľ alebo internú chybu.
0
Niki31

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Programovanie ccs C

Príspevok od používateľa peterple » 27 Aug 2020, 20:52

dobre. Daj tam

Kód: Vybrať všetko

funct2 (pS);
a daj sem komplet čo kompiluješ. A čo na to povie kompiler
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Programovanie ccs C

Príspevok od používateľa stefanSK » 27 Aug 2020, 21:46

Keď ti prekladač neberie (&pS), tak skús (&pS[0]).
0
S.K.

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 28 Aug 2020, 12:12

Takže nakoniec to funguje s následovným zápisom:

void funct1 (const char *pS)
{
funct2(*(&pS));
}

void funct2 (const char *pS)
{
char chr = pS;
}

main()
{
funct1("Ahoj");
}

Zistil som že pri volaní funct2 treba predať ukazateľ na adresu prvého znaku stringu. Predtým som to skúšal a nešlo mi to, zistil som že datový typ môže byť len char. Ak zmením typ na nejaký iný už mi to nefunguje. Neviem prečo ale v CCS C je char so znamienkom teda signed, spôsobuje mi to celkom problémy. Zaujíma ma či by to šlo zmeniť.
0
Niki31

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Programovanie ccs C

Príspevok od používateľa stefanSK » 28 Aug 2020, 12:22

Toto ako môže fungovať?
void funct2 (const char *pS)
{
char chr = pS;
}
Veď pS je smerník(adresa) na const char a chr je char (1Byte)!
Asi tam má byť char chr = *pS;

Zápis, čo som ti dal &pS[0] je vlastne adresa na prvý znak v reťazci.
0
S.K.

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 28 Aug 2020, 12:33

Veď pS je adresa prvého znaku v reťazci.

V CCS C je zápis char x = *pS totožný s char x = pS, oba vrátia hodnotu byte kde ukazuje ukazateľ.
Akékoľvek zápisy s hranatými zátvorkami kompilátor neberie.
0
Niki31

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2564
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Programovanie ccs C

Príspevok od používateľa maskrtnik01 » 28 Aug 2020, 12:48

Čo to máte za IDE? Je tam zadarmo aspoň demo/trial?
0

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 28 Aug 2020, 15:53

používam MPLABX IDE, kompilátor CCS C.
Ale program mi už behá tak už tu nebudem viac obťažovať.
0
Niki31

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Programovanie ccs C

Príspevok od používateľa peterple » 28 Aug 2020, 19:49

niki31 napísal: Zistil som že pri volaní funct2 treba predať ukazateľ na adresu prvého znaku stringu. Predtým som to skúšal a nešlo mi to, zistil som že datový typ môže byť len char. Ak zmením typ na nejaký iný už mi to nefunguje. Neviem prečo ale v CCS C je char so znamienkom teda signed, spôsobuje mi to celkom problémy. Zaujíma ma či by to šlo zmeniť.
Neviem ako inde ale u mňa je char tiež signed vo všetkých C prekladačoch čo používam. Pomocť sa tomu dá jednoducho

Kód: Vybrať všetko

unsigned char ch;
Myslím si že nás vodíš za nos. Nainštaloval som si ten kompilátor a to čo som ti navrhoval ja a moji traja predrečníci to kompiluje úplne hravo. Jedinú chybku hodil že nepozná funkciu funct2. Čo je samozrejme pravda lebo je definovaná až po tom čo ju zavolám. To som vyriešil tak že som pred funkciu funct1 prihodil deklaráciu funct2 (normálne sa to robí v headroch ale načo. Tiež som mohol prehodiť obe funkcie a už by to bolo OK.

Nemohol som uveriť že prekladač za peniaze ktorý tvrdí že je na 97% kompatibilný s ANSI C by mal tak diametrálne odlišnú syntax ako si tu prezentoval. Ak ma zase odpálkuješ kecom typu ako prvký krát (že som použil iný kompiler a tam to funguje), napr že tam nemám ten tvoj presný typ procesora, alebo mi tam chyba const tak vezd že mám demo a tvoj procesor je červený a môžem si ho dokúpiť. Čo samozrejme nebudem robiť. Už len preto že sa mi podarilo po pár klikoch vygenerovať nejaký memory fault. Síce to nepadlo, ale veľkú dôveru to teda vo mne nebudí.
Prílohy
ccs_C.png
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Programovanie ccs C

Príspevok od používateľa niki31 » 29 Aug 2020, 10:31

A čím si to debugoval ty chytrák. Takto to šlo skompilovať aj mne inak by som asi nevedel aké mi to vracia hodnoty. V prvej funkcii boli hodnoty správne ale v druhej už nie.
Uniklo ti že ja pracujem s ROM pamäťou, preto tam mám to slovo const. PIC majú oddelenú pamäť dat a programu. Ukazatele do ROM tam fungujú trochu inak, pretože prístup do ROM obstaráva podprogram ktorý generuje virtuálnu adresu. To vidím ako zdroj problémov, nie jazyk C. Skrátka PIC nieje x86.
0
Niki31

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2564
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Programovanie ccs C

Príspevok od používateľa maskrtnik01 » 29 Aug 2020, 10:39

Takže chytrák. No dobre keď máte vyššie vzdelanie ako peterple, pošlite screenshot ako tú chybu vyhadzuje. Keď tam bude taký istý kód ako vám kážeme, potom môžete nadávat.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok