/ 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
arrays til og fra funktioner
Fra : René


Dato : 25-07-09 04:29

Hejsa

Jeg sidder og bakser lidt med noget c. Jeg har lidt bøvl med et array
af unsigned chars (en "tekststreng") der skal sendes til en funktion,
og modificeres.

min funktion:
unsigned char RTC_getTime(unsigned char *time[])
{
   unsigned char errorStatus;
   unsigned char ret_time[10];

   errorStatus = RTC_read();
   if(errorStatus!=0)
      return(errorStatus);

   ret_time[9] = 0x00;
   ret_time[8] = ' ';
   ret_time[7] = (SECONDS & 0x0f) | 0x30; // seconds (1's)
   ret_time[6] = ((SECONDS & 0x70) >> 4) | 0x30;
   ret_time[5] = ':';

   ret_time[4] = (MINUTES & 0x0f) | 0x30;   // min. (1's)
   ret_time[3] = ((MINUTES & 0x70) >> 4) | 0x30;
   ret_time[2] = ':';
   ret_time[1] = (HOURS & 0x0f) | 0x30; // hours (1's)
   ret_time[0] = ((HOURS & 0x30) >> 4) | 0x30;

      *time = ret_time;
   return(0);
}



unsigned char time[10];
unsigned char errorCode;

Her giver den en warning under kompilering:
if((errorCode=RTC_getTime(&time)) == 0)
.../display.c:79: warning: passing argument 1 of 'RTC_getTime' from
incompatible pointer type

Hvad gør jeg forkert ?
Mvh
René

 
 
René (25-07-2009)
Kommentar
Fra : René


Dato : 25-07-09 04:57

On 25 Jul., 12:28, René <tan...@get2net.dk> wrote:
> Hejsa
>
> Jeg sidder og bakser lidt med noget c. Jeg har lidt bøvl med et array
> af unsigned chars (en "tekststreng") der skal sendes til en funktion,
> og modificeres.
>
> min funktion:
> unsigned char RTC_getTime(unsigned char *time[])
> {
>         unsigned char errorStatus;
>         unsigned char ret_time[10];
>
>         errorStatus = RTC_read();
>         if(errorStatus!=0)
>                 return(errorStatus);
>
>         ret_time[9] = 0x00;
>         ret_time[8] = ' ';
>         ret_time[7] = (SECONDS & 0x0f) | 0x30; // seconds (1's)
>         ret_time[6] = ((SECONDS & 0x70) >> 4) | 0x30;
>         ret_time[5] = ':';
>
>         ret_time[4] = (MINUTES & 0x0f) | 0x30;      // min. (1's)
>         ret_time[3] = ((MINUTES & 0x70) >> 4) | 0x30;
>         ret_time[2] = ':';
>         ret_time[1] = (HOURS & 0x0f) | 0x30; // hours (1's)
>         ret_time[0] = ((HOURS & 0x30) >> 4) | 0x30;
>
>                 *time = ret_time;
>         return(0);
>
> }
>
> unsigned char time[10];
> unsigned char errorCode;
>
> Her giver den en warning under kompilering:
>    if((errorCode=RTC_getTime(&time)) == 0)
> ../display.c:79: warning: passing argument 1 of 'RTC_getTime' from
> incompatible pointer type
>
> Hvad gør jeg forkert ?
> Mvh
> René

Jeg fandt ud af at jeg ikke behøvede at gå via pointers men kunne
sende arrays direkte som argumenter.
Det ser ud til at virke.
Mvh
René

Bertel Lund Hansen (25-07-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-07-09 12:33

René skrev:

> Jeg fandt ud af at jeg ikke behøvede at gå via pointers men kunne
> sende arrays direkte som argumenter.

Disse to erklæringer er ens:

   unsigned char RTC_getTime (unsigned char *time)

   unsigned char RTC_getTime (unsigned char time[])

Læs mit andet svar. Du har et indbygget problem selv om det ser
ud til at virke.

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

Bertel Lund Hansen (25-07-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-07-09 12:06

René skrev:

> unsigned char RTC_getTime(unsigned char *time[]) {
>    unsigned char errorStatus;
>    unsigned char ret_time[10];
>
>    errorStatus = RTC_read();
>    if(errorStatus!=0)
>       return(errorStatus);
>
>    ret_time[9] = 0x00;
>    ret_time[8] = ' ';
>    ret_time[7] = (SECONDS & 0x0f) | 0x30; // seconds (1's)
>    ret_time[6] = ((SECONDS & 0x70) >> 4) | 0x30;
>    ret_time[5] = ':';
>
>    ret_time[4] = (MINUTES & 0x0f) | 0x30;   // min. (1's)
>    ret_time[3] = ((MINUTES & 0x70) >> 4) | 0x30;
>    ret_time[2] = ':';
>    ret_time[1] = (HOURS & 0x0f) | 0x30; // hours (1's)
>    ret_time[0] = ((HOURS & 0x30) >> 4) | 0x30;
>
>       *time = ret_time;
>    return(0);
> }

> unsigned char time[10];
> unsigned char errorCode;

> Her giver den en warning under kompilering:
> if((errorCode=RTC_getTime(&time)) == 0)
> ../display.c:79: warning: passing argument 1 of 'RTC_getTime' from
> incompatible pointer type

time i din main er et simpelt array. Parameteren i din funktion
er et array af pointere (bruges f.eks. ved et array af strenge).

Hvis det er din main-time der er rigtig, skal du blot fjerne *
eller [] fra funktionens parameter.

Der er en fejl i funktionen. Du erklærer en lokal variabel,
ret_time. Den dør når funktionen afsluttes. Derefter er time
udefineret fordi den er sat til at pege på den døde variabel.

Der er flere mulige løsninger:

1. Den simple:
Undlad at bruge en tempvariabel i funktionen og bearbejd den
overførte streng direkte. Det vil virke som du har tænkt.

2. Den også simple hvor man stadig bruger en overflødig
tempvariabel:
Lad funktionen være som nu, men slut med:

   strcpy(time,ret_time);
   return 0; // (drop overflødige parenteser)

3. Den knap så simple - udnyt tempvariablen:
Lav funktionen som i 2., men indbyg mulighed for at forlade
funktionen midtvejs hvis der opstår en fejl. Derved bevares den
oprindelige time.

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

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

Månedens bedste
Årets bedste
Sidste års bedste