| 
			| 
					
						| Янус | 
								|  | «  : 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. |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	|  |