char * fun(void)
{
char temp[10];
strcpy(temp,"napis");
return temp;
}Co zrobić żeby taka funkcja działała bezpiecznie i zawsze? żeby kompilator nie zwracał błędu
main.c:1257: warning: function returns address of local variableCzy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamchar * fun(void)
{
char temp[10];
strcpy(temp,"napis");
return temp;
}main.c:1257: warning: function returns address of local variablechar * fun(void)
{
char * temp=malloc(10*sizeof(char));
strcpy(temp,"napis");
return temp;
}unsigned char * OpenString(unsigned char offset)
{
static unsigned char temp[12],i=0;
for (char i=0; i<15; i++);//teoretycznie niepotrzebne
i=0;
while ((temp[i]!=0) && (i<12))
{
temp[i]=EEPROM_read(offset+i);
i++;
}
temp[i]=0;//teoretycznie niepotrzebne
return temp;
}void SaveString(char offset, unsigned char * tekst)
{
for(char i=0; i<strlen(tekst); i++)
EEPROM_write(offset+i, tekst[i]);
EEPROM_write(i, 0);
}SaveString(10,"kosmita");
K(OpenString(10)); // na lcd
Send(OpenString(10)); // na terminal
void OpenString(unsigned char *temp, unsigned char max_len, unsigned char offset)
{
unsigned char i=0;
while (i<(max_len-1))
{
temp[i]=EEPROM_read(offset+i);
if (temp[i] == 0)
{
return;
}
i++;
}
temp[i] = 0;
}
unsigned char temp[12];
SaveString(10,"kosmita");
OpenString(temp, 12, 10);
K(temp);
EEPROM_write(i, 0);
EEPROM_write(offset + i, 0);
AVRowiec napisał:wcześniej temp miało 15 pól. przenosząc tutaj przerobiłem.
myśle że Twój pomysł szelus się sprawdzi. zaraz zobaczę.
Dodano po 2 [minuty]:
a jak działa taka funkcja itoa?
sama funkcja zwraca ciąg ale robi to także przez bufor który trzeba sobie samemu zdefiniować out=itoa(buf,liczba,podstawa_liczby);
void SaveString(char offset, unsigned char * tekst)
{
for(char i=0; i<strlen(tekst); i++)
EEPROM_write(offset+i, tekst[i]);
EEPROM_write(i, 0); EEPROM_write(i+1, 0xFF); EEPROM_write(i+2, 0x00); EEPROM_write(i+3, 0);
}
unsigned char * OpenString(unsigned char offset, unsigned char * temp, unsigned char max_len)
{
unsigned char i=0;
while (i<max_len-1)
{
temp[i]=EEPROM_read(offset+i);
if (temp[i]==0) return temp;
i++;
}
temp[i]=0;//teoretycznie niepotrzebne
return temp;
}
SaveString(10,"kosmita");SaveString(30,"biribomba");
char temp[12];
OpenString(10,temp,12);
SendAT(temp);
K(temp);
SendAT(OpenString(30,temp,12));
K(OpenString(30,temp,12));
void SaveString(char offset, unsigned char * tekst)
{
char i=0;
for( i=0; i<=strlen(tekst); i++)
EEPROM_write(offset+i, tekst[i]);
EEPROM_write(i, 0);
}AVRowiec napisał:
poprawiłem i kropek nie ma ale za to zniknął pierwszy z zapisanych łańcuchów
void SaveString(char offset, unsigned char * tekst) { char i=0; for( i=0; i<=strlen(tekst); i++) EEPROM_write(offset+i, tekst[i]); EEPROM_write(i, 0); }
Działa przez wywołanie:
K(OpenString(30,temp,12));
nie działa w taki sposób:
char temp[12];
OpenString(10,&temp,12); // próbowałem z & i bez i to samo
K(temp);
void SaveString(char offset, unsigned char * tekst)
{
while(*tekst)
{
EEPROM_write(offset++, *tekst);
tekst++;
}
EEPROM_write(i, 0);
}