Strana 2 z 3

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 11:02
od používateľa maskrtnik01
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í.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 14:13
od používateľa niki31
To je pravda, lenže s hodnotou sa to nedá skompilovať.
Funkcia preberie iba adresu, nic ine kompilator neberie.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 14:20
od používateľa JohnnyElektro
Predavas adresu pointra, skus volat: funct2(pS);

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 14:26
od používateľa maskrtnik01

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.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 17:00
od používateľa niki31
Bohužiaľ toto (const char *pS) s hviezdičkou to nejde skompilovať. Hlási to že nieje možné zostaviť ukazateľ.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 17:39
od používateľa peterple

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ť.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 20:28
od používateľa niki31
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.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 20:35
od používateľa peterple
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.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 20:43
od používateľa maskrtnik01
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.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 20:50
od používateľa niki31
Niesom slepý, akkýkoľvek iný zápis než (&pS) kompilátor odmieta. buď hlási že nemožno zostaviť ukazateľ alebo internú chybu.

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 20:52
od používateľa peterple
dobre. Daj tam

Kód: Vybrať všetko

funct2 (pS);
a daj sem komplet čo kompiluješ. A čo na to povie kompiler

Re: Programovanie ccs C

Napísané: 27 Aug 2020, 21:46
od používateľa stefanSK
Keď ti prekladač neberie (&pS), tak skús (&pS[0]).

Re: Programovanie ccs C

Napísané: 28 Aug 2020, 12:12
od používateľa niki31
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ť.

Re: Programovanie ccs C

Napísané: 28 Aug 2020, 12:22
od používateľa stefanSK
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.

Re: Programovanie ccs C

Napísané: 28 Aug 2020, 12:33
od používateľa niki31
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.

Re: Programovanie ccs C

Napísané: 28 Aug 2020, 12:48
od používateľa maskrtnik01
Čo to máte za IDE? Je tam zadarmo aspoň demo/trial?

Re: Programovanie ccs C

Napísané: 28 Aug 2020, 15:53
od používateľa niki31
používam MPLABX IDE, kompilátor CCS C.
Ale program mi už behá tak už tu nebudem viac obťažovať.

Re: Programovanie ccs C

Napísané: 28 Aug 2020, 19:49
od používateľa peterple
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í.

Re: Programovanie ccs C

Napísané: 29 Aug 2020, 10:31
od používateľa niki31
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.

Re: Programovanie ccs C

Napísané: 29 Aug 2020, 10:39
od používateľa maskrtnik01
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.