реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Преобразование числа в строку, непонятки 8)
GIGAWAT
сообщение Apr 10 2007, 11:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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

Разъясните, кто может, а то я уж и размер строки менять пробовал и так, вобще не работает сволоч cranky.gif
Заранее спасибо 8)
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 10 2007, 12:03
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Тут описание ltoa на русском: http://www.codenet.ru/progr/cpp/spru/ltoa.php

Обратите внимание на возвращаемое значение. Это указатель на строку.

char st[10];

Операция st = &foo; не имеет смысла.

Анатолий.
Go to the top of the page
 
+Quote Post
Dima_Ag
сообщение Apr 10 2007, 12:07
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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

Разъясните, кто может, а то я уж и размер строки менять пробовал и так, вобще не работает сволоч cranky.gif
Заранее спасибо 8)



Прототип функции ltoa выглядит так: void ltoa(char *buf, long value, int base)
Стало быть, Вам надо поменять местами kub и st. И ещё - результат Вы получите в девятеричной системе счисления, поскольку последний параметр у Вас = 9.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 10 2007, 12:19
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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);

Анатолий.
Go to the top of the page
 
+Quote Post
shamray
сообщение Apr 10 2007, 12:19
Сообщение #5


Частый гость
**

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



st=ltoa(kub,st,9); <====ВОТ СДЕСЬ ВЫДАЕТ ОШИБКУ.


st не может присваиваться значение. Эта переменная должна бвть указателем char * st, а она объявленна массивом.
Циата из книги "Язык программирования Си" Б.Керниган, Д.Ритчи.

Цитата
Между именем массива и указателем, выступающим в роли имени массива, существует одно различие. УКказатель - это переменная, поэтому можно написать pa=a или pa++. Но имя массива не являеться переменной и записи вроде a=pa или a++ не допускаються.
Go to the top of the page
 
+Quote Post
Dima_Ag
сообщение Apr 10 2007, 12:22
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 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 имеет такой прототип.
Go to the top of the page
 
+Quote Post
unichorn
сообщение Apr 10 2007, 13:31
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



Чёто тут со скобками нето. Разве в языке С можно описывать функцию внутри другой функции,
как в паскале. smile.gif

Сообщение отредактировал unichorn - Apr 10 2007, 13:33
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 10 2007, 13:35
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(unichorn @ Apr 10 2007, 13:31) *
Чёто тут со скобками нето. Разве в языке С можно описывать функцию в нутри другой функции,
как в паскале. smile.gif


Да в GCC можно, но для AVR платформы это не работает.

Анатолий.
Go to the top of the page
 
+Quote Post
unichorn
сообщение Apr 10 2007, 13:38
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



Ок. Буду знать, но всёравно некрасиво смотритца. smile.gif
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Apr 10 2007, 22:58
Сообщение #10


Участник
*

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



Вот теперь работает smile.gif

++++++++++++++++++++++++++++++++++++++

#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)
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 11 2007, 00:58
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Может кому пригодится (для обратного преобразования, строки в число) ;>.. Ничего нового в ней нет:

U8 - unsigned char
S32 - signed long

Код
/******************************************
* Conversion routine                      *
* --> pStr, pointer to AsciiZ string      *
* --> pResult - pointer to signed result  *
* <-- returns: 0 if conversion succeed    *
    position of incorrect digit otherwise *
******************************************/
U8 StrToInt(U8 *pStr, S32 *pResult)
{
    S32 temp = 0;
    U8 sign = 0;

    if (!(pStr && pResult))
        return 0xFF; // invalid pointer
    else
    {
        U8 ch;
        U8 digit = 0;
        if (*pStr == '-')
        {
            sign = TRUE;
            pStr++;
        }
        while(*pStr)
        {
            ch = *pStr++;
            digit += 1;
            if (digit > 10)
            { // the string is too long to be U32/S32 value
                return digit;
            }
            temp *= 10;
            if ( (ch >= 0x30) && (ch < 0x3A) )
            {
                temp += ch - 0x30;
            }
            else // conversion error
            { // return problematic digit num from 1
                return digit;
            }
        }
    }
    if (sign)
        *pResult = -temp;
    else
        *pResult = temp;
    return 0;
}
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 11 2007, 01:31
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016