Solved

Redim Preserve In C++

Posted on 2004-08-02
19
1,303 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
Comment Utility
>>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
Comment Utility
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
Comment Utility
jkr: i can't allocate the right size because it come from database and i need to use adopenforwardonly.

0
 
LVL 1

Author Comment

by:mammouth
Comment Utility
jaime_oliviares: How can i use those template?
0
 
LVL 55

Expert Comment

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

Author Comment

by:mammouth
Comment Utility
Windows XP and c++7 under .net
0
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
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
Comment Utility
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
Comment Utility
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
Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

 
LVL 1

Author Comment

by:mammouth
Comment Utility
upper bound may be up to 10,000
0
 
LVL 1

Author Comment

by:mammouth
Comment Utility
jaime_olivares: i ger error:  error C2065: 'CUIntArray' : undeclared identifier
0
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
Why not using a vector<int>? All you need is

#include <vector>
0
 
LVL 1

Author Comment

by:mammouth
Comment Utility
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
Comment Utility
You can use array.GetAt(43) or array[43] using MFC arrays.
 
0
 
LVL 86

Expert Comment

by:jkr
Comment Utility
>>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
Comment Utility
Sorry, my mistake, working great.

Thankx
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

743 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

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now