Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Значение не сохраняется при выходе из функции


Автор: Dika 29.8.2012, 10:31
Есть функция, в нее передаю строку 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

Автор: Dika 29.8.2012, 10:55
упростила программу, чтоб было наглядней
Код

#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 никуда не указывает. Так? а как сделать, чтоб значения сохранились?

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)