Sida 1 av 4

C-kods problem

Postat: 12 april 2007, 00:16:12
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

Postat: 12 april 2007, 00:34:26
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;

Postat: 12 april 2007, 06:46:14
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...

Postat: 12 april 2007, 08:54:09
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.

Postat: 12 april 2007, 16:28:13
av Korken
Okej, tack för svaren.
Då får jag göra om koden lite för att fixa det.

//Emil

Postat: 12 april 2007, 16:50:58
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! :)

Postat: 12 april 2007, 19:18:44
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.

Postat: 14 april 2007, 16:58:38
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

Postat: 14 april 2007, 17:03:02
av Maalobs
Vilken rad är nr 551?

Postat: 14 april 2007, 17:07:48
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...

Postat: 14 april 2007, 17:08:22
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. ;-)

Postat: 14 april 2007, 17:22:22
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

Postat: 14 april 2007, 18:14:38
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.

Postat: 14 april 2007, 18:32:00
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);
  }

Postat: 14 april 2007, 18:47:14
av Korken
Okej, nu hänger jag med!
Tack ska ni ha! :D

//Emil