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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача массива в функцию, Передача массива в функцию 
:(
    Опции темы
yurk84
Дата 10.4.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код

#include <graphics.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <limits.h>


void JerebjevkaNum();                        // provedenie jerebievki
void PechatJerebjevkaNum(int []);           // pechat jerebievki

struct Championat
{
char name[80];
int wins;          //   chislo pobed
int draws;        //    chislo nichih
int loses;       //     chislo porageniy
int balls; //           raznica myachey
int points;   //        kol-vo nabrnnyh ochkov
};

struct Championat Club[] = {

{ "Rubin", 0, 0, 0, 0, 0},
{ "CSKA",  0, 0, 0, 0, 0},
{ "Dinamo",0, 0, 0, 0, 0},
{ "Amkar", 0, 0, 0, 0, 0},
{ "Zenit", 0, 0, 0, 0, 0},
{ "Krylya Sovetov", 0, 0, 0, 0, 0},
{ "Lokomotiv",0, 0, 0, 0, 0},
{ "Spartak M",0, 0, 0, 0, 0},
{ "FC Moskva",0, 0, 0, 0, 0},
{ "Terek", 0, 0, 0, 0, 0},
{ "Saturn",0, 0, 0, 0, 0},
{ "Spartak N",0, 0, 0, 0, 0},
{ "Tomj",  0, 0, 0, 0, 0},
{ "Khimki",0, 0, 0, 0, 0},
{ "Rostov",0, 0, 0, 0, 0},
{ "Kuban", 0, 0, 0, 0, 0}

               };

void JerebjevkaNum()
  {
  int num, ClubNum, ClubJerNum[16];
  randomize();
  num=random(16);
  ClubJerNum[0]=num;    // prisvoenie pervomu klubu pervogo jerebievochnogo nomera

   for (ClubNum=1;ClubNum<=15;ClubNum++)
    {
    if (num<15)
        ClubJerNum[ClubNum]=++num;
      else
        ClubJerNum[ClubNum]=(++num-16);
    }
  }

void PechatJerebjevkaNum(int ClubJerNum[16])
   { 
      for (int ClubNum=0; ClubNum<=15; ClubNum++)
      {
      printf("%s", Club[ClubNum].name);

      if (ClubNum==1 || ClubNum==12)
          printf("                ");
      if (ClubNum==0 || ClubNum==3 || ClubNum==4 || ClubNum==9 || ClubNum==15)
          printf("               ");
      if (ClubNum==2 || ClubNum==10 || ClubNum==13 || ClubNum==14)
          printf("              ");
      if (ClubNum==6 || ClubNum==7 || ClubNum==8 || ClubNum==11)
          printf("           ");
      if (ClubNum==5)
          printf("      ");

      printf("%d\n", ClubJerNum[ClubNum]);
      }
   }

void main(void)
{
  clrscr();
  JerebjevkaNum();
  PechatJerebjevkaNum(int ClubJerNum[16]);
  getch();
}

PM MAIL Skype   Вверх
ИванМ
Дата 10.4.2010, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



какой массив нужно передать? ни одного в коде не нашел
если новый массив, то сначала нужно его создать или глобально или в main и потом передать уже в функцию (просто написав его имя)

Это сообщение отредактировал(а) ИванМ - 10.4.2010, 19:48
PM MAIL   Вверх
yurk84
Дата 10.4.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я хочу передать массив под названием ClubJerNum, состоящий из 16 элементов, в которых содержатся жеребьёвочные номера для каждой из команд.
PM MAIL Skype   Вверх
Friackazoid
Дата 10.4.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



yurk84

Дело в том что в С нет типа данных массив. Массив в С это по сути указатель на первый элемент, дальше все зависит от программиста.
В С массивы передаются в функцию через указатель.

В вашем случае массив надо не только передать в функцию печати, но и сначала вернуть из функции жеребьевки

Код

#include <graphics.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <limits.h>

#define CLUB_SIZE 16

int* JerebjevkaNum();                        // provedenie jerebievki
void PechatJerebjevkaNum(int*);           // pechat jerebievki
struct Championat
{
char name[80];
int wins;          //   chislo pobed
int draws;        //    chislo nichih
int loses;       //     chislo porageniy
int balls; //           raznica myachey
int points;   //        kol-vo nabrnnyh ochkov
};
struct Championat Club[] = {
{ "Rubin\0", 0, 0, 0, 0, 0},
{ "CSKA\0",  0, 0, 0, 0, 0},
{ "Dinamo",0, 0, 0, 0, 0},
{ "Amkar", 0, 0, 0, 0, 0},
{ "Zenit", 0, 0, 0, 0, 0},
{ "Krylya Sovetov", 0, 0, 0, 0, 0},
{ "Lokomotiv",0, 0, 0, 0, 0},
{ "Spartak M",0, 0, 0, 0, 0},
{ "FC Moskva",0, 0, 0, 0, 0},
{ "Terek", 0, 0, 0, 0, 0},
{ "Saturn",0, 0, 0, 0, 0},
{ "Spartak N",0, 0, 0, 0, 0},
{ "Tomj",  0, 0, 0, 0, 0},
{ "Khimki",0, 0, 0, 0, 0},
{ "Rostov",0, 0, 0, 0, 0},
{ "Kuban", 0, 0, 0, 0, 0}
               };
int* JerebjevkaNum()
  {
  int num, ClubNum, ClubJerNum[CLUB_SIZE];
  randomize();
  num=random(CLUB_SIZE);
  ClubJerNum[0]=num;    // prisvoenie pervomu klubu pervogo jerebievochnogo nomera
   for (ClubNum=1;ClubNum<=CLUB_SIZE-1;ClubNum++)
    {
    if (num<15)
        ClubJerNum[ClubNum]=++num;
      else
        ClubJerNum[ClubNum]=(++num-16);
    }
    
    return ClubJerNum;
  }
void PechatJerebjevkaNum(int* ClubJerNum)
   { 
      for (int ClubNum=0; ClubNum<=15; ClubNum++)
      {
      printf("%s", Club[ClubNum].name);
      if (ClubNum==1 || ClubNum==12)
          printf("                ");
      if (ClubNum==0 || ClubNum==3 || ClubNum==4 || ClubNum==9 || ClubNum==15)
          printf("               ");
      if (ClubNum==2 || ClubNum==10 || ClubNum==13 || ClubNum==14)
          printf("              ");
      if (ClubNum==6 || ClubNum==7 || ClubNum==8 || ClubNum==11)
          printf("           ");
      if (ClubNum==5)
          printf("      ");
      printf("%d\n", ClubJerNum[ClubNum]);
      }
   }

// void в main функции есть очень плохая практика старайтесь от этого отвыкать сразу
int main(void)
{
  int *ClubJerNum = null;
  clrscr();
  ClubJerNum = JerebjevkaNum();
  PechatJerebjevkaNum(ClubJerNum);
  getch();

  free (ClubJerNum);

// 0 означает коректное завершение программы
  return 0;
}


Однако, прошу обратить внимание что такая работа с указателя является крайне нежелательной, потому что чревата утечкой памяти, а настоящем рабочем приложении и уязвимостями переполнения. Однако, так как работа с указателя в С очень важна, постаралась ее показать.

В даном конкретном случае имеет смысл воспользоваться советом ИванМ и сделать массив глобальным. Код такого варианта приводить не буду, это достаточно просто чтобы разобратся самому.

P.S. если не скомпилируется прошу простить, написано прям в форуме.
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
yurk84
Дата 10.4.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Большое спасибо за ответ, Friackazoid! Прога скомпилировалась за исключением, что null надо было написать как NULL. Но дело даже не в этом, а в том, что выданные результаты оказались совсем не те, что я хотел бы увидеть (а именно числа от 0 до 15). В чём может быть дело? Заранее спасибо, Friackazoid! Результаты были числа от -190 до 29441  smile 

Это сообщение отредактировал(а) yurk84 - 10.4.2010, 21:39
PM MAIL Skype   Вверх
Friackazoid
Дата 11.4.2010, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здесь как говорится отладчик вам в руки )

Вполне возможно стоит обратить внимание на то что операция ххх = ++num не только присвает ххх значение num увличенное на 1, но и уеличивает сам num.

Также стоит обратить внимание на то что в ункции жеребьеки массив создается локально, следовательно память под него хранится в стеке, который по выходу из масива уничтожается\перезатирается. ;)
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
mes
Дата 11.4.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



yurk84, ловите
Код


const int JerSize = 16; // либо для старых компиляторов #define JerSize  16

void JerebjevkaNum(int ClubJerNum [] )
{
  int num = random();

  for (int ClubNum = 0; ClubNum < JerSize; ++ClubNum)
        ClubJerNum[ClubNum] = ++num % JerSize;       

}

void PechatJerebjevkaNum(int ClubJerNum[])

      for (int ClubNum = 0; ClubNum < JerSize; ++ClubNum)
      {
        printf("%s", Club[ClubNum].name);

        switch (ClubNum)
        { 
          case 1: case 12 :     
            printf("                ");
          break;
          
          case 0: case 3: case 4: case 9: case 15: 
            printf("               ");
          break;

          case 2: case 10: case 13: case 14:
            printf("              ");
          break;
 
          case 6: case 7: case 8: case 11: 
            printf("           ");
          break;
         
          case 5:
           printf("      ");
          break;
        }   
        printf("%d\n", ClubJerNum[ClubNum]);
      }
}

int main ()
{
     int ClubJerNum [JerSize];

     JerebjevkaNum (ClubJerNum);

     PechatJerebjevkaNum (ClubJerNum);

}



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


Шустрый
*


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

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



Ну что ж, теперь всё работает как надо. Большое спасибо всем написавшим, и в особенности mes-у. Однако решение Friackazoid-а, как мне кажется, более востребованно, поскольку передача массива у него происходит с помощью указателя. Кстати, я совсем забыл сказать, когда я сам делал передачу массива в своей программе через указатель у меня получились такие же результаты как и Friackazoid-а, и потому я сразу написал на этот Форум. А если кто-то ещё предложит вариант через указатель - будет совсем здорово!  smile
Кстати у меня отдельный вопрос к господину mes-у: что означает следующая запись кода:

Код

ClubJerNum[ClubNum] = ++num % JerSize;


Это сообщение отредактировал(а) yurk84 - 11.4.2010, 21:05
PM MAIL Skype   Вверх
ИванМ
Дата 11.4.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



yurk84, а разве как-то по-другому можно массив передавать, кроме как через указатель? И как по-вашему mes его передал?
PM MAIL   Вверх
mes
Дата 11.4.2010, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(yurk84 @  11.4.2010,  19:50 Найти цитируемый пост)
что означает следующая запись кода:


% - это операция взятия остатка целочисленного деления , в нашем случае мы используем для исключения переполнения,
т.е. для того чтоб результат вычисления  был всегда в нужном диапозоне, т.е  0 <= n < JerSize

в общем 
Код

ClubJerNum[ClubNum] = ++num % JerSize;

это удобная альтернатива Вашей записи :
Код

    if (num<15)
        ClubJerNum[ClubNum]=++num;
      else
        ClubJerNum[ClubNum]=(++num-16);


Добавлено через 2 минуты и 16 секунд
Цитата(yurk84 @  11.4.2010,  19:50 Найти цитируемый пост)
передача массива у него происходит с помощью указателя. 

Код

void f(int ClubJerNum [])

и
Код

void f(int * ClubJerNum)

фактически одно и то же, и если нравится последняя запись то смело исправляйте 
smile





--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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