DeXteR 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Добрый день Уважаемый специалисты Пишу простой код в 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) {} } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeXteR 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне. Указатель ставил - непомогает В winavr этот код работает нормально На массив вместо указателя неругается ни winavr ни IAR По поводу ST1 и ST2 - поправил - всеравно глюк остался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Возможно, дело в настройках Printf formatter (свойства проекта). Попробуйте поменять для начала %i на %d. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeXteR 0 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне. Попробывал - непомогает Первый раз функция отробатывает нормально второй и все последующие - глючно Какбудто какаято из переменных локальных не инициализируется Оптимизация отключена Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба Я думаю в printf лучше действительно использовать %d (%i для scanf ) А еще насколько я помню IARовские функции printf и scanf требовали довольно большого стека Лучше всего попроверить в симуляторе по шагам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.В данном случае все правильно. STR1 и STR2 - массивы из 16 элементов типа char. Поскольку массивов как таковых в С нет, то имя массива тождественно указателю на его первый элемент. Т.е. STR1, STR2 имеют тип char *. Поэтому запись char *ptr = STR1; вполне корректна. Она тождественна записи char *ptr = &STR1[0]; И с другой стороны в С массивы в функции передаются как указатель на первый элемент. Так что с какой стороны ни подойди - в этом месте ошибки нет. В первом случае функция sprintf работает нормально во втором - глючно А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeXteR 0 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба А если поменять их местами? Т.е. проблема в чем - вообще любой второй вызов функции глючит или именно преобразование отрицательного числа? Пока могу предположить налезание стеков друг на друга. sprintf требовал стека более 100 байт. Сколько точно - не помню :-( А! можно в .map посмотреть. Менял местами - эффект тотже Второй раз выводит число не 1 раз а всю строку Очень прошу вас - укажите пожалуйста с какими настройками стека и в каком коде функция в ваших проэктах работает нормально Спасибо De}{teR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CSB 0 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба Library Options -> Printf formatter -> Small Или System -> Data Stack (CSTACK) -> 0x40. Это при модели памяти small. При tiny все работает без изменений параметров стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UFO 0 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба to DeXteR по синтаксису все верно, все же это что-то с компиллером Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeXteR 0 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба Library Options -> Printf formatter -> Small Или System -> Data Stack (CSTACK) -> 0x40. Это при модели памяти small. УРААААА Все заработало ОГРОМНОЕ СПАСИБО У меня был не Printf formatter -> Small а medium Сделал Small и все перестало глючить А с medium может работать или глючит всегда Кто знает ? Кто пробывал ? Какой стек для этого нужен ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 28 июля, 2006 Опубликовано 28 июля, 2006 · Жалоба Первый параметр у sprintf должен быть указателем на буфер строки типа (char *). А что такое в вашем случае ST2 и ST1 компилятору видимо непонятно как и мне.В данном случае все правильно. STR1 и STR2 - массивы из 16 элементов типа char. Поскольку массивов как таковых в С нет, то имя массива тождественно указателю на его первый элемент. Т.е. STR1, STR2 имеют тип char *. Поэтому запись char *ptr = STR1; вполне корректна. Она тождественна записи char *ptr = &STR1[0]; И с другой стороны в С массивы в функции передаются как указатель на первый элемент. Так что с какой стороны ни подойди - в этом месте ошибки нет. Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 1 августа, 2006 Опубликовано 1 августа, 2006 · Жалоба Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции :) Лето... отпуск только через 2 недели. Совсем я плохой стал. char STR1[16]; char STR2[16]; sprintf(STR2, "%i", NUM); sprintf(STR1, "%i", NUM2); Не вижу тут ошибки... :-( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeXteR 0 1 августа, 2006 Опубликовано 1 августа, 2006 · Жалоба Сергей, этим сообщением я лишь пытался обратить внимание на ошибку в написании имен массивов при вызове функции :) Лето... отпуск только через 2 недели. Совсем я плохой стал. char STR1[16]; char STR2[16]; sprintf(STR2, "%i", NUM); sprintf(STR1, "%i", NUM2); Не вижу тут ошибки... :-( Она была Я ее подправил отредактировав сообщение после замечания rezident Она была но вы ее незастали :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DeXteR 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Уважаемые специалисты Хочу продолжить эту тему потомучто наступил на грабли второй раз В Проекте нужен СПринтФ с форматирование Например так #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 программа переполняет стек (гдето в библиотеках- отладчиком невидно) и контроллер сбрасывается Увеличение стеков и хипа эффекта недало Вопросс следующий Можно ли заставить ПринтФ (СПринтФ) от ИАР работать правильно ?? Если у когото есть опыт борьбы с этой функцией - пожалуйста поделитесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться