• 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
206 wizyt
pytanie zadane 15 stycznia 2021 w C i C++ przez tonn204 Mądrala (7,440 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,000 p.)
Spójrz na typ count.
0 głosów
odpowiedź 15 stycznia 2021 przez j23 Mędrzec (194,920 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,290 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 (194,920 p.)
Zwróć uwagę, że w linii 69 dodaje nową wartość, a nie przypisuje.
komentarz 15 stycznia 2021 przez Oscar Nałogowiec (29,290 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 (194,920 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 127 wizyt
pytanie zadane 5 listopada 2020 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
0 odpowiedzi 104 wizyt
pytanie zadane 9 listopada 2020 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 616 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...