Объявление массива структур
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Захотелось получить объект структуры, один их элементов которой является массив другой структуры.
После выделения памяти делаю пробное заполнение и вывожу результат, однако похоже весь мой массив засунулся в первую свою строчку :). Помогите найти ошибку.
В printf спецификация %s выводит символы начиная с адреса, указанного аргументом и до символа '\0'. У тебя под массив из 20 структур ScreenRow выделяется непрерывный кусок памяти, который ты инициализируешь точками и единицами без единого '\0'. В g_Screen->Rows[0]->Text как раз хранится адрес этого куска памяти. Вот оно тебе всё и выводит на экран, пока не наткнется на случайный '\0' уже где-то за пределами твоей области памяти.
Основная ошибка в лишнем уровне косвенности в описании структуры:
ScreenRow** Rows;
. Исходя из общего смысла здесь Rows — это массив «строк» типа ScreenRow. А у тебя получился указатель на массив. Поэтому кстати и падает вprintf("%s", g_Screen->Rows[1]->Text)
; тут должно бытьprintf("%s", (*(g_Screen->Rows))[1]->Text)
.Вычищенный и исправленный код:
Как я понял, это всё моделирует экран в режиме консоли? Ты не думал над вариантом что бы каждое знакоместо представлялось структурой
а экран потом представить тупо двумерным массивом этих структур?
А вообще я несколько удивлен сишным кодом с использованием new из С++.
Спасибо, работает. Получается что new ScreenRow и new ScreenRow[NUM_OF_STRS] — один и тот же тип данных, я не доволен :)
Про printf понял, это я для примера, в проекте смотрел в отладчике.
Двумерный массив не хочу, может мне понадобится добавить еще пару немассивных полей в ScreenRow.
Моих знаний еще не хватает отличать с от с++ :)
Не получается. Первый — структура, второй — массив структур. Это разные типы.
Если смотрел в отладчике, то должен был заметить, что во втором вызове адресуется неправильная область памяти. Это должно было навести на мысль.
Почему тогда и то и другое имеет тип ScreenRow*?
Получается нет возможности (или необходимости?) при определении поля Screen.Rows установить что это будет массив структур известной длины, а не структура. Это же плохо.
Во-первых, ни первое, но второе не имеют тип
ScreenRow*
. Во-вторых, еще раз почитайте про указатели. В книжке. А потом еще в другой книжке. Это нужно понять обязательно. Это — важно. В-третьих, ответьте на вопрос: чем отличается массив из N структур (N>1) от массива из одной структуры.