Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

файл всегда будет пустой в двух случаях:
1) переменная i не изменяется. В этом случае цикл while ( s != '\0' ) превращается в while ( s[0] != '\0' ) и бесконечно крутится, до записи в файл никогда не дойдёт.
2) переменная i изменяется но строка не терминирована нулём (такие тоже есть), в этом случае цикл опять бесконечен, но при этом ещё и имеет место быть вылет за границы массива. До записи в файл опять никогда не дойдёт.

В общем, в этом примере есть явная ошибка - отсутствие i++, плюс имеется допущение, что строка всегда нуль-терминированная - значит, массив содержит хотя бы null, что делает корректным обращение к элементу с индексом 0, и гарантирует выход из цикла. Если строка не нуль-терминированная, то аж две возможности словить бяку: обращение к пустому массиву и бесконечность цикла.

Если в книжке подобное не описано - плохая книжка. Если описано - хорошая, а i++ просто ошибка, забыл он или наборщик-редактор-корректор... у меня на каждую сотню строк кода одна такая глупая ошибка находится
Последний раз редактировалось Martian Пн авг 19, 2024 17:18:47, всего редактировалось 1 раз.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Никто не совершенен.
8)
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

что значит никто? Я! :)))
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1338
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

BOB51 писал(а):Никто не совершенен.
Martian писал(а):что значит никто? Я! :)))
Ну уж точно не я. По крайней мере в этом.
Это действительно зависает при выполнении. выполняется бесконечный цикл?

Код: Выделить всё

main() 
{ 
 char s[80]; 
 int i; 
 FILE *fin, *fout; 
 fin = fopen ( "input.dat", "r" ); 
 fout = fopen ( "output.dat", "w" ); 
 [color=#FF8040]while ( NULL != fgets ( s, 80, fin ) ) // читаем строку [/color]
      { 
      i = 0;  // начинаем с s[0] 
      while ( s[i] != '\0' )  // пока не конец строки     
      if ( s[i] == 'A' ) s[i] = 'Б'; // меняем символ 
      i++ ;
   fprintf ( fout, "%s", s ); // выводим строку в файл 
    }  
 fclose ( fin ); 
 fclose ( fout ); 
} 
Причём зависает на девятой красной строке.
Ставишь вместо не равно равно,тогда проходит. Значит не читает программка из моего файла input.dat ничего. Хотя лежат они все три в одной папке. И соответственно ничего не записывает в выходной. Как был пустым,так и остаётся.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

ну, надо знать, что за файл input.dat, может, там что-то юникодное. Может файл вообще не открывает, Вы же это не проверили. Теоретически, надо так:

Код: Выделить всё

main()
{
    char s[80];
    int i;
    FILE *fin, *fout;
    
    if  (fin = fopen("input.dat", "r") != NULL) // если файл для чтения открылся успешно
    {
        if (fout = fopen ("output.dat", "w") != NULL) // если файл для записи открылся успешно
        {
            while (fgets(s, sizeof(s), fin) != NULL) // читаем строку
            {
                        //....здесь делаем операции со строками 
            }
            fclose (fout);
        } 
        else
        {
             printf ("Не могу открыть файл output.dat!\n");
         }
         fclose (fin);
      }
      else
      {
           printf ("Не могу открыть файл input.dat!\n");
      } 
      printf ("Программа завершена\n");
} //main
Попробуйте запустить этот код без обработки строк и записи их. Вот как он есть. Если получите сообщение "Программа завершена" без иных сообщений, значит файлы открываются корректно, чтение входного файла тоже.

Добавлено after 18 minutes 16 seconds:
Можно немного удобнее записать тот же алгоритм действий, чтобы не размазывать ветвления по всему тексту:

Код: Выделить всё

int main()
{
    char s[80];
    int i;
    FILE *fin, *fout;
   
    if  (fin = fopen("input.dat", "r") == NULL) // если файл для чтения не открылся
    {
       printf ("Не могу открыть файл input.dat!\n");
       return 1; // прекращаем работу программы
    }
    
    if (fout = fopen ("output.dat", "w") == NULL) // если файл для записи не открылся
    {
       printf ("Не могу открыть файл output.dat!\n");
       return 1; // прекращаем работу программы
    }
        
    while (fgets(s, sizeof(s), fin) != NULL) // читаем строку
    {
           //....здесь делаем операции со строками
    }
    fclose (fout);
    fclose (fin);
    printf ("Программа завершена\n");
    return 0;
} //main
В общем, следует помнить, что функции обычно всегда возвращают результат своей деятельности, и проверять его - это хорошо. Хотя и запарно иногда...
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Файлы разные бывают.
И совсем не обязательно символьная строка терминальным нулем закрывается.
Тот же Intel hex8 к примеру...
Да и использовать для тестов - тренировок нужно латиницу - ее все программы понимают без некорректностей.
С кириллицей и ОС и редактор текста "подкузьмить" могут.
:tea:
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

ОС и редактор уже много лет как могут использовать UTF-8/16, и это должно быть настроено прям сразу после установки. Все древние неюникодные кодировки - анахронизм или узкоспециализированное.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1338
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

BOB51 писал(а):Да и использовать для тестов - тренировок нужно латиницу - ее все программы понимают без некорректностей.
Martian писал(а):С и редактор уже много лет как могут использовать UTF-8/16, и это должно быть настроено прям сразу после установки. Все древние неюникодные кодировки - анахронизм или узкоспециализированное.
Только не у меня. У меня всё древнее,WinXP и пр. , и мой DevC кириллицу пишет кракозябрами,
в том числе и в комментариях. :cry:

з.ы.
После выполнения вышенаписанного вот чего.
Вложения
2024-08-20_193125.jpg
(26.38 КБ) 5507 скачиваний
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

:facepalm:
имя файла на кириллице!!!
этого больше всего DOS с простейшими (и "устаревшими") программами не переваривает...
:(
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Приехали таки индикаторы в коробушках...
Симпатяшки,
https://img.radiokot.ru/files/20529/3j7oqqfki2.jpg
да еще и с платкой управления бонусом
https://img.radiokot.ru/files/20529/3j7oqrxjm5.jpg
соотношение размеров :
https://img.radiokot.ru/files/20529/3j7oqti4mz.jpg
внизу для сравнения "обычный" 1602.
:hunger:
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Один (самый древний) я таки разобрал и к адуринке прицепил...
https://img.radiokot.ru/files/20529/3jhnuqkts1.jpg
Теперь второй вопрос...
Питание у самоделки в диапазоне от 5 до 3.0 вольта (обычный самоделка на аккумуляторе)...
Обычное регулирование контраста переменным резистором работает только при фиксированном напряжении питания.
Подкручивать явно не великое удовольствие.
А вот как и что удерживать на Vo стабильным автоматически,чтобы контраст оставался неизменным во всем диапазоне питающих напряжений?
Напряжение или ток?... И относительно чего - GND или + питания?
Видел варианты что на DSках (экзотика с программируемым потенциометром), что с источником тока на LM334...
А вот что есть истина?
:dont_know:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Истина есть питание от 3,3 с повышающим до 5 стабом

Добавлено after 1 minute 29 seconds:
Кстати, такой вариант и от 5 можно питать, т.к. повышающий до 5 стаб при питании от 5 превращается в проводник.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Оно то верно, да вот существование 10 позиционных семисегментников с питанием от 6 до 2,7/3 вольт даёт мыслю, что авто контраст возможен...
:roll:
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Попались вот такие резисторы (накопались после очередной ревизии старого ....)...
https://img.radiokot.ru/files/20529/3jpdnrzv5u.jpg
куда б применить...?
:roll:
:sleep:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Да кто ж их знает.. Может где и пригодятся - это ж "тензорезисторы"...
:dont_know:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Поверьте, лучше полета в лучах заката им применения не найти!

Все вещи, детали, предметы и т.п., которым не нашлось применения за предыдущие годы, надо выкинуть, и не ломать голову. Я недавно выкинул примерно с килограмм советских транзисторов... Еще раньше мешок 155й серии. Еще раньше полноразмерный картофельный мешок резисторов МЛТ... Сейчас готовлюсь выкинуть около сотни транзисторов "в металле"... Всем этим запасам лучшее место на свалке.

Добавлено after 2 minutes 40 seconds:
Вот единственное, о чем жалею, так это об отданных "во дворец пионеров" куче ГРИ... В ту пору АЛ307 казался невероятно крутым, а теперь... Эх...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

У меня из МП42 получаются неплохие кнопки.
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

"...
32-разрядный 8051 Cortex MCU серии 32G
Сверхвысокая скорость 32-разрядного ядра 8051 с одной тактовой частотой за машинный цикл, которая называется 1T и скорость примерно в 70 раз выше, чем у традиционного 8051.
..."
( https://www.stcmicro.com/stc/stc32g.html
https://www.stcmicro.com/stc/stc32g12k128.html )
ГЫММ...
Так Cortex MCU или 8051 ???
и доки на китайском...
:roll:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 309
Зарегистрирован: Ср сен 11, 2024 10:18:53

Сообщение zAries »

[uquote="BOB51",url="/forum/viewtopic.php?p=4625954#p4625954"]"...32-разрядный 8051 Cortex MCU серии 32G[/uquote]
Написали на сайте Cortex а надо было Core Ошибочка по Фрейду :)
Audiatur et altera pars !
Ответить

Вернуться в «Разные вопросы по МК»