Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2011, 05:19   #1
CofeIn
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 10
По умолчанию C. Ошибка при компиляции из-за строки с массивом, не отличающимся от других.

Тут проблема заключается в первой строке функции RazbrasyvaemMassiv(), т.к. когда я закомменчиваю её, всё работает. Но я никак не пойму, что с ней не так: обычное объявление массива, ничем не отличается от массива ar[] в этой же программе. Мало того, когда я переношу эту же строку в главную функцию, она работает! Вот уж этого я точно не понимаю. Вывожу соутом size - это тоже работает. У кого есть идеи?

Код:
Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

void RazbrasyvaemMassiv (int ar[], long size)
{
	int arnum[size];  //Когда я закомменчиваю эту строку, всё тоже работает, но я не вижу в ней ошибку. 
//Массив, как массив, от ar[] ничем не отличается. Мало того, когда я пишу _ту_же_ строчку в главной функции, никаких ошибок нет.
	/*ar[3]=10; //Для теста - эта строка работает*/

}

void main(){
	srand(time(NULL));
	const long size=10;
	int ar[size];
	
for (int i=0; i<size; i++)
{
ar[i]=i+1;
cout<<ar[i]<<"\t";
}
	cout<<"\n\n";

RazbrasyvaemMassiv (ar, size);
for (int i=0; i<size; i++)
cout<<ar[i]<<"\t";
}
Что пишется при компиляции:
Цитата:
1>------ Rebuild All started: Project: home 10 3, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'home 10 3', configuration 'Debug|Win32'
1>Compiling...
1>home 10 3.cpp
1>c:\documents and settings\админ\мои документы\visual studio 2008\projects\home 10 3\home 10 3.cpp(8) : error C2057: expected constant expression
1>c:\documents and settings\админ\мои документы\visual studio 2008\projects\home 10 3\home 10 3.cpp(8) : error C2466: cannot allocate an array of constant size 0
1>c:\documents and settings\админ\мои документы\visual studio 2008\projects\home 10 3\home 10 3.cpp(8) : error C2133: 'arnum' : unknown size
1>c:\documents and settings\админ\мои документы\visual studio 2008\projects\home 10 3\home 10 3.cpp(14) : warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
1>Build log was saved at "file://c:\Documents and Settings\Админ\Мои документы\Visual Studio 2008\Projects\home 10 3\Debug\BuildLog.htm"
1>home 10 3 - 3 error(s), 1 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Последний раз редактировалось Stilet; 08.03.2011 в 10:28.
CofeIn вне форума Ответить с цитированием
Старый 08.03.2011, 09:01   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Проблема в том, что твой компилятор не соответствует стандарту и не поддерживает variable length array -- то есть массивы, размер которых не является констаной. Можешь заменить long size на const long size в объявлении функции или же сменить компилятор на более адекватный.

Цитата:
void main()
должно быть int main(), исправь
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 08.03.2011, 10:35   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да ладно пугать то... Не все так плохо.
Чуть-чуть поправить типа такого:
Код:
int* RazbrasyvaemMassiv (long size)
{
	int *arnum = new int[size];  
	arnum[3]=10; 
	return arnum;
}
и
Код:
	srand(time(NULL));
	const long size=10;
	int *ar=RazbrasyvaemMassiv (size);
	for (int i=0; i<size; i++)	cout<<ar[i]<<"\t";
	delete[] ar;
	cin.get();
	return 0;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.03.2011, 11:01   #4
CofeIn
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 10
По умолчанию

Obey-Kun, да, ты прав, дело в константности сайза. Я, кстати, только что придумала довольно простое решение этой проблемулины: сделать эту переменную глобальной. До этого мне почему-то показалось, что "константность" переменной сохраняется при передаче из функции в функцию.

Stilet, по твоему коду пара вопросов появилась (просто я ещё не дошла до некоторых вещей, которые ты использовал):
- что значит '*' возле int и ar?
- new int[size] - это, похоже, извращённый способ создания массива?
- delete[] ar; - из названия вроде ясно, но всё же подстрахуюсь..
- cin.get(); - Почему после cin стоит '.', а не '<<'?
Если можно, по одному предложению, желательно на русском, а не очень уж на компьюьтерном))

Последний раз редактировалось CofeIn; 08.03.2011 в 11:05.
CofeIn вне форума Ответить с цитированием
Старый 08.03.2011, 11:50   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Читать про указатели и динамические массивы - вопросы отпадут сами собо.
p51x вне форума Ответить с цитированием
Старый 08.03.2011, 12:37   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что значит '*' возле int и ar?
Это значит что переменка будет указателем на... блок памяти
Цитата:
new int[size] - это, похоже, извращённый способ создания массива?
Ниразу. Самый стандартный. в С++ конечно
Цитата:
delete[] ar; - из названия вроде ясно, но всё же подстрахуюсь..
Освобождение всего массива
Цитата:
cin.get(); - Почему после cin стоит '.', а не '<<'?
Потому что я не собираюсь в переменку вводить, а просто хочу вызвать метод get() обьекта cin для задержания консоли с результатом и ожидания нажатия любой клавиши.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.03.2011, 12:59   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от CofeIn Посмотреть сообщение
Obey-Kun, да, ты прав, дело в константности сайза. Я, кстати, только что придумала довольно простое решение этой проблемулины: сделать эту переменную глобальной.
просто, но очень плохо, лучше передайте как const

upd// возможно так тоже не будет работать, тогда только динамический массив вам в помощь, вообще оно и понятно, ведь размер статического массива должен быть известен при компиляции

Последний раз редактировалось onewho; 08.03.2011 в 13:03.
onewho вне форума Ответить с цитированием
Старый 08.03.2011, 13:12   #8
CofeIn
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 10
По умолчанию

Stilet, всё ясно, а '*' в "int* RazbrasyvaemMassiv" - это потому, что мы возвращаем переменную-указатель?

Кстати, тогда ещё вопрос: я попыталась вызвать из данной функции ещё одну функцию, и в ней создать массив, и при передаче у меня ничего не получилось.
Потом я попробовала сделать всё так, как написали вы, и всё заработало. Коды есть во вложении, там и ошибочный вариант, и рабочий. Но у меня вопрос: почему надо делать указатели, почему нельзя или не получилось просто передать массив из одной функции в другую?

onewho, почему плохо?
Вложения
Тип файла: txt 004.txt (860 байт, 129 просмотров)
Тип файла: txt 005.txt (860 байт, 117 просмотров)

Последний раз редактировалось Stilet; 08.03.2011 в 13:55.
CofeIn вне форума Ответить с цитированием
Старый 08.03.2011, 13:41   #9
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

не то, чтобы глобальные данные плохи, но использовать их следует там - где это действительно необходимо, в вашем случае это излишне
onewho вне форума Ответить с цитированием
Старый 08.03.2011, 13:54   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это потому, что мы возвращаем переменную-указатель?
Ну если не буквоедствовать то да
Цитата:
почему надо делать указатели, почему нельзя или не получилось просто передать массив из одной функции в другую?
Наверное потому что в Си работа с массивами идет только по указателям. Да и вообще если честно во многих языках работа с массивами только по указателю. Просто другие языки вуалируют эту работу, так как программисту удобнее, не заставляют его думать за распределение памяти. (Это Мое ИМХО...)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при компиляции Banner Помощь студентам 2 20.02.2011 13:09
Ошибка при компиляции DKENT Общие вопросы Delphi 4 10.09.2010 15:31
Ошибка при компиляции 7B! Общие вопросы .NET 7 08.01.2010 13:11
Ошибка при компиляции haste39 Общие вопросы C/C++ 4 13.11.2009 00:24