Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Массивы переменной длины в С  (Прочитано 12182 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« : 01-05-2008 18:24 » 

Просветите пожалуйста, начинающего програмера. На данный момент делаю программу перемножения двух матриц, и потребовалось использование массива переменной длины (в С99 он описан) так блин компилятор ругается и не хочет его воспринимать ну никак.
Может что ни так пишу? Здесь написана только функция ввода-вывода массива.
Код:
#include<stdio.h>
void main()
{
 int i,j,r,c;
 printf("Введите количество строк\n");
 scanf("%i",&r);
 printf("\nВведите количество столбцов\n");
 scanf("%i",&c);
 int a[r] [c];
/* int i,j;*/
 printf("\nВведите массив\n");
 printf("после ввода элементов каждой строки,");
 printf("\n%iцелых чисел нажмите ВВОД\n",c);
 for (i=0;i<r;i++)
  {
   printf("->");
   for(j=0;j<c;j++)
    scanf("%3i",&a[i] [j]);
    }
    printf("\Введенный массив\n");
     for(i=0;i<r;i++)
     {
      for(j=0;j<c;j++)
       printf("%3i",a[i][j]);
printf("\n");
}
        }
[
« Последнее редактирование: 01-05-2008 19:35 от Finch » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 01-05-2008 19:34 » 

Оборачивай код в теги [code ] [ /code].
Код:
printf("Введите количество строк\n");
 scanf("%i",&r);
 printf("\nВведите количество столбцов\n");
 scanf("%i",&c);
 int a[r] [c];
Так нельзя делать. При статическом определении массива, компилятор должен определить место под массив еше при стадии компиляции. В данном случае, он этого не может делать.
Тебе нужно определять массив динамически.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 01-05-2008 19:38 » 

Для С смотри хелп по функциям malloc и free
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-05-2008 19:53 » 

Так, про то что динамически это можно сделать это понятно, я вот просто в справочнике по С Шилда наткнулся на такую интересную функцию,как массив переменной длины, вот и решил попробывать... Не ну не может же быть чтоб там полную фигню написали.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 01-05-2008 20:00 » 

Янус, Приведи полный текст отрывка, где так сказано. Вся память при входе в функцию выделяется в стеке. Лишние движения в стеке чреваты последствиями.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 01-05-2008 20:13 » 

В С89 размер массива должен быть объявлен с помощью константных выражений...С89 устанавливает фиксированный размер массива не меняющийся в прцессе выполнения программы.Стандарт С99 позволяет использовать в объявлении массива любые выражения в том числе такие значение которых становится извесным только во время выполнения.Объявленный таким образом массив называетс ямассивом переменной длины .Однако переменную длину могут иметь только локальные массивы видимые в блоке или прототипе.
Вот, что там по этому поводу сказано, и еще в С89 и некоторых компиляторах с++ эта функция не поддерживается.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 01-05-2008 20:54 » 

Вот я переделал чуть чуть твой пример
Код:
#include<stdio.h>
int main()
{
 int i,j,r,c;
 printf("Введите количество строк\n");
 scanf("%i",&r);
 printf("\nВведите количество столбцов\n");
 scanf("%i",&c);
 {
    int a[r] [c];
    printf("\nВведите массив\n");
    printf("после ввода элементов каждой строки,");
    printf("\n%iцелых чисел нажмите ВВОД\n",c);
    for (i=0;i<r;i++)
    {
        printf("->");
        for(j=0;j<c;j++) scanf("%3i",&a[i] [j]);
    }
   
    printf("Введенный массив\n");
    for(i=0;i<r;i++)
    {
      for(j=0;j<c;j++) printf("%3i",a[i][j]);
  printf("\n");
}
  }
  return 0;
}
Я сейчас просмотрел стандарт, я так понял, что массив должен быть в более локальном блоке, чем иницилизируемые переменные. В g++ у меня откомпилировалось и запустилось Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 01-05-2008 21:05 » 

Внес изменения опять не получается...
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 01-05-2008 21:09 » 

Может от того, что у меня Borland C++ 3.1?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 01-05-2008 21:11 » 

Я не думаю, что он поддерживает стандард 99 года. Копирайт у него где то 94 года наверно. Кстати, а как это связано с ֹUnix системами?
« Последнее редактирование: 01-05-2008 21:13 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 01-05-2008 21:14 » 

Компилятор, как написал выше, а опцию, как давать ? Разве ее не подхватывает автоматически ?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 01-05-2008 21:15 » 

Я исправил свое сообшение. Прочитай его.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 01-05-2008 21:16 » 

Насчет Unix сплоховал, каюсь не в той теме разместил сообщение... А где что нибудь по свежее взять (компилятор) ?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 01-05-2008 21:49 » 

Борланд выпускает и дальше свою линию компиляторов (ֲBorland Builder), есть и у ֵMicrosoft (Microsoft Visual Studio), У Intel есть свой компилятор, Из среды GNU в виндовс портировали GCC и назвали ֵMinGW.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines