Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прототип, [C] 
V
    Опции темы
Hagrael
Дата 15.8.2011, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Здравствуйте, товарищи программисты! Я пишу программу на языке С (под микроконтроллер). Возникла ошибка при написании прототипа функции:
Код

bool indPrintInt (int n, unsigned int width, unsigned int margin, bool minus, // эта строка
                                                        bool align, bool zeros);

Ошибка: '(' expected. Где там компилятор ожидает закрытия скобки? Я пробовал все впихать в одну строку, но это не помогло. Еще больше ошибок выводится, когда в прототип вписываю аргументы по умолчанию. C++ тоже ругается, когда в прототип и в функцию записываю аргументы по умолчанию. Разве так нельзя делать? Если нужно, то вот сама функция на данный момент:
Код

bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true,
                                                        align = true, bool zeros = false) {
                                                        
    int tmp, withoutMinus = minus ? width-1 : width,
        realWidth = 0, nArr[width];
    
    int i;
    
    int indError = IND_NO_ERRORS;
    
    bool negative = false;

    if (n == 0) {
        realWidth = 1;
    } else {
        while (tmp != 0) {
            
            nArr[realWidth] = tmp % 10;                                                                
            realWidth++;
            tmp /= 10;
            
        }
    }
    
    if (realWidth > withoutMinus) {
        indError = IND_TOO_SMALL_PLACE;
        return false; 
    }

    if (align) {
        
        for (i = realWidth; i>0; i--) {
            
        }
        
    }
    
    return true;

}


Это сообщение отредактировал(а) Hagrael - 15.8.2011, 08:13
PM MAIL   Вверх
ller
Дата 15.8.2011, 08:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Код

bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true,
                                                        align = true, bool zeros = false) {


Значения по умолчанию указываются только при декларации функции, а не при её определении
PM MAIL   Вверх
mes
Дата 15.8.2011, 08:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Hagrael @  15.8.2011,  07:12 Найти цитируемый пост)
 на языке С 

#include <stdbool> ?


--------------------
PM MAIL WWW   Вверх
Hagrael
Дата 15.8.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Новая ошибка: ',' expected, but '=' found. Что теперь делать?
Код

bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true, // эта линия
                                                        bool align = true, bool zeros = false) {
                                                        
    int tmp, withoutMinus = minus ? width-1 : width,
        realWidth = 0, nArr[width];
    
    int i;
    
    int indError = IND_NO_ERRORS;
    
    bool negative = false;

    if (n == 0) {
        realWidth = 1;
    } else {
        while (tmp != 0) {
            
            nArr[realWidth] = tmp % 10;                                                                
            realWidth++;
            tmp /= 10;
            
        }
    }
    
    if (realWidth > withoutMinus) {
        indError = IND_TOO_SMALL_PLACE;
        return false; 
    }

    if (align) {
        
        for (i = realWidth; i>0; i--) {
            
        }
        
    }
    
    return true;

}

PM MAIL   Вверх
ller
Дата 15.8.2011, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Код

bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true,
                                                        align = true, bool zeros = false) {

    


Значения по умолчанию указываются только при декларации функции, а не при её определении 

Код

somefile.h

bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true,
                                                        align = true, bool zeros = false);

somefile.c
bool indPrintInt (int n, unsigned int width, unsigned int margin, bool minus,
                                                        align, bool zeros)
{
}


PM MAIL   Вверх
Hagrael
Дата 15.8.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



ller, все написал, как вы сказали, и кмпилятор выдает ту же ошибку: expected ',' but found '='. Ругается он на = в прототипе.

proto.h:
Код


inline void indInit ();
bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true, // ругань
                                                        bool align = true, bool zeros = false);

inline void __indSwitchOff ();
inline void __indSwitchOn (unsigned int f);
void __indPrintNumber_0 ();
void __indPrintNumber_1 ();
void __indPrintNumber_2 ();
void __indPrintNumber_3 ();
void __indPrintNumber_4 ();
void __indPrintNumber_5 ();
void __indPrintNumber_6 ();
void __indPrintNumber_7 ();
void __indPrintNumber_8 ();
void __indPrintNumber_9 ();

extern void (* __indPrintNumber[10]) ();

lib.h:
Код

#include <stdbool.h>
#include "proto.h"                              // прототипы всех функций
#include "error.h"

void (* __indPrintNumber[10]) ();               // массив с функциями переключения сегментов индикатора
                                                // для вывода определенных цифр

inline void indInit() {                         // заполнение массива __indPrintNumber соответствующими
                                                // функциями

    __indPrintNumber [0] = __indPrintNumber_0;
    __indPrintNumber [1] = __indPrintNumber_1;
    __indPrintNumber [2] = __indPrintNumber_2;
    __indPrintNumber [3] = __indPrintNumber_3;
    __indPrintNumber [4] = __indPrintNumber_4;
    __indPrintNumber [5] = __indPrintNumber_5;
    __indPrintNumber [6] = __indPrintNumber_6;
    __indPrintNumber [7] = __indPrintNumber_7;
    __indPrintNumber [8] = __indPrintNumber_8;
    __indPrintNumber [9] = __indPrintNumber_9;

}

bool indPrintInt (int n, unsigned int width, unsigned int margin, bool minus,
                                                        bool align, bool zeros) {
                                                        
    int tmp, withoutMinus = minus ? width-1 : width,
        realWidth = 0, nArr[width];
    
    int i;
    
    int indError = IND_NO_ERRORS;
    
    bool negative = false;

    if (n == 0) {
        realWidth = 1;
    } else {
        while (tmp != 0) {
            
            nArr[realWidth] = tmp % 10;                                                                
            realWidth++;
            tmp /= 10;
            
        }
    }
    
    if (realWidth > withoutMinus) {
        indError = IND_TOO_SMALL_PLACE;
        return false; 
    }

    if (align) {
        
        for (i = realWidth; i>0; i--) {
            
        }
        
    }
    
    return true;

}

/*void indPrintInt (int n, int q) {               // функция, выводящая на индикатор число
 
    int i;
    int currNumber, currField;

    IND_PORT_DP = 1;

    for (i = 0; i<q; i++) {
    
        __indSwitchOff ();

        currNumber = n % 10;
        currField = q-i;
        
        __indPrintNumber [currNumber] ();
        __indSwitchOn (currField);
        
        n /= 10;

    }
    
}*/

inline void __indSwitchOff () {                 // функция, выключающая все контакты 1234,
                                                // подавая на них -

    IND_PORT_1 = 0;
    IND_PORT_2 = 0;
    IND_PORT_3 = 0;
    
}

inline void __indSwitchOn (unsigned int f) {            // функция, включающая определенную цифру
                                                        // у индикатора

    if (f == 1) {
        IND_PORT_1 = 1;
    } else if (f == 2) {
        IND_PORT_2 = 1;
    } else if (f == 3) {
        IND_PORT_3 = 1;
    }

}

// функции, управляющие контактами ABCDEFG индикатора, чтобы нарисовать цифру
void __indPrintNumber_0 () {

    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 1;

}

void __indPrintNumber_1 () {

    IND_PORT_A = 1;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 1;
    IND_PORT_E = 1;
    IND_PORT_F = 1;
    IND_PORT_G = 1;

}

void __indPrintNumber_2 () {

    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 1;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 1;
    IND_PORT_G = 0;

}

void __indPrintNumber_3 () {

    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 1;
    IND_PORT_F = 1;
    IND_PORT_G = 0;

}

void __indPrintNumber_4 () {

    IND_PORT_A = 1;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 1;
    IND_PORT_E = 1;
    IND_PORT_F = 0;
    IND_PORT_G = 0;

}

void __indPrintNumber_5 () {

    IND_PORT_A = 0;
    IND_PORT_B = 1;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 1;
    IND_PORT_F = 0;
    IND_PORT_G = 0;

}

void __indPrintNumber_6 () {

    IND_PORT_A = 0;
    IND_PORT_B = 1;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 0;

}

void __indPrintNumber_7 () {

    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 1;
    IND_PORT_E = 1;
    IND_PORT_F = 1;
    IND_PORT_G = 1;

}

void __indPrintNumber_8 () {

    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 0;
    IND_PORT_F = 0;
    IND_PORT_G = 0;

}

void __indPrintNumber_9 () {

    IND_PORT_A = 0;
    IND_PORT_B = 0;
    IND_PORT_C = 0;
    IND_PORT_D = 0;
    IND_PORT_E = 1;
    IND_PORT_F = 0;
    IND_PORT_G = 0;

}

PM MAIL   Вверх
borisbn
Дата 15.8.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Hagrael, на такой прототип ругаться не может.
http://liveworkspace.org/code/3f1936be1eae...3c46d45cae95fd9
Ошибка где-то выше... или ниже...

Это сообщение отредактировал(а) borisbn - 15.8.2011, 11:17


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ller
Дата 15.8.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Код

main.cpp
#include <iostream>
#include "lib.h"

using namespace std;



int main(int argc, char *argv[])
{

    std::cout << "test";
//    pause();
    return 0;
}


lib.h
#include "proto.h"

//bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true, bool align = true, bool zeros = false)
bool indPrintInt (int n, unsigned int width, unsigned int margin , bool minus , bool align , bool zeros )
{
    return true;
}

proto.h
bool indPrintInt (int n, unsigned int width, unsigned int margin = 0, bool minus = true, // ругань
                                                        bool align = true, bool zeros = false);

вывод компилятора
Код


Запускается "C:\MinGW\bin\mingw32-make.exe" -w
mingw32-make: Entering directory `D:/Qt Proect/test-build-desktop'
MinGW/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `D:/Qt Proect/test-build-desktop'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"...\include\QtCore" -I"...\include\QtGui" 

-I"\Qt\include" " -I"Qt\include\ActiveQt" -I"debug" -I"..\test" -I"." -I"Qt\mkspecs\win32-g++" -o debug\main.o ..\test\main.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-subsystem,console -mthreads -Wl -o debug\test.exe debug/main.o  -L"..\Qt\lib"  -lQtGuid4 -lQtCored4 

mingw32-make[1]: Leaving directory `.../test-build-desktop'
mingw32-make: Leaving directory `.../test-build-desktop'
Процесс "MinGW\bin\mingw32-make.exe" завершился нормально.


Все компилируется

Это сообщение отредактировал(а) ller - 15.8.2011, 11:22
PM MAIL   Вверх
Hagrael
Дата 15.8.2011, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



ller, borisbn, речь идет о C, а не о C++!
PM MAIL   Вверх
borisbn
Дата 15.8.2011, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Hagrael @  15.8.2011,  11:46 Найти цитируемый пост)
ller, borisbn, речь идет о C, а не о C++!

уууупс. пропустил. тогда НИКАК. мало того, bool/true/false - тоже нельзя использовать


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Hagrael
Дата 15.8.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



borisbn, я по началу как-раз таки сомневался, есть ли аргументы по умолчанию в Си. Но увидев эту статью решил, что они есть smile
PM MAIL   Вверх
borisbn
Дата 15.8.2011, 15:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Hagrael, да, видел эту статью, но какая-то она невнятная... говорится о каком-то "наследии" Си, а код - чисто Си++...
вот интересная статейка
см. п. 9 про default-аргументы


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Hagrael
Дата 15.8.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



borisbn, спасибо за статью.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0697 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.