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

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

Автор: lungtung
Дата сообщения: 14.07.2006 12:26
всем привет!
У меня вопрос про массиве в С++.
В Pascal мы можем создать массив с отрицателными индексами. например:
myarray : array[-10..10] of integer
Во всех С++ документах написали,что первый элемент в массиве начинается с индексом 0(например a[0]). Вот и мой вопрос: как создать массив с отрицательными индексами как и в языке Pascal?
Спасибо!


Автор: Vladimir_Pashutin
Дата сообщения: 14.07.2006 12:57
lungtung
// i - индекс в массиве от -r до r
int a[2r];
for(i = -r; i < r; i++) a[i + r] = ...
Автор: lungtung
Дата сообщения: 15.07.2006 04:44
Vladimir_Pashutin: Что случится, если я хочу получить a[-5] ?

Ещё пример:

void main()
{
    int    a[4];
    int b[] = {1 , 2, 3, 4};
    
    for(int i = -2; i < 2;i++)
    {
        a[i] = b[i+2];
        cout << a[i] <<" ";
    }
}

Результат: 1 2 1 2

Не получится!!! Должно быть: 1 2 3 4. Вопрос: почему?
Автор: tomegadeth
Дата сообщения: 15.07.2006 09:30
lungtung потому, что должно быть так

Код: a[i+2] = b[i+2];
cout << a[i+2] <<" ";
Автор: vserd
Дата сообщения: 15.07.2006 11:11
Среда Visual studio C++ 6.0
Подскажите где в проекте можно установить параметры кторые мы задаем в Tools->Options вкладка Directories для include, source и lib файлов?

для Include вроде бы Project->Settings->C/C++ в комбо категории Preprocesor и там указываем Additional include directories:

для lib Project->Settings->Link, Input указываем Additional library path:

а где для Source ?
Автор: lungtung
Дата сообщения: 15.07.2006 15:30

Цитата:
lungtung потому, что должно быть так

Код: a[i+2] = b[i+2];
cout << a[i+2] <<" ";



Я хочу создать массив с отрицательными идексами. Например, у меня массив 5 елементов : a[-2], a[-1],a[0], a[1],a[2]. Тогда я могу получить значение первого елемента через a[-2], второго через a[-1].

на самом деле, эта проблема решена. Я создал class array следуюшем образом:

class mArray{
    int*    arr;
    int    start_index;
    int    stop_index;
public:
    mArray(int begin, int end);
    ~mArray();

    int& operator[](int index);
};

mArray::mArray(int begin, int end)
{
    if (end - begin > 0)
    {
        start_index    =    begin;
        stop_index    =    end;
        arr    =    new int[end-begin+1];
    }
    else
        arr    =    NULL;
}

mArray::~mArray()
{
    if (arr != NULL)
        delete [] arr;
}

int& mArray::operator [](int index)
{
    if ((index >= start_index) && (index <= stop_index))
    {
        if(arr != NULL)
            return arr[index-start_index];
    }
}

void main()
{
    mArray    marr(-5,3);

    for(int i = -5; i <= 3; i++)
    {
        cout <<"Enter element marr[" << i <<"] = ";
        cin >> marr[i];
        cout << endl;
    }    

    marr[-2] = 9;
    cout <<" result: " << endl;

    for(i = -5; i <= 3; i++)
    {
        cout <<marr[i] << " " ;
    }

    cout << endl;
}
Автор: floodway
Дата сообщения: 15.07.2006 19:18
Всем привет.

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

class Events
{
public:
void (*event) ();

void do_something()
{
if (event) event();
}
}

Events *e;

class MyDialog : public CDialog
{
public:
void gotten();
}

BOOL MyDialog::OnInitDialog()
{
// ...
e->event = gotten;
}

Получаю:
error C2440: '=' : cannot convert from 'void (__thiscall MyDialog::* )(void)' to 'void (__cdecl *)(void)'

Сделать gotten() вне класса (или сделать его static) и использовать некий MyDialog *dlg не подходит.

Не судьба?
Автор: RedLord
Дата сообщения: 15.07.2006 20:31
floodway

Цитата:
Пытаюсь присвоить указателю функции указатель метода...

вот это точно не судьба (разве что хак использовать)

посмотри boost:
bind, function - это поможет.

Автор: Abs62
Дата сообщения: 16.07.2006 01:06
floodway
Не судьба. Дело в том, что, в отличие от обычной функции, в метод передаётся один дополнительный скрытый параметр - this, указатель на объект класса, по сути тот самый MyDialog *dlg, без которого так хочется обойтись. Именно с его помощью метод и получает доступ к данным класса. Так что и на ёлку влезть, и не ободраться - не получится. Ищи другой способ.
Автор: Vladimir_Pashutin
Дата сообщения: 17.07.2006 06:51
floodway
Решить твою задачу так как это делается в Delphi не получится - у С++ другой принцип наследования в RTTI. Для того чтобы обрабатывать Event-ы нужно либо использовать волшебное слово __closure (работает только в классах VCL) либо создавать собственную структуру о двух полях (указатель на класс и указатель на метод в классе) и передавать в каждом вызове Eventa такую структуру.

Добавлено:
lungtung
Таким образом ты завернул в класс именно такое обращение как я тебе показал.
И в чем собственно был вопрос?
Автор: DLans
Дата сообщения: 17.07.2006 18:16
KADABRA

Цитата:
DLans
А в Express версии разве нету MFC?
New project->MFC Application->Type: dialog based


Нету.
Что делать?
Автор: ItsJustMe
Дата сообщения: 17.07.2006 23:29
floodway

Цитата:
Не судьба?

Как тебе сказал compiler: cannot convert from 'void (__thiscall MyDialog::* )(void)' to 'void (__cdecl *)(void)'. Исходя из этого и решай траблу.
Т.е.
class Events
{
public:
static void (WINAPI *event) (Events*);

void do_something()
{
if (event) event(this);
}
}

Events *e;

class MyDialog : public CDialog
{
public:
static void WINAPI gotten(Events*);
}

BOOL MyDialog::OnInitDialog()
{
// ...
e->event = gotten;
}
Автор: vserd
Дата сообщения: 18.07.2006 10:00
floodway
Посмотри на эту тему, может поможет:
http://forum.ru-board.com/topic.cgi?forum=33&topic=5387#1
Автор: distance
Дата сообщения: 18.07.2006 14:58
lungtung

Цитата:
Я хочу создать массив с отрицательными идексами

std::map
Автор: lungtung
Дата сообщения: 20.07.2006 18:27
У кого есть библиотека: GTL для работы с графом? поделитесь пожалуйста!
Автор: distance
Дата сообщения: 20.07.2006 19:00
lungtung
а в чем проблема? с родного сайта не дают что ли?
Автор: xdude
Дата сообщения: 20.07.2006 21:09
Товарищи! Кто-нибудь использовал libcurl в C++? У меня такой вопрос: делаю запрос на сайт, самый обыкновенный GET, все настроено правильно, и с другими сайтами проблем нет. Но этот сайт выдает какую-то кракозябру, непонятный набор байтов, вместо HTML-кода. Когда-то у меня была такая-же проблема, когда я отправлял заголовок Accept-Encoding: gzip, deflate и получал Content-Encoding: gzip.
Но в этот раз все нормально, отправляю Accept-Encoding: deflate и получаю Content-Encoding: deflate, может, все дело в charset=utf-8? Хотя, например, гугл тоже UTF-8 посылает, и все без проблем. Кто-нибудь с таким уже сталкивался?

Добавлено:
Упс, сорри за тупой вопрос, сам разобрался. Content-Encoding: deflate - это сжатие форматом zlib, а я думал, что это без сжатия.
Автор: Eaglevil
Дата сообщения: 20.07.2006 21:57
lungtung
Цитата:
Я хочу создать массив с отрицательными идексами

Код: #define l -20
#define h 10
    int*a=new int[h-l+1];
    a-=l;

    a[-5]=1;
Автор: lungtung
Дата сообщения: 21.07.2006 09:56
distance:

Цитата:
lungtung
а в чем проблема? с родного сайта не дают что ли?


они не отправили мне код доступа, хотя я уже 3 раза написал им письмо
Автор: shevek
Дата сообщения: 24.07.2006 11:14
Пытаюсь изучить С++ , столкнулся с проблемой. как создать ссылку на массив? Пробовал так:

int mas[]= {1,2,3,4,5,6,7,8,9,10};
int *&rmas = mas;

Но gcc на это ругается: ex3.cpp:14: error: invalid initialization of non-const reference of type 'int*&' from a temporary of type 'int*'

Поскольку имя массива есть не что иное как указатель на его первый элемент(?), попробовал сделать это через промежуточный указатель int* ;

int mas[]= {1,2,3,4,5,6,7,8,9,10};
int *p; p = mas;
int *&rmas = p;

Некрасиво но вроде работает.

Вот это тоже работает, только вот не пойму почему

int *const &rmas = mas;


int *const &rmas - это же вроде ссылка на указатель на константый объект? Но присвоение по rmas работает!

Или я ошибаюсь? И это ссылка на константый указатель на обьект?

Обясните пожалуйста.




Автор: Abs62
Дата сообщения: 24.07.2006 21:23
shevek

Цитата:
Или я ошибаюсь? И это ссылка на константый указатель на обьект?

Именно так. Модификатор const действует на то, что слева от него, кроме случая, когда он стоит первым.
int *const &rmas - ссылка на константый указатель на обьект типа int.
int const *&rmas - ссылка на указатель на константый обьект типа int.
const int *&rmas - то же, что и int const *&rmas.
Автор: alex_gall
Дата сообщения: 03.08.2006 15:28
Ребят! помогите пожалуйста написать функцию на C++, которая генерирует DHTML-событие onmousedown правой и средней кнопкой мыши для IHTMLElement'а. Если можно - не используйте smart-указатели. Ваще не очень пойму как генерировать с помощью fireEvent любое событие с какими-то параметрами.
Автор: HANDLE
Дата сообщения: 04.08.2006 16:48
lungtung

Цитата:
Vladimir_Pashutin: Что случится, если я хочу получить a[-5] ?

Ещё пример:

void main()
{
int a[4];
int b[] = {1 , 2, 3, 4};

for(int i = -2; i < 2;i++)
{
a[i] = b[i+2];
cout << a[i] <<" ";
}
}

Результат: 1 2 1 2

Не получится!!! Должно быть: 1 2 3 4. Вопрос: почему?

Отрицательных индексов не бывает!

Смысл int a[4]; ? В данном случае это локальная переменная.
В стеке выделяется объем памяти размером 4 * sizeof(int)

операции a[i] с индексом i меньше 0 или больше 3 выходят за границы этого массива.
Ты просто можешь испоганить содержимое стека. Например, испортить содержимое других переменных, или, ещё хуже, испортить адрес возврата, который записывается в стек при вызове функции. Тогда при выходе из функции попадаешь совсем не в то место откуда вызывалась эта функция, а неизвестно куда! Таким образом Runtime error обеспечен на 100 %.
Так что совет, при работе с массивами, тщательно следи чтобы индекс не выходил за границы массива.






Автор: ectb
Дата сообщения: 06.08.2006 23:44
HANDLE, не обманывай людей!
Отрицательные индексы бывают.
Просто пользоваться надо ими с умом.


Код:
#include <iostream>
using namespace std;

int main()
{
    int _a[4];
    int *a = &(_a[2]); // как вариант - int *a = _a + sizeof(int) * 2;
    int b[] = {1, 2, 3, 4};
    for (int i = -2; i < 2; i++) {
        a[i] = b[i+2];
        cout << a[i] << " ";
    }
    return 0;
}


Автор: SaDFromSpb
Дата сообщения: 07.08.2006 13:31

Цитата:
int _a[4];
int *a = &(_a[2]); // как вариант - int *a = _a + sizeof(int) * 2;
int b[] = {1, 2, 3, 4};
for (int i = -2; i < 2; i++) {
a[i] = b[i+2];
cout << a[i] << " ";
}
Ох, какой-то это изврат. Так что-то с ходу даже и придумать не могу. зачем такое на практике понадобиться может...
Автор: Collapse Troll
Дата сообщения: 07.08.2006 23:09
SaDFromSpb, imho тоже не могу придумать зачем это надо, но язык позволяет. вот пример проще:


Код: #include<iostream>

using namespace std;

int main(){

char buff[] = "txet";
char* PTR = &buff[3];

cout<<PTR[0]<<PTR[-1]<<PTR[-2]<<PTR[-3];

cin.get(); // press enter
return 0;
}
Автор: ectb
Дата сообщения: 08.08.2006 00:15
А понадобиться... Да очень просто
Скажем, есть у вас таблица соответствий, типа такой:
-2 => 5
-1 => 324
0 => 33
1 => 882
2 => 478
И в зависимости от переменной Х вам нужно узнать значение. При том делать это довольно часто, а не однажды.

вариант 1.

Код:
int a[] = {5,324,33,882,478};

...

int c1 = a[X1 + offset];
int c2 = a[X2 + offset];
int c3 = a[X3 + offset];
Автор: Vladimir_Pashutin
Дата сообщения: 08.08.2006 06:09
ectb

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

Добавлено:
Хотя в твоем случае все тоже будет нормально работать несмотря на отрицательность индексов, конечно если не напутаешь со знаковыми/беззнаковыми индексами.
Автор: Mickey_from_nsk
Дата сообщения: 08.08.2006 07:53
Vladimir_Pashutin

Цитата:
работает быстрее

Подробнее объясни, пожалуйста, что может быть быстрее доступа по индексу? Я вижу только доступ по адресу. В мапе в любом случае этого быть не может.
Другое дело, что map более безопасен и быстрее в разработке (может быть), хотя идея с переносом базы массива отличная.
ectb
Подозреваю, хотя не проверял, что во втором варианте можно сделать и без введения _a.
просто

Код:
int a[] = {...};
a = a+2;
Автор: ItsJustMe
Дата сообщения: 08.08.2006 08:03
Не пропустит.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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