Ik ben wat aan het coden voor een PIC in MPLAB met de C18 compiler en ik krijg de volgende compile error:

Error [1219] integer constant expected

void mled(int count,...)
{
    va_list ap;
    char j, n;
    int leds[count];                   //error op deze lijn
    va_start(ap, count);
	for(j=0; j<count; j++)
	{
        leds[j] = va_arg(ap, char);
	}
    va_end(ap);
}

Moet ik dan een dynamische array gaan gebruiken?

Het rare is dat dit ook niet werkt:

const int count=5;
int leds[count];

[Bericht gewijzigd door Synck op (20%)]

Je kunt geen array declareren, compiler(of linker/assembler) wil bij compilen al graag weten hoe groot het array wordt.

Je zult met malloc memory moeten alloceren en daar je array in plaatsen.

kijk. das nu ene punt waar basic superieur is aan c ....

Tja, dat kan met een ge-interpreteerde taal makkelijker dan met een gecompileerde.

Malloc/free is ingewikkeld: kost je nogal wat ruimte aan code in je PIC. De officiele methode is dus:

void mled(int count)
{
    int *leds;

    leds = malloc (count * sizeof (int));
    ...

    free (leds);
}

Maar om code te besparen weet je vaak wel om hoeveel leds het maximaal gaat:

void mled(int count)
{
#define MAXLEDS 24 // aanpassen.
    int leds[MAXLEDS];

    if (count > MAXLEDS) { 
       //fout rapporteren of
       count = MAXLEDS;
    }
    ...
}

(Gezien het stuk met varargs denk ik dat je nooit 24 leds zult willen gebruiken!)
Maar voor het stuk met "varargs" zou wmb hetzelfde gelden als het verhaal over de malloc: het is een constructie die wel handig is, maar waarschijnlijk in ee PIC wat te veel moeite kost en dus behoorlijk veel code...

@free ik ken geen enkele basic compiler voor PIC die Dynamic Array Bounds toe laat vb2008 doet dat wel totdat je dat MultiDimensional gaat doen dan gaat die ook plat en moet je gaan redimmen.

@TS waarvoor heb je een dynamisch array nodig? en hoe wordt bepaald hoe groot die array moet zijn.

[Bericht gewijzigd door timmie op (21%)]

Op 6 september 2009 02:13:25 schreef RoelA:
Je kunt geen array declareren, compiler(of linker/assembler) wil bij compilen al graag weten hoe groot het array wordt.

Je zult met malloc memory moeten alloceren en daar je array in plaatsen.

Ik weet niet of de implementatie een alloca functie call heeft, die alloceert dan data op de stack en bij functie exit wordt dat automatisch vrijgegeven.

De constructies zijn idd wat aan de grote kant maar zijn wel interessant om te leren hetgeen toch vooral het doel van dit "project" is.

Om de rest van mijn code te testen had ik ook al een maximum voor het aantal leds ingegeven maar ik ga nu zeker de malloc/free constructie aan de praat proberen te krijgen.

Ik maak gebruik van een dynamische array omdat ik hierin de argumenten van een functie met variabel aantal argumenten wil opslaan. In de hoofdlus maak ik gebruik van mled(x,a,b,c) waarbij x het aantal leds geeft dat tegelijk moet branden en a,b,c zeggen dan welke leds moeten branden.

euhm is het dan niet net zo gemakkelijk om in de array aan te geven welke led's moeten branden

dus eigenlijk een bitarray die aan geeft welke led moet branden
de functie mled geef je dan een pointer mee naar de bitarray

je kan dan met een vaste array werken zonder in de problemen te komen.

PIC's ondersteunen geen dynamisch geheugen dus malloc en free kunnen niet gebruikt worden (tenzij zelf geïmplementeerd).

De bedoeling was om een functie te schrijven die als argumenten de nummers van de leds heeft die moeten branden. Dus een functie met een variabel aantal argumenten is nodig. Er blijken nu toch nog een paar andere beperkingen te zijn: het eerste argument van de functie moet het aantal leds weergeven en een variabele array is niet makkelijk te implementeren op een PIC waardoor er een maximum aan het aantal leds moet worden gesteld.

Er zijn idd simpeler manieren om dit alles te implementeren maar die zijn wel minder leerrijk.