массивы с переменной длиной (у меня их на моём компиляторе bash нет. К сожалению.)

Модератор: Модераторы разделов

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

массивы с переменной длиной

Сообщение promov »

А определил я это так. Вот эта программа не работает:
______________________________________________________________________________
#include <stdio.h>
int main (){
int b;
int a [b];
a[3]= 2;
return 0;
}
______________________________________________________________________

Я раньше выходил как-то из положения. Объявлял массив большшой длины, к примеру, 100. И следи за тем, чтобы он не переполнялся. Но это же не дело правда? Надо ведь в ногу со временем идти...
Хуже будет, необходимый компилятор называется gcc. Он у меня, судя по тому, что выдаёт машина в ответ на команду man gcc просто отсутствует...
У меня и ещё вопросы есть, но наглеть пока не буду.
Буду благодарен за советы.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: массивы с переменной длиной

Сообщение sergio »

promov писал(а):
03.10.2007 09:34
А определил я это так. Вот эта программа не работает:

Код: Выделить всё

#include <stdio.h>
int main (){
 int b;
 int a [b];
 a[3]= 2;
 return 0;
}

Я раньше выходил как-то из положения. Объявлял массив большшой длины, к примеру, 100. И следи за тем, чтобы он не переполнялся. Но это же не дело правда? Надо ведь в ногу со временем идти...


В классическом си размер массива на стэке должен быть известен во время компиляции. Поэтому его размер можно задать только константой. В современно - нет. Но имеем в виду.

Хуже будет, необходимый компилятор называется gcc. Он у меня, судя по тому, что выдаёт машина в ответ на команду man gcc просто отсутствует...
У меня и ещё вопросы есть, но наглеть пока не буду.
Буду благодарен за советы.


Учимся внятно писать, что мы делаем, и цитировать, что именно сказал компилятор (терминал, менеджер пакетов и другие).
Я так тоже могу сказать, что г-н promov всех линуксоидов вроде бы козлами назвал. И что? :happy:


2 All:
Кто мне объяснит, почему вышеприведенный код компилируется без ворнингов??????????????
Что комплируется массив переменный - наверное понятно, там по дефолту все гну-экстенжены разрешены, вопрос - почему без ворнингов? использование неинициализированной переменной???

Код: Выделить всё

$ gcc -std=c99 -Wall ___arr.c
$
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 512
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: массивы с переменной длиной

Сообщение Red Gremlin »

Код:

#include <stdio.h> #include <stdlib.h> int main() { int *a; a=malloc(4*sizeof(int)); // создаем массив: 4 - кол-во элементов массива, // у первого элемента индекс 0, у последнего 3. a[3] = 2; printf("%d\n", a[3]); free(a); // удаляем массив return 0; }
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: массивы с переменной длиной

Сообщение promov »

Объясню я, когда изучу ворнинги.

Вот это машина выдаёт в ответ на команду man gcc:
Нет записи руководства для gcc
Смотрите 'man 7 undocumented' в помощи, если недоступны страницы руководства.

А по запуску вышеупомянутой программы выдаёт:
Segmentation fault

P.S. Почему у всех коды как коды а у меня чушь какая-то? (И меется ввиду оформление?)
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: массивы с переменной длиной

Сообщение sergio »

promov писал(а):
03.10.2007 10:21
Объясню я, когда изучу ворнинги.

Вот это машина выдаёт в ответ на команду man gcc:
Нет записи руководства для gcc
Смотрите 'man 7 undocumented' в помощи, если недоступны страницы руководства.

А по запуску вышеупомянутой программы выдаёт:
Segmentation fault

P.S. Почему у всех коды как коды а у меня чушь какая-то? (И меется ввиду оформление?)

Но сам-то GCC вызывается?
А руководство для него
а) в инфо
б) хтмлевое в доках, или его отдельно надо поставить, не помню. Да, отдельно. -док пакет.

Естественно выдает. :)
(вам повезло; мог и не выдать :) )

Потому что правую иконку "Код" надо нажать, выделив предварительно текст прогрраммного кода...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: массивы с переменной длиной

Сообщение promov »

Как вызывается? Командой gcc в терминале? Конечно, нет. Выдаётся
gcc: no input files
В man info нет даже аббревиатуры gcc. Извините...

У меня, как и у Вас Debian GNU/Linux. Вы:

1) Пользуетесь компилятором "не bash", поддерживающим использхование массивов с переменной длиной и у Вас его и значально не было, (как и у меня), а нашли Вы его, конечно, в Google (который рулит), чего и мне желаете.

2) Не используете в работе массивы с переменной длиной.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 512
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: массивы с переменной длиной

Сообщение Red Gremlin »

Код: Выделить всё

#gcc test.c -o test
#./test
2
#
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: массивы с переменной длиной

Сообщение sergio »

promov писал(а):
03.10.2007 10:58
Как вызывается? Командой gcc в терминале? Конечно, нет. Выдаётся
gcc: no input files
В man info нет даже аббревиатуры gcc. Извините...

У меня, как и у Вас Debian GNU/Linux. Вы:

1) Пользуетесь компилятором "не bash", поддерживающим использхование массивов с переменной длиной и у Вас его и значально не было, (как и у меня), а нашли Вы его, конечно, в Google (который рулит), чего и мне желаете.

2) Не используете в работе массивы с переменной длиной.


O my God!... (терпение, Шарапов, терпение, это конфа для начинающих...)
Причем тут компилятор баш??? Си компилуется компилятором Си. GCC - это компилятор си.
В man info написано, как пользоваться инфо. Вы ее запустили, но прочитать не удосужились.
В info info тоже это написано.
В info gcc написано, как пользоваться gcc.
ХТМЛевая документация не ставится, потому что на дебиане что-то напедрили с пакетами, но она доступна на http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/

При запуске gcc вам русским т.е. английским языком сообщил, что он запустился, но вы ему нихрена не сказали, что от него хотите, и файлов для компиляции не указали.

Разумеется, для компиляции си я пользуюсь "компилятором "не баш"", а конкретно - gcc или g++.
И разумеется, ваш чудный код чудно компилируется, если в нем исправить ошибку и скомпилить как надо. Именно с массивом переменной длинны и компилируется.
В работе я массивы с переменной длинной не использую, потому как в си+ есть вектор, а массивы с переменной длинной формально в стандарте 98 их не было, как щас там думают комитетчики не в курсе, хотя GCC их поддерживает и там как экстенжн.

Поскольку вы рассказали много всего, включая чем я пользуюсь для компиляции и где это взял, но так и не спросили, что в вашем коде неправильно, то подсказываю: какого (переменно или непеременного) размера массив вы создаете?
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: массивы с переменной длиной

Сообщение promov »

Я внимательно всё прочитал. Cкажите пожалуйста, у нас ведь с Вами одинаковые дистрибутивы- я каким компилятором пользуюсь по умолчанию? Я правда не знаю. Мне OC поставили, книжку сунули по С и сказали: изучай. Вот споткнулся на массивах переменной длины.( gcc у меня нигде не упоминается, зато bash сплошь и рядом.)

А насчёт моего кода- неправда Ваша. Не работает также программа с массивом переменной длины но не моя доморощенная, а взятая из книги- та то должна работать, поскольку написана, как Вы сами понимаете без сучка, без задоринки. Вот она
_____________________________________________________________________________
#include <stdio.h>
int main (){
int b;
int a [b];
a [0]= 0;
return 0;
}
______________________________________________________________________
Она конечно, сложнее, там ряд чисел Фибонанчи выводится, но я всю её не стал копировать. И она не работает тоже! Я делаю вывод- мой компилятор не поддерживает возможность работы с массивами неопределённых размеров. А Вы бы на моём месте какой вывод сделали?

Cтоп!
____________________________________________________________________
#include <stdio.h>
int main (){
int b;
b= 3;
int a [b];
a [0]= 0;
return 0;
}______________________________________________________]

Там вот так. Размер массива объявлен (переменная b), а потом сам массив. Это у меня ошибка?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 512
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: массивы с переменной длиной

Сообщение Red Gremlin »

Может попробуете

Код: Выделить всё

int b;
b=4;
int a[b];

вместо того, что бы ругаться с теми кто пытается вам помочь?

Добавлено: обращаем внимание на вторую строчку кода.
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: массивы с переменной длиной

Сообщение sergio »

promov писал(а):
03.10.2007 12:47
А насчёт моего кода- неправда Ваша. Не работает также программа с массивом переменной длины но не моя доморощенная, а взятая из книги- та то должна работать, поскольку написана, как Вы сами понимаете без сучка, без задоринки. Вот она
Она конечно, сложнее, там ряд чисел Фибонанчи выводится, но я всю её не стал копировать. И она не работает тоже! Я делаю вывод- мой компилятор не поддерживает возможность работы с массивами неопределённых размеров. А Вы бы на моём месте какой вывод сделали?

Что вы недоскопировали что-то важное. Скажете, нет?

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char* argv []){
 const int b = atoi(argv [1]);
 int a [b];
 for (int i = 0;  b != i;  ++ i)  a[i]= 2 * i;
 for (int i = 0;  b != i;  ++ i)  printf("%d ", a [i]);
 return 0;
}


Компиляция и запуск:

Код: Выделить всё

$ gcc -std=c99 ___arr.c
$ ./a.out 200
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: массивы с переменной длиной

Сообщение promov »

Парни, я под столом, всем спасибо. Мне и в голову не могло прийти, что в массивах с переменной длиной длина должна быть объявлена заранее!!!!!!!!!! Так получается у них не переменная длина, а, как ни крути, фиксированная! Переменная, я так понимаю, вообще её не объявляешь, а по ходу программы сколько забил туда элементов, cтолько и забил... А тут вон оно как...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
sergeyvp
Сообщения: 807
ОС: ubuntu

Re: массивы с переменной длиной

Сообщение sergeyvp »

promov писал(а):
03.10.2007 13:03
Парни, я под столом, всем спасибо. Мне и в голову не могло прийти, что в массивах с переменной длиной длина должна быть объявлена заранее!!!!!!!!!! Так получается у них не переменная длина, а, как ни крути, фиксированная! Переменная, я так понимаю, вообще её не объявляешь, а по ходу программы сколько забил туда элементов, cтолько и забил... А тут вон оно как...

Если вам нужны массивы неопределённой длины в Си, читайте GLib API
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: массивы с переменной длиной

Сообщение sergio »

promov писал(а):
03.10.2007 13:03
Парни, я под столом, всем спасибо. Мне и в голову не могло прийти, что в массивах с переменной длиной длина должна быть объявлена заранее!!!!!!!!!! Так получается у них не переменная длина, а, как ни крути, фиксированная! Переменная, я так понимаю, вообще её не объявляешь, а по ходу программы сколько забил туда элементов, cтолько и забил... А тут вон оно как...

Еще какая переменная - см. мой код. Какую зададите аргументом при вызове, такая и будет. Только для этих целей лучше хип, а не стек. Если вы в аргументе зададите 2100000 - то все равно свалитесь. У массивов с переменным размером на стеке - на самом деле очень узкая область применения, на практике...
Массивы с переменной длинной создаются на хип (см. выше ответ Red Gremlin) и перераспределяются руками (см. realloc) когда надо.

Переменная, я так понимаю, вообще её не объявляешь, а по ходу программы сколько забил туда элементов, cтолько и забил... А тут вон оно как...

В си++ легко сделать и такое. Только такое именно в виде массива - мало полезно. Поскольку страдает очень низкой производительностью из-за автоматических перераспределений (и даже в виде deque - пониженной против массива с предопределенным размером) и ошибки с обращениями могут остаться незамеченными, и вообще провоцирует неаккуратную работу. =)
Подобное реализуется в виде map (dictionary или хэш в других языках) и hash_map. Это не массив, а немножко другое, но можно на нем сэмитировать и массив - именно "сколько вставил, столько и есть".
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: массивы с переменной длиной

Сообщение promov »

Снова рад Вас видеть. Да мне далеко ещё до всех этих хипов, стеков... А решение придуманной мной задачи я, кстати, представил.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: массивы с переменной длиной

Сообщение sergio »

promov писал(а):
03.10.2007 13:28
Снова рад Вас видеть. Да мне далеко ещё до всех этих хипов, стеков... А решение придуманной мной задачи я, кстати, представил.

Добавил к предыдущему ответу.
Да, я видел, работает. Вечером изучу.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: массивы с переменной длиной

Сообщение promov »

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

Код: Выделить всё

#include <stdio.h>
int main (){
 int b;
 b= 3;
 int a [b];
 return 0;
}


когда объявление массива с переменной длиной таковым можно назвать с большой натяжкой (переменной b значение присваивается до объявления массива), а в этом

Код: Выделить всё

#include <stdio.h>
int main (){
 int b;
 printf ("Вводи количество чисел, с которыми ты будешь работать\n");
 scanf ("%i", &b);
 int a [b];
 return 0;
}

Действительно, вводим число (с монитора? с консоли?) и тем самым формируем длину массива. Единственное "но"- хромает стиль, я бы сказал, программирования. Ведь согласно хорошему стилю необходимо объявления все делать в начале программы- и никак уж не после вызова функции scanf.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: массивы с переменной длиной

Сообщение Liksys »

Это тоже кастыль, в этом случае правильно использовать динамически распределяемую память. Я вообще не припомню, когда мне приходилось использовать массивы переменной длины, везде либо malloc() либо фиксированные через макросы.
Спасибо сказали:
pktfag
Сообщения: 142
ОС: Arch Linux

Re: массивы с переменной длиной

Сообщение pktfag »

promov писал(а):
03.10.2007 23:12

Код: Выделить всё

#include <stdio.h>
int main (){
 int b;
 printf ("Вводи количество чисел, с которыми ты будешь работать\n");
 scanf ("%i", &b);
 int a [b];
 return 0;
}

Я сомневаюсь, что так можно делать. (Что-то тут не то, не знаю что, вероятно, из-за того, что я пишу в слишком позднее время :)).
А вот так точно можно:

Код: Выделить всё

#include <stdio.h>

int main ()
{
    int *a = NULL;
    int b, i;

    printf ("Вводи количество чисел, с которыми ты будешь работать\n");
    scanf ("%i", &b);
    a = (int*) realloc (a, b * sizeof (int));
    for (i = 0; i < b; i++)
        a[i] = i;
    for (i = 0; i < b; i++)
        printf ("%i ", a[i]);
    printf ("\n");

    printf ("Вводи количество чисел, с которыми ты будешь работать\n");
    scanf ("%i", &b);
    a = (int*) realloc (a, b * sizeof (int));
    for (i = 0; i < b; i++)
        a[i] = i;
    for (i = 0; i < b; i++)
        printf ("%i ", a[i]);
    printf ("\n");

    free (a);
    return 0;
}
Спасибо сказали: