Не понятное в языке программирования С - C (СИ)
Формулировка задачи:
Собрал разные свои вопросы касательно языка программирования С. Если не трудно - просьба объяснить:
1. как в С создать массив строк? Вот такой код не проходит компиляцию
почему он не работает?
2. Часто при запуске скомпилированных программ с С с помощью компилятора tcc через 2-3 сек. в ОС windows7 появляется окошко с ошибкой "Обнаружена ошибка! Приложение будет закрыто. Приносим извинения за неудобства" то есть обычный отчет о ошибке в программе. Что это такое, и, как этого избежать? Почему появляются такие сообщения?
3. Можно как то по-подробнее объяснить как работают приложения на языке С в среде операционной системы? В виде любых UML диаграмм либо чего угодно. Приложение работает так что имеет доступ только к функциям winapi и все? С драйверами общается посредством встроенного установленного драйвера? Не могу понять именно как устроенна операционная ситстема и не знаю как в этом всем разобраться. Целые тома посвященные ОС в 800 страниц читать не хочется. Можно как то самому в это въехать?
4. Как пользоваться встроенным ассемблером в коде С? Где можно описание этого стандарта? Почему в асемблерных вставках в коде не работают команды IN, OUT для работы с портами ввода вывода? Хотел помигать светодиодами клавиатуры с программы на С но не получилось, что-то вообще ноль реакции. Здесь говорят что программа работает в защищенном режиме, и углубится к оборудованию не получится, да? Есть разные уровни привилегий в операционной системе, в процессоре, какие то "кольца" возможностей.
5. Верно ли сказать что компилятор языка С (здесь имеется ввиду - tcc) использует функции операционной системы для реализации таких математических функций как pow, sin, cos, и т.д.? То есть в нем реализовано это все независимо от операционной системы, автономно? Либо, компилятор как то использует то что содержится в операционной системе? То что создано корпорацией microsoft Интересно узнать то же самое но о linux. Короче с пониманием операционной системы полная тьма - ничего понять не могу. Можно разобраться в устройстве как то, по-быстрому и эффективно? Спасибо!
6. Пытался просмотреть скомпилированный код С компилятором tcc в дизасемблере ollydbg, специально там в исходнике добавлял данные в виде строк, но однако которые в hex дампе кода программы вообще не нашел! Почему так происходит? Куда деваются данные с программы? Они там должны содержатся а их нет.
7. Есть ли специально созданные для языков С/С++ библиотеки реализующие работу с массивами? Удобный инструмент работы с массивами: сортировка разная и прочее. Не называться ли эта библиотека случайно C arrays?
8. Как можно поэкспериментировать и пообщаться с оборудованием напрямую с программы на С? С любым оборудованием: принтер, сканнер, радиомодем, компьютерная мышь, экран, жесткий диск, карта памяти - любое оборудование. Жаль, конечно, что мало кто с изготовителей оборудования не публикует в интернете информацию о том как с ним работать, документацию, дата-шиты или как там их называют. Как же тогда быть?
9. Простенький вопрос. Как проще всего задать иконке скомпилированной программе на С свой любой значек? Как установить для значка программы иконку любую?
10. Простенький вопрос. Что такое библиотка *.dll? Как их создавать в компиляторе? Можно ли просмотреть как они работают в дизассемблере? После установки программы в её каталоге в Program Files появлется куча *.dll файлов, не понятно что это и как это создается и работает.
11. Простенький вопрос. Как кучу файлов программы объединить в одном значке? Что бы было не много файлов а одна программа, один значек и все. Может быть вопросы 9-10 слишком тупые, ссори.
12. Можно где то найти полный справочник по winapi на русском в формате chm? Что бы самый-самый полный, со всем необходимым. А то совсем не понятно как создавать окна, кнопки, выпадающие списки, радио кнопки, диалоговые окна и все остальное. Хорошо какие то примеры если бы были. Да и не понятно под какой язык программирования идет этот справочник по winapi. Он один для всех языков программирования?
13. Как создавать не стандартные окна windows через использование winapi а свои собственные стилизованные? Часто в программах не стандартный winapi оконный интерфейс а свой оригинальный красиво нарисованный, как это все создается?
14. Где можно найти мировой C-сборник библиотек работы со всем-всем-всем: декодеры/кодеры видео и звука, работы с изображениями, для создания 3D моделей, шифрования информации, алгоритмы расчета контрольных сумм и прочего? Есть в интернете какой то большой грамотный сборник таких функций на языке С?
15. Как в программе на С реализовать вычислительную много поточность?
16. Как в программе на С реализовать сетевую много поточность?
17. Как в ассемблерных вставках на ассемблере работать с много ядерными процессорами? Просто распаралелить задачу на два ядра? Так это реализуется?
18. Как можно реализовать ф-ю eval в программе на С? То есть создаешь строку обычную а она работает как программа: обычная строка данных превращается в программу.
19. Очень хочется получить ответ на этот вопрос. Как менять видео режимы видео карты на прямую либо через драйвер и как потом выводить графические спрайты (картинки) на экран?
20. Как работать с сетью с использованием языка программирования С? Сетевое программирование на С.
21. Почему не работает такой код:
22. В процессе компиляции программ на С там где идет вывод с русским языком он отображается абракодаброй. Как это можно исправить? Короче говоря не работает отображение кириллицы в консольных приложениях.
-
В процессе изучения языка программирования С стандарта 89 года по книге Гербердта Шилдта размещаю свою коллекцию функций на языке С. В коде чуть-чуть есть бардак. Хотелось бы узнать что не правильно там делал и какие-то рекомендации:
P.S.: Всякие *visual studio не интересуют. Все вопросы касательно компилятора tcc, только с ним хочу работать.
БОЛЬШОЕ СПАСИБО ЗА ОТВЕТЫ!
unsigned char str_array[50][50]; str_array[0][50] = "First string"; str_array[1][50] = "Second string"; . . . str_array[49][50] = "Final string";
#define ARRAY_LENGTH 50 unsigned char str_array[ARRAY_LENGTH];
#include <iostream.h> // Коллекция моих функция реалзованых на С(Си) // substr, str_replace, assembler_test, sp_to_dash, // hash_generation, str_all_to_upper, str_all_to_lower #define MY_FUNCTIONS_BUFFER_LENGTH 4096 unsigned char *substr(const char *str_subject, unsigned int str_start, unsigned int str_length); unsigned char *substr(const char *str_subject, unsigned int str_start, unsigned int str_length) { // Эта функция работала почти корректно. Ничего не правильного не заметил. unsigned char substr_buffer[MY_FUNCTIONS_BUFFER_LENGTH]; unsigned int substr_cnt = 0; while( substr_cnt < str_length ) { substr_buffer[substr_cnt] = *(str_subject + str_start + substr_cnt); substr_cnt ++; } substr_buffer[substr_cnt] = '\0'; return substr_buffer; } #define MY_FUNCTIONS_BUFFER_LENGTH 4096 unsigned char *str_replace(const char *str_search, const char *str_replace, const char *str_subject); unsigned char *str_replace(const char *str_search, const char *str_replace, const char *str_subject) { // str_replace function testing begin. unsigned char *str_replace_buffer; str_replace_buffer = str_replace("{LABEL}", "/Replace/", "{LABEL}"); printf("ex.: %s\n", str_replace_buffer); str_replace_buffer = str_replace("{LABEL}", "/Replace/", "{LABEL}{LABEL}{LABEL}"); printf("ex.: %s\n", str_replace_buffer); * str_replace_buffer = str_replace("{LABEL}", "/Replace/", "{LAB"); printf("ex.: %s\n", str_replace_buffer); str_replace_buffer = str_replace("{LABEL}", "/Replace/", "test {LABEL}"); printf("ex.: %s\n", str_replace_buffer); // str_replace function testing end. // функция str_replace почему так до конца достаточно и не работает. Работает с очень ошибками. // Надо ее доработать. Так же в эту функцию и в функцию substr, и во все остальные функции доработать // контроль ошибок когда один из параметров либо все либо выборочно не заданы либо ещё что то не так // так же доработать все свои остальные функции. Все. unsigned char returned_buffer[MY_FUNCTIONS_BUFFER_LENGTH]; unsigned str_search_c = 0, str_replace_c = 0, str_subject_c = 0, str_replace_buffer_c = 0, str_search_l = strlen(str_search), str_replace_l = strlen(str_replace), str_subject_l = strlen(str_subject); while( str_subject_c < str_subject_l ) { while( * (str_subject + str_subject_c) == * (str_search + str_search_c) ) { str_subject_c ++; str_search_c ++; } if( str_search_c == str_search_l ) { while( str_replace_c < str_replace_l ) { returned_buffer[str_replace_buffer_c] = * (str_replace + str_replace_c); str_replace_buffer_c ++; str_replace_c ++; } str_replace_c = 0; } if( str_search_c > 0 && str_search_c < str_search_l ) { str_subject_c -= str_search_c; } str_search_c = 0; // Важно, эта строка стояла в самом верху цикла и сильно влияла на работу модуля. returned_buffer[str_replace_buffer_c] = * (str_subject + str_subject_c); str_replace_buffer_c ++; str_subject_c ++; } returned_buffer[str_replace_buffer_c] = '\0'; return returned_buffer; } void assembler_test(void); void assembler_test(void) { unsigned char c = '0'; printf("%x\n", &c); __asm__ __volatile__ ( "movl $0x0018ff57, %eax\n" "addb $0x0f, (%eax)\n" ); // ^ комманды call, out не работают, почему то printf("%c", c); } void sp_to_dash(char *str); void sp_to_dash(char *str) { while(*str) { if(*str == ' ') { printf("-"); } else { printf("%c", *str); } str++; } } void hash_generation(unsigned char output_hash[], unsigned short int output_hash_length); void hash_generation(unsigned char output_hash[], unsigned short int output_hash_length) { srand(time(0)); unsigned short int current_hash_index, current_hash_segment_type, current_hash_segment; int current_hash_index = 0; while( current_hash_index < output_hash_length ) { current_hash_segment_type = 0 + rand() & 3 ; switch( current_hash_segment_type ) { case 0: current_hash_segment = (char)(48 + rand() % 9); break; case 1: current_hash_segment = (char)(65 + rand() % 25); break; default: current_hash_segment = (char)(97 + rand() % 25); } output_hash[current_hash_index] = current_hash_segment; current_hash_index ++; } } void str_all_to_upper(char str[]); void str_all_to_upper(char str[]) { int char_index; for( char_index = 0; char_index < strlen(str); char_index ++ ) { str[char_index] = toupper(str[char_index]); } } void str_all_to_lower(char str[]); void str_all_to_lower(char str[]) { int char_index; for( char_index = 0; char_index < strlen(str); char_index ++ ) { str[char_index] = tolower(str[char_index]); } } unsigned long int ansi_c_89_strlen(unsigned char *subject); unsigned long int ansi_c_89_strlen(unsigned char *subject) { unsigned long int char_index = 0; while( subject[char_index] != '\0' ) char_index ++; return char_index; }
Решение задачи: «Не понятное в языке программирования С»
textual
Листинг программы
#define ARRAY_LENGTH 50 unsigned char str_array[ARRAY_LENGTH];
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д