Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не создаётся массив с размером по величине, const переменной 
V
    Опции темы
KaraKum
  Дата 1.6.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Доброе время суток.
Такой код:
Код

const unsigned int count = Function();
unsigned int lettersArray[count];

Выдаются ошибки: (все ко второй строке)
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'lettersArray' : unknown size

Если вызов функции заменить на значение, то ошибка пропадает, но нужно-то присвоить значение функции.

Подскажите, пожалуйста, в чём проблема?

Это сообщение отредактировал(а) KaraKum - 1.6.2008, 08:53
PM MAIL WWW   Вверх
maxim1000
Дата 1.6.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



размер такого массива должен быть не просто константой, а константой, известной на момент компиляции
если он становится известен только в процессе работы программы, придётся использовать динамическую работу с памятью


--------------------
qqq
PM WWW   Вверх
ifndef
Дата 1.6.2008, 09:52 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 25.5.2008
Где: Россия, Москва

Репутация: нет
Всего: нет



Подкреплю ответ maxim1000 примером..  smile 
Можно сделать так:

Код

unsigned int numel;
...
numel = Function(...);

// Выделение памяти под массив
unsigned int *arr = new unsigned int [numel];
........
// работа с массивом
........
//Освобождение памяти
delete [] arr;


PM MAIL ICQ   Вверх
KaraKum
Дата 1.6.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Компилируется.
Большое спасибо  smile .

Вопрос помечен как решённый.
PM MAIL WWW   Вверх
Mayk
Дата 2.6.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Зававно, что в C99 это работает. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Alek86
Дата 2.6.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



и должно работать

ограничение-то надуманное...
думаю просто в плюсах не стали убирать, так как есть vector

Добавлено через 28 секунд
практически то-же самое, что и delete[]


--------------------
user posted image    user posted image
PM MAIL   Вверх
maxim1000
Дата 2.6.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Alek86 @  2.6.2008,  10:17 Найти цитируемый пост)
ограничение-то надуманное...

ну как сказать...
в голову приходят 2 аргумента:

1. такие массивы могут быть использованы не только в каком-то блоке кода, но и, например, в структуре, там (по крайней мере мне) не видно простого способа сделать возможным инициализацию константой, неизвестной на момент компиляции (нужно учесть, что кто-то захочет сделать из структур массив, и нужно будет знать их размер), получается нужно разделять понятие такого массива на два: те, которые используются в структурах, и в блоках кода, а понятий в C++ и так немало

2. сужается простор для оптимизации: если у нас есть массив, а за ним какая-то локальная переменная, её адрес относительно кадра стека, используемого в функции становится непостоянным и не может быть "зашит" в ассемблерный код, если таких массивов несколько, придётся вычислять несколько адресов при входе в функцию (не или при первом использовании)

Это сообщение отредактировал(а) maxim1000 - 2.6.2008, 10:35


--------------------
qqq
PM WWW   Вверх
bsa
Дата 4.6.2008, 23:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Судя по сообщениям об ошибках, это компилятор от MS. На сколько мне известно, ее компиляторы не соответствуют стандарту c99.
PM   Вверх
MAKCim
Дата 5.6.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(maxim1000 @  2.6.2008,  10:35 Найти цитируемый пост)
её адрес относительно кадра стека, используемого в функции становится непостоянным и не может быть "зашит" в ассемблерный код

может
GCC, к примеру, локальные переменные функции идентифицирует через RBP (EBP)
а формирование массива переменной длины идет через декрементацию RSP (ESP)
Код

int main() {
    int count, i;
    int array[count];
    for (i = 0; i < count; ++i) {
        int temp[i];
        count -= i;
    }
    return 0;
}

Код

main:
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $64, %rsp /* локальный стековый фрейм */
    movq    %rsp, %rax
    movq    %rax, -40(%rbp) /* сохранение текущей вершины стека (для раскрутки стека) */
    movl    -8(%rbp), %eax /* получение count */
    cltq /* расширение до 64-х разрядов (т. к int) */
    salq    $2, %rax /* count << 2 (размер массива array) */
/* выравнивание размера по 16-ти байтной границе */
    addq    $15, %rax
    addq    $15, %rax
    shrq    $4, %rax
    salq    $4, %rax
    subq    %rax, %rsp /* выделение памяти под массив array */
    movq    %rsp, -56(%rbp) /* запись адреса массива в переменную array */
    movq    -56(%rbp), %rax
/* выравнивание адреса нижней границы стека по 16-ти байтной границе */
    addq    $15, %rax
    shrq    $4, %rax
    salq    $4, %rax
    movq    %rax, -56(%rbp) /* запись выровненного адреса */
    movq    -56(%rbp), %rax
    movq    %rax, -24(%rbp) /* сохранение текущей вершины стека (для раскрутки стека) */
    movl    $0, -4(%rbp) /* i = 0 */
    jmp .L2
.L3:
    movq    %rsp, %rax
    movq    %rax, %rdx
    movl    -4(%rbp), %eax /* получение i */
    cltq /* расширение i */
/* выравнивание размера */
    salq    $2, %rax
    addq    $15, %rax
    addq    $15, %rax
    shrq    $4, %rax
    salq    $4, %rax
    subq    %rax, %rsp /* формирование массива temp */
    movq    %rsp, -48(%rbp) /* запись адреса массива в переменную temp */
/* выравнивание адреса */
    movq    -48(%rbp), %rax
    addq    $15, %rax
    shrq    $4, %rax
    salq    $4, %rax
    movq    %rax, -48(%rbp) /* запись выровненного адреса */
    movq    -48(%rbp), %rax
    movq    %rax, -16(%rbp) /* сохранение текущей вершины стека (для раскрутки стека) */
    movl    -4(%rbp), %eax /* получение i */
    subl    %eax, -8(%rbp) /* count -= i */
    movq    %rdx, %rsp /* раскрутка стека для temp */
    addl    $1, -4(%rbp) /* ++i */
.L2:
/* i < count? */
    movl    -4(%rbp), %eax
    cmpl    -8(%rbp), %eax
    jl  .L3 /* i < count */
    movl    $0, %eax
    movq    -40(%rbp), %rsp /* раскрутка стека для array */
    leave
    ret



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 5.6.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(MAKCim @  5.6.2008,  09:27 Найти цитируемый пост)
может
GCC, к примеру, локальные переменные функции идентифицирует через RBP (EBP)
а формирование массива переменной длины идет через декрементацию RSP (ESP)

ключевое слово - "массива"
но ведь локальных массивов тоже может быть несколько, как и локальных переменных
я сомневаюсь, что подобный метод может нормально масштабироваться (разве что резервируя под это всё новые и новые регистры)

или я неправильно понял смысл?

Это сообщение отредактировал(а) maxim1000 - 5.6.2008, 15:12


--------------------
qqq
PM WWW   Вверх
bsa
Дата 5.6.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



maxim1000, RSP - это указатель вершины стека. Его никто не резервирует smile
PM   Вверх
maxim1000
Дата 5.6.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(bsa @  5.6.2008,  15:46 Найти цитируемый пост)
RSP - это указатель вершины стека. Его никто не резервирует

ну хорошо, использует smile
но основная мысль была про масштабируемость
ну никак я не пойму, как можно расширить этот подход для нескольких локальных массивов


--------------------
qqq
PM WWW   Вверх
MAKCim
Дата 5.6.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(maxim1000 @  5.6.2008,  20:45 Найти цитируемый пост)
ну никак я не пойму, как можно расширить этот подход для нескольких локальных массивов 

смотри пример
там два локальных массива
с тем же успехом их может быть и 3, и 4, и 5, и...
здесь ключевой момент для понимания - это то, что переменная-массив является переменной-указателем, который содержит адрес массива в стеке

Это сообщение отредактировал(а) MAKCim - 5.6.2008, 20:53


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 6.6.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



неее, я имел в виду, что если два локальных массива в самой функции, т.е.
Код

int main()
{
    int count;
    int array1[count];
    int array2[count];
    ...
}

здесь по-любому придётся вычислять адрес как минимум одного массива, а не вшивать сразу в ассемблерный код


--------------------
qqq
PM WWW   Вверх
MAKCim
Дата 6.6.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(maxim1000 @  6.6.2008,  17:16 Найти цитируемый пост)
здесь по-любому придётся вычислять адрес как минимум одного массива, а не вшивать сразу в ассемблерный код 

а как ты предлагаешь "вшивать" адрес чего-либо в стеке?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 6.6.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



честно говоря, последний процессор, на котором я плотно работал с ассемблером, был не совсем стандартный, но смысл такой:
есть команда (приблизительно) rx0=[sp+<константа>], при чём константа должна быть известна на этапе сборки перевода в машинные коды

даже если такой команды нет, то наверняка можно писать так:
a=sp
a+=<константа>
b=[a]

ключевой момент - должен быть такой адрес в стеке, относительно которого можно уже на этапе компиляции сказать адреса всех локальных переменных, тогда есть блок кода для определения адреса, количество команд которого не зависит от количества и типа локальных переменных, и, подозреваю, во всех современных процессорах сейчас это можно делать одной командой

если у нас есть локальный массив переменной длины, то его начало относительно вершины стека компилятору уже неизвестно, да, можно выкрутиться, используя указатель на фрейм стека (не уверен в терминологии) - т.е. в стеке есть две точки, относительно одной из них начало массива имеет константный адрес, поэтому всё ещё хорошо

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

дальше для обеспечения быстрого доступа ко второму массиву и переменным между этими массивами уже придётся либо записывать его адрес в какой-то регистр, либо сохранять его в памяти
первый вариант просто ужасен: регистры, если я не ошибаюсь, - дефицит, когда дело доходит до оптимизации
второй вариант - добавление уровня косвенности - тоже не очень хорошо, особенно, если среди таких переменных окажется несколько важных

ну а с ростом количества локальных массивов всё будет только ухудшаться - ведь начала их адресов нужно посчитать при входе в функцию

-------

некоторое пояснение:

я совсем не против такой возможности, более того - она, скорее всего, будет использована для замены динамической памяти, в которой затраты времени значительно больше всех вышеописанных, так что в этом смысле это - полжительное улучшение

просто, как мне кажется, не очень хорошо делать их расширением старых добрых массивов с длиной, известной на этапе компиляии, - две вещи, которые беглым взглядом не всегда отличишь, имеют довольно-таки серьёзное отличие

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

фууух... длинненько вышло smile

Это сообщение отредактировал(а) maxim1000 - 6.6.2008, 20:46


--------------------
qqq
PM WWW   Вверх
MAKCim
Дата 6.6.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



maxim1000
так, объясняю упрощенно  smile 

есть код
Код

int main() {
    int i, j, k, q;
    int a[i];
    int b[j];
    int c[k];
    int d[q];
    return 0;
}

для реализации массивов переменной длины a, b, c, d представляют собой не массивы, а переменные-указатели, содержащие адреса массивов в стеке
i, j, k, q обычные целочисленные переменные
итого у нас есть 8 локальных переменных в main() общим размером 4 * sizeof(void*) + 4 * sizeof(int) = 32 + 16 = 48 (на 64-х разрядной системе)
для каждого блока кода (между { и }) в рамках функции, в котором определен массив переменной длины необходимо сохранять адрес текущей вершины стека (для раскрутки стека при выходе из блока)
в данном примере блок один, поэтому необходима еще одна локальная переменная-указатель t
48 + 8 = 56

Код

main:
    push rbp
    mov rbp, rsp
    sub rsp, 56 ; формируем стековый фрейм для локальных переменных (&i = [rbp - 4], &j = [rbp - 8], &k = [rbp - 12], &q = [rbp - 16], &a = [rbp - 24], &b = [rbp - 32], &c = [rbp - 40], &d = [rbp - 48], &t = [rbp - 56])
    mov qword [rbp - 56], rsp ; сохраняем адрес для раскрутки стека
    mov eax, dword [rbp - 4] ; получаем i
    shl eax, 2 ; i *= sizeof(int)
    sub rsp, rax ; массив a
    mov qword [rbp - 24], rsp ; адрес массива a
    
    mov eax, dword [rbp - 8] ; получаем j
    shl eax, 2 ; j *= sizeof(int)
    sub rsp, rax ; массив b
    mov qword [rbp - 32], rsp ; адрес массива b

    mov eax, dword [rbp - 12] ; получаем k
    shl eax, 2 ; k *= sizeof(int)
    sub rsp, rax ; массив c
    mov qword [rbp - 40], rsp ; адрес массива c

    mov eax, dword [rbp - 4] ; получаем q
    shl eax, 2 ; q *= sizeof(int)
    sub rsp, rax ; массив d
    mov qword [rbp - 48], rsp ; адрес массива d

    mov rsp, qword [rbp - 56] ; рвскрутка стека
    leave
    xor eax, eax
    ret


Добавлено через 12 минут и 58 секунд
Цитата(maxim1000 @  6.6.2008,  20:45 Найти цитируемый пост)
имеют довольно-таки серьёзное отличие

отличие только в том, что требуется дополнительное обращение к памяти за адресом массива
а т. к стек в рамках функции используется крайне часто и много, то он с большой вероятностью будет находится в строках кэша
т. е итоговое снижение производительности в среднем будет составлять 1 такт на одно обращение к массиву
это очень мало


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 6.6.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



ох, как знал, как знал smile
сначала писал про два массива потом сделал приписку:

Цитата(maxim1000 @  6.6.2008,  20:45 Найти цитируемый пост)
дальше для обеспечения быстрого доступа ко второму массиву и переменным между этими массивами уже придётся либо записывать его адрес в какой-то регистр, либо сохранять его в памяти

может получиться такая ситуация:
Код

int n,m;
int a[n];
{
    int i,j,k;
    ...
    {
        int b[m];
        ...
    }
}

так вот указателями станут не только a и b, но и, как это ни печально, i,j,k
причём самое плохое, что усложнение доступа к i произошло из-за свойств других переменных - неочевидность удваивается


--------------------
qqq
PM WWW   Вверх
MAKCim
Дата 6.6.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(maxim1000 @  6.6.2008,  22:03 Найти цитируемый пост)
так вот указателями станут не только a и b, но и, как это ни печально, i,j,k

нет
все локальные переменные размещаются в созданном при входе в функцию стековом фрейме  smile 
т. е в данном случае a, b, n, m, i, j, k размещаются последовательно от [rsp] до [rbp] после декрементации rsp на 36

Это сообщение отредактировал(а) MAKCim - 6.6.2008, 22:19


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 6.6.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



ннда... про перемещение места под локальные переменные внутренних блоков наверх как-то не подумал
тогда, похоже, остаётся один аргумент про различия в использовании smile
(невозможность использовать в структурах, sizeof)
так что всё равно мне кажется, что стоит это как-то по-другому было бы назвать, ввести какое-то визуальное отличие, а не одинаковую запись

P.S.
подумал про дополнительный такт при доступе к массивам: похоже и его не будет, ведь чаще всего к ним будут обращаться, итерируя указатели, а значит, дополнительная операция будет только при их инициализации, а значит, неважно...


--------------------
qqq
PM WWW   Вверх
bsa
Дата 6.6.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



maxim1000, с sizeof проблем тоже быть не должно. А вот в структурах использовать нельзя это точно.
PM   Вверх
maxim1000
Дата 7.6.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(bsa @  6.6.2008,  23:56 Найти цитируемый пост)
с sizeof проблем тоже быть не должно

ох... а тут как?
ведь sizeof люди привыкли передавать, куда угодно
например, в качестве аргументов шаблонов


--------------------
qqq
PM WWW   Вверх
JackYF
Дата 7.6.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(maxim1000 @  6.6.2008,  23:07 Найти цитируемый пост)
например, в качестве аргументов шаблонов 

можно пример, где ты это видел? возможно всё, но я как-то не припомню...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 7.6.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  6.6.2008,  23:56 Найти цитируемый пост)
с sizeof проблем тоже быть не должно

семантика sizeof нарушается


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
maxim1000
Дата 7.6.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(JackYF @  7.6.2008,  01:40 Найти цитируемый пост)
можно пример, где ты это видел? возможно всё, но я как-то не припомню...

не, я такого не видел, но учитывая, какие вещи делают на C++, сильно сомневаюсь, что такого ни у кого нету

честно говоря, про sizeof сейчас в голову не приходит, но вот про сам тип такой конструкции вспомнилось, как шаблонами определяли длину массива
так вот там использовалось, что массив из 10-ти int-ов имеет тип int[10], а не просто указатель, и этим пользовались при определении размера



--------------------
qqq
PM WWW   Вверх
JackYF
Дата 7.6.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(maxim1000 @  7.6.2008,  09:38 Найти цитируемый пост)
и этим пользовались при определении размера

Да, но этим можно пользоваться при массивах константной длины. Конечно, руки всем не открутишь - найдутся те, которые обязательно сделают не так smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1122 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.