Структура в си == объект?

Задача следующая:

Имеются символы, для каждого символа нужно посчитать n параметров (например, частоту нахождения в тексте, шифрограмму и т.д.).
Начать делать все через массивы и понял, что куча массивов chastota[N], cipher[N] ... (где N у каждого из массива должна относиться к одной и той же букве) не есть хорошо.

Наткнулся на сложные структуры (struct, union и т.д.) - вроде то, что мне нужно: для каждой буквы создаем свою структуру и храним в ней все параметры, но появилась проблема.

Например, так мы объявляем структуру:
struct character
{
	char character; // символ
	float probability; // частота
	int cipher; // шифрограмма

};


Далее я считываю из файла строку, получаю алфавит сообщения (список букв без повторений), и далее по сути я должен для каждой буквы полученного алфавита создать экземпляр (?это так называется?) структуры. Делаю это так:

for (int i = 0; i < alphabetSize; i++) {
	struct character character[i];
}

, где alphabetSize - длинна алфавита

Но выдает ошибку - i должно иметь контактное выражение.
Исходя из этого, несколько вопросов:
1. Как сделать так, чтобы каждая буква имела свою структуру (для i-ой буквы структура - character[i])
2. А для подобного ли придуманы структуры? Просто знаком в какой-то степени с PHP и его ООП, где мы просто создаем экземпляр объекта и используем. Это то же самое?
  • Вопрос задан
  • 571 просмотр
Решения вопроса 3
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
  1. Вы были очень близки к созданию массива структур, но любовь к слову character вам помешала (:
    s/character[i]/characters[i]/ и по индексу i всё прекрасно работает.
  2. В структуры в C нельзя добавить сами функции, только ссылки на них. Путём добавления сахара прикручивается ООП, так C++ собственно и появился.
Ответ написан
@q27off
В приведенном фрагменте кода нет синтаксических ошибок, если используется C99 (VS не поддерживает). На каждой итерации создается массив структур, длина которого равна i.

Наверное, вы хотели сделать так:
struct character characters[alphabetSize];

Стандартом С89 массивы переменной длины не поддерживаются. Поэтому для VS этот же код выглядит так:
struct character *characters = malloc(sizeof(struct character) * alphabetSize);

И не забудьте освободить выделенную память, когда массив станет не нужен:
free(characters);
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
В С нет обьектов. Либо переходите на C++, либо читайте про выделение памяти :)

Если alphabetSize известно заранее - нужно выделить память под массив структур сразу:
struct character *c_ptr, *c_ptr2;

c_ptr = calloc(sizeof(struct character), alphabetSize);

И теперь можно перемещаться по полученному массиву меняя адрес указателя на структуру:
int i;

for(i = 0, c_ptr2 = c_ptr; i < alphabetSize; i++, c_ptr2++)
 {
тут что-то делаем...
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы