ikarab писал(а):ARV, ты мог бы проектик прицепить с таким "залетом" чтоб реально убедится исправлено ли нет и запросить исправление ?
пожалуйста
ikarab писал(а):ARV, ты мог бы проектик прицепить с таким "залетом" чтоб реально убедится исправлено ли нет и запросить исправление ?
гениально! протеус лажает, а ну ее - printf! без вины виноватая функция...__Alexander писал(а):У меня такое впечатление, что ну ее, эту printf
оттуда__Alexander писал(а):Дык, а слово inf в первой строке откуда?
вы невнимательно читали мою статью, и не потрудились изучить даташиты... в файле и прошивке ничто никуда не отбрасывается, просто в программном счетчике команд физически нет старших разрядов, а есть столько младших, сколько необходимо для адресации имеющейся памяти. вдумайтесь в это, и вам все станет ясно.__Alexander писал(а):Мне не очень понятно, как в HEXе могут изменяться адреса? Это уже готовый для железа файл, где все переменные и функции уже лежат по своим адресам. Получается что сама АВР может откидывать эти адреса?
мда... разница ОГРОМНА! студия правильно обрабатывает при отладве описанную мной ситуацию, а протеус - неправильно. HEX тут ни при чем - это чисто проблема СИМУЛЯТОРА ПРОТЕУС.__Alexander писал(а):отдельно. в протеус грузил уже готовый при помощи студио hex.
Да и соссно какая разница? . . .
для себя сделал вывод, никаких функций, которые непонятно что могут в результате дать, буду ждать на вход одно, а тут нечто типа inf придет. Лучше пользоваться проверенными способами.
нифига вы не рубите в ситуации... ваши слова напоминают бред... извините...__Alexander писал(а):А проверенный способ, это функция, которая лежит непосредственно в проекте, и есть уверенность что она сама не будет вызывать кучу функций для своей работы. И вот когда закончится стек, вот тогда и адрес возврата будет считаться через одно место, но работать будет. Хотя не думаю что тут именно такая ситуация, в меге8 как никак кило ОЗУ.
ARV писал(а):нифига вы не рубите в ситуации... ваши слова напоминают бред... извините...__Alexander писал(а):А проверенный способ, это функция, которая лежит непосредственно в проекте, и есть уверенность что она сама не будет вызывать кучу функций для своей работы. И вот когда закончится стек, вот тогда и адрес возврата будет считаться через одно место, но работать будет. Хотя не думаю что тут именно такая ситуация, в меге8 как никак кило ОЗУ.
ARV писал(а):WinAVR генерирует абсолютно корректный код, позволяющий обойти ограничение в 2К перехода - протеус этот код не проглатывает. это доказано.
0 будет подставлен и в случае str[] = {1,2,3}, хотя более корректной записью будет str[] = "123"urry писал(а):Хотя корректней через указатели, что-то типа
flash char* stroka="12345";
В этом случае компилятор самостоятельно поставит 0 в конце массива.
очевидно, либо вы не читали это, когда говорили о том, что strlen() возвращает 8 вместо 5, либо...__Alexander писал(а):Зачем вопли? Никаких вопль, хоть и Си я знаю не полностью, но даже лось прочтет в книгах по Си, что "Символьная строка - это МАССИВ типа char, завершенный символом \0".
так-то оно так, только вот представляете ли вы сами, какие именно записи у вас в этом массиве str? какого типа?__Alexander писал(а):И, если разобраться, число в прямоугольных скобках означает количество отдельных записей
char *str[2] = {"Stroka1", "Stroka2"};
__Alexander писал(а):Одни знатоки по Си собрались.
я именно хотел показать ошибку протеуса, потому нашел способ занять побольше памяти__Alexander писал(а): и если ARV каким-то макаром прогой из пяти строк занял 40% памяти программ меги8, то да, извините, с этим у меня хреново.
сомневаюсь я... разница между sprintf и printf лишь в той самой функции вывода символа - одна выводит его в массив, другая - в файловый поток__Alexander писал(а):А с последним ответом, относительно, что сначала sprintf перевести float в строку, а потом обычным putstring вывести на уапп - полностью согласен. И объем поменьше будет.
__Alexander писал(а):Зачем вопли? Никаких вопль, хоть и Си я знаю не полностью, но даже лось прочтет в книгах по Си, что "Символьная строка - это МАССИВ типа char, завершенный символом \0".
И, если разобраться, число в прямоугольных скобках означает количество отдельных записей
char *str[2] = {"Stroka1", "Stroka2"};
Одни знатоки по Си собрались.
И я не виноват, что в ИАРе я не могу сделать так, чтобы протеус залагал, и если ARV каким-то макаром прогой из пяти строк занял 40% памяти программ меги8, то да, извините, с этим у меня хреново.
А с последним ответом, относительно, что сначала sprintf перевести float в строку, а потом обычным putstring вывести на уапп - полностью согласен. И объем поменьше будет
И действительно, че я ваще вспылился, типа мне это надо было, автор темы исходников не показывал, ответа не получил, а я тут как дурак, сижу, дизассемблирую каждую команду... когда с этим столкнусь, тогда и буду курить.
Если кого-то напряг - извиняйте.
ARV писал(а):очевидно, либо вы не читали это, когда говорили о том, что strlen() возвращает 8 вместо 5, либо...
ARV писал(а):так-то оно так, только вот представляете ли вы сами, какие именно записи у вас в этом массиве str? какого типа?
ARV писал(а):я именно хотел показать ошибку протеуса,
ARV писал(а):потому нашел способ занять побольше памяти
ARV писал(а):кстати, позвольте спросить: ваш хваленый IAR какой размер моей проги выдает?
ARV писал(а): сомневаюсь я... разница между sprintf и printf лишь в той самой функции вывода символа - одна выводит его в массив, другая - в файловый потоктак что по размеру все будет плюс-минус десяток байт одинаково
в си недопустимо что-то подразумевать - надо только быть уверенным на 100%. массив, не содержащий нулей явно, ничем не дополняется, и strlen() петрушит память, пока случайно не наткнется на 0 - например, в моих тестах вместо 8 получалось 10 - все зависит от того, какие переменные следуют в памяти за массивом и чему они равны.__Alexander писал(а):Подразумевая, что по умолчанию должен быть 0, то как-бы должен выдать размер нулевой записи. И если она там одна, хотя объявлено что их там несколько, то я ниче не понимаю, даже если он дополняется одним символом, то это никак не три!ARV писал(а):очевидно, либо вы не читали это, когда говорили о том, что strlen() возвращает 8 вместо 5, либо...
ну, если вам не нужно понимать, что делает ваша программа - то тогда конечно... только в этом случае лучше не программы писать, а пиво пить...__Alexander писал(а):Понятия не имею, а может мне это и не нужно?ARV писал(а):так-то оно так, только вот представляете ли вы сами, какие именно записи у вас в этом массиве str? какого типа?
я не понимаю - почему вы "догадываетесь"? я же вам прямо сказал, почему так происходит! и методику поиска проблемы указал, и расчеты... а вы все гадаете... и что вам не понятно из моей статьи?! кстати, в отличие от железа протеус делает неправильно - называйте это как хотите...__Alexander писал(а):Да это я понял, просто проверить не могу. Точнее, с winavr увидел что них не работает, а понять почему не могу, хотя догадываюсь, что в отличие от железа протеус знает параметры МК, и объем памяти и все остальное, может поэтому и извращается.ARV писал(а):я именно хотел показать ошибку протеуса,
блин, да вы просто не читали мою статью!!!__Alexander писал(а):Где? В мэйкфайле что-то указвали?ARV писал(а):потому нашел способ занять побольше памяти
уверен - и на WinAVR вы не можете точно так же, как и в IAR... вы не знаете основ Си - о чем речь вообще?!__Alexander писал(а):Он не хваленный, просто начинал с него, могу и на winavr, но не так жестоко как вы.ARV писал(а):кстати, позвольте спросить: ваш хваленый IAR какой размер моей проги выдает?
вот когда заставите IAR делать все в полном объеме - тогда и сравним размеры. по моим сведениям IAR делает код примерно на 5-10% меньше, чем WinAVR - но это мизер....__Alexander писал(а):Точно проверить не могу, потому-то не знаю как привязать printf к Уарту. Но скомпилился без ошибок, заканчивается на 9F4, что есть 2 548, но че-то все равно многовато для такой проги, четвертая часть елы-палы. С таким разгоном дальше писать то уже некуда..
не знаю, что там у вас за моменты... судя по всему, "моментов" у вас немало - если даже с strlen() вы до сих пор разобраться не можете... лепет про "неизвестно что возвращающие библиотечные функции" - детский лепет.__Alexander писал(а):Да, с такмим размерами плюс минус десять байт дейтвительно не критично.ARV писал(а): сомневаюсь я... разница между sprintf и printf лишь в той самой функции вывода символа - одна выводит его в массив, другая - в файловый потоктак что по размеру все будет плюс-минус десяток байт одинаково
![]()
И не думаю что это таки детские моменты.