Переключение с C ++ (с большим количеством использования STL) на C для создания интерпретатора - PullRequest
2 голосов
/ 10 апреля 2010

Я переключаюсь с C ++ на C, потому что я перестраиваю свой игрушечный интерпретатор. Я привык к векторам для динамического выделения объектов, таких как токены или инструкции моих программ, стеки и в основном строки со всеми их аспектами.

Теперь, в Си, я больше не собираюсь иметь все это. Я знаю, что мне тоже придется использовать много памяти.

  • Я совершенно новичок в C, я знаю только высокоуровневые структуры данных с простым жизненным циклом из STL, как я могу начать работу со строками и динамическим распределением памяти?

Ответы [ 3 ]

3 голосов
/ 11 апреля 2010

Как вы уже догадались, будет гораздо больше работы, если вы привыкли к C ++ и хотите перейти на C.

Для ваших векторов обычным подходом является использование связанного списка s, когда вы хотите динамически подобную массиву структуру. Хотя это не то же самое, что вектор - O (1) доступ здесь по сравнению с O (n) в обычном связанном списке - обычно это "делает свою работу" Альтернативно: не используйте динамический массив. Множество ситуаций может обойтись с помощью фиксированного массива и константы в стиле MAX_ARRAY. Для v0.2 как минимум: -)

Для строк вы, вероятно, получите что-то вроде:

struct string {
    char *buf;
    size_t length;
}

Наличие большего количества полей для учета выделенного буфера в сравнении с фактическим используемым буфером и т. Д. Затем целый ряд подпрограмм для добавления в строку, освобождения ее, копирования другой строки и т. Д.

Стеки могут быть реализованы в виде связанного списка или массива.

Вы заметили образец? Информатика 101. Множество изобретений колеса. Преимущество состоит в том, что вы можете оптимизировать структуры данных для вашей программы. Недостатки в том, что вам, вероятно, придется написать целый набор кода, чтобы вернуться туда, где вы сейчас находитесь. И вам понадобится гораздо больше юнит-тестов.

3 голосов
/ 10 апреля 2010

В Си пейзаж намного проще. У вас есть только malloc, calloc, realloc и free.

malloc выделяет количество байтов и возвращает его вам, возвращая NULL при ошибке.

calloc - то же самое, что и malloc, но выполняет умножение размера для вас. (Вы даете ему sizeof (mytype) и номер, и он дает вам правильный размер). Он также заполняет блок памяти нулями.

realloc принимает указатель ранее malloc 'd и изменяет размер базового блока памяти. Если блок может быть расширен, он есть, а если нет, тогда выделяется новый блок, и содержимое старого блока копируется в новый блок. При неудаче возвращает NULL.

free возвращает память, ранее выделенную с помощью malloc, calloc или realloc.

2 голосов
/ 10 апреля 2010

Строки - это просто массивы символов, оканчивающиеся на 0 (также '\ 0') (довольно жесткое ядро), но вы можете создавать все что угодно с помощью своих собственных функций и, возможно, собственной структуры - вы можете создать свою собственную строку. 1001 *

Функции для строк ANSI, которые изначально доступны: http://cplusplus.com/reference/clibrary/cstring/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...