Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамические массивы в C++

5.6K
19 сентября 2004 года
Vilux
4 / / 02.01.2004
Я новичок в C++, но достаточно много программил на Delphi. Мне интересно, как конструкцию на Object Pascal переделать на C++

var mas:array of string;
i:integer;
begin
for i:=0 to 30 do
begin
setlength(mas,i+1);
mas:='StringN'+inttostr(i);
end;
end;

Хотелось бы увидеть конкретный пример, пожалуйста...
3
19 сентября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Vilux
Я новичок в C++, но достаточно много программил на Delphi. Мне интересно, как конструкцию на Object Pascal переделать на C++

var mas:array of string;
i:integer;
begin
for i:=0 to 30 do
begin
setlength(mas,i+1);
mas:='StringN'+inttostr(i);
end;
end;

Хотелось бы увидеть конкретный пример, пожалуйста...



Код:
#include <vectror>
#include <string>
#include <sstream>

// функция преобразования значения в значение std::string
template <typename T>
std::string toString(T val)
{
    std::ostringstream buffer;
    buffer << val;
    return buffer.str();
}

void main()
{
  std::vector<std::string> mas;
  for(int i=0; i<30; i++)
  {
    std::string str("StringN");
    str += toString(i);
    mas.push_back(str);
  }
}
5.6K
19 сентября 2004 года
Vilux
4 / / 02.01.2004
Чего-то парился, я парился... а как мне выполнить
mas.push_back(str) если str будет обладать типом AnsiString?
Вы извините за ламерский, возможно, вопрос, но я поискал инфу, везде сказано, как из AnsiString получить *char, но не std::string...
И где можно почитать про STL?
И еще, очень хотелось бы увидеть реализацию моей первой просьбы с помощью memalloc и realloc, просто интересно и полезно...чтобы размер массива динамически менялся
7.3K
22 сентября 2004 года
Tneiro
11 / / 22.09.2004
Цитата:
Originally posted by Vilux
Я новичок в C++, но достаточно много программил на Delphi. Мне интересно, как конструкцию на Object Pascal переделать на C++

var mas:array of string;
i:integer;
begin
for i:=0 to 30 do
begin
setlength(mas,i+1);
mas:='StringN'+inttostr(i);
end;
end;

Хотелось бы увидеть конкретный пример, пожалуйста...



пример с книги работает
#include <stdio.h>
#include <stdlib.h>
#define ISIZE 512
void main()
{
int *pimemory_buffer;
pimemory_buffer = malloc(iSIZE * sizeof (int)) ;
if(pimemory_buffer == NULL)
printf("Недостаточно памяти\n"); else
printf("Память зарезервирована\n");
free(pimemory_buffer) ;
}

1.2K
23 сентября 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by Vilux
Я новичок в C++, но достаточно много программил на Delphi. Мне интересно, как конструкцию на Object Pascal переделать на C++

var mas:array of string;
i:integer;
begin
for i:=0 to 30 do
begin
setlength(mas,i+1);
mas:='StringN'+inttostr(i);
end;
end;

Хотелось бы увидеть конкретный пример, пожалуйста...



если тебе интерестно могу приветси пример динамического 2х мерного массива

<code>

class A{
private:
int **a;
public:
A(void){
a=new int*[100];
for(int i=0;i<100;i++)
a=new int[300];

}//constructor
~A(){
for (int i=0;i<100;i++)
delete []a;
delete []a;
}//destructor
}


</code>

430
23 сентября 2004 года
craftyfox
157 / / 20.02.2000
И где можно почитать про STL?

на microsoft.com, разумеется,
так же http://www.codeproject.com/
(рекомендуется)

примерчик с malloc-realloc:

#include <stdio.h>
#include <MALLOC.H>
#define MY_MAX_LENGTH 64
.......

// var mas:array of string;
char** pstrings=0;
char str[MY_MAX_LENGTH];
//i:integer;
//begin
//for i:=0 to 30 do
//begin
for(int i=0;i<31;i++)
{
//setlength(mas,i+1);
pstrings=(char**)realloc(pstrings,(i+1)<<2);
//mas:='StringN'+inttostr(i);
sprintf(str,"StringN %i",i);
pstrings=(char*)malloc(strlen(str)+1);
strcpy(pstrings,str);
}
//end;
//end;

.........

for(i=0;i<31;i++)
free(pstrings);
free(pstrings);

........

только к этому примерчику еще и обработку ошибок
приделать необходимо...
430
23 сентября 2004 года
craftyfox
157 / / 20.02.2000
на всякий случай...
существует еще в природе
UNICODE (эт я про TCHAR и sizeof(TCHAR));
и вместо (i+1)<<2 коректнее (i+1)*sizeof(char*)
8.7K
23 сентября 2004 года
Elessar
3 / / 23.09.2004
Цитата:
Originally posted by Vilux
Я новичок в C++, но достаточно много программил на Delphi. Мне интересно, как конструкцию на Object Pascal переделать на C++

var mas:array of string;
i:integer;
begin
for i:=0 to 30 do
begin
setlength(mas,i+1);
mas:='StringN'+inttostr(i);
end;
end;

Хотелось бы увидеть конкретный пример, пожалуйста...



Вот пример, который будет работать в MSDEV

//-----------------------------------------------
#include <iostream>
#include <string>

using namespace std;

string * mass;

int main()
{
mass = new string[30];
char * _temp = new char[2];
for (int i = 0; i < 30; i++)
{
itoa(i, _temp, 10);
//или itoa(i, temp, 2); , точно не помню
mass = "StringN" + _temp;
}
return 0;
}
//-----------------------------------------------]

46K
05 января 2009 года
xayrus
1 / / 05.01.2009
Срочно надо сдавать!!!
1 массив: массив с содержащей м чисел.реализовать программу формирования массивов A и B,включая в массив A четные по номеру элементы массива C в порядке их следования а в массив B нечет.Массив заполнять случайными целыми числами от 10 до 100.

Вот код:
#include "stdafx.h"

#include <iostream>

#include <stdio.h>

using namespace std;

void main()

{

int j,k,i;

int a[20];

int b[10],c[10];

j=0;

k=0;

for(i=0;i<20;i++);

{

if(i%2==0)



b[j]=a;

j++;

cout<<"da
";

else

c[k]=a;

k++;





}


};


А вот ошибки:
(Warning 3 warning C4552: '*' : operator has no effect; expected operator with side-effect ) (Error 4 error C2017: illegal escape sequence ) (Error 5 error C2143: syntax error : missing ';' before 'constant' ) (Warning 6 warning C4552: '*' : operator has no effect; expected operator with side-effect ) (Error 7 error C2146: syntax error : missing ';' before identifier 'cout' c)

2-ом тот же массив но с треугольником:
код:
#include "stdafx.h"

#include <iostream>

#include <stdio.h>

#include <conio.h>

using namespace std;

int main()

{

int i;

int a[20];

int b[10],c[10];



for(i=0;i<20;i++);

if(i%2==0)



{

a[(i-1)/2]=c;


}

else

{

b[(i-1)/2];



}



getch() ;

}

Ошибки:
(Error 1 error C2017: illegal escape sequence c (Error 2 error C2143: syntax error : missing ';' before 'constant')
397
06 января 2009 года
SergPas
527 / / 03.02.2007
Уважаемый xayrus! Не засоряйте форум! И не поднимайте старейшие темы без видимой необходимости! Темы наподобие Вашей: "Прошу помогите!!" следует задавать в разделе "Студентам" - там и только там! И оформляйте код согласно правилам оформления кода! При соблюдении всех выше перечисленных требований Вам ответят...
2
06 января 2009 года
squirL
5.6K / / 13.08.2003
Цитата: xayrus
Срочно надо сдавать!!!


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

13K
25 января 2009 года
PavelX
20 / / 13.03.2006
Подскажите пожалуйста. Вот есть у меня динамический массив с 0 по 10 элемент.
И указатель p на первый элемент.
Каким образом обрезать массив так, чтобы он стал состоять из допустим 3-го и 4-ого элементов, а вся остальная память освободилась.
Есть идея
p=p+2; p=realloc(p,2*sizeof(тип_ переменной));
Думаю, что память из под 5-10 элементов освободитя после этих операторов. А как быть с первыми?
1.9K
26 января 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: PavelX
Подскажите пожалуйста. Вот есть у меня динамический массив с 0 по 10 элемент.
И указатель p на первый элемент.
Каким образом обрезать массив так, чтобы он стал состоять из допустим 3-го и 4-ого элементов, а вся остальная память освободилась.
Есть идея
p=p+2; p=realloc(p,2*sizeof(тип_ переменной));
Думаю, что память из под 5-10 элементов освободитя после этих операторов. А как быть с первыми?



Создать новый массив, скопировать туда нужные элементы, удалить старый массив. Записать в указатель p адрес нового массива.

13K
26 января 2009 года
PavelX
20 / / 13.03.2006
Для меня это нежелательно, т.к. остро стоит вопрос памяти. Создавать копию 500 стуктурных элементов нежелательно.
Я в принципе копирую нужные мне элементы в начало списка, а окончание массива обрезаю. Правда когда вывожу результат работы realloc - вижу, что он ничего не обрезает. Наример. Сорри за неформатированный код:
...
char* s;
s=(char *)malloc(3*sizeof(char));
s[0]='2';
s[1]='0';
s[2]='0';
s=(char *)realloc(s,2*sizeof(char));
cout <<atoi(s);
Выведет 200, а не 20 как я хотел. Как освободить ненужную память?
1.9K
26 января 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: PavelX
Для меня это нежелательно, т.к. остро стоит вопрос памяти. Создавать копию 500 стуктурных элементов нежелательно.


Такие большие структуры или мало памяти?!
Тогда может быть не мучать систему перераспределением, пусть запас будет ... А то фрагментация кучи тоже в общем-то ничего хорошего...

P.S. а что это за структуры такие и какое ограничение памяти, если не секрет конечно? Закон Мура кажется ешё не отменяли?!

1.9K
26 января 2009 года
GreenRiver
451 / / 20.07.2008
Относительно кода
Цитата: PavelX

...
char* s;
s=(char *)malloc(3*sizeof(char));
s[0]='2';
s[1]='0';
s[2]='0';
s=(char *)realloc(s,2*sizeof(char));
cout <<atoi(s);
Выведет 200, а не 20 как я хотел. Как освободить ненужную память?


Как работает atoi:

Цитата:
Преобразование заканчивается, когда функция встречает первый "неправильный" символ. Проверка на переполнение не ведется (результат неопределенный).


Т.е. она идет по цепочки байтов от начала и пока не встретит "неправильный" символ. Ей глубоко паралельно какую она память читает "выделенную" или "кучу". Она просто не может знать об этом...

13K
26 января 2009 года
PavelX
20 / / 13.03.2006
Структуры - длинные строки (около 1000 симв) с метаданными. До оптимизации алгоритма вываливалась ошибка нехватка памяти. Сейчас ее нет, но все равно - уже очень аккуратно стараюсь относится к использованию памяти. К тому же это не единственные данные такого рода. Может быть и еще будут) Продолжаю работать над оптимизацией и дальше, но все же:) ОЗУ 512.

Цитата: GreenRiver

Тогда может быть не мучать систему перераспределением, пусть запас будет ... А то фрагментация кучи тоже в общем-то ничего хорошего...


Не совсем понял, что Вы имеете ввиду?

13K
26 января 2009 года
PavelX
20 / / 13.03.2006
2 GreenRiver:
Спасибо. Пересаживаюсь с Delphi на Си. Там все проще - copy. А здесь работа с памятью для меня более трудна для понимания. Стандартные классы с++ практически не трогал еще. На какие-то вопросы ответ не удается вычитать, поэтому благодарен за разъяснения.
1.9K
26 января 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: PavelX

Не совсем понял, что Вы имеете ввиду?


Немного о фрагментации

О размере структур:
1000 символов = 1000 байт + метаданные (ну скажем ещё 1000, больше вряд ли будет :)) Умножаем на 500 элементов - и ещё на два (при изменении размера, методом выделение нового "куска" памяти)...
Получается 2 Мегабайта ... много конечно, но не Doom 3 :)
Может быть ошибка где-то в другом месте была?

1.9K
26 января 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: PavelX
2 GreenRiver:
Спасибо. Пересаживаюсь с Delphi на Си. Там все проще - copy. А здесь работа с памятью для меня более трудна для понимания. Стандартные классы с++ практически не трогал еще. На какие-то вопросы ответ не удается вычитать, поэтому благодарен за разъяснения.



Кстати в С++ есть замечательные операторы new и delete... Delphi конечно намного проще в плане обращения с памятью, "сборщик мусора" делает своё дело... Вся мощь С++ именно в играх с памятью, имхо...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог