/ 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
Array af pointere etc... Hjælp ønskes!
Fra : Brian Ipsen


Dato : 27-05-01 16:49

Hej!

Jeg er kørt fast i min spaghetti-kode, og har behov for hjælp (se
bort fra check på memory etc, det skal nok komme med):

Jeg alllokerer et array af pointere (100 pointere totalt):

char *ptrMyArray;
ptrMyArray=calloc(100,sizeof(char * ));

Jeg skal så have smidt noget data ind i dette array (i et kald til en
subroutine) - og her allokeres memory til den enkelte pointer løbende:

MyFunc(&ptrMyArry);


Hvor MyFunc så ser sådan her ud:

MyFunc(char *myData[])
{
   char *locPtr;
   int cnt;

   for(cnt=0;cnt<100;cnt++)
      {
      locPtr=mydata[cnt];
      locPtr=(char *) malloc(30);
      sprintf(locPtr,"Value %d",cnt);
      }
}

Jeg er klar over, at jeg gør noget fuldstændig forkert, men min hjerne
kan bare ikke gennemskue det lige nu....

Anyone ??

/Brian

 
 
Kent Friis (27-05-2001)
Kommentar
Fra : Kent Friis


Dato : 27-05-01 17:17

Den Sun, 27 May 2001 17:48:42 +0200 skrev Brian Ipsen:
>Hej!
>
> Jeg er kørt fast i min spaghetti-kode, og har behov for hjælp (se
>bort fra check på memory etc, det skal nok komme med):
>
>Jeg alllokerer et array af pointere (100 pointere totalt):
>
>char *ptrMyArray;
>ptrMyArray=calloc(100,sizeof(char * ));
>
>Jeg skal så have smidt noget data ind i dette array (i et kald til en
>subroutine) - og her allokeres memory til den enkelte pointer løbende:
>
>MyFunc(&ptrMyArry);
>
>
>Hvor MyFunc så ser sådan her ud:
>
>MyFunc(char *myData[])
>{
>   char *locPtr;
>   int cnt;
>
>   for(cnt=0;cnt<100;cnt++)
>      {
>      locPtr=mydata[cnt];
>      locPtr=(char *) malloc(30);
>      sprintf(locPtr,"Value %d",cnt);
>      }
>}
>
>Jeg er klar over, at jeg gør noget fuldstændig forkert, men min hjerne
>kan bare ikke gennemskue det lige nu....

Smid locPtr ud - det er den der er problemet...

for(cnt=0;cnt<100;cnt++)
{
   locPtr=mydata[cnt];
   mydata[cnt]=(char *) malloc(30);
   sprintf(mydata[cnt],"Value %d",cnt);
}

Du kan godt lave det på den anden måde, men så skal locPtr være en
char ** (bemærk: 2 stjerner).

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/

Igor V. Rafienko (27-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 27-05-01 17:21

* Brian Ipsen


> Jeg alllokerer et array af pointere (100 pointere totalt):
>
> char *ptrMyArray;
> ptrMyArray=calloc(100,sizeof(char * ));


Nei! Det er mulig du _vil_ at nettopp dette skal skje, men det er
slettes ikke det som står over: ptrMyArray er en char*, _ikke_ en
array av 100 pekere. Dersom du vil variere tallet 100 dynamisk, kan du
prøve dette:

size_t sz = 100U;
char **matrix = malloc( sz * sizeof *matrix );
if ( !matrix )
exit( 1 );

for ( size_t i = 0; i != sz; ++i )
matrix[ i ] = NULL;

(dette bør _naturligvis_ pakkes inn i en funksjon).


> Jeg skal så have smidt noget data ind i dette array (i et kald til
> en subroutine) - og her allokeres memory til den enkelte pointer
> løbende:
>
> MyFunc(&ptrMyArry);


Pga. av feilen over gir dette morsomme effekter, tenker jeg.

/* call it */
MyFunc( matrix, sz );

void
MyFunc( char *matrix[], size_t entries )
{
for ( size_t count = 0; count != entries; ++count ) {
   matrix[ count ] = malloc( 30 );
   if ( !matrix[ count ] )
    exit( 1 );
sprintf( matrix[ count ], "Value %d", (int)count );
}
}


> Hvor MyFunc så ser sådan her ud:
>
> MyFunc(char *myData[])
       ^
[*]

> {
>    char *locPtr;
>    int cnt;
>
>    for(cnt=0;cnt<100;cnt++)
>       {
>       locPtr=mydata[cnt];
          ^

Dette kan umulig kompileres, da [*] har 'D'.


>       locPtr=(char *) malloc(30);
>       sprintf(locPtr,"Value %d",cnt);
>       }


Selv om ptrMyArray var deklarert riktig, ville ikke dette ha fungert:

* locPtr peker først dit som mydata[cnt] peker
* Så lar du locPtr peke på et nytt hukommelsesområdet (og mydata[cnt]
påvirkes naturligvis ikke, da dette er en helt annen variabel).
* Så fyller du dette området med date (men det er fremdeles ingen
forbindelse mellom mydata[cnt] og locPtr:


locPtr malloc( 30 )
+-+ +-------------+
|-|----->|Value 34 |
+-+ +-------------+


ptrMyArray
+-+ <the evil void>
|-----\ ^
+-+ \ |
\ |
myData -> +------------+-----+-------+
+-+ | | | | | ...| cnt | | ... |
|---------> +------------+-----+-------+
+-+ malloc( 100 * sizeof *ptrMyArray );


myData[cnt] forbindes _aldri_ med det området som locPtr peker på
(pga. malloc kallet og manglende tilordning

mydata[cnt] = locPtr;

(legg merke til at den tilordningen som du faktisk gjør er ytterst
meningsløs, da locPtr får en ny verdi på neste linje)).

[snip]


> Anyone ??


Bruk et språk med et litt mindre ødelagt peker/array begrep :)





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste