В шоке от напряжности программирования на C++

 

Переделываю программу для экономического календаря с VB на C++.NET

//Объявлена структура
typedef struct news
{
	char Symbol[5];
	char Day[10];
	char Text[1000];
};
//Выделена память для 50 таких структур
news* list=(news*)malloc(sizeof(news*)*50);

//Далее ф-ция мейн, в которой идет вызов вот такой функции:
void AnalizeBuffer()
{
  news* n = list;
}

Все в порядке, но почему-то при отладке n не приравнивается list, а записывается вообще какой-то левый указатель на неизвестно что! Пробовал extern news* list прописывать. Ничего помогает =( 

В чем ошибка?

P.S. Ф-ция AnalizeBuffer() находится в отдельном .h файле, а объявление news* list происходит в .cpp файле. Может в этом проблема?

 
Fduch >>:

Переделываю программу для экономического календаря с VB на C++.NET

Все в порядке, но почему-то при отладке n не приравнивается list, а записывается вообще какой-то левый указатель на неизвестно что! Пробовал extern news* list прописывать. Ничего помогает =( 

В чем ошибка?

Выделена паямять не под 50 струтктур, а под 50 указателей на структуры - sizeof(news*)*50. Если нужно разместить 50 структур, то тогда

news* list=(news*)malloc(sizeof(news)*50);

Успехов

 

Да, опечатка. Но проблема в том, что даже указатель нормально не приравнивается:


Операция приравнивания прошла, а значение в указателе совсем не равно news_list

 
Fduch >>:

Да, опечатка. Но проблема в том, что даже указатель нормально не приравнивается:


Исправить пробовали ? Размерность указателя - это размерность инта для 32 разрядной архитектуры это 100 чаров. В данном случае 50 указателей это меньше, чем одна структура. То есть памяти будет отведено меньше, чем нужно для размещения даже одного элемента лист. Возможно потому мусор и сыпет...

Успехов.

В Вашем примере в а будет храниться адрес структуры лист.  Значение можно получить 2-мя путями :

1. *а.имяполя

2.  а->имяполя

То есть для доступа к значению указатель (адрес) нужно разименовать.

 
VladislavVG >>:

Исправить пробовали ? Размерность указателя - это размерность инта для 32 разрядной архитектуры это 100 чаров. В данном случае 50 указателей это меньше, чем одна структура. То есть памяти будет отведено меньше, чем нужно для размещения даже одного элемента лист. Возможно потому мусор и сыпет...

Успехов.

В Вашем примере в а будет храниться адрес структуры лист.  Значение можно получить 2-мя путями :

1. *а.имяполя

2.  а->имяполя

То есть для доступа к значению указатель (адрес) нужно разименовать.

Меня не интересует значение вообще. Исправлять нечего - в листинге память выделяется правильно(не на указатали, а на целую структуру). Меня интересует приравнивание указателя:

1. news* a; //Локальная

2. news* b; //Глобальная

3. a=b;

А дебаггер после выполнения третьей строчки показывает, что а не равно b.(скриншот выше). Первый раз с таким столкнулся..

 
#include <iostream.h>
#include <stdlib.h>

struct Employee  {
  char title  [ 50 ] ;
  int year;
} ;


int main  ()
{
  char buffer [ 50 ] ;

   Employee aEmployee;
   Employee * pEmployee;
   pEmployee = & aEmployee;

   cout <<  "Enter title: " ;
   cin.getline  ( pEmployee->title, 50 ) ;
   cout <<  "Enter year: " ;
   cin.getline  ( buffer, 50 ) ;
   pEmployee->year = atoi  ( buffer ) ;

   cout <<  "\nYou have entered:\n" ;
   cout << pEmployee->title;
   cout <<  " ("  << pEmployee->year <<  ")\n" ;

  return 0 ;
}
 

Короче заинтриговал, сейчас посмотрю.


Но обычно это синдром кривых рук, а не проблема C++.

 
Fduch >>:

Меня не интересует значение вообще. Исправлять нечего - в листинге память выделяется правильно(не на указатали, а на целую структуру). Меня интересует приравнивание указателя:

1. news* a; //Локальная

2. news* b; //Глобальная

3. a=b;

А дебаггер после выполнения третьей строчки показывает, что а не равно b.(скриншот выше). Первый раз с таким столкнулся..

Ошибку повторить не удалось :(

typedef struct news
{
	char Symbol[5];
	char Day[10];
	char Text[1000];
};
//Выделена память для 50 таких структур
//news* list=(news*)malloc(sizeof(news*)*50);

//Далее ф-ция мейн, в которой идет вызов вот такой функции:
news* n = NULL;
void AnalizeBuffer()
{
  n = (news*)malloc(sizeof(news)*50);
}
//////////////////////////////////////////////////////////////////////////////+
//----------------------------------------------------------------------------+

int _tmain(int argc, _TCHAR* argv[])
{
int nRetCode = 0;

	news* list=(news*)malloc(sizeof(news)*50);
        news* a = list;
	AnalizeBuffer();
	news* b = n;

	return(nRetCode);

}

В дебагере и окне просмотра выдает правильные значения - все присвоеные значения совпадают.....

 
Fduch >>:

После того, как вкуришь то, что написал Sol, еще про std::vector почитай, чтобы указатели не пользовать.

Или вообще советую хардкорно начать, если потянешь -- Бьерн Страуструп -- "Программирование на С++".

 
TheXpert >>:

После того, как вкуришь то, что написал Sol, еще про std::vector почитай, чтобы указатели не пользовать.

Или вообще советую хардкорно начать, если потянешь -- Бьерн Страуструп -- "Программирование на С++".


Обе хороши. Обе на русском. Страуструп и Джеф Элджер.

 
Вот файлы проекта. Если интересно, в файле news.h поставьте Watch на 91 строку *функция AnalizeBuffer(char* buffer)*
Файлы:
problem.rar  12 kb