Отговори на тема  [ 6 мнения ] 
Проблем с инициализация 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение Проблем с инициализация
Заглавието не е точно :oops: , но проблемьт изглежда приблизително така


main.c
Код:
#include "array.h"

void func(void);

void main(void)
{....
}

void func(void)
{ unsigned char i;
   
   for(i=0; i<N ; i++)
   array[i] <<= 1;
}



array.h
Код:
#define SIZE 3

unsigned int array[SIZE] = {1, 2, 3};



резултатьт е, че масивьт ми е пьлен с неопределени стойности. Лошото е, че понякога стойностите са такива каквито трябва. Това е единственото място кьдето чета или пиша в масива.
В действителност операциите са малко повече, но всички са в func(), като не прехвьрлям максималната стойност на unsigned int. Накрая редуцирах всичко до обикновенно шифтване, сьщата история. Какво пропускам? Компилаторьт е КЕИЛ, а µC-а 88C166. Сигурно питам голяма глупост, ама ....


Пет Мар 09, 2007 10:55 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Първо ми се набива на очи че си декларираш променлива и я инициализираш в h фаила. Това не е правилно.
Ако този h фаил го инклуднеш и някъде другаде по принцип компилатора трябва да даде грешка. Ако не даде резултатите може и да са като това което описваш.

трява да инициализираш в c. фаила а в h фаила да имаш

extern unsigned int array[]; ако искаш този масив да го ползваш и в някой друг c фаил в които си инклуднал h фаила.


Съб Мар 10, 2007 12:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Никола благодаря за отговора! Забравих да пиша, че бях опитал да декларирам и едновременно с това да инициализирам най-горе в .c файла, още преди декларацията на всички функции.
После написах една функция modify(), която да го модифицира. Компилира се без проблеми обаче изглежда modify() не работи както трябва и func() дава глупости.


Код:
unsigned int array[3] = {1, 2, 3};

void func(void);
void modify(void);


void main(void)
{ modify();
   func();
}

void modify(void)
{ unsigned char i;
   
   for(i=0; i<N ; i++)
   array[i] <<= 1;
}


void func(void)
{ unsigned int x;
   x = array[0];
}


Нещата се оправят единствено когато декларирам и инициализирам масива вьтре в func() и си го модифицирам от там. Ще ровичкам отново в понеделник, изморен сьм и сигурно пропускам нещо.


Съб Мар 10, 2007 2:41 am
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
Като гледам така 'х' е локална за func(), което означава, че не се ползва другаде и компилатора може да оптимизира func(), или най-вероятно да я махне. Всъщност, какво трябва да прави func() в последния пример? Може да видиш листинга на програмата, или да спреш на brakepoint преди всяка функция и да видиш дали масива в началото е инициализиран правилно, или след това се омазва. Това не ми стана много ясно...

_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Съб Мар 10, 2007 11:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
@nickich

func() в действителност е модификация на binary search с която тьрся в lookup таблица, каква темп. сьм измерил (pt100). Това x сьм го писал за да изглежда по-пригледно.
Проблемьт дойде от там, че използвам делител на напрежение вместо източник на конст. ток (такова ми е заданиетоm знам че е сьпроводено и 1000 източника на грешки) и като начинаещ си сметнах lookup таблицата за даденото ми сьпротивление от 220ома. Което разбира се се оказа в долната граница на толерантността си и и се наложи да преизчисля lookup таблицата за 218ома. Обаче имах само крос компилатора на Кеил на разположение (и машината е под Windows) и викам за начало ще вкарам една modify() функция, която преизчислява наново lookup таблицата в µC-a.
В интерес на истината lookup таблицата си я преизчислявам в кьщи на PC-то и modify() в действителност не се мандахерца в сорса за µC-а, но да се появи тази грешка и искам да разбера защо. И за да ми е максимално гадно кода си стана големичьк и не мога да ползвам дебьгера (Кеила е демо), та опитвам да дебьгвам с LCD-то, мька. Ще огледам пак понеделник да не би да сьм пропуснал нещо.


Съб Мар 10, 2007 11:48 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Така мисля, че открих корените на проблема. Инициализацията на глобалните променливи е била забранена в startup файла, което в комбинация с изключено нулиране на RAM сектора ми е бьркало нещата. Тук е описано всичко по-подробно, ако представлява интерес за някой.
http://www.mcu-bg.com/mcu_site/viewtopi ... 7313#47313


Сря Мар 21, 2007 11:54 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни