Programovanie ccs C
Moderátori: psichac, Moderátori
-
- Ultimate člen
- Príspevky: 2581
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: Programovanie ccs C
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
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
To je pravda, lenže s hodnotou sa to nedá skompilovať.
Funkcia preberie iba adresu, nic ine kompilator neberie.
Funkcia preberie iba adresu, nic ine kompilator neberie.
0
Niki31
-
- Stály člen
- Príspevky: 386
- Dátum registrácie: 16 Júl 2019, 14:22
-
- Ultimate člen
- Príspevky: 2581
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: Programovanie ccs C
Kód: Vybrať všetko
(const char *pS)
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
Asi som už pochopil, samozrejme, keď funkcia chce pointer, nemôžete ho takto dereferencovať:niki31 napísal:To je pravda, lenže s hodnotou sa to nedá skompilovať.
Funkcia preberie iba adresu, nic ine kompilator neberie.
Kód: Vybrať všetko
funct2(*pS)
0
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
Bohužiaľ toto (const char *pS) s hviezdičkou to nejde skompilovať. Hlási to že nieje možné zostaviť ukazateľ.
0
Niki31
-
- 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
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");
}
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
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ť.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
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
-
- 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
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.
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í.
-
- Ultimate člen
- Príspevky: 2581
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: Programovanie ccs C
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
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
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
-
- 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
dobre. Daj tam
a daj sem komplet čo kompiluješ. A čo na to povie kompiler
Kód: Vybrať všetko
funct2 (pS);
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
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ť.
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
-
- Pokročilý člen
- Príspevky: 752
- Dátum registrácie: 24 Jún 2010, 00:00
- Bydlisko: Trnava
- Vek: 68
Re: Programovanie ccs C
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.
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.
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
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.
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
-
- Ultimate člen
- Príspevky: 2581
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
používam MPLABX IDE, kompilátor CCS C.
Ale program mi už behá tak už tu nebudem viac obťažovať.
Ale program mi už behá tak už tu nebudem viac obťažovať.
0
Niki31
-
- 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
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á jednoduchoniki31 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ť.
Kód: Vybrať všetko
unsigned char ch;
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í.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- niki31
- Stály člen
- Príspevky: 172
- Dátum registrácie: 05 Feb 2010, 00:00
- Bydlisko: Žilinský kraj
- Vek: 49
Re: Programovanie ccs C
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.
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
-
- Ultimate člen
- Príspevky: 2581
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: Programovanie ccs C
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
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 38 Odpovedí
- 2686 Zobrazení
-
Posledný príspevok od používateľa Lennox