pointery C

Pavel Hudecek edizon na seznam.cz
Středa Květen 22 10:00:22 CEST 2013


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.



Další informace o konferenci Hw-list