2014-12-17 2 views
-1

У меня проблема с функцией, которая должна печатать любой тип целого числа на моем KS0108 lcd. Здесь возникает проблема: когда я хочу скопировать void* numb значение в void* temp в первый swtich - ничего не происходит. во втором переключателе при использовании %I получить 0. (Значение void* numb о 48 и тип _uint8_t) Код:копировать значение указателя void C

void glcd_WriteInt(void* numb, type type) 
{ 
    void* temp = 0; 
    int8_t buff[10]; 
    int8_t size = 0; 
    int8_t flag = 1; 
    int8_t sign = 1; 
    switch(type) 
    { 
     case _int8_t: memcpy(temp, numb, sizeof(int8_t)); break; 
     case _int16_t: memcpy(temp, numb, sizeof(int16_t)); break; 
     case _int32_t: memcpy(temp, numb, sizeof(int32_t)); break; 
     case _int64_t: /*memcpy(temp, numb, sizeof(int64_t)); break;*/return; //if want 64 - uncomment 
     case _uint8_t: *(uint8_t*) temp = *(uint8_t*) numb/*memcpy(temp, numb, sizeof(uint8_t))*/; break; 
     case _uint16_t: memcpy(temp, numb, sizeof(uint16_t)); break; 
     case _uint32_t: memcpy(temp, numb, sizeof(uint32_t)); break; 
     case _uint64_t: /*memcpy(temp, numb, sizeof(uint64_t)); break;*/return; //if want 64 - uncomment 
    } 
    while(flag) 
    { 
     switch(type) 
     { 
      case _int8_t: 
       buff[size] = *(int8_t*) temp % 100; 
       flag = (*(int8_t*) temp /= 100) != 0; 
       break; 
      case _int16_t: 
       buff[size] = *(int16_t*) temp % 100; 
       flag = (*(int16_t*) temp /= 100) != 0; 
       break; 
      case _int32_t: 
       buff[size] = *(int32_t*) temp % 100; 
       flag = (*(int32_t*) temp /= 100) != 0; 
       break; 
      case _int64_t: 
       /*buff[size] = *(int64_t*) temp % 100;  //if want 64 - uncomment 
       flag = (*(int64_t*) temp /= 100) != 0;*/ 
       break; 
      case _uint8_t: 
       buff[size] = *(uint8_t*) temp % 100; 
       flag = (*(uint8_t*) temp /= 100) != 0; 
       break; 
      case _uint16_t: 
       buff[size] = *(uint16_t*) temp % 100; 
       flag = (*(uint16_t*) temp /= 100) != 0; 
       break; 
      case _uint32_t: 
       buff[size] = *(uint32_t*) temp % 100; 
       flag = (*(uint32_t*) temp /= 100) != 0; 
       break; 
      case _uint64_t: 
       /*buff[size] = *(uint64_t*) temp % 100;  //if want 64 - uncomment 
       flag = (*(uint64_t*) temp /= 100) != 0;*/ 
       break; 
     } 
     if(buff[size] < 0){ 
      buff[size] = -buff[size]; 
      sign = -1; 
     } 
     size++; 
    } 

    if(sign == -1) glcd_Character((char) 45); 
     glcd_WIntTab(buff, size); 
} 

Я попытался версии с memcpy, и как здесь: слепки. Удивительно, что эта функция была в порядке несколько дней назад.

+2

Удивительно, что он когда-либо работал; не удивительно, что это может потерпеть неудачу по-разному. Вы копируете в пространство, на которое указывает 'temp'. 'temp == NULL', так что вряд ли получится хорошо. –

+0

может быть вам нужен 'union' вместо' void * '. –

+0

Поскольку все это работало несколько дней назад, почему бы вам не вернуться к версии, которую вы проверили в своей VCS (системе управления версиями), когда она работает _was_? (О, вы не использовали VCS? Теперь вы знаете, почему вы всегда должны использовать VCS, если вы будете заботиться о том, что происходит, когда вы что-то меняете.) –

ответ

0

Ваша главная проблема заключается в том, что у вас есть

void *temp = 0; 

заявил, и вы пытаетесь записать в NULL указатель, так как вы инициализировать его с void *temp = 0.

Даже если вы не инициализировать его, он не будет работать, потому что это не будет являться действительным указателем, так как вы выделяете память с malloc и назначить его на void *temp указатель, или использовать союзной таким образом

union Type { 
    int8_t _int8_t; 
    int16_t _int16_t; 
    int32_t _int32_t; 
    int64_t _int64_t; 
    uint8_t _uint8_t; 
    uint16_t _uint16_t; 
    uint32_t _uint32_t; 
    uint64_t _uint64_t; 
}; 

void glcd_WriteInt(void* numb, enum type type) 
{ 
    union Type temp; 

    int8_t buff[10]; 
    int8_t size = 0; 
    int8_t flag = 1; 
    int8_t sign = 1; 

    switch (type) 
    { 
     case _int8_t: memcpy(&temp, numb, sizeof(int8_t)); break; 
     case _int16_t: memcpy(&temp, numb, sizeof(int16_t)); break; 
     case _int32_t: memcpy(&temp, numb, sizeof(int32_t)); break; 
     case _int64_t: /*memcpy(&temp, numb, sizeof(int64_t)); break;*/return; //if want 64 - uncomment 
     case _uint8_t: memcpy(&temp, numb, sizeof(uint8_t))/*memcpy(temp, numb, sizeof(uint8_t))*/; break; 
     case _uint16_t: memcpy(&temp, numb, sizeof(uint16_t)); break; 
     case _uint32_t: memcpy(&temp, numb, sizeof(uint32_t)); break; 
     case _uint64_t: /*memcpy(&temp, numb, sizeof(uint64_t)); break;*/return; //if want 64 - uncomment 
    } 

    while (flag) 
    { 
     switch (type) 
     { 
      case _int8_t: 
       buff[size] = temp._int8_t % 100; 
       flag = (temp._int8_t /= 100) != 0; 
       break; 
      case _int16_t: 
       buff[size] = temp._int16_t % 100; 
       flag = (temp._int16_t /= 100) != 0; 
       break; 
      case _int32_t: 
       buff[size] = temp._int32_t % 100; 
       flag = (temp._int32_t /= 100) != 0; 
       break; 
      case _int64_t: 
       buff[size] = temp._int64_t % 100; 
       flag = (temp._int64_t /= 100) != 0; 
       break; 
      case _uint8_t: 
       buff[size] = temp._uint8_t % 100; 
       flag = (temp._uint8_t /= 100) != 0; 
       break; 
      case _uint16_t: 
       buff[size] = temp._uint16_t % 100; 
       flag = (temp._uint16_t /= 100) != 0; 
       break; 
      case _uint32_t: 
       buff[size] = temp._uint32_t % 100; 
       flag = (temp._uint32_t /= 100) != 0; 
       break; 
      case _uint64_t: 
       buff[size] = temp._uint64_t % 100; 
       flag = (temp._uint64_t /= 100) != 0; 
       break; 
     } 

     if (buff[size] < 0) 
     { 
      buff[size] = -buff[size]; 
      sign = -1; 
     } 
     size++; 
    } 
    if (sign == -1) 
     glcd_Character((char) 45); 
    glcd_WIntTab(buff, size); 
} 

Я считаю, что объединение является лучшим решением.

+0

Спасибо! Я полностью забыл о союзах. Большое спасибо. – legier

+0

Вы не должны использовать такие имена, как '_int8_t', я использовал их для' union', чтобы вы могли более четко видеть, что я имел в виду. Но это сбивает с толку. –

+0

Параметр функции «enum type» не определен в вашем коде и использует очень плохие методы именования. – user3629249

Смежные вопросы