/ 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
NULL-pointere i konstant datastruktur
Fra : Bertel Lund Hansen


Dato : 09-08-03 11:19

Hej alle

Jeg har et mindre problem som jeg dog allerede har lavet en
work-around til.

Jeg har en struktur med programnavne. Nogen af dem er kendt i
forvejen, men programmet skal kunne håndtere at der dukker nye
op. Derfor har jeg en konstant struktur som jeg ved init() fører
over i en fleksibel ditto.

Jeg fandt ud af at det kunne gøres effektivt ved at den nye
struktur overtog den gamles datahukommelse direkte.

Typedef
=======
typedef struct programtype {
char *name, *displayname;
int users, messages, proggroup;
} programtype;

Konstant struktur:
==============
struct programtype program_const[] = {
"Forte","Forte (Free) Agent",0,0,-1,
"MacSOUP","",0,0,-1,
}

Fleksibel struktur:
==============
struct programtype *program[PROGRAMMAX];
int programmer;

init():
=====
for (nr=0; nr<programmer_const; ++nr)
program[nr]=&program_const[nr];
programmer=programmer_const;


Som det er nu, kommer program[].displayname til at pege på en tom
streng. Jeg forsøgte at få det til at blive en NULL-pointer i
stedet. Er det muligt? Jeg prøvede at skrive sådan:

"MacSOUP",NULL,0,0,-1,

og det kunne både kompileres og afvikles, men pointerne var ikke
NULL.

Det er ikke vildt vigtigt. Vi snakker om et halvt hundrede
overflødige, tomme strenge, men alligevel ...

PS. I behøver ikke kommentere opbygningen af den 'fleksible'
struktur. Den bliver ændret senere.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

 
 
Bertel Brander (09-08-2003)
Kommentar
Fra : Bertel Brander


Dato : 09-08-03 12:00

Bertel Lund Hansen wrote:
> Hej alle
>
> Konstant struktur:
> ==============
> struct programtype program_const[] = {
> "Forte","Forte (Free) Agent",0,0,-1,
> "MacSOUP","",0,0,-1,
> }
Det er lettere at undgå fejl i sådanne strukturer hvis man skriver:
struct programtype program_const[] =
{
{"Forte","Forte (Free) Agent",0,0,-1},
{"MacSOUP",NULL,0,0,-1}
};
Så slipper man også for at få warnings fra kompileren.
> Som det er nu, kommer program[].displayname til at pege på en tom
> streng. Jeg forsøgte at få det til at blive en NULL-pointer i
> stedet. Er det muligt? Jeg prøvede at skrive sådan:
>
> "MacSOUP",NULL,0,0,-1,
>
> og det kunne både kompileres og afvikles, men pointerne var ikke
> NULL.
>
Det forstår jeg ikke, den burde være NULL. Hvordan ved du at den ikke
er 0?

/b


Bertel Lund Hansen (09-08-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-08-03 13:09

Bertel Brander skrev:

>> "MacSOUP",NULL,0,0,-1,

>> og det kunne både kompileres og afvikles, men pointerne var ikke
>> NULL.

>Det forstår jeg ikke, den burde være NULL. Hvordan ved du at den ikke
>er 0?

Fordi den test jeg brugte ved udskriften, ikke virkede. Den var
lavet sådan her:

name=program[nr]->displayname;
if (!name) name=program[nr]->name;

Og den udskrev bare et mystisk tegn. Nu bruger jeg:

name=program[nr]->displayname;
if (*name==0) name=program[nr]->name;

og det virker (fordi en 'tom' pointer peger på "").

Compileren er Borlands gratis 5.5'er.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Igor V. Rafienko (09-08-2003)
Kommentar
Fra : Igor V. Rafienko


Dato : 09-08-03 13:48

[ Bertel Lund Hansen ]

[ ... ]

> Fordi den test jeg brugte ved udskriften, ikke virkede. Den var
> lavet sådan her:


Jeg får ikke reprodusert problemet. Kan du lage den minste kodebiten
som illustrerer denne situasjonen?





ivr
--
<html><form><input type crash></form></html>

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408186
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste