Отговори на тема  [ 10 мнения ] 
Кой греши в случая - microchip или аз!? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение Кой греши в случая - microchip или аз!?
Искам да споделя на какво се натъкнах преди малко и да попитам къде е грешката.
Компилатора е С18 на микрочеп. Пиша си аз, и си тествам поотделно - всичко е ок. Но...
Код:
print   (ubtoa(min),97,3,1);

Тази процедура трябва да ми изведе на графичен дисплей променливата "min".
Код:
char *   ubtoa   (unsigned char n)
{
   char   *p;
   char   buf[5];
   .
   .
   .
   
   return p;
}

Код:
void   print   (char * txt,unsigned char xs,unsigned char ys,unsigned char colour)
{
unsigned char xe,ye,j,k,l,m,n,o,p,r,t,asc;
unsigned int i,s;
map cm;
union CRT                           
{
   unsigned int    i;
   unsigned char    b[2];
};
union CRT
   lin,mask,pole;
   
   .
   .
   .
   .
}

Какво се получава!? Нищо не излиза на дисплея. Пуснах симулатора и видях какъв е проблема - много тъп...
Втората процедура си разполага локалните променливи върху резултата от първата 8O Да нямаше свободно място в стека - разбирам, но от него се ползва най-много 10%. Цяла банка е.
Въпроса ми е, дали проблема е в програмиста или в компилатора? И има ли някакъв начин да се избегне това?
Избегнах го, разбира се, като ползвам за първата процедура "глобален" буфер, но едва ли това е правилният начин!


Сря Апр 18, 2007 6:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
нещо не мога да схвана смисъла на питането ти - но няма и един ред код (само "...") - как да ти помогне човек :D

и много ми е интересно какво има в:
char * ubtoa (unsigned char n)
{
char *p;
char buf[5];
.
.
.

return p;
}

особенно поинтера дето го връща :D

понеже виждам че се съмняваш в компилатор - бъди сигурен че е 99.999999% от случаите - проблема е в теб !
(не ползвам пикове - тъй че не познавам компилатора - просто интуиция :) )


Сря Апр 18, 2007 6:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Обикновенно се оказва, че предмониторното устройство греши :) .


Сря Апр 18, 2007 7:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Ако връщаш указател към нещо във ф-ята, което не е обявено като static, няма да работи никога.


Сря Апр 18, 2007 9:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Реконструктор написа:
Ако връщаш указател към нещо във ф-ята, което не е обявено като static, няма да работи никога.
Точно това е. Не се сетих когато трябваше :oops: Сега всичко е ок. Благодаря :partyman:
@ps66, не сметнах за нужно да поствам целия код за да стане ясно какъв е проблема. Не, че е някаква тайна.
Код:
char *   ubtoa   (unsigned char n)
{
   char   *p;
   static char   buf[5];
      
   p = &buf[5];
   *--p = '\0';
   if   (n == 0)   *--p = '0';
   else
      {
         while (n > 0)
            {
            *--p = "0123456789"[n % 10];
            n /= 10;
            }
      }
   return p;
}

Това е, само дето буфера не беше деклариран като static.


Чет Апр 19, 2007 7:40 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
по-горе съм ти написал: "особенно поинтера дето го връща :)" - щото имах големи съмнения че сочи към "намайнатаси+12" - ама как да съм сигурен без кода :)
по-принцип при връщане на указател трябва да си абсолютно наясно къде сочи!

може да съм бил малко по-рязък за което се извинявам, но пиша на C/C++ и асемблер от 20г и почти никога не съм си позволявал да търся проблема в компилатора (с малки изключения и то предимно в библиотеките!) - и понеже видях няколко теми дето "скапания компилатор бил виновен" пуснати от хора дето тепърва се учат ... и ъъъ. не се сдържах ... :D


Чет Апр 19, 2007 8:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
ps66 написа:
може да съм бил малко по-рязък за което се извинявам, но пиша на C/C++ и асемблер от 20г и почти никога не съм си позволявал да търся проблема в компилатора (с малки изключения и то предимно в библиотеките!) - и понеже видях няколко теми дето "скапания компилатор бил виновен" пуснати от хора дето тепърва се учат ... и ъъъ. не се сдържах ... :D


Значи не си работил с майкрочипския компилатор. Лично аз съм открил (и рипортвал) 5 или 6 бъга. Просто няма как да направиш такава сложна програма като компилатор без бъгове. То иначе нямаше да излизат по 20 версии на един и същи компилатор.....

Но принципно си прав, в 95% от случаите проблема е в юзера.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Апр 19, 2007 8:58 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
Цецо написа:
... Значи не си работил с майкрочипския компилатор. Лично аз съм открил (и рипортвал) 5 или 6 бъга. Просто няма как да направиш такава сложна програма като компилатор без бъгове. То иначе нямаше да излизат по 20 версии на един и същи компилатор.....

Но принципно си прав, в 95% от случаите проблема е в юзера.


вярно е - както съм писал по-горе с пик съм работил преди 10-на год. (някаква въшка 16ц??), но продължавам да твърдя че компилаторите са последното нещо в което трябва да се съмнява човек!
реда (на бързо):
1) моя код (всичко което се сети човек :) )
2) хедър файлове
3) ключове (#дефине / #иф ..)
4) библиотеки
..
N) компилатор

винаги можеш да си генерираш асм. листинг на кода и да видиш причината за проблема (е .. трябва да знаеш асм :) поне )

само за куриоз:
преди 10-на дена си получих нотбука Dell M65 с Core2duo и Vista (поръчан преди 40 дни :) ) и смятах да го направя ост. работна среда (в замяна на стария си Latitude D600+XP) ... обаче ... компилатора ми не щеше да работи ... по точно линкера (ilink32.exe) понякога даваше "access violation", генерираното exe имаше странно поведение (проекта ми е огромен: 1200 файла C++ 24+МБ ...)
съмних се че нещо компилатора (vista problem!?) не е наред (BDS2006/BCB10 работи на старите ми D5000e и D600) ... пробвах какво ли не - с ... частичен успех.
излезе hotfix12 за компилатора - и пак нищо ... в същия ден излезе ъпдате на биоса - оказа се че Core2duo си има сериозен проблем оправен от интел в микрокода - и сега всичко си е наред (без каквито и да били промени в софт.)

http://support.euro.dell.com/support/downloads/download.aspx?c=bg&l=en&s=bsd&releaseid=R152939&SystemID=LATITUDE%20PRECISION%20M65&servicetag=%20&os=WLH&osl=en&deviceid=10435&devlib=0&typecnt=0&vercnt=6&catid=-1&impid=-1&formatcnt=1&libid=1&fileid=203805
малко по-въпроса от интел:
http://download.intel.com/design/mobile/SPECUPDT/31407908.pdf
http://download.intel.com/design/processor/specupdt/31327910.pdf

ако си начинаещ - последния в който трябва да се съмняваш е компилатора !


Чет Апр 19, 2007 9:31 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
значи бъг няма, но претупване на работата може би има. сериозните компилери сигнализират тази ситуация със предупреждение. ето какво дава микрософтския компилер
C:\programi\probi\probi.cpp(12) : warning C4172: returning address of local variable or temporary


Чет Апр 19, 2007 1:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
zaphod написа:
значи бъг няма, но претупване на работата може би има. сериозните компилери сигнализират тази ситуация със предупреждение. ето какво дава микрософтския компилер
C:\programi\probi\probi.cpp(12) : warning C4172: returning address of local variable or temporary


компилатора може да сигнализира ако върнеш адрес на локална променива дирекнто, но не и ако връщаш променлива поинтер - щото тя може да сочи където си иска!

принтер:
{
char szB[5];
...
return szB; // комп. вижда локален адрес
}

{
char szB[5];
char *p = szB;
...
return p; // р може да сочи където си иска - няма как комп. да предупреди
}


Чет Апр 19, 2007 2:20 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

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


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

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