pointery C
Miroslav Draxal
evik na volny.cz
Středa Květen 22 10:14:15 CEST 2013
Neprotestuje,
Už to překládá
! pTest++; // = &DateTime.mesic;
0x158E: INFSNZ quotient, F, ACCESS
0x1590: INCF counter, F, ACCESS
Ono tam je strašně moc "nastavovátek" někdy až podle mého nelogických. Třeba
jsem dělal s EEPROM a né a né to rozjet. Vždy to zoptymalozovalo jako movlw
0. Už jsem byl z toho zoufale, pak si prošel nastavení linkeru a tam je
volba "Link in Peripheral Library" a v MPLABx je to defaultně vyplé. Tak to
pro všechny, kdyby se s tím setkali.
Míra
From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On
Behalf Of Pavel Hudecek
Sent: Wednesday, May 22, 2013 10:00 AM
To: HW-news
Subject: Re: pointery C
No jestli ta RAM je stránkovaná, tzn. s prostou inkrementací by to nešlo ani
v asm, tak je možné, že to překladač taky neumí.
Neprotestuje, když nadeklarujete jednorozměrné pole velké nad 256 B?
PH
From: "Miroslav Draxal" evik na volny.cz
Doufám, že nevadí kousek kódu.
Nejprve si jednou nastavím začátek bufferu adresu do ukazatele, a pak jí
pouze inkrementuji. Nemůže být problém v tomhle? Jakmile to přeteče
adresování 255, tak to neskočí do další stránky. Míra
for (Program = 0; Program <= 2; Program++)
{
pTest = (char*) &ProgramRAM[Program][RAM_AutoMesic];
if ((*((_ProgramEEprom*) pTest)).Mesic == 0 ||
(*((_ProgramEEprom*) pTest)).Mesic > 12)//kontrola mezí
(*((_ProgramEEprom*) pTest)).Mesic = 1;
tmp = (*((_ProgramEEprom*) pTest)).Mesic;
pTest++; //RAM_Den
if (*pTest == 0)
*pTest = 1;
else if (*pTest > MesicDnu [tmp])
* pTest = MesicDnu [tmp];
pTest++; //RAM_Hodin
if (*pTest > 23)
*pTest = 0;
pTest++; //RAM_Minut
if (*pTest > 59)
*pTest = 0;
pTest++; //RAM_ZaDnu
if (*pTest > RAM_ZaDnuMaxSet)
*pTest = 0;
pTest++; //RAM_CyklProgram
if (*pTest > RAM_CyklProgMaxSet)
*pTest = 0;
for (ProgPolSekce = 0; ProgPolSekce <= MaxProgPolSekce;
ProgPolSekce++)
{
pTest++; //RAM_CisloSekce
if (*pTest > PocetSekci)//test číslo sekce
*pTest = 1;
pTest++; //test čas sekce
if (*pTest > CasSekceMax)
*pTest = 1;
tmp = *pTest;
pTest++; //test čas čerpadla sekce
if (*pTest > tmp)
*pTest = tmp;
pTest++; //test čas prolnutí pauza
if ((*((_ProgramEEprom*) pTest)).ProlnutiPauza.cas >
CasSekceMax)
*pTest = 0; //neber v úvahu prolnutí/pauza -
nastav natvrdo na pauza OFF
tmp = (*((_ProgramEEprom*) pTest)).ProlnutiPauza.cas;
pTest++; //test čerpadlo prolnutí
if (*pTest > tmp)
*pTest = tmp;
}
}
}
Behalf Of Ladislav Vaiz
Normu jsem nečetl, třeba k tomu Jano nebo Ced dodají něco zajímavého,
ale v praxi to není pravda, viz Debian AMD64:
checking size of char... 1
checking size of short... 2
checking size of int... 4
checking size of long... 8
checking size of long long... 8
checking size of void *... 8
Pavel Hudecek napsal(a):
> To je nějaké divné. Pointer by měl být vždy int, ať už ukazuje na
> cokoli. Int je právě tak definován: Typ určený k adresování na dané
> platformě, akorát navíc se znaménkem. Proto má na různých platformách
> různý počet bitů.
>
> Ale třeba je to v Hitecu jinak.
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
__________ Informace od ESET NOD32 Antivirus, verze databaze 8359 (20130521)
__________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
__________ Informace od ESET NOD32 Antivirus, verze databaze 8359 (20130521)
__________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130522/d53cd18a/attachment.htm>
Další informace o konferenci Hw-list