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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2011, 08:55   #1
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию Compilation error

Решил попробовать прорешивать задачи с acm.tinus и столкнулся с проблемой при решении задачи 1005
На домашнем компе стоит Linux Ubuntu 10.10 (Винду не использую из-за нелюбви к ней и из-за нежелания использовать пиратку)
Версия gcc - 4.4.5
На ихнем сервере стоит 32-битный компилятор Microsoft Visual C++ 2010
Параметры, с которыми запускается:
Код:
cl /TP /MT /EHsc /O2 /W3 /Za /D "_CRT_SECURE_NO_WARNINGS" 
   /D "_CRT_SECURE_NO_DEPRECATE" /D "ONLINE_JUDGE"
На домашнем компе все нормально компилируется и программа выдает верный ответ. Сервер выдает ошибку компиляции.
Вот код:
Код:
#include <iostream>

#define abs(x) ((x)<0 ? -(x) : (x))

using namespace std;

int main()
{
    short n;
    long sum = 0;
    long firstSum = 0;
    long secondSum = 0;
    cin >> n;
    long w[n];
    for(int i=0; i<n; i++)
    {
        cin >> w[i];
        sum+=w[i];
    }
    sum>>=1;
    long temp = w[0];
    int num = 0;
    for(int i=0; i<n; i++)
    {
        if(temp<w[i])
        {
            temp = w[i];
            num = i;
        }
    }
    firstSum+=temp;
    w[num] = 0;
    for(int i=1; i<n; i++)
    {
        num = 0;
        while(w[num]==0)
        {
            num++;
        }
        temp = w[num];
        for(int j=0; j<n; j++)
        {
            if((temp>w[j])&&(w[j]!=0))
            {
                temp = w[j];
                num = j;
            }
        }
        w[num] = 0;
        if(firstSum+temp<sum)
        {
            firstSum+=temp;
        }
        else
        {
            secondSum+=temp;
        }
    }
    cout << abs(firstSum-secondSum) << endl;
    return 0;
}
Прошу помощи.
Osanve вне форума Ответить с цитированием
Старый 27.01.2011, 11:27   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

MSVS 2010 ругается на
Код:
long w[n];
надо чтобы n было константой.
Сделайте
Код:
long *w = new long[n];
И не забудьте потом освободить память
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 27.01.2011, 11:57   #3
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Дело в том, что n вводится с клавиатуры, следовательно не вижу возможности задать n константой. Разве что задать long w[20] (по условию задачи не более 20), а цикл пускать до n?
Osanve вне форума Ответить с цитированием
Старый 27.01.2011, 12:22   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам же сказали как динамически выделять нужный массив.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.01.2011, 12:30   #5
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Всё, разобрался. Сначала не правильно понял. Спасибо за помощь.
Osanve вне форума Ответить с цитированием
Старый 27.01.2011, 12:37   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Вместо дефайнов делайте inline-функции. Подобные дефайны это опасно и неудобно.

Но вообще abs есть в библиотеке cmath (std::fabs(..)).

А теперь по теме:
Цитата:
long w[n];
Такая конструкция вполне нормальна (то есть она поддерживается стандартами C99/C++98, ествественно есть в gcc). Но в MSVC поддержка стандартов неполная. Так что или используйте new, или используйте другой компилятор.

upd: как я понял, на acm.tinus нету других. Написал им в саппорт, может ответят чего .
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 27.01.2011 в 12:43.
Obey-Kun вне форума Ответить с цитированием
Старый 27.01.2011, 16:49   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
...
Такая конструкция вполне нормальна (то есть она поддерживается стандартами C99/C++98, ествественно есть в gcc). Но в MSVC поддержка стандартов неполная. Так что или используйте new, или используйте другой компилятор.
...
Поддержка массивов переменной длины в C++ - это расширение gcc и не входит в стандарт
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
NSIS Error Error launching installer Dizraella Операционные системы общие вопросы 16 15.11.2013 14:13
Ищу причину ошибки: Error in loading DLL, она же Error 48. hozpraktik Microsoft Office Excel 1 19.11.2009 12:39
Как решить проблему с Error in loading DLL (Error 48)? Klim Bassenger Microsoft Office Excel 4 23.10.2009 13:44
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/main.exe : fatal error LNK11 prefak Win Api 0 19.04.2009 16:51