Solved

Redim Preserve In C++

Posted on 2004-08-02
19
1,313 Views
Last Modified: 2008-01-09
int i=0;
int *Arr_UserId;
...
while(!rs->ADOEOF)
{
      Arr_UserId = new int[i]; //MUST PRESERVE
      Arr_UserId[i] = rs->Fields->GetItem("FK_UserId")->GetValue();
      i+=1;
      rs->MoveNext();
}

Arr_UserId = new int[i]; do not preserve data. For example Arr_UserId[0]=1234 When i loop again Arr_UserId[0]=will contain nothing and Arr_UserId[1] will contain data.

How can i preserve data?

0
Comment
Question by:mammouth
  • 8
  • 6
  • 4
  • +1
19 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 11696352
>>Arr_UserId = new int[i]; //MUST PRESERVE

is incorrect since 'i' is '0' at that moment. Allocate the right size and you won't have problems.
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11696377
I think will be better to use a template array from C++ (or MFC if working in Visual C++). Them have a good memory management and easy array grow without loss.
0
 
LVL 1

Author Comment

by:mammouth
ID: 11696427
jkr: i can't allocate the right size because it come from database and i need to use adopenforwardonly.

0
Does Powershell have you tied up in knots?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
LVL 1

Author Comment

by:mammouth
ID: 11696434
jaime_oliviares: How can i use those template?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11696482
please specify your compiler and Operating System first.
0
 
LVL 1

Author Comment

by:mammouth
ID: 11696493
Windows XP and c++7 under .net
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11696616
Ok, that will be easier. To store an array of integer, just use CUintArray or CDWordArray classes

CUIntArray array;

To add an element:
array.Add(val);   <-- Add i value to the end of array, array grows automatically

To retrieve an element:
val = array.GetAt(43):  <--- Retrieve the value of 43th element

To change an element:
val = array.SetAt(43, v):  <--- Change the value of 43th element

To obtain array size:
size = array.GetSize();

To manually resize array:
array.SetSize(newSize);
0
 
LVL 86

Accepted Solution

by:
jkr earned 125 total points
ID: 11696634
Then, use a vector<int> instead, e.g.

int i=0;
vector<int> Arr_UserId;
...
while(!rs->ADOEOF)
{

    Arr_UserId.push_back( rs->Fields->GetItem("FK_UserId")->GetValue());
    i+=1;
    rs->MoveNext();
}
0
 
LVL 22

Expert Comment

by:grg99
ID: 11696658
How big can the array possibly get?  

If it's upper bound is less than say 100 or so, a fixed size array is probably simpler/faster than any fancy variable size array folderol.

 
0
 
LVL 1

Author Comment

by:mammouth
ID: 11696667
upper bound may be up to 10,000
0
 
LVL 1

Author Comment

by:mammouth
ID: 11696706
jaime_olivares: i ger error:  error C2065: 'CUIntArray' : undeclared identifier
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11696792
OK, this is the problem:
CUIntArray belongs to Visual C++ MFC library, so I guess you are trying to compile a console application. The best way to support MFC is creating a new Project -> Win32 Console Application, and choose "An application that supports MFC" in the dialog. After that you will be able to use CUIntArray.
If you don't want to use MFC at all, you can use standard C++'s vector<> template as detailed by jkr, but I think it is a bit more complicated for a begginer. That's why I suggested you CUIntArray.
0
 
LVL 1

Author Comment

by:mammouth
ID: 11696826
jaime_olivares: i added #include <afxcoll.h> at top of program to be able to use CUIntArray.
Now it's ok but when i do array.Add(1);, i get error...

ClientCom error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in libcpd.lib(newop.obj)
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11696858
Your #include allows you to compile, because CUIntArray is declared at afxcoll.h, but your project is not liking MFC library correctly. So, maybe you can follow my recommendation. Please specify your type of project (console, windows, etc...)
0
 
LVL 86

Expert Comment

by:jkr
ID: 11696876
Why not using a vector<int>? All you need is

#include <vector>
0
 
LVL 1

Author Comment

by:mammouth
ID: 11696917
jkr: How can i retrieve value in a vector?
may i use Arr_UserId[5] for example?

This seem to not work?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11696948
You can use array.GetAt(43) or array[43] using MFC arrays.
 
0
 
LVL 86

Expert Comment

by:jkr
ID: 11696982
>>may i use Arr_UserId[5] for example?

Sure,

int n =  Arr_UserId[5];

will just work fine.
0
 
LVL 1

Author Comment

by:mammouth
ID: 11697000
Sorry, my mistake, working great.

Thankx
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question