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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значение не сохраняется при выходе из функции, Строки в С++ unsigned char* 
:(
    Опции темы
Dika
Дата 29.8.2012, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть функция, в нее передаю строку unsigned char*, в функции присваиваю значение, внутри функции значение есть, а по выходу - нули. smile 
Код

#include <mem.h>
//#include "..\..\lib\i8000\8000e.h"
#include <stdio.h>
#define MAXBUFSIZE 260


union tMBTCP{ //???name
char buf[MAXBUFSIZE];
struct tMBPACKAGE{
    //MBheader
    unsigned int id_tranzaction;
    unsigned int id_protocol;
    unsigned int field_len; //размер сообщения Modbus в байтах
    unsigned char id_divice;
    //PDU max 253 bytes
    //unsigned char function;
    unsigned char outValue[253];                
}MBPACKAGE;
};

void MBFC15_request(int startAddress, int quantity, unsigned char *values, unsigned char* request, int * sbytes)
{
unsigned char temp=0;

//упаковываем значения побитово
for(int i=0; i<6; i++)
temp+=values[i]<<i;
 
union tMBTCP mbp;
mbp.MBPACKAGE.id_tranzaction=0; //i++
mbp.MBPACKAGE.id_protocol=0;
mbp.MBPACKAGE.id_divice=1;
mbp.MBPACKAGE.outValue[0]=0x0f;
mbp.MBPACKAGE.outValue[1]=startAddress>>8;
mbp.MBPACKAGE.outValue[2]=startAddress;
mbp.MBPACKAGE.outValue[3]=quantity>>8;
mbp.MBPACKAGE.outValue[4]=quantity;
if((quantity%8)>0) //if the remainder is different of 0 then N=N+1;
mbp.MBPACKAGE.outValue[5]=quantity/8+1; 
else mbp.MBPACKAGE.outValue[5]=quantity/8;
mbp.MBPACKAGE.outValue[6]=temp; 
mbp.MBPACKAGE.field_len=14; //почему копирует в старшие биты?


//strcpy(request, mbp.buf);
*sbytes=mbp.MBPACKAGE.field_len;
printf("mbp.buf=");
for(i=0; i<*sbytes; i++)
printf("%d ", mbp.buf[i]);
printf("\n\r");

request=mbp.buf;
printf("request=");
for(i=0; i<*sbytes; i++)
printf("%d ", request[i]);
printf("\n\r");
return;
}

void main()
{
unsigned char moduleValue[6]; 
memset(moduleValue, 0, 6*sizeof(char));
unsigned int DI16_cur=8;

if(NameOfModule[0]!=53&&ModuleType[0]!=195)
  moduleValue[0]=1; else moduleValue[0]=0;
  moduleValue[1]=DI16_cur<<15>>15;
  moduleValue[2]=DI16_cur<<14>>15;
  moduleValue[3]=DI16_cur<<13>>15;
  moduleValue[4]=1;
  moduleValue[5]=0;
unsigned char request1[MAXBUFSIZE]; int sBytes;
while(1){
if(Kbhit()&&Getch()==27) {break;}
memset(request1,0, MAXBUFSIZE);
 MBFC15_request(0,6, moduleValue, request1, &sBytes);
 for(int i=0; i<sBytes; i++)
 printf("%d ", request1[i]);
 printf("\n\r");

 }
}

Прилагаю картинку результата работы программы user posted image
PM MAIL   Вверх
Dika
Дата 29.8.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



упростила программу, чтоб было наглядней
Код

#include <mem.h>
#include <string.h>
#include <stdio.h>


void MBFC15_request(unsigned char* request)
{
unsigned char buf[6];
buf[0]=5;
buf[1]=3;
request=buf;
//strcpy(request, buf);
printf("request=");
for(int i=0; i<4; i++)
printf("%d ", request[i]);
printf("\n\r");
return;
}

void main()
{
unsigned char request1[6]; 
while(1){
if(Kbhit()&&Getch()==27) {break;}
memset(request1,0, 6);
 MBFC15_request(request1);
 for(int i=0; i<6; i++)
 printf("%d ", request1[i]);
 printf("\n\r");
 }
}


в функции значения есть, на выходе нули. Если использовать strcpy(), даже в функции значения не копируются. Что-то не пойму, где ошиблась.

Добавлено через 10 минут и 34 секунды
buf - это у меня указатель на массив
request - тоже указатель на массив, в теле функции указателю  request я присваиваю значение адреса указателя buf. о выходе из функции, этот адрес теряется и  request никуда не указывает. Так? а как сделать, чтоб значения сохранились?
PM MAIL   Вверх
FCM
Дата 29.8.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Относительно упрощенного варианта:
А что тебе нужно в функции - изменить значение адресата передаваемого указателя-аргумента или перенаправить  указатель-аргумент на новый адресат (т.е. изменить значение указателя)?
Если второе, то сам указатель должен передаваться по адресу, а на выходе из функции указывать на существующий(после выхода из функции) объект. 
Если первое, то тебе нужно просто копировать внутри функции адресаты - упрощенно что-нить типа
for(int i=0; i<6; i++) request[i]=buf[i];
(или напрямую править адресат указателя-аргумента, не вводя никаких buf)

Т.е. при первом намерении, вариант со strcpy идеологически правильный, но не компилируется, т.к. strcpy требует  char*, а не unsigned char*. Возможно, проблема со strcpy решается приведением  к нужному типу.

Это сообщение отредактировал(а) FCM - 29.8.2012, 18:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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