|
Преобразование числа в строку, непонятки 8) |
|
|
|
Apr 10 2007, 11:51
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221

|
Здраствуйте 8) Есть проблема с кодом, написан под WinAVR ========================================== #include <inttypes.h> #include <stdlib.h> int main() { long int kub; char st[10]; int32_t calculation() { int tempc; int area; //int32_t kub; int32_t total; //int32_t rezult; //int32_t sqrkub; int32_t mux(int32_t x,int32_t y) { int32_t rezult; return rezult=((x*y)/100); } int32_t divis(int32_t x,int32_t y) { int32_t rezult; return rezult=((x*100)/y); } int32_t sqrk(int32_t temp) { int32_t iter1; int32_t iter2; iter1=((300+300+divis(divis(temp,300),300))*100)/300; iter2=((iter1+iter1+divis(divis(temp,iter1),iter1))*100)/300; } tempc=0x7d0; area=0x0FA; return total=((mux(area,150)*mux(sqrk(tempc),tempc))/100); } while(1) { kub=calculation(); st=ltoa(kub,st,9); <====ВОТ СДЕСЬ ВЫДАЕТ ОШИБКУ. } } ============================================================= Вот такую выдает ошибку: ../float_test.c:44: error: incompatible types in assignment Разъясните, кто может, а то я уж и размер строки менять пробовал и так, вобще не работает сволоч Заранее спасибо 8)
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Apr 10 2007, 12:03
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Тут описание ltoa на русском: http://www.codenet.ru/progr/cpp/spru/ltoa.phpОбратите внимание на возвращаемое значение. Это указатель на строку. char st[10]; Операция st = &foo; не имеет смысла. Анатолий.
|
|
|
|
|
Apr 10 2007, 12:07
|
Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 12-09-06
Пользователь №: 20 304

|
Цитата(GIGAWAT @ Apr 10 2007, 12:51)  Здраствуйте 8) Есть проблема с кодом, написан под WinAVR ========================================== #include <inttypes.h> #include <stdlib.h> int main() { long int kub; char st[10]; int32_t calculation() { int tempc; int area; //int32_t kub; int32_t total; //int32_t rezult; //int32_t sqrkub; int32_t mux(int32_t x,int32_t y) { int32_t rezult; return rezult=((x*y)/100); } int32_t divis(int32_t x,int32_t y) { int32_t rezult; return rezult=((x*100)/y); } int32_t sqrk(int32_t temp) { int32_t iter1; int32_t iter2; iter1=((300+300+divis(divis(temp,300),300))*100)/300; iter2=((iter1+iter1+divis(divis(temp,iter1),iter1))*100)/300; } tempc=0x7d0; area=0x0FA; return total=((mux(area,150)*mux(sqrk(tempc),tempc))/100); } while(1) { kub=calculation(); st=ltoa(kub,st,9); <====ВОТ СДЕСЬ ВЫДАЕТ ОШИБКУ. } } ============================================================= Вот такую выдает ошибку: ../float_test.c:44: error: incompatible types in assignment Разъясните, кто может, а то я уж и размер строки менять пробовал и так, вобще не работает сволоч Заранее спасибо 8) Прототип функции ltoa выглядит так: void ltoa(char *buf, long value, int base) Стало быть, Вам надо поменять местами kub и st. И ещё - результат Вы получите в девятеричной системе счисления, поскольку последний параметр у Вас = 9.
|
|
|
|
|
Apr 10 2007, 12:19
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Dima_Ag @ Apr 10 2007, 12:07)  Прототип функции ltoa выглядит так: void ltoa(char *buf, long value, int base) Откуда Вы это взяли? C:\WinAVR\avr\include\stdlib.h, стока 486: extern char *ltoa(long int __val, char *__s, int __radix); Анатолий.
|
|
|
|
|
Apr 10 2007, 12:19
|

Частый гость
 
Группа: Свой
Сообщений: 114
Регистрация: 31-08-05
Из: Украина, Одесса
Пользователь №: 8 105

|
st=ltoa(kub,st,9); <====ВОТ СДЕСЬ ВЫДАЕТ ОШИБКУ. st не может присваиваться значение. Эта переменная должна бвть указателем char * st, а она объявленна массивом. Циата из книги "Язык программирования Си" Б.Керниган, Д.Ритчи. Цитата Между именем массива и указателем, выступающим в роли имени массива, существует одно различие. УКказатель - это переменная, поэтому можно написать pa=a или pa++. Но имя массива не являеться переменной и записи вроде a=pa или a++ не допускаються.
|
|
|
|
|
Apr 10 2007, 12:22
|
Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 12-09-06
Пользователь №: 20 304

|
Цитата(aesok @ Apr 10 2007, 13:19)  Откуда Вы это взяли?
C:\WinAVR\avr\include\stdlib.h, стока 486:
extern char *ltoa(long int __val, char *__s, int __radix);
Анатолий. Да, действительно, я не прав. Перепутал с ICCAVR . У ICCAVR ltoa имеет такой прототип.
|
|
|
|
|
Apr 10 2007, 13:35
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(unichorn @ Apr 10 2007, 13:31)  Чёто тут со скобками нето. Разве в языке С можно описывать функцию в нутри другой функции, как в паскале.  Да в GCC можно, но для AVR платформы это не работает. Анатолий.
|
|
|
|
|
Apr 10 2007, 22:58
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221

|
Вот теперь работает  ++++++++++++++++++++++++++++++++++++++ #include <inttypes.h> #include <stdlib.h> int main() { long int kub; int radix=10; char buffer[10]; int32_t calculation() { int tempc; int area; //int32_t kub; int32_t total; //int32_t rezult; //int32_t sqrkub; int32_t mux(int32_t x,int32_t y) { int32_t rezult; return rezult=((x*y)/100); } int32_t divis(int32_t x,int32_t y) { int32_t rezult; return rezult=((x*100)/y); } int32_t sqrk(int32_t temp) { int32_t iter1; int32_t iter2; iter1=((300+300+divis(divis(temp,300),300))*100)/300; iter2=((iter1+iter1+divis(divis(temp,iter1),iter1))*100)/300; } tempc=0x7d0; area=0x0FA; return total=((mux(area,150)*mux(sqrk(tempc),tempc))/100); } while(1) { kub=calculation(); char *p; p=itoa(kub,buffer,radix); } } =================================================== Спасибо за совет 8)
|
|
|
|
|
Apr 11 2007, 01:31
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(aesok @ Apr 10 2007, 13:35)  Да в GCC можно, но для AVR платформы это не работает.
Анатолий. Немного уточню, работает но не всегда (вложенные функции). Например код GIGAWAT-а работает. А вот такой вариант не работает: Код void f1 (void *); void f3 (void *, void (*)(void *)); void f2 (void *);
int foo (void *a, int b) { if (!b) { f1 (a); return 1; } if (b) { void bar (void *c) { if (c == a) f2 (c); } f3 (a, bar); } return 0; } Анатолий.
Сообщение отредактировал aesok - Apr 11 2007, 01:39
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|