Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Lyrik
Дата сообщения: 28.10.2007 11:05
BeTeP1
Код корректный, видимо ошибка тут:

Цитата:
wcscpy(wcName,_T("Проверка"));

Ты используешь макрос _T - который преобразует либо в ANSI, либо в UNICODE. Но поскольку ты явно используешь UNICODE, то пиши так:

Код: wcscpy(wcName,L"Проверка");
Автор: BeTeP1
Дата сообщения: 28.10.2007 11:18
проверил не работает

Цитата:
на будущее - пиши версию студии
VS 2005 sp1
вылетает с той же ошибкой
Автор: Lyrik
Дата сообщения: 28.10.2007 11:36
BeTeP1
странно. проверил у себя - все работает, версия студии тоже как и у тя. Никаких ошиюок не выдает. А у тя выдает ошибку во время Release или Debug версии? Можешь выложить проект? я попробую его у ся откомпилить может какие-то настройки проекта не те.
Автор: BeTeP1
Дата сообщения: 28.10.2007 12:03
Lyrik
все верно это я туплю
а вот еще тогда вопрос
сразу скажу ошибка таже самая вылетает

Код:
typedef struct {
LPWSTR wcName;
}tsMyStruct;
class CTest{
public:
tsMyStruct sMyStruct;
CTest(void);
~CTest(void);
void SetName(LPWSTR wcName);
};
CTest::CTest(void){
setmem(&sMyStruct,0,sizeof(tsMyStruct));
}
CTest::~CTest(void){
if (sMyStruct.wcName != NULL){
delete [] sMyStruct.wcName;
}
}
void CTest::SetName(LPWSTR wcName){
sMyStruct.wcName = new WCHAR[50];
wcscpy(sMyStruct.wcName,wcName);
}
main(){
CTest* lpTest = new CTest[5];
lpTest.SetName(L"Проверка");
delete []lpTest;
}

а здесь в чем может быть проблема?
Автор: Lyrik
Дата сообщения: 28.10.2007 12:41
BeTeP1
А попробуй на старом примере HeapAlloc. что будет выдавать?
как-то странно у меня [more=этот]
Код: #include <iostream>
#include <tchar.h>
#include <windows.h>
#include <exception>

using namespace std;

class CTest{
public:
    LPWSTR wcName;
    CTest(void);
    ~CTest(void);
};
CTest::CTest(void){
    wcName = new WCHAR[10];
    wcscpy(wcName,L"Проверка");
}
CTest::~CTest(void){
    if (wcName != NULL){
        delete [] wcName;
    }
}

int
_tmain( )
{
    try{
        CTest* lpTest = new CTest[5];
        delete [] lpTest;
    } catch ( bad_alloc &ex ) {
        cout << ex.what() << endl;
    }
return (EXIT_SUCCESS);
}
Автор: BeTeP1
Дата сообщения: 28.10.2007 12:57
Спасибо нашел ошибку
дело было в том что выделял меньший размер памети чем пытался туда записать
и в итоге при удалении получал ошибку

зы:Видимо день сегодня такой (переход на зимнее время)
Автор: floodway
Дата сообщения: 28.10.2007 13:16
BeTeP1
afaik, перед delete можно не проверять указатель, он, вроде как, сам это делает.
Автор: Mr Nobody
Дата сообщения: 02.11.2007 13:42
У меня вот такой вопрос. В самом начале програмирования на Си я столкнулся с проблемкой передачи массива в функцию. Конечно, вот такая программка

Код:
#include <stdio.h>

unsigned int array_size(int arg[])
{
    return sizeof(arg);
}

int array[10];

int main()
{
     printf("Size of array: %u\n", sizeof(array));
     printf("and into function: %u\n", array_size(array));

     return 0;
}
Автор: deadok
Дата сообщения: 02.11.2007 15:36

Код:
ret_type foo(float ** array);
{
array[2][3]=0;
array[1][2]=1;
//еще какаянить пакость.
}
...
...
..

float my_arr[4][4]={/*бла-бла*/};
foo(my_arr);
Автор: Mr Nobody
Дата сообщения: 02.11.2007 15:48
deadok

Цитата:
читай еще про указатели, ну или, как вариант, откажись от использования многомерных массивов

Это все 100% не проходит. А как может быть численный анализ без матриц?
Автор: deadok
Дата сообщения: 02.11.2007 16:10

Цитата:
Это все 100% не проходит.

Ы?

Цитата:
А как может быть численный анализ без матриц?

Многомерный массив - всего-лишь один из способов представления матрицы, которая, в свою очередь, является всего-лишь одним из способов представления данных.

скажем, чем такой вариант представления единичной матрицы 3x3 хуже обычного: (1,0,0, 0,1,0, 0,0,1)?
Автор: distance
Дата сообщения: 02.11.2007 17:07
deadok
Этот код вызовет UB

Mr Nobody
Передавай в функцию сам массив (а не указатель на него)
если размерность фиксировнна:

Код: template <int Rows, int Columns>
void process_matrix(int (&m)[Rows][Columns])
{
    std::cout << sizeof(m) << std::endl;
}

void test()
{
    int m1[4][4];
    ZeroMemory(m1, sizeof(m1));
    process_matrix(m1);
}
Автор: Mr Nobody
Дата сообщения: 02.11.2007 17:41
distance

Цитата:
Передавай в функцию сам массив (а не указатель на него)
если размерность фиксировнна:

Если размерность фиксирована, то зачем передавать матрицу в функцию. Интерестно, для переменной размерности. Интерестно сделать штатными срествами языка.
Автор: distance
Дата сообщения: 02.11.2007 17:54
Mr Nobody

Цитата:
Если размерность фиксирована, то зачем передавать матрицу в функцию

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

Цитата:
Интерестно сделать штатными срествами языка

ну, например, Boost.MultiArray как бы не-штатные средства не использует...
а так - N-мерный указатель + N (общая размерность матрицы) + массив из N элементов (размер каждой размерности). Разумеется, инициализировать такой указатель можно только динамически.
Автор: deadok
Дата сообщения: 02.11.2007 18:05

Цитата:
N-мерный указатель

Ы?
Автор: distance
Дата сообщения: 02.11.2007 18:16
deadok
int************************************************* p;
Автор: deadok
Дата сообщения: 02.11.2007 18:23
а!
Автор: vipettut
Дата сообщения: 02.11.2007 19:07

Может кто-нить подскажет готовую и быструю либу/набор классов для операций с числами большой точности? (сотни знаков после запятой, а может быть и тысячи)
Автор: Mr Nobody
Дата сообщения: 02.11.2007 20:15
vipettut, найдите книгу "STL для программистов С++", Леон Аммерааль, ДМК. 1999 г. Там на стр. 211 найдете все, что вам требуется.


Автор: mothes
Дата сообщения: 03.11.2007 12:37
Доброго всем утра!
Хочу выразить огромную благодарность всем форумцам за оперативную и своевременную помощь. Вы лучшие!
Спасибо так же администраторам и модераторам этого форума за это творение!

-=ОТДЕЛЬНАЯ БЛАГОДАРНОСТЬ ФОРУМЦУ ПОД НИКОМ The Champion, ОГРОМНОЕ ВАМ СПАСИБО!!!=-

C уважением mothes!
Автор: FMeat
Дата сообщения: 05.11.2007 14:15
День добрый.

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

Небольшой вопрос - если переменная (массив в данном случае я понимаю как ряд переменных, расположенных в памяти друг за другом) не использовалась, то компилятор не будет её вставлять в ассемблерный листинг для дальнейшего использования в целях оптимизации?
Автор: WiseAlex
Дата сообщения: 05.11.2007 14:41
FMeat
код в студию
если масссив создается так: int array[]={1,2,3,4}, то инициализация происходит до main в стартапе
если инициализация в main то компилятор может соптимизировать если эта переменная не используется.
попробуй volatile - тогда компилятор, возможно, перестанет оптмизировать
Автор: FMeat
Дата сообщения: 05.11.2007 14:49
#include "iostream"

using namespace std; //VS 2005 M$

void main ()
{
    int Array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
}
Автор: WiseAlex
Дата сообщения: 05.11.2007 15:09
FMeat
ты в debug смотрел или релизе ? если релиз то понятно если соптимизировано
Автор: FMeat
Дата сообщения: 05.11.2007 16:31
Релиз.

Как я понял вы ответили "да" на мой вопос? (Массив не был добавлен так как не использовался?)
Автор: Mr Nobody
Дата сообщения: 05.11.2007 16:52
FMeat
Мой совет, во избежание в дальнейшем, не распологайте массив в стеке.

Код:
#include "iostream"

using namespace std; //VS 2005 M$

int Array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

int main ()
{
/* ....*/
return 0;
}
Автор: WiseAlex
Дата сообщения: 05.11.2007 17:01
Mr Nobody

Цитата:
Мой совет, во избежание в дальнейшем, не распологайте массив в стеке.

1) вопрос был про стэковый массив
2) многие компиляторы достаточно сообразительны чтобы убрать и глобальный массив при оптимизации (правдаздесь скорее при оптимизации линковщика)
3) кстати во избежании чего - придется писать везде static или безимянный namespace иначе тот код который приведен может вообще не собраться из-за повтора имен глобальных переменных. Кроме того чато ситуация такая, что нужно инициализация внутри функции.
Автор: FMeat
Дата сообщения: 05.11.2007 17:53
Эм... Я чувствую себя ещё болие запутанным...

1. Любой массив не объявленный как глобальная переменная являеться стековым?
2. Он ведь "медленние" обычного?
3. Как это регулируеться метками static и const?
4. 2 Mr Nobody Дебагер?
Автор: Mr Nobody
Дата сообщения: 05.11.2007 18:14
WiseAlex

Цитата:
) вопрос был про стэковый массив

Не оченьхорошая идея - массив в стэке. В общем, лет 10 назад, я писал программу, в которой массив портов АЦП отображался на массив двухбайтных целых.Вся идея была в том, что при прохождении элементов массива в памяти, адрес увеличивался, но ведь в стэковом массиве адрес уменшается с увелиением индекса.

FMeat

Цитата:
1. Любой массив не объявленный как глобальная переменная являеться стековым?

Любой массив, объявленный в функции, является стэковвым.

Цитата:
2. Он ведь "медленние" обычного?

Почему?

Цитата:
3. Как это регулируеться метками static и const?

Если использовать static, то массив определенный в функции не будет стэковым.


Автор: WiseAlex
Дата сообщения: 05.11.2007 18:36
Mr Nobody

Цитата:
но ведь в стэковом массиве адрес уменшается с увелиением индекса.

неправда - посмотрите что происходит в отладчике. Если бы такое было, то эт нарушило бы все устои С. думаю Вы столкнулись с ошибкой компилятора

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.