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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2008, 10:27   #1
Prestigio
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 10
По умолчанию область видимости переменных. С++

имеется 2 функции - main() и func(). находятся они в разных .cpp . необходима возможность манипулирования переменной в main() при условии, что объявится она в func(). если конкретней,то объявляется динамически массив из х элементов и там же и заполняется. х находится очень долго, заполняется тоже, посему всё решил запихнуть в другой файл.

функции получалось вызывать при помощи *.h, в котором писалось extern int func(); переменными же так не получается. линкер выдаёт
Цитата:
InpMesh.cpp: undefined reference to `b'
collect2: ld returned 1 exit status
если убрать из *.h строку extern int b; получаем

Цитата:
InpMesh.cpp:72: error: `b' undeclared (first use this function)
InpMesh.cpp:72: error: (Each undeclared identifier is reported only once for each function it appears in.)
Prestigio вне форума Ответить с цитированием
Старый 07.07.2008, 10:59   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Что-то я не понял, Вы хотите из одной функции работать с локальной переменной другой?
B_N вне форума Ответить с цитированием
Старый 07.07.2008, 11:17   #3
Prestigio
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 10
По умолчанию

я хочу чтобы переменная была глобальной и была доступна в любой другой функции
Prestigio вне форума Ответить с цитированием
Старый 07.07.2008, 11:45   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Тогда объявите её в одном C-файле, а в других, которые её используют, объявите её же с extern.
B_N вне форума Ответить с цитированием
Старый 07.07.2008, 13:20   #5
Prestigio
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 10
По умолчанию

если я правильно понял:
Код:
//main.cpp
int main()
{
int k=0;
extern void q();
q();
return 0;
}
Код:
//2.cpp
void q()
{
 extern int k;
 k=1;
}
функция вызывается без проблем. а на строчке " k=1;" кричат
2.o(.text+0x5):2.cpp: undefined reference to `k'
collect2: ld returned 1 exit status
Prestigio вне форума Ответить с цитированием
Старый 07.07.2008, 13:24   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вы же сами сказали, что хотите
Цитата:
чтобы переменная была глобальной
, а не
Код:
int main()
{
int k=0;
...............
B_N вне форума Ответить с цитированием
Старый 07.07.2008, 14:06   #7
Prestigio
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 10
По умолчанию

хм... в первоначальной задумке вместо к должен быть массив, который должен состоять из определенного кол-ва элементов. это кол-во элементов задается в функции. если объявление массива вынести из функции, то объявляться он будет до того, как определится кол-во элементов в нем,чего быть не может.
Prestigio вне форума Ответить с цитированием
Старый 07.07.2008, 14:21   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Prestigio, Ваши первоначальные задумки никому, кроме Вас не известны. Поэтому или показывайте проблемный код целиком, или подробнее излагайте проблему. К чему тогда был тот отрывок, который вы привели? Чтобы обратиться, тем паче на этапе сборки, к переменной, нужно знать её адрес. Получить адрес локальной переменной весьма проблематично - она существует только во время работы "своей" функции и по неопределённому адресу в стэке. Так что либо объявляйте глобальный указатель на массив, либо передавайте в вызываемую функцию указатель на локальную переменную в вызывающей, либо, коли в заголовке у Вас C++, пользуйтесь глобальными динамическими массивами C++, либо..., либо... - чем точнее формулировка проблемы, тем точнее ответ.
B_N вне форума Ответить с цитированием
Старый 07.07.2008, 15:39   #9
Prestigio
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 10
По умолчанию

более подробно:
пишу программу, работающую с трехмерной сценой.
пока что готов загрузчик моделей, только толку от него не много, поскольку к объектам можно обращаться только в read_mesh().
Код:
//main.cpp
#include "head.h"
int main()
{
 if (read_mesh()!=0)
  return -1;
 getchar();
 return 0;
}
Код:
//rmesh.cpp
#include <fstream.h>
#include <iostream.h>
#include "head.h"
int read_mesh()
{
    int n;
 //открываем файл с мешем
 ifstream meshfile("meshfile.rmm",ios::in | ios::binary);   
 if (!meshfile)
 {
 cout<<"can't read mesh file\n";
 return 1;              
 }
 //читаем заголовок "rmm"=3 байта то бишь провиряем на битость;
 char meshfileheader[3];
 if (!(meshfile.read((char *) &meshfileheader,3)))
  {
   cout<<meshfileheader<<"\n";
   cout<<"can't read mesh file header\n";
   return 2;                       
  } 
  //проверяем шапку
 if (strcmp(meshfileheader,"rmm")!=0)
 {
  cout<<(strcmp(meshfileheader,"rmm"))<<"\n";
  cout<<"file is incorrect\n";
  return 3;                               
 }
 //читаем кол-во вершин в сцене
 int *count_virtexs_in_scene=new int(0);
 meshfile.read((char *)count_virtexs_in_scene,4);
 //объявляем массив вершин и читаем их туда 
 virtex *virtexs = new virtex[*count_virtexs_in_scene];
 for (int x=0; x<*count_virtexs_in_scene; x++)
 {
  meshfile.read((char*)&(virtexs[x].x),4);
  meshfile.read((char*)&(virtexs[x].y),4);
  meshfile.read((char*)&(virtexs[x].z),4);          
 }
 //читаем кол-во триугольников в сцене
 int *count_faces_in_scene = new int();
 meshfile.read((char*)count_faces_in_scene,4);
 //читаем сами треугольники
 face *faces = new face[*count_faces_in_scene];
 for (int x=0; x<*count_virtexs_in_scene; x++)
 {
  //сперва идут номера точек, которые мы уже прочитали 
  meshfile.read((char *)&(faces[x].a_id),4);
  meshfile.read((char *)&(faces[x].b_id),4);
  meshfile.read((char *)&(faces[x].c_id),4);
  //u,v координаты вершин трегольника
  meshfile.read((char *)&(faces[x].a_u),2);
  meshfile.read((char *)&(faces[x].a_v),2);
  meshfile.read((char *)&(faces[x].b_u),2);
  meshfile.read((char *)&(faces[x].b_v),2);
  meshfile.read((char *)&(faces[x].c_u),2);
  meshfile.read((char *)&(faces[x].c_v),2);
  //id материала треугольника
  meshfile.read((char *)&(faces[x].material_id),2);
 }
 //читаем 3 по идее последних байта и проверяем на битость
 meshfile.read((char *) &meshfileheader,3);
 if (strcmp(meshfileheader,"rmm")!=0)
 {
  cout<<"file is incorrect\n";
  delete count_faces_in_scene;
  delete[] faces;
  delete count_virtexs_in_scene;
  delete[] virtexs;
  return 3;                               
 }
 meshfile.close(); 
 return 0;
}
Код:
//head.h
class virtex //класс вершин
{
 public:
  float x,y,z; //вершины
  short normalx, normaly, normalz; //вектор вершины
};
class face //класс треугольников
{
 public:
 int a_id, b_id, c_id; //вершины
 short a_u, b_u, c_u, a_v, b_v, c_v; //тектурные координаты 
 short material_id;
};
extern int read_mesh();
как сделать указатель на указатель я ещё не совсем понял. буду искать что-нибуть про глобальные динамические массивы
Prestigio вне форума Ответить с цитированием
Старый 07.07.2008, 15:53   #10
embedder
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Prestigio Посмотреть сообщение
если я правильно понял:
Код:
//main.cpp
int main()
{
int k=0;
extern void q();
q();
return 0;
}
Код:
//2.cpp
void q()
{
 extern int k;
 k=1;
}
функция вызывается без проблем. а на строчке " k=1;" кричат
2.o(.text+0x5):2.cpp: undefined reference to `k'
collect2: ld returned 1 exit status
Понял неправильно. В Си (думаю что и в С++ тоже) глобальные переменные, декларируются в начале программы. До функции main.
embedder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтобы новые строки всегда были в области видимости? neugadal Microsoft Office Excel 9 06.09.2008 12:23
проблемы с областью видимости переменной titan-prog Помощь студентам 2 11.07.2008 18:58
Область применения переменных ixs Общие вопросы Delphi 2 05.06.2008 18:00
ошибся с областью видимости ? Иванчо Общие вопросы Delphi 8 25.10.2007 16:35
область видимости ? artem779 Общие вопросы Delphi 3 14.09.2007 09:34