Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Консольное приложение


Автор: svyashennik 6.5.2007, 14:05
Здравствуйте хлопцы!!! Нужна помощ.

Пишу консольное приложение в билдере. У меня 2-а модуля. Из главногомодуля вызывается процедура(она во втором модуле). Эта процедура должна передать матрицу в гл. модуль.
Вопрос - как это сделать?????  
 smile 

Автор: BreakPointMAN 6.5.2007, 14:25
Как именно у тебя хранится матрица? (двумерный C'шный массив, вектор векторов или что-то другое?) Что ты подразумеваешь под словом "модуль"? (просто совокупность .h+.cpp или что-то еще?)  И в чем именно проблема?

Автор: svyashennik 6.5.2007, 16:07
Вот : модуль Tabl.cpp

void Vvod (/*что-то здесь*/)
 {
int tablica[4][6] ={ {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0}, };

}


Вот гл. прога
#include <Tabl.cpp>

int main()
{
int tablica[4][6];

Vvod(/*и что-то здесь*/);

}

Добавлено через 1 минуту и 30 секунд
Как правильно вызвать процедуру??

Автор: Klin 6.5.2007, 16:29
Может я что-то не понимаю, а в чем проблема? Можно так:

Главный модуль.
Код

#include <Tabl.cpp>
int main()
 { 
  int tablica[4][6];
  for (int x = 0; x<4; x++)
   for (int y = 0; y<6; y++)  tablica[x][y]  = Vvod(x,y);
 }

Второй модуль.
Код

 int tablica[4][6] ={ {1, 2, 3, 4, 5, 6},
                       {7, 8, 9, 10, 11, 12},
                       {13, 14, 15, 16, 17, 18},
                       {19, 20, 21, 22, 23, 24} };
 int Vvod (int x, int y)
  {
  return tablica[x][y];
 }

Все работает.

Добавлено через 28 секунд
или нужно получить весь массив одной функцией?

Автор: svyashennik 6.5.2007, 18:14
Именно!!!!! smile 

Автор: fish9370 6.5.2007, 19:15
Цитата(svyashennik @ 6.5.2007,  18:14)
Именно!!!!! smile

передавать массив через стек не рационально.. завтра ты захочешь увеличить массив.. что тогда?
в твоем случае я бы объявил глобальный массив и ничего бы никуда не передавал..

но сделать это можно, например, описав предварительно структуру содержащую такой массив:

Код

struct _array
{
       int tablica[4][6];
};


а дальше передавай его себе в функцию:

Код

void myFunc(_array myArray)
{
       //тело функции
}


не забудь инициализировать массив..

Добавлено через 8 минут и 45 секунд
Цитата(svyashennik @ 6.5.2007,  16:07)
void Vvod (/*что-то здесь*/)
 {
int tablica[4][6] ={ {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0}, };

}

в данном случае твой массив "tablica[4][6]" из другой функции не будет тебе доступен, поскольку он определен внутри функции Vvod(), в локальной области видимости и будет удален, как только функция завершит свою работу..

Автор: Klin 6.5.2007, 19:46
Цитата(fish9370 @  6.5.2007,  20:15 Найти цитируемый пост)
но сделать это можно, описав предварительно структуру содержащую такой массив:

Тогда надо будет заполнять массив в функции, а это не так хорошо. ИМХО тогда уже лучше создать функцию в главном модуле.

Автор: svyashennik 6.5.2007, 20:36
Хорошо. smile 
Я инициализирую массив в главном модуле, но значения заносить то мне надо в п/п Vvod

Добавлено через 1 минуту и 23 секунды
И не по отдельности а все элементы сразу

Автор: Klin 6.5.2007, 21:28
Цитата(svyashennik @  6.5.2007,  21:36 Найти цитируемый пост)
Я инициализирую массив в главном модуле, но значения заносить то мне надо в п/п Vvod

Это практически тоже самое smile Но вот нашел решение поставленной задачи:

Главный модуль.
Код

#include <Tabl.cpp>
int main()
 { 
  int tablica[4][6];
  Vvod(tablica);
 }


Второй модуль.
Код

int tab[4][6] ={ {1, 2, 3, 4, 5, 6},
                      {7, 8, 9, 10, 11, 12},
                      {13, 14, 15, 16, 17, 18},
                      {19, 20, 21, 22, 23, 24} };

void Vvod (int my[4][6])
{
 for (int x = 0; x<4; x++)
  for (int y = 0; y<6; y++)
   my[x][y] = tab[x][y];
};


Все работает, но не знаю, правильно ли это и не будет ли ошибок в будущем.

Автор: fish9370 6.5.2007, 22:24
Цитата(Klin @ 6.5.2007,  21:28)
Все работает, но не знаю, правильно ли это и не будет ли ошибок в будущем.

 smile абсолютная бессмыслица.. надеюсь он это применять не будет..

Автор: Klin 6.5.2007, 23:09
Цитата(fish9370 @  6.5.2007,  23:24 Найти цитируемый пост)
абсолютная бессмыслица.. надеюсь он это применять не будет.. 

А я предупреждал smile Сам не понимаю, как оно работает.  smile fish9370, может знаете как и что исправить?
По логике надо задать тип функции, которая будет возвращать массив. Это возможно, но как реализовать пока не знаю :(  Сейчас с временем напряг. Возможно через type? Время выберу что-нибудь придумаю.

Автор: svyashennik 7.5.2007, 19:59
Я сделал так:
//Модуль VVod.cpp

#include "VVODmod.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 void Vvod (tablica)
 {
 int tablica[4][6]= { {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0} };
...
...
}

//------------------------------------------------------------
//гл. модуль
#include <VVod.cpp>
int main()
{
  int a [4][6];

Vvod(a);

}

И вот что вылезает:
[C++ Error] VVODmod.cpp(37): E2238 Multiple declaration for 'tablica'

Автор: Klin 7.5.2007, 20:50
svyashennik, и что это вам дало? 
Ошибку можно исправить, но работать не будет :(  Я же по другому писал!

Второй модуль.

Код

#include "VVODmod.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 void Vvod (int tablica [4][6])
 {
  for (int x = 0; x<4; x++)
   for (int y = 0; y<6; y++)
    tablica [x][y] = 0;
 }

Автор: fish9370 7.5.2007, 22:25
задача изначально поставленна неверно.. отсюда неправильные пчелы и неправильный мед.. прошу переформулировать задачу.. хочу знать зачем нужны эти "два модуля".. хочется услышать общую идею..

передавать массив через стек в функцию или из функции не правильно.. а в данном случае предпринимается именно такая попытка, мне кажется плохо, когда некоторые товарищи вместо того чтобы объяснить парню, что это не правильно стараются его же кривыми методами ему помочь..

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

если и в этот раз мой пост будет проигнорирован - я пас..

Автор: svyashennik 7.5.2007, 23:49
Дело в том, что у меня программа в которой несколько подпрограмм делают различные пребразования с таблицей (одной и конкретного размера) .
вот я и подумал чтоб одна п/п вводила данные, другая считала и т.д.
и они обменивались этой таблицей (матрицей) smile 

Автор: Klin 8.5.2007, 00:06
Тогда это можно сделать вообще без дополнительных модулей, но раз надо, то объявляешь свою таблицу в модуле, и объявляешь его всем другим модулям, а они работают непосредственно с ним, а не копируют / передают значения.

Автор: fish9370 8.5.2007, 15:41
Цитата(svyashennik @ 7.5.2007,  23:49)
Дело в том, что у меня программа в которой несколько подпрограмм делают различные пребразования с таблицей (одной и конкретного размера) .
вот я и подумал чтоб одна п/п вводила данные, другая считала и т.д.
и они обменивались этой таблицей (матрицей) smile

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

пример:

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int table[4][6]= { {1, 0, 1, 0, 0, 1},          //глобальный массив
                   {0, 1, 1, 1, 1, 0},
                   {0, 1, 1, 0, 1, 0},
                   {1, 0, 1, 0, 0, 1} };
void input()                                               //заполнение таблицы случайными числами
{
      for (int i=0;i<4;i++)
           for(int j=0;j<6;j++)
                 table[i][j]=random(1);
}

void show()                                              //отображение таблицы
{
     printf("\n"); 
     for (int i=0;i<4;i++)
     {
           for(int j=0;j<6;j++)
                 if(table[i][j]>0)
                       printf("#");
                 else printf(".");
           printf("\n");
     }
  
}

void main()
{
      input();
      show();
}

Автор: Klin 8.5.2007, 19:47
fish9370, я в принципе это и имел ввиду smile

Автор: fish9370 8.5.2007, 20:02
Цитата(Klin @ 8.5.2007,  19:47)
fish9370, я в принципе это и имел ввиду smile

я знаю, что ты это понимаешь, я за него побоялся..

Автор: svyashennik 9.5.2007, 09:49
Хорошо... понял
Всем спасибо за участие smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)