• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 355
  • Last Modified:

How can I define two dimentional SAFEARRAY?

How can I define two dimentional SAFEARRAY of type integer?
0
MohdAsalah
Asked:
MohdAsalah
  • 4
  • 4
  • 3
  • +3
1 Solution
 
markvpCommented:
Could you be more specific about what you're trying to do? Do you simply want to define a two dimensional array or define a type? Are the dimensions known at compile time?

Normally you define it as

     int a[10][10];
     a[5][6] = 14;

You can also typedef it for convenience:

     typedef int safearray[10][10];
     safearray a;
     a[5][6] = 14;

If the dimensions are not known at compile time, it's more difficult.
0
 
IainHereCommented:
I assume you're talking COM.  Well, you use SafeAffayCreate (look in MSDN library).  There's an example here
http://support.microsoft.com/support/kb/articles/Q182/8/31.ASP
(using VT_VARIANT - you'll have to use VT_UI1 for ints).

Have a look here, too:
http://community.borland.com/article/0,1410,22016,00.html

you should have something like this.
<altered version of that MSDN link>
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 3;
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = 3;
psa = SafeArrayCreate(VT_UI1, 2, rgsabound);
0
 
danelroismanCommented:
//like int arr[8][4];

HRESULT hres;
SAFEARRAY * psaiNew;
SAFEARRAYBOUND aDim[2];

aDim[0].lLbound = 0;
aDim[0].cElements = 7;
aDim[1].lLbound = 0;
aDim[1].cElements = 3;

psaiNew = SafeArrayCreate(VT_I2, 2, aDim);
if (psaiNew == NULL) throw ERROR_NOT_ENOUGH_MEMORY;
     
//use array ....
//.....


//destroy!
if (hres = SafeArrayDestroy(psaiNew)) throw hres;
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
MohdAsalahAuthor Commented:
That's fine but how can I fill this array ,I mean how can I use SafeArrayPutElement API function in this two dimentional array.
0
 
MohdAsalahAuthor Commented:
That's fine but how can I fill this array ,I mean how can I use SafeArrayPutElement API function in this two dimentional array.
0
 
danelroismanCommented:
//like int arr[8][4];

HRESULT hres;
SAFEARRAY * psaiNew;
SAFEARRAYBOUND aDim[2];

aDim[0].lLbound = 0;
aDim[0].cElements = 7;
aDim[1].lLbound = 0;
aDim[1].cElements = 3;

psaiNew = SafeArrayCreate(VT_I2, 2, aDim);
if (psaiNew == NULL) throw ERROR_NOT_ENOUGH_MEMORY;
     
//use array ....
//.....


//destroy!
if (hres = SafeArrayDestroy(psaiNew)) throw hres;
0
 
danelroismanCommented:
for(long i =0; i < 4; i++)
{
for(long j=0; j < 8; j++)
{
int  someVal = 4; //some value
//j means dimension              
::SafeArrayPutElement(psaiNew,&j, &someVal);
}
}
0
 
danelroismanCommented:
Sorrry, the previows example was realy bad. :)

This example populates the safearray elements with double values. (Using MFC)

VARIANT _stdcall retVariantArray(void)
{
  COleSafeArray saRet;        
  DWORD numElements[] = {10, 10}; // 10x10

  // Create the two dimensional safe-array of type VT_R8 with size 10x10.
  saRet.Create(VT_R8, 2, numElements);

  // Initialize safearray with values...
  long index[2];
  for(index[0]=0; index[0]<10; index[0]++)
  {
    for(index[1]=0; index[1]<10; index[1]++)
     {
      double val = index[0] + index[1]*10;
      saRet.PutElement(index, &val);
    }
  }
  // Return the safe-array encapsulated in a VARIANT...
  return saRet.Detach();
}

0
 
IainHereCommented:
>>How can I define two dimentional SAFEARRAY of type integer?

... solution ...


>> That's fine but how can I fill this array?

Normally this would be a different question, especially if the original question is 5 times easier than an easy question.  Please don't take this the wrong way - I'm just giving my opinion.
0
 
MohdAsalahAuthor Commented:
This Comment to lainHere:

If the first question is 5 times easier than an easy question why u do not complete ur answer.
and please keep your opinion to yourself.
0
 
IainHereCommented:
Interesting.  As you will have been advised when you asked the question, 50 points = easy question; 100 points = moderate question; 200 points = difficult question.

>> If the first question is 5 times easier than an easy question
I was referring to the number of points you put up.  10 points = 1/5 of easy question.

>> why u do not complete ur answer.
I did.  You will notice that the SafeArrayCreate function call I made did what you asked in your original question.

>>keep your opinion to yourself.
>>Please don't take this the wrong way
:-)
0
 
MohdAsalahAuthor Commented:
That is very silly,I do not put 10 points because this <comment edited by Community Support> question is very easy but because I just have 10 points.
<comment edited by Community Support> .
0
 
Kyle SchroederEndpoint EngineerCommented:
where is "the" hell?
0
 
Lab1Commented:
MohdAsalah We do not allow profanity or flaming here at EE. Please keep your comments professional.
Thank you
Lab1
CS Moderator
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

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