преобразовать

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

преобразовать

Post by uniqueman »

Есть класс

StringArray
{
StringArray (const char* const * sData);
}

Есть контнейнер

deque <string> sCont;

Как подсунуть sCont в StringArray?
SlaMin
Уже с Приветом
Posts: 176
Joined: 21 Feb 2002 10:01
Location: KZ -> KY -> WA

Post by SlaMin »

IMHO, никак кроме как построить char** самому.
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

эх. Дело в том, что этот StringArray изменяется динамически во время выполнения программы. new, delete не хочется много раз вызывать, ну ладно уж
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

опять подниму тему. Надо создать массив строк, размер которого известен только на ран тайме. Забыл как делается :pain1:
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

uniqueman wrote:опять подниму тему. Надо создать массив строк, размер которого известен только на ран тайме. Забыл как делается :pain1:

Одномерный [x]:
type * array;
array = malloc (sizeof(type)*given_size);

Двумерный [x][y]:
type ** array;
array=malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=malloc (sizeof(type)*given_size_y);
User avatar
Veselchak U
Уже с Приветом
Posts: 1787
Joined: 27 Nov 2002 05:24
Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago

Post by Veselchak U »

Одномерный [x]:
type * array;
array = malloc (sizeof(type)*given_size);

Двумерный [x][y]:
type ** array;
array=malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=malloc (sizeof(type)*given_size_y);


Усе правильно. Только malloc возвращает void *, поэтому неплохо было бы его привести к нужным типам, а то некоторые комиляторы ругаются.

Code: Select all

// Двумерный [x][y]: 
type ** array;
array=(type**)malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
   array[i]=(type*)malloc (sizeof(type)*given_size_y);


Ну и напоследок, если товарищ сидит в C++ и ему нужны строки, то вместо type ему нужен будет char, и скорее всего, пользоваться он будет new и delete. Там приведение типов не нужно.
User avatar
Mic
Уже с Приветом
Posts: 6906
Joined: 20 Apr 1999 09:01
Location: Seattle

Post by Mic »

А в чем поинт использовать malloc вместо new?
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

Mic wrote:А в чем поинт использовать malloc вместо new?

Поинт в том что я embedded программист.
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

Veselchak U wrote:Усе правильно. Только malloc возвращает void *, поэтому неплохо было бы его привести к нужным типам, а то некоторые комиляторы ругаются.

Code: Select all

// Двумерный [x][y]: 
type ** array;
array=(type**)malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
   array[i]=(type*)malloc (sizeof(type)*given_size_y);


Ну и напоследок, если товарищ сидит в C++ и ему нужны строки, то вместо type ему нужен будет char, и скорее всего, пользоваться он будет new и delete. Там приведение типов не нужно.

Если быть такими вьедливыми, то неплохо еще учесть что malloc может 0 вернуть. :wink:
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

CTAC_P wrote:
Mic wrote:А в чем поинт использовать malloc вместо new?

Поинт в том что я embedded программист.

или С-шник. :wink:
Верить нельзя никому - даже себе. Мне - можно!
User avatar
Veselchak U
Уже с Приветом
Posts: 1787
Joined: 27 Nov 2002 05:24
Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago

Post by Veselchak U »

CTAC_P wrote:
Veselchak U wrote:Усе правильно. Только malloc возвращает void *, поэтому неплохо было бы его привести к нужным типам, а то некоторые комиляторы ругаются.

Code: Select all

// Двумерный [x][y]: 
type ** array;
array=(type**)malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
   array[i]=(type*)malloc (sizeof(type)*given_size_y);


Ну и напоследок, если товарищ сидит в C++ и ему нужны строки, то вместо type ему нужен будет char, и скорее всего, пользоваться он будет new и delete. Там приведение типов не нужно.

Если быть такими вьедливыми, то неплохо еще учесть что malloc может 0 вернуть. :wink:


Ага, а new -- еxception кинуть. :wink: А может и не кинуть. Въедливый я! :P
User avatar
Veselchak U
Уже с Приветом
Posts: 1787
Joined: 27 Nov 2002 05:24
Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago

Post by Veselchak U »

Mic wrote:А в чем поинт использовать malloc вместо new?


And realloc can be very handy sometimes, but it has to dance with malloc and free...
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

во как можно

vector <string> vec = {"test1", "test2"}

// делаем второй вектор
vector <char*> vec2;

// подправляем размер под первый
vec2.resize(vec.size());

// копируем
transform (vec.begin(), vec.end(), vec2.begin(), string_to_str);

// присваиваем...
char** labels = &vec2[0];

получаем массив строк.
User avatar
шпиён
Уже с Приветом
Posts: 3459
Joined: 29 Oct 2002 20:08
Location: US

Post by шпиён »

uniqueman wrote:vector <char*> vec2;
...
// подправляем размер под первый
vec2.resize(vec.size());
...
// присваиваем...
char** labels = &vec2[0];


Неправильно. Вам никто не гарантирует, что в векторе все элементы лежат последовательно в памяти, как в массиве.
Замените vector на valarray хотя бы, если самому влом new/delete сделать (что может быть влом в контексте exceptions, например). Заодно и без resize обойдетесь.

И ещё, для флейма. transform - это зло.
Yuri_p33
Уже с Приветом
Posts: 394
Joined: 12 Feb 2001 10:01
Location: USA

Post by Yuri_p33 »

шпиён wrote:Неправильно. Вам никто не гарантирует, что в векторе все элементы лежат последовательно в памяти, как в массиве.
Вы уверены? А вот Мейерс пишет по другому.
Scott Meyers, Effective STL, Item 16 wrote:The elements in a vector are constrained by the C++ Standard to be stored in contiguous memory, just like an array, so if we wish to pass v to a C API that looks something like this.

void doSomething(const int* pInts, size_t numlnts);

we can do it like this:

doSomething(&v[0], v.size());
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

Veselchak U wrote:
CTAC_P wrote:malloc может 0 вернуть. :wink:

а new -- еxception кинуть. :wink: А может и не кинуть.

А может и вообще непонятно какую функцию позвать для отведения памяти.
Увидев друга, Портос вскрикнул от радости...
Hamster
Уже с Приветом
Posts: 11475
Joined: 20 Nov 2000 10:01
Location: Escondido, CA

Post by Hamster »

А может и вообще непонятно какую функцию позвать для отведения памяти


Если вы в доме не хозяин, то да.

Return to “Вопросы и новости IT”