|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:19 am
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Проблем с VC++ Програмиране
| Автор |
Съобщение |
|
diofan
Ранг: Минаващ
Регистриран на: Чет Сеп 29, 2005 10:28 am Мнения: 21
|
 Проблем с VC++ Програмиране
Добавям код към готов МФЦ VC++ проект, проблема е следния:
трябва да използвам обект CPtrArray, но след като го декларирам в добавения код
гърми един ASSERT_VALID(this) след пускане и в дебъг единствено работи, ако този CPtrArray e деклариран в един от другите файлове, който си идва с проекта, а в моя файл е обявен като extern. Как да може да се оправи това? Благодаря предварително.
|
| Сря Дек 12, 2007 6:39 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
значи на 6тицата забелязах един бъг - ако някъде имаш декларирана глобална променлива, а по-долу extern декларация на същата, то конструктора и се вика два пъти върху една и съща памет. мирише ми на това, виж дали нямаш екстерн декларация под мястото където правиш твоята.
|
| Сря Дек 12, 2007 8:51 pm |
|
 |
|
diofan
Ранг: Минаващ
Регистриран на: Чет Сеп 29, 2005 10:28 am Мнения: 21
|
Нещо не съм дал пълна информация - проблема се явява когато извикам някой метод на класа например Add или SetSize, в дебъгера го проследявам и виждам че се дъни на Asserta където се провярява дали this e валидно, самия указател изглежда си е наред, но има една проверка за VTable pointer който o e NULL и там гърми. Ако го компилирам с изход релеасе същия код си работи(то нали не се вика ассерта).
|
| Чет Дек 13, 2007 10:56 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
то нищо не си дал - така че как да ти се помогне !?
zaphod ти е дал joker - макар че неговото твърдение че това (горе) е бъг на VC - не е вярно.
пример:
int ququ = 5;
в друг файл:
extern int ququ = 3;
резултата е 2 променливи ququ едната е 5 а другата 3 (за съответния фалй, видимост, ...)
само линкера се оплаква (warning) че има дублирани променливи
ако се декларира (правилно)
extern int ququ;
всичко е както се очаква!
ако искаш да ти помогнат - пусни част от кода 
_________________ путинофили: "иди н***й"
|
| Чет Дек 13, 2007 11:47 am |
|
 |
|
diofan
Ранг: Минаващ
Регистриран на: Чет Сеп 29, 2005 10:28 am Мнения: 21
|
Ок, първо да уточня по ясно че проблема не е при компилиране или линкване,програмата се билдва с 0 error(s), 0 warning(s) и в двата случая, но ето по конкретно:
[u]Случай 1:[/u]
file1.cpp:
#include "stdafx.h"
#include ....
.....
file2.cpp:
#include "stdafx.h"
#include ....
CPtrArray SomeArray;
....
void AddPtr(LPVOID Ptr) {
SomeArray.Add(Ptr); // при изход дебъг ASSERT_VALID(this) ,който се вика във Add не минава, дъни се при някаква проверка за VTable pointer
}
[u]Случай 2:[/u]
file1.cpp:
#include "stdafx.h"
#include ....
CPtrArray SomeArray;
....
file2.cpp:
#include "stdafx.h"
#include ....
extern CPtrArray SomeArray;
void AddPtr(LPVOID Ptr) {
SomeArray.Add(Ptr); // няма проблем при изход дебъг
}
|
| Пет Дек 14, 2007 10:54 am |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
 |  |  |  | ps66 написа: zaphod ти е дал joker - макар че неговото твърдение че това (горе) е бъг на VC - не е вярно. пример: int ququ = 5; в друг файл: extern int ququ = 3; резултата е 2 променливи ququ едната е 5 а другата 3 (за съответния фалй, видимост, ...) само линкера се оплаква (warning) че има дублирани променливи ако се декларира (правилно) extern int ququ; всичко е както се очаква! ако искаш да ти помогнат - пусни част от кода  |  |  |  |  |
аз говорих за друг случай - една променлива на която конструктора се вика два пъти, а не две променливи.
но и това за което говориш, ако е вярно пак бих го окачествил като бъг или нередност, понеже не виждам никакви основания да прави две променливи. правилата са ясни, едно име - една променлива.
|
| Пет Дек 14, 2007 9:39 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 |  |  |  | zaphod написа:  |  |  |  | ps66 написа: zaphod ти е дал joker - макар че неговото твърдение че това (горе) е бъг на VC - не е вярно. пример: int ququ = 5; в друг файл: extern int ququ = 3; резултата е 2 променливи ququ едната е 5 а другата 3 (за съответния фалй, видимост, ...) само линкера се оплаква (warning) че има дублирани променливи ако се декларира (правилно) extern int ququ; всичко е както се очаква! ако искаш да ти помогнат - пусни част от кода  |  |  |  |  |
аз говорих за друг случай - една променлива на която конструктора се вика два пъти, а не две променливи. но и това за което говориш, ако е вярно пак бих го окачествил като бъг или нередност, понеже не виждам никакви основания да прави две променливи. правилата са ясни, едно име - една променлива. |  |  |  |  |
ами то "int ququ=0;" - си е конструктор за "клас" int
казвам че не е бъг защото аз ползвам BCB10 - и там е същото като в VC!
_________________ путинофили: "иди н***й"
|
| Съб Дек 15, 2007 9:15 am |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
оффф....случай сега, повтарям за последно, ако и сега не го разбереш не мога да ти помогна повече.
ако напишеш
CString s;
extern CString s;
конструктора на s ще се извика ДВА пъти върху една и съща памет. програмирането не е литература и ако ще ми обясняваш че и=3 било конструктор то ти препоръчвам да станеш даскал по литература. първо че оператора = НЕ Е конструктор, и второ и да беше пак говорим за съвсем различни неща.
@diofan след допълнителната информация че асерта гърми по нулиран VFT указател, мога да кажа че това не е случая за който говорим. два пъти изпълнен конструктор не може да нулира поинтера. сега обаче ще ти кажа как да гепнеш проблема - студиото има една функция, слагане на точка на прекъсване върху памет. сложи го върху адреса на тази променлива, с обхват 4 байта. пусни програмата, точката ще се активира един път при създаването на обекта. втората активация вече ще е тази която ти трие паметта.
|
| Съб Дек 15, 2007 9:32 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
понеже си ми "любимец" ще си направя труда да тЪ светна:
int ququ=5;
extern int ququ=3;
е абсолютно идентичен случай на:
CString s;
extern CString s;
и в двата случая имаш дублирани имена (линкера на BCB10 дава warning) - ако е "примитивна" променлива се инициализира 2-та пъти, ако е клас - му се вика конструктора 2 пъти !
не е бъг - защото и VC & BCB го позволяват !
аз лично бих предпочел да ми дава грешка ако в extern инициализирам ... - щото я допусках (на младини!) доста често ...
_________________ путинофили: "иди н***й"
|
| Съб Дек 15, 2007 4:58 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
до тука бях 
|
| Съб Дек 15, 2007 11:21 pm |
|
|
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|