/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste