|
| rom/const Fra : Søren Jensen |
Dato : 24-02-05 12:02 |
|
hej
#include <ez8.h>
char test;
char *text[4][3] ={
{"1_A","1_B","1_C"},
{"2_A","2_B","2_C"},
{"2_A","2_B","2_C"},
{"3_A","3_B","3_C"}
};
void main(void)
{
test = *text[1][0];
}
Mit problem er at jeg gerne vil have de enkle tekst strenge til at lægge i
program hukommelsen i stedet for i ram'en.
I min kompiler er der mulighed for at skrive const foran variablen, ex.
const char *text[4][3], men da det er en pointer vil den ikke være men til
det. og så er mit spørgsmål så om der ikke er andre måder hvorpå det er
mulig.
På forhånd tak..
| |
Thorsten Ottosen (24-02-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 24-02-05 12:20 |
|
"Søren Jensen" <x@x.xxx> wrote in message
news:421db4cd$0$33656$edfadb0f@dread16.news.tele.dk...
| hej
|
| #include <ez8.h>
| char test;
| char *text[4][3] ={
| {"1_A","1_B","1_C"},
| {"2_A","2_B","2_C"},
| {"2_A","2_B","2_C"},
| {"3_A","3_B","3_C"}
| };
|
| void main(void)
| {
| test = *text[1][0];
| }
|
| Mit problem er at jeg gerne vil have de enkle tekst strenge til at lægge i
| program hukommelsen i stedet for i ram'en.
| I min kompiler er der mulighed for at skrive const foran variablen, ex.
| const char *text[4][3], men da det er en pointer vil den ikke være men til
| det. og så er mit spørgsmål så om der ikke er andre måder hvorpå det er
| mulig.
tja, mit skud i tågen vil være at du kan prøve med
typedef char array[3]; // lav denne stor nok
array an_array[3][1] = { "fo", "bo", "ba" };
std::cout << an_array[1][0][0]; // skriver 'b'
mvh
-Thorsten
| |
Ivan Johansen (24-02-2005)
| Kommentar Fra : Ivan Johansen |
Dato : 24-02-05 12:28 |
|
Søren Jensen wrote:
> void main(void)
Bemærk at main altid skal returnere int.
> Mit problem er at jeg gerne vil have de enkle tekst strenge til at lægge i
> program hukommelsen i stedet for i ram'en.
Selve tekststrengene ligger sandsynligvis allerede i ROM, men dit array
ligger i RAM. Hvis du vil lægge dit array i ROM skal du skrive:
const char * const text[4][3] ={
{"1_A","1_B","1_C"},
{"2_A","2_B","2_C"},
{"2_A","2_B","2_C"},
{"3_A","3_B","3_C"}
};
Ivan Johansen
| |
Søren Jensen (24-02-2005)
| Kommentar Fra : Søren Jensen |
Dato : 24-02-05 13:23 |
|
"Ivan Johansen" <NG5@Padowan.remove.dk> skrev i en meddelelse
news:421dba3c$0$302$edfadb0f@dread11.news.tele.dk...
> Søren Jensen wrote:
>> void main(void)
>
> Bemærk at main altid skal returnere int.
>
>> Mit problem er at jeg gerne vil have de enkle tekst strenge til at lægge
>> i program hukommelsen i stedet for i ram'en.
>
> Selve tekststrengene ligger sandsynligvis allerede i ROM, men dit array
> ligger i RAM. Hvis du vil lægge dit array i ROM skal du skrive:
> const char * const text[4][3] ={
> {"1_A","1_B","1_C"},
> {"2_A","2_B","2_C"},
> {"2_A","2_B","2_C"},
> {"3_A","3_B","3_C"}
> };
min komplier vil godt være med til. char *const text[4][3]. Men ikke når jeg
bruger const foran char: const char *const text[4][3].
når jeg anvender char *const text[4][3] lægger tekststrengene i ram'en og
array i rom.
| |
Ivan Johansen (24-02-2005)
| Kommentar Fra : Ivan Johansen |
Dato : 24-02-05 14:03 |
|
Søren Jensen wrote:
> min komplier vil godt være med til. char *const text[4][3]. Men ikke når jeg
> bruger const foran char: const char *const text[4][3].
Det lyder underligt. Det må være en fejl i compileren.
> når jeg anvender char *const text[4][3] lægger tekststrengene i ram'en og
> array i rom.
Det undrer mig. Den compiler jeg bruger lægger altid tekststrenge i ROM.
Men det kan der selvfølgelig være forskel på.
Hvis dine strenge altid har nogenlunde samme størrelse (i dit eksempel 4
inklusiv terminering) kan du prøve med:
const char text[4][3][4] ={
{"1_A","1_B","1_C"},
{"2_A","2_B","2_C"},
{"2_A","2_B","2_C"},
{"3_A","3_B","3_C"}
};
Her indeholder dit array teksterne direkte i stedet for en pointer til
teksterne, men det betyder så at hver tekst vil have samme længde.
Ivan Johansen
| |
Søren Jensen (24-02-2005)
| Kommentar Fra : Søren Jensen |
Dato : 24-02-05 14:19 |
|
"Ivan Johansen" <NG5@Padowan.remove.dk> skrev i en meddelelse
news:421dd06f$0$230$edfadb0f@dread11.news.tele.dk...
> Søren Jensen wrote:
>> min komplier vil godt være med til. char *const text[4][3]. Men ikke når
>> jeg bruger const foran char: const char *const text[4][3].
>
> Det lyder underligt. Det må være en fejl i compileren.
>
>> når jeg anvender char *const text[4][3] lægger tekststrengene i ram'en og
>> array i rom.
>
> Det undrer mig. Den compiler jeg bruger lægger altid tekststrenge i ROM.
> Men det kan der selvfølgelig være forskel på.
>
> Hvis dine strenge altid har nogenlunde samme størrelse (i dit eksempel 4
> inklusiv terminering) kan du prøve med:
> const char text[4][3][4] ={
> {"1_A","1_B","1_C"},
> {"2_A","2_B","2_C"},
> {"2_A","2_B","2_C"},
> {"3_A","3_B","3_C"}
> };
>
> Her indeholder dit array teksterne direkte i stedet for en pointer til
> teksterne, men det betyder så at hver tekst vil have samme længde.
>
> Ivan Johansen
Det ser ud til at virke. tak!
det er bare sjovt a man ikke kan få tekststrengen ned i rom'en.
| |
Repzak (24-02-2005)
| Kommentar Fra : Repzak |
Dato : 24-02-05 15:15 |
|
> Det ser ud til at virke. tak!
> det er bare sjovt a man ikke kan få tekststrengen ned i rom'en.
Hej
Jeg syntes at have samme problem den anden dag i keil...
jeg har en function der skriver en string ud på rs232.. alla
void tx_string(char *test)
{}
hvis jeg skriver :
tx_string("Test"); virker det ikke.. men
char variable[] = "test";
tx_string(variable);
det virker...
nok noget af samme koncept, fik ikke debugget mig helt ud af det...
Kasper
| |
Thorsten Ottosen (24-02-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 24-02-05 16:57 |
|
"Repzak" <repzak@GEDhotmail.com> wrote in message
news:421de13a$0$29272$14726298@news.sunsite.dk...
|> Det ser ud til at virke. tak!
| > det er bare sjovt a man ikke kan få tekststrengen ned i rom'en.
|
|
| Hej
|
| Jeg syntes at have samme problem den anden dag i keil...
|
| jeg har en function der skriver en string ud på rs232.. alla
|
| void tx_string(char *test)
| {}
|
| hvis jeg skriver :
|
| tx_string("Test"); virker det ikke.. men
|
|
| char variable[] = "test";
|
| tx_string(variable);
|
| det virker...
|
| nok noget af samme koncept, fik ikke debugget mig helt ud af det...
"test" har typen const char*. Så hvis du ændre function til
tx_string( const char* test );
så burde det virke.
-Thorsten
| |
Bertel Brander (24-02-2005)
| Kommentar Fra : Bertel Brander |
Dato : 24-02-05 20:32 |
|
Thorsten Ottosen wrote:
>
> "test" har typen const char*. Så hvis du ændre function til
>
> tx_string( const char* test );
>
> så burde det virke.
Er det ikke kun i C++ at "text" er const ?
Mig bekendt er den ikke const i C, jeg kunne godt mistænke
Kasper for at programmere i C.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Mogens Hansen (24-02-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 24-02-05 21:19 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:421e2bc7$0$85616$edfadb0f@dread14.news.tele.dk...
[8<8<8<]
> Er det ikke kun i C++ at "text" er const ?
> Mig bekendt er den ikke const i C, jeg kunne godt mistænke
> Kasper for at programmere i C.
I C99 (6.4.5) er det undefined behaviour hvis et program forsøger at ændre
en string litteral.
Det er også tilladt at 2 string litteral kan dele hukommelse:
char* p1 = "Hello World!";
char* p2 = "World!";
Det vil således være helt i orden at den placeres i ROM.
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (24-02-2005)
| Kommentar Fra : Bertel Brander |
Dato : 24-02-05 21:40 |
|
Mogens Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:421e2bc7$0$85616$edfadb0f@dread14.news.tele.dk...
>
> [8<8<8<]
>
>>Er det ikke kun i C++ at "text" er const ?
>>Mig bekendt er den ikke const i C, jeg kunne godt mistænke
>>Kasper for at programmere i C.
>
>
> I C99 (6.4.5) er det undefined behaviour hvis et program forsøger at ændre
> en string litteral.
> Det er også tilladt at 2 string litteral kan dele hukommelse:
> char* p1 = "Hello World!";
> char* p2 = "World!";
>
> Det vil således være helt i orden at den placeres i ROM.
>
Korrekt, men en "string literal" er stadig ikke const i C.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Thorsten Ottosen (24-02-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 24-02-05 23:03 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:421e3b8c$0$311$edfadb0f@dread11.news.tele.dk...
| Mogens Hansen wrote:
| > "Bertel Brander" <bertel@post4.tele.dk> wrote in message
| > news:421e2bc7$0$85616$edfadb0f@dread14.news.tele.dk...
| >
| > [8<8<8<]
| >
| >>Er det ikke kun i C++ at "text" er const ?
| >>Mig bekendt er den ikke const i C, jeg kunne godt mistænke
| >>Kasper for at programmere i C.
| >
| >
| > I C99 (6.4.5) er det undefined behaviour hvis et program forsøger at ændre
| > en string litteral.
| > Det er også tilladt at 2 string litteral kan dele hukommelse:
| > char* p1 = "Hello World!";
| > char* p2 = "World!";
| >
| > Det vil således være helt i orden at den placeres i ROM.
| >
|
| Korrekt, men en "string literal" er stadig ikke const i C.
hm..man kan sige at der er en implicit
convertering til char* (som i C++), men det ændre vel ikke på at du ikke må
skrive til array'et.
const char* p = "foo";
skulle også være fint i c99.
std::cout << typeid( "foo" ).name();
printer char[4] på como4.3.3 og char const [4] på vc7.1. Hm...
-Thorsten
| |
Bertel Brander (25-02-2005)
| Kommentar Fra : Bertel Brander |
Dato : 25-02-05 00:21 |
|
Thorsten Ottosen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:421e3b8c$0$311$edfadb0f@dread11.news.tele.dk...
> | Mogens Hansen wrote:
> | > "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> | > news:421e2bc7$0$85616$edfadb0f@dread14.news.tele.dk...
> | >
> | > [8<8<8<]
> | >
> | >>Er det ikke kun i C++ at "text" er const ?
> | >>Mig bekendt er den ikke const i C, jeg kunne godt mistænke
> | >>Kasper for at programmere i C.
> | >
> | >
> | > I C99 (6.4.5) er det undefined behaviour hvis et program forsøger at ændre
> | > en string litteral.
> | > Det er også tilladt at 2 string litteral kan dele hukommelse:
> | > char* p1 = "Hello World!";
> | > char* p2 = "World!";
> | >
> | > Det vil således være helt i orden at den placeres i ROM.
> | >
> |
> | Korrekt, men en "string literal" er stadig ikke const i C.
>
> hm..man kan sige at der er en implicit
> convertering til char* (som i C++), men det ændre vel ikke på at du ikke må
> skrive til array'et.
Man må ikke skrive til array'et, men typen er ikke const.
Jeg mener ikke at der er en implicit cast.
Jeg lavede for nyligt et lille test program:
#include <iostream>
void t(const char *p)
{
std::cout << "P is const" << std::endl;
}
void t(char *p)
{
std::cout << "P is not const" << std::endl;
}
int main ()
{
t("This is a test");
}
Kompileret med BorlandC, Microsoft Visual C++ 6.0 og Digital Mars
skriver det "P is not const", med g++ skriver der "P i const".
Men jeg mener nu at det er g++ der har ret.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Per Abrahamsen (25-02-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 25-02-05 14:41 |
|
Bertel Brander <bertel@post4.tele.dk> writes:
> Thorsten Ottosen wrote:
>> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
>> news:421e3b8c$0$311$edfadb0f@dread11.news.tele.dk...
>> | Mogens Hansen wrote:
>> | > "Bertel Brander" <bertel@post4.tele.dk> wrote in message
>> | > news:421e2bc7$0$85616$edfadb0f@dread14.news.tele.dk...
>> | >
>> | > [8<8<8<]
>> | >
>> | >>Er det ikke kun i C++ at "text" er const ?
>> | >>Mig bekendt er den ikke const i C, jeg kunne godt mistænke
>> | >>Kasper for at programmere i C.
>> | >
>> | >
>> | > I C99 (6.4.5) er det undefined behaviour hvis et program forsøger at ændre
>> | > en string litteral.
>> | > Det er også tilladt at 2 string litteral kan dele hukommelse:
>> | > char* p1 = "Hello World!";
>> | > char* p2 = "World!";
>> | >
>> | > Det vil således være helt i orden at den placeres i ROM.
>> | >
>> |
>> | Korrekt, men en "string literal" er stadig ikke const i C.
>> hm..man kan sige at der er en implicit
>> convertering til char* (som i C++), men det ændre vel ikke på at du ikke må
>> skrive til array'et.
>
> Man må ikke skrive til array'et, men typen er ikke const.
> Jeg mener ikke at der er en implicit cast.
>
> Jeg lavede for nyligt et lille test program:
>
> #include <iostream>
>
> void t(const char *p)
> {
> std::cout << "P is const" << std::endl;
> }
>
> void t(char *p)
> {
> std::cout << "P is not const" << std::endl;
> }
>
> int main ()
> {
> t("This is a test");
> }
>
> Kompileret med BorlandC, Microsoft Visual C++ 6.0 og Digital Mars
> skriver det "P is not const", med g++ skriver der "P i const".
> Men jeg mener nu at det er g++ der har ret.
Det er g++ der har ret, men det er også C++ og ikke C.
Jeg ved ikke helt om man i ren C kan teste om en string literal har
typen "const char*" med et implicit cast til "char*", eller om den har
typen "char*".
Hvis man bruger en udbidelse som "typeof" der gør det muligt at
skelne, er mit gæt at de alle vil sige typen er "char*".
| |
Per Abrahamsen (26-02-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 26-02-05 08:37 |
|
"Thorsten Ottosen" <nesotto@cs.auc.dk> writes:
> "fooo" har type char[sz] for en værdi af sz
> char[sz] can convertere (decay) til char* og const char*.
Du har selvfølgelig ret i at det er en array, spørgsmålet var om typen
internt i compilerne er const med en særlig implicit konvertering til
ikke-const. Og om man i så fald kan opdage forskellen i C.
| |
|
|