Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 20

Не могу объявить массив указателей на объект

23.11.2011, 00:47. Показов 2212. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такой вопрос. При объявлении массива указателей на объект появляются 3 ошибки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Cindex::merge(Ckey *A[], int l, int m, int r)
{
    int i, j;
    Ckey *Ax[r];
    for(i = m+1; i > l; i--) *Ax[i-1] = *A[i-1];
    for(j = m; j < r; j++) *Ax[r+m-j] = *A[j+1];
    for(int k(l); k <= r; k++)
        if(Ax[j]->Getoffset() < Ax[i]->Getoffset())
            *A[k] = *Ax[j--];
        else
            *A[k] = *Ax[i++];
}
Ошибки:
error C2057: требуется константное выражение
error C2466: невозможно выделить память для массива постоянного нулевого размера
error C2133: Ax: неизвестный размер
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2011, 00:47
Ответы с готовыми решениями:

Как объявить массив указателей?
Напишите объявление переменной - одномерного массива StringArray указателей на символы длины N.

Как объявить массив указателей на функции?
с юморком, для смелых)) Как объявить массив указателей на функции, возвращающие указатели на массив указателив на строкы?

необходимо объявить массив указателей на функцию
которая (например) ничё не принимает и возвращает, допустим, значение типа int. Спасибо, кто откликнется.

10
Заблокирован
23.11.2011, 00:59
Проблема в том, что крайне левой индекс массива должен быть константным выражением.
То есть в С++ такое объявление

C++
1
Ckey *Ax[r];
некорректно.

Такое объявление может компилироваться только для языка С, если компилятор поддерживает стандарт С99.
1
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 20
23.11.2011, 01:06  [ТС]
Ошибки те же, такой вариант не подходит.((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Cindex::merge(Ckey *A[], int l, int m, int r)
{
    int i, j;
    const int p_r(r);
    Ckey *Ax[p_r];
    for(i = m+1; i > l; i--) *Ax[i-1] = *A[i-1];
    for(j = m; j < r; j++) *Ax[r+m-j] = *A[j+1];
    for(int k(l); k <= r; k++)
        if(Ax[j]->Getoffset() < Ax[i]->Getoffset())
            *A[k] = *Ax[j--];
        else
            *A[k] = *Ax[i++];
}
0
Заблокирован
23.11.2011, 01:09
al-tracer-93,

Вы, вообще-то, читаете, что вам другие пишут?!!! Или вы тихо сами с собой общаетесь?!!! Я вам уже сказал, что размерность массива должна быть задана с помощью константного выражения, известного на этапе уомпиляции программы!
0
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 20
23.11.2011, 01:15  [ТС]
Но мне нужно объявить массив такого же размера, что и передаваемый в функцию.
0
Заблокирован
23.11.2011, 01:17
Цитата Сообщение от al-tracer-93 Посмотреть сообщение
Но мне нужно объявить массив такого же размера, что и передаваемый в функцию.
В С++ это невозможно сделать. Но можно выделить память из кучи под массив с помощью оператора new

Вы лучше расскажите, что вам надо сделать в этой функции?
0
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 20
23.11.2011, 01:30  [ТС]
Я пытаюсь реализовать функцию сортировки слиянием. Собственно эта функция и есть сортировка+слияние.
0
Заблокирован
23.11.2011, 01:56
Цитата Сообщение от al-tracer-93 Посмотреть сообщение
Я пытаюсь реализовать функцию сортировки слиянием. Собственно эта функция и есть сортировка+слияние.
То есть вам надо отсортировать исходный массив. Правтильно? Причем массив указателей (так у вас задано в объявлении функции). Для этого вам нужен временный массив, равный по размерности исходному массиву. Так?
Ну тогда создавайте временный массив с помощью оператора new [], а при выходе из функции удалйте его с помощью оператора delete []
1
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 20
23.11.2011, 02:10  [ТС]
Спасибо. Ошибки исправил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Cindex::merge(Ckey *A[], int l, int m, int r)
{
    int i, j;
    const int p_r(r);
    Ckey *Ax = new Ckey[p_r];
    for(i = m+1; i > l; i--) *(Ax +(i-1)) = *A[i-1];
    for(j = m; j < r; j++) *(Ax+(r+m-j)) = *A[j+1];
    for(int k(l); k <= r; k++)
        if((Ax+j)->Getoffset() < (Ax+i)->Getoffset())
            *A[k] = *(Ax+j--);
        else
            *A[k] = *(Ax+i++);
}
0
Заблокирован
23.11.2011, 02:30
al-tracer-93,

Вы только забыли в конце функции вызвать оператор delete[]. В противном случае без этого оператора у вас будет постоянно происходить утечка памяти при многократных вызовах функции.
0
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 20
23.11.2011, 02:42  [ТС]
Благодарю. Не предусмотрел.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Cindex::merge(Ckey *A[], int l, int m, int r)
{
    int i, j;
    const int p_r(r);
    Ckey *Ax = new Ckey[p_r];
    for(i = m+1; i > l; i--) *(Ax +(i-1)) = *A[i-1];
    for(j = m; j < r; j++) *(Ax+(r+m-j)) = *A[j+1];
    for(int k(l); k <= r; k++)
        if((Ax+j)->Getoffset() < (Ax+i)->Getoffset())
            *A[k] = *(Ax+j--);
        else
            *A[k] = *(Ax+i++);
    delete []Ax;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2011, 02:42
Помогаю со студенческими работами здесь

Объявить массив указателей на функции-члены
Надо объявить массив theArray из 10 указателей на функции-члены класса Car, получающие параметр типа int и возвращающие значения типа long....

Как объявить массив из 5 указателей на массив из 5 int-ов?
Здравствуйте Если, int m массив из 5 int int *m массив из 5 указателей на int int (*m) указатель на массив из 5 int То...

Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти
Я создал классы: ПЕРСОНА, служащий, роботодатель, инженер. Но мне нужно в программе (после int main() 69 строка) объявить массив...

Не могу объявить массив внутри main - ошибка при линковке
Доброго времени суток! Я начинающий в С++. Использую gcc в Ubuntu 13.04 x64 bit. Прохожу сейчас массивы. Заметил одну странность....

Массив указателей не могу понять ошибку
Массив указателей не могу понять ошибку почему нельзя так присвоить значение:c-&gt;data=d;?Объясните пожалуйста! Вот сам код программы: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru