LINUX.ORG.RU

Пост инициализация массива


0

1

Есть возможность сначало создать массив int а потом задать размер?


int i[];

...

i = int[n];

...

Profit!

то что я написл не работает... но я думаю вы поймете что я хочу зделать без астрала.

Или всетаки vector?


int *a = (int*) malloc (n * sizeof(int))
fads ★★
()
Ответ на: комментарий от Andaril

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

arsi ★★★★★
()

нет, нельзя, потому что при создании массива надо выделить под него память (логично ведь?), представьте что Вы компилятор - сколько памяти Вы выделите вот здесь:

int i[];

P.S. почитайте хотя бы Кернигана и Ритчи для начала, а то вопросы у Вас мягко говоря, нубские

shty ★★★★★
()
Ответ на: комментарий от Andaril

Прочитал... Короче код будет понятней есля я воспользуюсь вектором...

код будет с большей вероятностью рабочим, но с такими познаниями трудно Вам будет с С++ дело иметь

shty ★★★★★
()
Ответ на: комментарий от Andaril

Кернигана и Ритчи это разве не C?

да, и это как раз то на чём Вы споткнулись :)

//it's ok to be a newfag :) удачи!

shty ★★★★★
()
Ответ на: комментарий от Andaril

Вообще между вектором и масивом есть какая нибудь видимая разница с точки зрения скорости и памяти.

Andaril
() автор топика

ну тогда можно и

vector<int> myArray;

...

myArray = vector<int> [n];

...

но опятьже мне просто не хотелось использовать вектор... Ибо даже в v.size() нету необходимости.

Andaril
() автор топика
Ответ на: комментарий от arsi
muspellsson[~]$ cat test.c
#include <stdio.h>

int main()
{
    int n;
    scanf("%i", &n);
    int i[n];
    printf("%i\n", i[0]);
}

muspellsson[~]$ gcc -c test.c -std=c89 -Wall
test.c: В функции ‘main’:
test.c:9:1: предупреждение: control reaches end of non-void function [-Wreturn-type]
muspellsson[~]$ gcc -c test.c -std=c99 -Wall
muspellsson[~]$ /opt/tcc/bin/tcc -c test.c
test.c:7: constant expression expected
muspellsson[~]$ /opt/pcc-1.0.0/bin/pcc -c test.c -Wall
muspellsson[~]$

Только tcc выругался и не создал объектного файла. Старые версии PCC тоже так делали. Ну и еще старый добрый Watcom ругается очень сильно

muspellsson[~]$ wcc test.c
Open Watcom C16 Optimizing Compiler Version 1.9
Portions Copyright (c) 1984-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
test.c(7): Error! E1077: Missing '}'
test.c(7): Warning! W107: Missing return value for function 'main'
test.c(7): Error! E1011: Symbol 'n' has not been declared
test.c(7): Error! E1054: Expression must be constant
test.c(8): Error! E1009: Expecting ')' but found '%i\n'
test.c(8): Error! E1026: Invalid declarator
test.c(8): Error! E1009: Expecting ',' but found '%i\n'
test.c(8): Error! E1026: Invalid declarator
test.c(8): Error! E1020: Dimension cannot be 0 or negative
test.c(8): Error! E1024: Declared symbol 'i' is not in parameter list
test.c(8): Error! E1009: Expecting ',' but found ')'
test.c(8): Error! E1026: Invalid declarator
test.c(9): Error! E1026: Invalid declarator
test.c(9): Error! E1009: Expecting ',' but found '}'
test.c(10): Error! E1026: Invalid declarator
test.c(10): Error! E1171: Expecting '{' but found end of file
test.c: 9 lines, included 771, 1 warnings, 15 errors

Ему, в частности, не нравится то, что объявление данных идет в середине кода.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

int n;

scanf(«%s», &n);

омг. ты пробовал это запускать? Это раз.
твой массив всё равно в стеке будет, а стек он, понимаешь, не резиновый. Это два.
Можешь ещё man alloc почитать. Там ещё много чего интерестного написано.

nanoo_linux
()
Ответ на: комментарий от buddhist

конпелять научись уже наконец…

$ cat >test.c
#include <stdio.h>

int main()
{
    int n;
    scanf("%i", &n);
    int i[n];
    printf("%i\n", i[0]);
}
^D
$ gcc -ansi -pedantic -Wall test.c 
test.c: В функции ‘main’:
test.c:7:5: предупреждение: ISO C90 forbids variable length array ‘i’
test.c:7:5: предупреждение: ISO C90 forbids mixed declarations and code
test.c:9:1: предупреждение: control reaches end of non-void function
$ _
arsi ★★★★★
()
Ответ на: комментарий от arsi

> грязный хак?

гугли «ISO/IEC 9899:1999».

Мне кажется (я не уверен), что даже в C99 этого нельзя делать. А можно лишь так:

void fun(int size)
{
    int arr[size];
    // ...
}
Nightmare
()
Ответ на: комментарий от nanoo_linux

Я перепутал s и i, привычка с принта питоновского) Да, будет в стеке. Но такая конструкция очень небезопасна, и компилятор должен хотя бы предупреждать о ней.

buddhist ★★★★★
()
Ответ на: комментарий от Nightmare

> Мне кажется…

всё верно, тебе кажется.

arsi ★★★★★
()
Ответ на: комментарий от Andaril

vector<int> [n];

Это бредовня, массив векторов. Основы языка нужно знать anyway.

http://www.cplusplus.com/reference/stl/vector/

Размер вектора меняется через .resize()

Вообще между вектором и масивом есть какая нибудь видимая разница с точки зрения скорости и памяти.

Для данного случая (и 99.99% оставшихся) - нет никакой разницы. Зато не надо иметь дело с указателями и ручным выделением/освобождением памяти. Use vector.

ratatosk
()
Ответ на: комментарий от Andaril

> Вообще между вектором и масивом есть какая нибудь видимая разница с точки зрения скорости и памяти.

В качестве упражнения рекомендую написать свою реализацию класса vector.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Begemoth

если он не будет уметь профессионально жонглировать с указателями и с голыми массивами то это не насильник имхо советовать ТС'у юзать vector бред ему сейчас надо учить все с нуля выучить все идеально подбить опыта года два а потом только можно юзать всякие прелести из stl ну начнет он сейчас с stl и останется быдлокодером даже через год

anonymous
()
Ответ на: комментарий от anonymous

смещно человек юзающий vector но не знающий основ таких учителей кто такому учит предать анафеме надо загонять неофита до усмерти голыми указателями и массивами и только потом дать попробовать stl годика через два когда набъет шишек станет опытным более менее а не сразу нва тебе vector оставайся быдлокодером потому что указатели опасны и голые массивы не тру

anonymous
()
Ответ на: комментарий от anonymous

вообще забудь про C++ пиши на чистом C года 2 потом переходи на C++ попутно изучай как конструкции Си отображаются на ассемблер трудно сложно идти таким путем согласен зато потом как рыба в воде будеш

anonymous
()
Ответ на: комментарий от anonymous

http://drdobbs.com/blogs/cpp/229401975 Вот тут авторитетный господин в нескольких статьях изливает свое негодование по поводу того, что С++ преподают новичкам начиная среди прочего с массивов. Я с ним согласен. Да, профессиональному программисту это знать надо, т.к. это может встретиться в чьем-то коде, либо в каком-то API. Но в собственном коде я не нахожу никакого применения массивам. Уж если сильно жаба из-за нескольких байт задушит, возьму вместо вектора Boost.Array, да и то вряд ли.

ratatosk
()
Ответ на: комментарий от DELIRIUM

Тогда для начала...



template <class T> {
private:
int Num; // size()
struct  Block{
T a;
Block *link;
};
public:

//И тут надо будет дергать link под всяческим уголом

}

Или его надо делать с массивом? Но тогда если инсерт делать то получится полная фигня...

Andaril
() автор топика
Ответ на: комментарий от ratatosk

Вот тут авторитетный господин в нескольких статьях изливает свое негодование по поводу того, что С++ преподают новичкам начиная среди прочего с массивов. Я с ним согласен. Да, профессиональному программисту это знать надо, т.к. это может встретиться в чьем-то коде, либо в каком-то API. Но в собственном коде я не нахожу никакого применения массивам.

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

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

shty ★★★★★
()
Ответ на: комментарий от shty

+1.

Забавно, после ЯП наиболее популярная тема для срача на ЛОРе - методики изучения ЯП;-)

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

stl, boost, голые пойнтеры... «у каждого додика своя методика», но представлять (хотя бы в общих чертах) возможности ЯП необходимо.

AIv ★★★★★
()
Ответ на: комментарий от ratatosk

Но в собственном коде я не нахожу никакого применения массивам.

LOL. Что ты там такое экзотическое пишешь?

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.