Янус
|
|
« : 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
Спокойный
Администратор
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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #2 : 01-05-2008 19:38 » |
|
Для С смотри хелп по функциям malloc и free
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Янус
|
|
« Ответ #3 : 01-05-2008 19:53 » |
|
Так, про то что динамически это можно сделать это понятно, я вот просто в справочнике по С Шилда наткнулся на такую интересную функцию,как массив переменной длины, вот и решил попробывать... Не ну не может же быть чтоб там полную фигню написали.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 01-05-2008 20:00 » |
|
Янус, Приведи полный текст отрывка, где так сказано. Вся память при входе в функцию выделяется в стеке. Лишние движения в стеке чреваты последствиями.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Янус
|
|
« Ответ #5 : 01-05-2008 20:13 » |
|
В С89 размер массива должен быть объявлен с помощью константных выражений...С89 устанавливает фиксированный размер массива не меняющийся в прцессе выполнения программы.Стандарт С99 позволяет использовать в объявлении массива любые выражения в том числе такие значение которых становится извесным только во время выполнения.Объявленный таким образом массив называетс ямассивом переменной длины .Однако переменную длину могут иметь только локальные массивы видимые в блоке или прототипе. Вот, что там по этому поводу сказано, и еще в С89 и некоторых компиляторах с++ эта функция не поддерживается.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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++ у меня откомпилировалось и запустилось
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Янус
|
|
« Ответ #7 : 01-05-2008 21:05 » |
|
Внес изменения опять не получается...
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #8 : 01-05-2008 21:09 » |
|
Может от того, что у меня Borland C++ 3.1?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #9 : 01-05-2008 21:11 » |
|
Я не думаю, что он поддерживает стандард 99 года. Копирайт у него где то 94 года наверно. Кстати, а как это связано с ֹUnix системами?
|
|
« Последнее редактирование: 01-05-2008 21:13 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Янус
|
|
« Ответ #10 : 01-05-2008 21:14 » |
|
Компилятор, как написал выше, а опцию, как давать ? Разве ее не подхватывает автоматически ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #11 : 01-05-2008 21:15 » |
|
Я исправил свое сообшение. Прочитай его.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Янус
|
|
« Ответ #12 : 01-05-2008 21:16 » |
|
Насчет Unix сплоховал, каюсь не в той теме разместил сообщение... А где что нибудь по свежее взять (компилятор) ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 01-05-2008 21:49 » |
|
Борланд выпускает и дальше свою линию компиляторов (ֲBorland Builder), есть и у ֵMicrosoft (Microsoft Visual Studio), У Intel есть свой компилятор, Из среды GNU в виндовс портировали GCC и назвали ֵMinGW.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
|