Chyba při kompilaci


#1

Při kompilaci na mě vyskakuje chyba s kterou si nevím rady, protože nejsem programátor ale jen uživatel. Rozumím tomu, že je v té smyčce, ale kde? Díky za radu…

mode_s.c: In function ‘decodeBDS20’:
mode_s.c:758:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 0; i < 8; ++i) {
^
mode_s.c:758:5: note: use option -std=c99 or -std=gnu99 to compile your code
Makefile:49: recipe for target ‘mode_s.o’ failed
make[3]: *** [mode_s.o] Error 1

a chyba by měla být tady:

// Decode BDS2,0 carried in Comm-B or ES
static void decodeBDS20(struct modesMessage *mm)
{
unsigned char *msg = mm->msg;

mm->callsign[0] = ais_charset[getbits(msg, 41, 46)];
mm->callsign[1] = ais_charset[getbits(msg, 47, 52)];
mm->callsign[2] = ais_charset[getbits(msg, 53, 58)];
mm->callsign[3] = ais_charset[getbits(msg, 59, 64)];
mm->callsign[4] = ais_charset[getbits(msg, 65, 70)];
mm->callsign[5] = ais_charset[getbits(msg, 71, 76)];
mm->callsign[6] = ais_charset[getbits(msg, 77, 82)];
mm->callsign[7] = ais_charset[getbits(msg, 83, 88)];
mm->callsign[8] = 0;
// Catch possible bad decodings since BDS2,0 is not
// 100% reliable: accept only alphanumeric data
mm->callsign_valid = 1;
for (int i = 0; i < 8; ++i) {
    if (! ((mm->callsign[i] >= 'A' && mm->callsign[i] <= 'Z') ||
           (mm->callsign[i] >= '0' && mm->callsign[i] <= '9') ||
           mm->callsign[i] == ' ') ) {
        mm->callsign_valid = 0;
        break;
    }
}

}


Instalace a build balíčku dump1090
#2

No, tohle vypadá jako kompilace pro jiný standard než programátor očekával. Teď je otázka na které straně je chyba…

Pokud to má fungovat se starším C standardem, dá se napsat třeba:

mm->callsign_valid = 1;
int i;
for (i = 0; i < 8; ++i) {

#3

Ještě uvedu zdroj:


#5

Na tuhle chybu jsem také narazil při aktualizaci dump1090 na nejnovější verzi. Řešil jsem to s @paja, který mi poradil, abych přidal následující flag do makefilu pomocí:

TARGET_CFLAGS += -std=c99

tak to končí s chybou:

dump1090.c:1204:31: error: 'CLOCK_REALTIME' undeclared (first use in this function)                  clock_gettime(CLOCK_REALTIME, &ts);

s tím, že to lze vyřešit opatchováním těch cyklů, ale k tomu napíše @paja víc. :slight_smile:


#7

Díky, vyzkouším, tenkrát po neúspěchu jsem to odložil.
Máte zkompilovaný nový dump1090 pro T1.0?
Pokud ano, můžete ho někde postnout?
Díky…


#8

Udelal jsem patch, ktery by mel dane chyby opravit viz https://gitlab.labs.nic.cz/turris/turris-os-packages/blob/dev-honza/utils/dump1090/patches/100-patch-toolchain.patch takze jej muzete vyzkouset


#9

Teď jsem to zkoušel a kompilace proběhla bez problému, jen to chtělo přidat rtl-sdr a přidal jsem i luci-app-dump1090.
Večer to nasadím.

Díky, díky…