Jump to content

    

razrab83

Участник
  • Content Count

    201
  • Joined

  • Last visited

Community Reputation

0 Обычный

About razrab83

  • Rank
    Местный

Recent Profile Visitors

982 profile views
  1. Некий неадекватный персонаж jcxz неоднократно пишет оскорбления, переходит на личности в "Cистемный уровень проектирования\Операционные системы\Программирование". Почему ему всё сходит с рук??? За гораздо меньшее других переводили в RO, ну или по-крайней мере удаляли посты. jcxz предлагает явно не рабочие решения (противоречащие стандарту языка программирования), и продолжает врать, что у него это работает. При этом постоянно переходит на оскорбления, нарушая пункт 2.1 правил форума. Подавал жалобу уже не раз на него - и нет никакой реакции. В "Cистемный уровень проектирования\Операционные системы\Программирование" вообще есть модератор?
  2. Да, в плюсах const int array[] объявленный 2 раза в разных исходниках собирается, без const нет. В си с const - нет.
  3. Нарушено правило ODR. Я же разжевал в чем косяк? См мой пост выше. Или вы издеваетесь? Модератор, дайте бан jcxz на пару недель, за издевательство. Может знание по С/С++ подтянет. Вы хотите сказать, что если вы в двух исходных файлах определите две глобальные переменные с одинаковым именем, то ваш линкер это проглотит? Если да, то вы не на с/с++ пишите. Вам тут не место на другой форум. Ну во первых у меня нет подобной проблемы, т.к. я подобный говнокод не генерирую. Во вторых, если кто и "оступиться", то компилятор линкер сообщит проблему и она легко правиться, и ни нужно ни куда ни чего писать. ну и в третих.... встречаются начинающие программисты, которые не могут справиться с Li006, они пишут об этом, просят помощь, даже на электрониксе. Поищите. ps собрал холоворд на gcc с вашим кодом - тоже самое, даже код ошибки такой же. Уже не требуется. Сделал именно через указатель. Всё равно спасибо!
  4. А вы не видите какой косяк в этом коде, не компилируя его? "дупликэйт дифинишин" - извините за мой французкий duplicate definition. Какая взаимосвязь между "множественным определением" и "множественным включением"? Естественно во всех хидерах есть #ifndef ASD_H. И? В приличных домах обычно, переменные объявляют в хидерах, определяют в исходниках. Включите #include "asd.h" в несколько *.с, компилятор в каждом *.с определит array (мне это зачем?), линкер дает законную ошибку дупликэйт дифинишин Error[Li006]: duplicate definitions for "array"; ps Научитесь держать слово за себя. Все другие сами за себя скажут.
  5. что не понятного? вот ваш пример asd.c: int array[] = {1,2,3}; const int array_size = sizeof(array)/sizeof(int); main.c: #include <stdio.h> extern int array[]; extern const int array_size; void main(){ printf("%d", array_size); } Это понятно? теперь посмотрите мой самый первый main.c. Мне нужно создать переменную вне тела маин и инициализировать её размером массива.Т.е ваш маин для меня должен быть таким #include <stdio.h> extern int array[]; extern const int array_size; int qwe = array_size; void main(){ //printf("%d", array_size); //в коде мне не нужно использовать array_size printf("%d", qwe); } Не компилируется. expression must have a constant value Смысл вытаскивать размер массива с помощью константной переменной, если нужно константое значение?
  6. нашел ключ Wmissing-field-initializers, скормил его иару, Command line error: Unexpected command line arguments: --Wmissing-field-initializers эх....
  7. не один вариант не работает. смотрите в чем проблема - #include asd.h int qwe = sizeof(array);//вот проблемная строчка void main(void) { //code } даже если сделать так #include asd.h const int a = 10; int qwe = a;//вот проблемная строчка void main(void) { //code } Компилятор дает ошибку "expression must have a constant value". Т.е. на этапе компиляции qwe нужно инициализировать константой. Не константной переменной, а константой. Как это сделать - хз. Хорошо.... если так си не умеет... можно препроцесор заставить проверить размер массива? пока сделаю так.... asd.c #include asd.h int array[SIZE_ASD] = {1,2}; asd.h #define SIZE_ASD 2 extern int array[SIZE_ASD]; main.c #include asd.h int qwe = SIZE_ASD; //или int qwe2 = sizeof(array) / sizeof(array[0]; void main(void) { //code } Этот вариант не нравиться, т.к. SIZE_ASD может быть равен 100, а тут "int array[SIZE_ASD] = {1,2,...};" в фигурных скобках будет 98 элементов. Два последних не инициализируются. Как прероцессор заставить на этапе компиляции проверить, что кол-во элементов при инициализации равно SIZE_ASD - не придумал. Может ключ какой подсунуть компилятору, чтобы он хотя бы ворнинг дал?
  8. Вообще, есть такой код (упрощённо) asd.c #include asd.h int array[2] = {1,2}; asd.h #include asd.h extern int array[2]; main.c #include asd.h int qwe = sizeof(array); void main(void) { //code } Работает. Но я не хочу явно указывать размер массива array. я хочу как-то так #include asd.h int array[] = {1,2}; asd.h #include asd.h extern int array[]; main.c #include asd.h int qwe = sizeof(array); void main(void) { //code } Не компилируется. Error[Pe070]: incomplete type is not allowed. Я понимаю, что на этапе компиляции main.c не известен размер array. Если сделать всё в майне, то работает main.c int array[] = {1,2}; int qwe = sizeof(array); void main(void) { //code } Есть решение для си, которое определило бы размер массива на этапе компиляции, определённого в другом файле? Может макросами/дефайнами как-то хитро сделать?
  9. Обнародованное решение с++. Для си есть решение?
  10. разобрался. в шаблон нельзя передавать не константу, которую нельзя вычислить на этапе компиляции. можно тему удалить.
  11. код typedef struct MySlideItem { int y; }MySlideItem; MySlideItem slide1, slide2, slide3, slide4; void removeF(MySlideItem *item ) { item->y = 23; } void f1(int a) { removeF(&slide1); } void f2(int a) { removeF(&slide1); } void f3(int a) { removeF(&slide1); } void f4(int a) { removeF(&slide1); } экземпляров структуры MySlideItem 100500. Соответственно однотипных функций типа f1(int) - также 100500. от акына простыней кода должен спасти шаблон. typedef struct MySlideItem { int y; }MySlideItem; MySlideItem slide1, slide2, slide3, slide4; void removeF(MySlideItem *item ) { item->y = 23; } template<MySlideItem BASE> void f1(int a) { removeF(&BASE); } int main() { f1<slide1>(0); } невзлетело. вроде как в аргументы шаблона можно передать пользовательский тип. Что не так?
  12. я ни где в коде не увидел (не писал) str_buffer_write_position = .... Переменная str_buffer_write_position измениться только после оператора "=". for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[str_buffer_write_position%100][i]=rx_buffer[i]; Тут str_buffer_write_position делится на 100, остаток от деления используется в качестве индекса массива, но сама переменная str_buffer_write_position не меняется. Если у вас где-то в коде str_buffer_write_position обнуляется, то тогда дополнительно в выводе %100 не нужно.
  13. Да! При этом, скорость "скролинга" не будет зависить от размера строкового буфера. Хоть буфер на 5 строк, хоть на 100 строк, хоть на 65000 строк. Вывод начиная с самой старой строки for(int i = 0; i<100; i++) { int j = i + str_buffer_write_position%100; if( j > 99) j -= 100; printf(&TERMINAL_TEXT[j][0]); } как-то так (только "100" заменть на define)
  14. Зачем вообще что-то копировать и перемещать? Скролинг делается "скролингом" индекса. Я не знаю как у вас меняется индекс (кол-во) принятых строк str_buffer_write_position. Допустим изменятеся от 0 до 10000000000000000000000000000000000. тогда #define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE]; char TERMINAL_TEXT[100][256]; for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[str_buffer_write_position%100][i]=rx_buffer[i]; и ни чего, при появлении 101-ой строки ни куда не нужно перекопировать. последняя строка всегда str_buffer_write_position%100 можно, для читаемости кода так #define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE]; char TERMINAL_TEXT[100][256]; static int index = 0; index = str_buffer_write_position%100; for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[index][i]=rx_buffer[i]; for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[str_buffer_write_position][i]=rx_buffer[i]; У вас же не каконить ПК с говновиндой, у вас МК со всеми потрахами. Зачем какие-то memmove и т.п.? Используйте DMA. ps сделайте буфер размером степень 2, т.е. 128 или 64. Тогда #define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE]; char TERMINAL_TEXT[128][256]; static int index = 0x7f; //при получении новой строки инкремент индекса ++index &= 0x7f; //или (128-1), или (64-1) //for(uint8_t i=0;i<255;i++) // TERMINAL_TEXT[index][i]=rx_buffer[i]; memcpy(&TERMINAL_TEXT[index][0], rx_buffer, 255); у вас index всегда будет указывать на последнюю принятую строку. не нужно ни каких адски сдвигов массивов с текстом, не будет ни какой нагрузки на МК.