• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Dlaczego kompilator wyrzuca mi tutaj błąd?

VPS Starter Arubacloud
0 głosów
238 wizyt
pytanie zadane 15 stycznia 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
zamknięte 25 stycznia 2021 przez tonn204

Cześć, robię termometr  z wykorzystanie Atmegi32 i czujnika temperatury TMP36. Próbuję uśrednić wartość temperatury ale  w linii 79 dostaję następujący błąd:

subscripted value is neither array nor pointer nor vector

Nie rozumiem o co tu chodzi i z czego wynika ten błąd. Co mam zrobić, żeby zmienną  "new_value" podzielić przez 64 i nadpisać ją w tej samej zmiennej?

#include <avr/io.h>
#include <util/delay.h>

#include "HD44780.h"

#define F_CPU 1000000UL

#define VREF_DIVIDED 25

uint16_t adc_value;
uint16_t voltage_value;
int16_t cz_d, cz_u;
int16_t temp;
int16_t real_decimal;
int16_t real_fraction;
char decimal_buffer[33]; 
char fraction_buffer[33];

int16_t averange_value(int16_t actual_value);

void ADC_init(void);

int main(void)
{
	// LCD init
	LCD_Initalize();
	
	// ADC init
	ADC_init();
	
    while (1) 
    {
		ADCSRA |= (1 << ADSC);
		while(ADCSRA & (1 << ADSC));
		adc_value = ADC;
		voltage_value = adc_value * VREF_DIVIDED;
		temp = voltage_value / 10 - 500;
		cz_d = temp/10;					
		cz_u = temp%10; 
		real_decimal = averange_value(cz_d); 
		real_fraction = averange_value(cz_u);  
		         
		itoa(real_decimal, decimal_buffer, 10);
		itoa(real_fraction, fraction_buffer, 10);
		LCD_Clear();
		LCD_GoTo(2, 0);
		LCD_WriteText("Temperatura:");
		LCD_GoTo(6, 1);
		LCD_WriteText(decimal_buffer);
		LCD_WriteText(".");
		LCD_WriteText(fraction_buffer);
		_delay_ms(500);
    }
}

void ADC_init(void)
{
	DDRA &= ~(1 << PA5) | ~(1 << PA6) | ~(1 << PA4);
	ADMUX |= (1 << REFS1) | (1 << REFS0); // Vref = 2.56V
	ADMUX |= (1 << MUX0) | (1 << MUX2); // Pomiar na ADC5
	ADCSRA |= (1 << ADEN) | (1 << ADPS0) | (1 << ADPS1); // Włączenie ADC i preskaler = 64
}

int16_t averange_value(int16_t actual_value)
{
	static uint8_t count = 0;
	int16_t new_value = 0;
	int16_t numbers[64];
	numbers[count] += actual_value;
	count++;
	
	if(count == 64)
	{
		count = 0;
		for(int i = 0; i<63; i++)
		{
			new_value += count[i];
		}
		new_value /= 64;
		
		return new_value;
	}
}

 

komentarz zamknięcia: Problem został rozwiązany

2 odpowiedzi

0 głosów
odpowiedź 15 stycznia 2021 przez tkz Nałogowiec (42,020 p.)
Spójrz na typ count.
0 głosów
odpowiedź 15 stycznia 2021 przez j23 Mędrzec (195,220 p.)
edycja 15 stycznia 2021 przez j23
  • Linie 40-41: to nie przejdzie dla funkcji ze zmiennymi statycznymi (chyba że to celowe działanie).
  • Linia 68: tablica numbers powinna być static.
  • Linia 75: powinno być 64 a nie 63. Nie powinieneś tej tablicy zerować po wyliczeniu średniej?
  • Linia 77: zamiast count powinno być numbers.
  • Linia 83: funkcja powinna coś zwrócić - dla count < 64 zwraca nie-wiadomo-co.
komentarz 15 stycznia 2021 przez Oscar Nałogowiec (29,340 p.)
Nie trzeba zerować tablicy - do następnego liczenia średniej wypełni się cała nowymi wartościami.
komentarz 15 stycznia 2021 przez j23 Mędrzec (195,220 p.)
Zwróć uwagę, że w linii 69 dodaje nową wartość, a nie przypisuje.
komentarz 15 stycznia 2021 przez Oscar Nałogowiec (29,340 p.)
Ale to akurat jest bez sensu. Tak ogólnie to tablica jest zbędna - wystarczą dwie zmienne: suma i licznik. Sama struktura kodu też jest nieco dziwna - funkcja daje wynik tylko co ileś wywołań.
komentarz 15 stycznia 2021 przez j23 Mędrzec (195,220 p.)
Wiem, że bez sensu, ale niech OP się wypowie, o co mu tam dokładnie chodzi.

Podobne pytania

0 głosów
2 odpowiedzi 135 wizyt
pytanie zadane 5 listopada 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
0 odpowiedzi 115 wizyt
pytanie zadane 9 listopada 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 709 wizyt

92,975 zapytań

141,939 odpowiedzi

321,182 komentarzy

62,302 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...