Problem med felmedelande från C-kompilator

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Problem med felmedelande från C-kompilator

Inlägg av vfr »

Jag har ett problem att förstå varför jag får fel på det här C-exemplet

Kod: Markera allt

//---------------------------------------------------------------------------
// Clear vector
//---------------------------------------------------------------------------
void ClearVect(unsigned char (*ParmVect)[], unsigned char NumElements)
{
   unsigned char i;

   for(i = 0; i < NumElements; i++)
      ParmVect[i++] = 0;
}

//---------------------------------------------------------------------------
// Main
//---------------------------------------------------------------------------
int main(int argc, char *argv[])
{
   unsigned char (*TestVect1)[10];
   unsigned char (*TestVect2)[20];

   ClearVect(TestVect1, 10);
   ClearVect(TestVect2, 20);

   return 0;
}
Felmeddelandet är "invalid use of array with unspecified bounds" i GCC och "Size of the type 'unsigned char[]' is unknown or zero" i Borland C++ Builder.

Själva felmeddelandet i sig är ju fullt förståligt när man har en tvådimensionell array och där den ena arraystorleken behöver vara dimensionerad för att kunna räkna offseten in i arrayen. Men i det här fallet så är det en pekare till en vektor av byte och där borde det inte behöva vara några problem. Man vill kunna skicka in olika vektorer som parameter. Jag förstår inte orsaken till felet i det här fallet. Självklart vill jag kunna skicka in vektorer med olika antal element och så länge storleken på själva elementet (unsigned char) är fast och känd, så tycker jag inte det borde vara några problem.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Problem med felmedelande från C-kompilator

Inlägg av johano »

En arraydeklaration måste ha en känd storlek.
Använd istället en enkel pekare så funkar det bättre:

Kod: Markera allt

void ClearVect(unsigned char *ParmVect, unsigned char NumElements)
{
    unsigned char i;
    
    for(i = 0; i < NumElements; i++)
        ParmVect[i] = 0;
}

int main(int argc, char *argv[])
{
    unsigned char TestVect1[10];
    unsigned char TestVect2[20];
    
    ClearVect(TestVect1, 10);
    ClearVect(TestVect2, 20);
    
    return 0;
}
/johan
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Problem med felmedelande från C-kompilator

Inlägg av vfr »

Det är sant att man ju faktiskt kan skriva det som en pekare istället. Men jag tycker det är tydligare att skriva det som en vektor i dom fall det faktiskt är det. Så en normal kompilator klarar alltså inte av att "inse" att det faktiskt inte behöver vara angivet på en endimensionell array som egentligen motsvarar en enkel pekare...

Det trodde jag faktiskt att det skulle fixas iom att det är livärdigt med en pekare. Så länge som inte den storleken verkligen behövs för att beräkna elementets placering så skulle det ju varit likvärdigt.
Nerre
Inlägg: 27195
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Problem med felmedelande från C-kompilator

Inlägg av Nerre »

Nu är det alldeles för länge sen jag höll på aktivt med C, men man kan väl normalt aldrig skicka med en array som parameter till en funktion?

Jag har för mig att det just var en sån där "fälla" som man lätt gick i, man trodde man skickade den som parameter (som blir en lokal variabel i funktionen), men det man skickar är en pekare så man modifierar funktionens argument utanför funktionen så att säga?

Normalt så trycks väl alla argument till en funktion in på stacken innan funktionen anropas, och just därför måste storleken vara känd. (Och just därför blir det pekare till arrays.)


variabel är väl samma sak som *(&variabel+i*sizeof(datatyp)) så det är fullt logiskt att ta det som en pekare.
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Problem med felmedelande från C-kompilator

Inlägg av SvenW »

prova med att ta bort stjärnorna:

Kod: Markera allt

  void ClearVect(unsigned char ParmVect[], unsigned char NumElements)
  ...
  

Kod: Markera allt


  unsigned char TestVect1[10];
  unsigned char TestVect2[20];
  ...
Skriv svar