Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

PIC C18 - Warning [2058] call of function without prototype
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10684
Страница 1 от 1

Автор:  npelov [ Нед Ное 11, 2012 12:38 pm ]
Заглавие:  PIC C18 - Warning [2058] call of function without prototype

Това вече от доста време ме тормози и не мога да разбера какво става. Дава ми "call of function without prototype", но само на някои функции от header file-a:
Извиквам функиите така:

Код:
#include "lib18/lcd.h"
.....
  initLcd();
  initBacklight();
  lcdWriteStrRom("NS Toolbox v2.1");


Дава ми warning САМО на initBacklight(). На другите 2 не дава. Всъщност на никоя друга функция не дава warning.

lcd.h e:
Код:
#ifndef __LCD_H
#define __LCD_H
#include <stdint.h>
#include "const.h"

#define DEBUG_MODE   1
#define lcdDebugTris   TRISAbits.RA3
#define lcdDebugPin   LATAbits.LATA3
#define lcdDebugAnalog   ANSELAbits.ANSA3

// LCD Backlight
#define lcdBLTris  TRISBbits.RB5
#define lcdAnsel   ANSELBbits.ANSB5
#define lcdBLCCPCON  CCP3CON
#define lcdBLCCPR    CCPR3
#define lcdBLCCPRL   CCPR3L
#define lcdBLCCPRH   CCPR3H
#define lcdBLTmrSel  CCPTMRS0bits.C3TSEL
#define lcdBLDC      CCP3CONbits.DC3B


void initLcd(void);
void lcdWriteChar(const char c);
void lcdWriteStrRom(const rom char * str);
void lcdWriteStr(const char * str);
void lcdClear(void);
void lcdWriteCmd(char c);
void initBacklight();
void setLcdBacklight(int x);

#define lcdSetDDAddress(x) lcdWriteCmd(x|0x80)
#define lcdGoto(x,y) lcdSetDDAddress((x+(y>>1)*20) + ((y&1)*0x40))

#endif // __LCD_H


Тялото на initBacklight():

Код:
void initBacklight(){
  lcdBLTris = 0; // output
  lcdAnsel = 0;
  lcdBLCCPCON = 0x0F;
  lcdBLCCPR = 0;
  lcdBLTmrSel = 2; // 2 = Timer 6 for PWM
  lcdBLCCPRL = 0;
  lcdBLDC = 0x00;

  PR6 = 0xFF;

  TMR6 = 0;
  //Timer6
  T6CON = 0x04;
  PMD0bits.TMR6MD = 0;
  PMD1bits.CCP3MD = 0;
  //T6CONbits.T6OUTPS = 0; // 1:1
  //T6CONbits.TMR6ON = 1; // bit 2
  //T6CONbits.T6CKP = 0; // bits 1-0


  setLcdBacklight(0);
}

Автор:  ps66 [ Нед Ное 11, 2012 1:22 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

void initBacklight(void);


void initBacklight(void)
{
}

Автор:  npelov [ Нед Ное 11, 2012 4:31 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

първото е в header file-a. за initLcd() не дава тази грешка, а са декларирани по същия начин

Автор:  palavrov [ Нед Ное 11, 2012 5:26 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

За C++ и някои C компилатори
Код:
void initBacklight(void);
е различно от
Код:
void initBacklight();
Принципно ако не декларираш explicit функцията като void а просто я декларираш () компилатора приема implicit, че тя има един int параметър - т.е. става
Код:
void initBacklight(int);
PIC C компилаторите са малко особенни, скоро се борих с едни Hitech C за PIC - мамата ми се разката докато изчистя всички warnings ... например
Код:
uiunt8_t v;
v = 5; // warning: implicit conversion from signed to unsigned т.е. трябва да е v = 5u;
v = v - 1; // warning: arithmetic overflow - това може да подлуди човек, един път го дава, един път не
v--; // това е ОК, а горното не?!

Имаше и други простотии, ама не ми се пише в момента ...

Автор:  npelov [ Нед Ное 11, 2012 10:49 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

:))))

Мерси! Имам някакво усещане, че това не е правилно, но ти го казваш така като че ли е стандарт. Явно някой едно време го е решил така и после някой друг е обявил първия за кретен и го е махнал... а Микрочип (както и аз) не са чували за този втория и затова си карат по тъпия начин.

Автор:  Nikola Kirov [ Нед Ное 11, 2012 10:56 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

"Принципно ако не декларираш explicit функцията като void а просто я декларираш () компилатора приема implicit, че тя има един int параметър - т.е. става "

Това пък къде си го гледал? По принцип понякога не си слагам void при декларациите но не съм забелязал в асемблерските листинги нещо нередно. Не ми се вижда и логично да е така.

Автор:  perlsite [ Пон Ное 12, 2012 2:19 am ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

Поне на теория (дотолкова, доколкото стандарта се спазва):
в "С":
void funct (void) - фунция неочакваща входни аргументи;
void funct () - функция очакваща произволен брой аргументи от неопределен тип;

в "С++":
void funct (void) - фунция неочакваща входни аргументи;
void funct () - фунция неочакваща входни аргументи, т.е. еднакво с горния ред.

Автор:  palavrov [ Пон Ное 12, 2012 2:02 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

Така е като се пише по памет - получават се глупости ... извинявам се.

На функции без прототип в C, компилатора прави прототип от рода на int fn(); т.е. функцията връща int и се опитва да познае какви са параметрите според употребата и. ( не както е останало в дебелата ми глава че има подразбиращ се инт параметър )

Малко по особен е случая като има декларация от рода на type fn(); - това се води декларация, но не прототип - прототип е когато се укажат точно параметрите. В C89/90 не ти трябва нито прототип, нито декларация за да се компилира (това разбира се не значи, че трябва да се прави така), в C99 е задължително преди извикване функцията да е декларирана, но не е задължително да има прототип.

Т.е. в примера се декларира функция, но не и се прави прототип - затова и има варнинг.

Автор:  npelov [ Пон Ное 12, 2012 6:13 pm ]
Заглавие:  Re: PIC C18 - Warning [2058] call of function without protot

@Nikola Kirov Не знам какво си мисли компилатора, но поне за C18 като сложа void в скобите спира да ми дава warning. За мен това е достатъчно. Дали по подразбиране решава че има 1 инт параметър - не знам, но не работи както трябва без (void) ... понякога.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/