Kopiowanie danych pomiędzy tablicami
: sobota 26 gru 2015, 16:49
Witam,
Siedzę na funkcją char *asctime(const struct tm *brokentime);
Usiłuję wpisać do tablicy wynik działania funkcji itoa, czyli de facto chce skopiować zawartość tablicy temp do tablicy result. Pokażę całą fukcję, byście mieli pełny obraz sytuacji... Obecnie kompilator wypluwa błąd o następującej treści:
../asctime.c:65:23: error: lvalue required as increment operand
*resultptr++ = *temp++;
Ok, a teraz listing:
Działanie tej funkcji polega na tym, by wszystkie pola struktury przekazanej przez wskaźnik do tej funkcji przemaglować na postać ASCII, wrzucić do statycznej tablicy result, a wskaźnik na nią zwrócić jako wynik funkcji. Ostateczna postać wyniku ma wyglądać mniej więcej tak:
Sun Dec 26 16:48:33 2015\n
Może ktoś się pochyli nad moją funkcją i powie, jak bardzo źle się do tego zabieram...
Pozdrawiam!
Siedzę na funkcją char *asctime(const struct tm *brokentime);
Usiłuję wpisać do tablicy wynik działania funkcji itoa, czyli de facto chce skopiować zawartość tablicy temp do tablicy result. Pokażę całą fukcję, byście mieli pełny obraz sytuacji... Obecnie kompilator wypluwa błąd o następującej treści:
../asctime.c:65:23: error: lvalue required as increment operand
*resultptr++ = *temp++;
Ok, a teraz listing:
Kod: Zaznacz cały
#include<stdint.h>
#include<stdlib.h>
#include<limits.h>
#include"time.h"
static const char wday_name[7][4] =
{
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[12][4] =
{
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char result[26];
char* asctime(const struct tm *brokentime)
{
char *resultptr = result;
char temp[5];//for itoa conversions
if(!brokentime) return 0;//address is unavailable?
//variable out of range check
if(brokentime->tm_sec < 0 || brokentime->tm_sec > 60) return 0;
if(brokentime->tm_min < 0 || brokentime->tm_min > 59) return 0;
if(brokentime->tm_hour < 0 || brokentime->tm_hour > 23) return 0;
if(brokentime->tm_mday < 0 || brokentime->tm_mday > 31) return 0;
if(brokentime->tm_mon < 0 || brokentime->tm_mon > 11) return 0;
if(brokentime->tm_year < 0 || brokentime->tm_year > (INT_MAX-1900) ) return 0;
if(brokentime->tm_wday < 0 || brokentime->tm_wday > 6) return 0;
if(brokentime->tm_yday < 0 || brokentime->tm_yday > 365) return 0;
//weekday
for(uint8_t i = 0; i < 3; i++)
{
*resultptr++ = wday_name[brokentime->tm_wday][i];
}
*resultptr++ = ' ';
//month
for(uint8_t i = 0; i < 3; i++)
{
*resultptr++ = mon_name[brokentime->tm_mon][i];
}
*resultptr++ = ' ';
//day of month
if(brokentime->tm_hour < 10) *resultptr++ = '0';
itoa(brokentime->tm_hour, temp, 10);
while(*temp)
{
*resultptr++ = *temp++;//copy data from temp to result (without null) <---- tu jest błąd
}
*resultptr++ = ':';
return result;
}
Działanie tej funkcji polega na tym, by wszystkie pola struktury przekazanej przez wskaźnik do tej funkcji przemaglować na postać ASCII, wrzucić do statycznej tablicy result, a wskaźnik na nią zwrócić jako wynik funkcji. Ostateczna postać wyniku ma wyglądać mniej więcej tak:
Sun Dec 26 16:48:33 2015\n
Może ktoś się pochyli nad moją funkcją i powie, jak bardzo źle się do tego zabieram...
Pozdrawiam!