Wert über globalen Index aus N Arrays

greggy80

Mitglied
Hallo,

ich stehe gerade etwas auf m Schlauch. Ich arbeite mit C.

Mein Anliegen: ich habe N char-Arrays, sagen wir mal 3, um es konkret zu halten. Nun möchte ich über einen globalen Index auf einen char-Wert in den 3 Arrays zugreifen und das möglichst effizient. Bis jetzt sieht meine Lösung für 3 Arrays so aus:

Code:
static char getByte(
    const char baMeta[], //1st array
    const int baMetaLength, //length of 1st one
    const char baName[], //2nd array
    const int baNameLength, //length of 2nd one
    const char baNs[], //3rd array
    const int baNsLength, //length of 3rd one
    const int offset //Global offset which points into one of the three arrays
)
{
    if (offset < baMetaLength)
        return baMeta[offset];
    if (offset >= baMetaLength && offset < baNameLength + baMetaLength)
        return baName[offset - baMetaLength];
    if (offset >= baNameLength + baMetaLength)
        return baNs[offset - baNameLength - baMetaLength];

    exit(1); //Fatal error - MUST NOT BE!
}
Diese Funktion wird jedoch sehr sehr oft aufgerufen und ich möchte die Logik möglichst kompakt und schnell berechenbar halten. Am schönsten wäre es, wenn man die if-Abfragen eliminieren könnte und den richtigen Index für das richtige Array irgendwie berechnet. Die Anzahl übergebener Arrays ist zwar beliebig, aber fest gewählt.

Ich bin mir gerad nicht sicher, ob das überhaupt möglich ist, aber wenn, dann wäre ich für ein paar Denkanstöße sehr dankbar!

Viele Grüße, David

PS: vorher die drei Arrays durch ein malloc und memcpy zusammenzuführen, möchte ich gerade vermeiden, da ich auf Sensorknoten arbeite und sowohl platzsparend als auch performant programmieren muss (ich weiß, beide Dinge gleichzeitig beißen sich gelegentlich etwas :p ).
 
Zuletzt bearbeitet:
Wenn Du else verwendest kannst Du ein paar Vergleiche einsparen.
Außerdem solltest Du ein paar Berechnungen sparen können die Du jetzt doppelt machst:
C:
static char getByte(
    const char baMeta[], //1st array
    const int baMetaLength, //length of 1st one
    const char baName[], //2nd array
    const int baNameLength, //length of 2nd one
    const char baNs[], //3rd array
    const int baNsLength, //length of 3rd one
    const int offset //Global offset which points into one of the three arrays
)
{
    if (offset < baMetaLength)
        return baMeta[offset];
    else if ((offset-=baMetaLength) < baNameLength)
        return baName[offset];
    else if ((offset-=baNameLength) < baNsLength)
        return baNs[offset];
    else
        exit(1); //Fatal error - MUST NOT BE!
}

Ist aber ungetestet und ich bin mir nicht sicher ob das in C auch alles so funktioniert.
 
Zuletzt bearbeitet:
Hm ja, ich fürchte auch, um das if komm ich nicht herum. Ich hatte an Sprungtabellen gedacht, aber das haut alles nicht hin. Mein Professor hat jetzt einen weiteren Vorschlag gemacht, der mit 0-terminierten char-Arrays arbeitet. Da über die Arrays sequentiell iteriert wird, kann man sich in einer statischen Variablen den Augenblick merken, wo man ein Array wechselt (gdw. \0 auftaucht). Damit braucht man - ohne es jetzt konkret implementiert zu haben - nur noch eine if-Abfrage.

Mal schauen, ob ich da weiter komme.

Wenn noch jemand eine Idee hat, gerne melden!

Und vielen Dank erstmal @mahe
 
Zuletzt bearbeitet:
Zurück