Динамические массивы в 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;
Хотелось бы увидеть конкретный пример, пожалуйста...
Я новичок в 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 <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);
}
}
mas.push_back(str) если str будет обладать типом AnsiString?
Вы извините за ламерский, возможно, вопрос, но я поискал инфу, везде сказано, как из AnsiString получить *char, но не std::string...
И где можно почитать про STL?
И еще, очень хотелось бы увидеть реализацию моей первой просьбы с помощью memalloc и realloc, просто интересно и полезно...чтобы размер массива динамически менялся
Я новичок в 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) ;
}
Я новичок в 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>
на 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);
........
только к этому примерчику еще и обработку ошибок
приделать необходимо...
существует еще в природе
UNICODE (эт я про TCHAR и sizeof(TCHAR));
и вместо (i+1)<<2 коректнее (i+1)*sizeof(char*)
Я новичок в 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;
}
//-----------------------------------------------]
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')
какой наивный ребенок... думает, что его "срочно" кого-то волнует. при этом даже не удосужился правила прочитать и код в теги запихнуть. вконец студенты оборзели.
И указатель p на первый элемент.
Каким образом обрезать массив так, чтобы он стал состоять из допустим 3-го и 4-ого элементов, а вся остальная память освободилась.
Есть идея
p=p+2; p=realloc(p,2*sizeof(тип_ переменной));
Думаю, что память из под 5-10 элементов освободитя после этих операторов. А как быть с первыми?
И указатель p на первый элемент.
Каким образом обрезать массив так, чтобы он стал состоять из допустим 3-го и 4-ого элементов, а вся остальная память освободилась.
Есть идея
p=p+2; p=realloc(p,2*sizeof(тип_ переменной));
Думаю, что память из под 5-10 элементов освободитя после этих операторов. А как быть с первыми?
Создать новый массив, скопировать туда нужные элементы, удалить старый массив. Записать в указатель p адрес нового массива.
Я в принципе копирую нужные мне элементы в начало списка, а окончание массива обрезаю. Правда когда вывожу результат работы 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 как я хотел. Как освободить ненужную память?
Такие большие структуры или мало памяти?!
Тогда может быть не мучать систему перераспределением, пусть запас будет ... А то фрагментация кучи тоже в общем-то ничего хорошего...
P.S. а что это за структуры такие и какое ограничение памяти, если не секрет конечно? Закон Мура кажется ешё не отменяли?!
...
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:
Т.е. она идет по цепочки байтов от начала и пока не встретит "неправильный" символ. Ей глубоко паралельно какую она память читает "выделенную" или "кучу". Она просто не может знать об этом...
Тогда может быть не мучать систему перераспределением, пусть запас будет ... А то фрагментация кучи тоже в общем-то ничего хорошего...
Не совсем понял, что Вы имеете ввиду?
Спасибо. Пересаживаюсь с Delphi на Си. Там все проще - copy. А здесь работа с памятью для меня более трудна для понимания. Стандартные классы с++ практически не трогал еще. На какие-то вопросы ответ не удается вычитать, поэтому благодарен за разъяснения.
Не совсем понял, что Вы имеете ввиду?
Немного о фрагментации
О размере структур:
1000 символов = 1000 байт + метаданные (ну скажем ещё 1000, больше вряд ли будет :)) Умножаем на 500 элементов - и ещё на два (при изменении размера, методом выделение нового "куска" памяти)...
Получается 2 Мегабайта ... много конечно, но не Doom 3 :)
Может быть ошибка где-то в другом месте была?
Спасибо. Пересаживаюсь с Delphi на Си. Там все проще - copy. А здесь работа с памятью для меня более трудна для понимания. Стандартные классы с++ практически не трогал еще. На какие-то вопросы ответ не удается вычитать, поэтому благодарен за разъяснения.
Кстати в С++ есть замечательные операторы new и delete... Delphi конечно намного проще в плане обращения с памятью, "сборщик мусора" делает своё дело... Вся мощь С++ именно в играх с памятью, имхо...