Error l104 multiple public definitions

I am two C files in a project. 1. main.c 2. rtc.c and third one is header file for both in which all prototypes are defined. I want to use a bit variables

This discussion has been locked.

You can no longer post new replies to this discussion. If you have a question you can start a new discussion

I am two C files in a project.
1. main.c
2. rtc.c and third one is header file for both in which all
prototypes are defined.

I want to use a bit variables named aon and aoff in both
files.
Now three condition arises

1. i declare extern bit aon,aoff; in header file but it gives
error

//ERROR L104: MULTIPLE PUBLIC DEFINITIONSERROR L104: MULTIPLE
PUBLIC DEFINITIONSERROR L104: MULTIPLE PUBLIC DEFINITIONSextern bit
aon=0,aoff=0;

2. i declare extern bit aon,aoff; in onlyin main file but it gives
error

aon and aoff not declared in rtc; and vice versa

3. i declare in both c files than again i gives error

//ERROR L104: MULTIPLE PUBLIC DEFINITIONSERROR L104: MULTIPLE
PUBLIC DEFINITIONSERROR L104: MULTIPLE PUBLIC DEFINITIONSextern bit
aon=0,aoff=0;

Why?

  • Artem Gusev

    Hello!.
    Maybe this help to you.
    Define the variables as follows in main.h or main.c

    unsigned long var1;
    unsigned long var2;
    


    in othe header file where you need to define this variable define as
    follows

    extern unsigned long var1;
    extern unsigned long var2;
    

    Sorry for my english.:)
    With best regards Artem Gusev.

  • Artem Gusev

  • HansBernhard Broeker

    i declare

    Actually, no, you didn’t, because this

    extern bit aon,aoff;

    is not what you actully wrote. You defined those variables
    instead:

    extern bit aon=0,aoff=0;
    

    Pick up your C textbook and read up on the difference between a
    definition and a declaration. If you don’t have a textbook, it’s high
    time you got one.

Содержание

  1. Error l104 multiple public definitions
  2. Вопросы по С/С++ (СИ)
  3. Кто сейчас на форуме

Error l104 multiple public definitions

Форум РадиоКот
Здесь можно немножко помяукать 🙂

Текущее время: Пн янв 16, 2023 02:07:51

Часовой пояс: UTC + 3 часа

Вопросы по С/С++ (СИ)

Автор Сообщение
Аlex
Модератор

Карма: 80
Рейтинг сообщений: 932
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4461
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1

Реклама
Gudd-Head
Друг Кота

Карма: 67
Рейтинг сообщений: 974
Зарегистрирован: Чт сен 18, 2008 12:27:21
Сообщений: 18165
Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения: 0
Медали: 1

_________________
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Измерить нннада?

Реклама

Aerarh

Открыл глаза

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74
Рейтинг сообщения: 0

Кто это объяснит (PICC 9.6)?

Error [1346] ; 0. can’t find 0x2 words for psect «config» in segment «CONFIG» (largest unused contiguous range 0x1)

_________________
Поговорим в скайпе fl.ua.aaa.

Реклама

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Vlad0o

Открыл глаза

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67
Рейтинг сообщения: 0

Поскольку sprintf() — чет уж очень слишком большой. Я мучил гугл в поисках его альтернативы. Нашел itoa() (из int делает char*). В функция нестандартная, в обычных библиотеках Keil’a ее нет. Может у кого завалялся листинг itoa() ? Поделитесь, пожалуйста. sprintf уж очень неэкономично..

ЗЫ пробовал взять отсюда http://www.scribd.com/doc/59309455/ITOA-C , скопировалось с косяками. поправлял долго, но все равно достаточное количество ошибок.
Ругается вот так *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
на SYMBOL: cadena и SYMBOL: _itoa

Реклама

Линейка изолированных DC/DC-преобразователей VCB и VCF с диапазоном мощности 3…400 Вт предназначена для использования в телекоммуникационной аппаратуре. Эти новые преобразователи третьего поколения (R3) выпускаются в типоразмерах SIP, 1/4 Brick, 1/8 Brick и 1/16 Brick. Данные DC/DC отвечают требованиям стандарта DOSA, имеют диапазон входного напряжения 2:1 (36…75 В), обладают высокой эффективностью (КПД до 93%) и широким температурным диапазоном -40…85ºС. Изоляция «вход-выход» составляет 1500/2250 В. VCB и VCF выпускаются в двух вариантах по логике управления: N (отрицательной) и P (положительной).

IfoR
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 22
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Сообщений: 2016
Откуда: г. Тула
Рейтинг сообщения: 0

Ну можно сымпровизировать. Это урезанная версия: минимальный набор для чисел с десятичным основанием системы счисления. Полная версия будет немного поболее, если она вообще нужна будет.

void itoa ( int value , char * str )
<
char * n ;
char buff ;

if ( value 0 ) <*( str ++)= ‘-‘ ; value =- value ;>// Если число отрицательное, то ставим минус
n = str ; // Запоминаем указатель на начало конца. O_o Числа, в смысле.
while ( value ) < *( str ++) = value % 10 + ‘0’ ; value /= 10 ; >// Преобразовываем число в строку задом на перёд
*( str —) = 0 ; // Ставим нуль-символ конца строки

Естественно не исключаю и подозреваю, что сделать можно оптимальнее.

_________________

/dev/urandom — гигабайты информации.

OS: openSUSE 13.2 (x86_64)

Реклама
Реклама

В промышленных устройствах и установках с электроприводом на двигателях постоянного тока в момент пуска требуется обеспечить повышенный ток. Для решения этой задачи MEAN WELL предлагает вместо ИП с повышенной избыточной мощностью, более оптимальное решение — источник питания с необходимой перегрузочной способностью семейства HRP/N3. Новое семейство, представленное в Компэл, экономичнее и расширяет уже существующее HRP/N в увеличении кратности перегрузки.

Vlad0o

Открыл глаза

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67
Рейтинг сообщения: 0

IfoR
Подобный вариант мне попадался. Только я что то протупил над той функцией. void itoa( int value, char * str ) здесь value это число которое надо преобразовать, а str это массив куда всё записывается.
Как мне этой функцией воспользоваться?
я предполагаю что так (для проверки):
int T;
char sT[25];
void itoa( int value, char * str );
void main (void)
<
T = 25;
itoa(T, sT);

write_1(0, sT); //вывод на ЛСД
while (1)
<>
>

Примерно так? Или все проще делается с ней?
Я просто хочу вывести на экран значения с ds1820 примерно такие -55 и 125 (без знака +)

ЗЫ У меня пока главной задачей в оптимизации стоит избавление от sprintf

Реклама

Aerarh

Открыл глаза

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74
Рейтинг сообщения: 0

void LCD_WriteInt(unsigned int Data)
<
LCD_WriteChar((Data%100000)/10000+0x30);
LCD_WriteChar((Data%10000)/1000+0x30);
LCD_WriteChar((Data%1000)/100+0x30);
LCD_WriteChar((Data%100)/10+0x30);
LCD_WriteChar((Data%10)+0x30);
>

void LCD_WriteBCD(char Data)
<
LCD_WriteChar((Data&0x0F)+0x30);
>

void LCD_WriteBCDChar(char Data)
<
LCD_WriteBCD((Data&0xF0)>>4);
LCD_WriteBCD(Data&0x0F);
>

void LCD_WriteString(const char * Str)
<
while(*Str) LCD_WriteChar(*Str++);
>

void LCD_WriteVoltageInt(unsigned int Data)
<
LCD_WriteChar((Data%1000)/100+0x30);
LCD_WriteChar(‘.’);
LCD_WriteChar((Data%100)/10+0x30);
LCD_WriteChar((Data%10)+0x30);
>

_________________
Поговорим в скайпе fl.ua.aaa.

Vlad0o

Открыл глаза

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67
Рейтинг сообщения: 0

Aerarh

Открыл глаза

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74
Рейтинг сообщения: 0

Да те же проблемы. С флоатами. Без sprintf никак. Место еще вполне, но не работает. Че то я не так пишу.

А простячки выше работают без ошибки и почти ничего не весят.

LCD_WriteChar это ваша функция прямого вывода на LCD.

_________________
Поговорим в скайпе fl.ua.aaa.

IfoR
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 22
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Сообщений: 2016
Откуда: г. Тула
Рейтинг сообщения: 0

_________________

/dev/urandom — гигабайты информации.

OS: openSUSE 13.2 (x86_64)

Кислый
Поставщик валерьянки для Кота

Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01
Сообщений: 2096
Откуда: Краснодар
Рейтинг сообщения: 0

переставил бубунту, x86 проэкты компилятся, авр-овские нет.

и хз что с этим делать. (у меня gcc версия 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

_________________
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics

Vlad0o

Открыл глаза

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67
Рейтинг сообщения: 0

Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.

IfoR, странно. я вроде так и использовал, но экран оставался пустым. еще раз попробую, может где то что то не так скопировал я. сейчас по-быстрому проверял, как то странно вышло мне компилятор сказал что слишком много параметров, когда я вот так подставил itoa(T, sT). я все равно это itoa добью))

IfoR
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 22
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Сообщений: 2016
Откуда: г. Тула
Рейтинг сообщения: 0

_________________

/dev/urandom — гигабайты информации.

OS: openSUSE 13.2 (x86_64)

Aerarh

Открыл глаза

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74
Рейтинг сообщения: 0

[quote=»Vlad0o»]Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.

Да, по началу нагрузочка глаза разбегаются. Все в отладочном режиме, еще знак и нули. в общем мод «хоть что-то покажи, а красоту потом наведем»

_________________
Поговорим в скайпе fl.ua.aaa.

Vlad0o

Открыл глаза

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67
Рейтинг сообщения: 0

levaclaus
Потрогал лапой паяльник

Зарегистрирован: Пн янв 07, 2008 16:56:28
Сообщений: 302
Откуда: Минск
Рейтинг сообщения: 0

пытаюсь переделать один проект «под себя» — термометр на динамике

как-то странно выводится температура на сегменты — нет постоянно горящих 4 цифрзнаков. происходит поочерёдное включение сегментов. Как победить?

stas00n

Вымогатель припоя

Карма: 2
Рейтинг сообщений: 2
Зарегистрирован: Пн мар 23, 2009 04:03:45
Сообщений: 557
Рейтинг сообщения: 0

Кто это объяснит (PICC 9.6)?

Error [1346] ; 0. can’t find 0x2 words for psect «config» in segment «CONFIG» (largest unused contiguous range 0x1)

Аlex
Модератор

Карма: 80
Рейтинг сообщений: 932
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4461
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1

Aerarh

Открыл глаза

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74
Рейтинг сообщения: 0

Кто это объяснит (PICC 9.6)?

Error [1346] ; 0. can’t find 0x2 words for psect «config» in segment «CONFIG» (largest unused contiguous range 0x1)

Да я уже разобрался, Так и было, и дефайны нашел именно там. Спс.

_________________
Поговорим в скайпе fl.ua.aaa.

Vlad0o

Открыл глаза

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67
Рейтинг сообщения: 0

Надеюсь я не исчерпал свою квоту на глупые вопросы.

У меня возникло очередное затруднение, скорее всего из специфичности самодельного девелопментборда (как оказалось этот термин больше подходит, чем «kit»).

К третьему порту (Р3) по пинам (3.1, 3.2, 3.3, 3.4) подключен LCD (работает ). Но! Для экономии портов на эти же пины ( 3.1 — 3.4) посадили кнопки (обычные кнопки) и с помощью контрольного пина 3.0 так сказать проверяется нажата ли кнопка или нет.
Вот так вот примерно http://i023.radikal.ru/1111/b8/80306427b39b.jpg.
Опрашивать получается — светодиод при нажатии загорается.
Вот такой вот бесконечный цикл для проверки.

while (1)
<
P3MDOUT = 0; //определение порта на вход
B1 = 0;
B2 = 1; //опрос именно этой кнопки!
B3 = 0;
B4 = 0;

Но если подставить вместо «LED1 = 1;» вывод на экран произвольного текста при нажатии, то ничего хорошего не получается. выводится только то что стоит в else (я так понимаю какой то «конфликт» — ведь один же порт используется). У меня даже в процессе экспериментов с кодом при нажатии длительном бледная буква «й» пробегала (один раз) по верхней строке справа налево (а ведь это не планировалось ) и при этом на той же верхней строке более ярко был текст. К сожалению текст программы утерян..

Как мне разобраться с кнопкой? К примеру сделать счетчик нажатий кнопки. Нажимаешь — 1, еще раз — 2 на экране единицу сменяет двойка. как то так. Я понял только то что надо использовать «флаги» — глобальные переменные которые сохраняют текущее и предыдущее состояния кнопки. но пока это не дало результатов.

Страница 49 из 373 [ Сообщений: 7443 ] На страницу Пред. 1 . 46 , 47 , 48 , 49 , 50 , 51 , 52 . 373 След.

Часовой пояс: UTC + 3 часа

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Источник

Читайте также:  K63 wireless обновление прошивки

Adblock
detector

Member Avatar

14 Years Ago

Hello everyone,
I am having problem with a multiple public definition:

ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: currenpacketbeingsampled
MODULE: DataSampling.obj (DATASAMPLING)
DEFINED: Main.obj (MAIN)

The variable in question is defined only once in the header file, and only used in the associated C file. From my understanding a macro guard should prevent the error that i am getting. The header file code is shown below, can anyone see a reason why i would be getting the error???

Thanks.


<code>
#ifndef DS_H
#define DS_H

#include <stdio.h>
#include <stdlib.h>
#include «hal.h»
#include «cc1010eb.h»
#include «Reg1010.h»


#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif

#define AD0ECG 1
#define AD1PULSE 2
#define AD2TEMPSENSOR 3
#define AD2RSSI 4

void InitialiseDataSampling(byte xdata DataTypes);
void SampleData(bool xdata condition);
void SetupADC(char SetupType);

extern byte xdata ECGcount; //The destination element of the next ECG data in ECGsamples[]
extern byte xdata TEMPcount; //The destination element of the next temperature data in TempData[]

char xdata currentpacketbeingsampled;
extern char xdata nextpackettosend;

extern byte xdata DataSampled;

extern short int ECGsamples[50];
extern int maximumvalue;

#endif //DS_H
</code>


Recommended Answers

What he’s getting at is variables should be defined only in code files, the .C or .CPP files. NEVER put a definition in a header file. Only the extern goes in the .H file.

The guards are only useful when a header file is used twice during a single …

Jump to Post

All 4 Replies

Member Avatar


ArkM

1,090



Postaholic


14 Years Ago

1. Use code tags correctly:
[code=c]
source

[/code]
2. It’s not a declaration only (with extern) for global variable: it’s a very strange definition (with enormous macros currentpacketbeingsampled? or with macros xdata? ):

char xdata currentpacketbeingsampled;

Never add definitions (except classes and templates in C++) in header files.
Never use so strange syntax with macros.

Member Avatar

14 Years Ago

Thanks for the reply ArkM, but im not sure what you are getting at.

I am writing my program in C, not C++. I wanted to place global variable declarations in the header file, that way it would be easier to keep track of the ones that are used in the associated C-file.
I require the variables to be declared in xdata, not data memory space, and currentpacketbeingsampled is a char variable.

Member Avatar


WaltP

2,905



Posting Sage w/ dash of thyme



Team Colleague


14 Years Ago

What he’s getting at is variables should be defined only in code files, the .C or .CPP files. NEVER put a definition in a header file. Only the extern goes in the .H file.

The guards are only useful when a header file is used twice during a single compilation. When you compile 2 separate sources individually, the headers files are processed as normal and each object file gets the definitions specified — both sources will have currentpacketbeingsampled defined.

Member Avatar

14 Years Ago

Thank you for the clarification. I’ll just have to reorganize my declarations a little now, rather than keep fighting the compiler.


Reply to this topic

Be a part of the DaniWeb community

We’re a friendly, industry-focused community of developers, IT pros, digital marketers,
and technology enthusiasts meeting, networking, learning, and sharing knowledge.

See more:

I have Declared all my declaration in one file called ADeclaration.h and included this file in all my module C files.

i.e.

I have

MAIN.c (MAIN)
 Port_IO.c (PORT_IO)
 STORAGE.c (STORAGE)
 TEMPERATURE.c (TEMPERATURE)
 CONVERT.c (CONVERT)
 UART.c (UART)
 RTC.c (RTC)
 I2C.c (I2C)
 ISR.c(ISR)
 FLASH.c (FLASH)

All the declaration of this files are in Adeclaration.h

Now I am getting my project.M51 with
Program Size: data=157.5 xdata=5988 code=11148
LINK/LOCATE RUN COMPLETE. 29 WARNING(S), 294 ERROR(S)

and the target is not created

most of the error are like

*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  LOCAL
    MODULE:  STORAGE.obj

Updated 12-Oct-10 23:46pm


The linker complains about multiple definitions, not declarations.
If you need to use a symbol (for instance a variable) in multiple sources then you have to:

  • Define it in one, single source.
  • Declare it, as extern in all the other sources (you may include an header file for the purpose).

e.g.:

header file decl.h

#ifndef _DECL_H_
#define _DECL_H_

extern int global_counter;

#endif

source file src1.c

int global_counter; 

source file src2.c

#include "decl.h"


int increment()
{
  global_counter++;
}

and so on…

:)

Simply put this in your ADeclaration.h to avoid multiple inclusions:

#ifndef ADECLARATION_H
#define ADECLARATION_H

 

#endif

Good luck!

Updated 12-Oct-10 23:02pm

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

CodeProject,
20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8
+1 (416) 849-8900

Does the header file couldn’t include another header file in C?

I download the code from Nuvoton website, for Keil C51 project, use the UART sample code, just add the file «EasyTransfer.h» and include «Typedef.h», the result shows lots of error message below.

N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(1): error C231: ‘BIT’: redefinition
N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(2): error C231: ‘UINT8’: redefinition
N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(3): error C231: ‘UINT16’: redefinition
N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(4): error C141: syntax error near ‘UINT32’
N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(6): error C231: ‘uint8_t’: redefinition
N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(7): error C231: ‘uint16_t’: redefinition
N79E85x_Sample_Code_V1.0.8(1)IncludeTypedef.h(8): error C141: syntax error near ‘uint32_t’

The «EasyTransfer.h» is simple, just few of lines

#ifndef EasyTransfer_h
#define EasyTransfer_h
#include "Typedef.h"
uint8_t * address;  //address of struct    
#endif

The following is the main code and source link, I think it could be helpful to understand my question.

#define Uart_Port_Sel   0x00

#include <stdio.h>
#include "N79E85x.h"
#include "Typedef.h"
#include "Define.h"
#include "Common.h"
#include "Delay.h"
#include "Version.h"
#include "EasyTransfer.h"
UINT8 u8Uart_Data;

//-----------------------------------------------------------------------------------------------------------
void main (void)
{
    AUXR1 |= Uart_Port_Sel;             // Select P10/P11 as UART pin(default)

    InitialUART0_Timer1(9600);          // 9600 Baud Rate @ 11.0592MHz
    Show_Version_Number_To_PC();
    ES = 1;                             // Enable serial interrupt
    EA = 1;                             // Enable global interrupt

    while(1);                           // Endless
}
//-----------------------------------------------------------------------------------------------------------
void UART_ISR(void) interrupt 4
{
    if (RI == 1)
    {                                   // If reception occur
        RI = 1;                         // Clear reception flag for next reception
        u8Uart_Data = SBUF;             // Read receive data
        SBUF = u8Uart_Data;             // Send back same data on UART
    }
    else TI = 0;                        // If emission occur
                                        // Clear emission flag for next emission
}

Сейчас знакомлюсь с примерами для C8051F120 в комплекте с Silicon Labs IDE. В Keil выводит следующие ошибки в примере с UART:

У меня все три проекта (F12x_UART0(1)_Interrupt.c, F12x_UARTs_STDIO_Polled_2UARTs.c) собираются успешно. Версия компилятора Си 9.02, версия IDE uVision 4.0.

В последнем случае (F12x_UARTs_STDIO_Polled_2UARTs.c) есть только предупреждение, что функция _getkey () не используется и соотв. сегмент кода будет проигнорирован. У Вас же ошибки от линковщика, указывающие, например, на повторное определение структур (№104). Рекомендую разобраться с uVision, компилятором и сборщиком хотя бы поверхностно. Ну и хелпом надо пользоваться прежде чем на форум лезть (без обид), хелп у Кейла толковый, по Вашим ошибкам все расписано:

post-19987-1431028394_thumb.png

Мне почему-то кажется, что Вы несколько одинаковых файлов в проект включили, потому L51 ругается на повторный дефинишн.

Меня, как любителя, пока не радует ценовая политика на МК.

Согласен, лучше собрать самому. Я с F321 так и поступил, потом правда на работу купили оригинальный кит. Теперь у меня две борды (так и лежат без дела).

Не дают покоя STM8S от 17р и STM32F0 от 40р. Последние по ресурсам рядышком с, например, 8051F380, а в чем-то и опережают.

Да, кортексы, конечно, отбирают рынок у восьмибитников, у с8051 silabs’ов так точно заберут часть клиентов. Не зря же Cortex-M0/M0+ позиционируется как «32битник по цене 8битника» самим разработчиком. С ценниками на 51-е МК от Silabs ситуация вряд-ли изменится по крайней мере на старые серии, как заметил маэстро Harbinger.

Все-таки работаете со 120-м? Harbinger вроде как рекомендовал более старшие серии посмотреть (к его мнению стоит прислушаться).

—————-

Вдогонку. Я сейчас сам подыскиваю демоборду под Cortex-M0(+) смотрю на Gecko от Silabs, так там маленькие платки за 28 евро (копейки, по нашим меркам) включая некоторые и для M3! Цены смотрю на mouser.com — мне оттуда легче заказывать.

Форум РадиоКот • Просмотр темы — Вопросы по С/С++ (СИ)

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вс окт 30, 2011 19:50:36 

Модератор
Аватар пользователя

Карма: 85

Рейтинг сообщений: 1270

Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4478
Откуда: Планета Земля

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

Цитата:

write_1(0, «ОК») и на экране будет ОК

Конечно будет, никто и не спорит.
Речь идёт не о Вашей ф-ии, которая выводит данные на дисплей, а о строке. Вы объявили строку как константу и пытаетесь изменить её с помощью sprintf. Но забыли о том, что она не может меняться, т.к. она константа !

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

Gudd-Head

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пн окт 31, 2011 08:10:47 

Друг Кота
Аватар пользователя

Карма: 67

Рейтинг сообщений: 974

Зарегистрирован: Чт сен 18, 2008 12:27:21
Сообщений: 18181
Откуда: Столица Мира Санкт-Петербург

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

Vlad0o писал(а):

Неужели sprintf() так много занимает?

Да, больше килобайта.


_________________
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Измерить нннада?

Вернуться наверх
Реклама

Aerarh

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пн окт 31, 2011 11:20:37 

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74

Рейтинг сообщения: 0

Кто это объяснит (PICC 9.6)?

Error [1346] ; 0. can’t find 0x2 words for psect «config» in segment «CONFIG» (largest unused contiguous range 0x1)


_________________
Поговорим в скайпе fl.ua.aaa.

Вернуться наверх

Vlad0o

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пн окт 31, 2011 16:05:44 

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67

Рейтинг сообщения: 0

Поскольку sprintf() — чет уж очень слишком большой. Я мучил гугл в поисках его альтернативы. Нашел itoa() (из int делает char*). В функция нестандартная, в обычных библиотеках Keil’a ее нет. Может у кого завалялся листинг itoa() ? Поделитесь, пожалуйста. sprintf уж очень неэкономично..

ЗЫ пробовал взять отсюда http://www.scribd.com/doc/59309455/ITOA-C , скопировалось с косяками. поправлял долго, но все равно достаточное количество ошибок.
Ругается вот так *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
на SYMBOL: cadena и SYMBOL: _itoa

Вернуться наверх
Реклама

Выгодные LED-драйверы для решения любых задач

КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения.

Подобрать LED-драйвер>>

IfoR

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пн окт 31, 2011 21:47:55 

Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12

Рейтинг сообщений: 22

Зарегистрирован: Сб ноя 15, 2008 10:09:56
Сообщений: 2016
Откуда: г. Тула

Рейтинг сообщения: 0

Ну можно сымпровизировать. Это урезанная версия: минимальный набор для чисел с десятичным основанием системы счисления. Полная версия будет немного поболее, если она вообще нужна будет.

Код:


void itoa
( int value, char * str )
{
 char * n;
 char buff; if (value < 0) {*(str++)=‘-‘; value=-value;}  n = str;  while (value) {  *(str++) = value%10 + ‘0’; value /= 10; }   *(str—) = 0;  while (< str) { buff = *n; *(n++) = *str; *(str—) = buff; } }
 

Естественно не исключаю и подозреваю, что сделать можно оптимальнее.


_________________
Изображение
/dev/urandom — гигабайты информации.

OS: openSUSE 13.2 (x86_64)

Вернуться наверх
Реклама

Реклама

LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку

На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон.

Подробнее>>

Vlad0o

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 07:16:32 

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67

Рейтинг сообщения: 0

IfoR
Подобный вариант мне попадался. Только я что то протупил над той функцией. void itoa( int value, char * str ) здесь value это число которое надо преобразовать, а str это массив куда всё записывается.
Как мне этой функцией воспользоваться?
я предполагаю что так (для проверки):
int T;
char sT[25];
void itoa( int value, char * str );
void main (void)
{
T = 25;
itoa(T, sT);

write_1(0, sT); //вывод на ЛСД
while (1)
{}
}

Примерно так? Или все проще делается с ней?
Я просто хочу вывести на экран значения с ds1820 примерно такие -55 и 125 (без знака +)

ЗЫ У меня пока главной задачей в оптимизации стоит избавление от sprintf :)

Вернуться наверх

Aerarh

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 10:03:31 

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74

Рейтинг сообщения: 0

void LCD_WriteInt(unsigned int Data)
{
LCD_WriteChar((Data%100000)/10000+0x30);
LCD_WriteChar((Data%10000)/1000+0x30);
LCD_WriteChar((Data%1000)/100+0x30);
LCD_WriteChar((Data%100)/10+0x30);
LCD_WriteChar((Data%10)+0x30);
}

void LCD_WriteBCD(char Data)
{
LCD_WriteChar((Data&0x0F)+0x30);
}

void LCD_WriteBCDChar(char Data)
{
LCD_WriteBCD((Data&0xF0)>>4);
LCD_WriteBCD(Data&0x0F);
}

void LCD_WriteString(const char * Str)
{
while(*Str) LCD_WriteChar(*Str++);
}

void LCD_WriteVoltageInt(unsigned int Data)
{
LCD_WriteChar((Data%1000)/100+0x30);
LCD_WriteChar(‘.’);
LCD_WriteChar((Data%100)/10+0x30);
LCD_WriteChar((Data%10)+0x30);
}


_________________
Поговорим в скайпе fl.ua.aaa.

Вернуться наверх

Vlad0o

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 14:46:47 

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67

Рейтинг сообщения: 0

Aerarh, спасибо. опробую сегодня.

Вернуться наверх

Aerarh

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 15:10:04 

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74

Рейтинг сообщения: 0

Vlad0o писал(а):

Aerarh, спасибо. опробую сегодня.

Да те же проблемы. С флоатами. Без sprintf никак. Место еще вполне, но не работает. Че то я не так пишу.

А простячки выше работают без ошибки и почти ничего не весят.

LCD_WriteChar это ваша функция прямого вывода на LCD.


_________________
Поговорим в скайпе fl.ua.aaa.

Вернуться наверх

IfoR

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 17:05:08 

Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12

Рейтинг сообщений: 22

Зарегистрирован: Сб ноя 15, 2008 10:09:56
Сообщений: 2016
Откуда: г. Тула

Рейтинг сообщения: 0

Vlad0o, ну да, как-то так.
А как тебе проще надо? Ты же не объяснил. :)


_________________
Изображение
/dev/urandom — гигабайты информации.

OS: openSUSE 13.2 (x86_64)

Вернуться наверх

Кислый

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 18:22:35 

Поставщик валерьянки для Кота
Аватар пользователя

Карма: 2

Рейтинг сообщений: 23

Зарегистрирован: Чт апр 08, 2010 18:50:01
Сообщений: 2096
Откуда: Краснодар

Рейтинг сообщения: 0

переставил бубунту, x86 проэкты компилятся, авр-овские нет.

Код:

/usr/include/features.h|323|fatal error: bits/predefs.h: Нет такого файла или каталога|

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=635923 пишут что это баг gcc 4.6

и хз что с этим делать. (у меня gcc версия 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)


_________________
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics

Вернуться наверх

Vlad0o

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 18:40:06 

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67

Рейтинг сообщения: 0

Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.

IfoR, странно. я вроде так и использовал, но экран оставался пустым. еще раз попробую, может где то что то не так скопировал я. сейчас по-быстрому проверял, как то странно вышло мне компилятор сказал что слишком много параметров, когда я вот так подставил itoa(T, sT). я все равно это itoa добью))

Вернуться наверх

IfoR

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 01, 2011 19:58:50 

Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12

Рейтинг сообщений: 22

Зарегистрирован: Сб ноя 15, 2008 10:09:56
Сообщений: 2016
Откуда: г. Тула

Рейтинг сообщения: 0

Ко-о-о-о-од в студию!
(Пам-пам-пара-пара-пам-пам-па-па-па-па-ра-па-а-а-а-м!)


_________________
Изображение
/dev/urandom — гигабайты информации.

OS: openSUSE 13.2 (x86_64)

Вернуться наверх

Aerarh

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Ср ноя 02, 2011 05:35:14 

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74

Рейтинг сообщения: 0

[quote=»Vlad0o»]Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.

Да, по началу нагрузочка глаза разбегаются… Все в отладочном режиме, еще знак и нули… в общем мод «хоть что-то покажи, а красоту потом наведем»


_________________
Поговорим в скайпе fl.ua.aaa.

Вернуться наверх

Vlad0o

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Ср ноя 02, 2011 13:31:48 

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67

Рейтинг сообщения: 0

IfoR, извиняюсь. все работает :)) Я прежде чем предоставить код в студию, еще раз проверил и оказывается не зря)

Вернуться наверх

levaclaus

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пт ноя 04, 2011 09:27:22 

Потрогал лапой паяльник
Аватар пользователя

Зарегистрирован: Пн янв 07, 2008 16:56:28
Сообщений: 302
Откуда: Минск

Рейтинг сообщения: 0

пытаюсь переделать один проект «под себя» — термометр на динамике

как-то странно выводится температура на сегменты — нет постоянно горящих 4 цифрзнаков. происходит поочерёдное включение сегментов. Как победить?

while (1)
{
for (i=0;i<devices;i++)
{

#asm(«cli»);
znach=ds1820_temperature_10(&rom_codes[i][0])/10;
#asm(«sei»);
itoa((int)znach, str);
str1[0] = ‘+’;
strcat(str, str1);
delay_ms(5);

};
};

Вернуться наверх

stas00n

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пт ноя 04, 2011 09:47:40 

Карма: 2

Рейтинг сообщений: 2

Зарегистрирован: Пн мар 23, 2009 04:03:45
Сообщений: 557

Рейтинг сообщения: 0

Aerarh писал(а):

Кто это объяснит (PICC 9.6)?

Error [1346] ; 0. can’t find 0x2 words for psect «config» in segment «CONFIG» (largest unused contiguous range 0x1)

Вероятно Вы неправильно задали конфигурационное слово — оно у Вас больше 14 бит в размере, естественно для него не хватает места в конфиг-области памяти, которая размером 1 слово. Конфигурировать надо примерно так:

Код:

__CONFIG (LVPDIS & BORDIS & MCLREN & PWRTEN & WDTDIS & INTCLK & PROTECT);

Дефайны для макроса __CONFIG можно посмотреть в заголовочном файле на Ваш контроллер, обычно в конце. Естественно, в код должен быть включен файл htc.h

Вернуться наверх

Аlex

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пт ноя 04, 2011 11:00:41 

Модератор
Аватар пользователя

Карма: 85

Рейтинг сообщений: 1270

Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4478
Откуда: Планета Земля

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

levaclaus писал(а):

Как победить?

Написать свои функции для работы с датчиком.
Подобное 100 раз обсасывалось на этом форуме.
Тем более, Вы же сами запрещаете прерывания на длительное время

Код:

#asm(«cli»);
…….
#asm(«sei»);

Это Вас не смущает ?

Вернуться наверх

Aerarh

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Пт ноя 04, 2011 16:35:28 

Зарегистрирован: Чт сен 29, 2011 13:54:53
Сообщений: 74

Рейтинг сообщения: 0

stas00n писал(а):

Aerarh писал(а):

Кто это объяснит (PICC 9.6)?

Error [1346] ; 0. can’t find 0x2 words for psect «config» in segment «CONFIG» (largest unused contiguous range 0x1)

Вероятно Вы неправильно задали конфигурационное слово — оно у Вас больше 14 бит в размере, естественно для него не хватает места в конфиг-области памяти, которая размером 1 слово. Конфигурировать надо примерно так:

Код:

__CONFIG (LVPDIS & BORDIS & MCLREN & PWRTEN & WDTDIS & INTCLK & PROTECT);

Дефайны для макроса __CONFIG можно посмотреть в заголовочном файле на Ваш контроллер, обычно в конце. Естественно, в код должен быть включен файл htc.h

Да я уже разобрался, Так и было, и дефайны нашел именно там. Спс.


_________________
Поговорим в скайпе fl.ua.aaa.

Вернуться наверх

Vlad0o

Не в сети

Заголовок сообщения: Re: Вопросы по С/С++ (СИ)

СообщениеДобавлено: Вт ноя 08, 2011 11:10:52 

Зарегистрирован: Вт июл 19, 2011 19:09:46
Сообщений: 67

Рейтинг сообщения: 0

Добрый день.

Надеюсь я не исчерпал свою квоту на глупые вопросы.

У меня возникло очередное затруднение, скорее всего из специфичности самодельного девелопментборда (как оказалось этот термин больше подходит, чем «kit»).

К третьему порту (Р3) по пинам (3.1, 3.2, 3.3, 3.4) подключен LCD (работает :))) ). Но! Для экономии портов на эти же пины ( 3.1 — 3.4) посадили кнопки (обычные кнопки) и с помощью контрольного пина 3.0 так сказать проверяется нажата ли кнопка или нет.
Вот так вот примерно http://i023.radikal.ru/1111/b8/80306427b39b.jpg.
Опрашивать получается — светодиод при нажатии загорается.
Вот такой вот бесконечный цикл для проверки.

Код:

while (1)
{
P3MDOUT = 0; //определение порта на вход
B1 = 0;
B2 = 1; //опрос именно этой кнопки!
B3 = 0;
B4 = 0;

if (B0 == 1) //если кнопка нажата
{Delay(1000);} //проверка на
if (B0 == 1)      //дребезг
{LED1 = 1;}
else {LED1 = 0;}
}

Но если подставить вместо «LED1 = 1;» вывод на экран произвольного текста при нажатии, то ничего хорошего не получается…. выводится только то что стоит в else (я так понимаю какой то «конфликт» — ведь один же порт используется). У меня даже в процессе экспериментов с кодом при нажатии длительном бледная буква «й» пробегала (один раз) по верхней строке справа налево (а ведь это не планировалось :)) ) и при этом на той же верхней строке более ярко был текст. К сожалению текст программы утерян..

Как мне разобраться с кнопкой? К примеру сделать счетчик нажатий кнопки. Нажимаешь — 1, еще раз — 2 на экране единицу сменяет двойка…как то так. Я понял только то что надо использовать «флаги» — глобальные переменные которые сохраняют текущее и предыдущее состояния кнопки. но пока это не дало результатов….

Вернуться наверх

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Когда Вы пишите объявление структуры, Вы просто объясняете компилятору, что у Вас есть такая структура. Когда же Вы объявляете (declare) переменную, тоже — Вы объясняете компилятору, что есть такая переменная. Хорошая особенность объявлений — их может быть много, главное, что бы они совпадали. Но обычно переменные определяют (definition) — тогда компилятор выделяет сразу выделяет место под эту переменную. Если в хедер поместить несколько определений и этот хедер подключить в несколько с файлов (единиц компиляции), то компилятор с линковщиком будут вынуждены выделить несколько раз место под одну и ту же переменную. А они так не могут. Что делать? Есть классический способ.

В хедере пишете вот так (это объявление, а их может быть много!)

extern col RED;

а в любом c файле пишете

color   RED = {0xFF, 0xFF, 0};

теперь определение одно, компилятор с линковщиком знают, где разместить в памяти переменную и все ок.

Есть второй способ, писать в хедере вот так

static color   RED = {0xFF, 0xFF, 0};

в этом случае эта переменная не покинет пределы единицы компиляции и то же все будет работать. Но у этого способа есть один маленький минус. Теперь константы могут хранится в каждом файле, куда Вы заинклюдили свой хедер. Компилятор с линковщиком могут оптимизировать, а могут и нет. И если Вам дорог каждый байт (в микрокотроллерах так бывает), то лучше проверить оба способа и сравнить размер бинарника.

Понравилась статья? Поделить с друзьями:
  • Error kubridge skprx is not installed
  • Error kubernetes cluster unreachable the server has asked for the client to provide credentials
  • Error linkageerror occurred while loading main class main
  • Error link2019 c
  • Error link 2019