logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Błędy kompilacji przy potęgowaniu w AVR Studio dla ATmega168

lokii 14 Cze 2011 09:35 2869 6
REKLAMA
  • #1 9609803
    lokii
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 131
    Witam mam problem z potęgowaniem. Chcę obliczyć następujące wyrażenie:

    
    
    co2 = 3*tww_ph*pow(10,7-ph);
    
    


    Kompilator wywala błędy:


    Build started 14.6.2011 at 09:19:09
    avr-gcc -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT phmetr.o -MF dep/phmetr.o.d -c ../phmetr.c
    avr-gcc -mmcu=atmega168 -Wl,-Map=phmetr.map phmetr.o -o phmetr.elf
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(floatsisf.o): In function `__floatunsisf':
    (.text.avr-libc.fplib+0x0): multiple definition of `__floatunsisf'
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_usi_to_sf.o):c:\avrdev\gcc\build-avr\avr\avr5\libgcc/../../.././gcc/fp-bit.c:1391: first defined here
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(log.o): In function `log':
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(log.o): In function `log':
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(modf.o): In function `modff':
    make: *** [phmetr.elf] Error 1
    Build failed with 1 errors and 0 warnings...


    Jeśli zamiast 7-ph podstawię do funkcji pow zwykła liczbę to działa. Czy ktoś podpowie jak wykonać potęgowanie w tym przypadku?
  • REKLAMA
  • #2 9609823
    krzyjak
    Poziom 29  
    Posty: 1074
    Pomógł: 110
    Ocena: 137
    Spróbuj zamiast 10,7 napisać 10.7 Napisz także jakiego typu jest zmienna co2.
  • REKLAMA
  • #3 9609872
    lokii
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 131
    Co2 jest float , co do zapisu 10.7 to chyba źle mnie zrozumiałeś. 10 to podstawa potęgi a (7-ph) to wykładnik.
  • REKLAMA
  • #4 9610002
    krzyjak
    Poziom 29  
    Posty: 1074
    Pomógł: 110
    Ocena: 137
    Rzeczywiście nie zauważyłem przez pośpiech, że są to dwa argumenty funkcji.
    Spróbuj tak:

    co2 = 3*tww_ph*pow(10.0,7.0-ph); 


    Jeśli zmiana ph jest też typu float to zmień ją na double.
  • REKLAMA
  • #5 9610018
    lokii
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 131
    Niestety nie działa.
  • #6 9610077
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Dołącz bibliotekę math do projektu (to chyba jest gdzieś w opcjach projektu, nie mam doświadczenia z nowymi wersjami AVR Studio).
  • #7 9610084
    lokii
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 131
    Math dołączone, okazało się, że w opcjach projektu nie była dołączona biblioteka libm.a.
    Dziękuję wszystkim za pomoc.

Podsumowanie tematu

✨ Użytkownik zgłosił problem z kompilacją w AVR Studio dla mikrokontrolera ATmega168, związany z obliczaniem potęgi w wyrażeniu `co2 = 3*tww_ph*pow(10,7-ph);`. Kompilator generował błędy związane z wielokrotną definicją funkcji `__floatunsisf`. Użytkownicy zasugerowali poprawki, takie jak użycie `10.0` i `7.0` jako argumentów funkcji `pow`, a także zmianę typu zmiennej `ph` na `double`. Ostatecznie problem został rozwiązany przez dołączenie biblioteki matematycznej `libm.a` do projektu.
Wygenerowane przez model językowy.
REKLAMA