Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1396
  • Last Modified:

Redim Preserve In C++

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
mammouth
Asked:
mammouth
  • 8
  • 6
  • 4
  • +1
1 Solution
 
jkrCommented:
>>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
 
Jaime OlivaresSoftware ArchitectCommented:
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
 
mammouthAuthor Commented:
jkr: i can't allocate the right size because it come from database and i need to use adopenforwardonly.

0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
mammouthAuthor Commented:
jaime_oliviares: How can i use those template?
0
 
Jaime OlivaresSoftware ArchitectCommented:
please specify your compiler and Operating System first.
0
 
mammouthAuthor Commented:
Windows XP and c++7 under .net
0
 
Jaime OlivaresSoftware ArchitectCommented:
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
 
jkrCommented:
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
 
grg99Commented:
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
 
mammouthAuthor Commented:
upper bound may be up to 10,000
0
 
mammouthAuthor Commented:
jaime_olivares: i ger error:  error C2065: 'CUIntArray' : undeclared identifier
0
 
Jaime OlivaresSoftware ArchitectCommented:
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
 
mammouthAuthor Commented:
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
 
Jaime OlivaresSoftware ArchitectCommented:
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
 
jkrCommented:
Why not using a vector<int>? All you need is

#include <vector>
0
 
mammouthAuthor Commented:
jkr: How can i retrieve value in a vector?
may i use Arr_UserId[5] for example?

This seem to not work?
0
 
Jaime OlivaresSoftware ArchitectCommented:
You can use array.GetAt(43) or array[43] using MFC arrays.
 
0
 
jkrCommented:
>>may i use Arr_UserId[5] for example?

Sure,

int n =  Arr_UserId[5];

will just work fine.
0
 
mammouthAuthor Commented:
Sorry, my mistake, working great.

Thankx
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 8
  • 6
  • 4
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now