C-kods problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

C-kods problem

Inlägg av Korken »

Hej alla glada!

Jag har ett litet problem, eller inte ett problem mer en fundering; jag har en array som jag deklarerar utan storlek, sen en bit efter det vill jag sätta in värden i den.
Tex:

Kod: Markera allt

unsigend char array[];
array[] = {1, 2, 3, 4, 5};
Men gör jag så så spyr den ut felmeddelanden.
Hur ska man göra detta på bästa sätt?

Tack för hjälpen!

//Emil
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Bestäm dig för hur stor arrayen ska/får vara när du deklarerar den. Det är det absolut smidigaste sättet. Jag antar att det är för en µC du programmerar.

Kod: Markera allt

unsigned char array[] = {1, 2, 3, 4, 5};

//eller

unsigned char array[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Om di vill hålla det enkelt så måste du, precis som cykze skriver, ange arrayens storlek när den deklareras. Ett annat alternativ är att använda funktionen malloc() för att dynamiskt skapa ett minnesområde (googla för mer info)... malloc används flitigt i "vanliga datorer" med gott om minne, kan vara rätt farligt i en uC! Det är FÅ gånger som man INTE vet hur stort något i en uC kommer att vara...
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

oJsan har rätt men jag vill kraftigt avråda från att använda malloc i µC-miljö!

Är det så att man inte vet hur stor variabeln blir kan man reservera den maximala storleken och fila på det senare.

Se det som en bil: du beställer en bil hos förhandlaren och när du ska hämta den 2 veckor senare klämmer du fram att det var en lastbil du ville ha. Sånt säger man till om INNAN man hämtar bilen eller hur?

Det samma gäller för kompilern: du måste berätta hur många bytes du vill ha innan du kan få dom.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, tack för svaren.
Då får jag göra om koden lite för att fixa det.

//Emil
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Icecap> Varför vill du "kraftigt avråda" från att använda malloc i µC-miljö?

Om man deklarerar den på stacken kommer den ju flörmodligen att leva jämt och ta upp massa onödigt minne. Deklarerar du den med malloc på heapen kommer den (förhoppningsvis) bara att finnas då den behövs.

Det är ju onödigt att kategoriskt säga att malloc inte ska användas. Klart man ska använda det! :)
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Allt beror på hur mycket minne man har såklart!

I en PIC eller liknande storlek är det sinnessjukt att använda malloc, helt enkelt för att det förbrukar onödiga resurser. Har man ett antal Kbyte kan det vara vettigt att använda malloc, men det är för att man har resurserna till det.

Själv kör jag mitt största programmeringsprojekt till inbyggnad helt utan malloc, allt har sin plats, det finns ingen okända faktorer och då ser jag ingen anledning till att använda malloc.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Hej igen!

Ett nytt problem.
När jag deklareraren variabel i en switch och sedan använder den i en funktion så får jag felmedelandet:

Kod: Markera allt

g_lcd.c:551: error: `data' undeclared (first use in this function)
g_lcd.c:551: error: (Each undeclared identifier is reported only once
g_lcd.c:551: error: for each function it appears in.)
Vad har jag gjort för fel?

Koden:

Kod: Markera allt

void LCD_Write_Char(unsigned char x, unsigned char y, char ch)
{
	switch(ch)
	{
		case 'A':
		{
			unsigned char data[] = {0b01111110, 0b10010000, 0b10010000, 0b10010000, 0b01111110};
			break;
		}
		case 'B':
		{
			unsigned char data[] = {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100};
			break;
		}
		case 'C':
		{
			unsigned char data[] = {0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01000100};
			break;
		}

...........................
		
		default:
		{
			unsigned char data[] = {'\0'};
			break;
		}
	}
	
	if (data[0] != '\0')
		LCD_Draw_Char(x, y, data);
}
//Emil
Maalobs
Inlägg: 1304
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Inlägg av Maalobs »

Vilken rad är nr 551?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Brukar man inte deklarera högst upp i funktionen.

"unsigned char data[] " EN gång längst upp.

Kan vara ute med mountainbiken men...
TERdON
EF Sponsor
Inlägg: 295
Blev medlem: 15 november 2006, 04:38:29
Ort: Solna/Laholm
Kontakt:

Inlägg av TERdON »

`data' undeclared
Står ju i första raden i felmeddelandet. Du har inte deklarerat variabeln "data"...

Edit: Man kan inte vara först jämt. ;-)
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Maalobs: Det är raden med "if (data[0] != '\0')"

TERdON & v-g: Den blir ju declarerad i switchen så den borde ju inte klaga.

//Emil
Maalobs
Inlägg: 1304
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Inlägg av Maalobs »

Är det inte så att du har deklarerat en lokal data[] innanför varje {} scope i switch casen?
Deklarera en data[] (med angiven storlek) ute i samma scope där du har anropet istället, alltså i LCD_Write_Char()'s {}.
Då syns den variabeln även i alla funktioner som anropas från den funktionen.

Men, jag är färgad av många års meck i Perl, så det här kanske inte gäller i C utan är bara en egenskap i Perl.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jovisst är det!

För varje case blir det deklarerat en konstant 'data[]' varefter den försvinner!

Men det var ett jävla sätt att göra en karaktertabell på! (datan motsvarar en 7x5 matris)

Varför inte:

Kod: Markera allt

const char * Char_A = {0b01111110, 0b10010000, 0b10010000, 0b10010000, 0b01111110};
const char * Char_B = {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100};
osv osv.
 void LCD_Write_Char(unsigned char x, unsigned char y, char ch)
  {
  char * Data;
  switch(ch)
    {
    case 'A': Data = Char_A; break;
    case 'B': Data = Char_B; break;
    case 'C': Data = Char_C; break;
...........................
    default:  Data = 0
    }
  if(Data != 0)
      LCD_Draw_Char(x, y, Data);
  }
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, nu hänger jag med!
Tack ska ni ha! :D

//Emil
Skriv svar