А работает то, как раз, правильно.Потому что это условие никогда не выполнится.
Ps. Лютик, Не нужно было добавлять от себя (()==1)макрос работает в том виде, как я привел.
Эта "ошибка" закреплена стандартами. Например, стандарт C99 (ISO/IEC 9899:1999 (E)):urry писал(а):Это распространенная ошибка - путать число "1" и булевое значение true.
while((PIND & (1<<6))==1);
while((PIND & (1<<6))== true);
совсем разные условия.
Код: Выделить всё
7.16 Boolean type and values <stdbool.h>
...
3 The remaining three macros are suitable for use in #if preprocessing directives. They are
true
which expands to the integer constant 1,
false
which expands to the integer constant 0Код: Выделить всё
...
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
...
Код: Выделить всё
while((PIND & (1<<6))==1);Код: Выделить всё
while((PIND & (1<<6))== true);-------------------------------------while((PIND & (1<<6))==1);
и
Код:
while((PIND & (1<<6))== true);
тождественны в силу приведенных макроопределений (и тем самым одинаково неправильны по сути
Совсем одинаковые в своей неправильности, как уже сказал Goldsmithurry писал(а):Это распространенная ошибка - путать число "1" и булевое значение true.
while((PIND & (1<<6))==1);
while((PIND & (1<<6))== true);
совсем разные условия.
Это когда мы от int преобразовываем к bool. Или когда проверяем в if / ?: / while / forurry писал(а):В общем, true - это значение, противоположное false, которое, в свою очередь, всегда равно 0.
Т.е true - это любое число, отличное от 0.
«Скажите мне, в каком компиляторе, чтобы я никогда им не пользовался»™urry писал(а):Далее, выражения
while((PIND & (1<<6))== true);
while((PIND & (1<<6)));
абсолютно идентичны.
Код: Выделить всё
while( (PIND & (1<<6)) ) ; // всё, что не 0 -- уже хорошо.
while( !!(PIND & (1<<6)) == true ) ; // всё, что при отрицании даёт 0 (false) и при последующем отрицании совпадает с true
while( (PIND & (1<<6)) != false ) ; // всё, что не совпадает с false
Код: Выделить всё
foo:
.L1:
sbic 48-32,6
rjmp .L1
retКод: Выделить всё
while( (PIND & (1<<6)) == 1 ) ; // всё, что совпадает 1.
while( (PIND & (1<<6)) == true ) ; // всё, что совпадает с true, выраженном как целое число, т.е. всё, что равно 1.
Код: Выделить всё
foo1:
in r24,48-32
retavreal, это просто наваждение какое-то! Уже не в первой теме так: только выдастся минутка написать ответ, захожу - а Вы уже все сказали, причем именно теми же словами, что и я собирался. Мистикаavreal писал(а):«Скажите мне, в каком компиляторе, чтобы я никогда им не пользовался»™
Я видел вариант круче:avreal писал(а):Если уж писать «булевские» значения, то if (expression != false), иногда такое встречал в чужом коде, но в чём кайф -- не понимаю.
Код: Выделить всё
if (b.ToString().Length == 4) ...Полностью согласен.Лучше уж пользоваться стандартным понятным макросом, доступно для чтения и не вызывает ошибок.avreal писал(а):Именно поэтому писать в С if ( expression == true ) или совершенно бессмысленно (когда само expression даёт логическое значение, например, expression это (A == B) ), или ошибка, как в примерх выше. Если уж писать «булевские» значения, то if (expression != false), иногда такое встречал в чужом коде, но в чём кайф -- не понимаю.
это типа если длина == 4, то считать что это TRUE? Бред какой то.Goldsmith писал(а):Я видел вариант круче:
Код:
if (b.ToString().Length == 4) ...
Для битвы титанов предмет жидковат. Первый класс, вторая четверть. "Мама мыла раму"...vitalik_1984 писал(а):И началась битва титанов....Ploop,avreal
, urry,Goldsmith.
Да, такой вот индийский креативчег.vitalik_1984 писал(а):это типа если длина == 4, то считать что это TRUE? Бред какой то.
Код: Выделить всё
void MP3_Test(char *test)
{
unsigned long i;
unsigned long roma;
roma=1;
while(1)
{
// char mp3_filename[14] = "sound.mp3"; // MP3 file name
char mp3_filename[3][14] ={ "sound1.mp3","sound2.mp3","sound3.mp3"};
// Reset error flag
*test = 0;
TFT_16bit_Write_Text("2. SD vigu", 30, 100);
if (Mmc_Fat_Init() == 0) {
if (Mmc_Fat_Assign(&mp3_filename[roma], 0) ) {
TFT_16bit_Write_Text("3. fail est", 30, 120);
Mmc_Fat_Reset(&file_size); // Call Reset before file reading,
// procedure returns size of the file
TFT_16bit_Write_Text("4. vosproizvodim:", 30, 140);
TFT_16bit_Write_Text(&mp3_filename[roma], 150, 140);
// send file blocks to MP3 SDI
while (file_size > BUFFER_SIZE)
{
for (i=0; i<BUFFER_SIZE; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
for (i=0; i<BUFFER_SIZE/BYTES_2_WRITE; i++) {
MP3_SDI_Write_32(mp3_buffer + i*BYTES_2_WRITE);
}
file_size -= BUFFER_SIZE;
}
// send the rest of the file to MP3 SDI
for (i=0; i<file_size; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
for (i=0; i<file_size; i++)
{
MP3_SDI_Write(mp3_buffer[i]);
}
TFT_16bit_Write_Text(&mp3_filename[roma], 30, 160);
}
else {
TFT_16bit_Write_Text("3. File not assigned", 30, 180);
*test = 2;
}
}
else {
TFT_16bit_Write_Text("3. MMC FAT not initialized", 30, 200);
*test = 2;
}
roma++;
if (roma>3) { roma=1; }
}
}Индексы массивов в C начинаются с нуля...Первый класс, вторая четверть. "Мама мыла раму"...
Ну, кроме бэйсика я уж и не припомню языков, в которых индексы массива по умолчанию не начинались с нуля. В МС бэйсике, кстати, для этого тоже рукоятка для управления есть.RomanT писал(а):Ну уж извините ... первый раз сел за Си ...
Никак, по определению тип char - это один символ. Хотите много - используйте массивы.Ещё вопрос, как в char переменной написать несколько пробелов ?
Код: Выделить всё
TFT_16bit_Fill_Screen(CL_WHITE_16bit);
TFT_16bit_Set_Pen(CL_Black_16bit, 1);
TFT_16bit_Line(20, 220, 300, 220);
TFT_16bit_LIne(20, 46, 300, 46);
TFT_16bit_Set_Font(&HandelGothic_BT21x22_Regular, CL_RED_16bit, FO_HORIZONTAL_16bit);
TFT_16bit_Write_Text("POMA", 75, 14);
TFT_16bit_Set_Font(&Verdana12x13_Regular, CL_BLACK_16bit, FO_HORIZONTAL_16bit);
TFT_16bit_Write_Text("MP3 Player for ATmega", 19, 223);
TFT_16bit_Set_Font(&Verdana12x13_Regular, CL_RED_16bit, FO_HORIZONTAL_16bit);
TFT_16bit_Write_Text("www.ingineer.ru", 200, 223);
TFT_16bit_Set_Font(&TFT_16bit_defaultFont, CL_BLACK_16bit, FO_HORIZONTAL_16bit);Код: Выделить всё
.include "File_init.inc"Код: Выделить всё
#include "File_init.c"Код: Выделить всё
#include "File_init.h"