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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2010, 12:37   #1
MovsesIV
Пользователь
 
Регистрация: 13.08.2010
Сообщений: 12
По умолчанию Функции, указатели, двумерный массив

Не получается реализовать программу. Подскажите в чем ошибка.
Должна работать следующим образом:
1)В main() генерируется массив packet[48]. 48 элементов - это числа 1,2,3,4,5,6 сгенерируемые каждое по восемь раз. Каждое число соответствует цвету.
2)В main() объявляется двумерный массив cf1[3][3].
3)В random() передается указатель на первый элемент cf1[3][3], packet[48] и значение центрального элемента массива cf1[3][3]
4) В random() cf1[3][3] заполняется случайными значениями из packet[48], причем после этого значения packet[48] обнуляются.
5) cf1 возвращается в main()

Найдите ошибку, пожалуйста

Код:
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
void color(int);
enum center_color {white=1, yellow, orange, red, green, blue};
int* random (center_color cc, int* cf, int* pack);
int main()
{
    int i,j;  
    int cf1[3][3];
    int packet[48]; 
    for(i=0, j=1; i<48; i++)
    {
        if ((i%8==0)&&(i!=0)) j++;
        packet[i]=j;
    }
    cf1=random (white, cf1, packet);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

int* random (center_color cc, int* cf, int* pack)
{
    int i, r;
    srand(time(NULL));
    for (i=0; i<3; i++)
    {
            for (i=0; i<9; i++)
            {
                repeat:
                r=rand()%48;
                if(i==4) continue;
                if (*(pack+r)==0) goto repeat;
                *(cf+i)=*(pack+r);
                *(pack+r)=0;
            }
    }
   
    switch (cc)
    {
        case white: *(cf+4)= white;
        break;
        case yellow: *(cf+4)= yellow;
        break;
        case orange: *(cf+4)= orange;
        break;
        case red: *(cf+4)= red;
        break;
        case green: *(cf+4)= green;
        break;
        case blue: *(cf+4)= blue;
        break;
    }
    return cf;
}

ошибка:
Код:
main.cpp:19: error: no matching function for call to ‘random(center_color, int [3][3], int [48])’
/usr/include/cygwin/stdlib.h:29: note: candidates are: long int random()
main.cpp:8: note:                 int* random(center_color, int*, int*)
MovsesIV вне форума Ответить с цитированием
Старый 18.12.2010, 13:44   #2
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Но насколько, я считаю функция Random является зарезервированной. Поменяй имя функции random. Ах да и goto является некрасивым стилем.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 18.12.2010, 14:04   #3
MovsesIV
Пользователь
 
Регистрация: 13.08.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от TranceSmile Посмотреть сообщение
Но насколько, я считаю функция Random является зарезервированной. Поменяй имя функции random. Ах да и goto является некрасивым стилем.
это отчасти помогло но теперь такая ошибка


Код:
main.cpp:19: error: cannot convert ‘int (*)[3]’ to ‘int*’ for argument ‘2’ to ‘int* randome(center_color, int*, int*)’
MovsesIV вне форума Ответить с цитированием
Старый 18.12.2010, 15:18   #4
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Теперь cf1 это массив, а то что возвращает указатель. Вот он и не может преобразовать. Сейчас посижу голову поламаю. Надо вспомнить как динамически выделить память под двухмерный массив. Как сделаю так и напишу.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 18.12.2010, 15:25   #5
MovsesIV
Пользователь
 
Регистрация: 13.08.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от TranceSmile Посмотреть сообщение
Теперь cf1 это массив, а то что возвращает указатель. Вот он и не может преобразовать. Сейчас посижу голову поламаю. Надо вспомнить как динамически выделить память под двухмерный массив. Как сделаю так и напишу.

спс. можно ведь как-то подругому программу сделать? может быть без адресной арифметики?
MovsesIV вне форума Ответить с цитированием
Старый 18.12.2010, 15:33   #6
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Да нет там как то динамически можно создать двумерный массив. Только не могу вспомнить.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 18.12.2010, 16:02   #7
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

попробуй так
Код:
int** cf1 = new int* [3];
for(i=0;i<3;i++)
   *(cf1+i) = new int[3];
теперь обращаться к массиву можно двумя способами
Код:
// 1-й способ
cf1[1][1];
// 2-й способ
*(*(сf+1)+1);
Осталось только функцию переделать.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 18.12.2010, 16:30   #8
MovsesIV
Пользователь
 
Регистрация: 13.08.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от TranceSmile Посмотреть сообщение
попробуй так
Код:
int** cf1 = new int* [3];
for(i=0;i<3;i++)
   *(cf1+i) = new int[3];
теперь обращаться к массиву можно двумя способами
Код:
// 1-й способ
cf1[1][1];
// 2-й способ
*(*(сf+1)+1);
Осталось только функцию переделать.

а не мог бы объяснить как это работает, не хочу просто тупо копировать конструкцию
MovsesIV вне форума Ответить с цитированием
Старый 18.12.2010, 23:19   #9
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

В памяти выделяются 3 ячейки. В которых будут хранится указатели еще на 3 ячейки.
Как бы адреса на строки. Когда в цикле выделяются по три ячейки. То в ячейку выделенную ранее вносится адрес этих трех ячеек. Короче создаем массив указателей(указатель на строку). И сами строки.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции и двумерный массив stas135642 Общие вопросы C/C++ 1 29.11.2010 10:48
Указатели на функции profi Общие вопросы C/C++ 20 12.07.2010 14:11
Функции, Двумерный массив, Записи, Файлы Goroh Паскаль, Turbo Pascal, PascalABC.NET 1 21.06.2010 14:36
Как сделать чтобы двумерный массив который создается в функции можно было использовать в других функциях Olya90 Помощь студентам 4 20.04.2009 18:39
2 задачи, двумерный массив, процедуры&функции mAveRik Помощь студентам 1 18.12.2008 19:01