Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка компиляции, С++ програмирование 
:(
    Опции темы
reddevil
Дата 14.7.2005, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Новая задача - новая проблема.
Помогите понять почему компилятор выдает ошибку
в данном коде
Код

// Exersize2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "time.h"
#include "windows.h"

using namespace std;
void PrintArray(int**,int,int);// выводит массив на экран 
float Awerage(int **,int ,int);// среднее арифметическое массива
int MaxSum(int **,int ,int);// максимальная сумма столбца
void RD(int **,int ,int);// циклический сдвиг вниз
void RL(int **,int,int);// циклический сдвиг влево

int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));
// Размер массива высота и ширина
    const int higth=5;
    const int lingth=5;
// Создание двумерного массива в динамической памяти
    int **array=new int*[higth];

    for (int h=0;h<higth;h++)
    {
        array[h]=new int[lingth];
// Инициализация массива случайными числами от 10 до 99
        for(int l=0;l<lingth;l++)
        {
            array[h][l]=rand()%89+10;
        }
    }
// Вызов функции вывода массива на экран
    PrintArray(array,higth,lingth);

// Вызов функции нахождения среднего арифметического
// элементов массива
    cout<<"\na. The Awerage of array: "
        <<Awerage(array,higth,lingth)<<endl;

// Вызов функции нахождения максимальной суммы столбца
    cout<<"\nb. The MAX sum of higth array: "
        <<MaxSum(array,higth,lingth)<<endl;

    cout<<"\nc. The rotayte down:\n";
// Вызов функции выполняющей сдвиг строк вниз 
    RD(array,higth,lingth);

// Вывод на экран
    PrintArray(array,higth,lingth);

    cout<<"\nd. The rotayte left:\n";

// Вызов функции выполняющей сдвиг столбцов влево
    RL(array,higth,lingth);
// Вывод на экран
    PrintArray(array,higth,lingth);


// Удаление массива из динамической памяти    
    for(int h=0;h<higth;h++)
        delete array[h];
    delete array;

    return 0;
}

void PrintArray(int**array,int higth,int lingth)
{
    cout<<"************** ARRAY *************\n\n";
    for(int h=0;h<higth;h++)
    {
        for(int l=0;l<lingth;l++)
        {
            cout<<array[h][l]<<"\t";
        }
        cout<<endl;
    }
}

float Awerage(int **array,int higth,int lingth)
{
    float awerage=0;
    for(int h=0;h<higth;h++)
    {
        for(int l=0;l<lingth;l++)
        {
            awerage+=(float)array[h][l];
        }
    }
    return awerage/(higth*lingth);
}

int MaxSum(int **array,int higth,int lingth)
{
    int max=0;
    int sum=0;

    for(int l=0;l<lingth;l++)
    {
        for(int h=0;h<higth;h++)
        {
            sum+=array[h][l];
        }
        if(sum>max)
            max=sum;
        sum=0;
    }

    return max;
    }

void RD(int **array,int higth,int lingth)
{
    // Почему компилятор выдает ошибку если: int temp[lingth] ?
    int temp[5]; 
    
    for(int l=0;l<lingth;l++)
        temp[l]=array[higth-1][l];

    for(int h=higth-1;h>0;h--)
    {
        for(int l=0;l<lingth;l++)
            array[h][l]=array[h-1][l];
    }
    
    for(int l=0;l<lingth;l++)
        array[0][l]=temp[l];
}

void RL(int **array,int higth,int lingth)
{
    int temp[lingth];

    for(int h=0;h<higth;h++)
        temp[h]=array[h][0];

    for(int l=1;l<lingth;l++)
        for(int h=0;h<higth;h++)
            array[h][l-1]=array[h][l];
    for(int h=0;h<higth;h++)
        array[h][lingth-1]=temp[h];
}



PM MAIL   Вверх
Void
Дата 15.7.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Размерность массива должна быть константой времени компиляции. Правда, новый стандарт C99 позволяет то, что ты написал - но твой компилятор видимо его не поддерживает. Тебе здесь нужно динамическое выделение памяти:
Код

int *temp = new int[length];
...
delete[] temp;



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
reddevil
Дата 16.7.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Спасибо за ответ,
при динамическом выделении памяти заработало smile
Цитата
Размерность массива должна быть константой времени компиляции.

честно, компилировал все в одно время smile
еслиб кто сказал что это за время компиляции smile

Это сообщение отредактировал(а) reddevil - 16.7.2005, 00:22
PM MAIL   Вверх
En_t_end
Дата 16.7.2005, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



reddevil
Дело в том, что существуют вещи, которые реально существуют только на уровне компилятора и его макро-языка. К этому относятся всевозможные макросы, а также константы. В старом стандарте Си массив(не динамический) !!!должен!!! иметь константый размер. То есть при компиляции, все места использования макросов и констант будут заменены соответсвенными инструкциями и значениями.
"Время компиляции"
В данном контексте подразумевается "момент компиляции". Что есть не что инное, как часть процесса подстановки значений и инструкций. ИМХО помоему в этот процесс также входит создание object's, которые связываются линковщиком в следующем процессе - процессе связывания и сборки.
PM MAIL ICQ Skype GTalk Jabber   Вверх
reddevil
Дата 18.7.2005, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Спасибо за ответы!
Но вот начал новую прогу и...
Код

void GameSecond(int pl)
{
    
    char *first=new char[] ;
    char *second=new char[] ;

    if (pl==1)
      {
         first="PLAYER";
         second="COMPUTER";
      }
      else
      {
         first="COMPUTER";
         second="PLAYER";
      }


    cout<<first<<"\t\t"<<second<<" \n Press any key";
    int n=getch();
    cout<<endl;
    

// если убрать delete, тогда все впоряде
//а так ошибка во время исполнения программы
    delete first;
    delete second;
    int i=getch();
}

компилирую, запускаю,
дохожу до delete и появляется окно про ошибку.
помогите раздуплится в чем тут ошибка smile

PM MAIL   Вверх
En_t_end
Дата 18.7.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



reddevil
Во первых... чес слово впервые вижу чтобы так память выделяли из кучи smile
На самом деле выделяется шиш. В твоем случае нужно задать размер дин. массива, то есть:
char *first=new char[MAX_LONG_FIRST] ;
char *second=new char[MAX_LONG_SECOND] ;
Естесственно, что у тебя будет ошибка, потому что ты освобождаешь память тобой не занятую.
Далее...
Вместо:
Цитата(reddevil @ 18.7.2005, 05:27)
    
delete first;
delete second;


delete[] first;
delete[] second;

Ты ведь освобождаешь память не из под простого указателя. А из под динамического массива.

PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 18.7.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 5
Всего: 18



Код
first="COMPUTER";
         second="PLAYER";
Это тоже очень интересно...
PM MAIL ICQ   Вверх
reddevil
Дата 18.7.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Цитата
На самом деле выделяется шиш. В твоем случае нужно задать размер дин. массива, то есть:
char *first=new char[MAX_LONG_FIRST] ;
char *second=new char[MAX_LONG_SECOND] ;

тогда происходит ошика компиляции в строках
Код

  first="PLAYER";
  second="COMPUTER";


подскажите как правильно сделать,
чтоб при проверке на true, изменялось два
массива: в первом - СТРОКА1, во втором - СТРОКА2,
и не оборот: в первом - СТРОКА2, во втором - СТРОКА1.

PM MAIL   Вверх
En_t_end
Дата 19.7.2005, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Цитата(Fixin @ 18.7.2005, 21:42)
Код
first="COMPUTER";
         second="PLAYER";

Это тоже очень интересно...

smile
Цитата(reddevil @ 19.7.2005, 01:45)
подскажите как правильно сделать,
чтоб при проверке на true, изменялось два
массива: в первом - СТРОКА1, во втором - СТРОКА2,
и не оборот: в первом - СТРОКА2, во втором - СТРОКА1.


Блин, только сейчас заметил )))

Как решить эту проблему ?
Есть два решения...
1. Отказаться от динам. массивов в данном контексте, ибо здесь можно обойтись обычными массивами, которые уничтожются после вызова твоей функции и сотвественно тебе не надо будет явно освобождать память, за тебя все сделает Си.
2. Работая с указателями, а в частности с дин. массивами, надо всегда быть собранным и просто так не раскидывать на право и на лево "присваивание". Запомни правило, в большинстве случаев, если операция имеет вид:
test_pointer = "Test";
... где test_pointer указатель, а "Test" некая строка, то эта операция означает, что теперь test_pointer будет указывать на некую стековую переменную(здесь массив) с некоторым адрессом НЕ из кучи. Если бы ты поставил знак разыменования перед test_pointer, например так:
*test_pointer = 'T';
, то здесь ты бы уже работал не с адресами а со значениями элементов динамического массива. В частности присвоил бы первому(в данном контексте именно иму) члену массива значение 'T'. Эта операция в данном контексте может быть заменена на test_pointer[0] = 'T';

Если же ты все таки ради обучения решил использовать дин. массив, то посмотри в сторону strcpy aka lstrcpy- Win version, которая возвращает первый аргумент, но предварительно !!!скопировав!!! в его элементы значения из элементов второго.

ЗЫ извиняюсь за ошибки как логические, так и орф. - писал спросоня smile

Это сообщение отредактировал(а) En_t_end - 19.7.2005, 07:24
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.