Перейти к содержанию
    

Добрый день Уважаемый специалисты

 

Пишу простой код в IAR EWAVR 4.20

В первом случае функция sprintf работает нормально

во втором - глючно

 

Подскажите что я делаю нетак ??

 

 

#include "iom16.h"

#include "stdio.h"

 

int NUM = 1234;

char STR1[16];

 

int NUM2 = -1234;

char STR2[16];

 

 

int main( void )

{

 

sprintf(STR2, "%i", NUM);

sprintf(STR1, "%i", NUM2);

 

 

while (1)

{}

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.

 

Указатель ставил - непомогает

 

В winavr этот код работает нормально

На массив вместо указателя неругается ни winavr ни IAR

 

По поводу ST1 и ST2 - поправил - всеравно глюк остался

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, дело в настройках Printf formatter (свойства проекта).

Попробуйте поменять для начала %i на %d.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.

 

Попробывал - непомогает

 

Первый раз функция отробатывает нормально

 

второй и все последующие - глючно

Какбудто какаято из переменных локальных не инициализируется

Оптимизация отключена

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю в printf лучше действительно использовать %d (%i для scanf )

 

А еще насколько я помню IARовские функции printf и scanf требовали довольно большого стека

 

Лучше всего попроверить в симуляторе по шагам

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.
В данном случае все правильно. STR1 и STR2 - массивы из 16 элементов типа char. Поскольку массивов как таковых в С нет, то имя массива тождественно указателю на его первый элемент. Т.е. STR1, STR2 имеют тип char *. Поэтому запись char *ptr = STR1; вполне корректна. Она тождественна записи char *ptr = &STR1[0];

И с другой стороны в С массивы в функции передаются как указатель на первый элемент. Так что с какой стороны ни подойди - в этом месте ошибки нет.

В первом случае функция sprintf работает нормально

во втором - глючно

А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть.

 

 

Менял местами - эффект тотже

Второй раз выводит число не 1 раз а всю строку

 

Очень прошу вас - укажите пожалуйста с какими настройками стека и в каком коде функция в ваших проэктах работает нормально

 

Спасибо

De}{teR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Library Options -> Printf formatter -> Small

 

Или

 

System -> Data Stack (CSTACK) -> 0x40.

Это при модели памяти small.

 

При tiny все работает без изменений параметров стека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Library Options -> Printf formatter -> Small

Или

System -> Data Stack (CSTACK) -> 0x40.

Это при модели памяти small.

 

УРААААА

Все заработало

ОГРОМНОЕ СПАСИБО

 

У меня был не Printf formatter -> Small а medium

 

Сделал Small и все перестало глючить

 

А с medium может работать или глючит всегда

Кто знает ? Кто пробывал ? Какой стек для этого нужен ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.

В данном случае все правильно. STR1 и STR2 - массивы из 16 элементов типа char. Поскольку массивов как таковых в С нет, то имя массива тождественно указателю на его первый элемент. Т.е. STR1, STR2 имеют тип char *. Поэтому запись char *ptr = STR1; вполне корректна. Она тождественна записи char *ptr = &STR1[0];

И с другой стороны в С массивы в функции передаются как указатель на первый элемент. Так что с какой стороны ни подойди - в этом месте ошибки нет.

Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции :)
Лето... отпуск только через 2 недели. Совсем я плохой стал.

char STR1[16];
char STR2[16];

sprintf(STR2, "%i", NUM);
sprintf(STR1, "%i", NUM2);

Не вижу тут ошибки... :-(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции :)

Лето... отпуск только через 2 недели. Совсем я плохой стал.

char STR1[16];
char STR2[16];

sprintf(STR2, "%i", NUM);
sprintf(STR1, "%i", NUM2);

Не вижу тут ошибки... :-(

 

Она была

 

Я ее подправил отредактировав сообщение после замечания rezident

 

Она была но вы ее незастали :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые специалисты

 

Хочу продолжить эту тему потомучто наступил на грабли второй раз

 

В Проекте нужен СПринтФ с форматирование

Например так

 

#include "iom8.h"
#include <stdio.h>
#include <stdlib.h>

char S[32] = "Hello .. Lalala";
long L = 1234567890;

void second(void)
{
    sprintf(S+17, "%ld", L);
}

void first(void)
{
second();
}

int main(void)
{
  while(1)
    {
first();
    }
}

 

Под Atmega8 с памятью Tiny все работает

После того как переключаем на small программа переполняет стек

(гдето в библиотеках- отладчиком невидно) и контроллер сбрасывается

Увеличение стеков и хипа эффекта недало

 

Вопросс следующий

 

Можно ли заставить ПринтФ (СПринтФ) от ИАР работать правильно ??

Если у когото есть опыт борьбы с этой функцией - пожалуйста поделитесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...