Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2018, 11:29   #1
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию Проблема с глобальными typedef в AtmelStudio

Добрый день форумчане!
Прошу помощи.
У меня возникла проблема с использованием типов переменных объявленных в других модулях

usart.h
Цитата:
#ifndef _USART_H_
#define _USART_H_

#include "main.h"

typedef struct {
unsigned char tel_num[11];
} telephone_ptr;



#endif /* _USART_H_ */
usart.c
Цитата:
#include "usart.h"

telephone_ptr telephone;

................................... ...
main.c
Цитата:
#include "main.h"

extern telephone_ptr telephone;

int main(void)
{
USART1_init(207); //скорость порта 16-115200 207-9600
strcpy((char*)telephone.tel_num, "Hello World");
sei();
while (1)
{

USART1_println((char*)telephone.tel _num);

_delay_ms(1000);
}
}
main.h
Цитата:
#ifndef MAIN_H_
#define MAIN_H_

#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/pgmspace.h>

#include "usart.h"

#endif /* MAIN_H_ */
При таком раскладе у меня в терминале через какое то время надпись Hello World начинает криво отображаться, а затем и вовсе строки растут с непонятными символами, подразумеваю разрушение переменной,
а если я переношу telephone_ptr telephone из usart.c в место extern в main.c то все нормально.
А мне нужно работать с этим типом который объявлен в usart.c я же на него ссылаюсь через extern

Раньше такого не замечал по крайней мере cvavr, а вот в AtmelStudio заметил, в чем может быть проблема что переменная объявленная в других модулях и ты пытаешься ее использовать в другом модуле ведет себя странным образом?

За ранее спасибо!
Изображения
Тип файла: jpg Терминал.jpg (72.7 Кб, 135 просмотров)

Последний раз редактировалось Aliens_wolfs; 01.11.2018 в 13:20.
Aliens_wolfs вне форума Ответить с цитированием
Старый 01.11.2018, 13:53   #2
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
char tel_num[11];
Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
strcpy((char*)telephone.tel_num, "Hello World");
"А у вас молоко убежало"— Карлсон ®
jillitil вне форума Ответить с цитированием
Старый 01.11.2018, 14:13   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

usart.h
Код:
#ifndef _USART_H_
#define _USART_H_

#include "main.h"

typedef struct {
unsigned char tel_num[11];
} telephone_ptr;


#endif /* _USART_H_ */
usart.c
Код:
#include "usart.h"
// Переношу это в main.c ->telephone_ptr telephone;
................................... ...
main.c
Код:
#include "main.h"

telephone_ptr telephone;

int main(void)
{
USART1_init(207); //скорость порта 16-115200 207-9600
strcpy((char*)telephone.tel_num, "Hello World");
sei();
while (1) 
{

USART1_println((char*)telephone.tel _num);

_delay_ms(1000);
}
}
main.h

Код:
#ifndef MAIN_H_
#define MAIN_H_

#define F_CPU 8000000L 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/pgmspace.h>

#include "usart.h"

#endif /* MAIN_H_ */
Вот так то все работает нормально, я не только с этим переменным это наблюдаю но и с числовыми тоже

Последний раз редактировалось Aliens_wolfs; 01.11.2018 в 14:16.
Aliens_wolfs вне форума Ответить с цитированием
Старый 01.11.2018, 14:16   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вам же даже выделили... Сколько занимает "Hello World" в unsigned char ?
p51x на форуме Ответить с цитированием
Старый 01.11.2018, 14:32   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

usart.h
Код:
#ifndef _USART_H_
#define _USART_H_

#include "main.h"

typedef struct{
	unsigned char tel_num[4];
} telephone_ptr;
	
#endif /* _USART_H_ */
usart.c
Код:
Цитата:
#include "usart.h"

telephone_ptr telephone;

................................... ...
main.c
Код:
extern telephone_ptr telephone;
//telephone_ptr telephone;

int main(void)
{
	port_ini(); //Инициализируем порты	
	LED_tests(1);
	USART1_init(207); //скорость порта 16-115200 207-9600
	telephone.tel_num[0] = 'H';
	telephone.tel_num[1] = 'E';
	telephone.tel_num[2] = 'L';
	telephone.tel_num[3] = 'L';
	telephone.tel_num[4] = 'O';
    sei();
    while (1) 
    {
		
	USART1_println(telephone.tel_num);
		
	_delay_ms(1000);
    }
}
Так тоже появляется белиберда в терминале
Изображения
Тип файла: jpg Терминал.jpg (107.0 Кб, 145 просмотров)
Aliens_wolfs вне форума Ответить с цитированием
Старый 01.11.2018, 14:37   #6
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

а вот если с usart.c перенести строку telephone_ptr telephone; в main.c то все хорошо работает. Непонятки происходят когда я ссылаюсь на переменную extern telephone_ptr telephone; из модуля usart.c

Так все четко работает
usart.h
Код:
#ifndef _USART_H_
#define _USART_H_

#include "main.h"

typedef struct{
	unsigned char tel_num[4];
} telephone_ptr;
	
#endif /* _USART_H_ */
usart.c
Код:
#include "usart.h"

//telephone_ptr telephone;

................................... ...
main.c
Код:
//extern telephone_ptr telephone;
telephone_ptr telephone;

int main(void)
{
	port_ini(); //Инициализируем порты	
	LED_tests(1);
	USART1_init(207); //скорость порта 16-115200 207-9600
	telephone.tel_num[0] = 'H';
	telephone.tel_num[1] = 'E';
	telephone.tel_num[2] = 'L';
	telephone.tel_num[3] = 'L';
	telephone.tel_num[4] = 'O';
    sei();
    while (1) 
    {
		
	USART1_println(telephone.tel_num);
		
	_delay_ms(1000);
    }
}
Цитата:
Вам же даже выделили... Сколько занимает "Hello World" в unsigned char ?
Даже с этими параметрами все равно будет строка фиксированной длины, только в конце будут символы)
Тем более это я для примера писал даже не считал символы, в проекте у меня как раз 11 вернее 12 если от 0 считать символов это номер телефона с кодом и с +7, здесь проблема в другом.

Последний раз редактировалось Aliens_wolfs; 01.11.2018 в 14:49.
Aliens_wolfs вне форума Ответить с цитированием
Старый 01.11.2018, 14:49   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

У вас явно со счетом проблемы.
Код:
unsigned char tel_num[4];
Код:
telephone.tel_num[0] = 'H';
telephone.tel_num[1] = 'E';
telephone.tel_num[2] = 'L';
telephone.tel_num[3] = 'L';
telephone.tel_num[4] = 'O';
Еще раз, если не понятно: вы пишите за границей массива и портите какие-то данные. При размещении в main работает, т.к. там других данных нет / компилятор / линковщик там ничего не разместил или просто пока последствий не видно. При размещении в usart "не везет" сразу.
p51x на форуме Ответить с цитированием
Старый 01.11.2018, 14:50   #8
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

выше пример посмотрите пост#6 как там описано все работает норм
typedef struct{
unsigned char tel_num[4];
} telephone_ptr;
Aliens_wolfs вне форума Ответить с цитированием
Старый 01.11.2018, 14:54   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Я оттуда и скопировал вообще-то.
unsigned char tel_num[4]; Выделено для 4 элементов память.
Пишите
telephone.tel_num[0] = 'H'; <- 1
telephone.tel_num[1] = 'E'; <- 2
telephone.tel_num[2] = 'L'; <- 3
telephone.tel_num[3] = 'L'; <- 4
telephone.tel_num[4] = 'O'; <- 5

Что больше 4 или 5?
p51x на форуме Ответить с цитированием
Старый 01.11.2018, 14:54   #10
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Угадайте что произойдёт
Код:
 tel_num[2];
...
strcpy((char*)telephone.tel_num, "012345678901234567890123456789");
Так яснее?
Изображения
Тип файла: jpg 240_F_198365494_SYNeabNJcOJvDs5LfDqSC9tvlWrlmo54.jpg (17.4 Кб, 75 просмотров)
jillitil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Может ли условное форматирование взаимодействовать с глобальными переменными объявленными на самом листе RISagitov Microsoft Office Excel 8 09.11.2015 17:02
Массив:проблемы с глобальными переменными(С\С++) vitaliz Помощь студентам 2 12.01.2014 19:44
Локальные переменные сделать глобальными AnryFlame JavaScript, Ajax 1 15.04.2013 03:52
Проблема с typedef.... не виден новый тип данных! Fantom.as Общие вопросы C/C++ 3 29.11.2011 17:04
Проблема с глобальными переменными yulia PHP 4 04.11.2008 02:47